Skip to content

Context Menu

A floating menu triggered by right-click (or long press on mobile). Displays contextual actions relevant to the clicked element.

Preview

Item types

TypeAppearance
DefaultStandard item with optional icon and shortcut
With iconLeading icon for identification
With shortcutRight-aligned keyboard hint
DividerHorizontal separator between groups
DisabledReduced opacity, non-interactive
DestructiveRed text and icon for dangerous actions

Props

PropTypeDefaultDescription
itemsContextMenuItem[]--Menu items
onSelect(value: string) => void--Item selection handler

ContextMenuItem

FieldTypeDescription
labelstringItem text
valuestringSelection value
iconReactNodeLeading icon
shortcutstringKeyboard shortcut
dangerbooleanDestructive styling
disabledbooleanDisabled state
dividerbooleanRender as divider

Code example

React

tsx
import { ContextMenu, ContextMenuTrigger } from '@thepace/lexicon/components';

<ContextMenuTrigger>
  <div className="file-card">Right-click me</div>
  <ContextMenu
    items={[
      { label: 'Edit', value: 'edit', shortcut: '⌘E' },
      { label: 'Duplicate', value: 'duplicate', shortcut: '⌘D' },
      { divider: true },
      { label: 'Delete', value: 'delete', danger: true, shortcut: '⌫' },
    ]}
    onSelect={handleAction}
  />
</ContextMenuTrigger>

Vanilla HTML

html
<div class="lex-context-menu" role="menu">
  <button class="lex-context-menu__item" role="menuitem">
    <svg class="lex-context-menu__icon"><!-- icon --></svg>
    <span class="lex-context-menu__label">Edit</span>
    <span class="lex-context-menu__shortcut">⌘E</span>
  </button>
  <div class="lex-context-menu__divider" role="separator"></div>
  <button class="lex-context-menu__item lex-context-menu__item--danger" role="menuitem">
    <span class="lex-context-menu__label">Delete</span>
  </button>
</div>

CSS class reference

ClassPurpose
.lex-context-menuFloating container
.lex-context-menu__itemMenu item
.lex-context-menu__item--dangerDestructive item
.lex-context-menu__item--disabledDisabled item
.lex-context-menu__iconLeading icon
.lex-context-menu__labelItem text
.lex-context-menu__shortcutKeyboard hint
.lex-context-menu__dividerSection separator

Accessibility

  • Container uses role="menu".
  • Items use role="menuitem".
  • Dividers use role="separator".
  • Arrow keys navigate items. Home/End jump to first/last.
  • Escape closes the menu and returns focus to the trigger.
  • Disabled items are skipped in keyboard navigation.

Guidelines

Do

  • Group related actions with dividers.
  • Place destructive actions at the bottom, separated by a divider.
  • Show keyboard shortcuts for power users.

Don't

  • Don't put more than 8–10 items — reorganise with sub-menus.
  • Don't use context menus as the only way to access actions.
  • Don't nest more than one level of sub-menus.

Released under the MIT License. A product by the pace.