{ "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "dropdown-menu", "title": "Dropdown Menu", "description": "Contextual menu triggered by a button, with support for items, separators, and sub-menus.", "dependencies": [ "@base-ui/react", "lucide-react" ], "registryDependencies": [ "checkbox" ], "files": [ { "path": "packages/ui/src/dropdown-menu.tsx", "content": "\"use client\";\n\nimport { Menu as MenuPrimitive } from \"@base-ui/react/menu\";\nimport {\n Check as CheckIcon,\n ChevronRight as ChevronRightIcon,\n Circle as CircleIcon,\n} from \"lucide-react\";\nimport type * as React from \"react\";\nimport { Checkbox } from \"./checkbox\";\nimport { cn, POPUP_ITEM_HEIGHT } from \"./utils\";\n\n// =============================================================================\n// DropdownMenu (Root)\n// =============================================================================\nfunction DropdownMenu({ ...props }: MenuPrimitive.Root.Props) {\n return ;\n}\n\n// =============================================================================\n// DropdownMenuPortal\n// =============================================================================\nexport interface DropdownMenuPortalProps extends MenuPrimitive.Portal.Props {}\n\nfunction DropdownMenuPortal({ ...props }: DropdownMenuPortalProps) {\n return ;\n}\n\n// =============================================================================\n// DropdownMenuTrigger\n// =============================================================================\nexport interface DropdownMenuTriggerProps extends MenuPrimitive.Trigger.Props {}\n\nfunction DropdownMenuTrigger({\n className,\n ...props\n}: DropdownMenuTriggerProps) {\n return (\n \n );\n}\n\n// =============================================================================\n// DropdownMenuContent\n// =============================================================================\nexport interface DropdownMenuContentProps extends MenuPrimitive.Popup.Props {\n /**\n * Alignment of the content relative to the trigger\n * @default \"start\"\n */\n align?: \"start\" | \"center\" | \"end\";\n /**\n * Offset along the alignment axis\n * @default 0\n */\n alignOffset?: number;\n /**\n * Side of the trigger to position the popup\n * @default \"bottom\"\n */\n side?: \"top\" | \"bottom\" | \"left\" | \"right\" | \"inline-start\" | \"inline-end\";\n /**\n * Offset from the trigger\n * @default 4\n */\n sideOffset?: number;\n /**\n * Size of the menu items\n * @default \"default\"\n */\n size?: \"default\" | \"compact\";\n}\n\nfunction DropdownMenuContent({\n align = \"start\",\n alignOffset = 0,\n side = \"bottom\",\n sideOffset = 4,\n size = \"default\",\n className,\n ...props\n}: DropdownMenuContentProps) {\n return (\n \n \n \n \n \n );\n}\n\n// =============================================================================\n// DropdownMenuGroup\n// =============================================================================\nexport interface DropdownMenuGroupProps extends MenuPrimitive.Group.Props {}\n\nfunction DropdownMenuGroup({ ...props }: DropdownMenuGroupProps) {\n return ;\n}\n\n// =============================================================================\n// DropdownMenuLabel\n// =============================================================================\nexport interface DropdownMenuLabelProps extends MenuPrimitive.GroupLabel.Props {\n /**\n * Whether to add left padding for inset alignment\n * @default false\n */\n inset?: boolean;\n}\n\nfunction DropdownMenuLabel({\n className,\n inset,\n ...props\n}: DropdownMenuLabelProps) {\n return (\n \n );\n}\n\n// =============================================================================\n// DropdownMenuItem\n// =============================================================================\nexport interface DropdownMenuItemProps extends MenuPrimitive.Item.Props {\n /**\n * Whether to add left padding for inset alignment\n * @default false\n */\n inset?: boolean;\n /**\n * Visual variant of the item\n * @default \"default\"\n */\n variant?: \"default\" | \"destructive\";\n}\n\nfunction DropdownMenuItem({\n className,\n inset,\n variant = \"default\",\n ...props\n}: DropdownMenuItemProps) {\n return (\n \n );\n}\n\n// =============================================================================\n// DropdownMenuSub\n// =============================================================================\nexport interface DropdownMenuSubProps extends MenuPrimitive.SubmenuRoot.Props {}\n\nfunction DropdownMenuSub({ ...props }: DropdownMenuSubProps) {\n return ;\n}\n\n// =============================================================================\n// DropdownMenuSubTrigger\n// =============================================================================\nexport interface DropdownMenuSubTriggerProps\n extends MenuPrimitive.SubmenuTrigger.Props {\n /**\n * Whether to add left padding for inset alignment\n * @default false\n */\n inset?: boolean;\n}\n\nfunction DropdownMenuSubTrigger({\n className,\n inset,\n children,\n ...props\n}: DropdownMenuSubTriggerProps) {\n return (\n \n {children}\n \n \n );\n}\n\n// =============================================================================\n// DropdownMenuSubContent\n// =============================================================================\nexport interface DropdownMenuSubContentProps\n extends Omit<\n DropdownMenuContentProps,\n \"align\" | \"alignOffset\" | \"side\" | \"sideOffset\"\n > {\n /**\n * Alignment of the subcontent\n * @default \"start\"\n */\n align?: \"start\" | \"center\" | \"end\";\n /**\n * Offset along the alignment axis\n * @default -3\n */\n alignOffset?: number;\n /**\n * Side of the trigger to position the popup\n * @default \"right\"\n */\n side?: \"top\" | \"bottom\" | \"left\" | \"right\" | \"inline-start\" | \"inline-end\";\n /**\n * Offset from the trigger\n * @default 0\n */\n sideOffset?: number;\n}\n\nfunction DropdownMenuSubContent({\n align = \"start\",\n alignOffset = -3,\n side = \"right\",\n sideOffset = 0,\n className,\n ...props\n}: DropdownMenuSubContentProps) {\n return (\n \n \n \n \n \n );\n}\n\n// =============================================================================\n// DropdownMenuCheckboxItem\n// =============================================================================\nexport interface DropdownMenuCheckboxItemProps\n extends MenuPrimitive.CheckboxItem.Props {\n /**\n * Visual style of the checkbox indicator\n * - \"indicator\": check icon on the right (default)\n * - \"control\": renders a real Checkbox component on the left\n * @default \"indicator\"\n */\n variant?: \"indicator\" | \"control\";\n}\n\nfunction DropdownMenuCheckboxItem({\n className,\n children,\n checked,\n variant = \"indicator\",\n ...props\n}: DropdownMenuCheckboxItemProps) {\n return (\n \n {variant === \"control\" ? (\n \n ) : (\n \n \n \n \n \n )}\n {children}\n \n );\n}\n\n// =============================================================================\n// DropdownMenuRadioGroup\n// =============================================================================\nexport interface DropdownMenuRadioGroupProps\n extends MenuPrimitive.RadioGroup.Props {}\n\nfunction DropdownMenuRadioGroup({ ...props }: DropdownMenuRadioGroupProps) {\n return (\n \n );\n}\n\n// =============================================================================\n// DropdownMenuRadioItem\n// =============================================================================\nexport interface DropdownMenuRadioItemProps\n extends MenuPrimitive.RadioItem.Props {\n /**\n * Visual style of the radio indicator\n * - \"indicator\": check icon on the right (default)\n * - \"control\": renders a real Radio component on the left\n * @default \"indicator\"\n */\n variant?: \"indicator\" | \"control\";\n}\n\nfunction DropdownMenuRadioItem({\n className,\n children,\n variant = \"indicator\",\n ...props\n}: DropdownMenuRadioItemProps) {\n return (\n \n {variant === \"control\" ? (\n \n \n \n \n \n ) : (\n \n \n \n \n \n )}\n {children}\n \n );\n}\n\n// =============================================================================\n// DropdownMenuSeparator\n// =============================================================================\nexport interface DropdownMenuSeparatorProps\n extends MenuPrimitive.Separator.Props {}\n\nfunction DropdownMenuSeparator({\n className,\n ...props\n}: DropdownMenuSeparatorProps) {\n return (\n \n );\n}\n\n// =============================================================================\n// DropdownMenuShortcut\n// =============================================================================\nexport interface DropdownMenuShortcutProps\n extends React.ComponentProps<\"span\"> {}\n\nfunction DropdownMenuShortcut({\n className,\n ...props\n}: DropdownMenuShortcutProps) {\n return (\n \n );\n}\n\nexport type { MenuRootProps as DropdownMenuProps } from \"@base-ui/react/menu\";\n// =============================================================================\n// Exports\n// =============================================================================\nexport {\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuPortal,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuTrigger,\n};\n", "type": "registry:ui" } ], "type": "registry:ui" }