본문으로 건너뛰기
오버레이 / context-menu

ContextMenu

우클릭(또는 길게 누르기)으로 대상 영역 위에 여는 컨텍스트 액션 메뉴 (Radix ContextMenu 기반).
오버레이context-menuStatic specimencontext menu컨텍스트 메뉴우클릭right click
01 · Specimen

먼저 보고, 그다음 계약을 읽습니다

우클릭(또는 길게 누르기)으로 대상 영역 위에 여는 컨텍스트 액션 메뉴 (Radix ContextMenu 기반).

Workbench 불러오는 중…
Component intent의도와 경계 읽기

DropdownMenu 와 **같은** .axe-dropdown-menu__* 표면·항목·indicator·shortcut·separator 를 재사용한다(새 CSS 없음). 차이는 트리거뿐 — DropdownMenu 는 버튼 클릭으로 트리거 아래에, ContextMenu 는 대상 영역 우클릭으로 커서 위치에 뜬다(그래서 sideOffset 개념이 없다). ContextMenu(Root)·ContextMenuTrigger(우클릭 대상)·ContextMenuContent·ContextMenuItem 를 기본으로, Label·Separator·Shortcut·Checkbox/RadioItem·Sub 를 조합한다.

02 · Use

예제

SSOT에 등록된 실제 API 기준 snippet입니다. standalone 배지만 독립 실행 단위이며, fragment는 주변 state·handler 문맥을 생략합니다.

01기본 (우클릭 영역)tsxfragment
기본 (우클릭 영역)
import {  ContextMenu,  ContextMenuTrigger,  ContextMenuContent,  ContextMenuLabel,  ContextMenuItem,  ContextMenuShortcut,  ContextMenuSeparator,} from "@axe/ui";<ContextMenu>  <ContextMenuTrigger asChild>    <div className="card">우클릭 가능한 영역</div>  </ContextMenuTrigger>  <ContextMenuContent>    <ContextMenuLabel>액션</ContextMenuLabel>    <ContextMenuItem onSelect={open}>      열기 <ContextMenuShortcut>⏎</ContextMenuShortcut>    </ContextMenuItem>    <ContextMenuItem onSelect={duplicate}>복제</ContextMenuItem>    <ContextMenuSeparator />    <ContextMenuItem variant="danger" onSelect={remove}>삭제</ContextMenuItem>  </ContextMenuContent></ContextMenu>
02서브메뉴tsxfragment
서브메뉴
import {  ContextMenu,  ContextMenuTrigger,  ContextMenuContent,  ContextMenuItem,  ContextMenuSub,  ContextMenuSubTrigger,  ContextMenuSubContent,} from "@axe/ui";<ContextMenu>  <ContextMenuTrigger asChild>    <div className="row">행</div>  </ContextMenuTrigger>  <ContextMenuContent>    <ContextMenuItem onSelect={edit}>편집</ContextMenuItem>    <ContextMenuSub>      <ContextMenuSubTrigger>이동</ContextMenuSubTrigger>      <ContextMenuSubContent>        <ContextMenuItem onSelect={() => moveTo("inbox")}>보관함</ContextMenuItem>        <ContextMenuItem onSelect={() => moveTo("archive")}>아카이브</ContextMenuItem>      </ContextMenuSubContent>    </ContextMenuSub>  </ContextMenuContent></ContextMenu>
03 · React

Props

TSX 소스가 진실입니다. 주요 export 컴포넌트의 public API만 노출합니다.

이름타입필수기본값설명
openboolean열림 상태 (controlled). Radix Root prop.
onOpenChange(open: boolean) => void열림/닫힘 콜백 (Root).
modalbooleantruetrue 면 바깥 스크롤/포커스를 잠금 (Root).
withPortalbooleantrueContextMenuContent 를 portal 로 띄울지 — overflow:hidden 부모 탈출.
variant"default" | "danger""default"ContextMenuItem 톤. danger=파괴적 액션의 텍스트/highlighted bg 를 danger 로.
iconReact.ReactNodeContextMenuItem 좌측 아이콘 슬롯 (선택).
...rest각 Radix ContextMenu.* propsTrigger(asChild·우클릭 대상)·Content(collisionPadding)·Item(onSelect/disabled)·CheckboxItem/RadioItem 등 각 파트는 대응 Radix 컴포넌트 props 를 그대로 전파. DropdownMenu 와 달리 sideOffset·Arrow 는 없다(커서 위치 표시).
04 · Any stack

.axe-* 클래스 계약

React 밖에서도 같은 표면을 그리는 공개 계약입니다. stable은 minor 버전 안에서 이름을 바꾸지 않습니다.

클래스안정성용도
.axe-dropdown-menu__contentstable커서 위치에 뜨는 메뉴 패널 표면(DropdownMenu 와 공유).
.axe-dropdown-menu__sub-contentstable서브메뉴 패널(공유).
.axe-dropdown-menu__itemstable메뉴 항목 row(공유).
.axe-dropdown-menu__item--dangerstabledanger 변형 항목(공유).
.axe-dropdown-menu__labelstable그룹 제목(공유).
.axe-dropdown-menu__separatorstable그룹 구분선(공유).
.axe-dropdown-menu__shortcutstable우측 정렬 단축키 힌트 슬롯(공유).
.axe-dropdown-menu__item--checkboxinternalcheckbox 항목 layout 변형(자동 적용).
.axe-dropdown-menu__item--radiointernalradio 항목 layout 변형(자동 적용).
.axe-dropdown-menu__item--sub-triggerinternal서브메뉴 여는 항목 layout(자동 적용).
.axe-dropdown-menu__item-indicatorinternal체크/도트 표시 슬롯(Radix ItemIndicator).
.axe-dropdown-menu__item-iconinternal항목 좌측 아이콘 슬롯 span.
.axe-dropdown-menu__item-labelinternal항목 가운데 라벨 span.
.axe-dropdown-menu__sub-chevroninternalsub-trigger 우측 chevron 아이콘.
비-React 소비 노트
열림 트리거(우클릭/long-press)·커서 앵커링·항목 하이라이트가 Radix 런타임에 의존해 CSS-only 로는 재현할 수 없다. 표면 스타일은 DropdownMenu 의 .axe-dropdown-menu__* 를 그대로 공유하므로 별도 CSS 토큰이 없다 — 실제 소비는 React 컴포넌트로.
05 · Inclusive

접근성

키보드, ARIA, 구현 노트를 함께 검토합니다.

Keyboard
  • 포커스된 트리거에서 ContextMenu 키(또는 Shift+F10)로 열기
  • ↑/↓ 로 항목 이동, Home/End 로 처음/끝
  • 글자 입력 시 type-ahead 로 해당 항목 점프
  • → 로 서브메뉴 열기, ← 로 닫고 상위로
  • Enter/Space 로 항목 실행, Esc 로 닫기(트리거로 포커스 복원)
ARIA

Radix 가 콘텐츠에 role=menu, 각 항목에 role=menuitem(체크박스=menuitemcheckbox, 라디오=menuitemradio)을 부여. 현재 항목은 data-highlighted, 비활성은 data-disabled. 마우스 우클릭 외에 터치의 길게 누르기(long-press)로도 열린다.

Notes

커서(또는 long-press) 지점에 앵커되어 뜬다. modal 기본(바깥 클릭·스크롤 잠금). 닫힘 시 트리거로 포커스 복원. prefers-reduced-motion 시 애니메이션 제거.

06 · Judgment

권장 · 지양

권장
  • 우클릭 컨텍스트가 있는 표면(행·카드·캔버스)에만 붙인다 — 발견성이 낮으니 보조 경로로.
  • 같은 액션을 툴바/DropdownMenu 등 눈에 보이는 경로로도 제공.
  • 항목 의미는 DropdownMenu 와 동일하게 유지(같은 표면·같은 규칙).
지양
  • 유일한 액션 경로로 삼지 말 것 — 우클릭은 터치/키보드 발견성이 낮다.
  • 메뉴에 폼·긴 인터랙티브 컨텐츠를 넣지 말 것.
검색창을 열면 컴포넌트 인덱스를 불러옵니다.