@ -16,17 +16,27 @@ import {
const { user , loggedIn , logout } = useAuth ( )
const { user , loggedIn , logout } = useAuth ( )
/ / E x t e n d e d u s e r t y p e w i t h a l l p r o f i l e f i e l d s
type ExtendedUser = typeof user . value & {
id ? : string
firstName ? : string
lastName ? : string
email ? : string
}
const extendedUser = computed ( ( ) => user . value as ExtendedUser )
/ * *
/ * *
* Get user initials for Avatar fallback
* Get user initials for Avatar fallback
* Example : "Bastian Masanek" → "BM"
* Example : "Bastian Masanek" → "BM"
* /
* /
const userInitials = computed ( ( ) => {
const userInitials = computed ( ( ) => {
if ( ! user . value ) return '?'
if ( ! extendedU ser. value ) return '?'
const first = user . value . firstName ? . charAt ( 0 ) ? . toUpperCase ( ) || ''
const first = extendedU ser. value . firstName ? . charAt ( 0 ) ? . toUpperCase ( ) || ''
const last = user . value . lastName ? . charAt ( 0 ) ? . toUpperCase ( ) || ''
const last = extendedU ser. value . lastName ? . charAt ( 0 ) ? . toUpperCase ( ) || ''
return first + last || u ser. value . email ? . charAt ( 0 ) ? . toUpperCase ( ) || '?'
return first + last || extendedU ser. value . email ? . charAt ( 0 ) ? . toUpperCase ( ) || '?'
} )
} )
/ * *
/ * *
@ -44,13 +54,9 @@ async function handleLogout() {
< template >
< template >
<!-- Not logged in : Show login prompt -- >
<!-- Not logged in : Show login prompt -- >
< NuxtLink v -if = " ! loggedIn " to = "/auth"
< NuxtLink v -if = " ! loggedIn " to = "/auth"
class = "flex items-center gap-2 px-4 py-2 rounded-[35px] border-2 border-dashed border-muted-foreground/30 hover:border-experimenta-accent hover:bg-experimenta-accent/10 transition-all "
class = "btn-secondary flex items-center gap-2 px-4 py-2.5 "
aria - label = "Anmelden oder Registrieren" >
aria - label = "Anmelden oder Registrieren" >
< Avatar class = "h-10 w-10 border-2 border-muted-foreground/30 rounded-2xl" >
< User class = "h-5 w-5" / >
< AvatarFallback class = "bg-muted text-muted-foreground rounded-2xl" >
< User class = "h-5 w-5" / >
< / AvatarFallback >
< / Avatar >
< span class = "font-medium hidden sm:inline" > Anmelden < / span >
< span class = "font-medium hidden sm:inline" > Anmelden < / span >
< / NuxtLink >
< / NuxtLink >
@ -62,13 +68,13 @@ async function handleLogout() {
aria - label = "Benutzermenü öffnen" >
aria - label = "Benutzermenü öffnen" >
<!-- Greeting text ( Desktop only ) -- >
<!-- Greeting text ( Desktop only ) -- >
< span class = "hidden md:inline font-medium text-white pl-2" >
< span class = "hidden md:inline font-medium text-white pl-2" >
Hallo , { { u ser? . firstName } }
Hallo , { { extendedU ser? . firstName } }
< / span >
< / span >
<!-- Avatar with status ring ( logged in indicator ) -- >
<!-- Avatar with status ring ( logged in indicator ) -- >
< Avatar
< Avatar
class = "h-10 w-10 md:h-12 md:w-12 border-3 border-experimenta-purple shadow-lg bg-experimenta-accent ring-2 ring-experimenta-accent ring-offset-2 ring-offset-white dark:ring-offset-zinc-950" >
class = "h-10 w-10 md:h-12 md:w-12 border-3 border-experimenta-purple shadow-lg bg-experimenta-accent ring-2 ring-experimenta-accent ring-offset-2 ring-offset-white dark:ring-offset-zinc-950" >
< AvatarImage :src ="undefined" :alt ="user?.firstName " / >
< AvatarImage :src ="undefined" : alt = "extendedUser?.firstName || '' " / >
< AvatarFallback
< AvatarFallback
class = "bg-experimenta-accent text-white font-bold text-sm md:text-base flex items-center justify-center w-full h-full" >
class = "bg-experimenta-accent text-white font-bold text-sm md:text-base flex items-center justify-center w-full h-full" >
{ { userInitials } }
{ { userInitials } }
@ -82,10 +88,10 @@ async function handleLogout() {
< DropdownMenuLabel class = "font-normal py-3" >
< DropdownMenuLabel class = "font-normal py-3" >
< div class = "flex flex-col space-y-1.5" >
< div class = "flex flex-col space-y-1.5" >
< p class = "text-base font-semibold leading-none" >
< p class = "text-base font-semibold leading-none" >
{ { u ser? . firstName } } { { u ser? . lastName } }
{ { extendedU ser? . firstName } } { { extendedU ser? . lastName } }
< / p >
< / p >
< p class = "text-sm leading-none text-muted-foreground" >
< p class = "text-sm leading-none text-muted-foreground" >
{ { u ser? . email } }
{ { extendedU ser? . email } }
< / p >
< / p >
< / div >
< / div >
< / DropdownMenuLabel >
< / DropdownMenuLabel >