A context menu component that provides right-click functionality with support for actions, checkboxes, radio groups, and nested sub-menus.
Installation
npx shadcn@latest add @eo-n/context-menu
Install dependencies
npm install @base-ui/react lucide-react
Copy component code
Copy the context menu component from the registry and paste it into your project at components/ui/context-menu.tsx.
Update imports
Update the import paths to match your project setup, particularly the @/lib/utils import.
Import the components you need:
import {
ContextMenu,
ContextMenuContent,
ContextMenuItem,
ContextMenuTrigger,
} from "@/components/ui/context-menu";
Basic Example
<ContextMenu>
<ContextMenuTrigger>Right click</ContextMenuTrigger>
<ContextMenuContent>
<ContextMenuItem>Profile</ContextMenuItem>
<ContextMenuItem>Billing</ContextMenuItem>
<ContextMenuItem>Team</ContextMenuItem>
<ContextMenuItem>Subscription</ContextMenuItem>
</ContextMenuContent>
</ContextMenu>
Complete Example
import {
ContextMenu,
ContextMenuCheckboxItem,
ContextMenuContent,
ContextMenuGroup,
ContextMenuGroupLabel,
ContextMenuItem,
ContextMenuRadioGroup,
ContextMenuRadioItem,
ContextMenuSeparator,
ContextMenuShortcut,
ContextMenuTrigger,
} from "@/components/ui/context-menu";
export default function ContextMenuDemo() {
return (
<ContextMenu>
<ContextMenuTrigger className="flex h-[150px] w-[300px] items-center justify-center rounded-md border border-dashed text-sm">
Right click here to see options
</ContextMenuTrigger>
<ContextMenuContent className="w-52">
<ContextMenuItem inset>
Copy
<ContextMenuShortcut>⌘C</ContextMenuShortcut>
</ContextMenuItem>
<ContextMenuItem inset>
Paste
<ContextMenuShortcut>⌘V</ContextMenuShortcut>
</ContextMenuItem>
<ContextMenuItem inset>
Cut
<ContextMenuShortcut>⌘X</ContextMenuShortcut>
</ContextMenuItem>
<ContextMenuSeparator />
<ContextMenuCheckboxItem checked>
Show Line Numbers
</ContextMenuCheckboxItem>
<ContextMenuCheckboxItem>
Word Wrap
</ContextMenuCheckboxItem>
<ContextMenuSeparator />
<ContextMenuRadioGroup value="light">
<ContextMenuGroup>
<ContextMenuGroupLabel inset>Theme</ContextMenuGroupLabel>
<ContextMenuRadioItem value="light">
Light
</ContextMenuRadioItem>
<ContextMenuRadioItem value="dark">Dark</ContextMenuRadioItem>
<ContextMenuRadioItem value="system">System</ContextMenuRadioItem>
</ContextMenuGroup>
</ContextMenuRadioGroup>
</ContextMenuContent>
</ContextMenu>
);
}
API Reference
The root component that manages the context menu state.
The element that triggers the context menu on right-click.
Additional CSS classes to apply to the trigger element.
The popup content container that appears on right-click.
The distance in pixels from the cursor position.
align
'start' | 'center' | 'end'
Alignment of the content relative to the cursor.
Offset along the alignment axis. Defaults to -4 when align is not ‘center’.
Additional CSS classes to apply to the content.
An individual item in the context menu.
Adds left padding to align with items that have icons or indicators.
variant
'default' | 'destructive'
default:"'default'"
Visual style variant. Use ‘destructive’ for dangerous actions like delete.
Disables the item, making it non-interactive.
Container for a nested sub-menu.
Trigger for opening a nested sub-menu.
Adds left padding to align with other items.
Groups related menu items together.
Label for a group of menu items.
Adds left padding to align with other items.
Visual separator between menu items or groups.
Container for radio items where only one can be selected.
The currently selected value.
Callback when the selected value changes.
A radio item within a radio group.
The value of this radio item.
A checkbox item that can be toggled on/off.
Whether the checkbox is checked.
onCheckedChange
(checked: boolean) => void
Callback when the checked state changes.
Displays keyboard shortcuts for menu items.
<ContextMenuItem>
Save <ContextMenuShortcut>⌘S</ContextMenuShortcut>
</ContextMenuItem>
Examples
With Icons
import { Copy, Paste, Scissors } from "lucide-react";
<ContextMenuContent>
<ContextMenuItem>
<Copy className="mr-2 h-4 w-4" />
Copy
</ContextMenuItem>
<ContextMenuItem>
<Paste className="mr-2 h-4 w-4" />
Paste
</ContextMenuItem>
<ContextMenuItem>
<Scissors className="mr-2 h-4 w-4" />
Cut
</ContextMenuItem>
</ContextMenuContent>
<ContextMenuContent>
<ContextMenuItem>Open</ContextMenuItem>
<ContextMenuSub>
<ContextMenuSubTrigger>Share</ContextMenuSubTrigger>
<ContextMenuContent>
<ContextMenuItem>Email</ContextMenuItem>
<ContextMenuItem>Message</ContextMenuItem>
<ContextMenuItem>Copy Link</ContextMenuItem>
</ContextMenuContent>
</ContextMenuSub>
<ContextMenuSeparator />
<ContextMenuItem variant="destructive">Delete</ContextMenuItem>
</ContextMenuContent>
With Image or Card
<ContextMenu>
<ContextMenuTrigger>
<img
src="/image.jpg"
alt="Right click for options"
className="rounded-md"
/>
</ContextMenuTrigger>
<ContextMenuContent>
<ContextMenuItem>View Full Size</ContextMenuItem>
<ContextMenuItem>Download</ContextMenuItem>
<ContextMenuItem>Copy Image</ContextMenuItem>
<ContextMenuSeparator />
<ContextMenuItem>Set as Wallpaper</ContextMenuItem>
</ContextMenuContent>
</ContextMenu>
Features
- Right-Click Activation: Native context menu behavior
- Flexible Positioning: Automatically positions near cursor
- Nested Sub-menus: Support for multi-level menu hierarchies
- Rich Content: Support for icons, shortcuts, checkboxes, and radio items
- Variant Styles: Built-in destructive variant for dangerous actions
- Keyboard Navigation: Full keyboard support with arrow keys
- Collision Detection: Automatically adjusts position to stay in viewport
- Smooth Animations: Built-in entrance and exit animations
- Accessible: Proper ARIA attributes and focus management
Accessibility
- Right-click and Shift+F10 keyboard shortcut to open
- Keyboard navigation with arrow keys, Enter, and Escape
- Focus management and focus trapping
- Proper ARIA roles and attributes
- Screen reader announcements for state changes
- Disabled state support
Use Cases
- File/Folder Actions: Right-click menus for file operations
- Text Selection: Context actions for selected text
- Image Operations: Menu options for image manipulation
- Table Rows: Row-specific actions in data tables
- Canvas Elements: Context actions for design tools
- Code Editors: Context-aware code actions