"use client"
/**
* NavUser — WCAG 2.1 AA profile menu
*
* AA checklist:
* ✓ aria-label on trigger (1.3.1, 4.1.2)
* ✓ Icon-only items have sr-only text (1.1.1)
* ✓ App preferences link to Settings (appearance lives there)
* ✓ Keyboard: full arrow-key + Enter/Space navigation via Radix (2.1.1)
* ✓ Focus ring visible on every item (2.4.11)
* ✓ Colour contrast: all labels ≥ 4.5:1 on popover bg (1.4.3)
* ✓ Active theme shown via aria-checked (RadioItem) (4.1.3)
*/
import { useTheme } from "@exxatdesignux/ui/hooks/use-color-scheme"
import { Link } from "react-router-dom"
import {
Avatar,
AvatarFallback,
AvatarImage,
} from "@/components/ui/avatar"
import {
DropdownMenu,
DropdownMenuContent,
DropdownMenuGroup,
DropdownMenuItem,
DropdownMenuLabel,
DropdownMenuSeparator,
DropdownMenuTrigger,
} from "@/components/ui/dropdown-menu"
import {
SidebarMenu,
SidebarMenuButton,
SidebarMenuItem,
useSidebar,
} from "@/components/ui/sidebar"
import {
Tooltip,
TooltipContent,
TooltipTrigger,
} from "@/components/ui/tooltip"
import { useAppTheme } from "@/hooks/use-app-theme"
import { cn } from "@/lib/utils"
export function NavUser({
user,
}: {
user: {
name: string
email: string
avatar: string
}
}) {
const { isMobile, state } = useSidebar()
const iconRailCollapsed = state === "collapsed" && !isMobile
const { theme } = useTheme()
const { mounted } = useAppTheme()
const safeTheme = mounted ? (theme ?? "system") : "system"
const profileTrigger = (
span:last-child]:!overflow-visible [&>span:last-child]:!whitespace-normal [&>span:last-child]:text-clip",
"group-data-[collapsible=icon]:[&>span:last-child]:hidden",
)}
>
{user.name.slice(0, 2).toUpperCase()}
{user.name}
{user.email}
)
return (
{profileTrigger}
{user.name}
{/* ── User identity ──────────────────────────────── */}
{user.name.slice(0, 2).toUpperCase()}
{user.name}
{user.email}
{/* ── Account actions ────────────────────────────── */}
Account
Billing
Notifications
Profile settings
{safeTheme}
{/* ── Sign out ───────────────────────────────────── */}
Log out
)
}