From ca46fdb483cbb2e8b9df1016582d21af0d12eb26 Mon Sep 17 00:00:00 2001 From: Jiayuan Zhang Date: Sat, 11 Jul 2026 14:33:04 +0800 Subject: [PATCH] fix(ui): lighten menu shadows with dedicated --menu-shadow token (#5256) Dropdown, context menu, select, and popover surfaces used --floating-shadow, which is sized for window-level overlays and reads too heavy on trigger-anchored menus. Introduce a lighter --menu-shadow tier (surface < menu < floating) and drop the shadow-lg override on ContextMenuSubContent so submenus match their parent menu. Dialogs and sheets keep --floating-shadow. Co-authored-by: Lambda Co-authored-by: multica-agent --- apps/web/app/custom.css | 1 + packages/ui/components/ui/context-menu.tsx | 3 +-- packages/ui/components/ui/dropdown-menu.tsx | 4 ++-- packages/ui/components/ui/popover.tsx | 2 +- packages/ui/components/ui/select.tsx | 2 +- packages/ui/styles/tokens.css | 5 +++++ 6 files changed, 11 insertions(+), 6 deletions(-) diff --git a/apps/web/app/custom.css b/apps/web/app/custom.css index 12b6790695..a094eed3b0 100644 --- a/apps/web/app/custom.css +++ b/apps/web/app/custom.css @@ -27,6 +27,7 @@ --surface-border: oklch(0.92 0.004 286.32); --surface-shadow: 0 1px 2px rgb(15 23 42 / 0.04), 0 1px 1px rgb(15 23 42 / 0.03); --floating-shadow: 0 16px 40px rgb(15 23 42 / 0.14), 0 3px 10px rgb(15 23 42 / 0.08); + --menu-shadow: 0 8px 24px rgb(15 23 42 / 0.08), 0 2px 6px rgb(15 23 42 / 0.05); --background: oklch(1 0 0); --foreground: oklch(0.141 0.005 285.823); --card: oklch(1 0 0); diff --git a/packages/ui/components/ui/context-menu.tsx b/packages/ui/components/ui/context-menu.tsx index 7093e51f9d..a401cfcb09 100644 --- a/packages/ui/components/ui/context-menu.tsx +++ b/packages/ui/components/ui/context-menu.tsx @@ -52,7 +52,7 @@ function ContextMenuContent({ > @@ -145,7 +145,6 @@ function ContextMenuSubContent({ return ( diff --git a/packages/ui/components/ui/dropdown-menu.tsx b/packages/ui/components/ui/dropdown-menu.tsx index 9788d99829..3bb91bc097 100644 --- a/packages/ui/components/ui/dropdown-menu.tsx +++ b/packages/ui/components/ui/dropdown-menu.tsx @@ -51,7 +51,7 @@ function DropdownMenuContent({ e.stopPropagation() onClick?.(e) }} - className={cn("z-50 max-h-(--available-height) min-w-32 origin-(--transform-origin) overflow-x-hidden overflow-y-auto rounded-lg bg-surface-raised p-1 text-popover-foreground shadow-[var(--floating-shadow)] ring-1 ring-surface-border duration-100 outline-none data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:overflow-hidden data-closed:fade-out-0 data-closed:zoom-out-95", className )} + className={cn("z-50 max-h-(--available-height) min-w-32 origin-(--transform-origin) overflow-x-hidden overflow-y-auto rounded-lg bg-surface-raised p-1 text-popover-foreground shadow-[var(--menu-shadow)] ring-1 ring-surface-border duration-100 outline-none data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:overflow-hidden data-closed:fade-out-0 data-closed:zoom-out-95", className )} {...props} /> @@ -145,7 +145,7 @@ function DropdownMenuSubContent({ return ( diff --git a/packages/ui/styles/tokens.css b/packages/ui/styles/tokens.css index 6e649aff42..dfe3ea74d1 100644 --- a/packages/ui/styles/tokens.css +++ b/packages/ui/styles/tokens.css @@ -75,6 +75,10 @@ --surface-border: oklch(0.92 0.004 286.32); --surface-shadow: 0 1px 2px rgb(15 23 42 / 0.04), 0 1px 1px rgb(15 23 42 / 0.03); --floating-shadow: 0 16px 40px rgb(15 23 42 / 0.14), 0 3px 10px rgb(15 23 42 / 0.08); + /* Menus (dropdown/context/select/popover) hover just above their trigger, + so they carry a lighter shadow than window-level overlays (dialogs, + sheets), which keep --floating-shadow. */ + --menu-shadow: 0 8px 24px rgb(15 23 42 / 0.08), 0 2px 6px rgb(15 23 42 / 0.05); --background: var(--page-canvas); --foreground: oklch(0.141 0.005 285.823); --card: var(--surface); @@ -141,6 +145,7 @@ --surface-border: oklch(1 0 0 / 10%); --surface-shadow: 0 1px 2px rgb(0 0 0 / 0.2), 0 1px 1px rgb(0 0 0 / 0.16); --floating-shadow: 0 20px 48px rgb(0 0 0 / 0.46), 0 4px 12px rgb(0 0 0 / 0.28); + --menu-shadow: 0 10px 28px rgb(0 0 0 / 0.3), 0 2px 8px rgb(0 0 0 / 0.18); --background: var(--page-canvas); --foreground: oklch(0.985 0 0); --card: var(--surface);