Context Menu ^0.1.23
Right-click contextual menu with the same look and feel as the Dropdown Menu — positioned at cursor, viewport-aware, keyboard-navigable (arrows, Enter, Home/End, Escape), and auto-closes on outside click, scroll, or resize.
Re-uses all of the Dropdown Menu sub-components — VxContextMenuItem, VxContextMenuLabel, VxContextMenuSeparator, VxContextMenuShortcut, VxContextMenuGroup.
1. Basic
Right-click anywhere inside the card.
<script setup lang="ts">
import { VxContextMenu, VxContextMenuItem, VxContextMenuSeparator } from 'veloxui'
</script>
<template>
<VxContextMenu>
<div>Right-click here</div>
<template #menu>
<VxContextMenuItem @select="newFile">New file</VxContextMenuItem>
<VxContextMenuItem @select="newFolder">New folder</VxContextMenuItem>
<VxContextMenuSeparator />
<VxContextMenuItem @select="refresh">Refresh</VxContextMenuItem>
</template>
</VxContextMenu>
</template>2. With icons and shortcuts
Icons align to the left, shortcuts push to the right.
<VxContextMenu>
<div>Right-click here</div>
<template #menu>
<VxContextMenuItem @select="cut">
<CutIcon /> Cut <VxContextMenuShortcut>⌘X</VxContextMenuShortcut>
</VxContextMenuItem>
</template>
</VxContextMenu>3. With labels and groups
Group related actions with a label and separators.
<VxContextMenu>
<div>Right-click me</div>
<template #menu>
<VxContextMenuLabel>File — report.pdf</VxContextMenuLabel>
<VxContextMenuSeparator />
<VxContextMenuGroup>
<VxContextMenuItem>Open</VxContextMenuItem>
<VxContextMenuItem>Open with…</VxContextMenuItem>
</VxContextMenuGroup>
</template>
</VxContextMenu>4. Destructive actions
Highlight destructive actions with the destructive prop.
<VxContextMenuItem destructive @select="del">
Delete <VxContextMenuShortcut>⌫</VxContextMenuShortcut>
</VxContextMenuItem>5. Disabled items
Items with disabled are greyed out and ignored by keyboard navigation.
<VxContextMenuItem :disabled="!canPaste" @select="paste">Paste</VxContextMenuItem>6. File list — per-row context menu
A typical file browser pattern — each row has its own context menu.
<VxContextMenu v-for="f in files" :key="f.id">
<FileRow :file="f" />
<template #menu>
<VxContextMenuItem @select="open(f)">Open</VxContextMenuItem>
<VxContextMenuItem destructive @select="del(f)">Delete</VxContextMenuItem>
</template>
</VxContextMenu>7. Text selection — formatting menu
Real-world example: a rich-text area with context actions.
<VxContextMenu>
<RichTextArea v-model="text" />
<template #menu>
<VxContextMenuItem @select="wrap('**', '**')">Bold</VxContextMenuItem>
<VxContextMenuItem @select="wrap('*', '*')">Italic</VxContextMenuItem>
</template>
</VxContextMenu>8. Viewport edge — auto-flip
The menu stays on-screen by flipping horizontally, vertically, or both when it would otherwise spill over a viewport edge. Try right-clicking anywhere inside the cards below — especially near the right or bottom edge of your viewport — and use the corner buttons to jump to the actual viewport corners.
right-click anywhere inside
right-click near the right edge
<script setup lang="ts">
import { ref } from 'vue'
const menu = ref<InstanceType<typeof VxContextMenu>>()
function openAtCorner(pos: 'tl' | 'tr' | 'bl' | 'br') {
const pad = 6
const x = pos === 'tl' || pos === 'bl' ? pad : window.innerWidth - pad
const y = pos === 'tl' || pos === 'tr' ? pad : window.innerHeight - pad
menu.value?.open({ clientX: x, clientY: y })
}
</script>
<template>
<VxContextMenu ref="menu">
<div>Right-click here — menu flips automatically near viewport edges</div>
<template #menu>
<VxContextMenuItem>Action 1</VxContextMenuItem>
<VxContextMenuItem>Action 2</VxContextMenuItem>
</template>
</VxContextMenu>
</template>Props
| Name | Type | Default | Description |
|---|---|---|---|
disabled | boolean | false | Disable the context menu entirely (browser's default menu will show). |
width | string | '' | Optional fixed width for the menu (e.g. '200px'). |
triggerClass | ClassBinding | '' | Class(es) on the trigger wrapper. |
contentClass | ClassBinding | '' | Class(es) on the menu content. |
Events
| Name | Payload | Description |
|---|---|---|
open | MouseEvent | The menu was opened — the original right-click event is forwarded. |
close | — | The menu was closed (click outside, Escape, item select, scroll, etc.). |
Slots
| Name | Description |
|---|---|
default | The trigger — the element users right-click on. |
menu | The menu content. Use VxContextMenuItem, VxContextMenuLabel, VxContextMenuSeparator, VxContextMenuShortcut, VxContextMenuGroup. |
Exposed methods
Accessible via a template ref.
| Name | Signature | Description |
|---|---|---|
open | (e: { clientX, clientY }) => void | Programmatically open the menu at a given screen position. |
close | () => void | Close the menu. |
isOpen | () => boolean | Current open state. |
Sub-components
The context menu shares its item components with the Dropdown Menu — the visual styling is identical.
| Component | Props | Notes |
|---|---|---|
VxContextMenuItem | disabled, destructive, inset | Emits select when clicked. |
VxContextMenuLabel | inset | Non-interactive label / section header. |
VxContextMenuSeparator | — | Divider line. |
VxContextMenuShortcut | — | Muted label aligned to the right of an item. |
VxContextMenuGroup | — | Logical grouping (no visual effect). |