ContextMenu
먼저 보고, 그다음 계약을 읽습니다
우클릭(또는 길게 누르기)으로 대상 영역 위에 여는 컨텍스트 액션 메뉴 (Radix ContextMenu 기반).
Component intent의도와 경계 읽기
DropdownMenu 와 **같은** .axe-dropdown-menu__* 표면·항목·indicator·shortcut·separator 를 재사용한다(새 CSS 없음). 차이는 트리거뿐 — DropdownMenu 는 버튼 클릭으로 트리거 아래에, ContextMenu 는 대상 영역 우클릭으로 커서 위치에 뜬다(그래서 sideOffset 개념이 없다). ContextMenu(Root)·ContextMenuTrigger(우클릭 대상)·ContextMenuContent·ContextMenuItem 를 기본으로, Label·Separator·Shortcut·Checkbox/RadioItem·Sub 를 조합한다.
예제
SSOT에 등록된 실제 API 기준 snippet입니다. standalone 배지만 독립 실행 단위이며, fragment는 주변 state·handler 문맥을 생략합니다.
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>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>Props
TSX 소스가 진실입니다. 주요 export 컴포넌트의 public API만 노출합니다.
| 이름 | 타입 | 필수 | 기본값 | 설명 |
|---|---|---|---|---|
open | boolean | — | — | 열림 상태 (controlled). Radix Root prop. |
onOpenChange | (open: boolean) => void | — | — | 열림/닫힘 콜백 (Root). |
modal | boolean | — | true | true 면 바깥 스크롤/포커스를 잠금 (Root). |
withPortal | boolean | — | true | ContextMenuContent 를 portal 로 띄울지 — overflow:hidden 부모 탈출. |
variant | "default" | "danger" | — | "default" | ContextMenuItem 톤. danger=파괴적 액션의 텍스트/highlighted bg 를 danger 로. |
icon | React.ReactNode | — | — | ContextMenuItem 좌측 아이콘 슬롯 (선택). |
...rest | 각 Radix ContextMenu.* props | — | — | Trigger(asChild·우클릭 대상)·Content(collisionPadding)·Item(onSelect/disabled)·CheckboxItem/RadioItem 등 각 파트는 대응 Radix 컴포넌트 props 를 그대로 전파. DropdownMenu 와 달리 sideOffset·Arrow 는 없다(커서 위치 표시). |
.axe-* 클래스 계약
React 밖에서도 같은 표면을 그리는 공개 계약입니다. stable은 minor 버전 안에서 이름을 바꾸지 않습니다.
| 클래스 | 안정성 | 용도 |
|---|---|---|
.axe-dropdown-menu__content | stable | 커서 위치에 뜨는 메뉴 패널 표면(DropdownMenu 와 공유). |
.axe-dropdown-menu__sub-content | stable | 서브메뉴 패널(공유). |
.axe-dropdown-menu__item | stable | 메뉴 항목 row(공유). |
.axe-dropdown-menu__item--danger | stable | danger 변형 항목(공유). |
.axe-dropdown-menu__label | stable | 그룹 제목(공유). |
.axe-dropdown-menu__separator | stable | 그룹 구분선(공유). |
.axe-dropdown-menu__shortcut | stable | 우측 정렬 단축키 힌트 슬롯(공유). |
.axe-dropdown-menu__item--checkbox | internal | checkbox 항목 layout 변형(자동 적용). |
.axe-dropdown-menu__item--radio | internal | radio 항목 layout 변형(자동 적용). |
.axe-dropdown-menu__item--sub-trigger | internal | 서브메뉴 여는 항목 layout(자동 적용). |
.axe-dropdown-menu__item-indicator | internal | 체크/도트 표시 슬롯(Radix ItemIndicator). |
.axe-dropdown-menu__item-icon | internal | 항목 좌측 아이콘 슬롯 span. |
.axe-dropdown-menu__item-label | internal | 항목 가운데 라벨 span. |
.axe-dropdown-menu__sub-chevron | internal | sub-trigger 우측 chevron 아이콘. |
접근성
키보드, ARIA, 구현 노트를 함께 검토합니다.
- 포커스된 트리거에서 ContextMenu 키(또는 Shift+F10)로 열기
- ↑/↓ 로 항목 이동, Home/End 로 처음/끝
- 글자 입력 시 type-ahead 로 해당 항목 점프
- → 로 서브메뉴 열기, ← 로 닫고 상위로
- Enter/Space 로 항목 실행, Esc 로 닫기(트리거로 포커스 복원)
Radix 가 콘텐츠에 role=menu, 각 항목에 role=menuitem(체크박스=menuitemcheckbox, 라디오=menuitemradio)을 부여. 현재 항목은 data-highlighted, 비활성은 data-disabled. 마우스 우클릭 외에 터치의 길게 누르기(long-press)로도 열린다.
커서(또는 long-press) 지점에 앵커되어 뜬다. modal 기본(바깥 클릭·스크롤 잠금). 닫힘 시 트리거로 포커스 복원. prefers-reduced-motion 시 애니메이션 제거.