Navigation

Dropdown Menu
v0.4.2
Ready for Production

A compact, accessible menu component for product interfaces with nested submenus, keyboard shortcuts, and professional styling. Built on Radix UI primitives.

Prefer AI-assisted development?

This documentation is available via the Catalyst MCP Server. Learn how to connect →

Catalyst Dropdown Menu extends Radix UI's DropdownMenu primitive with built-in design tokens, CVA size variants, and a danger prop — giving you a production-ready menu with keyboard navigation and accessible focus management out of the box.

Preview

Installation

npm install @pmi/catalyst-dropdown-menu
import {
  DropdownMenuRoot,
  DropdownMenuTrigger,
  DropdownMenuContent,
  DropdownMenuItem,
} from '@pmi/catalyst-dropdown-menu';

Sizes

Three sizes are available: sm, md (default), and lg.

Preview
Size: sm
Size: md
Size: lg

Common Patterns

With Arrow

Use DropdownMenuArrow inside DropdownMenuContent to render a visual pointer toward the trigger.

Preview

Account Menu

Preview

Account Menu with Profile Header

Preview

Help Center Menu

Preview

API Reference

Dropdown Menu is a compound component built on Radix UI primitives. The sections below summarize the Catalyst-specific API for each part.

Root container that manages open/closed state. Accepts all standard Radix DropdownMenu Root props and forwards ref.

Element that opens the menu. Accepts all standard Radix DropdownMenu Trigger props. Use asChild to render your own element.

Renders the menu into a portal. Accepts all standard Radix DropdownMenu Portal props.

The popover container for menu items. Forwards ref to the underlying element.

Prop

Type

Accepts all standard Radix DropdownMenu Content props (side, align, sideOffset, etc.).

An interactive menu item. Forwards ref to the underlying element.

Prop

Type

Accepts all standard Radix DropdownMenu Item props (disabled, onSelect, etc.).

A non-interactive label for grouping items. Forwards ref to the underlying element.

Prop

Type

A visual divider between groups. Forwards ref to the underlying element.

Prop

Type

Container for a nested submenu. Accepts all standard Radix DropdownMenu Sub props.

Trigger for a nested submenu. Forwards ref to the underlying element.

Prop

Type

Accepts all standard Radix DropdownMenu SubTrigger props (disabled, etc.).

Content panel for a nested submenu. Forwards ref to the underlying element.

Prop

Type

Accepts all standard Radix DropdownMenu SubContent props.

Optional visual arrow pointing to the trigger. Forwards ref to the underlying element.

Prop

Type

Accessibility

Dropdown Menu is designed to meet WCAG 2.2 AA standards. Keyboard behavior and ARIA semantics are inherited from Radix UI.

Keyboard Interactions

KeyAction
ArrowDownMoves focus to the next menu item
ArrowUpMoves focus to the previous menu item
ArrowRightOpens a submenu when focus is on a sub-trigger
ArrowLeftCloses the current submenu
EscapeCloses the menu and returns focus to trigger

ARIA

  • aria-haspopup="menu" and aria-expanded are automatically set on the trigger — inherited from Radix.
  • Each menu item has role="menuitem"; disabled items use aria-disabled="true".
  • Always provide a visible or visually-hidden label on icon-only triggers (e.g. <span className="sr-only">Show options</span>).
  • Group related items with DropdownMenuLabel and DropdownMenuSeparator for screen reader context.

See the Radix DropdownMenu accessibility docs for inherited baseline behavior.

Choosing the Right Component

Use Dropdown Menu when you need a list of actions triggered by a button click. Reach for a different primitive when:

If you need…Use instead
A menu triggered by right-clicking on an elementContext Menu
A navigational link list, not an action menuNavigation Menu
A small contextual overlay anchored to a trigger with custom contentPopover
Mutually exclusive option selectionSelect

On this page