DropdownMenu
Displays a list of actions or options triggered by a button.
Usage
import {
DropdownMenu,
DropdownMenuTrigger,
DropdownMenuContent,
DropdownMenuItem,
} from '@acronis-platform/shadcn-uikit';Basic
A simple dropdown menu with action items.
View sourceHide source
import { Button } from '@acronis-platform/shadcn-uikit/react';
import {
DropdownMenu,
DropdownMenuContent,
DropdownMenuItem,
DropdownMenuSeparator,
DropdownMenuTrigger,
} from '@acronis-platform/shadcn-uikit/react';
import { SettingsIcon, UserIcon } from '@acronis-platform/shadcn-uikit';
import { CreditCardIcon, LogOutIcon } from '../icons/missing-icons';
export function DropdownMenuBasic() {
return (
<DropdownMenu>
<DropdownMenuTrigger render={<Button variant="outline" />}>
Open Menu
</DropdownMenuTrigger>
<DropdownMenuContent className="w-56">
<DropdownMenuItem>
<UserIcon className="mr-2 h-4 w-4" />
<span>Profile</span>
</DropdownMenuItem>
<DropdownMenuItem>
<CreditCardIcon className="mr-2 h-4 w-4" />
<span>Billing</span>
</DropdownMenuItem>
<DropdownMenuItem>
<SettingsIcon className="mr-2 h-4 w-4" />
<span>Settings</span>
</DropdownMenuItem>
<DropdownMenuSeparator />
<DropdownMenuItem>
<LogOutIcon className="mr-2 h-4 w-4" />
<span>Log out</span>
</DropdownMenuItem>
</DropdownMenuContent>
</DropdownMenu>
);
}
With labels
Dropdown menu items with label descriptions.
View sourceHide source
import { Button } from '@acronis-platform/shadcn-uikit/react';
import {
DropdownMenu,
DropdownMenuContent,
DropdownMenuItem,
DropdownMenuLabel,
DropdownMenuSeparator,
DropdownMenuTrigger,
DropdownMenuShortcut,
} from '@acronis-platform/shadcn-uikit/react';
import { SettingsIcon, UserIcon } from '@acronis-platform/shadcn-uikit';
import { CreditCardIcon, KeyboardIcon } from '../icons/missing-icons';
export function DropdownMenuWithLabels() {
return (
<DropdownMenu>
<DropdownMenuTrigger render={<Button variant="outline" />}>
Account
</DropdownMenuTrigger>
<DropdownMenuContent className="w-56">
<DropdownMenuLabel>My Account</DropdownMenuLabel>
<DropdownMenuSeparator />
<DropdownMenuItem>
<UserIcon className="mr-2 h-4 w-4" />
<span>Profile</span>
<DropdownMenuShortcut>⇧⌘P</DropdownMenuShortcut>
</DropdownMenuItem>
<DropdownMenuItem>
<CreditCardIcon className="mr-2 h-4 w-4" />
<span>Billing</span>
<DropdownMenuShortcut>⌘B</DropdownMenuShortcut>
</DropdownMenuItem>
<DropdownMenuItem>
<SettingsIcon className="mr-2 h-4 w-4" />
<span>Settings</span>
<DropdownMenuShortcut>⌘S</DropdownMenuShortcut>
</DropdownMenuItem>
<DropdownMenuItem>
<KeyboardIcon className="mr-2 h-4 w-4" />
<span>KeyboardIcon shortcuts</span>
<DropdownMenuShortcut>⌘K</DropdownMenuShortcut>
</DropdownMenuItem>
</DropdownMenuContent>
</DropdownMenu>
);
}
With checkboxes
Menu items with checkbox selection.
View sourceHide source
import { useState } from 'react';
import { Button } from '@acronis-platform/shadcn-uikit/react';
import {
DropdownMenu,
DropdownMenuContent,
DropdownMenuLabel,
DropdownMenuSeparator,
DropdownMenuCheckboxItem,
DropdownMenuTrigger,
} from '@acronis-platform/shadcn-uikit/react';
export function DropdownMenuWithCheckboxes() {
const [showStatusBar, setShowStatusBar] = useState(true);
const [showActivityBar, setShowActivityBar] = useState(false);
const [showPanel, setShowPanel] = useState(false);
return (
<DropdownMenu>
<DropdownMenuTrigger render={<Button variant="outline" />}>
View Options
</DropdownMenuTrigger>
<DropdownMenuContent className="w-56">
<DropdownMenuLabel>Appearance</DropdownMenuLabel>
<DropdownMenuSeparator />
<DropdownMenuCheckboxItem
checked={showStatusBar}
onCheckedChange={setShowStatusBar}
>
Status Bar
</DropdownMenuCheckboxItem>
<DropdownMenuCheckboxItem
checked={showActivityBar}
onCheckedChange={setShowActivityBar}
>
Activity Bar
</DropdownMenuCheckboxItem>
<DropdownMenuCheckboxItem
checked={showPanel}
onCheckedChange={setShowPanel}
>
Panel
</DropdownMenuCheckboxItem>
</DropdownMenuContent>
</DropdownMenu>
);
}
With radio
Menu items with radio button selection for mutually exclusive options.
View sourceHide source
import { useState } from 'react';
import { Button } from '@acronis-platform/shadcn-uikit/react';
import {
DropdownMenu,
DropdownMenuContent,
DropdownMenuLabel,
DropdownMenuSeparator,
DropdownMenuRadioGroup,
DropdownMenuRadioItem,
DropdownMenuTrigger,
} from '@acronis-platform/shadcn-uikit/react';
export function DropdownMenuWithRadio() {
const [position, setPosition] = useState('bottom');
return (
<DropdownMenu>
<DropdownMenuTrigger render={<Button variant="outline" />}>
Position: {position}
</DropdownMenuTrigger>
<DropdownMenuContent className="w-56">
<DropdownMenuLabel>Panel Position</DropdownMenuLabel>
<DropdownMenuSeparator />
<DropdownMenuRadioGroup value={position} onValueChange={setPosition}>
<DropdownMenuRadioItem value="top">Top</DropdownMenuRadioItem>
<DropdownMenuRadioItem value="bottom">Bottom</DropdownMenuRadioItem>
<DropdownMenuRadioItem value="right">Right</DropdownMenuRadioItem>
</DropdownMenuRadioGroup>
</DropdownMenuContent>
</DropdownMenu>
);
}
With submenu
Nested submenus for hierarchical actions.
View sourceHide source
import { Button } from '@acronis-platform/shadcn-uikit/react';
import {
DropdownMenu,
DropdownMenuContent,
DropdownMenuItem,
DropdownMenuSeparator,
DropdownMenuSub,
DropdownMenuSubContent,
DropdownMenuSubTrigger,
DropdownMenuTrigger,
} from '@acronis-platform/shadcn-uikit/react';
import {
CloudIcon,
MailIcon,
MessagesIcon,
} from '@acronis-platform/shadcn-uikit';
import {
ExternalLinkIcon,
LifeBuoyIcon,
PlusCircleIcon,
UserPlusIcon,
} from '../icons/missing-icons';
export function DropdownMenuWithSubmenu() {
return (
<DropdownMenu>
<DropdownMenuTrigger render={<Button variant="outline" />}>
More Actions
</DropdownMenuTrigger>
<DropdownMenuContent className="w-56">
<DropdownMenuItem>
<MailIcon className="mr-2 h-4 w-4" />
<span>Email</span>
</DropdownMenuItem>
<DropdownMenuItem>
<MessagesIcon className="mr-2 h-4 w-4" />
<span>Message</span>
</DropdownMenuItem>
<DropdownMenuSeparator />
<DropdownMenuSub>
<DropdownMenuSubTrigger>
<UserPlusIcon className="mr-2 h-4 w-4" />
<span>Invite users</span>
</DropdownMenuSubTrigger>
<DropdownMenuSubContent>
<DropdownMenuItem>
<MailIcon className="mr-2 h-4 w-4" />
<span>Email</span>
</DropdownMenuItem>
<DropdownMenuItem>
<MessagesIcon className="mr-2 h-4 w-4" />
<span>Message</span>
</DropdownMenuItem>
<DropdownMenuSeparator />
<DropdownMenuItem>
<PlusCircleIcon className="mr-2 h-4 w-4" />
<span>More...</span>
</DropdownMenuItem>
</DropdownMenuSubContent>
</DropdownMenuSub>
<DropdownMenuSeparator />
<DropdownMenuItem>
<ExternalLinkIcon className="mr-2 h-4 w-4" />
<span>GitHub</span>
</DropdownMenuItem>
<DropdownMenuItem>
<LifeBuoyIcon className="mr-2 h-4 w-4" />
<span>Support</span>
</DropdownMenuItem>
<DropdownMenuItem disabled>
<CloudIcon className="mr-2 h-4 w-4" />
<span>API</span>
</DropdownMenuItem>
</DropdownMenuContent>
</DropdownMenu>
);
}
Variants
Different visual variants of the dropdown menu.
View sourceHide source
import { Button } from '@acronis-platform/shadcn-uikit/react';
import {
DropdownMenu,
DropdownMenuContent,
DropdownMenuItem,
DropdownMenuSeparator,
DropdownMenuTrigger,
} from '@acronis-platform/shadcn-uikit/react';
export function DropdownMenuVariants() {
return (
<div className="flex gap-4 flex-wrap">
<DropdownMenu>
<DropdownMenuTrigger render={<Button variant="default" />}>
Default
</DropdownMenuTrigger>
<DropdownMenuContent>
<DropdownMenuItem>Profile</DropdownMenuItem>
<DropdownMenuItem>Settings</DropdownMenuItem>
<DropdownMenuSeparator />
<DropdownMenuItem>Logout</DropdownMenuItem>
</DropdownMenuContent>
</DropdownMenu>
<DropdownMenu>
<DropdownMenuTrigger render={<Button variant="secondary" />}>
Secondary
</DropdownMenuTrigger>
<DropdownMenuContent>
<DropdownMenuItem>Profile</DropdownMenuItem>
<DropdownMenuItem>Settings</DropdownMenuItem>
<DropdownMenuSeparator />
<DropdownMenuItem>Logout</DropdownMenuItem>
</DropdownMenuContent>
</DropdownMenu>
<DropdownMenu>
<DropdownMenuTrigger render={<Button variant="outline" />}>
Outline
</DropdownMenuTrigger>
<DropdownMenuContent>
<DropdownMenuItem>Profile</DropdownMenuItem>
<DropdownMenuItem>Settings</DropdownMenuItem>
<DropdownMenuSeparator />
<DropdownMenuItem>Logout</DropdownMenuItem>
</DropdownMenuContent>
</DropdownMenu>
</div>
);
}
With search
A dropdown menu with a search input for filtering items.
View sourceHide source
import { useState } from 'react';
import { Button, Input } from '@acronis-platform/shadcn-uikit/react';
import {
DropdownMenu,
DropdownMenuContent,
DropdownMenuItem,
DropdownMenuSeparator,
DropdownMenuTrigger,
} from '@acronis-platform/shadcn-uikit/react';
import { ChevronDownIcon, SearchIcon } from '@acronis-platform/shadcn-uikit';
export function DropdownMenuWithSearch() {
const [searchQuery, setSearchQuery] = useState('');
const menuItems = [
'First value',
'Second value',
'Third value',
'Fourth value',
'Fifth value',
'Sixth value',
'Seventh value',
'Eighth value',
];
const filteredItems = menuItems.filter((item) =>
item.toLowerCase().includes(searchQuery.toLowerCase())
);
return (
<DropdownMenu>
<DropdownMenuTrigger render={<Button variant="outline" />}>
Select Value
<ChevronDownIcon className="ml-2 h-4 w-4" />
</DropdownMenuTrigger>
<DropdownMenuContent className="w-56">
<div className="px-2 py-2">
<div className="relative">
<SearchIcon className="absolute left-2 top-2.5 h-4 w-4 text-muted-foreground" />
<Input
placeholder="Search..."
value={searchQuery}
onChange={(e) => setSearchQuery(e.target.value)}
className="pl-8"
/>
</div>
</div>
<DropdownMenuSeparator />
{filteredItems.length > 0 ? (
filteredItems.map((item) => (
<DropdownMenuItem key={item}>
<span>{item}</span>
</DropdownMenuItem>
))
) : (
<div className="px-2 py-6 text-center text-sm text-muted-foreground">
No results found
</div>
)}
</DropdownMenuContent>
</DropdownMenu>
);
}
With icons
Menu items with leading icons.
View sourceHide source
import { Button } from '@acronis-platform/shadcn-uikit/react';
import {
DropdownMenu,
DropdownMenuContent,
DropdownMenuItem,
DropdownMenuSeparator,
DropdownMenuTrigger,
} from '@acronis-platform/shadcn-uikit/react';
import {
CopyIcon,
DownloadIcon,
EditIcon,
TrashOIcon,
} from '@acronis-platform/shadcn-uikit';
import { MoreVerticalIcon } from '../icons/missing-icons';
export function DropdownMenuWithIcons() {
return (
<DropdownMenu>
<DropdownMenuTrigger render={<Button variant="outline" size="icon" />}>
<MoreVerticalIcon className="h-4 w-4" />
</DropdownMenuTrigger>
<DropdownMenuContent align="end" className="w-48">
<DropdownMenuItem>
<EditIcon className="mr-2 h-4 w-4" />
<span>Edit</span>
</DropdownMenuItem>
<DropdownMenuItem>
<CopyIcon className="mr-2 h-4 w-4" />
<span>Duplicate</span>
</DropdownMenuItem>
<DropdownMenuItem>
<DownloadIcon className="mr-2 h-4 w-4" />
<span>Download</span>
</DropdownMenuItem>
<DropdownMenuSeparator />
<DropdownMenuItem className="text-destructive">
<TrashOIcon className="mr-2 h-4 w-4" />
<span>Delete</span>
</DropdownMenuItem>
</DropdownMenuContent>
</DropdownMenu>
);
}
Multiple sections
Menu items organized into labeled sections.
View sourceHide source
import { Button } from '@acronis-platform/shadcn-uikit/react';
import {
DropdownMenu,
DropdownMenuContent,
DropdownMenuItem,
DropdownMenuLabel,
DropdownMenuSeparator,
DropdownMenuTrigger,
} from '@acronis-platform/shadcn-uikit/react';
import {
MailIcon,
MessagesIcon,
SettingsIcon,
} from '@acronis-platform/shadcn-uikit';
import { KeyboardIcon } from '../icons/missing-icons';
export function DropdownMenuMultipleSections() {
return (
<DropdownMenu>
<DropdownMenuTrigger render={<Button variant="outline" />}>
Options
</DropdownMenuTrigger>
<DropdownMenuContent className="w-56">
<DropdownMenuLabel>Actions</DropdownMenuLabel>
<DropdownMenuSeparator />
<DropdownMenuItem>
<MailIcon className="mr-2 h-4 w-4" />
<span>Send Email</span>
</DropdownMenuItem>
<DropdownMenuItem>
<MessagesIcon className="mr-2 h-4 w-4" />
<span>Send Message</span>
</DropdownMenuItem>
<DropdownMenuSeparator />
<DropdownMenuLabel>Settings</DropdownMenuLabel>
<DropdownMenuSeparator />
<DropdownMenuItem>
<SettingsIcon className="mr-2 h-4 w-4" />
<span>Preferences</span>
</DropdownMenuItem>
<DropdownMenuItem>
<KeyboardIcon className="mr-2 h-4 w-4" />
<span>Shortcuts</span>
</DropdownMenuItem>
</DropdownMenuContent>
</DropdownMenu>
);
}
Disabled state
Menu items that are disabled and cannot be selected.
View sourceHide source
import { Button } from '@acronis-platform/shadcn-uikit/react';
import {
DropdownMenu,
DropdownMenuContent,
DropdownMenuItem,
DropdownMenuSeparator,
DropdownMenuTrigger,
} from '@acronis-platform/shadcn-uikit/react';
import {
CloudIcon,
MailIcon,
SettingsIcon,
UserIcon,
} from '@acronis-platform/shadcn-uikit';
export function DropdownMenuDisabled() {
return (
<DropdownMenu>
<DropdownMenuTrigger render={<Button variant="outline" />}>
Actions
</DropdownMenuTrigger>
<DropdownMenuContent className="w-56">
<DropdownMenuItem>
<UserIcon className="mr-2 h-4 w-4" />
<span>View Profile</span>
</DropdownMenuItem>
<DropdownMenuItem disabled>
<SettingsIcon className="mr-2 h-4 w-4" />
<span>Settings (Coming Soon)</span>
</DropdownMenuItem>
<DropdownMenuItem>
<MailIcon className="mr-2 h-4 w-4" />
<span>Contact</span>
</DropdownMenuItem>
<DropdownMenuSeparator />
<DropdownMenuItem disabled>
<CloudIcon className="mr-2 h-4 w-4" />
<span>Cloud Storage (Unavailable)</span>
</DropdownMenuItem>
</DropdownMenuContent>
</DropdownMenu>
);
}
Alignments
Different alignment options for the dropdown menu popover.
View sourceHide source
import { Button } from '@acronis-platform/shadcn-uikit/react';
import {
DropdownMenu,
DropdownMenuContent,
DropdownMenuItem,
DropdownMenuTrigger,
} from '@acronis-platform/shadcn-uikit/react';
export function DropdownMenuAlignments() {
return (
<div className="flex gap-4 flex-wrap">
<DropdownMenu>
<DropdownMenuTrigger render={<Button variant="outline" />}>
Align Start
</DropdownMenuTrigger>
<DropdownMenuContent align="start">
<DropdownMenuItem>Profile</DropdownMenuItem>
<DropdownMenuItem>Settings</DropdownMenuItem>
<DropdownMenuItem>Logout</DropdownMenuItem>
</DropdownMenuContent>
</DropdownMenu>
<DropdownMenu>
<DropdownMenuTrigger render={<Button variant="outline" />}>
Align Center
</DropdownMenuTrigger>
<DropdownMenuContent align="center">
<DropdownMenuItem>Profile</DropdownMenuItem>
<DropdownMenuItem>Settings</DropdownMenuItem>
<DropdownMenuItem>Logout</DropdownMenuItem>
</DropdownMenuContent>
</DropdownMenu>
<DropdownMenu>
<DropdownMenuTrigger render={<Button variant="outline" />}>
Align End
</DropdownMenuTrigger>
<DropdownMenuContent align="end">
<DropdownMenuItem>Profile</DropdownMenuItem>
<DropdownMenuItem>Settings</DropdownMenuItem>
<DropdownMenuItem>Logout</DropdownMenuItem>
</DropdownMenuContent>
</DropdownMenu>
</div>
);
}
Complex
A full-featured dropdown menu combining multiple patterns.
View sourceHide source
import { useState } from 'react';
import { Button } from '@acronis-platform/shadcn-uikit/react';
import {
DropdownMenu,
DropdownMenuContent,
DropdownMenuItem,
DropdownMenuLabel,
DropdownMenuSeparator,
DropdownMenuCheckboxItem,
DropdownMenuSub,
DropdownMenuSubContent,
DropdownMenuSubTrigger,
DropdownMenuTrigger,
DropdownMenuShortcut,
} from '@acronis-platform/shadcn-uikit/react';
import {
ChevronDownIcon,
CloudIcon,
MailIcon,
MessagesIcon,
UserIcon,
} from '@acronis-platform/shadcn-uikit';
import {
CreditCardIcon,
ExternalLinkIcon,
LifeBuoyIcon,
LogOutIcon,
PlusCircleIcon,
UserPlusIcon,
} from '../icons/missing-icons';
export function DropdownMenuComplex() {
const [showStatusBar, setShowStatusBar] = useState(true);
const [showActivityBar, setShowActivityBar] = useState(false);
return (
<DropdownMenu>
<DropdownMenuTrigger render={<Button variant="outline" />}>
Advanced Menu
<ChevronDownIcon className="ml-2 h-4 w-4" />
</DropdownMenuTrigger>
<DropdownMenuContent className="w-64">
<DropdownMenuLabel>My Account</DropdownMenuLabel>
<DropdownMenuSeparator />
<DropdownMenuItem>
<UserIcon className="mr-2 h-4 w-4" />
<span>Profile</span>
<DropdownMenuShortcut>⇧⌘P</DropdownMenuShortcut>
</DropdownMenuItem>
<DropdownMenuItem>
<CreditCardIcon className="mr-2 h-4 w-4" />
<span>Billing</span>
<DropdownMenuShortcut>⌘B</DropdownMenuShortcut>
</DropdownMenuItem>
<DropdownMenuSeparator />
<DropdownMenuLabel>Preferences</DropdownMenuLabel>
<DropdownMenuSeparator />
<DropdownMenuCheckboxItem
checked={showStatusBar}
onCheckedChange={setShowStatusBar}
>
<span>Status Bar</span>
</DropdownMenuCheckboxItem>
<DropdownMenuCheckboxItem
checked={showActivityBar}
onCheckedChange={setShowActivityBar}
>
<span>Activity Bar</span>
</DropdownMenuCheckboxItem>
<DropdownMenuSeparator />
<DropdownMenuSub>
<DropdownMenuSubTrigger>
<UserPlusIcon className="mr-2 h-4 w-4" />
<span>Invite Team</span>
</DropdownMenuSubTrigger>
<DropdownMenuSubContent>
<DropdownMenuItem>
<MailIcon className="mr-2 h-4 w-4" />
<span>By Email</span>
</DropdownMenuItem>
<DropdownMenuItem>
<MessagesIcon className="mr-2 h-4 w-4" />
<span>By Message</span>
</DropdownMenuItem>
<DropdownMenuItem>
<PlusCircleIcon className="mr-2 h-4 w-4" />
<span>More Options</span>
</DropdownMenuItem>
</DropdownMenuSubContent>
</DropdownMenuSub>
<DropdownMenuSeparator />
<DropdownMenuItem>
<ExternalLinkIcon className="mr-2 h-4 w-4" />
<span>GitHub</span>
</DropdownMenuItem>
<DropdownMenuItem>
<LifeBuoyIcon className="mr-2 h-4 w-4" />
<span>Support</span>
</DropdownMenuItem>
<DropdownMenuItem disabled>
<CloudIcon className="mr-2 h-4 w-4" />
<span>API (Coming Soon)</span>
</DropdownMenuItem>
<DropdownMenuSeparator />
<DropdownMenuItem>
<LogOutIcon className="mr-2 h-4 w-4" />
<span>Log out</span>
<DropdownMenuShortcut>⇧⌘Q</DropdownMenuShortcut>
</DropdownMenuItem>
</DropdownMenuContent>
</DropdownMenu>
);
}
API Reference
DropdownMenuContent
DropdownMenuItem
DropdownMenuSubTrigger and DropdownMenuLabel also accept an inset boolean for left padding. DropdownMenuCheckboxItem and DropdownMenuRadioItem extend their respective Base UI primitive props.