components / actions
Dropdown Menu
A menu of actions that opens from a button, with checkable items, radio groups, and submenus.
dropdown-menu-default.tsx
"use client";
import { ChevronDownIcon } from "lucide-react";
import { useState } from "react";
import { Button } from "@/components/ui/button";
import {
DropdownMenu,
DropdownMenuCheckboxItem,
DropdownMenuGroup,
DropdownMenuItem,
DropdownMenuLabel,
DropdownMenuPopup,
DropdownMenuRadioGroup,
DropdownMenuRadioItem,
DropdownMenuSeparator,
DropdownMenuShortcut,
DropdownMenuSub,
DropdownMenuSubTrigger,
DropdownMenuTrigger,
} from "@/components/ui/dropdown-menu";
export default function DropdownMenuDefault() {
const [grid, setGrid] = useState(true);
const [sort, setSort] = useState("name");
return (
<DropdownMenu>
<DropdownMenuTrigger render={<Button variant="outline" />}>
options <ChevronDownIcon aria-hidden="true" />
</DropdownMenuTrigger>
<DropdownMenuPopup>
<DropdownMenuGroup>
<DropdownMenuLabel>Project</DropdownMenuLabel>
<DropdownMenuItem>
Rename <DropdownMenuShortcut>F2</DropdownMenuShortcut>
</DropdownMenuItem>
<DropdownMenuItem>Duplicate</DropdownMenuItem>
<DropdownMenuSub>
<DropdownMenuSubTrigger>Share</DropdownMenuSubTrigger>
<DropdownMenuPopup>
<DropdownMenuItem>Copy link</DropdownMenuItem>
<DropdownMenuItem>Send by email</DropdownMenuItem>
</DropdownMenuPopup>
</DropdownMenuSub>
</DropdownMenuGroup>
<DropdownMenuSeparator />
<DropdownMenuCheckboxItem checked={grid} onCheckedChange={setGrid}>
Grid view
</DropdownMenuCheckboxItem>
<DropdownMenuSeparator />
<DropdownMenuRadioGroup onValueChange={setSort} value={sort}>
<DropdownMenuLabel>Sort by</DropdownMenuLabel>
<DropdownMenuRadioItem value="name">Name</DropdownMenuRadioItem>
<DropdownMenuRadioItem value="date">Date</DropdownMenuRadioItem>
</DropdownMenuRadioGroup>
<DropdownMenuSeparator />
<DropdownMenuItem variant="destructive">Delete</DropdownMenuItem>
</DropdownMenuPopup>
</DropdownMenu>
);
}Installation
$ npx shadcn@latest add https://cd-ui.vercel.app/r/dropdown-menu.jsonfirst time? set up components.json and the theme first: see installation.
Usage
import { DropdownMenu, DropdownMenuItem, DropdownMenuPopup, DropdownMenuTrigger } from "@/components/ui/dropdown-menu"
<DropdownMenu>
<DropdownMenuTrigger render={<Button />}>Options</DropdownMenuTrigger>
<DropdownMenuPopup>
<DropdownMenuItem onClick={rename}>Rename</DropdownMenuItem>
<DropdownMenuItem variant="destructive">Delete</DropdownMenuItem>
</DropdownMenuPopup>
</DropdownMenu>API
DropdownMenu
Base UI · Menu.RootRoot. Also used for each submenu, through DropdownMenuSub.
| prop | type | default |
|---|---|---|
open · defaultOpen · onOpenChangeOpen state control. | boolean / (open) => void | - |
DropdownMenuTrigger
Base UI · Menu.TriggerButton that opens the menu. Use render to use your own Button.
| prop | type | default |
|---|---|---|
renderSwaps the rendered element while keeping behavior and style (e.g. become an | ReactElement | (props) => ReactElement | - |
DropdownMenuPopup
Base UI · Menu.PopupList of actions. Opens from the trigger in 160ms, closes in 120ms.
| prop | type | default |
|---|---|---|
sidePreferred side. Submenus open to the right on their own. | "top" | "bottom" | "left" | "right" | - |
alignAlignment relative to the trigger. | "start" | "center" | "end" | - |
sideOffsetDistance from the trigger (px). | number | 6 |
classNameExtra classes, merged with | string | - |
DropdownMenuItem
Base UI · Menu.ItemAction. The menu closes after it is chosen.
| prop | type | default |
|---|---|---|
variantUse | "default" | "destructive" | "default" |
onClickCalled when the item is chosen. | () => void | - |
classNameExtra classes, merged with | string | - |
DropdownMenuCheckboxItem · DropdownMenuRadioGroup · DropdownMenuRadioItem
Base UI · Menu.CheckboxItem · Menu.RadioGroup · Menu.RadioItemItems with a check. The checkbox item toggles on its own; radio items live inside a DropdownMenuRadioGroup.
| prop | type | default |
|---|---|---|
checked · onCheckedChangeControlled or initial state. | boolean / (checked) => void | - |
value · onValueChangeControlled or initial state. | string / (value) => void | - |
DropdownMenuGroup · DropdownMenuLabel · DropdownMenuSeparator · DropdownMenuShortcut · DropdownMenuSub · DropdownMenuSubTrigger
Organize the list: DropdownMenuGroup with a DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuShortcut, and DropdownMenuSub with DropdownMenuSubTrigger.
| prop | type | default |
|---|---|---|
classNameExtra classes, merged with | string | - |
Keyboard
| key | action |
|---|---|
| EnterSpace↓ | Opens the menu from the trigger. |
| ↑↓ | Moves between items. |
| EnterSpace | Chooses the item. |
| →← | Opens and closes a submenu. |
| Esc | Closes and returns focus to the trigger. |
| A-Z | Jumps to the item that starts with the letter. |
Accessibility
DropdownMenuShortcutonly displays the hint. Wire up the real shortcut yourself.