Context Menu
A menu that appears at the pointer on right-click or long press.
Basic
Right-click the target area to open. Supports disabled items and keyboard shortcuts.
Right click here
import { ContextMenu } from "@brijbyte/agentic-ui/context-menu";
import "@brijbyte/agentic-ui/context-menu.css";
export default function BasicDemo() {
return (
<ContextMenu
items={[
{ label: "Back" },
{ label: "Forward", disabled: true },
{ label: "Reload" },
{ type: "separator" },
{ label: "Save As…", shortcut: "⌘S" },
{ label: "Print…", shortcut: "⌘P" },
{ type: "separator" },
{ label: "View Page Source", shortcut: "⌘U" },
{ label: "Inspect", shortcut: "⌥⌘I" },
]}
>
<div
style={{
display: "flex",
alignItems: "center",
justifyContent: "center",
height: 140,
width: 280,
borderRadius: "var(--radius-lg)",
border: "1px dashed var(--color-line)",
color: "var(--color-tertiary)",
fontFamily: "var(--font-mono)",
fontSize: "var(--font-size-sm)",
userSelect: "none",
}}
>
Right click here
</div>
</ContextMenu>
);
}
Grouped
Use the group type to organise items into logical sections separated by dividers.
Right click here
import { ContextMenu } from "@brijbyte/agentic-ui/context-menu";
import "@brijbyte/agentic-ui/context-menu.css";
export default function GroupedDemo() {
return (
<ContextMenu
items={[
{
type: "group",
items: [
{ label: "Cut", shortcut: "⌘X" },
{ label: "Copy", shortcut: "⌘C" },
{ label: "Paste", shortcut: "⌘V", disabled: true },
],
},
{ type: "separator" },
{
type: "group",
items: [{ label: "Select All", shortcut: "⌘A" }],
},
{ type: "separator" },
{
type: "group",
items: [{ label: "Spelling and Grammar" }, { label: "Substitutions" }, { label: "Transformations" }],
},
]}
>
<div
style={{
display: "flex",
alignItems: "center",
justifyContent: "center",
height: 140,
width: 280,
borderRadius: "var(--radius-lg)",
border: "1px dashed var(--color-line)",
color: "var(--color-tertiary)",
fontFamily: "var(--font-mono)",
fontSize: "var(--font-size-sm)",
userSelect: "none",
}}
>
Right click here
</div>
</ContextMenu>
);
}
Nested
Use ContextMenuSubmenuTrigger inside a ContextMenu.SubmenuRoot to create submenus.
Right click here
import { ContextMenu as BaseContextMenu } from "@base-ui/react/context-menu";
import { ContextMenuPopup, ContextMenuItem, ContextMenuSeparator, ContextMenuSubmenuTrigger } from "@brijbyte/agentic-ui/context-menu";
import "@brijbyte/agentic-ui/context-menu.css";
const triggerStyle: React.CSSProperties = {
display: "flex",
alignItems: "center",
justifyContent: "center",
height: 140,
width: 280,
borderRadius: "var(--radius-lg)",
border: "1px dashed var(--color-line)",
color: "var(--color-tertiary)",
fontFamily: "var(--font-mono)",
fontSize: "var(--font-size-sm)",
userSelect: "none",
cursor: "default",
};
export default function NestedDemo() {
return (
<BaseContextMenu.Root>
<BaseContextMenu.Trigger render={<div style={triggerStyle}>Right click here</div>} />
<BaseContextMenu.Portal>
<BaseContextMenu.Positioner style={{ outline: "none", zIndex: 100 }}>
<ContextMenuPopup>
<ContextMenuItem>New File</ContextMenuItem>
<ContextMenuItem>New Folder</ContextMenuItem>
<ContextMenuSeparator />
{/* Submenu */}
<BaseContextMenu.SubmenuRoot>
<ContextMenuSubmenuTrigger>Open With</ContextMenuSubmenuTrigger>
<BaseContextMenu.Portal>
<BaseContextMenu.Positioner style={{ outline: "none", zIndex: 101 }} alignOffset={-4} sideOffset={-4}>
<ContextMenuPopup>
<ContextMenuItem>VS Code</ContextMenuItem>
<ContextMenuItem>Zed</ContextMenuItem>
<ContextMenuItem>Vim</ContextMenuItem>
<ContextMenuSeparator />
<ContextMenuItem>Other…</ContextMenuItem>
</ContextMenuPopup>
</BaseContextMenu.Positioner>
</BaseContextMenu.Portal>
</BaseContextMenu.SubmenuRoot>
<ContextMenuSeparator />
<ContextMenuItem>Get Info</ContextMenuItem>
<ContextMenuSeparator />
<ContextMenuItem>Move to Trash</ContextMenuItem>
</ContextMenuPopup>
</BaseContextMenu.Positioner>
</BaseContextMenu.Portal>
</BaseContextMenu.Root>
);
}
Composed
Use raw @base-ui/react ContextMenu with styled parts for full layout control.
Right click here
import { ContextMenu as BaseContextMenu } from "@base-ui/react/context-menu";
import { ContextMenuPopup, ContextMenuItem, ContextMenuSeparator } from "@brijbyte/agentic-ui/context-menu";
import "@brijbyte/agentic-ui/context-menu.css";
export default function ComposedDemo() {
return (
<BaseContextMenu.Root>
<BaseContextMenu.Trigger
render={
<div
style={{
display: "flex",
alignItems: "center",
justifyContent: "center",
height: 140,
width: 280,
borderRadius: "var(--radius-lg)",
border: "1px dashed var(--color-line)",
color: "var(--color-tertiary)",
fontFamily: "var(--font-mono)",
fontSize: "var(--font-size-sm)",
userSelect: "none",
cursor: "default",
}}
>
Right click here
</div>
}
/>
<BaseContextMenu.Portal>
<BaseContextMenu.Positioner style={{ outline: "none", zIndex: 100 }}>
<ContextMenuPopup>
<ContextMenuItem>New File</ContextMenuItem>
<ContextMenuItem>New Folder</ContextMenuItem>
<ContextMenuSeparator />
<ContextMenuItem>Get Info</ContextMenuItem>
<ContextMenuSeparator />
<ContextMenuItem>Move to Trash</ContextMenuItem>
</ContextMenuPopup>
</BaseContextMenu.Positioner>
</BaseContextMenu.Portal>
</BaseContextMenu.Root>
);
}