Skip to content

Context Menu

Problem

A context menu needs positioning from pointer coordinates rather than a DOM trigger.

Solution

Use a virtual reference and start a positioner after rendering the menu.

ts
import { createPositioner, flip, offset, shift } from '@vielzeug/orbit';

document.addEventListener('contextmenu', (event) => {
  event.preventDefault();

  const reference = {
    getBoundingClientRect: () => ({ height: 0, width: 0, x: event.clientX, y: event.clientY }),
  };
  const positioner = createPositioner(reference, menu, {
    middleware: [offset(2), flip(), shift({ padding: 8 })],
    placement: 'bottom-start',
  });

  positioner.start();
});

Pitfalls

  • Dispose prior menu positioner before opening another menu.
  • Keep menu lifecycle separate from virtual-reference creation.