Skip to content

Menu

Menu

<MenuTrigger>
<IconButton aria-label="Options"><DotsIcon /></IconButton>
<Menu>
<MenuItem onAction={() => {/* … */}}>Edit</MenuItem>
<MenuItem shortcut="⌘D">Duplicate</MenuItem>
<MenuSeparator />
<MenuItem destructive>Delete</MenuItem>
</Menu>
</MenuTrigger>

Install: @helixui/core

import { Menu, MenuItem, MenuTrigger, MenuSeparator, SubmenuTrigger } from '@helixui/core'

status: stable · since: 0.1.0

Tags: floating, menu, dropdown, actions

Anatomy

[ trigger ▾ ]
┌────────────────┐
│ • Edit │
│ • Duplicate │
│ ───────────── │
│ • Delete ⌘⌫ │
└────────────────┘

Layout

  • displayportal
  • widthcontent
  • heightcontent
  • intrinsicSizeanchored to trigger, max-h with scroll
  • stackablefalse
  • fullBleedfalse

Visual

A floating panel anchored to its trigger. Items are rows with optional leading icon, label, and trailing kbd shortcut. Separators are 1px hairlines. Submenu items show a trailing chevron.

Props

NameTypeDefaultDescription
placement'top' | 'bottom' | 'start' | 'end'bottomAnchor placement.
selectionMode'none' | 'single' | 'multiple'noneSelection model. none for command menus.
...restMenuProps from react-aria-componentsAll forwarded.

Slots

  • MenuTrigger children — the trigger button + Menu
  • Menu children — MenuItem, MenuSeparator, SubmenuTrigger

Tokens used

color.bg.surface.default, color.bg.action.neutral.default, color.bg.action.neutral.hover, color.bg.action.danger.subtle, color.border.default, color.text.primary, color.text.muted, color.text.action.danger, radius.md, space.1, space.2, space.3, space.4, font.family.sans, font.size.sm, font.size.xs, shadow.md

Accessibility

Role: menu

Keyboard

KeyAction
ArrowDownMove down.
ArrowUpMove up.
ArrowRightOpen submenu.
ArrowLeftClose submenu.
EnterActivate item.
EscapeClose menu.

Notes

  • For destructive items, set destructive — color shifts to danger and the focused background lightens to danger.subtle.

Composes with

ComponentRelationNote
ButtontriggerCommon opener (MenuTrigger).
IconButtontriggerCommon opener for icon-only triggers.
CommandPalettealternativeCommandPalette is global ⌘K; Menu is anchored.
Popoversibling
Dialogsibling

Prompt examples

These are the AI prompt → JSX mappings used by the helixui prompt DSL and integrations like Cursor / Claude Code.

context menu

“three-dot menu with Edit, Duplicate, Delete”

<MenuTrigger>
<IconButton aria-label="More"><MoreIcon /></IconButton>
<Menu>
<MenuItem onAction={edit}>Edit</MenuItem>
<MenuItem onAction={dup}>Duplicate</MenuItem>
<MenuSeparator />
<MenuItem onAction={remove}>Delete</MenuItem>
</Menu>
</MenuTrigger>