ComponentsP3 본문

BadgeToggle

필 버튼 단일 선택 그룹 — APG radio group 패턴(roving tabindex + 화살표 이동 + 즉시 선택). 필터 칩 줄에 적합하고 비활성 항목은 건너뜁니다. 비제어(defaultValue) 우선 (DK 사양 승격).

마지막 업데이트 2026-06-11

한눈에#

필 형태로 하나만 켜는 단일 선택 필터 그룹입니다 — RadioGroup과 같은 APG 패턴이지만 시각은 둥근 필(pill)이라 필터 칩 줄에 어울립니다.

  • APG radio group
  • 필 단일 선택
  • showAll '전체' 항목
  • 44px 히트 영역

Tab으로 그룹 진입, 화살표로 순환 이동하며 즉시 선택 — 비활성 항목은 건너뜁니다

사용 시점#

필 줄에서 하나만 켜는 단일 선택 필터면 BadgeToggle — 다중 선택이나 다른 인터랙션 칩은 다른 컴포넌트입니다.

쓴다

상태·기간 필터처럼 '전체' 포함 가로 필 줄에서 하나만 켜는 단일 선택

대신 SegmentedButton

여러 필을 동시에 켜야 할 때(multi)

대신 Chip

assist·input·suggestion 같은 다른 인터랙션 칩이 필요할 때

플레이그라운드#

컨트롤로 props를 조작하면 미리보기와 코드가 실시간 갱신됩니다.

import { BadgeToggle } from '@wds/ui-web';

<BadgeToggle
  aria-label="상태 필터"
  options={[
    { value: 'active', label: '활성' },
    { value: 'pending', label: '대기' },
    { value: 'done', label: '완료' },
  ]}
/>

변형#

showAll — 맨 앞에 '전체'(value='') 항목 합성, defaultValue 없으면 전체가 초기 선택

showAll이면 value=''인 "전체" 항목이 맨 앞에 합성되고, defaultValue가 없을 때 전체가 초기 선택됩니다. allLabel로 라벨을 바꿀 수 있습니다.

비활성 항목 — 키보드 이동·선택에서 건너뜀

크기#

단일 크기입니다 — 시각 32px 필(space.8)에 radius.full이고, 히트 영역은 모든 방향으로 확장돼 44px 터치 타깃을 채웁니다. 라벨이 길어도 줄바꿈 없이 가로로 늘어나며, 그룹은 폭이 부족하면 다음 줄로 래핑됩니다.

상태#

  • Defaultcolor.surface-muted 배경 + color.text-muted 잉크
  • Hover (미선택) — color.surface-hover 배경 + color.text
  • Focus:focus-visiblecolor.focus-ring 2px 아웃라인
  • 선택(aria-checked)color.primary-subtle 배경 + color.primary 보더 + color.primary-text 잉크
  • Disabledcolor.disabled-bg / color.disabled-fg + 커서 차단

Props#

Prop타입기본값설명
optionsReadonlyArray<BadgeToggleOption>항목 배열 (아래 표) — 데이터 prop 방식
defaultValuestring초기 선택 value — 이후 상태는 내부 소유(비제어)
onChange(value: string) => void선택 변경 콜백 — 같은 값 재선택은 발화하지 않음 (showAll의 전체는 value="")
showAllbooleanfalse맨 앞에 '전체'(value='') 항목 합성 — defaultValue 없으면 전체가 초기 선택
allLabelstring'전체'showAll 항목의 라벨
aria-labelstring필터 그룹의 접근성 이름 — radiogroup 계약상 필수
…restOmit<HTMLAttributes<HTMLDivElement>, 'onChange' | 'defaultValue'>className 등은 그룹 div(role=radiogroup)로 전달

BadgeToggleOption:

Prop타입기본값설명
valuestring고유 value — 선택 식별자
labelstring필 버튼에 표시되는 라벨
disabledbooleanfalse선택 차단 — 키보드 이동에서도 건너뜀

접근성#

그룹이 role="radiogroup"(이름은 aria-label 필수), 각 항목이 button[role="radio"] + aria-checked입니다. roving tabindex로 선택된 항목(없으면 첫 활성 항목)만 tabIndex=0이 되어 그룹 진입 후 화살표로 이동합니다.

동작
Tab그룹 진입 — 선택(없으면 첫 활성) 항목에 포커스
/ 다음 활성 항목으로 이동 + 즉시 선택 (순환, 비활성 건너뜀)
/ 이전 활성 항목으로 이동 + 즉시 선택 (순환, 비활성 건너뜀)
Space / Enter포커스 항목 선택 (네이티브 button 클릭)

비활성 항목은 네이티브 disabled로 포커스·선택·키보드 이동에서 모두 제외됩니다.

토큰#

component 토큰 없이 semantic을 직접 소비합니다(신설 기준 §4 미충족).

속성토큰
필 기본color.surface-muted · color.text-muted · radius.full · 높이 space.8
Hover(미선택)color.surface-hover · color.text
눌림(:active, 미선택)color.surface-pressed
Focuscolor.focus-ring(2px 아웃라인)
선택color.primary-subtle · color.primary(보더) · color.primary-text
Disabledcolor.disabled-bg · color.disabled-fg
모션duration.fast + ease.standard