Dropdown Menu
A list of actions or options that opens from a button.
- Picking a value for a form field: use Select or Combobox.
- Site navigation: use links.
Install
Terminal
pnpm dlx shadcn@latest add @acme/dropdown-menuOr import from the package: import { DropdownMenu } from '@acme/react'
Examples
Menu basic
dropdown-menu-basic.tsx
'use client'
import { Copy, Pencil, Trash2 } from 'lucide-react'
import { useState } from 'react'
import { Button } from '@/components/ui/button'
import {
DropdownMenu,
DropdownMenuCheckboxItem,
DropdownMenuContent,
DropdownMenuGroup,
DropdownMenuItem,
DropdownMenuLabel,
DropdownMenuRadioGroup,
DropdownMenuRadioItem,
DropdownMenuSeparator,
DropdownMenuShortcut,
DropdownMenuTrigger,
} from '@/components/ui/dropdown-menu'
export default function DropdownMenuBasic() {
const [pinned, setPinned] = useState(true)
const [sort, setSort] = useState('updated')
return (
<DropdownMenu>
<DropdownMenuTrigger render={<Button variant="outline" />}>
Project actions
</DropdownMenuTrigger>
<DropdownMenuContent>
<DropdownMenuItem>
<Pencil aria-hidden="true" />
Rename
<DropdownMenuShortcut>F2</DropdownMenuShortcut>
</DropdownMenuItem>
<DropdownMenuItem>
<Copy aria-hidden="true" />
Duplicate
</DropdownMenuItem>
<DropdownMenuCheckboxItem checked={pinned} onCheckedChange={setPinned}>
Pin to sidebar
</DropdownMenuCheckboxItem>
<DropdownMenuSeparator />
<DropdownMenuGroup>
<DropdownMenuRadioGroup value={sort} onValueChange={setSort}>
<DropdownMenuLabel>Sort files by</DropdownMenuLabel>
<DropdownMenuRadioItem value="name">Name</DropdownMenuRadioItem>
<DropdownMenuRadioItem value="updated">Last updated</DropdownMenuRadioItem>
</DropdownMenuRadioGroup>
</DropdownMenuGroup>
<DropdownMenuSeparator />
<DropdownMenuItem variant="destructive">
<Trash2 aria-hidden="true" />
Delete project
</DropdownMenuItem>
</DropdownMenuContent>
</DropdownMenu>
)
}Props
| Prop | Type | Default | Description |
|---|---|---|---|
| DropdownMenuTrigger.render | ReactElement | — | Style the trigger: render={<Button variant="outline" />}. |
| DropdownMenuItem.variant | 'default' | 'destructive' | 'default' | Destructive items use the destructive color. |
| DropdownMenuItem.onClick | () => void | — | Runs the action and closes the menu. |
| DropdownMenuContent.align | 'start' | 'center' | 'end' | 'start' | Alignment against the trigger. |
Accessibility
| Key | Action |
|---|---|
| Enter / Space | Opens from the trigger |
| Arrow keys | Move between items |
| Type a letter | Jumps to a matching item |
| Arrow Right / Left | Opens / closes a submenu |
| Escape | Closes and returns focus to the trigger |
- Role
- button + menu / menuitem
- You provide
- A trigger with visible text or an aria-label.
- Built in
- Focus moves into the menu on open and returns to the trigger on close.
- Checkbox and radio items expose their checked state.
- WCAG 2.2 criteria
- 2.1.1, 2.4.3, 4.1.2
Don’t
- Put form fields inside a menu (use Popover).
- Hide the only way to do something important in a menu.
Tokens
- color.popover
- color.accent
- color.destructive
- elevation.2
- z.dropdown