Overlay
dropdown-menu
Same API as upstream: shadcn/ui docs
$
npx shadcn@latest add @preactcn/dropdown-menuBasic
Basic
DropdownMenuBasic
function DropdownMenuBasic() {
return (
<Example title="Basic">
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button variant="outline" className="w-fit">
Open
</Button>
</DropdownMenuTrigger>
<DropdownMenuContent>
<DropdownMenuGroup>
<DropdownMenuLabel>My Account</DropdownMenuLabel>
<DropdownMenuItem>Profile</DropdownMenuItem>
<DropdownMenuItem>Billing</DropdownMenuItem>
<DropdownMenuItem>Settings</DropdownMenuItem>
</DropdownMenuGroup>
<DropdownMenuSeparator />
<DropdownMenuGroup>
<DropdownMenuItem>GitHub</DropdownMenuItem>
<DropdownMenuItem disabled>API</DropdownMenuItem>
<DropdownMenuItem>Support</DropdownMenuItem>
</DropdownMenuGroup>
</DropdownMenuContent>
</DropdownMenu>
</Example>
)
}Complex
Complex
DropdownMenuComplex
function DropdownMenuComplex() {
const [showSidebar, setShowSidebar] = useState(true)
const [showStatusBar, setShowStatusBar] = useState(false)
return (
<Example title="Complex">
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button variant="outline" className="w-fit">
Complex Menu
</Button>
</DropdownMenuTrigger>
<DropdownMenuContent className="w-56">
<DropdownMenuGroup>
<DropdownMenuLabel>My Account</DropdownMenuLabel>
<DropdownMenuItem>
<UserIcon />
Profile
<DropdownMenuShortcut>⇧⌘P</DropdownMenuShortcut>
</DropdownMenuItem>
<DropdownMenuItem>
<CreditCardIcon />
Billing
<DropdownMenuShortcut>⌘B</DropdownMenuShortcut>
</DropdownMenuItem>
<DropdownMenuItem>
<SettingsIcon />
Settings
<DropdownMenuShortcut>⌘S</DropdownMenuShortcut>
</DropdownMenuItem>
</DropdownMenuGroup>
<DropdownMenuSeparator />
<DropdownMenuGroup>
<DropdownMenuLabel>View</DropdownMenuLabel>
<DropdownMenuCheckboxItem
checked={showSidebar}
onCheckedChange={setShowSidebar}
>
<PanelLeftIcon />
Sidebar
</DropdownMenuCheckboxItem>
<DropdownMenuCheckboxItem
checked={showStatusBar}
onCheckedChange={setShowStatusBar}
>
<LayoutIcon />
Status Bar
</DropdownMenuCheckboxItem>
</DropdownMenuGroup>
<DropdownMenuSeparator />
<DropdownMenuGroup>
<DropdownMenuSub>
<DropdownMenuSubTrigger>
<UsersIcon />
Invite Users
</DropdownMenuSubTrigger>
<DropdownMenuPortal>
<DropdownMenuSubContent>
<DropdownMenuGroup>
<DropdownMenuItem>
<MailIcon />
Email
</DropdownMenuItem>
<DropdownMenuItem>
<MessageSquareIcon />
Message
</DropdownMenuItem>
</DropdownMenuGroup>
<DropdownMenuSeparator />
<DropdownMenuGroup>
<DropdownMenuItem>
<PlusCircleIcon />
More...
</DropdownMenuItem>
</DropdownMenuGroup>
</DropdownMenuSubContent>
</DropdownMenuPortal>
</DropdownMenuSub>
</DropdownMenuGroup>
<DropdownMenuSeparator />
<DropdownMenuGroup>
<DropdownMenuItem>
<HelpCircleIcon />
Support
</DropdownMenuItem>
<DropdownMenuItem variant="destructive">
<LogOutIcon />
Sign Out
<DropdownMenuShortcut>⇧⌘Q</DropdownMenuShortcut>
</DropdownMenuItem>
</DropdownMenuGroup>
</DropdownMenuContent>
</DropdownMenu>
</Example>
)
}With Icons
With Icons
DropdownMenuWithIcons
function DropdownMenuWithIcons() {
return (
<Example title="With Icons">
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button variant="outline" className="w-fit">
Open
</Button>
</DropdownMenuTrigger>
<DropdownMenuContent>
<DropdownMenuGroup>
<DropdownMenuItem>
<UserIcon />
Profile
</DropdownMenuItem>
<DropdownMenuItem>
<CreditCardIcon />
Billing
</DropdownMenuItem>
<DropdownMenuItem>
<SettingsIcon />
Settings
</DropdownMenuItem>
</DropdownMenuGroup>
<DropdownMenuSeparator />
<DropdownMenuGroup>
<DropdownMenuItem variant="destructive">
<LogOutIcon />
Log out
</DropdownMenuItem>
</DropdownMenuGroup>
</DropdownMenuContent>
</DropdownMenu>
</Example>
)
}With Shortcuts
With Shortcuts
DropdownMenuWithShortcuts
function DropdownMenuWithShortcuts() {
return (
<Example title="With Shortcuts">
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button variant="outline" className="w-fit">
Open
</Button>
</DropdownMenuTrigger>
<DropdownMenuContent>
<DropdownMenuGroup>
<DropdownMenuLabel>My Account</DropdownMenuLabel>
<DropdownMenuItem>
Profile
<DropdownMenuShortcut>⇧⌘P</DropdownMenuShortcut>
</DropdownMenuItem>
<DropdownMenuItem>
Billing
<DropdownMenuShortcut>⌘B</DropdownMenuShortcut>
</DropdownMenuItem>
<DropdownMenuItem>
Settings
<DropdownMenuShortcut>⌘S</DropdownMenuShortcut>
</DropdownMenuItem>
<DropdownMenuItem>
Shortcuts
<DropdownMenuShortcut>⌘K</DropdownMenuShortcut>
</DropdownMenuItem>
</DropdownMenuGroup>
<DropdownMenuSeparator />
<DropdownMenuGroup>
<DropdownMenuItem>
Log out
<DropdownMenuShortcut>⇧⌘Q</DropdownMenuShortcut>
</DropdownMenuItem>
</DropdownMenuGroup>
</DropdownMenuContent>
</DropdownMenu>
</Example>
)
}With Checkboxes
With Checkboxes
DropdownMenuWithCheckboxes
function DropdownMenuWithCheckboxes() {
const [showStatusBar, setShowStatusBar] = useState(true)
const [showActivityBar, setShowActivityBar] = useState(false)
const [showPanel, setShowPanel] = useState(false)
return (
<Example title="With Checkboxes">
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button variant="outline" className="w-fit">
Checkboxes
</Button>
</DropdownMenuTrigger>
<DropdownMenuContent className="min-w-40">
<DropdownMenuGroup>
<DropdownMenuLabel>Appearance</DropdownMenuLabel>
<DropdownMenuCheckboxItem
checked={showStatusBar}
onCheckedChange={setShowStatusBar}
>
<LayoutIcon />
Status Bar
</DropdownMenuCheckboxItem>
<DropdownMenuCheckboxItem
checked={showActivityBar}
onCheckedChange={setShowActivityBar}
disabled
>
<ActivityIcon />
Activity Bar
</DropdownMenuCheckboxItem>
<DropdownMenuCheckboxItem
checked={showPanel}
onCheckedChange={setShowPanel}
>
<PanelLeftIcon />
Panel
</DropdownMenuCheckboxItem>
</DropdownMenuGroup>
</DropdownMenuContent>
</DropdownMenu>
</Example>
)
}Checkboxes with Icons
Checkboxes with Icons
DropdownMenuWithCheckboxesIcons
function DropdownMenuWithCheckboxesIcons() {
const [notifications, setNotifications] = useState({
email: true,
sms: false,
push: true,
})
return (
<Example title="Checkboxes with Icons">
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button variant="outline" className="w-fit">
Notifications
</Button>
</DropdownMenuTrigger>
<DropdownMenuContent className="min-w-56">
<DropdownMenuGroup>
<DropdownMenuLabel>Notification Preferences</DropdownMenuLabel>
<DropdownMenuCheckboxItem
checked={notifications.email}
onCheckedChange={(checked) =>
setNotifications({ ...notifications, email: checked === true })
}
>
<MailIcon />
Email notifications
</DropdownMenuCheckboxItem>
<DropdownMenuCheckboxItem
checked={notifications.sms}
onCheckedChange={(checked) =>
setNotifications({ ...notifications, sms: checked === true })
}
>
<MessageSquareIcon />
SMS notifications
</DropdownMenuCheckboxItem>
<DropdownMenuCheckboxItem
checked={notifications.push}
onCheckedChange={(checked) =>
setNotifications({ ...notifications, push: checked === true })
}
>
<BellIcon />
Push notifications
</DropdownMenuCheckboxItem>
</DropdownMenuGroup>
</DropdownMenuContent>
</DropdownMenu>
</Example>
)
}With Radio Group
With Radio Group
DropdownMenuWithRadio
function DropdownMenuWithRadio() {
const [position, setPosition] = useState("bottom")
return (
<Example title="With Radio Group">
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button variant="outline" className="w-fit">
Radio Group
</Button>
</DropdownMenuTrigger>
<DropdownMenuContent>
<DropdownMenuGroup>
<DropdownMenuLabel>Panel Position</DropdownMenuLabel>
<DropdownMenuRadioGroup
value={position}
onValueChange={setPosition}
>
<DropdownMenuRadioItem value="top">
<ArrowUpIcon />
Top
</DropdownMenuRadioItem>
<DropdownMenuRadioItem value="bottom">
<ArrowDownIcon />
Bottom
</DropdownMenuRadioItem>
<DropdownMenuRadioItem value="right" disabled>
<ArrowRightIcon />
Right
</DropdownMenuRadioItem>
</DropdownMenuRadioGroup>
</DropdownMenuGroup>
</DropdownMenuContent>
</DropdownMenu>
</Example>
)
}Radio with Icons
Radio with Icons
DropdownMenuWithRadioIcons
function DropdownMenuWithRadioIcons() {
const [paymentMethod, setPaymentMethod] = useState("card")
return (
<Example title="Radio with Icons">
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button variant="outline">Payment Method</Button>
</DropdownMenuTrigger>
<DropdownMenuContent className="min-w-56">
<DropdownMenuGroup>
<DropdownMenuLabel>Select Payment Method</DropdownMenuLabel>
<DropdownMenuRadioGroup
value={paymentMethod}
onValueChange={setPaymentMethod}
>
<DropdownMenuRadioItem value="card">
<CreditCardIcon />
Credit Card
</DropdownMenuRadioItem>
<DropdownMenuRadioItem value="paypal">
<WalletIcon />
PayPal
</DropdownMenuRadioItem>
<DropdownMenuRadioItem value="bank">
<Building2Icon />
Bank Transfer
</DropdownMenuRadioItem>
</DropdownMenuRadioGroup>
</DropdownMenuGroup>
</DropdownMenuContent>
</DropdownMenu>
</Example>
)
}With Destructive Items
With Destructive Items
DropdownMenuWithDestructive
function DropdownMenuWithDestructive() {
return (
<Example title="With Destructive Items">
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button variant="outline" className="w-fit">
Actions
</Button>
</DropdownMenuTrigger>
<DropdownMenuContent>
<DropdownMenuGroup>
<DropdownMenuItem>
<PencilIcon />
Edit
</DropdownMenuItem>
<DropdownMenuItem>
<ShareIcon />
Share
</DropdownMenuItem>
</DropdownMenuGroup>
<DropdownMenuSeparator />
<DropdownMenuGroup>
<DropdownMenuItem>
<ArchiveIcon />
Archive
</DropdownMenuItem>
<DropdownMenuItem variant="destructive">
<TrashIcon />
Delete
</DropdownMenuItem>
</DropdownMenuGroup>
</DropdownMenuContent>
</DropdownMenu>
</Example>
)
}With Avatar
With Avatar
DropdownMenuWithAvatar
function DropdownMenuWithAvatar() {
const menuContent = (
<>
<DropdownMenuGroup>
<DropdownMenuItem>
<BadgeCheckIcon />
Account
</DropdownMenuItem>
<DropdownMenuItem>
<CreditCardIcon />
Billing
</DropdownMenuItem>
<DropdownMenuItem>
<BellIcon />
Notifications
</DropdownMenuItem>
</DropdownMenuGroup>
<DropdownMenuSeparator />
<DropdownMenuGroup>
<DropdownMenuItem>
<LogOutIcon />
Sign Out
</DropdownMenuItem>
</DropdownMenuGroup>
</>
)
return (
<Example title="With Avatar">
<div className="flex items-center justify-between gap-4">
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button
variant="outline"
className="h-12 justify-start px-2 md:max-w-[200px] style-sera:font-normal style-sera:tracking-normal style-sera:normal-case"
>
<Avatar>
<AvatarImage src="https://github.com/shadcn.png" alt="Shadcn" />
<AvatarFallback className="rounded-lg">CN</AvatarFallback>
</Avatar>
<div className="grid flex-1 text-left text-sm leading-tight">
<span className="truncate font-semibold">shadcn</span>
<span className="truncate text-xs text-muted-foreground">
shadcn@example.com
</span>
</div>
<ChevronsUpDownIcon
className="ml-auto text-muted-foreground"
/>
</Button>
</DropdownMenuTrigger>
<DropdownMenuContent className="w-(--radix-dropdown-menu-trigger-width) min-w-56">
{menuContent}
</DropdownMenuContent>
</DropdownMenu>
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button variant="ghost" size="icon" className="rounded-full">
<Avatar>
<AvatarImage src="https://github.com/shadcn.png" alt="shadcn" />
<AvatarFallback>LR</AvatarFallback>
</Avatar>
</Button>
</DropdownMenuTrigger>
<DropdownMenuContent align="end" side="top">
{menuContent}
</DropdownMenuContent>
</DropdownMenu>
</div>
</Example>
)
}In Dialog
In Dialog
DropdownMenuInDialog
function DropdownMenuInDialog() {
return (
<Example title="In Dialog">
<Dialog>
<DialogTrigger asChild>
<Button variant="outline">Open Dialog</Button>
</DialogTrigger>
<DialogContent>
<DialogHeader>
<DialogTitle>Dropdown Menu Example</DialogTitle>
<DialogDescription>
Click the button below to see the dropdown menu.
</DialogDescription>
</DialogHeader>
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button variant="outline" className="w-fit">
Open Menu
</Button>
</DropdownMenuTrigger>
<DropdownMenuContent>
<DropdownMenuGroup>
<DropdownMenuItem>
<CopyIcon />
Copy
</DropdownMenuItem>
<DropdownMenuItem>
<ScissorsIcon />
Cut
</DropdownMenuItem>
<DropdownMenuItem>
<ClipboardPasteIcon />
Paste
</DropdownMenuItem>
</DropdownMenuGroup>
<DropdownMenuSeparator />
<DropdownMenuSub>
<DropdownMenuSubTrigger>More Options</DropdownMenuSubTrigger>
<DropdownMenuPortal>
<DropdownMenuSubContent>
<DropdownMenuGroup>
<DropdownMenuItem>Save Page...</DropdownMenuItem>
<DropdownMenuItem>Create Shortcut...</DropdownMenuItem>
<DropdownMenuItem>Name Window...</DropdownMenuItem>
</DropdownMenuGroup>
<DropdownMenuSeparator />
<DropdownMenuGroup>
<DropdownMenuItem>Developer Tools</DropdownMenuItem>
</DropdownMenuGroup>
</DropdownMenuSubContent>
</DropdownMenuPortal>
</DropdownMenuSub>
<DropdownMenuSeparator />
<DropdownMenuGroup>
<DropdownMenuItem variant="destructive">
<TrashIcon />
Delete
</DropdownMenuItem>
</DropdownMenuGroup>
</DropdownMenuContent>
</DropdownMenu>
</DialogContent>
</Dialog>
</Example>
)
}With Inset
With Inset
DropdownMenuWithInset
function DropdownMenuWithInset() {
const [showBookmarks, setShowBookmarks] = useState(true)
const [showUrls, setShowUrls] = useState(false)
const [theme, setTheme] = useState("system")
return (
<Example title="With Inset">
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button variant="outline" className="w-fit">
Open
</Button>
</DropdownMenuTrigger>
<DropdownMenuContent className="w-44">
<DropdownMenuGroup>
<DropdownMenuLabel>Actions</DropdownMenuLabel>
<DropdownMenuItem>
<CopyIcon />
Copy
</DropdownMenuItem>
<DropdownMenuItem>
<ScissorsIcon />
Cut
</DropdownMenuItem>
<DropdownMenuItem inset>Paste</DropdownMenuItem>
</DropdownMenuGroup>
<DropdownMenuSeparator />
<DropdownMenuGroup>
<DropdownMenuLabel inset>Appearance</DropdownMenuLabel>
<DropdownMenuCheckboxItem
inset
checked={showBookmarks}
onCheckedChange={setShowBookmarks}
>
Bookmarks
</DropdownMenuCheckboxItem>
<DropdownMenuCheckboxItem
inset
checked={showUrls}
onCheckedChange={setShowUrls}
>
Full URLs
</DropdownMenuCheckboxItem>
</DropdownMenuGroup>
<DropdownMenuSeparator />
<DropdownMenuGroup>
<DropdownMenuLabel inset>Theme</DropdownMenuLabel>
<DropdownMenuRadioGroup value={theme} onValueChange={setTheme}>
<DropdownMenuRadioItem inset value="light">
Light
</DropdownMenuRadioItem>
<DropdownMenuRadioItem inset value="dark">
Dark
</DropdownMenuRadioItem>
<DropdownMenuRadioItem inset value="system">
System
</DropdownMenuRadioItem>
</DropdownMenuRadioGroup>
</DropdownMenuGroup>
<DropdownMenuSeparator />
<DropdownMenuSub>
<DropdownMenuSubTrigger inset>More Options</DropdownMenuSubTrigger>
<DropdownMenuPortal>
<DropdownMenuSubContent>
<DropdownMenuGroup>
<DropdownMenuItem>Save Page...</DropdownMenuItem>
<DropdownMenuItem>Create Shortcut...</DropdownMenuItem>
</DropdownMenuGroup>
</DropdownMenuSubContent>
</DropdownMenuPortal>
</DropdownMenuSub>
</DropdownMenuContent>
</DropdownMenu>
</Example>
)
}Full example source
dropdown-menu-example.tsx
import { useState } from "preact/hooks"
import {
Example,
ExampleWrapper,
} from "@/components/example"
import {
Avatar,
AvatarFallback,
AvatarImage,
} from "@/components/ui/avatar"
import { Button } from "@/components/ui/button"
import {
Dialog,
DialogContent,
DialogDescription,
DialogHeader,
DialogTitle,
DialogTrigger,
} from "@/components/ui/dialog"
import {
DropdownMenu,
DropdownMenuCheckboxItem,
DropdownMenuContent,
DropdownMenuGroup,
DropdownMenuItem,
DropdownMenuLabel,
DropdownMenuPortal,
DropdownMenuRadioGroup,
DropdownMenuRadioItem,
DropdownMenuSeparator,
DropdownMenuShortcut,
DropdownMenuSub,
DropdownMenuSubContent,
DropdownMenuSubTrigger,
DropdownMenuTrigger,
} from "@/components/ui/dropdown-menu"
import {
ActivityIcon,
ArchiveIcon,
ArrowDownIcon,
ArrowRightIcon,
ArrowUpIcon,
BadgeCheckIcon,
BellIcon,
Building2Icon,
ChevronsUpDownIcon,
ClipboardPasteIcon,
CopyIcon,
CreditCardIcon,
HelpCircleIcon,
LayoutIcon,
LogOutIcon,
MailIcon,
MessageSquareIcon,
PanelLeftIcon,
PencilIcon,
PlusCircleIcon,
ScissorsIcon,
SettingsIcon,
ShareIcon,
TrashIcon,
UserIcon,
UsersIcon,
WalletIcon,
} from "lucide-preact"
export default function DropdownMenuExample() {
return (
<ExampleWrapper>
<DropdownMenuBasic />
<DropdownMenuComplex />
<DropdownMenuWithIcons />
<DropdownMenuWithShortcuts />
<DropdownMenuWithSubmenu />
<DropdownMenuWithCheckboxes />
<DropdownMenuWithCheckboxesIcons />
<DropdownMenuWithRadio />
<DropdownMenuWithRadioIcons />
<DropdownMenuWithDestructive />
<DropdownMenuWithAvatar />
<DropdownMenuInDialog />
<DropdownMenuWithInset />
</ExampleWrapper>
)
}
function DropdownMenuBasic() {
return (
<Example title="Basic">
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button variant="outline" className="w-fit">
Open
</Button>
</DropdownMenuTrigger>
<DropdownMenuContent>
<DropdownMenuGroup>
<DropdownMenuLabel>My Account</DropdownMenuLabel>
<DropdownMenuItem>Profile</DropdownMenuItem>
<DropdownMenuItem>Billing</DropdownMenuItem>
<DropdownMenuItem>Settings</DropdownMenuItem>
</DropdownMenuGroup>
<DropdownMenuSeparator />
<DropdownMenuGroup>
<DropdownMenuItem>GitHub</DropdownMenuItem>
<DropdownMenuItem disabled>API</DropdownMenuItem>
<DropdownMenuItem>Support</DropdownMenuItem>
</DropdownMenuGroup>
</DropdownMenuContent>
</DropdownMenu>
</Example>
)
}
function DropdownMenuWithIcons() {
return (
<Example title="With Icons">
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button variant="outline" className="w-fit">
Open
</Button>
</DropdownMenuTrigger>
<DropdownMenuContent>
<DropdownMenuGroup>
<DropdownMenuItem>
<UserIcon />
Profile
</DropdownMenuItem>
<DropdownMenuItem>
<CreditCardIcon />
Billing
</DropdownMenuItem>
<DropdownMenuItem>
<SettingsIcon />
Settings
</DropdownMenuItem>
</DropdownMenuGroup>
<DropdownMenuSeparator />
<DropdownMenuGroup>
<DropdownMenuItem variant="destructive">
<LogOutIcon />
Log out
</DropdownMenuItem>
</DropdownMenuGroup>
</DropdownMenuContent>
</DropdownMenu>
</Example>
)
}
function DropdownMenuWithShortcuts() {
return (
<Example title="With Shortcuts">
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button variant="outline" className="w-fit">
Open
</Button>
</DropdownMenuTrigger>
<DropdownMenuContent>
<DropdownMenuGroup>
<DropdownMenuLabel>My Account</DropdownMenuLabel>
<DropdownMenuItem>
Profile
<DropdownMenuShortcut>⇧⌘P</DropdownMenuShortcut>
</DropdownMenuItem>
<DropdownMenuItem>
Billing
<DropdownMenuShortcut>⌘B</DropdownMenuShortcut>
</DropdownMenuItem>
<DropdownMenuItem>
Settings
<DropdownMenuShortcut>⌘S</DropdownMenuShortcut>
</DropdownMenuItem>
<DropdownMenuItem>
Shortcuts
<DropdownMenuShortcut>⌘K</DropdownMenuShortcut>
</DropdownMenuItem>
</DropdownMenuGroup>
<DropdownMenuSeparator />
<DropdownMenuGroup>
<DropdownMenuItem>
Log out
<DropdownMenuShortcut>⇧⌘Q</DropdownMenuShortcut>
</DropdownMenuItem>
</DropdownMenuGroup>
</DropdownMenuContent>
</DropdownMenu>
</Example>
)
}
function DropdownMenuWithSubmenu() {
return (
<Example title="With Submenu">
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button variant="outline" className="w-fit">
Open
</Button>
</DropdownMenuTrigger>
<DropdownMenuContent>
<DropdownMenuGroup>
<DropdownMenuItem>Team</DropdownMenuItem>
<DropdownMenuSub>
<DropdownMenuSubTrigger>Invite users</DropdownMenuSubTrigger>
<DropdownMenuPortal>
<DropdownMenuSubContent>
<DropdownMenuGroup>
<DropdownMenuItem>Email</DropdownMenuItem>
<DropdownMenuItem>Message</DropdownMenuItem>
</DropdownMenuGroup>
<DropdownMenuSeparator />
<DropdownMenuGroup>
<DropdownMenuItem>More...</DropdownMenuItem>
</DropdownMenuGroup>
</DropdownMenuSubContent>
</DropdownMenuPortal>
</DropdownMenuSub>
<DropdownMenuItem>
New Team
<DropdownMenuShortcut>⌘+T</DropdownMenuShortcut>
</DropdownMenuItem>
</DropdownMenuGroup>
</DropdownMenuContent>
</DropdownMenu>
</Example>
)
}
function DropdownMenuWithCheckboxes() {
const [showStatusBar, setShowStatusBar] = useState(true)
const [showActivityBar, setShowActivityBar] = useState(false)
const [showPanel, setShowPanel] = useState(false)
return (
<Example title="With Checkboxes">
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button variant="outline" className="w-fit">
Checkboxes
</Button>
</DropdownMenuTrigger>
<DropdownMenuContent className="min-w-40">
<DropdownMenuGroup>
<DropdownMenuLabel>Appearance</DropdownMenuLabel>
<DropdownMenuCheckboxItem
checked={showStatusBar}
onCheckedChange={setShowStatusBar}
>
<LayoutIcon />
Status Bar
</DropdownMenuCheckboxItem>
<DropdownMenuCheckboxItem
checked={showActivityBar}
onCheckedChange={setShowActivityBar}
disabled
>
<ActivityIcon />
Activity Bar
</DropdownMenuCheckboxItem>
<DropdownMenuCheckboxItem
checked={showPanel}
onCheckedChange={setShowPanel}
>
<PanelLeftIcon />
Panel
</DropdownMenuCheckboxItem>
</DropdownMenuGroup>
</DropdownMenuContent>
</DropdownMenu>
</Example>
)
}
function DropdownMenuWithRadio() {
const [position, setPosition] = useState("bottom")
return (
<Example title="With Radio Group">
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button variant="outline" className="w-fit">
Radio Group
</Button>
</DropdownMenuTrigger>
<DropdownMenuContent>
<DropdownMenuGroup>
<DropdownMenuLabel>Panel Position</DropdownMenuLabel>
<DropdownMenuRadioGroup
value={position}
onValueChange={setPosition}
>
<DropdownMenuRadioItem value="top">
<ArrowUpIcon />
Top
</DropdownMenuRadioItem>
<DropdownMenuRadioItem value="bottom">
<ArrowDownIcon />
Bottom
</DropdownMenuRadioItem>
<DropdownMenuRadioItem value="right" disabled>
<ArrowRightIcon />
Right
</DropdownMenuRadioItem>
</DropdownMenuRadioGroup>
</DropdownMenuGroup>
</DropdownMenuContent>
</DropdownMenu>
</Example>
)
}
function DropdownMenuWithCheckboxesIcons() {
const [notifications, setNotifications] = useState({
email: true,
sms: false,
push: true,
})
return (
<Example title="Checkboxes with Icons">
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button variant="outline" className="w-fit">
Notifications
</Button>
</DropdownMenuTrigger>
<DropdownMenuContent className="min-w-56">
<DropdownMenuGroup>
<DropdownMenuLabel>Notification Preferences</DropdownMenuLabel>
<DropdownMenuCheckboxItem
checked={notifications.email}
onCheckedChange={(checked) =>
setNotifications({ ...notifications, email: checked === true })
}
>
<MailIcon />
Email notifications
</DropdownMenuCheckboxItem>
<DropdownMenuCheckboxItem
checked={notifications.sms}
onCheckedChange={(checked) =>
setNotifications({ ...notifications, sms: checked === true })
}
>
<MessageSquareIcon />
SMS notifications
</DropdownMenuCheckboxItem>
<DropdownMenuCheckboxItem
checked={notifications.push}
onCheckedChange={(checked) =>
setNotifications({ ...notifications, push: checked === true })
}
>
<BellIcon />
Push notifications
</DropdownMenuCheckboxItem>
</DropdownMenuGroup>
</DropdownMenuContent>
</DropdownMenu>
</Example>
)
}
function DropdownMenuWithRadioIcons() {
const [paymentMethod, setPaymentMethod] = useState("card")
return (
<Example title="Radio with Icons">
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button variant="outline">Payment Method</Button>
</DropdownMenuTrigger>
<DropdownMenuContent className="min-w-56">
<DropdownMenuGroup>
<DropdownMenuLabel>Select Payment Method</DropdownMenuLabel>
<DropdownMenuRadioGroup
value={paymentMethod}
onValueChange={setPaymentMethod}
>
<DropdownMenuRadioItem value="card">
<CreditCardIcon />
Credit Card
</DropdownMenuRadioItem>
<DropdownMenuRadioItem value="paypal">
<WalletIcon />
PayPal
</DropdownMenuRadioItem>
<DropdownMenuRadioItem value="bank">
<Building2Icon />
Bank Transfer
</DropdownMenuRadioItem>
</DropdownMenuRadioGroup>
</DropdownMenuGroup>
</DropdownMenuContent>
</DropdownMenu>
</Example>
)
}
function DropdownMenuWithDestructive() {
return (
<Example title="With Destructive Items">
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button variant="outline" className="w-fit">
Actions
</Button>
</DropdownMenuTrigger>
<DropdownMenuContent>
<DropdownMenuGroup>
<DropdownMenuItem>
<PencilIcon />
Edit
</DropdownMenuItem>
<DropdownMenuItem>
<ShareIcon />
Share
</DropdownMenuItem>
</DropdownMenuGroup>
<DropdownMenuSeparator />
<DropdownMenuGroup>
<DropdownMenuItem>
<ArchiveIcon />
Archive
</DropdownMenuItem>
<DropdownMenuItem variant="destructive">
<TrashIcon />
Delete
</DropdownMenuItem>
</DropdownMenuGroup>
</DropdownMenuContent>
</DropdownMenu>
</Example>
)
}
function DropdownMenuWithAvatar() {
const menuContent = (
<>
<DropdownMenuGroup>
<DropdownMenuItem>
<BadgeCheckIcon />
Account
</DropdownMenuItem>
<DropdownMenuItem>
<CreditCardIcon />
Billing
</DropdownMenuItem>
<DropdownMenuItem>
<BellIcon />
Notifications
</DropdownMenuItem>
</DropdownMenuGroup>
<DropdownMenuSeparator />
<DropdownMenuGroup>
<DropdownMenuItem>
<LogOutIcon />
Sign Out
</DropdownMenuItem>
</DropdownMenuGroup>
</>
)
return (
<Example title="With Avatar">
<div className="flex items-center justify-between gap-4">
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button
variant="outline"
className="h-12 justify-start px-2 md:max-w-[200px] style-sera:font-normal style-sera:tracking-normal style-sera:normal-case"
>
<Avatar>
<AvatarImage src="https://github.com/shadcn.png" alt="Shadcn" />
<AvatarFallback className="rounded-lg">CN</AvatarFallback>
</Avatar>
<div className="grid flex-1 text-left text-sm leading-tight">
<span className="truncate font-semibold">shadcn</span>
<span className="truncate text-xs text-muted-foreground">
shadcn@example.com
</span>
</div>
<ChevronsUpDownIcon
className="ml-auto text-muted-foreground"
/>
</Button>
</DropdownMenuTrigger>
<DropdownMenuContent className="w-(--radix-dropdown-menu-trigger-width) min-w-56">
{menuContent}
</DropdownMenuContent>
</DropdownMenu>
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button variant="ghost" size="icon" className="rounded-full">
<Avatar>
<AvatarImage src="https://github.com/shadcn.png" alt="shadcn" />
<AvatarFallback>LR</AvatarFallback>
</Avatar>
</Button>
</DropdownMenuTrigger>
<DropdownMenuContent align="end" side="top">
{menuContent}
</DropdownMenuContent>
</DropdownMenu>
</div>
</Example>
)
}
function DropdownMenuInDialog() {
return (
<Example title="In Dialog">
<Dialog>
<DialogTrigger asChild>
<Button variant="outline">Open Dialog</Button>
</DialogTrigger>
<DialogContent>
<DialogHeader>
<DialogTitle>Dropdown Menu Example</DialogTitle>
<DialogDescription>
Click the button below to see the dropdown menu.
</DialogDescription>
</DialogHeader>
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button variant="outline" className="w-fit">
Open Menu
</Button>
</DropdownMenuTrigger>
<DropdownMenuContent>
<DropdownMenuGroup>
<DropdownMenuItem>
<CopyIcon />
Copy
</DropdownMenuItem>
<DropdownMenuItem>
<ScissorsIcon />
Cut
</DropdownMenuItem>
<DropdownMenuItem>
<ClipboardPasteIcon />
Paste
</DropdownMenuItem>
</DropdownMenuGroup>
<DropdownMenuSeparator />
<DropdownMenuSub>
<DropdownMenuSubTrigger>More Options</DropdownMenuSubTrigger>
<DropdownMenuPortal>
<DropdownMenuSubContent>
<DropdownMenuGroup>
<DropdownMenuItem>Save Page...</DropdownMenuItem>
<DropdownMenuItem>Create Shortcut...</DropdownMenuItem>
<DropdownMenuItem>Name Window...</DropdownMenuItem>
</DropdownMenuGroup>
<DropdownMenuSeparator />
<DropdownMenuGroup>
<DropdownMenuItem>Developer Tools</DropdownMenuItem>
</DropdownMenuGroup>
</DropdownMenuSubContent>
</DropdownMenuPortal>
</DropdownMenuSub>
<DropdownMenuSeparator />
<DropdownMenuGroup>
<DropdownMenuItem variant="destructive">
<TrashIcon />
Delete
</DropdownMenuItem>
</DropdownMenuGroup>
</DropdownMenuContent>
</DropdownMenu>
</DialogContent>
</Dialog>
</Example>
)
}
function DropdownMenuWithInset() {
const [showBookmarks, setShowBookmarks] = useState(true)
const [showUrls, setShowUrls] = useState(false)
const [theme, setTheme] = useState("system")
return (
<Example title="With Inset">
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button variant="outline" className="w-fit">
Open
</Button>
</DropdownMenuTrigger>
<DropdownMenuContent className="w-44">
<DropdownMenuGroup>
<DropdownMenuLabel>Actions</DropdownMenuLabel>
<DropdownMenuItem>
<CopyIcon />
Copy
</DropdownMenuItem>
<DropdownMenuItem>
<ScissorsIcon />
Cut
</DropdownMenuItem>
<DropdownMenuItem inset>Paste</DropdownMenuItem>
</DropdownMenuGroup>
<DropdownMenuSeparator />
<DropdownMenuGroup>
<DropdownMenuLabel inset>Appearance</DropdownMenuLabel>
<DropdownMenuCheckboxItem
inset
checked={showBookmarks}
onCheckedChange={setShowBookmarks}
>
Bookmarks
</DropdownMenuCheckboxItem>
<DropdownMenuCheckboxItem
inset
checked={showUrls}
onCheckedChange={setShowUrls}
>
Full URLs
</DropdownMenuCheckboxItem>
</DropdownMenuGroup>
<DropdownMenuSeparator />
<DropdownMenuGroup>
<DropdownMenuLabel inset>Theme</DropdownMenuLabel>
<DropdownMenuRadioGroup value={theme} onValueChange={setTheme}>
<DropdownMenuRadioItem inset value="light">
Light
</DropdownMenuRadioItem>
<DropdownMenuRadioItem inset value="dark">
Dark
</DropdownMenuRadioItem>
<DropdownMenuRadioItem inset value="system">
System
</DropdownMenuRadioItem>
</DropdownMenuRadioGroup>
</DropdownMenuGroup>
<DropdownMenuSeparator />
<DropdownMenuSub>
<DropdownMenuSubTrigger inset>More Options</DropdownMenuSubTrigger>
<DropdownMenuPortal>
<DropdownMenuSubContent>
<DropdownMenuGroup>
<DropdownMenuItem>Save Page...</DropdownMenuItem>
<DropdownMenuItem>Create Shortcut...</DropdownMenuItem>
</DropdownMenuGroup>
</DropdownMenuSubContent>
</DropdownMenuPortal>
</DropdownMenuSub>
</DropdownMenuContent>
</DropdownMenu>
</Example>
)
}
function DropdownMenuComplex() {
const [showSidebar, setShowSidebar] = useState(true)
const [showStatusBar, setShowStatusBar] = useState(false)
return (
<Example title="Complex">
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button variant="outline" className="w-fit">
Complex Menu
</Button>
</DropdownMenuTrigger>
<DropdownMenuContent className="w-56">
<DropdownMenuGroup>
<DropdownMenuLabel>My Account</DropdownMenuLabel>
<DropdownMenuItem>
<UserIcon />
Profile
<DropdownMenuShortcut>⇧⌘P</DropdownMenuShortcut>
</DropdownMenuItem>
<DropdownMenuItem>
<CreditCardIcon />
Billing
<DropdownMenuShortcut>⌘B</DropdownMenuShortcut>
</DropdownMenuItem>
<DropdownMenuItem>
<SettingsIcon />
Settings
<DropdownMenuShortcut>⌘S</DropdownMenuShortcut>
</DropdownMenuItem>
</DropdownMenuGroup>
<DropdownMenuSeparator />
<DropdownMenuGroup>
<DropdownMenuLabel>View</DropdownMenuLabel>
<DropdownMenuCheckboxItem
checked={showSidebar}
onCheckedChange={setShowSidebar}
>
<PanelLeftIcon />
Sidebar
</DropdownMenuCheckboxItem>
<DropdownMenuCheckboxItem
checked={showStatusBar}
onCheckedChange={setShowStatusBar}
>
<LayoutIcon />
Status Bar
</DropdownMenuCheckboxItem>
</DropdownMenuGroup>
<DropdownMenuSeparator />
<DropdownMenuGroup>
<DropdownMenuSub>
<DropdownMenuSubTrigger>
<UsersIcon />
Invite Users
</DropdownMenuSubTrigger>
<DropdownMenuPortal>
<DropdownMenuSubContent>
<DropdownMenuGroup>
<DropdownMenuItem>
<MailIcon />
Email
</DropdownMenuItem>
<DropdownMenuItem>
<MessageSquareIcon />
Message
</DropdownMenuItem>
</DropdownMenuGroup>
<DropdownMenuSeparator />
<DropdownMenuGroup>
<DropdownMenuItem>
<PlusCircleIcon />
More...
</DropdownMenuItem>
</DropdownMenuGroup>
</DropdownMenuSubContent>
</DropdownMenuPortal>
</DropdownMenuSub>
</DropdownMenuGroup>
<DropdownMenuSeparator />
<DropdownMenuGroup>
<DropdownMenuItem>
<HelpCircleIcon />
Support
</DropdownMenuItem>
<DropdownMenuItem variant="destructive">
<LogOutIcon />
Sign Out
<DropdownMenuShortcut>⇧⌘Q</DropdownMenuShortcut>
</DropdownMenuItem>
</DropdownMenuGroup>
</DropdownMenuContent>
</DropdownMenu>
</Example>
)
}