Action menu that opens from a button, for account controls, row actions, and overflow commands.
Description
Dropdown is a compound menu built on React Aria's Menu. It composes a trigger, a Dropdown.Popover surface, and a Dropdown.Menu list of Dropdown.Item rows, with optional Dropdown.Section, Dropdown.Header, Dropdown.Search, Dropdown.Misc, and Dropdown.Footer slots. size is set on the root and cascades through context to every item, label, and icon.
Reach for it when a button needs to fan out into a short list of commands or one-of-many switches: account menus, row actions, overflow ("...") menus on cards, sort and filter pickers, "open in" link lists. It works equally well attached to a labeled icon button, an avatar, or a plain text trigger.
The free tier ships the two building blocks: Dropdown.Item and Dropdown.Separator. Grouped sections and headers, a pinned search bar, smart items (secondary text, trailing badges/switches), and the footer slot are Pro (add it with a Pro seat via add dropdown-menu). Do not use a dropdown as a form control: to bind a single value to a form field use Select; for right-click on a region use ContextMenu; for arbitrary non-menu content use Popover.
Installation
Anatomy
Usage
Examples
The free tier covers Dropdown.Item (with a leading icon and size) and Dropdown.Separator. Everything richer is a Pro preview, marked with a Pro badge; the live demo still runs, but the source needs a Pro seat.
Items
A smart item takes a leading icon, a secondary description line, and a trailing slot for a badge or control. The free item is a plain label with an optional leading icon.
Grouping
The free tier separates runs of items with Dropdown.Separator. Pro adds Dropdown.Section + Dropdown.Header for labeled groups.
Sizes
Three sizes (xs, sm, md) set on the root cascade to radius, item height, label, and icon size. xs is the default.
As links
Give an item an href (and optional target) to render it as an anchor while keeping menu keyboard and focus behavior.
Disabled
Pass disabledKeys on the menu to disable rows; they are skipped by keyboard navigation.
Selection
Set selectionMode to single or multiple on the menu. Selected rows render a trailing check indicator; multi-select keeps the menu open.
Sorting
A single-select list that uses a leading Radio in place of the trailing check, with keyboard-shortcut hints in the footer.
Country picker
Dropdown.Popover takes header={<Dropdown.Search />} to pin a filter above the scrolling list; the menu filters by item textValue automatically. Grouped Popular / All sections hold single-select items with a leading flag and a trailing check.
Insert block
A command menu with a Pro upsell: a locked AI Block row and a footer pairing an "Unlock with Pro" badge with an upgrade button.
Footer
Dropdown.Footer pins a bar below the list with a top divider, for counts, buttons, or a version label.
User profile
A rich account menu: an avatar identity row, grouped settings with descriptions, an inline switch (shouldCloseOnSelect={false} keeps the menu open when you toggle it), and a version footer.
Assignee picker
A searchable multi-select with a leading Checkbox, member avatars, an empty state, and an apply/clear footer.
Token watchlist
Smart items with a brand icon, a price description, and a trailing holdings amount, grouped under section headers.
Accessibility
Dropdown inherits React Aria's menu keyboard model. The trigger is a single tab stop. Once the menu opens, arrow keys move focus between items, type-ahead jumps to a matching item, and Esc returns focus to the trigger.
ARIA notes:
- React Aria wires
role="menu"on the list,role="menuitem"(ormenuitemcheckbox/menuitemradiounder aselectionMode) on each item, andaria-haspopup/aria-expandedon the trigger. The popover manages focus while the menu is open. - Activating an item closes the menu by default. For a row that holds an interactive control (a switch, a stepper), pass
shouldCloseOnSelect={false}so interacting with it does not dismiss the popover. - Rows disabled through
disabledKeysreceivedata-disabledand are skipped by keyboard navigation. Always give an icon-only trigger anaria-label, and give aDropdown.Menuanaria-labelwhen it has no visible label. - For the full focus, collection, and typeahead behavior, see the React Aria Menu docs.
Styling
Tailwind override: pass className to merge Tailwind classes on Dropdown.Popover or any sub-part (merged via cn()):
Data slots and attributes: the component sets these for CSS targeting:
data-slot="dropdown-popover"on the surface,dropdown-menuon the list,dropdown-sectionon a group,dropdown-headeron a group label,dropdown-miscon the pinned top bar,dropdown-searchon the pinned search field,dropdown-separatoron a divider,dropdown-itemon a row,dropdown-item-label/dropdown-item-description/dropdown-item-container/dropdown-item-content/dropdown-item-indicator/dropdown-item-trailingon the item sub-parts, anddropdown-footeron the bottom bar.data-size="xs" | "sm" | "md"mirrors the root size on most slots;data-variant="default" | "danger"on the item.- React Aria manages
data-focused,data-selected,data-disabled, anddata-pressedon each item; the wrapper styles react throughgroup-data-[focused]/itemandgroup-data-[selected]/item.
Target a state in CSS:
Related Components
- Select: form-value picker bound to a
Field. Use it when the chosen value is what the form submits. - Context Menu: same menu shape, triggered by right-click (or long-press) on a region.
- Popover (Pro): arbitrary content with no menu semantics or roving focus.
- Command (Pro): a searchable command palette in a modal shell.
API Reference
The free tier exports Dropdown, Dropdown.Popover, Dropdown.Menu, Dropdown.Item, and Dropdown.Separator. The remaining parts (Dropdown.Section, Dropdown.Header, Dropdown.Misc, Dropdown.Search, Dropdown.Footer, and the item sub-parts) are Pro.
Dropdown
The root. Provides the size context and wires the trigger to the popover. Extends React Aria's MenuTriggerProps, so isOpen, defaultOpen, and onOpenChange pass through. Its children are the trigger element followed by a Dropdown.Popover.
Props
Variants
Dropdown.Popover
The floating surface. Extends React Aria's PopoverProps.
Props
Dropdown.Menu
The scrolling list. Extends React Aria's MenuProps, so all collection and selection props pass through.
Props
Dropdown.Item
A menu row. Extends React Aria's MenuItemProps (minus children), so id, textValue, href, target, isDisabled, onAction, and shouldCloseOnSelect pass through. Providing leading, description, trailing, or indicator opts into the smart layout.
Props
Variants
Dropdown.Separator
A thin divider between runs of items. Extends React Aria's SeparatorProps.
Props
Dropdown.Section (Pro)
Groups related items under a shared label. Extends React Aria's MenuSectionProps.
Props
Dropdown.Header (Pro)
The overline label at the top of a Dropdown.Section. Extends React Aria's HeaderProps.
Props
Dropdown.Misc (Pro)
Pins arbitrary static content above the scrolling list. For a filter, prefer Dropdown.Search.
Props
Dropdown.Search (Pro)
A pinned search field. Pass it to Dropdown.Popover's header prop; the menu then filters by item textValue through a React Aria Autocomplete (no query state to wire up). Reads its size from the Dropdown root. Extends React Aria's SearchFieldProps.
Props
Dropdown.Footer (Pro)
Pins a divided action bar below the list.
Props
Item parts (Pro)
The slots a smart Dropdown.Item builds from its leading, description, trailing, and indicator props. Compose them by hand only for a custom row, such as a leading Checkbox beside the media. Each accepts children and className.