Skip to content
Kappa
Context Menu
@dicehub/kappav0.4.2

Context Menu

Shows actions for the selected object at the pointer or keyboard context position.

No action selected
<script setup lang="ts">
import {
  ContextMenu,
  type ContextMenuSelectionDetails,
} from "@dicehub/kappa/components/context-menu";

const handleAction = (details: ContextMenuSelectionDetails) => {
  console.log(details.value);
};
</script>

<template>
  <ContextMenu.Root aria-label="Run actions" @select="handleAction">
    <ContextMenu.Trigger class="run-row">
      Run 4189
    </ContextMenu.Trigger>
    <ContextMenu.Content>
      <ContextMenu.Item value="open">Open results</ContextMenu.Item>
      <ContextMenu.Item value="copy">Copy run ID</ContextMenu.Item>
      <ContextMenu.Separator />
      <ContextMenu.Item value="delete" variant="destructive">
        Delete run
      </ContextMenu.Item>
    </ContextMenu.Content>
  </ContextMenu.Root>
</template>

Installation

Context Menu uses the same Ark UI menu behavior and Kappa styling as Dropdown. It provides a dedicated trigger for secondary actions without creating a second menu implementation.

Barrel

import {
  ContextMenu,
  type ContextMenuSelectionDetails,
} from "@dicehub/kappa";

Granular

import {
  ContextMenu,
  type ContextMenuSelectionDetails,
} from "@dicehub/kappa/components/context-menu";

Usage

Wrap one focusable target with Trigger. Use a unique value for every item. Handle commands from the root select event.

  • Right-click opens the menu at the pointer.
  • Shift+F10 or the Context Menu key opens it from the focused target.
  • Touch and pen input use the long-press behavior supplied by Ark UI.

Composition

Typical part hierarchy
ContextMenu.Root
├── ContextMenu.Trigger (pointer and keyboard target)
└── ContextMenu.Content
    ├── ContextMenu.Group
    │   ├── ContextMenu.Label
    │   ├── ContextMenu.Item
    │   ├── ContextMenu.CheckboxItem
    │   └── ContextMenu.RadioGroup
    │       └── ContextMenu.RadioItem
    ├── ContextMenu.Separator
    └── ContextMenu.Sub
        ├── ContextMenu.SubTrigger
        └── ContextMenu.SubContent

ContextMenu.Trigger is the context-trigger counterpart of Dropdown.Trigger. The other parts share Kappa's menu behavior, styles, item variants, and state contracts.

  • Use as-child when an existing button, row, or tree item must remain the semantic target.
  • Use LinkItem for navigation. Do not put a link inside Item.
  • Use Sub sparingly. Deep secondary navigation is difficult with pointer and touch input.
  • Keep primary actions visible. A context menu is an additional route, not the only route, to important commands.

Examples

Resource List

Give each resource its own menu so selection stays tied to the correct target.

No action selected
<ContextMenu.Root
  v-for="resource in resources"
  :key="resource.id"
  :aria-label="`${resource.name} actions`"
  @select="handleResourceAction(resource, $event.value)"
>
  <ContextMenu.Trigger as-child>
    <button type="button" class="resource-row">
      {{ resource.name }}
    </button>
  </ContextMenu.Trigger>
  <ContextMenu.Content>
    <ContextMenu.Item value="open">Open</ContextMenu.Item>
    <ContextMenu.Item value="rename">Rename</ContextMenu.Item>
    <ContextMenu.Item value="copy-path">Copy path</ContextMenu.Item>
  </ContextMenu.Content>
</ContextMenu.Root>

Tree View

Compose the trigger around each tree item or branch control so file actions stay available by pointer and keyboard.

Case files

No action selected
<TreeView.Root
  :collection="collection"
  :default-expanded-value="['case']"
>
  <TreeView.Tree>
    <TreeView.NodeProvider
      v-for="(node, index) in files"
      :key="node.value"
      :node="node"
      :index-path="[index]"
    >
      <ContextMenu.Root :aria-label="`${node.label} actions`">
        <ContextMenu.Trigger as-child>
          <TreeView.Item>
            <TreeView.ItemText>{{ node.label }}</TreeView.ItemText>
          </TreeView.Item>
        </ContextMenu.Trigger>
        <ContextMenu.Content>
          <ContextMenu.Item value="open">Open</ContextMenu.Item>
          <ContextMenu.Item value="rename">Rename</ContextMenu.Item>
          <ContextMenu.Item value="copy-path">Copy path</ContextMenu.Item>
        </ContextMenu.Content>
      </ContextMenu.Root>
    </TreeView.NodeProvider>
  </TreeView.Tree>
</TreeView.Root>

Use a submenu when an action needs a short second choice.

No action selected
<ContextMenu.Root aria-label="Mesh file actions">
  <ContextMenu.Trigger class="file-target">mesh.foam</ContextMenu.Trigger>
  <ContextMenu.Content>
    <ContextMenu.Item value="open">Open</ContextMenu.Item>
    <ContextMenu.Sub aria-label="Move destination">
      <ContextMenu.SubTrigger>Move to</ContextMenu.SubTrigger>
      <ContextMenu.SubContent>
        <ContextMenu.Item value="geometry">Geometry</ContextMenu.Item>
        <ContextMenu.Item value="results">Results</ContextMenu.Item>
      </ContextMenu.SubContent>
    </ContextMenu.Sub>
  </ContextMenu.Content>
</ContextMenu.Root>

Persistent Options

Checkbox and radio items remain open while related options change.

Hidden hidden · compact
<ContextMenu.Root aria-label="Tree view options">
  <ContextMenu.Trigger class="tree-target">Project files</ContextMenu.Trigger>
  <ContextMenu.Content>
    <ContextMenu.Group>
      <ContextMenu.Label>View</ContextMenu.Label>
      <ContextMenu.CheckboxItem v-model:checked="showHidden" value="hidden">
        Show hidden files
      </ContextMenu.CheckboxItem>
    </ContextMenu.Group>
    <ContextMenu.RadioGroup v-model="density">
      <ContextMenu.Label>Density</ContextMenu.Label>
      <ContextMenu.RadioItem value="compact">Compact</ContextMenu.RadioItem>
      <ContextMenu.RadioItem value="comfortable">Comfortable</ContextMenu.RadioItem>
    </ContextMenu.RadioGroup>
  </ContextMenu.Content>
</ContextMenu.Root>

Accessibility

  • The trigger must be keyboard focusable and have a clear accessible name.
  • Arrow keys move the active item. Home and End move to the first or last enabled item.
  • Escape closes the menu. A keyboard-opened menu restores focus to its trigger.
  • Disabled items remain visible but are skipped by keyboard navigation.
  • Item labels must describe the action without depending on an icon.

See the official Ark UI Menu documentation for the complete behavior contract.

API Reference

ContextMenu.Root

PropTypeDefaultDescription
ariaLabelstring—Accessible name mirrored to the menu surface.
open / defaultOpenbooleanfalseControlled or initial open state.
highlightedValue / defaultHighlightedValuestring—Controlled or initial highlighted item.
closeOnSelectbooleantrueCloses the menu after a normal item is selected.
dir"ltr" | "rtl"inheritedReading direction for placement and keyboard behavior.
positioningPositioningOptionsfixed cursor anchorCollision and viewport positioning options.

Parts

PartElementDescription
ContextMenu.Root / RootProvidernoneOwns open, highlight, selection, and positioning state.
ContextMenu.TriggerbuttonOpens at the pointer, or near the target with Shift+F10 or the Context Menu key.
ContextMenu.ContentdivPortalled menu surface positioned at the interaction point.
ContextMenu.Item / LinkItemdiv / aAction and navigation menu items.
ContextMenu.CheckboxItemdivBoolean option that stays open by default.
ContextMenu.RadioGroup / RadioItemdivSingle-choice option group.
ContextMenu.Group / Label / SeparatordivMenu structure and visible grouping.
ContextMenu.Sub / SubTrigger / SubContentmixedNested context actions with pointer-intent handling.
ContextMenu.ShortcutspanVisual keyboard hint. It does not register a shortcut.

Events

EventPayloadDescription
selectContextMenuSelectionDetailsAn item was selected; details.value identifies it.
openChange / update:opendetails / booleanThe menu opened or closed.
highlightChangeContextMenuHighlightChangeDetailsThe roving highlight changed.
escapeKeyDownKeyboardEventEscape was pressed while the menu was open.
interactOutsideContextMenuInteractOutsideEventPointer or focus input occurred outside the menu.

Exports

ExportDescription
ContextMenu / ContextMenuRootCompound root and named root export.
ContextMenuTrigger / Content / Item / Sub*Named exports for compound parts.
ContextMenuProps / ContextMenu*PropsPublic root and part contracts.
CONTEXT_MENU_ITEM_VARIANTSDefault and destructive item variants.
CONTEXT_MENU_DEFAULT_POSITIONINGFixed viewport positioning defaults for pointer-anchored menus.
useContextMenu / useContextMenuContextArk UI menu hooks under Context Menu names.
contextMenuAnatomyArk UI menu anatomy under the Context Menu name.