ToggleGroup
ToggleGroup은 여러 Toggle을 그룹화하여 온/오프 상태를 관리하는 컴포넌트입니다. 단일 선택과 다중 선택 모드를 모두 지원합니다.
Playground
<ToggleGroup type="single" variant="outline" defaultValue="grid">
<ToggleGroup.Item value="grid" aria-label="Grid view">
<LayoutGrid />
</ToggleGroup.Item>
<ToggleGroup.Item value="list" aria-label="List view">
<List />
</ToggleGroup.Item>
</ToggleGroup>Types
Variants
Sizes
Icon Only
xssmmddefaultlg| Size | 높이 | 가로 패딩 | 아이콘 | 미리보기 |
|---|---|---|---|---|
xs | 28px | 10px | 14px | |
sm | 32px | 12px | 14px | |
md | 36px | 14px | 16px | |
default | 40px | 16px | 16px | |
lg | 48px | 24px | 16px |
Icon + Text
xssmmddefaultlg| Size | 높이 | 가로 패딩 | Gap | 아이콘 | 폰트 | 미리보기 |
|---|---|---|---|---|---|---|
xs | 28px | 10px | 4px | 14px | 12px | |
sm | 32px | 12px | 8px | 14px | 13px | |
md | 36px | 14px | 8px | 16px | 14px | |
default | 40px | 16px | 8px | 16px | 14px | |
lg | 48px | 24px | 8px | 16px | 16px |
Features
Use Cases
Finder, Dropbox, 이커머스 상품 목록
Figma, Framer, Flexbox 방향 전환
Gmail, Notion, 작업 관리 앱
// Grid/List toggle - Finder, Dropbox style
<ToggleGroup type="single" variant="outline" defaultValue="grid">
<ToggleGroup.Item value="grid" aria-label="Grid view">
<LayoutGrid />
</ToggleGroup.Item>
<ToggleGroup.Item value="list" aria-label="List view">
<List />
</ToggleGroup.Item>
</ToggleGroup>
// Row/Column layout - Figma, Framer style
<ToggleGroup type="single" variant="outline" defaultValue="rows">
<ToggleGroup.Item value="rows" aria-label="Rows">
<Rows />
</ToggleGroup.Item>
<ToggleGroup.Item value="columns" aria-label="Columns">
<Columns />
</ToggleGroup.Item>
</ToggleGroup>
// Card/Compact/Detail - Gmail, Notion style
<ToggleGroup type="single" variant="outline" defaultValue="card">
<ToggleGroup.Item value="card" aria-label="Card view"><Grid /></ToggleGroup.Item>
<ToggleGroup.Item value="compact" aria-label="Compact view"><List /></ToggleGroup.Item>
<ToggleGroup.Item value="detail" aria-label="Detail view"><Rows /></ToggleGroup.Item>
</ToggleGroup>States
Default
기본 상태. 선택된 아이템이 강조 표시됩니다.
Disabled
모든 아이템이 비활성화된 상태
개별 Disabled
특정 아이템만 비활성화
다중 선택
여러 아이템을 동시에 선택할 수 있습니다.
Orientation
Horizontal (기본값)
Vertical
API
Component Structure
ToggleGroup— Radix ToggleGroup.ItemProps토글 아이템Props
ToggleGroup
type—"single" | "multiple"단일 선택 또는 다중 선택 모드
valueundefinedstring | string[]제어 모드에서의 선택 값
defaultValueundefinedstring | string[]비제어 모드에서의 초기 선택 값
onValueChangeundefined(value) => void선택 변경 시 호출되는 콜백
variant"default""default" | "outline"아이템의 시각적 스타일
size"default""xs" | "sm" | "md" | "default" | "lg"아이템 크기 (28/32/36/40/48px)
radius"default""none" | "sm" | "base" | "default" | "lg" | "xl" | "2xl" | "3xl" | "full"모서리 둥글기 크기 (6px)
fontWeight"normal""normal" | "semibold"폰트 굵기. 모든 아이템에 적용. 개별 아이템의 fontWeight로 덮어쓸 수 있음
orientation"horizontal""horizontal" | "vertical"레이아웃 방향
disabledfalseboolean모든 아이템 비활성화
| Name | Type | Default | Description |
|---|---|---|---|
type | "single" | "multiple" | — | 단일 선택 또는 다중 선택 모드 |
value | string | string[] | undefined | 제어 모드에서의 선택 값 |
defaultValue | string | string[] | undefined | 비제어 모드에서의 초기 선택 값 |
onValueChange | (value) => void | undefined | 선택 변경 시 호출되는 콜백 |
variant | "default" | "outline" | "default" | 아이템의 시각적 스타일 |
size | "xs" | "sm" | "md" | "default" | "lg" | "default" | 아이템 크기 (28/32/36/40/48px) |
radius | "none" | "sm" | "base" | "default" | "lg" | "xl" | "2xl" | "3xl" | "full" | "default" | 모서리 둥글기 크기 (6px) |
fontWeight | "normal" | "semibold" | "normal" | 폰트 굵기. 모든 아이템에 적용. 개별 아이템의 fontWeight로 덮어쓸 수 있음 |
orientation | "horizontal" | "vertical" | "horizontal" | 레이아웃 방향 |
disabled | boolean | false | 모든 아이템 비활성화 |
ToggleGroup.Item
value—string아이템의 고유 값
disabledfalseboolean해당 아이템만 비활성화
variantinherit"default" | "outline"이 아이템의 variant 개별 재정의
sizeinherit"xs" | "sm" | "md" | "default" | "lg"이 아이템의 size 개별 재정의
radiusinherit"none" | "sm" | ... | "full"이 아이템의 radius 개별 재정의
fontWeightinherit"normal" | "semibold"이 아이템의 fontWeight 개별 재정의
| Name | Type | Default | Description |
|---|---|---|---|
value | string | — | 아이템의 고유 값 |
disabled | boolean | false | 해당 아이템만 비활성화 |
variant | "default" | "outline" | inherit | 이 아이템의 variant 개별 재정의 |
size | "xs" | "sm" | "md" | "default" | "lg" | inherit | 이 아이템의 size 개별 재정의 |
radius | "none" | "sm" | ... | "full" | inherit | 이 아이템의 radius 개별 재정의 |
fontWeight | "normal" | "semibold" | inherit | 이 아이템의 fontWeight 개별 재정의 |
Customization
모든 아이템은 디자인 시스템 간격 규칙 기반의 기본값을 사용합니다. 그룹의className으로 모든 아이템을 일괄 커스터마이즈할 수 있습니다.
가로 패딩 변경
className="[&>button]:px-10"Icon Only 너비 변경
className="[&>button]:aspect-auto [&>button]:px-5"Tip:기본값은 일관성을 유지하도록 설계되어 있습니다. 필요한 경우에만 커스터마이즈하세요.
Anatomy
Best Practices
권장
- ✓단일 선택에는 type="single" 사용
- ✓다중 선택에는 type="multiple" 사용
- ✓각 아이템에 aria-label 설정
- ✓관련 옵션끼리 그룹화
지양
- ✗아이템을 5개 이상 포함하지 않기
- ✗관련 없는 옵션 섞지 않기
- ✗내비게이션에는 사용하지 않기 (→ Tabs)
- ✗단일 선택에 Segmented 대신 사용하지 않기
Accessibility
키보드 조작
ARIA
role="group"자동 적용aria-pressed자동 적용data-orientation자동 적용aria-label권장
ToggleGroup vs ButtonGroup
겉모습은 비슷하지만 용도와 동작이 다릅니다. 적절한 컴포넌트를 선택하세요.
용도
ToggleGroup: 온/오프 상태 관리
ButtonGroup: 액션 버튼 그룹화
상태 관리
ToggleGroup: 자동 (Radix 관리)
ButtonGroup: 수동 (selected prop)
선택 모드
ToggleGroup: single / multiple
ButtonGroup: 수동 제어만
값 관리
ToggleGroup: value / onValueChange
ButtonGroup: 없음
사용 사례
ToggleGroup: 텍스트 정렬, 서식
ButtonGroup: 페이지네이션, 툴바
| 특징 | ToggleGroup | ButtonGroup |
|---|---|---|
| 용도 | 온/오프 상태 관리 | 액션 버튼 그룹화 |
| 상태 관리 | 자동 (Radix 관리) | 수동 (selected prop) |
| 선택 모드 | single / multiple | 수동 제어만 |
| 값 관리 | value / onValueChange | 없음 |
| 사용 사례 | 텍스트 정렬, 서식 | 페이지네이션, 툴바 |
선택 상태를 유지하려면 ToggleGroup, 클릭 시 액션을 실행하려면 ButtonGroup을 사용하세요.