Context Menu
Displays a menu located at the pointer, triggered by a right-click or a long-press.
Preview
Installation
npx sigma-ui@latest add context-menuUsage
<script setup lang="ts">
import {
ContextMenu,
ContextMenuContent,
ContextMenuItem,
ContextMenuTrigger,
} from '@/components/ui/context-menu';
</script>
<template>
<ContextMenu>
<ContextMenuTrigger>Right click</ContextMenuTrigger>
<ContextMenuContent>
<ContextMenuItem>Profile</ContextMenuItem>
<ContextMenuItem>Billing</ContextMenuItem>
<ContextMenuItem>Team</ContextMenuItem>
<ContextMenuItem>Subscription</ContextMenuItem>
</ContextMenuContent>
</ContextMenu>
</template><ContextMenuTrigger>is the area that opens the menu on right-click or long-press.- Use
<ContextMenuCheckboxItem>withv-modeland<ContextMenuRadioGroup>/<ContextMenuRadioItem>for items with a checked state. - Nest
<ContextMenuSub>,<ContextMenuSubTrigger>and<ContextMenuSubContent>to build submenus.
Examples
Shortcuts, Submenus and Checkable Items
Combines <ContextMenuShortcut>, a submenu, checkbox items and a radio group in one menu.
<script setup lang="ts">
import { ref } from 'vue';
import {
ContextMenu,
ContextMenuCheckboxItem,
ContextMenuContent,
ContextMenuItem,
ContextMenuLabel,
ContextMenuRadioGroup,
ContextMenuRadioItem,
ContextMenuSeparator,
ContextMenuShortcut,
ContextMenuSub,
ContextMenuSubContent,
ContextMenuSubTrigger,
ContextMenuTrigger,
} from '@/components/ui/context-menu';
const showBookmarks = ref(true);
const person = ref('pedro');
</script>
<template>
<ContextMenu>
<ContextMenuTrigger>Right click</ContextMenuTrigger>
<ContextMenuContent>
<ContextMenuItem>
Back
<ContextMenuShortcut>⌘[</ContextMenuShortcut>
</ContextMenuItem>
<ContextMenuSub>
<ContextMenuSubTrigger>More Tools</ContextMenuSubTrigger>
<ContextMenuSubContent>
<ContextMenuItem>Save Page As...</ContextMenuItem>
<ContextMenuItem>Developer Tools</ContextMenuItem>
</ContextMenuSubContent>
</ContextMenuSub>
<ContextMenuSeparator />
<ContextMenuCheckboxItem v-model="showBookmarks">
Show Bookmarks Bar
</ContextMenuCheckboxItem>
<ContextMenuSeparator />
<ContextMenuLabel>People</ContextMenuLabel>
<ContextMenuRadioGroup v-model="person">
<ContextMenuRadioItem value="pedro">
Pedro Duarte
</ContextMenuRadioItem>
<ContextMenuRadioItem value="colm">
Colm Tuite
</ContextMenuRadioItem>
</ContextMenuRadioGroup>
</ContextMenuContent>
</ContextMenu>
</template>API Reference
ContextMenu
Props
| Prop | Type | Default |
|---|---|---|
pressOpenDelayThe duration from when the trigger is pressed until the menu opens. | number | 700 |
openThe controlled open state of the menu. Can be used as | boolean | - |
dirThe reading direction of the combobox when applicable. If omitted, inherits globally from | Direction$4 | - |
modalThe modality of the dropdown menu. When set to | boolean | - |
Events
| Event | Payload |
|---|---|
update:open | [payload: boolean] |
Slots
| Slot | Scope |
|---|---|
defaultThe content of the component. | - |
ContextMenuTrigger
Props
| Prop | Type | Default |
|---|---|---|
disabledWhen Note that this will also restore the native context menu. | boolean | - |
asChildChange the default rendered element for the one passed as a child, merging their props and behavior. Read our Composition guide for more details. | boolean | - |
asThe element or component this component should render as. Can be overwritten by | AsTag | Component | "div" |
Slots
| Slot | Scope |
|---|---|
defaultThe content of the component. | - |
ContextMenuContent
Props
| Prop | Type | Default |
|---|---|---|
asChildChange the default rendered element for the one passed as a child, merging their props and behavior. Read our Composition guide for more details. | boolean | - |
asThe element or component this component should render as. Can be overwritten by | AsTag | Component | "div" |
forceMountUsed to force mounting when more control is needed. Useful when controlling animation with Vue animation libraries. | boolean | - |
loopWhen | boolean | false |
referenceThe custom element or virtual element that will be set as the reference to position the floating element. If provided, it will replace the default anchor element. | ReferenceElement | - |
memoDependenciesReactive dependencies that should invalidate the memoized content subtree. | unknown[] | - |
sideFlipFlip to the opposite side when colliding with boundary. | boolean | true |
alignOffsetAn offset in pixels from the | number | 0 |
alignFlipFlip alignment when colliding with boundary.
May only occur when | boolean | true |
avoidCollisionsWhen | boolean | true |
collisionBoundaryThe element used as the collision boundary. By default this is the viewport, though you can provide additional element(s) to be included in this check. | Element | (Element | null)[] | null | [] |
collisionPaddingThe distance in pixels from the boundary edges where collision detection should occur. Accepts a number (same for all sides), or a partial padding object, for example: { top: 20, left: 20 }. | number | Partial<Record<"top" | "right" | "bottom" | "left", number>> | 0 |
hideShiftedArrowWhen | boolean | true |
stickyThe sticky behavior on the align axis. | "partial" | "always" | "partial" |
hideWhenDetachedWhether to hide the content when the trigger becomes fully occluded. | boolean | false |
positionStrategyThe type of CSS position property to use. | "absolute" | "fixed" | - |
disableUpdateOnLayoutShiftWhether to disable the update position for the content when the layout shifted. | boolean | false |
prioritizePositionForce content to be position within the viewport. Might overlap the reference element, which may not be desired. | boolean | false |
Events
| Event | Payload |
|---|---|
escapeKeyDownEvent handler called when the escape key is down. Can be prevented. | [event: KeyboardEvent] |
pointerDownOutsideEvent handler called when a | [event: PointerDownOutsideEvent] |
focusOutsideEvent handler called when the focus moves outside of the | [event: FocusOutsideEvent] |
interactOutsideEvent handler called when an interaction happens outside the | [event: PointerDownOutsideEvent | FocusOutsideEvent] |
openAutoFocus | [event: Event] |
closeAutoFocusEvent handler called when auto-focusing on close. Can be prevented. | [event: Event] |
Slots
| Slot | Scope |
|---|---|
defaultThe content of the component. | - |
ContextMenuGroup
Props
| Prop | Type | Default |
|---|---|---|
asChildChange the default rendered element for the one passed as a child, merging their props and behavior. Read our Composition guide for more details. | boolean | - |
asThe element or component this component should render as. Can be overwritten by | AsTag | Component | "div" |
Slots
| Slot | Scope |
|---|---|
defaultThe content of the component. | - |
ContextMenuRadioGroup
Props
| Prop | Type | Default |
|---|---|---|
modelValueThe value of the selected item in the group. | AcceptableValue | - |
asChildChange the default rendered element for the one passed as a child, merging their props and behavior. Read our Composition guide for more details. | boolean | - |
asThe element or component this component should render as. Can be overwritten by | AsTag | Component | "div" |
Events
| Event | Payload |
|---|---|
update:modelValueEvent handler called when the value changes. | [payload: AcceptableValue] |
Slots
| Slot | Scope |
|---|---|
defaultThe content of the component. | - |
ContextMenuItem
Props
| Prop | Type | Default |
|---|---|---|
disabledWhen | boolean | - |
textValueOptional text used for typeahead purposes. By default the typeahead behavior will use the | string | - |
asChildChange the default rendered element for the one passed as a child, merging their props and behavior. Read our Composition guide for more details. | boolean | - |
asThe element or component this component should render as. Can be overwritten by | AsTag | Component | "div" |
insetAdds left padding to align with items that have an icon or indicator. | boolean | - |
Events
| Event | Payload |
|---|---|
selectEvent handler called when the user selects an item (via mouse or keyboard). <br>
Calling | [event: Event] |
Slots
| Slot | Scope |
|---|---|
defaultThe content of the component. | - |
ContextMenuCheckboxItem
Props
| Prop | Type | Default |
|---|---|---|
modelValueThe controlled checked state of the item. Can be used as | CheckedState | - |
disabledWhen | boolean | - |
textValueOptional text used for typeahead purposes. By default the typeahead behavior will use the | string | - |
asChildChange the default rendered element for the one passed as a child, merging their props and behavior. Read our Composition guide for more details. | boolean | - |
asThe element or component this component should render as. Can be overwritten by | AsTag | Component | "div" |
Events
| Event | Payload |
|---|---|
update:modelValueEvent handler called when the checked state changes. | [payload: boolean] |
selectEvent handler called when the user selects an item (via mouse or keyboard). <br>
Calling | [event: Event] |
Slots
| Slot | Scope |
|---|---|
defaultThe content of the component. | - |
ContextMenuRadioItem
Props
| Prop | Type | Default |
|---|---|---|
valuerequiredThe unique value of the item. | AcceptableValue | - |
disabledWhen | boolean | - |
textValueOptional text used for typeahead purposes. By default the typeahead behavior will use the | string | - |
asChildChange the default rendered element for the one passed as a child, merging their props and behavior. Read our Composition guide for more details. | boolean | - |
asThe element or component this component should render as. Can be overwritten by | AsTag | Component | "div" |
Events
| Event | Payload |
|---|---|
selectEvent handler called when the user selects an item (via mouse or keyboard). <br>
Calling | [event: Event] |
Slots
| Slot | Scope |
|---|---|
defaultThe content of the component. | - |
ContextMenuShortcut
Slots
| Slot | Scope |
|---|---|
defaultThe content of the component. | - |
ContextMenuSeparator
Props
| Prop | Type | Default |
|---|---|---|
asChildChange the default rendered element for the one passed as a child, merging their props and behavior. Read our Composition guide for more details. | boolean | - |
asThe element or component this component should render as. Can be overwritten by | AsTag | Component | "div" |
ContextMenuLabel
Props
| Prop | Type | Default |
|---|---|---|
asChildChange the default rendered element for the one passed as a child, merging their props and behavior. Read our Composition guide for more details. | boolean | - |
asThe element or component this component should render as. Can be overwritten by | AsTag | Component | "div" |
insetAdds left padding to align with items that have an icon or indicator. | boolean | - |
Slots
| Slot | Scope |
|---|---|
defaultThe content of the component. | - |
ContextMenuSub
Props
| Prop | Type | Default |
|---|---|---|
defaultOpenThe open state of the submenu when it is initially rendered. Use when you do not need to control its open state. | boolean | - |
openThe controlled open state of the menu. Can be used as | boolean | - |
Events
| Event | Payload |
|---|---|
update:openEvent handler called when the open state of the submenu changes. | [payload: boolean] |
Slots
| Slot | Scope |
|---|---|
defaultThe content of the component. | - |
ContextMenuSubTrigger
Props
| Prop | Type | Default |
|---|---|---|
graceDurationHow long (in milliseconds) the pointer is given to reach the submenu after leaving the trigger. While it moves towards the submenu within this time, hovering other items won't close the submenu. Increase it for users who move the pointer slowly or on devices under heavy load. | number | 300 |
disabledWhen | boolean | - |
textValueOptional text used for typeahead purposes. By default the typeahead behavior will use the | string | - |
asChildChange the default rendered element for the one passed as a child, merging their props and behavior. Read our Composition guide for more details. | boolean | - |
asThe element or component this component should render as. Can be overwritten by | AsTag | Component | "div" |
insetAdds left padding to align with items that have an icon or indicator. | boolean | - |
Slots
| Slot | Scope |
|---|---|
defaultThe content of the component. | - |
ContextMenuSubContent
Props
| Prop | Type | Default |
|---|---|---|
forceMountUsed to force mounting when more control is needed. Useful when controlling animation with Vue animation libraries. | boolean | - |
asChildChange the default rendered element for the one passed as a child, merging their props and behavior. Read our Composition guide for more details. | boolean | - |
asThe element or component this component should render as. Can be overwritten by | AsTag | Component | "div" |
loopWhen | boolean | false |
referenceThe custom element or virtual element that will be set as the reference to position the floating element. If provided, it will replace the default anchor element. | ReferenceElement | - |
memoDependenciesReactive dependencies that should invalidate the memoized content subtree. | unknown[] | - |
sideOffsetThe distance in pixels from the trigger. | number | 0 |
sideFlipFlip to the opposite side when colliding with boundary. | boolean | true |
alignOffsetAn offset in pixels from the | number | 0 |
alignFlipFlip alignment when colliding with boundary.
May only occur when | boolean | true |
avoidCollisionsWhen | boolean | true |
collisionBoundaryThe element used as the collision boundary. By default this is the viewport, though you can provide additional element(s) to be included in this check. | Element | (Element | null)[] | null | [] |
collisionPaddingThe distance in pixels from the boundary edges where collision detection should occur. Accepts a number (same for all sides), or a partial padding object, for example: { top: 20, left: 20 }. | number | Partial<Record<"top" | "right" | "bottom" | "left", number>> | 0 |
arrowPaddingThe padding between the arrow and the edges of the content. If your content has border-radius, this will prevent it from overflowing the corners. | number | 0 |
hideShiftedArrowWhen | boolean | true |
stickyThe sticky behavior on the align axis. | "partial" | "always" | "partial" |
hideWhenDetachedWhether to hide the content when the trigger becomes fully occluded. | boolean | false |
positionStrategyThe type of CSS position property to use. | "absolute" | "fixed" | - |
updatePositionStrategyStrategy to update the position of the floating element on every animation frame. | "always" | "optimized" | 'optimized' |
disableUpdateOnLayoutShiftWhether to disable the update position for the content when the layout shifted. | boolean | false |
prioritizePositionForce content to be position within the viewport. Might overlap the reference element, which may not be desired. | boolean | false |
Events
| Event | Payload |
|---|---|
escapeKeyDownEvent handler called when the escape key is down. Can be prevented. | [event: KeyboardEvent] |
pointerDownOutsideEvent handler called when a | [event: PointerDownOutsideEvent] |
focusOutsideEvent handler called when the focus moves outside of the | [event: FocusOutsideEvent] |
interactOutsideEvent handler called when an interaction happens outside the | [event: PointerDownOutsideEvent | FocusOutsideEvent] |
openAutoFocus | [event: Event] |
closeAutoFocusEvent handler called when auto-focusing on close. Can be prevented. | [event: Event] |
entryFocus | [event: Event] |
Slots
| Slot | Scope |
|---|---|
defaultThe content of the component. | - |
Accessibility
Uses the roving focus pattern of the Menu WAI-ARIA design pattern. Reka UI manages focus and the menu / menuitem roles.
| Key | Description |
|---|---|
| Space | Activates the focused item. |
| Enter | Activates the focused item. |
| ArrowDown | Moves focus to the next item. |
| ArrowUp | Moves focus to the previous item. |
| ArrowRight | When focus is on a submenu trigger, opens the submenu. |
| ArrowLeft | When focus is on an item of a submenu, closes the submenu and moves focus to its trigger. |
| Esc | Closes the context menu. |