From d32ac015f8c7b91c9dc21189c968194abf63db63 Mon Sep 17 00:00:00 2001 From: Oliver Bryan <04oliverbryan@gmail.com> Date: Sat, 27 Dec 2025 04:43:04 +0000 Subject: [PATCH] added dropdown menu component (shadcn) --- .../src/components/ui/dropdown-menu.tsx | 82 +++++++++++++++++-- .../frontend/src/components/ui/select.tsx | 2 + 2 files changed, 75 insertions(+), 9 deletions(-) diff --git a/packages/frontend/src/components/ui/dropdown-menu.tsx b/packages/frontend/src/components/ui/dropdown-menu.tsx index 39a2fd5..f37f8cc 100644 --- a/packages/frontend/src/components/ui/dropdown-menu.tsx +++ b/packages/frontend/src/components/ui/dropdown-menu.tsx @@ -12,13 +12,39 @@ function DropdownMenuPortal({ ...props }: React.ComponentProps; } -function DropdownMenuTrigger({ ...props }: React.ComponentProps) { - return ; +function DropdownMenuTrigger({ + className, + size = "default", + ...props +}: React.ComponentProps & { + size?: "sm" | "default"; +}) { + return ( + + ); } function DropdownMenuContent({ className, - sideOffset = 4, + sideOffset = 0, ...props }: React.ComponentProps) { return ( @@ -27,7 +53,16 @@ function DropdownMenuContent({ data-slot="dropdown-menu-content" sideOffset={sideOffset} className={cn( - "bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-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 z-50 max-h-(--radix-dropdown-menu-content-available-height) min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border p-1 shadow-md", + "bg-popover text-popover-foreground", + "data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95", + "data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-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", + "z-50 max-h-(--radix-dropdown-menu-content-available-height)", + "min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin)", + "overflow-x-hidden overflow-y-auto border p-1 shadow-md", + "data-[side=bottom]:translate-y-1", className, )} {...props} @@ -55,7 +90,18 @@ function DropdownMenuItem({ data-inset={inset} data-variant={variant} className={cn( - "focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:!text-destructive [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", + "focus:bg-accent/40 focus:text-accent-foreground", + "data-[variant=destructive]:text-destructive", + "data-[variant=destructive]:focus:bg-destructive/10", + "dark:data-[variant=destructive]:focus:bg-destructive/20", + "data-[variant=destructive]:focus:text-destructive", + "data-[variant=destructive]:*:[svg]:!text-destructive", + "[&_svg:not([class*='text-'])]:text-foreground relative", + "flex w-full cursor-pointer items-center gap-2 py-1.5 pr-8 pl-2", + "px-2 py-1.5 text-sm outline-hidden select-none", + "data-[disabled]:pointer-events-none data-[disabled]:opacity-50", + "data-[inset]:pl-8 [&_svg]:pointer-events-none", + "[&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", className, )} {...props} @@ -73,7 +119,11 @@ function DropdownMenuCheckboxItem({