Get startedFoundationsComponentsPatternsRules

Dropdown Menu

드롭다운 메뉴는 버튼을 눌러 액션이나 선택지 목록을 펼쳐 보여줘요.

설치

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

Examples

Groups

관련된 항목은 DropdownItemGroup 으로 묶어요. 그룹이 여러 개면 title 로 짧은 제목을 달고, 두 번째 그룹부터 hasSeparator 로 구분선을 넣어요.

Items

DropdownItem 은 elemBefore·elemAfter 로 앞뒤에 아이콘이나 단축키를 넣고, description 으로 보조 설명을 붙여요. href 를 주면 링크로 그려지고, isSelected·isDisabled 상태도 가져요.

Checkbox

여러 개를 동시에 고르는 필터에는 DropdownItemCheckboxGroup 과 DropdownItemCheckbox 를 써요. 항목을 눌러도 메뉴가 닫히지 않고, 메뉴를 다시 열어도 선택이 유지돼요.

Radio

하나만 고르는 설정에는 DropdownItemRadioGroup 과 DropdownItemRadio 를 써요. 같은 그룹 id 안에서는 하나만 선택돼요.

Density

spacing 으로 항목 밀도를 바꿔요. 기본 cozy 는 40px, 정보가 많은 화면용 compact 는 32px 이에요.

Custom trigger

trigger 에 함수를 넘기면 원하는 요소를 트리거로 쓸 수 있어요. "더 보기" 메뉴처럼 아이콘 버튼으로 열 때는 받은 triggerRef 와 나머지 props 를 그대로 전달하고, label 로 이름을 꼭 붙여요.

States

isLoading 이면 항목 대신 스피너를 보여줘요. isOpen 과 onOpenChange 로 열림 상태를 직접 제어할 수도 있어요.

Placement

placement 로 트리거 기준 위치를 정해요. 기본값은 bottom-start 이고, 화면 끝에 닿으면 shouldFlip 덕분에 반대쪽으로 뒤집혀요. 메뉴는 놓인 방향에서 8px 미끄러지며 나타나고(150ms), 4px 되돌아가며 사라져요(100ms).

Full width

shouldFitContainer 를 켜면 메뉴 너비가 트리거 너비와 같아져요.

Usage guidelines

드롭다운 메뉴는 고르면 바로 무언가가 실행되는 명령 메뉴나 이동 메뉴에 써요. 항목이 대략 5~15개일 때 가장 잘 맞아요.

  • 이럴 때 써요: 페이지·이슈의 액션 모음, 아이콘 버튼으로 여는 "더 보기" 메뉴, 아바타로 여는 프로필 메뉴
  • 다른 컴포넌트가 나을 때: 목록에서 검색하거나 값을 골라 입력해야 하면 Select, 폼에서 여러 값을 받으면 Checkbox, 짧은 목록에서 하나를 고르면 Radio 를 써요.
  • 순서: 항목을 논리적인 순서로 두고, 가장 많이 고르는 항목을 위에 둬요. 시간이 지나면 순서와 필요 여부를 다시 살펴요.
  • 그룹: 긴 목록은 관련 항목끼리 묶고 짧은 그룹 제목을 붙여요.
  • 중첩: 메뉴 안의 메뉴는 2단계까지만 써요.
  • 너비: 메뉴는 가장 긴 항목에 맞춰 최대 800px 까지 넓어지고, 그보다 길면 잘려요. 잘리지 않도록 문구를 짧게 써요.
Do· 동사로 시작해요
액션 항목은 "이슈 복제", "링크 복사"처럼 동사로, 이동 항목은 "프로필"처럼 명사로 써요.
Don't· 길고 장황한 문구
한 항목이 두 줄로 넘어가거나 "이 이슈를 복제하기" 같은 군더더기가 붙지 않게 해요.
  • 라벨은 정확하고 간결하게, 문장형 대소문자로 써요. 사람들은 라벨만 보고 항목을 고르기 때문이에요.
  • 트리거를 비활성으로 두지 않아요. 쓸 수 없는 이유를 메뉴 안이나 다른 방식으로 알려줘요.

Accessibility

  • 트리거는 aria-haspopup="menu" 와 aria-expanded 를 가지고, 메뉴는 role="menu", 항목은 menuitem · menuitemcheckbox · menuitemradio 로 읽혀요.
  • 키보드로 열면(Enter, Space, ↓) 첫 항목에 포커스가 가요. 마우스로 열어도 첫 항목에 포커스를 주려면 autoFocus 를 켜요.
  • ↑/↓ 로 항목을 이동하고, Enter/Space 로 실행하며, Esc 로 닫으면 포커스가 트리거로 돌아가요. 다른 곳으로 돌려보내려면 returnFocusRef 를 써요.
  • 아이콘만 있는 트리거나 같은 라벨의 메뉴가 여러 개면 label 로 구분되는 이름을 붙여요. 메뉴 자체의 이름은 menuLabel 로 줘요.
  • 그룹이 여러 개면 각 그룹에 title 을 달아 구조를 알려줘요. 제목은 화면에만 보이고 스크린 리더에는 그룹 이름으로 읽혀요.
  • 모달 안에서 쓸 때는 shouldRenderToParent 로 포털 없이 트리거 옆에 그려 포커스를 잃지 않게 해요.

Props

Prop

Type

Prop

Type

Prop

Type

Prop

Type

On this page