Components

ContextMenu

Right-click context menu with items, checkboxes, radio items, separators, and submenus.

Category: Overlay — Pattern: Base UI ContextMenu

Dependency: @base-ui-components/react/context-menu, @base-ui-components/react/menu

Preview

Right-click here
import {
  ContextMenu,
  ContextMenuTrigger,
  ContextMenuContent,
  ContextMenuItem,
  ContextMenuLabel,
  ContextMenuSeparator,
  ContextMenuShortcut,
} from "@hareru/ui"

<ContextMenu>
  <ContextMenuTrigger>
    <div style={{ padding: "2rem", border: "1px dashed gray" }}>
      Right-click here
    </div>
  </ContextMenuTrigger>
  <ContextMenuContent>
    <ContextMenuLabel>Edit</ContextMenuLabel>
    <ContextMenuSeparator />
    <ContextMenuItem>
      Cut <ContextMenuShortcut>Ctrl+X</ContextMenuShortcut>
    </ContextMenuItem>
    <ContextMenuItem>
      Copy <ContextMenuShortcut>Ctrl+C</ContextMenuShortcut>
    </ContextMenuItem>
    <ContextMenuItem>
      Paste <ContextMenuShortcut>Ctrl+V</ContextMenuShortcut>
    </ContextMenuItem>
  </ContextMenuContent>
</ContextMenu>

Import

import {
  ContextMenu,
  ContextMenuTrigger,
  ContextMenuContent,
  ContextMenuItem,
  ContextMenuCheckboxItem,
  ContextMenuRadioItem,
  ContextMenuLabel,
  ContextMenuSeparator,
  ContextMenuShortcut,
  ContextMenuGroup,
  ContextMenuSub,
  ContextMenuSubTrigger,
  ContextMenuSubContent,
} from "@hareru/ui"

Exports

NameTypeDescription
ContextMenuComponentRoot context menu provider
ContextMenuTriggerComponentRight-click target area; renders <div> by default, supports asChild
ContextMenuContentComponentFloating menu panel
ContextMenuItemComponentClickable menu item; accepts inset prop
ContextMenuCheckboxItemComponentMenu item with a checkbox; accepts checked and onCheckedChange
ContextMenuRadioItemComponentMenu item within a radio group
ContextMenuLabelComponentNon-interactive section label; accepts inset prop
ContextMenuSeparatorComponentVisual divider between sections
ContextMenuShortcutComponentKeyboard shortcut hint (right-aligned text)
ContextMenuGroupComponentSemantic grouping wrapper
ContextMenuSubComponentSubmenu root context
ContextMenuSubTriggerComponentItem that opens a submenu; accepts inset prop
ContextMenuSubContentComponentFloating panel for the submenu

Key Props

PropTypeComponentDescription
asChildbooleanTriggerRender as the child element instead of a <div>
insetbooleanItem, Label, SubTriggerAdds left padding to align with items that have icons

Structure

  • ContextMenuTrigger [trigger] (expected)
  • ContextMenuContent [content] (expected)
    • ContextMenuItem [item] ×N
      • ContextMenuShortcut [description]
    • ContextMenuCheckboxItem [item] ×N
    • ContextMenuRadioGroup [container] ×N
      • ContextMenuRadioItem [item] ×N
    • ContextMenuLabel [label]
    • ContextMenuSeparator [separator] ×N
    • ContextMenuGroup [container] ×N
    • ContextMenuSub [submenu] ×N
      • ContextMenuSubTrigger [trigger]
      • ContextMenuSubContent [content]

(expected) = recommended in canonical composition, not runtime-required.

Accessibility

  • Roles: menu
  • Keyboard:
    • Arrow keys to navigate items
    • Enter to select
    • Escape to close
  • Notes: ARIA menu pattern provided by Base UI. Opens on right-click or long-press.

Usage

import {
  ContextMenu,
  ContextMenuTrigger,
  ContextMenuContent,
  ContextMenuItem,
  ContextMenuLabel,
  ContextMenuSeparator,
  ContextMenuShortcut,
} from "@hareru/ui"

<ContextMenu>
  <ContextMenuTrigger>
    <div style={{ padding: "2rem", border: "1px dashed gray" }}>
      Right-click here
    </div>
  </ContextMenuTrigger>
  <ContextMenuContent>
    <ContextMenuLabel>Edit</ContextMenuLabel>
    <ContextMenuSeparator />
    <ContextMenuItem>
      Cut <ContextMenuShortcut>Ctrl+X</ContextMenuShortcut>
    </ContextMenuItem>
    <ContextMenuItem>
      Copy <ContextMenuShortcut>Ctrl+C</ContextMenuShortcut>
    </ContextMenuItem>
    <ContextMenuItem>
      Paste <ContextMenuShortcut>Ctrl+V</ContextMenuShortcut>
    </ContextMenuItem>
    <ContextMenuSeparator />
    <ContextMenuItem>Delete</ContextMenuItem>
  </ContextMenuContent>
</ContextMenu>

Notes

  • ContextMenuTrigger renders a <div> by default (unlike DropdownMenuTrigger which renders a <button>). Use asChild to wrap an existing element.
  • The hui-context-menu__trigger BEM class is always applied to the trigger, with or without asChild.
  • ContextMenuCheckboxItem and ContextMenuRadioItem manage their own internal state when used uncontrolled. Pass checked / onCheckedChange for controlled usage.
  • ContextMenuRadioItem must be nested inside a ContextMenuRadioGroup with a value prop.
  • ContextMenuShortcut is purely decorative; keyboard shortcuts must be registered separately in your application.
  • The menu opens on right-click (desktop) or long-press (mobile).

On this page