shadcn-remix
GitHub

Context Menu

Displays a menu of actions triggered by a right click.

import { css } from 'remix/component'

import {
  ContextMenu,
  ContextMenuCheckboxItem,
  ContextMenuContent,
import { css } from 'remix/component'

import {
  ContextMenu,
  ContextMenuCheckboxItem,
  ContextMenuContent,
  ContextMenuItem,
  ContextMenuLabel,
  ContextMenuRadioGroup,
  ContextMenuRadioItem,
  ContextMenuSeparator,
  ContextMenuShortcut,
  ContextMenuSub,
  ContextMenuSubContent,
  ContextMenuSubTrigger,
  ContextMenuTrigger,
} from '#app/ui/context-menu.tsx'

export function ContextMenuDemo() {
  return () => (
    <ContextMenu>
      <ContextMenuTrigger
        mix={css({
          display: 'flex',
          height: '150px',
          width: '300px',
          alignItems: 'center',
          justifyContent: 'center',
          borderRadius: 'calc(var(--radius) - 2px)',
          borderWidth: '1px',
          borderStyle: 'dashed',
          fontSize: '0.875rem',
          lineHeight: 'calc(1.25 / 0.875)',
        })}
      >
        Right click here
      </ContextMenuTrigger>
      <ContextMenuContent mix={css({ width: '13rem' })}>
        <ContextMenuItem inset>
          Back
          <ContextMenuShortcut>⌘[</ContextMenuShortcut>
        </ContextMenuItem>
        <ContextMenuItem inset disabled>
          Forward
          <ContextMenuShortcut>⌘]</ContextMenuShortcut>
        </ContextMenuItem>
        <ContextMenuItem inset>
          Reload
          <ContextMenuShortcut>⌘R</ContextMenuShortcut>
        </ContextMenuItem>
        <ContextMenuSub>
          <ContextMenuSubTrigger inset>More Tools</ContextMenuSubTrigger>
          <ContextMenuSubContent mix={css({ width: '11rem' })}>
            <ContextMenuItem>Save Page...</ContextMenuItem>
            <ContextMenuItem>Create Shortcut...</ContextMenuItem>
            <ContextMenuItem>Name Window...</ContextMenuItem>
            <ContextMenuSeparator />
            <ContextMenuItem>Developer Tools</ContextMenuItem>
            <ContextMenuSeparator />
            <ContextMenuItem variant="destructive">Delete</ContextMenuItem>
          </ContextMenuSubContent>
        </ContextMenuSub>
        <ContextMenuSeparator />
        <ContextMenuCheckboxItem checked>Show Bookmarks</ContextMenuCheckboxItem>
        <ContextMenuCheckboxItem>Show Full URLs</ContextMenuCheckboxItem>
        <ContextMenuSeparator />
        <ContextMenuRadioGroup value="pedro">
          <ContextMenuLabel inset>People</ContextMenuLabel>
          <ContextMenuRadioItem value="pedro">Pedro Duarte</ContextMenuRadioItem>
          <ContextMenuRadioItem value="colm">Colm Tuite</ContextMenuRadioItem>
        </ContextMenuRadioGroup>
      </ContextMenuContent>
    </ContextMenu>
  )
}

Installation

$ pnpm dlx shadcn@latest add https://www.shadcn-remix.com/r/context-menu.json

Usage

import {
  ContextMenu,
  ContextMenuContent,
  ContextMenuItem,
  ContextMenuTrigger,
} from '#app/ui/context-menu.tsx'
<ContextMenu>
  <ContextMenuTrigger>Right click here</ContextMenuTrigger>
  <ContextMenuContent>
    <ContextMenuItem>Profile</ContextMenuItem>
    <ContextMenuItem>Billing</ContextMenuItem>
    <ContextMenuItem>Team</ContextMenuItem>
    <ContextMenuItem>Subscription</ContextMenuItem>
  </ContextMenuContent>
</ContextMenu>

API Reference

ContextMenu

PropTypeDefault
onOpenChange((open: boolean) => void)-

ContextMenuPortal

Radix portals menu content; here content renders in the top layer (popover) instead.

ContextMenuTrigger

The area that opens the menu on right click (or the ContextMenu key / Shift+F10 while focused). The menu opens at the pointer position.

PropTypeDefault
disabledbooleanfalse
mixMixValue-

ContextMenuContent

PropTypeDefault
mixMixValue-

ContextMenuGroup

PropTypeDefault
mixMixValue-

ContextMenuItem

PropTypeDefault
insetboolean-
variant"default" | "destructive""default"
disabledbooleanfalse
textValuestring-
onSelect((event: MenuSelectEvent) => void)-
mixMixValue-

ContextMenuCheckboxItem

PropTypeDefault
checkedboolean | "indeterminate"false
onCheckedChange((checked: boolean) => void)-
disabledbooleanfalse
textValuestring-
onSelect((event: MenuSelectEvent) => void)-
mixMixValue-

ContextMenuRadioGroup

PropTypeDefault
valuestring-
onValueChange((value: string) => void)-
mixMixValue-

ContextMenuRadioItem

PropTypeDefault
valuestring-
disabledbooleanfalse
textValuestring-
onSelect((event: MenuSelectEvent) => void)-
mixMixValue-

ContextMenuLabel

PropTypeDefault
insetboolean-
mixMixValue-

ContextMenuSeparator

PropTypeDefault
mixMixValue-

ContextMenuShortcut

PropTypeDefault
mixMixValue-

ContextMenuSub

PropTypeDefault
openboolean-
defaultOpenboolean-
onOpenChange((open: boolean) => void)-

ContextMenuSubTrigger

PropTypeDefault
insetboolean-
disabledbooleanfalse
textValuestring-
mixMixValue-

ContextMenuSubContent

PropTypeDefault
sideOffsetnumber0
alignOffsetnumber0
mixMixValue-