Open a compact list of actions from a trigger. Click outside or press Escape to close it.
import { buttonVariants } from "@/components/ui/button"import { DropdownMenu, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger,} from "@/components/ui/dropdown-menu"export function Example() { return ( <DropdownMenu> <DropdownMenuTrigger className={buttonVariants({ variant: "outline" })}> Open </DropdownMenuTrigger> <DropdownMenuContent className="w-56"> <DropdownMenuGroup> <DropdownMenuLabel>My Account</DropdownMenuLabel> <DropdownMenuItem>Profile</DropdownMenuItem> <DropdownMenuItem>Billing</DropdownMenuItem> </DropdownMenuGroup> <DropdownMenuSeparator /> <DropdownMenuGroup> <DropdownMenuItem>Team</DropdownMenuItem> <DropdownMenuItem>Subscription</DropdownMenuItem> </DropdownMenuGroup> </DropdownMenuContent> </DropdownMenu> )}Installation
npx @arctis-sh/@arctis-sh/ui@latest add dropdown-menuUsage
import { buttonVariants } from "@/components/ui/button"import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger,} from "@/components/ui/dropdown-menu"<DropdownMenu> <DropdownMenuTrigger className={buttonVariants({ variant: "outline" })}> Open </DropdownMenuTrigger> <DropdownMenuContent> <DropdownMenuItem>Profile</DropdownMenuItem> <DropdownMenuItem>Billing</DropdownMenuItem> <DropdownMenuItem>Team</DropdownMenuItem> <DropdownMenuItem>Subscription</DropdownMenuItem> </DropdownMenuContent></DropdownMenu>Composition
DropdownMenu
├── DropdownMenuTrigger
└── DropdownMenuContent
├── DropdownMenuGroup
│ ├── DropdownMenuLabel
│ ├── DropdownMenuItem
│ │ └── DropdownMenuShortcut
│ └── DropdownMenuItem
├── DropdownMenuSeparator
├── DropdownMenuCheckboxItem
├── DropdownMenuRadioGroup
│ └── DropdownMenuRadioItem
└── DropdownMenuSub
├── DropdownMenuSubTrigger
└── DropdownMenuSubContent
└── DropdownMenuItemBasic
Grouped actions with a separator. Choosing an item closes the menu.
import { buttonVariants } from "@/components/ui/button"import { DropdownMenu, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger,} from "@/components/ui/dropdown-menu"export function Example() { return ( <DropdownMenu> <DropdownMenuTrigger className={buttonVariants({ variant: "outline" })}> Open </DropdownMenuTrigger> <DropdownMenuContent className="w-56"> <DropdownMenuGroup> <DropdownMenuLabel>My Account</DropdownMenuLabel> <DropdownMenuItem>Profile</DropdownMenuItem> <DropdownMenuItem>Billing</DropdownMenuItem> </DropdownMenuGroup> <DropdownMenuSeparator /> <DropdownMenuGroup> <DropdownMenuItem>Team</DropdownMenuItem> <DropdownMenuItem>Subscription</DropdownMenuItem> </DropdownMenuGroup> </DropdownMenuContent> </DropdownMenu> )}Submenu
Use DropdownMenuSub for nested actions. Hover DropdownMenuSubTrigger to open it.
import { buttonVariants } from "@/components/ui/button"import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger,} from "@/components/ui/dropdown-menu"export function Example() { return ( <DropdownMenu> <DropdownMenuTrigger className={buttonVariants({ variant: "outline" })}> Open </DropdownMenuTrigger> <DropdownMenuContent className="w-56"> <DropdownMenuItem>New Tab</DropdownMenuItem> <DropdownMenuItem>New Window</DropdownMenuItem> <DropdownMenuItem disabled>New Private Window</DropdownMenuItem> <DropdownMenuSeparator /> <DropdownMenuSub> <DropdownMenuSubTrigger>Invite users</DropdownMenuSubTrigger> <DropdownMenuSubContent> <DropdownMenuItem>Email</DropdownMenuItem> <DropdownMenuItem>Message</DropdownMenuItem> <DropdownMenuSeparator /> <DropdownMenuItem>More…</DropdownMenuItem> </DropdownMenuSubContent> </DropdownMenuSub> <DropdownMenuItem>New Team</DropdownMenuItem> <DropdownMenuItem>GitHub</DropdownMenuItem> <DropdownMenuItem>Support</DropdownMenuItem> <DropdownMenuItem disabled>API</DropdownMenuItem> <DropdownMenuSeparator /> <DropdownMenuItem>Log out</DropdownMenuItem> </DropdownMenuContent> </DropdownMenu> )}Shortcuts
Place DropdownMenuShortcut inside an item to show a keyboard hint.
import { buttonVariants } from "@/components/ui/button"import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuShortcut, DropdownMenuTrigger,} from "@/components/ui/dropdown-menu"export function Example() { return ( <DropdownMenu> <DropdownMenuTrigger className={buttonVariants({ variant: "outline" })}> Open </DropdownMenuTrigger> <DropdownMenuContent className="w-56"> <DropdownMenuItem> Profile <DropdownMenuShortcut>⇧⌘P</DropdownMenuShortcut> </DropdownMenuItem> <DropdownMenuItem> Billing <DropdownMenuShortcut>⌘B</DropdownMenuShortcut> </DropdownMenuItem> <DropdownMenuItem> Settings <DropdownMenuShortcut>⌘S</DropdownMenuShortcut> </DropdownMenuItem> <DropdownMenuItem> Keyboard shortcuts <DropdownMenuShortcut>⌘K</DropdownMenuShortcut> </DropdownMenuItem> </DropdownMenuContent> </DropdownMenu> )}Icons
Place an SVG icon before the label. Icons use a muted color by default.
import type { SVGProps } from "react"import { buttonVariants } from "@/components/ui/button"import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger,} from "@/components/ui/dropdown-menu"function UserIcon(props: SVGProps<SVGSVGElement>) { return ( <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true" {...props}> <path d="M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2" /> <circle cx="12" cy="7" r="4" /> </svg> )}function CreditCardIcon(props: SVGProps<SVGSVGElement>) { return ( <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true" {...props}> <rect width="20" height="14" x="2" y="5" rx="2" /> <path d="M2 10h20" /> </svg> )}function SettingsIcon(props: SVGProps<SVGSVGElement>) { return ( <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true" {...props}> <path d="M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z" /> <circle cx="12" cy="12" r="3" /> </svg> )}function LogOutIcon(props: SVGProps<SVGSVGElement>) { return ( <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true" {...props}> <path d="M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4" /> <polyline points="16 17 21 12 16 7" /> <line x1="21" x2="9" y1="12" y2="12" /> </svg> )}export function Example() { return ( <DropdownMenu> <DropdownMenuTrigger className={buttonVariants({ variant: "outline" })}> Open </DropdownMenuTrigger> <DropdownMenuContent className="w-56"> <DropdownMenuItem> <UserIcon /> Profile </DropdownMenuItem> <DropdownMenuItem> <CreditCardIcon /> Billing </DropdownMenuItem> <DropdownMenuItem> <SettingsIcon /> Settings </DropdownMenuItem> <DropdownMenuSeparator /> <DropdownMenuItem> <LogOutIcon /> Log out </DropdownMenuItem> </DropdownMenuContent> </DropdownMenu> )}Checkboxes
Use DropdownMenuCheckboxItem for independent toggles. The menu stays open so you can change several at once.
import * as React from "react"import { buttonVariants } from "@/components/ui/button"import { DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger,} from "@/components/ui/dropdown-menu"export function Example() { const [statusBar, setStatusBar] = React.useState(true) const [activityBar, setActivityBar] = React.useState(false) const [panel, setPanel] = React.useState(false) return ( <DropdownMenu> <DropdownMenuTrigger className={buttonVariants({ variant: "outline" })}> Open </DropdownMenuTrigger> <DropdownMenuContent className="w-56"> <DropdownMenuLabel>Appearance</DropdownMenuLabel> <DropdownMenuSeparator /> <DropdownMenuCheckboxItem checked={statusBar} onCheckedChange={setStatusBar} > Status Bar </DropdownMenuCheckboxItem> <DropdownMenuCheckboxItem checked={activityBar} onCheckedChange={setActivityBar} > Activity Bar </DropdownMenuCheckboxItem> <DropdownMenuCheckboxItem checked={panel} onCheckedChange={setPanel}> Panel </DropdownMenuCheckboxItem> </DropdownMenuContent> </DropdownMenu> )}Checkboxes with Icons
Checkbox items with leading icons for settings-style toggles.
import type { SVGProps } from "react"import * as React from "react"import { buttonVariants } from "@/components/ui/button"import { DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger,} from "@/components/ui/dropdown-menu"function BellIcon(props: SVGProps<SVGSVGElement>) { return ( <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true" {...props}> <path d="M6 8a6 6 0 0 1 12 0c0 7 3 9 3 9H3s3-2 3-9" /> <path d="M10.3 21a1.94 1.94 0 0 0 3.4 0" /> </svg> )}function MailIcon(props: SVGProps<SVGSVGElement>) { return ( <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true" {...props}> <rect width="20" height="16" x="2" y="4" rx="2" /> <path d="m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7" /> </svg> )}function MessageIcon(props: SVGProps<SVGSVGElement>) { return ( <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true" {...props}> <path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z" /> </svg> )}export function Example() { const [push, setPush] = React.useState(true) const [email, setEmail] = React.useState(false) const [messages, setMessages] = React.useState(false) return ( <DropdownMenu> <DropdownMenuTrigger className={buttonVariants({ variant: "outline" })}> Notifications </DropdownMenuTrigger> <DropdownMenuContent className="w-56"> <DropdownMenuLabel>Notifications</DropdownMenuLabel> <DropdownMenuSeparator /> <DropdownMenuCheckboxItem checked={push} onCheckedChange={setPush}> <BellIcon /> Push Notifications </DropdownMenuCheckboxItem> <DropdownMenuCheckboxItem checked={email} onCheckedChange={setEmail}> <MailIcon /> Email Notifications </DropdownMenuCheckboxItem> <DropdownMenuCheckboxItem checked={messages} onCheckedChange={setMessages} > <MessageIcon /> Message Notifications </DropdownMenuCheckboxItem> </DropdownMenuContent> </DropdownMenu> )}Radio
DropdownMenuRadioItem inside DropdownMenuRadioGroup. One value at a time; the menu stays open while you switch.
import * as React from "react"import { buttonVariants } from "@/components/ui/button"import { DropdownMenu, DropdownMenuContent, DropdownMenuLabel, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuTrigger,} from "@/components/ui/dropdown-menu"export function Example() { const [plan, setPlan] = React.useState("personal") return ( <DropdownMenu> <DropdownMenuTrigger className={buttonVariants({ variant: "outline" })}> Open </DropdownMenuTrigger> <DropdownMenuContent className="w-56"> <DropdownMenuLabel>Billing Plan</DropdownMenuLabel> <DropdownMenuSeparator /> <DropdownMenuRadioGroup value={plan} onValueChange={setPlan}> <DropdownMenuRadioItem value="personal">Personal</DropdownMenuRadioItem> <DropdownMenuRadioItem value="team">Team</DropdownMenuRadioItem> <DropdownMenuRadioItem value="enterprise"> Enterprise </DropdownMenuRadioItem> </DropdownMenuRadioGroup> </DropdownMenuContent> </DropdownMenu> )}Radio with Icons
Add icons to radio items when they help distinguish the choices, such as payment methods.
import type { SVGProps } from "react"import * as React from "react"import { buttonVariants } from "@/components/ui/button"import { DropdownMenu, DropdownMenuContent, DropdownMenuLabel, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuTrigger,} from "@/components/ui/dropdown-menu"function CreditCardIcon(props: SVGProps<SVGSVGElement>) { return ( <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true" {...props}> <rect width="20" height="14" x="2" y="5" rx="2" /> <path d="M2 10h20" /> </svg> )}function WalletIcon(props: SVGProps<SVGSVGElement>) { return ( <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true" {...props}> <path d="M19 7V4a1 1 0 0 0-1-1H5a2 2 0 0 0 0 4h15a1 1 0 0 1 1 1v4h-3a2 2 0 0 0 0 4h3a1 1 0 0 0 1-1v-2a1 1 0 0 0-1-1" /> <path d="M3 5v14a2 2 0 0 0 2 2h15a1 1 0 0 0 1-1v-4" /> </svg> )}function SmartphoneIcon(props: SVGProps<SVGSVGElement>) { return ( <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true" {...props}> <rect width="14" height="20" x="5" y="2" rx="2" ry="2" /> <path d="M12 18h.01" /> </svg> )}export function Example() { const [method, setMethod] = React.useState("card") return ( <DropdownMenu> <DropdownMenuTrigger className={buttonVariants({ variant: "outline" })}> Payment Method </DropdownMenuTrigger> <DropdownMenuContent className="w-56"> <DropdownMenuLabel>Payment Method</DropdownMenuLabel> <DropdownMenuSeparator /> <DropdownMenuRadioGroup value={method} onValueChange={setMethod}> <DropdownMenuRadioItem value="card"> <CreditCardIcon /> Card </DropdownMenuRadioItem> <DropdownMenuRadioItem value="paypal"> <WalletIcon /> PayPal </DropdownMenuRadioItem> <DropdownMenuRadioItem value="apple"> <SmartphoneIcon /> Apple Pay </DropdownMenuRadioItem> </DropdownMenuRadioGroup> </DropdownMenuContent> </DropdownMenu> )}Destructive
Set variant="destructive" on DropdownMenuItem for an irreversible action. The label and icon use the destructive color.
import type { SVGProps } from "react"import { buttonVariants } from "@/components/ui/button"import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger,} from "@/components/ui/dropdown-menu"function PencilIcon(props: SVGProps<SVGSVGElement>) { return ( <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true" {...props}> <path d="M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z" /> <path d="m15 5 4 4" /> </svg> )}function ShareIcon(props: SVGProps<SVGSVGElement>) { return ( <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true" {...props}> <path d="M12 2v13" /><path d="m16 6-4-4-4 4" /><path d="M4 12v8a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-8" /> </svg> )}function ArchiveIcon(props: SVGProps<SVGSVGElement>) { return ( <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true" {...props}> <rect width="20" height="5" x="2" y="3" rx="1" /><path d="M4 8v11a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8" /><path d="M10 12h4" /> </svg> )}function TrashIcon(props: SVGProps<SVGSVGElement>) { return ( <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true" {...props}> <path d="M3 6h18" /><path d="M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6" /><path d="M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2" /> </svg> )}export function Example() { return ( <DropdownMenu> <DropdownMenuTrigger className={buttonVariants({ variant: "outline" })}> Open </DropdownMenuTrigger> <DropdownMenuContent className="w-56"> <DropdownMenuItem> <PencilIcon /> Edit </DropdownMenuItem> <DropdownMenuItem> <ShareIcon /> Share </DropdownMenuItem> <DropdownMenuItem> <ArchiveIcon /> Archive </DropdownMenuItem> <DropdownMenuSeparator /> <DropdownMenuItem variant="destructive"> <TrashIcon /> Delete </DropdownMenuItem> </DropdownMenuContent> </DropdownMenu> )}Avatar
The trigger can contain anything, including an avatar for account switchers or profile menus.
import { Avatar, AvatarFallback, AvatarImage,} from "@/components/ui/avatar"import { buttonVariants } from "@/components/ui/button"import { DropdownMenu, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger,} from "@/components/ui/dropdown-menu"import { cn } from "@/lib/utils"export function Example() { return ( <DropdownMenu> <DropdownMenuTrigger className={cn( buttonVariants({ variant: "outline" }), "h-auto gap-2 px-2 py-1.5", )} > <Avatar> <AvatarImage src="/assets/brand/demos/avatars/avatar-1.png" alt="@arctic" /> <AvatarFallback>AR</AvatarFallback> </Avatar> <span className="text-sm">@arctic</span> </DropdownMenuTrigger> <DropdownMenuContent className="w-56" align="center"> <DropdownMenuLabel>Switch account</DropdownMenuLabel> <DropdownMenuSeparator /> <DropdownMenuGroup> <DropdownMenuItem> <Avatar size="sm"> <AvatarImage src="/assets/brand/demos/avatars/avatar-1.png" alt="@arctic" /> <AvatarFallback>AR</AvatarFallback> </Avatar> @arctic </DropdownMenuItem> <DropdownMenuItem> <Avatar size="sm"> <AvatarImage src="/assets/brand/demos/avatars/avatar-2.png" alt="@nova" /> <AvatarFallback>NV</AvatarFallback> </Avatar> @nova </DropdownMenuItem> <DropdownMenuItem> <Avatar size="sm"> <AvatarImage src="/assets/brand/demos/avatars/avatar-3.png" alt="@orbit" /> <AvatarFallback>OR</AvatarFallback> </Avatar> @orbit </DropdownMenuItem> </DropdownMenuGroup> <DropdownMenuSeparator /> <DropdownMenuItem>Log out</DropdownMenuItem> </DropdownMenuContent> </DropdownMenu> )}Complex
Combine groups, icons, shortcuts, and submenus in one menu.
import type { SVGProps } from "react"import { buttonVariants } from "@/components/ui/button"import { DropdownMenu, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger,} from "@/components/ui/dropdown-menu"function UserIcon(props: SVGProps<SVGSVGElement>) { return ( <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true" {...props}> <path d="M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2" /> <circle cx="12" cy="7" r="4" /> </svg> )}function UsersIcon(props: SVGProps<SVGSVGElement>) { return ( <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true" {...props}> <path d="M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2" /> <circle cx="9" cy="7" r="4" /> <path d="M22 21v-2a4 4 0 0 0-3-3.87" /> <path d="M16 3.13a4 4 0 0 1 0 7.75" /> </svg> )}function PlusIcon(props: SVGProps<SVGSVGElement>) { return ( <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true" {...props}> <path d="M5 12h14" /> <path d="M12 5v14" /> </svg> )}function CloudIcon(props: SVGProps<SVGSVGElement>) { return ( <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true" {...props}> <path d="M17.5 19H9a7 7 0 1 1 6.71-9h1.79a4.5 4.5 0 1 1 0 9Z" /> </svg> )}function LogOutIcon(props: SVGProps<SVGSVGElement>) { return ( <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true" {...props}> <path d="M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4" /> <polyline points="16 17 21 12 16 7" /> <line x1="21" x2="9" y1="12" y2="12" /> </svg> )}export function Example() { return ( <DropdownMenu> <DropdownMenuTrigger className={buttonVariants({ variant: "outline" })}> Open </DropdownMenuTrigger> <DropdownMenuContent className="w-56"> <DropdownMenuLabel>My Account</DropdownMenuLabel> <DropdownMenuGroup> <DropdownMenuItem> <UserIcon /> Profile <DropdownMenuShortcut>⇧⌘P</DropdownMenuShortcut> </DropdownMenuItem> <DropdownMenuItem> <UsersIcon /> Team </DropdownMenuItem> <DropdownMenuItem disabled> <CloudIcon /> Billing <DropdownMenuShortcut>⌘B</DropdownMenuShortcut> </DropdownMenuItem> </DropdownMenuGroup> <DropdownMenuSeparator /> <DropdownMenuGroup> <DropdownMenuItem> <PlusIcon /> New Team <DropdownMenuShortcut>⌘T</DropdownMenuShortcut> </DropdownMenuItem> <DropdownMenuSub> <DropdownMenuSubTrigger>Invite users</DropdownMenuSubTrigger> <DropdownMenuSubContent> <DropdownMenuItem>Email</DropdownMenuItem> <DropdownMenuItem>Message</DropdownMenuItem> <DropdownMenuSeparator /> <DropdownMenuItem>More…</DropdownMenuItem> </DropdownMenuSubContent> </DropdownMenuSub> </DropdownMenuGroup> <DropdownMenuSeparator /> <DropdownMenuItem> <LogOutIcon /> Log out <DropdownMenuShortcut>⇧⌘Q</DropdownMenuShortcut> </DropdownMenuItem> </DropdownMenuContent> </DropdownMenu> )}API Reference
DropdownMenu
Root provider for the trigger and content.
| Prop | Type | Default |
|---|---|---|
| children | ReactNode | — |
<DropdownMenu> <DropdownMenuTrigger>Open</DropdownMenuTrigger> <DropdownMenuContent> <DropdownMenuItem>Open</DropdownMenuItem> </DropdownMenuContent></DropdownMenu>DropdownMenuTrigger
Button that toggles the menu. Style it with buttonVariants or your own classes.
| Prop | Type | Default |
|---|---|---|
| className | string | — |
<DropdownMenuTrigger className={buttonVariants({ variant: "outline" })}> Open</DropdownMenuTrigger>DropdownMenuContent
Menu panel positioned below the trigger and kept within the viewport.
| Prop | Type | Default |
|---|---|---|
| align | "start" | "center" | "end" | "center" |
| sideOffset | number | 6 |
| className | string | — |
<DropdownMenuContent align="end" sideOffset={8}> <DropdownMenuItem>Open</DropdownMenuItem></DropdownMenuContent>DropdownMenuItem
Choosing an item closes the menu unless it is a checkbox or radio item.
| Prop | Type | Default |
|---|---|---|
| variant | "default" | "destructive" | "default" |
| inset | boolean | false |
| href | string | — |
| disabled | boolean | false |
| className | string | — |
<DropdownMenuItem href="/settings">Settings</DropdownMenuItem>DropdownMenuCheckboxItem
Toggle that does not close the menu on click.
| Prop | Type | Default |
|---|---|---|
| checked | boolean | false |
| onCheckedChange | (checked: boolean) => void | — |
| disabled | boolean | false |
| className | string | — |
<DropdownMenuCheckboxItem checked> Show bookmarks</DropdownMenuCheckboxItem>DropdownMenuRadioGroup
Exclusive selection group for DropdownMenuRadioItem.
| Prop | Type | Default |
|---|---|---|
| value | string | "" |
| onValueChange | (value: string) => void | — |
| className | string | — |
<DropdownMenuRadioGroup value="personal"> <DropdownMenuRadioItem value="personal">Personal</DropdownMenuRadioItem></DropdownMenuRadioGroup>DropdownMenuRadioItem
Must be used inside DropdownMenuRadioGroup. Does not close the menu on click.
| Prop | Type | Default |
|---|---|---|
| value | string | — |
| disabled | boolean | false |
| className | string | — |
<DropdownMenuRadioItem value="team">Team</DropdownMenuRadioItem>DropdownMenuLabel
| Prop | Type | Default |
|---|---|---|
| inset | boolean | false |
| className | string | — |
<DropdownMenuLabel>Account</DropdownMenuLabel>DropdownMenuShortcut
| Prop | Type | Default |
|---|---|---|
| className | string | — |
<DropdownMenuItem> Save <DropdownMenuShortcut>⌘S</DropdownMenuShortcut></DropdownMenuItem>DropdownMenuSeparator
| Prop | Type | Default |
|---|---|---|
| className | string | — |
<DropdownMenuSeparator />DropdownMenuGroup
| Prop | Type | Default |
|---|---|---|
| className | string | — |
<DropdownMenuGroup> <DropdownMenuItem>Open</DropdownMenuItem></DropdownMenuGroup>DropdownMenuSub
| Prop | Type | Default |
|---|---|---|
| children | ReactNode | — |
<DropdownMenuSub> <DropdownMenuSubTrigger>More</DropdownMenuSubTrigger> <DropdownMenuSubContent> <DropdownMenuItem>Save</DropdownMenuItem> </DropdownMenuSubContent></DropdownMenuSub>DropdownMenuSubTrigger
| Prop | Type | Default |
|---|---|---|
| inset | boolean | false |
| className | string | — |
<DropdownMenuSubTrigger>More</DropdownMenuSubTrigger>DropdownMenuSubContent
| Prop | Type | Default |
|---|---|---|
| className | string | — |
<DropdownMenuSubContent> <DropdownMenuItem>Save</DropdownMenuItem></DropdownMenuSubContent>