Skip to content

ContextMenu ​

A menu that opens at the pointer on a right-click. Every part inside it is the menu's own; only the root and the trigger differ.

tsx
import { ContextMenu } from '@basmilius/react-ui';
tsx
import { ClipboardPaste, Copy, Scissors } from 'lucide-react';
import { ContextMenu, EDIT_SHORTCUTS, Icon, Kbd } from '@basmilius/react-ui';

export default function ContextMenuDemo() {
    return (
        <ContextMenu.Root>
            <ContextMenu.Trigger className="grid h-40 w-full max-w-md place-items-center rounded-lg border border-dashed border-border-strong text-xs text-text-muted">
                Right-click anywhere in here
            </ContextMenu.Trigger>
            <ContextMenu.Popup>
                <ContextMenu.Item>
                    <Icon icon={Scissors} size={14} /> Cut <Kbd shortcut={EDIT_SHORTCUTS.cut} />
                </ContextMenu.Item>
                <ContextMenu.Item>
                    <Icon icon={Copy} size={14} /> Copy <Kbd shortcut={EDIT_SHORTCUTS.copy} />
                </ContextMenu.Item>
                <ContextMenu.Item>
                    <Icon icon={ClipboardPaste} size={14} /> Paste <Kbd shortcut={EDIT_SHORTCUTS.paste} />
                </ContextMenu.Item>
                <ContextMenu.Separator />
                <ContextMenu.SubmenuRoot>
                    <ContextMenu.SubmenuTrigger>New</ContextMenu.SubmenuTrigger>
                    <ContextMenu.Popup>
                        <ContextMenu.Item>File</ContextMenu.Item>
                        <ContextMenu.Item>Folder</ContextMenu.Item>
                    </ContextMenu.Popup>
                </ContextMenu.SubmenuRoot>
            </ContextMenu.Popup>
        </ContextMenu.Root>
    );
}

Parts ​

ContextMenu.Root holds the open state and ContextMenu.Trigger is the area a right-click opens the menu over. Every other part is the menu's own under another name: ContextMenu.Popup, ContextMenu.Item, ContextMenu.CheckboxItem, ContextMenu.RadioGroup, ContextMenu.RadioItem, ContextMenu.Group, ContextMenu.GroupLabel, ContextMenu.Label, ContextMenu.Separator, ContextMenu.Hint, ContextMenu.Check, ContextMenu.SubmenuRoot and ContextMenu.SubmenuTrigger. See Menu for what each does.

ContextMenu.Popup opens at the pointer, which its positioner already knows, so it needs no placement. A submenu inside it sits beside its row like any other.

Anywhere text can be selected, a right-click should offer to copy it. TextMenu is a context menu that does that for a block of text.