DropdownMenu
<DropdownMenu> is the action menu — an anchored list of items the user picks from. Items can be plain actions, checkbox toggles, radio selections, or nested sub-menus.
When to use
- Row-action ”⋯” menus on list / table rows.
- Per-entity menus (Edit / Duplicate / Delete).
- Filter / sort menus on list pages.
Don’t use DropdownMenu for: navigation between pages (use real <a> links), command palettes (CommandPalette — planned), or pickers from a long static list (Select / Combobox).
Basic
<DropdownMenu> <DropdownMenuTrigger asChild> <Button variant="outline" size="sm">Actions</Button> </DropdownMenuTrigger> <DropdownMenuContent> <DropdownMenuLabel>Agent</DropdownMenuLabel> <DropdownMenuItem>Edit <DropdownMenuShortcut>⌘E</DropdownMenuShortcut></DropdownMenuItem> <DropdownMenuSub> <DropdownMenuSubTrigger>Move to…</DropdownMenuSubTrigger> <DropdownMenuSubContent> <DropdownMenuItem>Inbox</DropdownMenuItem> </DropdownMenuSubContent> </DropdownMenuSub> <DropdownMenuSeparator /> <DropdownMenuItem className="text-destructive">Delete</DropdownMenuItem> </DropdownMenuContent></DropdownMenu>With checkboxes
<DropdownMenuCheckboxItem checked={show.unread} onCheckedChange={…}> Unread</DropdownMenuCheckboxItem>With radios
<DropdownMenuRadioGroup value={sort} onValueChange={setSort}> <DropdownMenuRadioItem value="recent">Most recent</DropdownMenuRadioItem> <DropdownMenuRadioItem value="name">Name</DropdownMenuRadioItem></DropdownMenuRadioGroup>Anatomy
DropdownMenu(root)DropdownMenuTriggerDropdownMenuContentDropdownMenuLabel— non-clickable section headerDropdownMenuItem— actionDropdownMenuShortcut— right-aligned keyboard hintDropdownMenuCheckboxItem— toggleableDropdownMenuRadioGroup+DropdownMenuRadioItem— single-select groupDropdownMenuSub+DropdownMenuSubTrigger+DropdownMenuSubContent— nested menuDropdownMenuSeparator— between groups
Design guidelines
✓ Do
- Group items by purpose with a Separator. Two clicks shouldn't find unrelated actions.
- Pair every shortcut hint (⌘E) with a real keybinding. Hints without bindings are noise.
- Use DropdownMenuLabel for section headers — it doesn't look clickable, which is correct.
✗ Don't
- Use DropdownMenu as a Select. They look similar but the keyboard contract is different.
- Nest sub-menus more than one level deep. Mouse navigation breaks down quickly.
- Place the destructive option as the first item. Last + visually destructive is correct.
Accessibility
- Composes Radix DropdownMenu —
role="menu", itemsrole="menuitem", sub-menus accessible via arrow keys. - Type-ahead works (start typing to focus matching item).
- Esc closes; arrow keys navigate; Enter activates.
Related
Select— Pickers from a static list.CommandPalette— App-wide ⌘K command UI (planned).