vael-ui v0.3.10

Overlays

ContextMenu

A menu that opens at the pointer on right-click, replacing the native browser menu.

Install

import { ContextMenu } from 'vael-ui'

Playground

Right-click here
import { ContextMenu } from 'vael-ui'

<ContextMenu :disabled="false" longPress :longPressDelay="500" side="bottom" align="start" :sideOffset="2" :alignOffset="0" closeOnEsc closeOnOutside :forceMount="false" scrollFade :items="items">ContextMenu</ContextMenu>

Props

NameTypeDefaultDescription
itemsreadonly MenuEntry<T>[] | undefinedData-driven rows — same shape as Menu.vue's `items`.
disabledboolean | undefinedfalseSuppresses both the right-click and long-press triggers entirely.
longPressboolean | undefinedtrueLong-press (touch) as an additional trigger alongside the native `contextmenu` event.
longPressDelaynumber | undefined500Hold duration, in ms, before a touch press opens the menu.
side"top" | "right" | "bottom" | "left""bottom"Which corner of the cursor point the panel expands from. Default: top-left corner.
align"start" | "end" | "center""start"How the panel aligns against the cursor point along that side.
sideOffsetnumber | undefined2Gap between the cursor point and the panel, in pixels.
alignOffsetnumber | undefined0Shifts the panel along the alignment axis, in pixels.
closeOnEscboolean | undefinedtrueEscape key closes the menu.
closeOnOutsideboolean | undefinedtrueClicking outside the panel closes it.
beforeClose((done: () => void) => void) | undefinedCustom exit animation; call `done()` when it's complete. Delays the actual close/unmount until then.
forceMountboolean | undefinedfalseWhen true, presence is v-show-driven and owned by the consumer (e.g. AnimatePresence).
teleportTostring | HTMLElement | undefined"body"CSS selector or an actual DOM element — same contract as Vue's own Teleport `to`.
scrollFadeboolean | undefinedtrueMasks the panel's top/bottom edge as its content scrolls under it, signaling there's more.
uiPartial<{ positioner: UiPartValue; panel: UiPartValue; header: UiPartValue; footer: UiPartValue; }> | undefinedPer-instance part-class/style overrides.
openboolean | undefinedfalseWhether the menu is open.

Slots

NameTypeDescription
default{ open: boolean; }Arbitrary wrapped content — a card, a table row, an image. Right-click (or long-press on touch) opens the menu; ordinary interaction with it is untouched.
headeranyForwarded to Menu's own `#header`.
item{ item: T; }Override one data-driven row's content while keeping its behavior.
footeranyForwarded to Menu's own `#footer`.

Events

NameTypeDescription
open-change[value: boolean, details: PopoverOpenChangeDetails]
select[item: T]
update:open[value: boolean]

Exposed

NameTypeDescription
wrapperElunknownType inference unavailable — vue-component-meta cannot resolve defineExpose on this generic component.
anchorElunknownType inference unavailable — vue-component-meta cannot resolve defineExpose on this generic component.
panelElunknownType inference unavailable — vue-component-meta cannot resolve defineExpose on this generic component.
positionerElunknownType inference unavailable — vue-component-meta cannot resolve defineExpose on this generic component.
listElunknownType inference unavailable — vue-component-meta cannot resolve defineExpose on this generic component.
isClosingunknownType inference unavailable — vue-component-meta cannot resolve defineExpose on this generic component.
openAtunknownType inference unavailable — vue-component-meta cannot resolve defineExpose on this generic component.
closeunknownType inference unavailable — vue-component-meta cannot resolve defineExpose on this generic component.
cancelCloseunknownType inference unavailable — vue-component-meta cannot resolve defineExpose on this generic component.