Toggle
Toggle은 ON/OFF 두 상태를 전환하는 버튼입니다. 단독으로 사용하거나 ToggleGroup으로 그룹화하여 사용합니다.
4
Variants
5
Sizes
on/off
States
Radix
Base
Playground
미리보기
defaultD40px / 14pxIcon 16px
Variant
Size
Radius
Icon
Label
Weight
State
const [starred, setStarred] = useState(false)
<Toggle
pressed={starred}
onPressedChange={setStarred}
iconOnly
aria-label={starred ? "Unstar" : "Star"}
>
<Star
className={`transition-colors ${
starred ? "fill-yellow-500 text-yellow-500" : ""
}`}
/>
</Toggle>Variants
Default
누르면 배경이 변하는 심플한 스타일, 툴바에 적합
Outline
상태를 명확히 표시하는 테두리 스타일
Ghost
아이콘 색상으로만 상태를 표현, 좋아요 버튼 등에 적합
Outline Ghost
경계는 명확하되 아이콘 색상으로만 상태 표현
Sizes
Icon Only (iconOnly=true)
xs크기28px × 28px
아이콘14px
sm크기32px × 32px
아이콘16px
md크기36px × 36px
아이콘16px
default크기40px × 40px
아이콘20px
lg크기48px × 48px
아이콘24px
| Size | 크기 | 아이콘 | 미리보기 |
|---|---|---|---|
xs | 28px × 28px | 14px | |
sm | 32px × 32px | 16px | |
md | 36px × 36px | 16px | |
default | 40px × 40px | 20px | |
lg | 48px × 48px | 24px |
Icon + Text (iconOnly=false)
xs높이28px
가로 패딩10px
Gap4px
아이콘14px
폰트12px
sm높이32px
가로 패딩12px
Gap8px
아이콘14px
폰트13px
md높이36px
가로 패딩14px
Gap8px
아이콘16px
폰트14px
default높이40px
가로 패딩16px
Gap8px
아이콘16px
폰트14px
lg높이48px
가로 패딩24px
Gap8px
아이콘16px
폰트16px
| 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 |
States
Off
On
Disabled
Disabled On
<Toggle iconOnly variant="outline" aria-label="Off"><Star className="icon-xl" /></Toggle>
<Toggle iconOnly variant="outline" defaultPressed aria-label="On"><Star className="icon-xl fill-yellow-500 text-yellow-500" /></Toggle>
<Toggle iconOnly variant="outline" disabled aria-label="Disabled"><Star className="icon-xl" /></Toggle>
<Toggle iconOnly variant="outline" disabled defaultPressed aria-label="Disabled on"><Star className="icon-xl fill-yellow-500 text-yellow-500" /></Toggle>API
Props
pressedundefinedboolean제어 모드의 ON/OFF 상태
defaultPressedfalseboolean비제어 모드의 초기 상태
onPressedChangeundefined(pressed: boolean) => void상태 변경 시 콜백
variant"default""default" | "outline" | "ghost" | "outline-ghost"시각 스타일. ghost/outline-ghost는 배경 변화 없음 (아이콘 색상만 변경)
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"폰트 두께. normal=400, semibold=600
iconOnlyundefinedboolean아이콘 전용 모드. 정사각형으로 IconButton과 같은 크기 규칙 적용
pressEffectundefinedboolean프레스 이펙트 (active:scale-pressed). 미지정 시 true로 동작. false로 비활성화
disabledfalseboolean비활성 상태
asChildfalsebooleanSlot으로 렌더링
| Name | Type | Default | Description |
|---|---|---|---|
pressed | boolean | undefined | 제어 모드의 ON/OFF 상태 |
defaultPressed | boolean | false | 비제어 모드의 초기 상태 |
onPressedChange | (pressed: boolean) => void | undefined | 상태 변경 시 콜백 |
variant | "default" | "outline" | "ghost" | "outline-ghost" | "default" | 시각 스타일. ghost/outline-ghost는 배경 변화 없음 (아이콘 색상만 변경) |
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" | 폰트 두께. normal=400, semibold=600 |
iconOnly | boolean | undefined | 아이콘 전용 모드. 정사각형으로 IconButton과 같은 크기 규칙 적용 |
pressEffect | boolean | undefined | 프레스 이펙트 (active:scale-pressed). 미지정 시 true로 동작. false로 비활성화 |
disabled | boolean | false | 비활성 상태 |
asChild | boolean | false | Slot으로 렌더링 |
Anatomy
1
2
3
Favorite
state
data-[state=on/off]1
Container
토글 버튼 본체
2
Icon
선택 사항
3
Label
선택 사항
Best Practices
✓
권장
- ✓명확한 ON/OFF 상태를 시각적으로 표시
- ✓aria-label로 목적 설명
- ✓즉시 효과가 반영되는 조작에 사용
- ✓여러 토글은 ToggleGroup으로 그룹화
✕
지양
- ✗제출이 필요한 폼 항목에 사용하지 않기
- ✗상태가 알기 어려운 아이콘 사용하지 않기
- ✗aria-label 없이 사용하지 않기
- ✗단일 선택에는 Segmented 사용
Accessibility
키보드 조작
Space토글 전환
Enter토글 전환
ARIA 속성
aria-pressed자동 부여data-stateon/off- 포커스 인디케이터
aria-label권장