VayuUI

Context Menu

A right-click context menu with items, checkbox items, radio groups, sub-menus, separators, and labels. Fully keyboard-accessible with ARIA roles.

Usage

Right-click the area below to open the context menu.

Keyboard shortcuts:

  • ↑/↓ arrows to navigate
  • → to open submenu
  • ← to close submenu
  • Type to search items
  • Home/End to jump
Right-click here

Current State:

Show Bookmarks: true

Show URLs: false

Assignee: andy

import { ContextMenu } from "@/components/ui/contextmenu"

export function Example() {
  return (
    <ContextMenu>
      <ContextMenu.Trigger>
        <div>Right-click here</div>
      </ContextMenu.Trigger>
      <ContextMenu.Content>
        <ContextMenu.Item onSelect={() => console.log("Cut")}>
          Cut
        </ContextMenu.Item>
        <ContextMenu.Separator />
        <ContextMenu.CheckboxItem checked onCheckedChange={() => {}}>
          Show Bookmarks
        </ContextMenu.CheckboxItem>
      </ContextMenu.Content>
    </ContextMenu>
  )
}

Installation

src/components/ui/contextmenu.tsx
// Copy the full component code

Features

  • Right-click trigger with disabled state
  • Portal-rendered menu with viewport clamping
  • Menu items with icons, keyboard shortcuts, and destructive style
  • Checkbox items with aria-checked
  • Radio groups with aria-checked
  • Sub-menus with hover & keyboard navigation (ArrowRight / ArrowLeft)
  • Labels and separators
  • role="menu", role="menuitem", role="menuitemcheckbox", role="menuitemradio", role="separator"
  • Enter / Space key activation on all items
  • Escape to close

Sub-components

ComponentDescription
ContextMenuRoot wrapper
ContextMenu.TriggerRight-click target area
ContextMenu.ContentPortal-rendered menu container
ContextMenu.ItemStandard menu item
ContextMenu.CheckboxItemToggleable checkbox item
ContextMenu.RadioGroupRadio selection group
ContextMenu.RadioItemRadio option
ContextMenu.SubSub-menu wrapper
ContextMenu.SubTriggerSub-menu trigger with arrow indicator
ContextMenu.SubContentSub-menu content
ContextMenu.SeparatorVisual divider
ContextMenu.LabelNon-interactive heading

Props

ContextMenu

PropTypeDefaultDescription
onOpenChange(open: boolean) => voidCallback when menu opens/closes

ContextMenu.Trigger

PropTypeDefaultDescription
disabledbooleanfalseDisable right-click

ContextMenu.Content

PropTypeDefaultDescription
alignstart | center | endstartAlignment
sideOffsetnumber4Offset from cursor

ContextMenu.Item

PropTypeDefaultDescription
onSelect() => voidSelection callback
disabledbooleanfalseDisable item
destructivebooleanfalseRed destructive styling
iconReactNodeLeading icon
shortcutstringTrailing shortcut label

ContextMenu.CheckboxItem

PropTypeDefaultDescription
checkedbooleanfalseChecked state
onCheckedChange(checked: boolean) => voidToggle callback
disabledbooleanfalseDisable item

ContextMenu.RadioGroup

PropTypeDefaultDescription
valuestringSelected value
onValueChange(value: string) => voidSelection callback

ContextMenu.RadioItem

PropTypeDefaultDescription
valuestringOption value
disabledbooleanfalseDisable item

On this page