ToroUI

Dropdown Menu

A menu of actions or options triggered by a button, with support for submenus, checkboxes, and radio items.


A composable dropdown menu built on Base UI's Menu primitive. It supports items, checkbox items, radio items, submenus, labels, separators, and keyboard shortcut hints. The popup is positioned with configurable alignment and side offset.

import {
  DropdownMenu,
  DropdownMenuContent,
  DropdownMenuItem,
  DropdownMenuLabel,
  DropdownMenuSeparator,
  DropdownMenuTrigger,
} from "@/components/ui/dropdown-menu"
import { Button } from "@/components/ui/button"

export default function DropdownMenuDemo() {
  return (
    <DropdownMenu>
      <DropdownMenuTrigger render={<Button variant="outline" />}>
        Open
      </DropdownMenuTrigger>
      <DropdownMenuContent>
        <DropdownMenuLabel>My Account</DropdownMenuLabel>
        <DropdownMenuSeparator />
        <DropdownMenuItem>Profile</DropdownMenuItem>
        <DropdownMenuItem>Billing</DropdownMenuItem>
        <DropdownMenuItem>Team</DropdownMenuItem>
        <DropdownMenuItem>Subscription</DropdownMenuItem>
      </DropdownMenuContent>
    </DropdownMenu>
  )
}

Anatomy

import {
  DropdownMenu,
  DropdownMenuTrigger,
  DropdownMenuContent,
  DropdownMenuItem,
  DropdownMenuGroup,
  DropdownMenuLabel,
  DropdownMenuSeparator,
  DropdownMenuShortcut,
  DropdownMenuCheckboxItem,
  DropdownMenuRadioGroup,
  DropdownMenuRadioItem,
  DropdownMenuSub,
  DropdownMenuSubTrigger,
  DropdownMenuSubContent,
  DropdownMenuPortal,
} from "@/components/ui/dropdown-menu"
<DropdownMenu>
  <DropdownMenuTrigger>Open</DropdownMenuTrigger>
  <DropdownMenuContent>
    <DropdownMenuLabel>Actions</DropdownMenuLabel>
    <DropdownMenuItem>Edit</DropdownMenuItem>
    <DropdownMenuItem>Duplicate</DropdownMenuItem>
    <DropdownMenuSeparator />
    <DropdownMenuItem variant="destructive">Delete</DropdownMenuItem>
  </DropdownMenuContent>
</DropdownMenu>

Examples

Basic menu

<DropdownMenu>
  <DropdownMenuTrigger render={<Button variant="outline" />}>
    Options
  </DropdownMenuTrigger>
  <DropdownMenuContent>
    <DropdownMenuItem>Profile</DropdownMenuItem>
    <DropdownMenuItem>Settings</DropdownMenuItem>
    <DropdownMenuSeparator />
    <DropdownMenuItem>Log out</DropdownMenuItem>
  </DropdownMenuContent>
</DropdownMenu>

With shortcuts and groups

<DropdownMenu>
  <DropdownMenuTrigger render={<Button variant="outline" />}>
    Edit
  </DropdownMenuTrigger>
  <DropdownMenuContent>
    <DropdownMenuGroup>
      <DropdownMenuLabel>Clipboard</DropdownMenuLabel>
      <DropdownMenuItem>
        Cut <DropdownMenuShortcut>Ctrl+X</DropdownMenuShortcut>
      </DropdownMenuItem>
      <DropdownMenuItem>
        Copy <DropdownMenuShortcut>Ctrl+C</DropdownMenuShortcut>
      </DropdownMenuItem>
      <DropdownMenuItem>
        Paste <DropdownMenuShortcut>Ctrl+V</DropdownMenuShortcut>
      </DropdownMenuItem>
    </DropdownMenuGroup>
  </DropdownMenuContent>
</DropdownMenu>

With checkbox items

<DropdownMenu>
  <DropdownMenuTrigger render={<Button variant="outline" />}>
    View
  </DropdownMenuTrigger>
  <DropdownMenuContent>
    <DropdownMenuLabel>Toggle columns</DropdownMenuLabel>
    <DropdownMenuCheckboxItem checked={showName} onCheckedChange={setShowName}>
      Name
    </DropdownMenuCheckboxItem>
    <DropdownMenuCheckboxItem checked={showEmail} onCheckedChange={setShowEmail}>
      Email
    </DropdownMenuCheckboxItem>
  </DropdownMenuContent>
</DropdownMenu>

With submenu

<DropdownMenu>
  <DropdownMenuTrigger render={<Button variant="outline" />}>
    More
  </DropdownMenuTrigger>
  <DropdownMenuContent>
    <DropdownMenuItem>New File</DropdownMenuItem>
    <DropdownMenuSub>
      <DropdownMenuSubTrigger>Share</DropdownMenuSubTrigger>
      <DropdownMenuSubContent>
        <DropdownMenuItem>Email</DropdownMenuItem>
        <DropdownMenuItem>Slack</DropdownMenuItem>
      </DropdownMenuSubContent>
    </DropdownMenuSub>
  </DropdownMenuContent>
</DropdownMenu>

API Reference

The root component that manages open/close state. Wraps Base UI's Menu.Root.

PropTypeDefault
openboolean
onOpenChange(open: boolean) => void
childrenReactNode

The element that toggles the menu. Wraps Base UI's Menu.Trigger.

PropTypeDefault
classNamestring
childrenReactNode

The positioned popup that contains menu items. Handles portal, positioner, and popup internally.

PropTypeDefaultDescription
align"start" | "center" | "end""start"Horizontal alignment relative to the trigger.
alignOffsetnumber0Offset in pixels from the aligned edge.
side"top" | "bottom" | "left" | "right""bottom"Which side of the trigger the menu appears on.
sideOffsetnumber4Gap in pixels between the trigger and the menu.
classNamestring
childrenReactNode

A single actionable item in the menu.

PropTypeDefaultDescription
insetbooleanWhen true, adds left padding to align with items that have icons.
variant"default" | "destructive""default"Visual style of the item.
classNamestring
childrenReactNode

Groups related menu items together. Wraps Base UI's Menu.Group.

PropTypeDefault
childrenReactNode

A non-interactive label for a group of items.

PropTypeDefaultDescription
insetbooleanWhen true, adds left padding to align with inset items.
classNamestring
childrenReactNode

A menu item with a checkbox indicator.

PropTypeDefaultDescription
checkedbooleanWhether the item is checked.
onCheckedChange(checked: boolean) => voidCallback when checked state changes.
insetbooleanWhen true, adds left padding.
classNamestring
childrenReactNode

A group of mutually exclusive radio items. Wraps Base UI's Menu.RadioGroup.

PropTypeDefault
valuestring
onValueChange(value: string) => void
childrenReactNode

A radio-style menu item that shows a check indicator when selected.

PropTypeDefaultDescription
valuestringThe value associated with this radio item.
insetbooleanWhen true, adds left padding.
classNamestring
childrenReactNode

A horizontal rule between menu items. Wraps Base UI's Menu.Separator.

PropTypeDefault
classNamestring

A <span> that renders a right-aligned keyboard shortcut hint within a menu item.

PropTypeDefault
classNamestring
childrenReactNode

The root for a submenu. Wraps Base UI's Menu.SubmenuRoot.

PropTypeDefault
childrenReactNode

The item that opens a submenu. Renders a right-pointing chevron automatically.

PropTypeDefaultDescription
insetbooleanWhen true, adds left padding.
classNamestring
childrenReactNode

The popup for a submenu. Uses DropdownMenuContent internally with adjusted defaults.

PropTypeDefaultDescription
align"start" | "center" | "end""start"Horizontal alignment relative to the sub-trigger.
alignOffsetnumber-3Offset in pixels from the aligned edge.
side"top" | "bottom" | "left" | "right""right"Which side of the sub-trigger the submenu appears on.
sideOffsetnumber0Gap in pixels between the sub-trigger and the submenu.
classNamestring
childrenReactNode

Portals menu content to the end of document.body. Wraps Base UI's Menu.Portal.

PropTypeDefault
childrenReactNode