Overview
Menu displays a list of actions or navigation options in a dropdown overlay. It’s triggered by a button and can contain interactive items, separators, groups, and nested submenus. Menus are ideal for presenting multiple related actions without cluttering the interface.Installation
Menu requires the Button component:
Usage
Basic Menu
Menu with Links
Menu items can be rendered as links for navigation.Destructive Menu Items
Use the destructive variant for items that perform irreversible actions.Menu Groups
Organize related menu items into labeled groups.Checkable Menu Items
Use checkbox and radio items for selections.Submenu
Create nested menus for hierarchical navigation.Props
Menu Props
| Prop | Type | Default | Description |
|---|---|---|---|
| aria-label | string | - | Accessible label for the menu (required) |
| element | string | 'MENU' | Customization element name |
MenuButton Props
| Prop | Type | Default | Description |
|---|---|---|---|
| element | string | 'MENU_BUTTON' | Customization element name |
MenuItem Props
| Prop | Type | Default | Description |
|---|---|---|---|
| href | string | - | Renders item as a link |
| variant | 'default' | 'destructive' | 'group_item' | 'default' | Visual variant of the item |
| disabled | boolean | false | Disables the menu item |
| element | string | 'MENU_ITEM' | Customization element name |
MenuItemCheckbox Props
| Prop | Type | Default | Description |
|---|---|---|---|
| checked | boolean | - | Checked state |
| onChange | function | - | Change handler |
| element | string | 'MENU_ITEM_CHECKBOX' | Customization element name |
MenuItemRadio Props
| Prop | Type | Default | Description |
|---|---|---|---|
| name | string | - | Radio group name |
| value | string | - | Radio value |
| checked | boolean | - | Checked state |
| onChange | function | - | Change handler |
| element | string | 'MENU_ITEM_RADIO' | Customization element name |
MenuGroup Props
| Prop | Type | Default | Description |
|---|---|---|---|
| label | string | - | Group label (required) |
| icon | ReactNode | - | Decorative icon |
| element | string | 'MENU_GROUP' | Customization element name |
MenuSeparator Props
| Prop | Type | Default | Description |
|---|---|---|---|
| element | string | 'MENU_SEPARATOR' | Customization element name |
SubMenuButton Props
| Prop | Type | Default | Description |
|---|---|---|---|
| element | string | 'SUB_MENU_BUTTON' | Customization element name |
useMenuState Hook
Manages menu state including visibility and keyboard navigation.- All state and methods needed for menu interaction
- Spread onto Menu, MenuButton, and MenuItem components
Best Practices
Do
- Use clear, action-oriented labels for menu items
- Group related items together with MenuGroup or separators
- Place destructive actions at the bottom, separated from other items
- Provide an aria-label for the Menu component
- Limit menu depth - avoid deeply nested submenus
- Use icons in MenuButton to indicate the menu (ChevronDown, More)
- Close the menu after an action is performed
Don’t
- Don’t use menus for primary navigation (use navigation components instead)
- Don’t put too many items in a single menu (consider submenus or alternative UI)
- Don’t use menu items as links when you can use direct navigation
- Don’t forget to handle menu item clicks
- Don’t use menus when a select component would be more appropriate
- Don’t nest menus more than 2 levels deep
Content Guidelines
- Use sentence case for menu items
- Keep labels concise (1-3 words)
- Use verbs for actions (Edit, Delete, Share)
- Use nouns for navigation (Settings, Profile, Help)
- Be specific (“Delete message” vs. “Delete”)
Accessibility
- Menu implements ARIA menu pattern with proper roles and states
- Keyboard navigation: Arrow keys to navigate, Enter/Space to select, Escape to close
- MenuButton sets aria-haspopup and aria-expanded appropriately
- Menu automatically manages focus when opened and closed
- Focus returns to MenuButton when menu closes
- Disabled items are skipped in keyboard navigation
- Checkable items announce their state to screen readers
- Submenus open on hover, focus, or arrow key press
Keyboard Support
| Key | Action |
|---|---|
| Enter / Space | Opens menu (on button), activates item (in menu) |
| Arrow Down | Opens menu (on button), moves focus to next item |
| Arrow Up | Opens menu (on button), moves focus to previous item |
| Arrow Right | Opens submenu |
| Arrow Left | Closes submenu |
| Escape | Closes menu |
| Home | Moves focus to first item |
| End | Moves focus to last item |
| Tab | Closes menu and moves focus to next focusable element |