Get startedFoundationsComponentsPatternsRules

Tabs

탭은 같은 맥락 안에서 서로 관련된 콘텐츠 묶음을 페이지 이동 없이 오가게 해줘요.

설치

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

Examples

Default

Tabs 의 첫 자식은 TabList, 이어지는 자식은 TabPanel 이에요. Tab 과 TabPanel 은 순서대로 짝을 이뤄요. 접근성을 위해 id 는 꼭 넣어요.

선택된 탭은 border.selected 색의 2px(border.width.selected) 밑줄과 text.selected 글자색으로 표시되고, 마우스를 올리면 중립색(border) 밑줄이 150ms 동안 서서히 나타나요. 목록 아래에는 1px 구분선이 깔려요.

선택이 바뀌면 밑줄이 바뀐 방향으로 8px 미끄러져요. 새 탭의 밑줄은 이전 탭 쪽에서 8px 밀려 들어오며 나타나고(150ms, cubic-bezier(0, 0.4, 0, 1)), 이전 탭의 밑줄은 같은 방향으로 8px 밀려나며 사라져요(100ms). RTL 에서는 좌우가 뒤집히고, 동작 줄이기(prefers-reduced-motion)를 켜면 모션 없이 바로 바뀌어요. 긴 탭 이름은 탭 자체에서 말줄임표로 잘려요.

Default selected

defaultSelected 로 처음 열릴 탭의 index 를 정해요. 지정하지 않으면 첫 번째 탭이 열려요.

Controlled

selected 와 onChange 를 함께 넘기면 제어 컴포넌트가 돼요. 탭 바깥의 버튼으로 단계를 옮기는 흐름에 써요.

Unmount panel on change

기본으로는 한 번 열린 패널을 숨긴 채로 유지해서, 탭을 다시 열어도 입력값이나 상태가 남아 있어요. 선택되지 않은 패널을 매번 언마운트하려면 shouldUnmountTabPanelOnChange 를 켜요.

Usage guidelines

탭은 한 페이지 안에서 관련 있는 콘텐츠를 나눠 보여줄 때 써요. 사람들이 페이지를 떠나지 않고 보기를 바꿀 수 있어요.

이럴 때 써요

  • 같은 맥락 안에서 서로 다른 보기로 전환할 때 (예: 이슈의 개요·활동·하위 이슈)
  • 동시에 볼 필요가 없는 독립적인 정보를 나눌 때
  • 자주 오가는 짧은 콘텐츠 묶음을 정리할 때

이럴 땐 쓰지 마세요

  • 다른 페이지나 다른 상태로 이동하는 내비게이션이 필요할 때
  • 한 표를 필터링하는 것처럼 동시에 봐야 하는 정보를 나눌 때
  • 서로 명확히 구분되지 않는 정보를 묶을 때
  • 거의 쓰지 않는 긴 목록이거나 공간이 부족할 때
Do· 공통 정보는 탭 위에
모든 탭에 해당하는 제목이나 정보는 탭 줄 위에 둬요.
Don't· 탭 안에 컨트롤 넣기
탭 라벨 안에 드롭다운이나 버튼 같은 인터랙티브 요소를 넣지 않아요.
  • 중요하거나 자주 쓰는 탭을 앞에 두고, 탭 수는 적게 유지해요.
  • 꼭 봐야 하는 정보는 탭 안에 숨기지 말고 탭 바깥에 보여줘요.
  • 라벨은 한두 단어로 짧고 분명하게 써요. 카테고리끼리 겹치지 않게 나눠요. ("iOS 설정", "Android 설정"은 좋지만 "1부", "2부"는 내용을 알려주지 않아요.)
  • 탭을 고르면 무엇이 나오는지 설명이 필요하면 툴팁을 더해요.

Accessibility

  • 탭 목록에는 role="tablist", 각 탭에는 role="tab" 과 aria-selected, 패널에는 role="tabpanel" 과 aria-labelledby 가 자동으로 붙어요.
  • 선택된 탭만 Tab 키로 포커스를 받아요. 좌·우 화살표로 탭 사이를 이동하면 바로 선택되고(자동 활성화), 끝에서는 반대쪽 끝으로 돌아가요.
  • Home / End 로 첫 번째·마지막 탭으로 이동해요.
  • 탭에서 Tab 키를 누르면 다음 탭이 아니라 패널 콘텐츠로 포커스가 넘어가서, 스크린 리더 사용자가 모든 탭을 거치지 않아도 돼요.
  • 동작 줄이기 설정을 존중하고, 핵심 정보는 탭 바깥에 두며 복잡한 중첩을 피해요.

Props

Tabs

Prop

Type

TabList

Prop

Type

Tab

Prop

Type

TabPanel

Prop

Type

On this page