119k

Context Menu

Displays a menu of actions triggered by a right click.

"use client"

import { Pressable } from "react-aria-components"

Installation

pnpm dlx shadcn@latest add context-menu

Usage

import { Pressable } from "react-aria-components"
 
import {
  ContextMenu,
  ContextMenuItem,
  ContextMenuTrigger,
} from "@/components/ui/context-menu"
<ContextMenuTrigger>
  <Pressable>
    <div role="button">Right click here</div>
  </Pressable>
  <ContextMenu>
    <ContextMenuItem>Profile</ContextMenuItem>
    <ContextMenuItem>Billing</ContextMenuItem>
    <ContextMenuItem>Team</ContextMenuItem>
    <ContextMenuItem>Subscription</ContextMenuItem>
  </ContextMenu>
</ContextMenuTrigger>

Composition

Use the following composition to build a ContextMenu:

ContextMenuTrigger
├── Pressable
└── ContextMenuContent
    ├── ContextMenuGroup
    │   ├── ContextMenuLabel
    │   ├── ContextMenuItem
    │   └── ContextMenuItem
    ├── ContextMenuSeparator
    ├── ContextMenuGroup
    │   ├── ContextMenuLabel
    │   ├── ContextMenuItem
    │   └── ContextMenuItem
    └── ContextMenuSub
        ├── ContextMenuSubTrigger
        └── ContextMenuSubContent
            └── ContextMenuGroup
                ├── ContextMenuItem
                └── ContextMenuItem

Basic

A simple context menu with a few actions.

"use client"

import { Pressable } from "react-aria-components"

Use ContextMenuSub to nest secondary actions.

"use client"

import { Pressable } from "react-aria-components"

Shortcuts

Add ContextMenuShortcut to show keyboard hints.

"use client"

import { Pressable } from "react-aria-components"

Groups

Group related actions and separate them with dividers.

"use client"

import { Pressable } from "react-aria-components"

Icons

Combine icons with labels for quick scanning.

"use client"

import {

Checkboxes

Use selectionMode="multiple" for toggles.

"use client"

import { useState } from "react"

Radio

Use selectionMode="single" for exclusive choices.

"use client"

import * as React from "react"

Destructive

Use variant="destructive" to style the menu item as destructive.

"use client"

import { ArchiveIcon, PencilIcon, ShareIcon, TrashIcon } from "lucide-react"

Placement

Control submenu placement with the placement prop.

"use client"

import { Pressable } from "react-aria-components"

RTL

To enable RTL support in shadcn/ui, see the RTL configuration guide.

"use client"

import * as React from "react"

Use placement="end" to place the menu on the logical end side of the trigger.

<ContextMenuTrigger>
  <Pressable>
    <div role="button">Right click here</div>
  </Pressable>
  <ContextMenu placement="end">
    <ContextMenuItem>Profile</ContextMenuItem>
    <ContextMenuItem>Billing</ContextMenuItem>
    <ContextMenuItem>Team</ContextMenuItem>
    <ContextMenuItem>Subscription</ContextMenuItem>
  </ContextMenu>
</ContextMenuTrigger>

API Reference

See the React Aria documentation for more information.