From 546e431f2a02780a57b1e8aa3099aa06ddb067d8 Mon Sep 17 00:00:00 2001 From: ngc2207 Date: Fri, 31 Jan 2025 20:46:23 +0800 Subject: [PATCH] feat: add shadcn/originui dropdown-menu component --- bun.lockb | Bin 174846 -> 186468 bytes package.json | 1 + src/components/ui/dropdown-menu.tsx | 263 ++++++++++++++++++++++++++++ 3 files changed, 264 insertions(+) create mode 100644 src/components/ui/dropdown-menu.tsx diff --git a/bun.lockb b/bun.lockb index 73ecddf07ecb80c7070f7709c3a5647ee287fdd9..20b7f986c1de0e9387cb76afcf6159e039f5502a 100755 GIT binary patch delta 36629 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 B%Ci6f diff --git a/package.json b/package.json index e136fb9..89f193f 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ "@hono/zod-validator": "^0.4.2", "@hookform/resolvers": "^3.10.0", "@radix-ui/react-avatar": "^1.1.2", + "@radix-ui/react-dropdown-menu": "^2.1.5", "@radix-ui/react-label": "^2.1.1", "@radix-ui/react-radio-group": "^1.2.2", "@radix-ui/react-separator": "^1.1.1", diff --git a/src/components/ui/dropdown-menu.tsx b/src/components/ui/dropdown-menu.tsx new file mode 100644 index 0000000..3d62e19 --- /dev/null +++ b/src/components/ui/dropdown-menu.tsx @@ -0,0 +1,263 @@ +"use client"; + +import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu"; +import { Check, ChevronRight, Circle } from "lucide-react"; +import * as React from "react"; + +import { cn } from "@/lib/utils"; + +type PointerDownEvent = Parameters< + NonNullable +>[0]; +type PointerDownOutsideEvent = Parameters< + NonNullable< + DropdownMenuPrimitive.DropdownMenuContentProps["onPointerDownOutside"] + > +>[0]; + +const DropdownMenu = DropdownMenuPrimitive.Root; + +const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger; + +const DropdownMenuGroup = DropdownMenuPrimitive.Group; + +const DropdownMenuPortal = DropdownMenuPrimitive.Portal; + +const DropdownMenuSub = DropdownMenuPrimitive.Sub; + +const DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup; + +const DropdownMenuSubTrigger = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + inset?: boolean; + } +>(({ className, inset, children, ...props }, ref) => ( + + {children} + + +)); +DropdownMenuSubTrigger.displayName = + DropdownMenuPrimitive.SubTrigger.displayName; + +const DropdownMenuSubContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +DropdownMenuSubContent.displayName = + DropdownMenuPrimitive.SubContent.displayName; + +const DropdownMenuContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>( + ( + { + className, + sideOffset = 4, + onPointerDown, + onPointerDownOutside, + onCloseAutoFocus, + ...props + }, + ref + ) => { + const isCloseFromMouse = React.useRef(false); + + const handlePointerDown = React.useCallback( + (e: PointerDownEvent) => { + isCloseFromMouse.current = true; + onPointerDown?.(e); + }, + [onPointerDown] + ); + + const handlePointerDownOutside = React.useCallback( + (e: PointerDownOutsideEvent) => { + isCloseFromMouse.current = true; + onPointerDownOutside?.(e); + }, + [onPointerDownOutside] + ); + + const handleCloseAutoFocus = React.useCallback( + (e: Event) => { + if (onCloseAutoFocus) { + return onCloseAutoFocus(e); + } + + if (!isCloseFromMouse.current) { + return; + } + + e.preventDefault(); + isCloseFromMouse.current = false; + }, + [onCloseAutoFocus] + ); + + return ( + + + + ); + } +); +DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName; + +const DropdownMenuItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + inset?: boolean; + } +>(({ className, inset, ...props }, ref) => ( + +)); +DropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName; + +const DropdownMenuCheckboxItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, checked, ...props }, ref) => ( + + + + + + + {children} + +)); +DropdownMenuCheckboxItem.displayName = + DropdownMenuPrimitive.CheckboxItem.displayName; + +const DropdownMenuRadioItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + + + + + + {children} + +)); +DropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName; + +const DropdownMenuLabel = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + inset?: boolean; + } +>(({ className, inset, ...props }, ref) => ( + +)); +DropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName; + +const DropdownMenuSeparator = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +DropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName; + +const DropdownMenuShortcut = ({ + className, + ...props +}: React.HTMLAttributes) => { + return ( + + ); +}; +DropdownMenuShortcut.displayName = "DropdownMenuShortcut"; + +export { + DropdownMenu, + DropdownMenuCheckboxItem, + DropdownMenuContent, + DropdownMenuGroup, + DropdownMenuItem, + DropdownMenuLabel, + DropdownMenuPortal, + DropdownMenuRadioGroup, + DropdownMenuRadioItem, + DropdownMenuSeparator, + DropdownMenuShortcut, + DropdownMenuSub, + DropdownMenuSubContent, + DropdownMenuSubTrigger, + DropdownMenuTrigger, +};