Components
A versatile dropdown menu component for displaying contextual actions and options
Components
A versatile dropdown menu component for displaying contextual actions and options
A versatile dropdown menu component built on Radix UI. Perfect for action menus, context menus, and option selectors.
When to Use
Use dropdown menus to provide a list of actions or options in a compact space. They're ideal for row actions in tables, toolbar menus, and settings panels.
Basic dropdown with menu items
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button variant="secondary">Options</Button>
</DropdownMenuTrigger>
<DropdownMenuContent>
<DropdownMenuItem>Profile</DropdownMenuItem>
<DropdownMenuItem>Settings</DropdownMenuItem>
<DropdownMenuSeparator />
<DropdownMenuItem>Logout</DropdownMenuItem>
</DropdownMenuContent>
</DropdownMenu>Menu items with leading icons and a destructive variant
<DropdownMenu>
<DropdownMenuTrigger asChild>
<IconButton variant="ghost" size="sm" icon={<MdMoreHoriz />} aria-label="Row actions" />
</DropdownMenuTrigger>
<DropdownMenuContent className="w-48">
<DropdownMenuItem>
<MdEdit />
Edit
</DropdownMenuItem>
<DropdownMenuItem>
<MdShare />
Share
</DropdownMenuItem>
<DropdownMenuItem>
<MdDownload />
Download
</DropdownMenuItem>
<DropdownMenuSeparator />
<DropdownMenuItem variant="destructive">
<MdDelete />
Delete
</DropdownMenuItem>
</DropdownMenuContent>
</DropdownMenu>Group menu items with labels and separators
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button variant="secondary">View Options</Button>
</DropdownMenuTrigger>
<DropdownMenuContent className="w-48">
<DropdownMenuLabel>Display</DropdownMenuLabel>
<DropdownMenuItem>Grid View</DropdownMenuItem>
<DropdownMenuItem>List View</DropdownMenuItem>
<DropdownMenuSeparator />
<DropdownMenuLabel>Sort By</DropdownMenuLabel>
<DropdownMenuItem>Name</DropdownMenuItem>
<DropdownMenuItem>Date</DropdownMenuItem>
<DropdownMenuItem>Size</DropdownMenuItem>
</DropdownMenuContent>
</DropdownMenu>Display keyboard shortcuts alongside menu items
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button variant="secondary">Edit</Button>
</DropdownMenuTrigger>
<DropdownMenuContent className="w-48">
<DropdownMenuItem>
Copy
<DropdownMenuShortcut>Cmd+C</DropdownMenuShortcut>
</DropdownMenuItem>
<DropdownMenuItem>
Paste
<DropdownMenuShortcut>Cmd+V</DropdownMenuShortcut>
</DropdownMenuItem>
<DropdownMenuItem>
Cut
<DropdownMenuShortcut>Cmd+X</DropdownMenuShortcut>
</DropdownMenuItem>
<DropdownMenuSeparator />
<DropdownMenuItem>
Select All
<DropdownMenuShortcut>Cmd+A</DropdownMenuShortcut>
</DropdownMenuItem>
</DropdownMenuContent>
</DropdownMenu>Checkbox items for toggling multiple options
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button variant="secondary">Preferences</Button>
</DropdownMenuTrigger>
<DropdownMenuContent className="w-48">
<DropdownMenuLabel>Notifications</DropdownMenuLabel>
<DropdownMenuCheckboxItem checked={notifications} onCheckedChange={setNotifications}>
Push Notifications
</DropdownMenuCheckboxItem>
<DropdownMenuCheckboxItem checked={emails} onCheckedChange={setEmails}>
Email Notifications
</DropdownMenuCheckboxItem>
<DropdownMenuCheckboxItem checked={updates} onCheckedChange={setUpdates}>
Product Updates
</DropdownMenuCheckboxItem>
</DropdownMenuContent>
</DropdownMenu>Radio items for exclusive selection
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button variant="secondary">Position</Button>
</DropdownMenuTrigger>
<DropdownMenuContent className="w-48">
<DropdownMenuLabel>Panel Position</DropdownMenuLabel>
<DropdownMenuRadioGroup value={position} onValueChange={setPosition}>
<DropdownMenuRadioItem value="top">Top</DropdownMenuRadioItem>
<DropdownMenuRadioItem value="bottom">Bottom</DropdownMenuRadioItem>
<DropdownMenuRadioItem value="left">Left</DropdownMenuRadioItem>
<DropdownMenuRadioItem value="right">Right</DropdownMenuRadioItem>
</DropdownMenuRadioGroup>
</DropdownMenuContent>
</DropdownMenu>Sub-menus for organizing related actions
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button variant="secondary">Actions</Button>
</DropdownMenuTrigger>
<DropdownMenuContent className="w-48">
<DropdownMenuItem>
<MdEdit />
Edit
</DropdownMenuItem>
<DropdownMenuItem>
<MdContentCopy />
Duplicate
</DropdownMenuItem>
<DropdownMenuSeparator />
<DropdownMenuSub>
<DropdownMenuSubTrigger>
<MdShare />
Share
</DropdownMenuSubTrigger>
<DropdownMenuSubContent>
<DropdownMenuItem>Email</DropdownMenuItem>
<DropdownMenuItem>Slack</DropdownMenuItem>
<DropdownMenuItem>Copy Link</DropdownMenuItem>
</DropdownMenuSubContent>
</DropdownMenuSub>
<DropdownMenuSub>
<DropdownMenuSubTrigger>
<MdOutlineArchive />
Move to
</DropdownMenuSubTrigger>
<DropdownMenuSubContent>
<DropdownMenuItem>Archive</DropdownMenuItem>
<DropdownMenuItem>Drafts</DropdownMenuItem>
<DropdownMenuItem>Trash</DropdownMenuItem>
</DropdownMenuSubContent>
</DropdownMenuSub>
<DropdownMenuSeparator />
<DropdownMenuItem variant="destructive">
<MdDelete />
Delete
</DropdownMenuItem>
</DropdownMenuContent>
</DropdownMenu>Disable specific menu options
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button variant="secondary">File</Button>
</DropdownMenuTrigger>
<DropdownMenuContent className="w-48">
<DropdownMenuItem>New File</DropdownMenuItem>
<DropdownMenuItem>Open</DropdownMenuItem>
<DropdownMenuItem disabled>Save (No changes)</DropdownMenuItem>
<DropdownMenuSeparator />
<DropdownMenuItem>Export</DropdownMenuItem>
</DropdownMenuContent>
</DropdownMenu>Common pattern for table row actions with icon trigger
<DropdownMenu>
<DropdownMenuTrigger asChild>
<IconButton variant="ghost" size="sm" icon={<MdMoreHoriz />} aria-label="Row actions" />
</DropdownMenuTrigger>
<DropdownMenuContent align="end" className="w-48">
<DropdownMenuItem onSelect={() => {}}>
<MdOpenInNew />
View Details
</DropdownMenuItem>
<DropdownMenuItem onSelect={() => {}}>
<MdEdit />
Edit
</DropdownMenuItem>
<DropdownMenuItem onSelect={() => {}}>
<MdContentCopy />
Duplicate
</DropdownMenuItem>
<DropdownMenuSeparator />
<DropdownMenuItem variant="destructive" onSelect={() => {}}>
<MdDelete />
Delete
</DropdownMenuItem>
</DropdownMenuContent>
</DropdownMenu>Full-featured account menu with groups, sub-menus, and shortcuts
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button variant="secondary" leftIcon={<MdOutlinePerson />}>
My Account
</Button>
</DropdownMenuTrigger>
<DropdownMenuContent className="w-56">
<DropdownMenuLabel>
<div className="flex flex-col gap-0.5 px-3 py-1">
<span className="text-sm font-medium text-ink">John Doe</span>
<span className="text-xs text-ink-light font-normal">john@example.com</span>
</div>
</DropdownMenuLabel>
<DropdownMenuSeparator />
<DropdownMenuGroup>
<DropdownMenuItem>
<MdOutlinePerson />
Profile
<DropdownMenuShortcut>Cmd+P</DropdownMenuShortcut>
</DropdownMenuItem>
<DropdownMenuItem>
<MdOutlineCreditCard />
Billing
</DropdownMenuItem>
<DropdownMenuItem>
<MdOutlineSettings />
Settings
<DropdownMenuShortcut>Cmd+,</DropdownMenuShortcut>
</DropdownMenuItem>
</DropdownMenuGroup>
<DropdownMenuSeparator />
<DropdownMenuItem>
<MdOutlineGroup />
Team
</DropdownMenuItem>
<DropdownMenuSub>
<DropdownMenuSubTrigger>
<MdOutlinePerson />
Invite Users
</DropdownMenuSubTrigger>
<DropdownMenuSubContent>
<DropdownMenuItem>Email</DropdownMenuItem>
<DropdownMenuItem>Slack</DropdownMenuItem>
<DropdownMenuSeparator />
<DropdownMenuItem>Copy Invite Link</DropdownMenuItem>
</DropdownMenuSubContent>
</DropdownMenuSub>
<DropdownMenuSeparator />
<DropdownMenuItem>
<MdOutlineLogout />
Log out
<DropdownMenuShortcut>Cmd+Q</DropdownMenuShortcut>
</DropdownMenuItem>
</DropdownMenuContent>
</DropdownMenu>Use separators to group related menu items logically. This improves scannability.
Menu item labels should be clear and action-oriented. Use verbs like "Edit", "Delete", "Download".
Put destructive actions (like Delete) at the bottom of the menu, separated by a divider.
Keep dropdown menus to 5-8 items. For more options, consider using nested menus or a different pattern.
Dropdown menus are for actions, not primary navigation. Use proper navigation components for that.
Primary actions should be visible as buttons. Use dropdowns for secondary or overflow actions.
| Prop | Type | Default | Description |
|---|---|---|---|
variant | 'default' | 'destructive' | 'default' | Visual style variant |
inset | boolean | - | Add left padding to align with items that have icons |
disabled | boolean | - | Disable the menu item |
onSelect | (event: Event) => void | - | Called when the item is selected |
className | string | - | Additional className |
| Prop | Type | Default | Description |
|---|---|---|---|
checked | boolean | - | Whether the checkbox is checked |
onCheckedChange | (checked: boolean) => void | - | Called when checked state changes |
disabled | boolean | - | Disable the checkbox item |
| Prop | Type | Default | Description |
|---|---|---|---|
value | string | - | The currently selected value |
onValueChange | (value: string) => void | - | Called when selection changes |
| Prop | Type | Default | Description |
|---|---|---|---|
align | 'start' | 'center' | 'end' | 'center' | Alignment relative to trigger |
side | 'top' | 'bottom' | 'left' | 'right' | 'bottom' | Preferred side to render |
sideOffset | number | 4 | Distance from trigger in pixels |
className | string | - | Additional className |
Keyboard Navigation
Dropdown menus support full keyboard navigation. Use Arrow keys to navigate items, Enter to select, and Escape to close.