Context Menu
A menu of actions triggered by a right click, with support for checkboxes, radio groups, and nested submenus. Built on Base UI's context menu primitive.
Last updated August 8, 2026
CreditsModifiedPublished
Copied from shadcn/ui.
- ContextMenuTrigger measures the ambient direction where it renders and passes it explicitly to the portaled content, so the logical side="inline-end" default (and submenus) open toward the correct edge in RTL instead of shadcn's hardcoded side="right"
- All spacing (item padding, checkmark position, shortcut alignment) uses logical ps-/pe-/end-/ms- utilities instead of physical pl-/pr-/right-/ml-, and the submenu chevron flips with rtl:-scale-x-100
Overview
Right click here
"use client"
import * as React from "react"
import {
ContextMenu,
ContextMenuCheckboxItem,
ContextMenuContent,
ContextMenuItem,
ContextMenuLabel,
ContextMenuRadioGroup,
ContextMenuRadioItem,
ContextMenuSeparator,
ContextMenuShortcut,
ContextMenuSub,
ContextMenuSubContent,
ContextMenuSubTrigger,
ContextMenuTrigger,
} from "@/components/ui/context-menu"
export function ContextMenuDemoExample() {
const [showBookmarks, setShowBookmarks] = React.useState(true)
const [showUrls, setShowUrls] = React.useState(false)
const [person, setPerson] = React.useState("pedro")
return (
<ContextMenu>
<ContextMenuTrigger className="flex h-32 w-full max-w-sm items-center justify-center rounded-lg border border-dashed border-border text-sm text-muted-foreground">
Right click here
</ContextMenuTrigger>
<ContextMenuContent>
<ContextMenuItem>
Back
<ContextMenuShortcut>⌘[</ContextMenuShortcut>
</ContextMenuItem>
<ContextMenuItem disabled>
Forward
<ContextMenuShortcut>⌘]</ContextMenuShortcut>
</ContextMenuItem>
<ContextMenuItem>
Reload
<ContextMenuShortcut>⌘R</ContextMenuShortcut>
</ContextMenuItem>
<ContextMenuSub>
<ContextMenuSubTrigger>More Tools</ContextMenuSubTrigger>
<ContextMenuSubContent>
<ContextMenuItem>Save Page As...</ContextMenuItem>
<ContextMenuItem>Create Shortcut...</ContextMenuItem>
<ContextMenuItem>Name Window...</ContextMenuItem>
</ContextMenuSubContent>
</ContextMenuSub>
<ContextMenuSeparator />
<ContextMenuCheckboxItem
checked={showBookmarks}
onCheckedChange={setShowBookmarks}
>
Show Bookmarks Bar
</ContextMenuCheckboxItem>
<ContextMenuCheckboxItem
checked={showUrls}
onCheckedChange={setShowUrls}
>
Show Full URLs
</ContextMenuCheckboxItem>
<ContextMenuSeparator />
<ContextMenuRadioGroup value={person} onValueChange={setPerson}>
<ContextMenuLabel>People</ContextMenuLabel>
<ContextMenuRadioItem value="pedro">
Pedro Duarte
</ContextMenuRadioItem>
<ContextMenuRadioItem value="colm">Colm Tuite</ContextMenuRadioItem>
</ContextMenuRadioGroup>
</ContextMenuContent>
</ContextMenu>
)
}Installation
$ npx shadcn@latest add https://ui.persian-labs.ir/r/context-menu.jsonUsage
import {
ContextMenu,
ContextMenuContent,
ContextMenuItem,
ContextMenuTrigger,
} from "@/components/ui/context-menu"
export function Example() {
return (
<ContextMenu>
<ContextMenuTrigger>Right click here</ContextMenuTrigger>
<ContextMenuContent>
<ContextMenuItem>Back</ContextMenuItem>
<ContextMenuItem>Forward</ContextMenuItem>
<ContextMenuItem>Reload</ContextMenuItem>
</ContextMenuContent>
</ContextMenu>
)
}RTL
Checkboxes, a radio group, and a submenu, all opening toward the correct reading-end edge automatically.
اینجا کلیک راست کنید
"use client"
import * as React from "react"
import {
ContextMenu,
ContextMenuCheckboxItem,
ContextMenuContent,
ContextMenuItem,
ContextMenuLabel,
ContextMenuRadioGroup,
ContextMenuRadioItem,
ContextMenuSeparator,
ContextMenuShortcut,
ContextMenuSub,
ContextMenuSubContent,
ContextMenuSubTrigger,
ContextMenuTrigger,
} from "@/components/ui/context-menu"
export function ContextMenuRtlExample() {
const [showBookmarks, setShowBookmarks] = React.useState(true)
const [person, setPerson] = React.useState("sadegh")
return (
<ContextMenu>
<ContextMenuTrigger className="flex h-32 w-full max-w-sm items-center justify-center rounded-lg border border-dashed border-border text-sm text-muted-foreground">
اینجا کلیک راست کنید
</ContextMenuTrigger>
<ContextMenuContent>
<ContextMenuItem>
بازگشت
<ContextMenuShortcut>⌘[</ContextMenuShortcut>
</ContextMenuItem>
<ContextMenuItem>
بارگذاری مجدد
<ContextMenuShortcut>⌘R</ContextMenuShortcut>
</ContextMenuItem>
<ContextMenuSub>
<ContextMenuSubTrigger>ابزارهای بیشتر</ContextMenuSubTrigger>
<ContextMenuSubContent>
<ContextMenuItem>ذخیره صفحه بهعنوان...</ContextMenuItem>
<ContextMenuItem>ایجاد میانبر...</ContextMenuItem>
</ContextMenuSubContent>
</ContextMenuSub>
<ContextMenuSeparator />
<ContextMenuCheckboxItem
checked={showBookmarks}
onCheckedChange={setShowBookmarks}
>
نمایش نوار نشانکها
</ContextMenuCheckboxItem>
<ContextMenuSeparator />
<ContextMenuRadioGroup value={person} onValueChange={setPerson}>
<ContextMenuLabel>افراد</ContextMenuLabel>
<ContextMenuRadioItem value="sadegh">صادق علوی</ContextMenuRadioItem>
<ContextMenuRadioItem value="niki">نیکی احمدی</ContextMenuRadioItem>
</ContextMenuRadioGroup>
</ContextMenuContent>
</ContextMenu>
)
}