Skip to content

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-menu

Or 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

Dropdown Menu props
PropTypeDefaultDescription
DropdownMenuTrigger.renderReactElement—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

Keyboard
KeyAction
Enter / SpaceOpens from the trigger
Arrow keysMove between items
Type a letterJumps to a matching item
Arrow Right / LeftOpens / closes a submenu
EscapeCloses 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