Pho Design System

Context Menu

Actions for a specific element, opened by right-click (or long-press). Built on Base UI ContextMenu; the popup shares its look and keyboard behavior with Menu. Because it’s hidden until invoked, a context menu is always a shortcut — mirror its actions somewhere visible.

Import

import { ContextMenu } from "@photon-ai/pho-ui/components/context-menu";

Basic

ContextMenu.Trigger wraps the area that responds to right-click; the popup opens at the pointer. The rest mirrors MenuItems, a Separator, and color="destructive" for a destructive action.

Right-click anywhere in this area
<ContextMenu.Root>
  <ContextMenu.Trigger className="…">Right-click here</ContextMenu.Trigger>
  <ContextMenu.Portal>
    <ContextMenu.Positioner>
      <ContextMenu.Popup>
        <ContextMenu.Item>Copy</ContextMenu.Item>
        <ContextMenu.Item>Paste</ContextMenu.Item>
        <ContextMenu.Separator />
        <ContextMenu.Item color="destructive">Delete</ContextMenu.Item>
      </ContextMenu.Popup>
    </ContextMenu.Positioner>
  </ContextMenu.Portal>
</ContextMenu.Root>

Groups and submenus

Cluster related actions under a ContextMenu.Group with a GroupLabel, and nest a ContextMenu.SubmenuRoot for a second level. The submenu opens on hover or Arrow Right and shares the parent’s styling.

Right-click for grouped actions
<ContextMenu.Popup>
  <ContextMenu.Group>
    <ContextMenu.GroupLabel>Edit</ContextMenu.GroupLabel>
    <ContextMenu.Item>Copy</ContextMenu.Item>
    <ContextMenu.Item>Paste</ContextMenu.Item>
  </ContextMenu.Group>
  <ContextMenu.Separator />
  <ContextMenu.SubmenuRoot>
    <ContextMenu.SubmenuTrigger>
      Share
      <CaretRight className="ml-auto" />
    </ContextMenu.SubmenuTrigger>
    <ContextMenu.Portal>
      <ContextMenu.Positioner>
        <ContextMenu.Popup>
          <ContextMenu.Item>Copy link</ContextMenu.Item>
          <ContextMenu.Item>Email</ContextMenu.Item>
        </ContextMenu.Popup>
      </ContextMenu.Positioner>
    </ContextMenu.Portal>
  </ContextMenu.SubmenuRoot>
</ContextMenu.Popup>

Anatomy

Props

Every part also accepts className and render — Base UI’s prop for swapping the element it renders. ContextMenu reuses Menu’s parts, so Item, Positioner, and the submenu parts take the same props documented on Menu.

ContextMenu.Root (holds state; renders no element)

A context menu is always modal, so — unlike Menu — it has no modal, openOnHover, or delay prop.

ContextMenu.Trigger (<div>)

ContextMenu.Positioner (<div>)

ContextMenu.Item (<div role="menuitem">)

Accessibility

Best practices