Skip to content

Context Menu

Displays a menu to the user—such as a set of actions or functions—triggered by right click.

Web Only

This component is only available for web frameworks (Vue, React, Angular). Right-click interaction is not available on mobile platforms.

Right click here

Installation

bash
npx @galaxy-stack/nebula-cli@latest add context-menu
bash
pnpm dlx @galaxy-stack/nebula-cli@latest add context-menu
bash
yarn dlx @galaxy-stack/nebula-cli@latest add context-menu
bash
bunx @galaxy-stack/nebula-cli@latest add context-menu
bash
# If you have installed galaxy-design globally
galaxy-design add context-menu

Usage

React

tsx
import {
  ContextMenu,
  ContextMenuTrigger,
  ContextMenuContent,
  ContextMenuItem,
  ContextMenuSeparator,
  ContextMenuShortcut,
} from "@/components/ui/context-menu"

export default function App() {
  return (
    <ContextMenu>
      <ContextMenuTrigger>Right click here</ContextMenuTrigger>
      <ContextMenuContent>
        <ContextMenuItem>
          Profile
          <ContextMenuShortcut>⌘P</ContextMenuShortcut>
        </ContextMenuItem>
        <ContextMenuItem>Settings</ContextMenuItem>
        <ContextMenuSeparator />
        <ContextMenuItem>Logout</ContextMenuItem>
      </ContextMenuContent>
    </ContextMenu>
  )
}

Vue

vue
<script setup lang="ts">
import {
  ContextMenu,
  ContextMenuTrigger,
  ContextMenuContent,
  ContextMenuItem,
  ContextMenuSeparator,
  ContextMenuShortcut,
} from '@/components/ui/context-menu'
</script>

<template>
  <ContextMenu>
    <ContextMenuTrigger>Right click here</ContextMenuTrigger>
    <ContextMenuContent>
      <ContextMenuItem>
        Profile
        <ContextMenuShortcut>⌘P</ContextMenuShortcut>
      </ContextMenuItem>
      <ContextMenuItem>Settings</ContextMenuItem>
      <ContextMenuSeparator />
      <ContextMenuItem>Logout</ContextMenuItem>
    </ContextMenuContent>
  </ContextMenu>
</template>

Angular

typescript
import { Component } from '@angular/core';
import { ContextMenuComponent } from '@/components/ui/context-menu';

@Component({
  selector: 'app-root',
  standalone: true,
  imports: [ContextMenuComponent],
  template: `
    <ui-context-menu>
      <div trigger>Right click here</div>
      <div content>
        <ui-context-menu-item>Profile</ui-context-menu-item>
        <ui-context-menu-item>Settings</ui-context-menu-item>
        <ui-context-menu-separator />
        <ui-context-menu-item>Logout</ui-context-menu-item>
      </div>
    </ui-context-menu>
  `
})
export class AppComponent {}

API Reference

Props

PropTypeDefaultDescriptionFrameworks
modalbooleantrueWhether outside interaction is disabled while the context menu is openReact, Vue, Angular
childrenReactNode-Context menu composition contentReact, Vue, Angular

Sub-components

ContextMenuTrigger

PropTypeDefaultDescriptionFrameworks
disabledbooleanfalseDisables the triggerReact, Vue, Angular
asChildbooleanfalseRender the trigger as a child elementReact, Vue

ContextMenuContent

PropTypeDefaultDescriptionFrameworks
side'top' | 'right' | 'bottom' | 'left''bottom'Preferred side for the menu contentReact, Vue, Angular
align'start' | 'center' | 'end''center'Alignment along the sideReact, Vue, Angular
sideOffsetnumber5Offset in pixels from the triggerReact, Vue, Angular
alignOffsetnumber0Offset in pixels from the alignment edgeReact, Vue, Angular
avoidCollisionsbooleantrueWhether to avoid collisions with viewport edgesReact, Vue, Angular
className / classstring-CSS class namesReact (className), Vue/Angular (class)

ContextMenuItem

PropTypeDefaultDescriptionFrameworks
disabledbooleanfalseDisables the itemReact, Vue, Angular
onSelect(event: Event) => void-Called when the item is selectedReact, Vue, Angular
textValuestring-Text value used for typeahead matchingReact, Vue, Angular
className / classstring-CSS class namesReact (className), Vue/Angular (class)

Vue

vue
<script setup lang="ts">
import {
  ContextMenu,
  ContextMenuTrigger,
  ContextMenuContent,
  ContextMenuItem
} from '@/components/ui'
</script>

<template>
  <ContextMenu>
    <ContextMenuTrigger>Right click here</ContextMenuTrigger>
    <ContextMenuContent>
      <ContextMenuItem>Profile</ContextMenuItem>
      <ContextMenuItem>Settings</ContextMenuItem>
      <ContextMenuItem>Logout</ContextMenuItem>
    </ContextMenuContent>
  </ContextMenu>
</template>

React

tsx
import {
  ContextMenu,
  ContextMenuTrigger,
  ContextMenuContent,
  ContextMenuItem
} from '@/components/ui'

export default function ContextMenuDemo() {
  return (
    <ContextMenu>
      <ContextMenuTrigger>Right click here</ContextMenuTrigger>
      <ContextMenuContent>
        <ContextMenuItem>Profile</ContextMenuItem>
        <ContextMenuItem>Settings</ContextMenuItem>
        <ContextMenuItem>Logout</ContextMenuItem>
      </ContextMenuContent>
    </ContextMenu>
  )
}

Angular

typescript
import { Component } from '@angular/core';
import { ContextMenuComponent, ContextMenuItemComponent } from '@/components/ui';

@Component({
  selector: 'app-context-menu-demo',
  standalone: true,
  imports: [ContextMenuComponent, ContextMenuItemComponent],
  template: `
    <ui-context-menu>
      <div trigger>Right click here</div>
      <div content>
        <ui-context-menu-item>Profile</ui-context-menu-item>
        <ui-context-menu-item>Settings</ui-context-menu-item>
        <ui-context-menu-item>Logout</ui-context-menu-item>
      </div>
    </ui-context-menu>
  `
})
export class ContextMenuDemoComponent {}

Accessibility

  • Keyboard Navigation: [TODO]
  • Screen Reader: [TODO]
  • Focus Management: [TODO]
  • WCAG Compliance: WCAG 2.1 Level AA compliant

Author

Bùi Trọng Hiếu (kevinbui)

License

MIT © 2025 Bùi Trọng Hiếu (kevinbui)

Released under the MIT License.