Menu
A list of actions anchored to a trigger. Compose MenuContainer, MenuButton, and Menu — not DropdownMenu.
Default
MenuContainer owns open state. MenuButton is the trigger. Menu portals the list.
Prefix and suffix
Leading icon names the action. Suffix is reserved for a shortcut or status.
Disabled and locked
disabled greys the row. MenuItemLocked adds the lock mark for a plan-gated action.
Links
MenuLink always navigates. MenuItem with href also renders as an anchor.
Sections
MenuSection groups related rows. MenuDivider splits groups that do not need a title.
Width
Pass a number (px) or a CSS width string when the default 160px min is too tight for labels.
Position
Default is bottom-start. Set position on MenuContainer so every nested Menu inherits it.
Unstyled trigger
type unstyled drops the Button chrome when the trigger is an avatar row or a custom chip.
Best practices
- Use Menu when two or more related actions share one trigger. A single action is a Button. A URL change is MenuLink or ButtonLink.
- This port is
MenuContainer+MenuButton+Menu+MenuItem. Do not reach for DropdownMenu on new screens. - Destructive rows use
type="error"and sit last, under a divider. - Disable a row only when the action is impossible. Locked plan features use
MenuItemLocked, not a silent disabled item. - Keep labels short Title Case verbs:
Duplicate,Transfer. Prefix icons are optional; do not decorate every row.