Dropdown Menu

Compact action menu opened from a trigger.

Open a compact list of actions from a trigger. Click outside or press Escape to close it.

tsx
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-menu

Usage

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
            └── DropdownMenuItem

Basic

Grouped actions with a separator. Choosing an item closes the menu.

tsx
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>  )}

Use DropdownMenuSub for nested actions. Hover DropdownMenuSubTrigger to open it.

tsx
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.

tsx
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.

tsx
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.

tsx
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.

tsx
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.

tsx
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.

tsx
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.

tsx
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.

tsx
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.

tsx
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

Root provider for the trigger and content.

PropTypeDefault
childrenReactNode
<DropdownMenu>  <DropdownMenuTrigger>Open</DropdownMenuTrigger>  <DropdownMenuContent>    <DropdownMenuItem>Open</DropdownMenuItem>  </DropdownMenuContent></DropdownMenu>

Button that toggles the menu. Style it with buttonVariants or your own classes.

PropTypeDefault
classNamestring
<DropdownMenuTrigger className={buttonVariants({ variant: "outline" })}>  Open</DropdownMenuTrigger>

Menu panel positioned below the trigger and kept within the viewport.

PropTypeDefault
align"start" | "center" | "end""center"
sideOffsetnumber6
classNamestring
<DropdownMenuContent align="end" sideOffset={8}>  <DropdownMenuItem>Open</DropdownMenuItem></DropdownMenuContent>

Choosing an item closes the menu unless it is a checkbox or radio item.

PropTypeDefault
variant"default" | "destructive""default"
insetbooleanfalse
hrefstring
disabledbooleanfalse
classNamestring
<DropdownMenuItem href="/settings">Settings</DropdownMenuItem>

Toggle that does not close the menu on click.

PropTypeDefault
checkedbooleanfalse
onCheckedChange(checked: boolean) => void
disabledbooleanfalse
classNamestring
<DropdownMenuCheckboxItem checked>  Show bookmarks</DropdownMenuCheckboxItem>

Exclusive selection group for DropdownMenuRadioItem.

PropTypeDefault
valuestring""
onValueChange(value: string) => void
classNamestring
<DropdownMenuRadioGroup value="personal">  <DropdownMenuRadioItem value="personal">Personal</DropdownMenuRadioItem></DropdownMenuRadioGroup>

Must be used inside DropdownMenuRadioGroup. Does not close the menu on click.

PropTypeDefault
valuestring
disabledbooleanfalse
classNamestring
<DropdownMenuRadioItem value="team">Team</DropdownMenuRadioItem>
PropTypeDefault
insetbooleanfalse
classNamestring
<DropdownMenuLabel>Account</DropdownMenuLabel>
PropTypeDefault
classNamestring
<DropdownMenuItem>  Save  <DropdownMenuShortcut>⌘S</DropdownMenuShortcut></DropdownMenuItem>
PropTypeDefault
classNamestring
<DropdownMenuSeparator />
PropTypeDefault
classNamestring
<DropdownMenuGroup>  <DropdownMenuItem>Open</DropdownMenuItem></DropdownMenuGroup>
PropTypeDefault
childrenReactNode
<DropdownMenuSub>  <DropdownMenuSubTrigger>More</DropdownMenuSubTrigger>  <DropdownMenuSubContent>    <DropdownMenuItem>Save</DropdownMenuItem>  </DropdownMenuSubContent></DropdownMenuSub>
PropTypeDefault
insetbooleanfalse
classNamestring
<DropdownMenuSubTrigger>More</DropdownMenuSubTrigger>
PropTypeDefault
classNamestring
<DropdownMenuSubContent>  <DropdownMenuItem>Save</DropdownMenuItem></DropdownMenuSubContent>