본문으로 건너뛰기

ContextMenu

마우스 우클릭 또는 길게 누르기 동작에 반응하여 컨텍스트 메뉴를 표시하는 컴포넌트입니다.

기본 사용법

import { 
ContextMenu,
ContextMenuTrigger,
ContextMenuContent,
ContextMenuItem,
ContextMenuSeparator,
ContextMenuSub,
ContextMenuSubTrigger,
ContextMenuSubContent,
ContextMenuCheckboxItem,
ContextMenuRadioGroup,
ContextMenuRadioItem,
ContextMenuLabel
} from 'react-common-components-library';

function ContextMenuExample() {
return (
<ContextMenu>
<ContextMenuTrigger className="flex h-40 w-96 items-center justify-center rounded-md border border-dashed">
<span>우클릭하여 메뉴 열기</span>
</ContextMenuTrigger>

<ContextMenuContent className="w-64">
<ContextMenuItem>
새로 만들기
</ContextMenuItem>
<ContextMenuItem>
새로고침
</ContextMenuItem>
<ContextMenuSeparator />
<ContextMenuItem>
복사
</ContextMenuItem>
<ContextMenuItem>
붙여넣기
</ContextMenuItem>
<ContextMenuSeparator />
<ContextMenuItem>
속성
</ContextMenuItem>
</ContextMenuContent>
</ContextMenu>
);
}
우클릭하여 메뉴 열기

새로 만들기

새로고침

복사

붙여넣기

속성

서브메뉴 사용

서브메뉴를 사용하여 계층적인 메뉴 구조를 만들 수 있습니다:

import { 
ContextMenu,
ContextMenuTrigger,
ContextMenuContent,
ContextMenuItem,
ContextMenuSeparator,
ContextMenuSub,
ContextMenuSubTrigger,
ContextMenuSubContent
} from 'react-common-components-library';

function ContextMenuWithSubmenuExample() {
return (
<ContextMenu>
<ContextMenuTrigger className="flex h-40 w-96 items-center justify-center rounded-md border border-dashed">
<span>우클릭하여 메뉴 열기</span>
</ContextMenuTrigger>

<ContextMenuContent className="w-64">
<ContextMenuItem>
새로 만들기
</ContextMenuItem>

<ContextMenuSub>
<ContextMenuSubTrigger>
정렬 기준
</ContextMenuSubTrigger>
<ContextMenuSubContent className="w-48">
<ContextMenuItem>
이름
</ContextMenuItem>
<ContextMenuItem>
날짜
</ContextMenuItem>
<ContextMenuItem>
크기
</ContextMenuItem>
<ContextMenuItem>
유형
</ContextMenuItem>
</ContextMenuSubContent>
</ContextMenuSub>

<ContextMenuSeparator />

<ContextMenuItem>
속성
</ContextMenuItem>
</ContextMenuContent>
</ContextMenu>
);
}
우클릭하여 메뉴 열기

새로 만들기

정렬 기준

이름

날짜

크기

유형

속성

체크박스 및 라디오 항목

체크박스와 라디오 버튼 항목을 사용하여 선택 가능한 메뉴를 만들 수 있습니다:

import { 
ContextMenu,
ContextMenuTrigger,
ContextMenuContent,
ContextMenuCheckboxItem,
ContextMenuRadioGroup,
ContextMenuRadioItem,
ContextMenuLabel,
ContextMenuSeparator
} from 'react-common-components-library';
import { useState } from 'react';

function ContextMenuWithSelectionExample() {
const [showLineNumbers, setShowLineNumbers] = useState(true);
const [showMinimap, setShowMinimap] = useState(false);
const [theme, setTheme] = useState("light");

return (
<ContextMenu>
<ContextMenuTrigger className="flex h-40 w-96 items-center justify-center rounded-md border border-dashed">
<span>우클릭하여 메뉴 열기</span>
</ContextMenuTrigger>

<ContextMenuContent className="w-64">
<ContextMenuLabel>보기 옵션</ContextMenuLabel>

<ContextMenuCheckboxItem
checked={showLineNumbers}
onCheckedChange={setShowLineNumbers}
>
줄 번호 표시
</ContextMenuCheckboxItem>

<ContextMenuCheckboxItem
checked={showMinimap}
onCheckedChange={setShowMinimap}
>
미니맵 표시
</ContextMenuCheckboxItem>

<ContextMenuSeparator />

<ContextMenuLabel>테마</ContextMenuLabel>
<ContextMenuRadioGroup value={theme} onValueChange={setTheme}>
<ContextMenuRadioItem value="light">
라이트 모드
</ContextMenuRadioItem>
<ContextMenuRadioItem value="dark">
다크 모드
</ContextMenuRadioItem>
<ContextMenuRadioItem value="system">
시스템 설정 따르기
</ContextMenuRadioItem>
</ContextMenuRadioGroup>
</ContextMenuContent>
</ContextMenu>
);
}
우클릭하여 메뉴 열기
보기 옵션
줄 번호 표시
미니맵 표시
테마
라이트 모드
다크 모드
시스템 설정 따르기

아이콘과 함께 사용

아이콘을 추가하여 메뉴 항목을 더 직관적으로 표시할 수 있습니다:

import { 
ContextMenu,
ContextMenuTrigger,
ContextMenuContent,
ContextMenuItem,
ContextMenuSeparator
} from 'react-common-components-library';
import {
CopyIcon,
PasteIcon,
CutIcon,
TrashIcon
} from 'react-common-components-library/icons';

function ContextMenuWithIconsExample() {
return (
<ContextMenu>
<ContextMenuTrigger className="flex h-40 w-96 items-center justify-center rounded-md border border-dashed">
<span>우클릭하여 메뉴 열기</span>
</ContextMenuTrigger>

<ContextMenuContent className="w-64">
<ContextMenuItem>
<CopyIcon className="mr-2 h-4 w-4" />
<span>복사</span>
</ContextMenuItem>

<ContextMenuItem>
<PasteIcon className="mr-2 h-4 w-4" />
<span>붙여넣기</span>
</ContextMenuItem>

<ContextMenuItem>
<CutIcon className="mr-2 h-4 w-4" />
<span>잘라내기</span>
</ContextMenuItem>

<ContextMenuSeparator />

<ContextMenuItem className="text-red-500">
<TrashIcon className="mr-2 h-4 w-4" />
<span>삭제</span>
</ContextMenuItem>
</ContextMenuContent>
</ContextMenu>
);
}
우클릭하여 메뉴 열기
복사
붙여넣기
잘라내기
삭제

API 참조

ContextMenu Props

속성타입기본값설명
childrenReactNode필수ContextMenu 컴포넌트의 자식 요소
onOpenChange(open: boolean) => void-메뉴 열림/닫힘 상태 변경 시 호출되는 함수
modalbooleantrue모달 모드로 동작할지 여부
classNamestring''컴포넌트에 적용할 추가 CSS 클래스
styleCSSProperties-컴포넌트에 적용할 인라인 스타일

ContextMenuTrigger Props

속성타입기본값설명
childrenReactNode필수트리거 요소의 자식 요소
asChildbooleanfalse첫 번째 자식 요소로 렌더링할지 여부
disabledbooleanfalse트리거 비활성화 여부
classNamestring''컴포넌트에 적용할 추가 CSS 클래스
styleCSSProperties-컴포넌트에 적용할 인라인 스타일

ContextMenuContent Props

속성타입기본값설명
childrenReactNode필수메뉴 콘텐츠의 자식 요소
loopbooleanfalse메뉴 항목 탐색 시 처음/끝에서 순환할지 여부
onEscapeKeyDown(event: KeyboardEvent) => void-Esc 키 누를 때 호출되는 함수
onPointerDownOutside(event: PointerEvent) => void-메뉴 외부 클릭 시 호출되는 함수
onInteractOutside(event: React.FocusEvent | MouseEvent | TouchEvent) => void-메뉴 외부 상호작용 시 호출되는 함수
forceMountbooleanfalse닫혀 있을 때도 DOM에 마운트할지 여부
classNamestring''컴포넌트에 적용할 추가 CSS 클래스
styleCSSProperties-컴포넌트에 적용할 인라인 스타일

ContextMenuItem Props

속성타입기본값설명
childrenReactNode필수메뉴 항목의 자식 요소
disabledbooleanfalse항목 비활성화 여부
onSelect(event: Event) => void-항목 선택 시 호출되는 함수
insetbooleanfalse체크박스/라디오 항목과 정렬을 맞추기 위한 여백 추가 여부
classNamestring''컴포넌트에 적용할 추가 CSS 클래스
styleCSSProperties-컴포넌트에 적용할 인라인 스타일

ContextMenuCheckboxItem Props

속성타입기본값설명
childrenReactNode필수체크박스 항목의 자식 요소
checkedboolean-체크 상태 (제어 컴포넌트)
onCheckedChange(checked: boolean) => void-체크 상태 변경 시 호출되는 함수
disabledbooleanfalse항목 비활성화 여부
classNamestring''컴포넌트에 적용할 추가 CSS 클래스
styleCSSProperties-컴포넌트에 적용할 인라인 스타일

ContextMenuRadioGroup Props

속성타입기본값설명
childrenReactNode필수라디오 그룹의 자식 요소
valuestring-선택된 라디오 항목의 값 (제어 컴포넌트)
onValueChange(value: string) => void-선택된 값 변경 시 호출되는 함수
classNamestring''컴포넌트에 적용할 추가 CSS 클래스
styleCSSProperties-컴포넌트에 적용할 인라인 스타일

ContextMenuRadioItem Props

속성타입기본값설명
childrenReactNode필수라디오 항목의 자식 요소
valuestring필수라디오 항목의 값
disabledbooleanfalse항목 비활성화 여부
classNamestring''컴포넌트에 적용할 추가 CSS 클래스
styleCSSProperties-컴포넌트에 적용할 인라인 스타일

ContextMenuLabel Props

속성타입기본값설명
childrenReactNode필수레이블의 자식 요소
insetbooleanfalse체크박스/라디오 항목과 정렬을 맞추기 위한 여백 추가 여부
classNamestring''컴포넌트에 적용할 추가 CSS 클래스
styleCSSProperties-컴포넌트에 적용할 인라인 스타일

ContextMenuSeparator Props

속성타입기본값설명
classNamestring''컴포넌트에 적용할 추가 CSS 클래스
styleCSSProperties-컴포넌트에 적용할 인라인 스타일

접근성

ContextMenu 컴포넌트는 다음과 같은 접근성 기능을 제공합니다:

  • WAI-ARIA 메뉴 디자인 패턴을 준수하여 스크린 리더 호환성을 보장합니다.
  • 키보드 탐색을 완벽하게 지원합니다:
    • 위/아래 화살표 키로 메뉴 항목 간 이동
    • 오른쪽 화살표 키로 서브메뉴 열기
    • 왼쪽 화살표 키로 서브메뉴 닫기
    • Enter 또는 Space 키로 항목 선택
    • Esc 키로 메뉴 닫기
  • 체크박스 항목은 aria-checked 속성을 사용하여 현재 상태를 스크린 리더에 알립니다.
  • 라디오 항목은 role="menuitemradio"aria-checked 속성을 사용하여 현재 상태를 스크린 리더에 알립니다.
  • 비활성화된 항목에는 aria-disabled="true"가 적용됩니다.