View fulldotdev/ui on GitHub

Dropdown Menu

Displays a menu to the user, such as a set of actions or functions, triggered by a button.

Installation

npx shadcn@latest add @fulldev/dropdown-menu

Usage

import { buttonVariants } from "@/components/ui/button"
import {
  DropdownMenu,
  DropdownMenuContent,
  DropdownMenuGroup,
  DropdownMenuItem,
  DropdownMenuLabel,
  DropdownMenuSeparator,
  DropdownMenuTrigger,
} from "@/components/ui/dropdown-menu"
<DropdownMenu>
  <DropdownMenuTrigger class={buttonVariants({ variant: "outline" })}>
    Open
  </DropdownMenuTrigger>
  <DropdownMenuContent>
    <DropdownMenuGroup>
      <DropdownMenuLabel>My Account</DropdownMenuLabel>
      <DropdownMenuItem>Profile</DropdownMenuItem>
      <DropdownMenuItem>Billing</DropdownMenuItem>
    </DropdownMenuGroup>
    <DropdownMenuSeparator />
    <DropdownMenuGroup>
      <DropdownMenuItem>Team</DropdownMenuItem>
      <DropdownMenuItem>Subscription</DropdownMenuItem>
    </DropdownMenuGroup>
  </DropdownMenuContent>
</DropdownMenu>

DropdownMenuTrigger is a plain button: style it with buttonVariants. DropdownMenuItem renders an a when you pass href.

Composition

DropdownMenu
├── DropdownMenuTrigger
└── DropdownMenuContent
    ├── DropdownMenuGroup
    │   ├── DropdownMenuLabel
    │   ├── DropdownMenuItem
    │   │   └── DropdownMenuShortcut
    │   └── DropdownMenuItem
    ├── DropdownMenuSeparator
    ├── DropdownMenuGroup
    │   ├── DropdownMenuLabel
    │   ├── DropdownMenuCheckboxItem
    │   └── DropdownMenuCheckboxItem
    ├── DropdownMenuSeparator
    └── DropdownMenuGroup
        ├── DropdownMenuLabel
        ├── DropdownMenuRadioItem
        └── DropdownMenuRadioItem

The Astro component has no submenu parts (DropdownMenuSub), so the official Demo, Submenu, Complex, and RTL examples are in the React Dropdown Menu docs only.

Shortcuts

Add DropdownMenuShortcut to show keyboard hints.

Icons

Combine icons with labels for quick scanning.

Checkboxes

Use DropdownMenuCheckboxItem with a unique value. Set the checked items with defaultValues on DropdownMenu, and closeOnSelect={false} to keep the menu open while toggling.

Checkboxes Icons

Add icons to checkbox items.

Radio Group

Use DropdownMenuRadioItem for exclusive choices. A menu holds one radio value, set with defaultValue on DropdownMenu.

Radio Icons

Show radio options with icons.

Destructive

Use variant="destructive" for irreversible actions.

Avatar

An account switcher dropdown triggered by an avatar.

API Reference

Source: src/components/ui/dropdown-menu

PropTypeDefault
defaultOpenbooleanfalse
defaultValuestring | null
defaultValuesstring[]
closeOnClickOutsidebooleantrue
closeOnEscapebooleantrue
closeOnSelectbooleantrue
highlightItemOnHoverbooleantrue
side"top" | "right" | "bottom" | "left""bottom"
align"start" | "center" | "end""start"
sideOffsetnumber4
alignOffsetnumber0
avoidCollisionsbooleantrue
collisionPaddingnumber8
lockScrollbooleantrue

DropdownMenuContent takes the placement props too and overrides the root. DropdownMenuItem takes href, disabled, variant ("default" or "destructive"), and inset. DropdownMenuCheckboxItem and DropdownMenuRadioItem require value and take defaultChecked, disabled, variant, and inset; root defaults win over defaultChecked. DropdownMenuLabel takes inset.

The root emits dropdown-menu:open-change with { open }, dropdown-menu:select with { value, itemType, checked }, dropdown-menu:value-change with { value } for radio items, and dropdown-menu:values-change with { values } for checkbox items. Dispatch dropdown-menu:set with { open?, value?, values? } to change it from client code. See the Data Slot dropdown menu docs for keyboard and controller details.