From 982f0c7d21ab3e4ad8681e6be398b5729af78481 Mon Sep 17 00:00:00 2001 From: codytseng Date: Tue, 21 Oct 2025 18:19:32 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=F0=9F=90=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/ui/dropdown-menu.tsx | 54 ++++++++++++++++++++++++----- 1 file changed, 45 insertions(+), 9 deletions(-) diff --git a/src/components/ui/dropdown-menu.tsx b/src/components/ui/dropdown-menu.tsx index 62809c4d..ffba2fb6 100644 --- a/src/components/ui/dropdown-menu.tsx +++ b/src/components/ui/dropdown-menu.tsx @@ -1,10 +1,46 @@ -import * as React from 'react' import * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu' import { Check, ChevronDown, ChevronRight, ChevronUp, Circle } from 'lucide-react' +import * as React from 'react' import { cn } from '@/lib/utils' +import { createPortal } from 'react-dom' -const DropdownMenu = DropdownMenuPrimitive.Root +const DropdownMenu = ({ + open: controlledOpen, + onOpenChange: controlledOnOpenChange, + ...props +}: React.ComponentPropsWithoutRef) => { + const [uncontrolledOpen, setUncontrolledOpen] = React.useState(false) + const isControlled = controlledOpen !== undefined + const open = isControlled ? controlledOpen : uncontrolledOpen + + const handleOpenChange = React.useCallback( + (newOpen: boolean) => { + if (!isControlled) { + setUncontrolledOpen(newOpen) + } + controlledOnOpenChange?.(newOpen) + }, + [isControlled, controlledOnOpenChange] + ) + + return ( + <> + {open && + createPortal( +
handleOpenChange(false)} />, + document.body + )} + + + ) +} +DropdownMenu.displayName = 'DropdownMenu' const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger @@ -306,18 +342,18 @@ DropdownMenuShortcut.displayName = 'DropdownMenuShortcut' export { DropdownMenu, - DropdownMenuTrigger, - DropdownMenuContent, - DropdownMenuItem, DropdownMenuCheckboxItem, - DropdownMenuRadioItem, + DropdownMenuContent, + DropdownMenuGroup, + DropdownMenuItem, DropdownMenuLabel, + DropdownMenuPortal, + DropdownMenuRadioGroup, + DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, - DropdownMenuGroup, - DropdownMenuPortal, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, - DropdownMenuRadioGroup + DropdownMenuTrigger }