Menu
Actions or options in a popover: icons, shortcuts, destructive items, sections, submenus, check/radio selection.
When to use
- Row and record actions behind a "more" button.
- Display options (group by, visible properties) with selection.
- Right-click menus via ContextMenu — always mirrored in a visible menu.
Consider an alternative
- Choosing a form value — use Select or ComboBox.
- Searching many commands — use Command.
- Navigation between pages — use links.
Import
import { Menu } from '@revido-llc/kit';Keyboard interaction
- Enter / Space / ArrowDown on the trigger — open
- ArrowUp / ArrowDown — move
- ArrowRight — open submenu
- Type a letter — jump to item
- Enter — run
- Escape — close
Props
Props documented by the Kit. Refer to the TypeScript types for the complete interface, including inherited props.
Related exports
MenuTrigger, MenuItem, MenuSection, MenuSeparator, SubmenuTrigger, ContextMenu, useContextMenu
Examples
Row actions
Leading icons, trailing shortcuts, destructive last and separated.
<MenuTrigger>
<Button variant="ghost" size="icon" aria-label="More actions"><Ellipsis /></Button>
<Menu onAction={(key) => run(key)}>
<MenuItem id="edit" leading={{ kind: "icon", icon: <Pencil /> }} shortcut="E">Edit</MenuItem>
<SubmenuTrigger>
<MenuItem>Move to</MenuItem>
<Menu>…</Menu>
</SubmenuTrigger>
<MenuSeparator />
<MenuItem id="delete" leading={{ kind: "icon", icon: <Trash2 /> }} tone="danger">Delete</MenuItem>
</Menu>
</MenuTrigger>Icon labels
Use `leading` for shared option icons. Rich children also stay on one line and keep text truncation.
<MenuItem leading={{ kind: "icon", icon: <Pencil /> }}>Edit</MenuItem>
<MenuItem leading={{ kind: "icon", icon: <Copy /> }}>Copy link</MenuItem>Selection
Single selection uses a trailing check; multiple selection uses a leading checkbox, per section.
<Menu aria-label="Display options">
<MenuSection title="Group by" selectionMode="single" selectedKeys={groupBy} onSelectionChange={setGroupBy}>
<MenuItem id="status">Status</MenuItem>
</MenuSection>
</Menu>Context menu
Right-click the card. Mirror these actions in a visible menu.
const menu = useContextMenu();
<div {...menu.triggerProps}>…</div>
<ContextMenu {...menu.menuProps} onAction={run}>
<MenuItem id="open">Open</MenuItem>
</ContextMenu>Literal anatomy 1
Static component anatomy; bind events in the consuming app.
<MenuTrigger><Button variant="outline">Actions</Button><Menu aria-label="Draft actions"><MenuSection title="Draft"><MenuItem id="open">Open</MenuItem></MenuSection><MenuSeparator /><SubmenuTrigger><MenuItem id="more">More</MenuItem><Menu aria-label="More actions"><MenuItem id="archive">Archive</MenuItem></Menu></SubmenuTrigger></Menu></MenuTrigger>Literal anatomy 2
Static component anatomy; bind events in the consuming app.
<ContextMenu position={{ x: 0, y: 0 }}><MenuItem id="open">Open</MenuItem></ContextMenu>