Dropdown Menu
Displays a menu of actions — opened by a trigger button.
import { Button } from '@/components/ui/button';
import {
DropdownMenu,
DropdownMenuContent,
DropdownMenuGroup,
DropdownMenuItem,
DropdownMenuLabel,
DropdownMenuSeparator,
DropdownMenuTrigger,
} from '@/components/ui/dropdown-menu';
export default function DropdownMenuDemo() {
return (
<DropdownMenu>
<DropdownMenuTrigger render={<Button variant="outline" />}>
Open menu
</DropdownMenuTrigger>
<DropdownMenuContent>
<DropdownMenuGroup>
<DropdownMenuLabel>My account</DropdownMenuLabel>
<DropdownMenuItem>Profile</DropdownMenuItem>
<DropdownMenuItem>Billing</DropdownMenuItem>
<DropdownMenuItem>Settings</DropdownMenuItem>
</DropdownMenuGroup>
<DropdownMenuSeparator />
<DropdownMenuItem>Log out</DropdownMenuItem>
</DropdownMenuContent>
</DropdownMenu>
);
}
Install
npx shadcn@latest add @madeui/dropdown-menu
Usage
import {
DropdownMenu,
DropdownMenuContent,
DropdownMenuGroup,
DropdownMenuItem,
DropdownMenuLabel,
DropdownMenuSeparator,
DropdownMenuTrigger,
} from '@/components/ui/dropdown-menu';
Composition
<DropdownMenu>
<DropdownMenuTrigger />
<DropdownMenuContent>
<DropdownMenuGroup>
<DropdownMenuLabel />
<DropdownMenuItem />
</DropdownMenuGroup>
<DropdownMenuSeparator />
</DropdownMenuContent>
</DropdownMenu>
Disabled item
import { Button } from '@/components/ui/button';
import {
DropdownMenu,
DropdownMenuContent,
DropdownMenuGroup,
DropdownMenuItem,
DropdownMenuTrigger,
} from '@/components/ui/dropdown-menu';
export default function DropdownMenuDisabledItem() {
return (
<DropdownMenu>
<DropdownMenuTrigger render={<Button variant="outline" />}>
Actions
</DropdownMenuTrigger>
<DropdownMenuContent>
<DropdownMenuGroup>
<DropdownMenuItem>Duplicate</DropdownMenuItem>
<DropdownMenuItem disabled>Archive (coming soon)</DropdownMenuItem>
<DropdownMenuItem>Delete</DropdownMenuItem>
</DropdownMenuGroup>
</DropdownMenuContent>
</DropdownMenu>
);
}
Checkbox and radio items
import { Button } from '@/components/ui/button';
import {
DropdownMenu,
DropdownMenuCheckboxItem,
DropdownMenuContent,
DropdownMenuGroup,
DropdownMenuLabel,
DropdownMenuRadioGroup,
DropdownMenuRadioItem,
DropdownMenuSeparator,
DropdownMenuTrigger,
} from '@/components/ui/dropdown-menu';
export default function DropdownMenuCheckboxes() {
return (
<DropdownMenu>
<DropdownMenuTrigger render={<Button variant="outline" />}>
View options
</DropdownMenuTrigger>
<DropdownMenuContent>
{/* Menu labels are Base UI GroupLabels — they must live inside a
Group or RadioGroup. */}
<DropdownMenuGroup>
<DropdownMenuLabel>Appearance</DropdownMenuLabel>
<DropdownMenuCheckboxItem defaultChecked>
Status bar
</DropdownMenuCheckboxItem>
<DropdownMenuCheckboxItem>Activity bar</DropdownMenuCheckboxItem>
</DropdownMenuGroup>
<DropdownMenuSeparator />
<DropdownMenuRadioGroup defaultValue="bottom">
<DropdownMenuLabel>Panel position</DropdownMenuLabel>
<DropdownMenuRadioItem value="top">Top</DropdownMenuRadioItem>
<DropdownMenuRadioItem value="bottom">Bottom</DropdownMenuRadioItem>
</DropdownMenuRadioGroup>
</DropdownMenuContent>
</DropdownMenu>
);
}
Radio group
import { Button } from '@/components/ui/button';
import {
DropdownMenu,
DropdownMenuContent,
DropdownMenuLabel,
DropdownMenuRadioGroup,
DropdownMenuRadioItem,
DropdownMenuSeparator,
DropdownMenuTrigger,
} from '@/components/ui/dropdown-menu';
export default function DropdownMenuRadioGroupExample() {
return (
<DropdownMenu>
<DropdownMenuTrigger render={<Button variant="outline" />}>
Text size
</DropdownMenuTrigger>
<DropdownMenuContent>
{/* Menu labels are Base UI GroupLabels — they must live inside a
Group or RadioGroup. */}
<DropdownMenuRadioGroup defaultValue="md">
<DropdownMenuLabel>Font size</DropdownMenuLabel>
<DropdownMenuSeparator />
<DropdownMenuRadioItem value="sm">Small</DropdownMenuRadioItem>
<DropdownMenuRadioItem value="md">Medium</DropdownMenuRadioItem>
<DropdownMenuRadioItem value="lg">Large</DropdownMenuRadioItem>
</DropdownMenuRadioGroup>
</DropdownMenuContent>
</DropdownMenu>
);
}
Shortcuts
import { Button } from '@/components/ui/button';
import {
DropdownMenu,
DropdownMenuContent,
DropdownMenuItem,
DropdownMenuSeparator,
DropdownMenuShortcut,
DropdownMenuTrigger,
} from '@/components/ui/dropdown-menu';
export default function DropdownMenuShortcuts() {
return (
<DropdownMenu>
<DropdownMenuTrigger render={<Button variant="outline" />}>
Edit
</DropdownMenuTrigger>
<DropdownMenuContent>
<DropdownMenuItem>
Cut
<DropdownMenuShortcut>⌘X</DropdownMenuShortcut>
</DropdownMenuItem>
<DropdownMenuItem>
Copy
<DropdownMenuShortcut>⌘C</DropdownMenuShortcut>
</DropdownMenuItem>
<DropdownMenuItem>
Paste
<DropdownMenuShortcut>⌘V</DropdownMenuShortcut>
</DropdownMenuItem>
<DropdownMenuSeparator />
<DropdownMenuItem>
Select all
<DropdownMenuShortcut>⌘A</DropdownMenuShortcut>
</DropdownMenuItem>
</DropdownMenuContent>
</DropdownMenu>
);
}
Destructive item
import { Button } from '@/components/ui/button';
import {
DropdownMenu,
DropdownMenuContent,
DropdownMenuItem,
DropdownMenuSeparator,
DropdownMenuTrigger,
} from '@/components/ui/dropdown-menu';
export default function DropdownMenuDestructive() {
return (
<DropdownMenu>
<DropdownMenuTrigger render={<Button variant="outline" />}>
Post options
</DropdownMenuTrigger>
<DropdownMenuContent>
<DropdownMenuItem>Edit</DropdownMenuItem>
<DropdownMenuItem>Duplicate</DropdownMenuItem>
<DropdownMenuSeparator />
<DropdownMenuItem variant="destructive">Delete</DropdownMenuItem>
</DropdownMenuContent>
</DropdownMenu>
);
}
Submenu, shortcuts, destructive
import { Button } from '@/components/ui/button';
import {
DropdownMenu,
DropdownMenuContent,
DropdownMenuItem,
DropdownMenuSeparator,
DropdownMenuShortcut,
DropdownMenuSub,
DropdownMenuSubContent,
DropdownMenuSubTrigger,
DropdownMenuTrigger,
} from '@/components/ui/dropdown-menu';
export default function DropdownMenuSubmenu() {
return (
<DropdownMenu>
<DropdownMenuTrigger render={<Button variant="outline" />}>
Actions
</DropdownMenuTrigger>
<DropdownMenuContent>
<DropdownMenuItem>
New file
<DropdownMenuShortcut>⌘N</DropdownMenuShortcut>
</DropdownMenuItem>
<DropdownMenuSub>
<DropdownMenuSubTrigger>Share</DropdownMenuSubTrigger>
<DropdownMenuSubContent>
<DropdownMenuItem>Email link</DropdownMenuItem>
<DropdownMenuItem>Copy link</DropdownMenuItem>
</DropdownMenuSubContent>
</DropdownMenuSub>
<DropdownMenuSeparator />
<DropdownMenuItem variant="destructive">
Delete
<DropdownMenuShortcut>⌘⌫</DropdownMenuShortcut>
</DropdownMenuItem>
</DropdownMenuContent>
</DropdownMenu>
);
}
API reference
Built on Base UI Menu. The tables below cover the props this library adds or changes — every other prop is forwarded to the underlying Base UI part; see the Base UI Menu API reference for the full list.
DropdownMenuContent
| Prop | Type | Default | Description |
|---|---|---|---|
side |
'top' | 'right' | 'bottom' | 'left' |
'bottom' |
|
sideOffset |
number |
4 |
|
align |
'start' | 'center' | 'end' |
'start' |
|
alignOffset |
number |
0 |
|
style |
StyleXStyles |
— | StyleX styles merged last — always win over the component’s own styles. |
DropdownMenuItem
| Prop | Type | Default | Description |
|---|---|---|---|
disabled |
boolean |
false |
|
variant |
'default' | 'destructive' |
'default' |
|
inset |
boolean |
— | Indents to align with checkbox/radio item labels. |
onClick |
(event) => void |
— | Action to run when the item is selected. |
style |
StyleXStyles |
— | StyleX styles merged last — always win over the component’s own styles. |
DropdownMenuCheckboxItem / DropdownMenuRadioItem
Base UI checkbox/radio menu items with a trailing check indicator. DropdownMenuRadioItems go inside a DropdownMenuRadioGroup (value / defaultValue / onValueChange).
DropdownMenuSubContent
Same props as DropdownMenuContent; sizes to its content (defaults sideOffset={0}, alignOffset={-4}).
Styling
DropdownMenuSeparator, DropdownMenuLabel (supports inset), and DropdownMenuShortcut accept style (StyleXStyles, merged last so caller overrides always win) plus all native props of the element they render.
DropdownMenu (Root), DropdownMenuTrigger, DropdownMenuGroup, DropdownMenuPortal, DropdownMenuSub, and DropdownMenuRadioGroup are Base UI parts re-exported unstyled. Keep items inside a DropdownMenuGroup; Trigger accepts render.