Introducing PrimeReact v11-alpha 🎉Discover Now

ContextMenu

A right-click triggered menu with keyboard navigation, nested submenus, and WAI-ARIA support.

preview

Installation#

npx shadcn@latest add https://v11.primereact.org/r/contextmenu.json

Usage#

import {
    ContextMenu,
    ContextMenuArrow,
    ContextMenuIndicator,
    ContextMenuItem,
    ContextMenuLabel,
    ContextMenuList,
    ContextMenuPopup,
    ContextMenuPortal,
    ContextMenuPositioner,
    ContextMenuRadioGroup,
    ContextMenuSeparator,
    ContextMenuSubmenu,
    ContextMenuSubmenuTrigger,
    ContextMenuTrigger
} from '@/components/ui/contextmenu';
<ContextMenu>
    <ContextMenuTrigger>
        <div>Right-click here</div>
    </ContextMenuTrigger>
    <ContextMenuPortal>
        <ContextMenuPositioner>
            <ContextMenuPopup>
                <ContextMenuList>
                    <ContextMenuItem>Copy</ContextMenuItem>
                    <ContextMenuItem>Paste</ContextMenuItem>
                    <ContextMenuSeparator />
                    <ContextMenuItem>Delete</ContextMenuItem>
                </ContextMenuList>
            </ContextMenuPopup>
        </ContextMenuPositioner>
    </ContextMenuPortal>
</ContextMenu>

Examples#

Basic#

A standard context menu opened with a right-click on the trigger area.

basic-demo

Nest a ContextMenuSubmenu inside any ContextMenuList. Reuse the same ContextMenuPortal / ContextMenuPositioner / ContextMenuPopup parts at any level — there are no separate sub-prefixed components.

submenu-demo

API#

Sub-components#

See Primitive API for ContextMenuRoot, ContextMenuTrigger, ContextMenuPortal, ContextMenuPositioner, ContextMenuPopup, ContextMenuArrow, ContextMenuList, ContextMenuLabel, ContextMenuSeparator, ContextMenuItem, ContextMenuRadioGroup, ContextMenuSubmenu, ContextMenuSubmenuTrigger, ContextMenuIndicator props.

Hooks#

See Headless API for useContextMenu and useContextMenuSubmenu hook documentation.

Accessibility#

Screen Reader#

ContextMenu follows the WAI-ARIA Menu pattern. The trigger is a generic content area (rendered as div by default) with aria-haspopup="menu" and tabIndex={0} so keyboard users can focus it. The popup uses role="menu"; items use menuitem, menuitemcheckbox, or menuitemradio based on their type.

Keyboard Support#

KeyFunction
Shift+F10 / ContextMenu keyOpens the menu when the trigger has focus.
down arrowMoves focus to the next item.
up arrowMoves focus to the previous item.
homeMoves focus to the first item.
endMoves focus to the last item.
enter / spaceActivates the focused item.
right arrow (on a subtrigger)Opens the submenu and focuses its first item.
left arrow (inside a submenu)Closes the submenu and returns focus to the parent subtrigger.
escapeCloses the menu and returns focus to the trigger.
Any printable characterJumps to the next item whose text starts with the character.