Get StartedFoundationsComponentsPatternsRulesDevelopAI & ToolsUpdates

Menu

사용자가 취할 수 있는 선택지나 액션 목록을 트리거 주변에 띄워 보여주는 컴포넌트예요.

설치

pnpm dlx shadcn@latest add https://rebar.conmarket-landing.workers.dev/r/menu.json

Anatomy

  • Container: 모든 내부 요소를 감싸며 배경, 그림자, 모서리 값을 결정해요.
  • Menu Group: 연관된 아이템의 집합이에요. 그룹 안에 Group Label과 Item을 담아요. 모든 MenuItem 은 MenuGroup 안에 있어야 해요.
  • Menu Group Label: 그룹의 성격을 나타내는 텍스트예요. 선택할 수 없고 시각적 안내 역할을 해요.
  • Menu Item: 사용자가 누르거나 포커스할 수 있는 최소 단위의 선택지예요. Prefix Icon / Label / Description / Suffix Icon을 담아요.
  • Divider: Menu Group 사이를 나누는 구분선이에요. Item 사이에는 쓰지 않고, 모든 Group 사이에 자동으로 표시돼요.
<MenuRoot>
  <MenuTrigger asChild>...</MenuTrigger>
  <MenuContent>
    <MenuGroup>
      <MenuGroupLabel>그룹 제목</MenuGroupLabel>
      <MenuItem label="항목 1" />
      <MenuItem label="항목 2" />
    </MenuGroup>
    <MenuGroup>
      <MenuItem label="항목 3" />
    </MenuGroup>
  </MenuContent>
</MenuRoot>

Properties

Size

사용자의 시선 이동 동선과 텍스트 가독성의 균형을 기준으로 정해요.

  • Medium (240px): lg 미만 breakpoint에서 사용해요. 엄지손가락 조작 범위와 메뉴명 가독성을 보장하는 최소 터치 너비예요.
  • Small (200px): lg 이상 breakpoint에서 사용해요. 마우스 커서 이동 거리를 줄이고 수직 스캔 속도를 높이는 폭이에요. 모바일에서는 사용하지 않아요.
  • Responsive: lg 미만에서는 Medium, lg 이상에서는 Small로 적용돼요.

Width

컨테이너의 가로 확장 방식을 정해요.

  • Fixed (기본): 각 Size에 지정된 너비를 따라요.
  • Stretch: matchReferenceWidth 를 지정하면 트리거(예: Field Button)와 너비를 맞춰 시각적 종속성을 강조해요.

Height & Quantity

메뉴 개수는 사용자가 한눈에 훑고 기억할 수 있는 범위 안에서 정해요.

  • 그룹화: 항목이 7개를 넘으면 Menu Group과 Divider로 나눠요.
  • 순서: 가장 중요한 액션 그룹을 맨 위에, 삭제처럼 파괴적인 액션 그룹은 맨 아래에 둬요.

메뉴 높이는 최대 480px과 Trigger 주변에 남은 화면 공간 중 더 작은 값으로 정해지고, 항목이 그보다 많으면 메뉴 안에서 스크롤돼요.

Tone

  • Neutral (기본): 일반적인 액션이나 정보 제공에 써요.
  • Critical: 삭제, 탈퇴처럼 위험한 액션에 써요.

State

  • Enabled: 선택할 수 있는 상태예요.
  • Hover/Pressed: 마우스를 올리거나 누르면 좌우가 살짝 들어간 옅은 배경이 나타나고, 누르는 동안 내용이 살짝 작아져요.
  • Focused: 키보드로 포커스하면 포커스 링이 보여요.
  • Disabled: 선택할 수 없는 상태예요. Label, Description, 아이콘 모두 비활성 색상이 적용돼요.

Placement

Menu는 Trigger 요소를 기준으로 위치를 정할 수 있어요. placement 는 {Side}-{Alignment} 조합으로 구성되고, 기본값은 bottom 이에요. 트리거와 메뉴 사이에는 항상 x2(8px) 간격을 둬요.

Smart Positioning

브라우저 뷰포트 경계에서 내용이 잘리지 않도록 위치를 자동으로 고쳐요.

  • Flip: 지정한 Side에 공간이 부족하면 반대편으로 방향을 바꿔요. (예: 하단 공간이 부족하면 Bottom → Top)
  • Shift: 정렬 때문에 메뉴 측면이 화면 밖으로 나가면, 트리거와의 정렬선을 깨더라도 메뉴 전체가 화면 안으로 들어오도록 이동해요.
  • Viewport Margin: 메뉴와 화면 끝 사이에 최소 x2(8px) 여백을 둬요.

Elevation

Menu는 시스템에서 Level 2 계층을 차지하며, 주변 요소와 경계를 구분하는 부드러운 그림자(shadow-s3)를 적용해요.

Guidelines

Icon 사용하기

Menu Item의 아이콘은 선택 사항이에요. 사용할 때는 아래 규칙을 따라요.

  • Prefix: 항목의 의미나 카테고리를 나타낼 때 써요.
  • Suffix: 서브메뉴, 외부 링크 등 방향성을 나타낼 때 써요.
  • Prefix와 Suffix를 동시에 쓰지 않아요. (chevron 은 예외)
  • 아이콘은 반드시 Label과 함께 써요. 아이콘만 단독으로 쓰지 않아요.
  • 같은 레벨의 항목에는 아이콘을 일관되게 쓰거나 모두 쓰지 않아요.
● 저장하기● 공유하기
Do· 아이콘을 일관되게

아이콘을 쓴다면 모든 항목에 일관되게 써요.

● 저장하기공유하기
Don't· 일부만 아이콘

일부 항목에만 아이콘을 쓰지 않아요.

Label 작성하기

Label은 항목의 기능을 명확하고 간결하게 전달하고, Description은 Label만으로 의미 전달이 부족할 때 보조로 써요.

  • Label: 2~6자 안팎, 동사형으로 써요.
  • Description: 한 줄 이내로, Label을 보완하는 설명을 써요.
  • 같은 메뉴 안에서 Label의 어조와 형식을 맞춰요.
  • Description은 필요한 항목에만 골라서 써요. 모든 항목에 일괄로 쓰지 않아요.
  • 줄임말, 전문 용어, 영문 혼용은 피해요.
  • 삭제 같은 파괴적 항목에는 Critical Tone을 적용해요.
수정하기삭제하기되돌릴 수 없어요
Do· 필요한 곳에만 Description

Description은 필요한 항목에만 골라서 써요.

수정하기글을 고쳐요삭제하기되돌릴 수 없어요
Don't· 모든 항목에 Description

모든 항목에 Description을 쓰면 오히려 훑어보기 어려워요.

줄바꿈

기본적으로 한 줄 표시를 권장하지만, 글자 크기 확대와 다국어 환경을 고려해 말줄임 없이 줄바꿈해서 보여줘요.

Props

Prop

Type

Prop

Type

Prop

Type

On this page