Tabs
Tabs는 관련 콘텐츠를 패널별로 전환하는 내비게이션 컴포넌트입니다. 3가지 variant와 4가지 사이즈로 다양한 레이아웃에 대응합니다.
Playground
Account settings content
<Tabs defaultValue="account">
<Tabs.List>
<Tabs.Trigger value="account">Account</Tabs.Trigger>
<Tabs.Trigger value="settings">Settings</Tabs.Trigger>
<Tabs.Trigger value="notifications">Notifications</Tabs.Trigger>
</Tabs.List>
<Tabs.Content value="account">
<p className="text-sm text-text-muted">Account settings content</p>
</Tabs.Content>
<Tabs.Content value="settings">
<p className="text-sm text-text-muted">General settings content</p>
</Tabs.Content>
<Tabs.Content value="notifications">
<p className="text-sm text-text-muted">Notification preferences</p>
</Tabs.Content>
</Tabs>Variants
line
Content for tab 1
<Tabs defaultValue="tab1">
<Tabs.List variant="line">
<Tabs.Trigger value="tab1">Tab 1</Tabs.Trigger>
<Tabs.Trigger value="tab2">Tab 2</Tabs.Trigger>
<Tabs.Trigger value="tab3">Tab 3</Tabs.Trigger>
</Tabs.List>
<Tabs.Content value="tab1">
<p className="text-sm text-text-muted">Content for tab 1</p>
</Tabs.Content>
<Tabs.Content value="tab2">
<p className="text-sm text-text-muted">Content for tab 2</p>
</Tabs.Content>
<Tabs.Content value="tab3">
<p className="text-sm text-text-muted">Content for tab 3</p>
</Tabs.Content>
</Tabs>enclosed
Content for tab 1
<Tabs defaultValue="tab1">
<Tabs.List variant="enclosed">
<Tabs.Trigger value="tab1">Tab 1</Tabs.Trigger>
<Tabs.Trigger value="tab2">Tab 2</Tabs.Trigger>
<Tabs.Trigger value="tab3">Tab 3</Tabs.Trigger>
</Tabs.List>
<Tabs.Content value="tab1">
<p className="text-sm text-text-muted">Content for tab 1</p>
</Tabs.Content>
<Tabs.Content value="tab2">
<p className="text-sm text-text-muted">Content for tab 2</p>
</Tabs.Content>
<Tabs.Content value="tab3">
<p className="text-sm text-text-muted">Content for tab 3</p>
</Tabs.Content>
</Tabs>pill
Content for tab 1
<Tabs defaultValue="tab1">
<Tabs.List variant="pill">
<Tabs.Trigger value="tab1">Tab 1</Tabs.Trigger>
<Tabs.Trigger value="tab2">Tab 2</Tabs.Trigger>
<Tabs.Trigger value="tab3">Tab 3</Tabs.Trigger>
</Tabs.List>
<Tabs.Content value="tab1">
<p className="text-sm text-text-muted">Content for tab 1</p>
</Tabs.Content>
<Tabs.Content value="tab2">
<p className="text-sm text-text-muted">Content for tab 2</p>
</Tabs.Content>
<Tabs.Content value="tab3">
<p className="text-sm text-text-muted">Content for tab 3</p>
</Tabs.Content>
</Tabs>Sizes
smmddefaultlg| Size | 높이 | 폰트 | 가로 패딩 | 미리보기 |
|---|---|---|---|---|
sm | 32px | 13px | 12px | |
md | 36px | 13px | 14px | |
default | 40px | 14px | 16px | |
lg | 48px | 16px | 24px |
Features
Fitted
Account content
<Tabs defaultValue="tab1">
<Tabs.List fitted>
<Tabs.Trigger value="tab1">Account</Tabs.Trigger>
<Tabs.Trigger value="tab2">Settings</Tabs.Trigger>
<Tabs.Trigger value="tab3">Notifications</Tabs.Trigger>
</Tabs.List>
</Tabs>With Icons
Account settings
<Tabs defaultValue="account">
<Tabs.List>
<Tabs.Trigger value="account"><User /> Account</Tabs.Trigger>
<Tabs.Trigger value="settings"><Settings /> Settings</Tabs.Trigger>
<Tabs.Trigger value="notifications"><Bell /> Notifications</Tabs.Trigger>
</Tabs.List>
</Tabs>Disabled
Active tab content
<Tabs defaultValue="tab1">
<Tabs.List>
<Tabs.Trigger value="tab1">Active</Tabs.Trigger>
<Tabs.Trigger value="tab2" disabled>Disabled</Tabs.Trigger>
<Tabs.Trigger value="tab3">Active</Tabs.Trigger>
</Tabs.List>
</Tabs>API
Component Structure
Tabs— Radix Tabs.ListProps탭 바 (variant, size, color, radius, fitted).TriggerProps탭 버튼.ContentProps탭 패널Props
Tabs (Root)
defaultValueundefinedstring기본 선택 탭 값 (비제어 모드)
valueundefinedstring선택된 탭 값 (제어 모드)
onValueChangeundefined(value: string) => void탭 변경 시 콜백
orientation"horizontal""horizontal" | "vertical"탭 방향
activationMode"automatic""automatic" | "manual"탭 활성화 모드: automatic은 포커스 이동 시 즉시 전환, manual은 Enter/Space 필요
| Name | Type | Default | Description |
|---|---|---|---|
defaultValue | string | undefined | 기본 선택 탭 값 (비제어 모드) |
value | string | undefined | 선택된 탭 값 (제어 모드) |
onValueChange | (value: string) => void | undefined | 탭 변경 시 콜백 |
orientation | "horizontal" | "vertical" | "horizontal" | 탭 방향 |
activationMode | "automatic" | "manual" | "automatic" | 탭 활성화 모드: automatic은 포커스 이동 시 즉시 전환, manual은 Enter/Space 필요 |
Tabs.List
variant"line""line" | "enclosed" | "pill"탭 목록의 시각 스타일
size"default""sm" | "md" | "default" | "lg"탭 트리거 사이즈
color"default""default" | "primary"활성 인디케이터 색상 (line variant 전용)
radius"md""none" | "sm" | "base" | "md" | "lg" | "xl" | "2xl" | "3xl" | "full"모서리 둥글기: enclosed는 상단 모서리 none~xl, pill은 컨테이너 9단계
fittedfalseboolean탭을 부모 너비에 균등하게 배치
| Name | Type | Default | Description |
|---|---|---|---|
variant | "line" | "enclosed" | "pill" | "line" | 탭 목록의 시각 스타일 |
size | "sm" | "md" | "default" | "lg" | "default" | 탭 트리거 사이즈 |
color | "default" | "primary" | "default" | 활성 인디케이터 색상 (line variant 전용) |
radius | "none" | "sm" | "base" | "md" | "lg" | "xl" | "2xl" | "3xl" | "full" | "md" | 모서리 둥글기: enclosed는 상단 모서리 none~xl, pill은 컨테이너 9단계 |
fitted | boolean | false | 탭을 부모 너비에 균등하게 배치 |
Tabs.Trigger
value—string탭의 고유 식별 값 (필수)
disabledfalseboolean탭 비활성화
| Name | Type | Default | Description |
|---|---|---|---|
value | string | — | 탭의 고유 식별 값 (필수) |
disabled | boolean | false | 탭 비활성화 |
Tabs.Content
value—string연결될 탭 값 (필수)
forceMountundefinedboolean비활성 시에도 DOM 유지 (애니메이션용)
| Name | Type | Default | Description |
|---|---|---|---|
value | string | — | 연결될 탭 값 (필수) |
forceMount | boolean | undefined | 비활성 시에도 DOM 유지 (애니메이션용) |
Anatomy
40px16pxmt-4Best Practices
권장
- ✓탭 라벨은 짧고 명확하게 (1~2단어)
- ✓관련 콘텐츠 그룹화에 사용
- ✓아이콘으로 탭 내용을 시각적으로 보조
- ✓기본값으로 가장 중요한 탭을 선택 상태로 설정
지양
- ✗탭을 너무 많이 사용하지 않기 (5개 이하 권장)
- ✗페이지 내비게이션 목적으로 사용하지 않기
- ✗탭 순서를 동적으로 변경하지 않기
- ✗탭 안에 탭을 중첩하지 않기
Accessibility
키보드 조작
ARIA / WCAG
role="tablist"/role="tab"/role="tabpanel"- aria-selected로 선택 상태 자동 표시
- aria-orientation 자동 설정
- disabled 탭은 키보드 내비게이션에서 건너뜀
Tabs vs Segmented
비슷해 보이지만 용도와 구조가 다릅니다. 적절한 컴포넌트를 선택하세요.
용도
Tabs: 콘텐츠 내비게이션
Segmented: 값 선택 (필터, 전환)
구조
Tabs: TabList + TabPanel 조합
Segmented: 단독 컴포넌트
결과
Tabs: 패널 전환 표시
Segmented: 같은 영역 내 데이터 변경
배치
Tabs: 페이지/섹션 상단
Segmented: 콘텐츠 내 어디서든
Radix Primitive
Tabs: @radix-ui/react-tabs
Segmented: RadioGroup
| 특징 | Tabs | Segmented |
|---|---|---|
| 용도 | 콘텐츠 내비게이션 | 값 선택 (필터, 전환) |
| 구조 | TabList + TabPanel 조합 | 단독 컴포넌트 |
| 결과 | 패널 전환 표시 | 같은 영역 내 데이터 변경 |
| 배치 | 페이지/섹션 상단 | 콘텐츠 내 어디서든 |
| Radix Primitive | @radix-ui/react-tabs | RadioGroup |
구분 포인트: Tabs는 서로 다른 콘텐츠 패널을 전환할 때 사용합니다. Segmented는 같은 콘텐츠 영역 내 표시를 변경할 때 사용합니다. 비슷해 보이는 경우(Tabs pill vs Segmented default)에도 Tabs.Content 패널 유무로 선택하세요.