Context Menu
---import { ContextMenu, ContextMenuCheckboxItem, ContextMenuContent, ContextMenuGroup, ContextMenuItem, ContextMenuSeparator, ContextMenuShortcut, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuTrigger,} from "@/components/starwind/context-menu";---
<ContextMenu> <ContextMenuTrigger class="flex aspect-video w-full min-w-40 max-w-xs items-center justify-center rounded-xl border border-dashed text-sm"> <span class="hidden pointer-fine:inline-block">Right click here</span> <span class="hidden pointer-coarse:inline-block">Long press here</span> </ContextMenuTrigger> <ContextMenuContent class="w-48"> <ContextMenuGroup> <ContextMenuItem> Back <ContextMenuShortcut>⌘[</ContextMenuShortcut> </ContextMenuItem> <ContextMenuItem disabled> Forward <ContextMenuShortcut>⌘]</ContextMenuShortcut> </ContextMenuItem> <ContextMenuItem> Reload <ContextMenuShortcut>⌘R</ContextMenuShortcut> </ContextMenuItem> <ContextMenuSub> <ContextMenuSubTrigger>More Tools</ContextMenuSubTrigger> <ContextMenuSubContent class="w-44"> <ContextMenuGroup> <ContextMenuItem>Save Page...</ContextMenuItem> <ContextMenuItem>Create Shortcut...</ContextMenuItem> <ContextMenuItem>Name Window...</ContextMenuItem> </ContextMenuGroup> <ContextMenuSeparator /> <ContextMenuGroup> <ContextMenuItem>Developer Tools</ContextMenuItem> </ContextMenuGroup> <ContextMenuSeparator /> <ContextMenuGroup> <ContextMenuItem class="text-destructive data-highlighted:text-destructive focus:text-destructive">Delete</ContextMenuItem> </ContextMenuGroup> </ContextMenuSubContent> </ContextMenuSub> </ContextMenuGroup> <ContextMenuSeparator /> <ContextMenuGroup> <ContextMenuCheckboxItem defaultChecked>Show Bookmarks</ContextMenuCheckboxItem> <ContextMenuCheckboxItem>Show Full URLs</ContextMenuCheckboxItem> </ContextMenuGroup> </ContextMenuContent></ContextMenu>import { ContextMenu, ContextMenuCheckboxItem, ContextMenuContent, ContextMenuGroup, ContextMenuItem, ContextMenuSeparator, ContextMenuShortcut, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuTrigger,} from "@/components/starwind/context-menu";
export function Example() { return ( <ContextMenu> <ContextMenuTrigger className="flex aspect-video w-full min-w-40 max-w-xs items-center justify-center rounded-xl border border-dashed text-sm"> <span className="hidden pointer-fine:inline-block">Right click here</span> <span className="hidden pointer-coarse:inline-block">Long press here</span> </ContextMenuTrigger> <ContextMenuContent className="w-48"> <ContextMenuGroup> <ContextMenuItem> Back <ContextMenuShortcut>⌘[</ContextMenuShortcut> </ContextMenuItem> <ContextMenuItem disabled> Forward <ContextMenuShortcut>⌘]</ContextMenuShortcut> </ContextMenuItem> <ContextMenuItem> Reload <ContextMenuShortcut>⌘R</ContextMenuShortcut> </ContextMenuItem> <ContextMenuSub> <ContextMenuSubTrigger>More Tools</ContextMenuSubTrigger> <ContextMenuSubContent className="w-44"> <ContextMenuGroup> <ContextMenuItem>Save Page...</ContextMenuItem> <ContextMenuItem>Create Shortcut...</ContextMenuItem> <ContextMenuItem>Name Window...</ContextMenuItem> </ContextMenuGroup> <ContextMenuSeparator /> <ContextMenuGroup> <ContextMenuItem>Developer Tools</ContextMenuItem> </ContextMenuGroup> <ContextMenuSeparator /> <ContextMenuGroup> <ContextMenuItem className="text-destructive data-highlighted:text-destructive focus:text-destructive">Delete</ContextMenuItem> </ContextMenuGroup> </ContextMenuSubContent> </ContextMenuSub> </ContextMenuGroup> <ContextMenuSeparator /> <ContextMenuGroup> <ContextMenuCheckboxItem defaultChecked>Show Bookmarks</ContextMenuCheckboxItem> <ContextMenuCheckboxItem>Show Full URLs</ContextMenuCheckboxItem> </ContextMenuGroup> </ContextMenuContent> </ContextMenu> );}Runtime example adjustment
Destructive actions are styled from Runtime item states instead of a legacy variant. The checkbox uses defaultChecked so Runtime can own its later toggles rather than receiving an immutable checked value.
Installation
pnpx starwind@latest add context-menunpx starwind@latest add context-menuyarn dlx starwind@latest add context-menuFramework Availability
Astro Available React AvailableContext Menu is available for Astro and React.
Usage
Basic
A simple context menu with a few actions.
---import { ContextMenu, ContextMenuContent, ContextMenuGroup, ContextMenuItem, ContextMenuTrigger,} from "@/components/starwind/context-menu";---
<ContextMenu> <ContextMenuTrigger class="flex aspect-video w-full min-w-40 max-w-xs items-center justify-center rounded-xl border border-dashed text-sm"> <span class="hidden pointer-fine:inline-block">Right click here</span> <span class="hidden pointer-coarse:inline-block">Long press here</span> </ContextMenuTrigger> <ContextMenuContent> <ContextMenuGroup> <ContextMenuItem>Back</ContextMenuItem> <ContextMenuItem disabled>Forward</ContextMenuItem> <ContextMenuItem>Reload</ContextMenuItem> </ContextMenuGroup> </ContextMenuContent></ContextMenu>Submenu
Use ContextMenuSub, ContextMenuSubTrigger, and ContextMenuSubContent to nest secondary actions.
---import { ContextMenu, ContextMenuContent, ContextMenuGroup, ContextMenuItem, ContextMenuSeparator, ContextMenuShortcut, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuTrigger,} from "@/components/starwind/context-menu";---
<ContextMenu> <ContextMenuTrigger class="flex aspect-video w-full min-w-40 max-w-xs items-center justify-center rounded-xl border border-dashed text-sm"> <span class="hidden pointer-fine:inline-block">Right click here</span> <span class="hidden pointer-coarse:inline-block">Long press here</span> </ContextMenuTrigger> <ContextMenuContent class="w-48"> <ContextMenuGroup> <ContextMenuItem> Copy <ContextMenuShortcut>⌘C</ContextMenuShortcut> </ContextMenuItem> <ContextMenuItem> Cut <ContextMenuShortcut>⌘X</ContextMenuShortcut> </ContextMenuItem> </ContextMenuGroup> <ContextMenuSub> <ContextMenuSubTrigger>More Tools</ContextMenuSubTrigger> <ContextMenuSubContent class="w-44"> <ContextMenuGroup> <ContextMenuItem>Save Page...</ContextMenuItem> <ContextMenuItem>Create Shortcut...</ContextMenuItem> <ContextMenuItem>Name Window...</ContextMenuItem> </ContextMenuGroup> <ContextMenuSeparator /> <ContextMenuGroup> <ContextMenuItem>Developer Tools</ContextMenuItem> </ContextMenuGroup> <ContextMenuSeparator /> <ContextMenuGroup> <ContextMenuItem class="text-destructive data-highlighted:text-destructive focus:text-destructive">Delete</ContextMenuItem> </ContextMenuGroup> </ContextMenuSubContent> </ContextMenuSub> </ContextMenuContent></ContextMenu>Runtime example adjustment
Nested context menus now use the dedicated Runtime submenu anatomy; destructive actions are styled from the item state instead of a removed item variant.
Shortcuts
Add ContextMenuShortcut to show keyboard hints.
---import { ContextMenu, ContextMenuContent, ContextMenuGroup, ContextMenuItem, ContextMenuSeparator, ContextMenuShortcut, ContextMenuTrigger,} from "@/components/starwind/context-menu";---
<ContextMenu> <ContextMenuTrigger class="flex aspect-video w-full min-w-40 max-w-xs items-center justify-center rounded-xl border border-dashed text-sm"> <span class="hidden pointer-fine:inline-block">Right click here</span> <span class="hidden pointer-coarse:inline-block">Long press here</span> </ContextMenuTrigger> <ContextMenuContent> <ContextMenuGroup> <ContextMenuItem> Back <ContextMenuShortcut>⌘[</ContextMenuShortcut> </ContextMenuItem> <ContextMenuItem disabled> Forward <ContextMenuShortcut>⌘]</ContextMenuShortcut> </ContextMenuItem> <ContextMenuItem> Reload <ContextMenuShortcut>⌘R</ContextMenuShortcut> </ContextMenuItem> </ContextMenuGroup> <ContextMenuSeparator /> <ContextMenuGroup> <ContextMenuItem> Save <ContextMenuShortcut>⌘S</ContextMenuShortcut> </ContextMenuItem> <ContextMenuItem> Save As... <ContextMenuShortcut>⇧⌘S</ContextMenuShortcut> </ContextMenuItem> </ContextMenuGroup> </ContextMenuContent></ContextMenu>With Icons
Combine icons with labels for quick scanning.
---import { ContextMenu, ContextMenuContent, ContextMenuGroup, ContextMenuItem, ContextMenuSeparator, ContextMenuTrigger,} from "@/components/starwind/context-menu";import Copy from "@tabler/icons/outline/copy.svg";import Edit from "@tabler/icons/outline/edit.svg";import Trash from "@tabler/icons/outline/trash.svg";---
<ContextMenu> <ContextMenuTrigger class="flex aspect-video w-full min-w-40 max-w-xs items-center justify-center rounded-xl border border-dashed text-sm"> <span class="hidden pointer-fine:inline-block">Right click here</span> <span class="hidden pointer-coarse:inline-block">Long press here</span> </ContextMenuTrigger> <ContextMenuContent> <ContextMenuGroup> <ContextMenuItem> <Copy /> Copy </ContextMenuItem> <ContextMenuItem> <Edit /> Rename </ContextMenuItem> </ContextMenuGroup> <ContextMenuSeparator /> <ContextMenuGroup> <ContextMenuItem class="text-destructive data-highlighted:text-destructive focus:text-destructive"> <Trash /> Delete </ContextMenuItem> </ContextMenuGroup> </ContextMenuContent></ContextMenu>Runtime example adjustment
Runtime context-menu items no longer provide a destructive variant, so the example styles that action directly while preserving highlighted and focus states.
Checkboxes
Use ContextMenuCheckboxItem for toggle actions.
---import { ContextMenu, ContextMenuCheckboxItem, ContextMenuContent, ContextMenuGroup, ContextMenuTrigger,} from "@/components/starwind/context-menu";---
<ContextMenu> <ContextMenuTrigger class="flex aspect-video w-full min-w-40 max-w-xs items-center justify-center rounded-xl border border-dashed text-sm"> <span class="hidden pointer-fine:inline-block">Right click here</span> <span class="hidden pointer-coarse:inline-block">Long press here</span> </ContextMenuTrigger> <ContextMenuContent> <ContextMenuGroup> <ContextMenuCheckboxItem defaultChecked>Show Bookmarks Bar</ContextMenuCheckboxItem> <ContextMenuCheckboxItem>Show Full URLs</ContextMenuCheckboxItem> <ContextMenuCheckboxItem defaultChecked>Show Developer Tools</ContextMenuCheckboxItem> </ContextMenuGroup> </ContextMenuContent></ContextMenu>Runtime example adjustment
Interactive checkbox items use defaultChecked for their initial uncontrolled state, allowing the Runtime menu controller to toggle them after hydration.
Composition
Use the following composition to build a ContextMenu:
ContextMenu├── ContextMenuTrigger└── ContextMenuContent ├── ContextMenuGroup │ ├── ContextMenuLabel │ ├── ContextMenuItem │ └── ContextMenuCheckboxItem ├── ContextMenuSeparator └── ContextMenuSub ├── ContextMenuSubTrigger └── ContextMenuSubContent └── ContextMenuGroup ├── ContextMenuItem └── ContextMenuItemAPI Reference
Styled Component API
These props are added or materially changed by the installed Astro styled component. Standard HTML attributes remain available through the inherited interfaces noted below. Follow the Primitive and Runtime links for lower-level behavior props.
Context Menu Item
Inherits div attributes.
Contains the following additional props:
boolean false
- Description
- Adds leading inset spacing for visual alignment.
- Classification
- Wrapper prop
Context Menu Checkbox Item
Inherits div attributes. Omits `aria-checked` and `role`.
Contains the following additional props:
boolean false
- Description
- Closes the containing surface after the item is activated.
- Classification
- Wrapper prop
string —
- Description
- Adds classes to the generated selection indicator.
- Classification
- Wrapper prop
boolean false
- Description
- Adds leading inset spacing for visual alignment.
- Classification
- Wrapper prop
boolean true
- Description
- Shows the generated selection indicator.
- Classification
- Wrapper prop
Context Menu Radio Item
Inherits div attributes. Omits `aria-checked` and `role`.
Contains the following additional props:
boolean false
- Description
- Closes the containing surface after the item is activated.
- Classification
- Wrapper prop
string —
- Description
- Adds classes to the generated selection indicator.
- Classification
- Wrapper prop
boolean false
- Description
- Adds leading inset spacing for visual alignment.
- Classification
- Wrapper prop
boolean true
- Description
- Shows the generated selection indicator.
- Classification
- Wrapper prop
string —
- Description
- Controls or identifies the component value.
- Classification
- Wrapper prop
Context Menu Label
Inherits div attributes.
Contains the following additional props:
boolean false
- Description
- Adds leading inset spacing for visual alignment.
- Classification
- Wrapper prop
Context Menu Sub Trigger
Inherits div attributes.
Contains the following additional props:
boolean false
- Description
- Adds leading inset spacing for visual alignment.
- Classification
- Wrapper prop
Context Menu Sub Content
Inherits div attributes.
Contains the following additional props:
"top" | "right" | "bottom" | "left" "right"
- Description
- Selects the preferred side for floating content.
- Classification
- Primitive override
- Primitive prop
- context-menu.Popup.side
number 0
- Description
- Sets the distance in pixels between floating content and its anchor.
- Classification
- Primitive override
- Primitive prop
- context-menu.Popup.sideOffset
Primitive And Runtime API
Use these references when you need the lower-level behavior APIs behind Context Menu.
Primitive API
Runtime API
- Context Menu primitive
createContextMenufrom@starwind-ui/runtime/context-menu
Changelog
v2.0.0
- Rebuilt Context Menu on Starwind Runtime for opening, keyboard navigation, submenus, and checked items.
- See the Context Menu Primitive for the underlying unstyled anatomy and behavior API.