shadcn.io is not affiliated with official shadcn/ui
Right click hereLong press here
Installation
bunx --bun shadcn@latest add https://kit.dev/r/radix/context-menu.jsonnpx shadcn@latest add https://kit.dev/r/radix/context-menu.jsonpnpm dlx shadcn@latest add https://kit.dev/r/radix/context-menu.jsonyarn shadcn@latest add https://kit.dev/r/radix/context-menu.jsonInstall the following dependencies:
bun add radix-ui lucide-reactnpm install radix-ui lucide-reactpnpm add radix-ui lucide-reactyarn add radix-ui lucide-reactCopy and paste the following code into your project.
"use client";
import { CheckIcon, ChevronRightIcon } from "lucide-react";
import { ContextMenu as ContextMenuPrimitive } from "radix-ui";
import type React from "react";
import { cn } from "@/lib/utils";
import { usePreviewPortal } from "@/registry/react/lib/preview-frame";
export const ContextMenu = (
props: React.ComponentProps<typeof ContextMenuPrimitive.Root>
) => <ContextMenuPrimitive.Root data-slot="context-menu" {...props} />;
export const ContextMenuTrigger = (
props: React.ComponentProps<typeof ContextMenuPrimitive.Trigger>
) => {
const { className, ...rest } = props;
return (Update the import paths to match your project setup.
Anatomy
ContextMenuArrow
└── ContextMenuArrowTip
ContextMenuTrigger
ContextMenuIndicator
ContextMenuQuickItem
└── ContextMenuGroup
├── ContextMenuSubContent
│ └── ContextMenuPositioner
└── ContextMenuGroupLabel
ContextMenuItemIndicator
ContextMenuItemText
ContextMenuSeparator
ContextMenuTrigger
└── ContextMenuSubTriggerUsage
import {
ContextMenu,
ContextMenuCheckboxItem,
ContextMenuContent,
ContextMenuGroup,
ContextMenuGroupLabel,
ContextMenuItem,
ContextMenuRadioGroup,
ContextMenuRadioItem,
ContextMenuSeparator,
ContextMenuShortcut,
ContextMenuSub,
ContextMenuSubContent,
ContextMenuSubTrigger,
ContextMenuTrigger,
} from "@/components/ui/context-menu";<ContextMenu>
<ContextMenuTrigger className="flex aspect-video w-full max-w-xs items-center justify-center rounded-xl border border-dashed text-sm">
<span className="pointer-fine:inline-block hidden">Right click here</span>
<span className="pointer-coarse:inline-block hidden">
Long press here
</span>
</ContextMenuTrigger>
<ContextMenuContent className="w-48">
<ContextMenuGroup>
<ContextMenuItem value="back">
Back
<ContextMenuShortcut>⌘[</ContextMenuShortcut>
</ContextMenuItem>
<ContextMenuItem disabled value="forward">
Forward
<ContextMenuShortcut>⌘]</ContextMenuShortcut>
</ContextMenuItem>
<ContextMenuItem value="reload">
Reload
<ContextMenuShortcut>⌘R</ContextMenuShortcut>
</ContextMenuItem>
<ContextMenuSub>
<ContextMenuSubTrigger>More Tools</ContextMenuSubTrigger>
<ContextMenuSubContent className="w-44">
<ContextMenuGroup>
<ContextMenuItem value="save-page">Save Page...</ContextMenuItem>
<ContextMenuItem value="create-shortcut">
Create Shortcut...
</ContextMenuItem>
<ContextMenuItem value="name-window">
Name Window...
</ContextMenuItem>
</ContextMenuGroup>
<ContextMenuSeparator />
<ContextMenuGroup>
<ContextMenuItem value="developer-tools">
Developer Tools
</ContextMenuItem>
</ContextMenuGroup>
<ContextMenuSeparator />
<ContextMenuGroup>
<ContextMenuItem value="delete" variant="destructive">
Delete
</ContextMenuItem>
</ContextMenuGroup>
</ContextMenuSubContent>
</ContextMenuSub>
</ContextMenuGroup>
<ContextMenuSeparator />
<ContextMenuGroup>
<ContextMenuCheckboxItem checked value="show-bookmarks">
Show Bookmarks
</ContextMenuCheckboxItem>
<ContextMenuCheckboxItem checked={false} value="show-full-urls">
Show Full URLs
</ContextMenuCheckboxItem>
</ContextMenuGroup>
<ContextMenuSeparator />
<ContextMenuGroup>
<ContextMenuRadioGroup value="pedro">
<ContextMenuGroupLabel>People</ContextMenuGroupLabel>
<ContextMenuRadioItem value="pedro">
Pedro Duarte
</ContextMenuRadioItem>
<ContextMenuRadioItem value="colm">Colm Tuite</ContextMenuRadioItem>
</ContextMenuRadioGroup>
</ContextMenuGroup>
</ContextMenuContent>
</ContextMenu>
Accessibility
| Key | Description |
|---|---|
Enter | Activate the focused control. |
Space | Activate the focused control. |
ArrowDown | Move down. |
ArrowUp | Move up. |
ArrowLeft | Move left. |
ArrowRight | Move right. |
Home | Go to the start. |
End | Go to the end. |
Demos
Basic
A simple context menu with a few actions.
Submenu
Use ContextMenuSub to nest secondary actions.
Shortcuts
Add ContextMenuShortcut to show keyboard hints.
Groups
Group related actions and separate them with dividers.
Icons
Combine icons with labels for quick scanning.
Checkboxes
Use ContextMenuCheckboxItem for toggles.
Radio
Use ContextMenuRadioItem for exclusive choices.
Destructive
Use variant="destructive" to style the menu item as destructive.
Sides
Control menu placement with positioning placement.
Rtl
Right-to-left context menu. See the RTL configuration guide for document direction.
API Reference
ContextMenu
PropType
openboolean): voidchildren?React.ReactNodemodal?booleanAttributeType
ContextMenuTrigger
PropType
openboolean): voidchildren?React.ReactNodedisabled?booleanmodal?booleanAttributeType
ContextMenuGroup
PropType
openboolean): voidchildren?React.ReactNodemodal?booleanAttributeType
ContextMenuPortal
PropType
openboolean): voidchildren?React.ReactNodemodal?booleanAttributeType
ContextMenuSub
PropType
openboolean): voidchildren?React.ReactNodedefaultOpen?booleanmodal?booleanAttributeType
ContextMenuRadioGroup
PropType
openboolean): voidchildren?React.ReactNodemodal?booleanAttributeType
ContextMenuContent
PropType
openboolean): voidchildren?React.ReactNodemodal?booleanAttributeType
CSS variableType
--radix-context-menu-content-available-heightstring--radix-context-menu-content-transform-originstringContextMenuItem
PropType
openboolean): voidchildren?React.ReactNodemodal?booleanAttributeType
ContextMenuSubTrigger
PropType
openboolean): voidchildren?React.ReactNodemodal?booleanAttributeType
ContextMenuSubContent
PropType
openboolean): voidchildren?React.ReactNodemodal?booleanAttributeType
CSS variableType
--radix-context-menu-content-available-heightstring--radix-context-menu-content-transform-originstringContextMenuCheckboxItem
PropType
openboolean): voidchildren?React.ReactNodemodal?booleanAttributeType
ContextMenuRadioItem
PropType
openboolean): voidchildren?React.ReactNodemodal?booleanAttributeType
ContextMenuGroupLabel
PropType
openboolean): voidchildren?React.ReactNodemodal?booleanAttributeType
ContextMenuSeparator
PropType
openboolean): voidchildren?React.ReactNodemodal?booleanAttributeType
ContextMenuShortcut
PropType
openboolean): voidchildren?React.ReactNodemodal?booleanAttributeType