File actions
Offer context-specific commands on a file tile through right-click, keyboard, or long press.
Components / Overlays
A pointer-, keyboard-, and long-press-invoked menu positioned at the interaction point.
npx @getweini/cli@latest add context-menuOffer context-specific commands on a file tile through right-click, keyboard, or long press.
Apply commands to the exact item whose trigger opened the menu.
<ContextMenu :width="232" @select="runAction">
<ContextMenuTrigger class="rounded-ui bg-muted px-3 py-3 focus-visible:ring-2 focus-visible:ring-ring">
Project row
</ContextMenuTrigger>
<ContextMenuContent aria-label="Project actions">
<ContextMenuItem id="open" label="Open project"><template #prefix><OpenIcon aria-hidden="true" /></template>Open project<template #suffix><Kbd size="sm">↵</Kbd></template></ContextMenuItem>
<ContextMenuItem id="duplicate" label="Duplicate project">Duplicate project</ContextMenuItem>
<ContextMenuItem id="share" label="Copy project link">Copy project link</ContextMenuItem>
<ContextMenuSeparator />
<ContextMenuItem id="archive" label="Archive project" destructive>Archive project</ContextMenuItem>
</ContextMenuContent>
</ContextMenu>ContextMenuItem uses the installed context-menu child.
<script setup lang="ts">
import ContextMenu from './components/ui/context-menu/ContextMenu.vue'
import ContextMenuTrigger from './components/ui/context-menu/ContextMenuTrigger.vue'
import ContextMenuContent from './components/ui/context-menu/ContextMenuContent.vue'
import ContextMenuItem from './components/ui/context-menu/ContextMenuItem.vue'
</script>
<template>
<ContextMenu @select="$emit('fileAction', $event.id)">
<ContextMenuTrigger tabindex="0">Quarterly report.pdf</ContextMenuTrigger>
<ContextMenuContent aria-label="File actions">
<ContextMenuItem id="open" label="Open">Open</ContextMenuItem>
<ContextMenuItem id="duplicate" label="Duplicate">Duplicate</ContextMenuItem>
</ContextMenuContent>
</ContextMenu>
</template>Keep the destructive action distinct from ordinary commands.
<script setup lang="ts">
import ContextMenu from './components/ui/context-menu/ContextMenu.vue'
import ContextMenuTrigger from './components/ui/context-menu/ContextMenuTrigger.vue'
import ContextMenuContent from './components/ui/context-menu/ContextMenuContent.vue'
import ContextMenuItem from './components/ui/context-menu/ContextMenuItem.vue'
import ContextMenuSeparator from './components/ui/context-menu/ContextMenuSeparator.vue'
</script>
<template>
<ContextMenu :long-press-delay="700" @select="$emit('action', $event.id)">
<ContextMenuTrigger tabindex="0">Project card</ContextMenuTrigger>
<ContextMenuContent aria-label="Project actions">
<ContextMenuItem id="share" label="Share">Share</ContextMenuItem>
<ContextMenuSeparator />
<ContextMenuItem id="archive" label="Archive" destructive>Archive</ContextMenuItem>
</ContextMenuContent>
</ContextMenu>
</template>The most useful props, models, slots, events, and methods for this component.
| Name | Type | Default or requirement |
|---|---|---|
v-model:open / defaultOpen | boolean | false |
longPressDelay | number, ms | 600 |
dir | ltr | rtl | ltr |
Open the menu with right-click, the keyboard, or a long press. Add #prefix and #suffix content to action, checkbox, radio, and submenu items; shortcuts stay between the label and suffix.