diff --git a/web/src/components/layout/UserNav.tsx b/web/src/components/layout/UserNav.tsx index 9d2dd42f..70ff7353 100644 --- a/web/src/components/layout/UserNav.tsx +++ b/web/src/components/layout/UserNav.tsx @@ -1,23 +1,27 @@ -// User menu — sits at the very bottom of the sidebar on the sky chrome. -// Styled for the dark background; the dropdown itself is light because -// it overlays the content area. +// User menu — bottom of the sidebar. +// +// Moved off the shadcn DropdownMenu onto the same PopoverMenu primitive +// every other dropdown in the dashboard uses (folders, sort, accounts, +// org switcher). One animation curve, one surface, one set of styles. +// +// Opens upward (side="top") from the trigger so the popover settles up +// from the bottom of the sidebar instead of falling off-screen. -import { Link, useNavigate } from "react-router-dom"; +import { useNavigate } from "react-router-dom"; import { CreditCardIcon, LogOutIcon, SettingsIcon, UsersIcon, } from "lucide-react"; -import { - DropdownMenu, - DropdownMenuContent, - DropdownMenuGroup, - DropdownMenuItem, - DropdownMenuSeparator, - DropdownMenuTrigger, -} from "@/components/ui/dropdown-menu"; import { useAppStore } from "@/stores"; +import { + PopoverMenu, + PopoverMenuContent, + PopoverMenuItem, + PopoverMenuSeparator, + PopoverMenuTrigger, +} from "@/components/ui/popover-menu"; export function UserNav() { const navigate = useNavigate(); @@ -39,8 +43,8 @@ export function UserNav() { : user.email; return ( - - + + - - -
-
{displayName}
-
{user.email}
+ + + + {/* Identity block — same name/email row but inside the + PopoverMenu chrome so it inherits the consistent + hairline border + shadow. */} +
+
+ {displayName} +
+
+ {user.email} +
- - - - - - Settings - - - - - - Billing - - - - - - Team - - - - - - - Log out - - - + + navigate("/app/settings")} + icon={} + > + Settings + + navigate("/app/billing")} + icon={} + > + Billing + + navigate("/app/team")} + icon={} + > + Team + + + } + danger + > + Log out + +
+ ); }