"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 "@/lib/router-compat" 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 { usePersistedState } from "@exxatdesignux/ui/lib/persisted-state" import { BUILDER_SESSION_KEY, useCanAuthorProducts, } from "@/lib/use-can-author-products" import { useProductAuthoringEnabled } from "@/lib/product-authoring" import { cn } from "@/lib/utils" export function NavUser({ user, }: { user: { name: string email: string avatar: string } }) { const { isMobile, state } = useSidebar() const { theme } = useTheme() const { mounted } = useAppTheme() const canAuthor = useCanAuthorProducts() const authoringUi = useProductAuthoringEnabled() const [, setDemoBuilder] = usePersistedState(BUILDER_SESSION_KEY, false) const showBuilderModeToggle = typeof import.meta !== "undefined" && import.meta.env?.PROD === true && !canAuthor const safeTheme = mounted ? (theme ?? "system") : "system" const showCollapsedTooltip = state === "collapsed" && !isMobile 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} {user.email}