ComponentsP3 본문

QuantityStepper

수량 증감 입력기 — −/값/+ 구성에 min·max·step 클램핑. 진행 단계 Stepper와 역할이 달라 별도 이름을 씁니다(ADR-012 Track C).

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

한눈에#

장바구니 수량·인원수처럼 정수를 ±step 단위로 정밀하게 증감하는 −/값/+ 입력기입니다.

  • −/값/+ 구성
  • min·max·step 클램프
  • 2 크기(md·sm)
  • 44px 히트 영역

값 칸은 직접 타이핑·화살표 키 증감 모두 가능하고, 한계 도달 시 해당 버튼이 비활성됩니다

진행 단계 표시기 Stepper와 이름이 비슷하지만 역할이 다릅니다 — 이쪽은 수량 입력, Stepper는 진행 단계 표시입니다.

사용 시점#

정수를 ±step 단위로 정밀 증감하면 QuantityStepper — 어림 조절이나 진행 단계 표시는 다른 컴포넌트입니다.

쓴다

장바구니 수량·인원수처럼 min/max 클램프 + −/+ 버튼이 필요한 정수 증감

대신 Slider

볼륨·밝기처럼 어림값으로 충분한 연속 조절

대신 Stepper

진행 단계(스텝 1·2·3) 표시 — 이름만 비슷하고 역할이 다름

플레이그라운드#

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

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

<QuantityStepper aria-label="수량" min={0} max={10} step={1} />

변형#

단일 형태입니다 — /값/+ 구성. 값 칸은 직접 타이핑할 수 있고, 위/아래 화살표 키로도 증감합니다. step으로 증감 단위를, min/max로 범위를 정합니다.

크기#

size로 2단 — md(기본)·sm. 두 크기 모두 −/+ 버튼의 히트 영역을 44px로 확장해 터치 타깃을 보장합니다.

md(기본) · sm

상태#

비제어 컴포넌트입니다 — defaultValue로 시작하고 clamp된 값이 실제로 바뀔 때만 onChange가 발화합니다. 상·하한에서는 해당 버튼이 비활성화되고, 한계 도달 시 중복 발화하지 않습니다. 직접 입력한 값은 [min, max]로 clamp되며, 비숫자 입력은 무시하고 blur 시 마지막 유효값으로 복원합니다.

min/max 경계 — 상·하한에서 버튼 비활성

Props#

Prop타입기본값설명
defaultValuenumber초기 수량(비제어) — 생략 시 min(있으면) 또는 0
onChange(value: number) => voidclamp된 값이 실제로 바뀔 때만 발화
minnumber0하한
maxnumber상한 — 생략 시 무제한
stepnumber1증감 단위
disabledbooleanfalse입력·버튼 모두 비활성
aria-labelstring값 입력의 접근 이름(예: "수량") — 필수
size'sm' | 'md''md'컨트롤 크기

접근성#

  • 루트는 role="group"으로 −/값/+ 를 하나의 컨트롤로 묶습니다(이름 중복 announce를 피하기 위해 이름은 값 입력에만 둡니다).
  • 값 입력은 inputMode="numeric" + aria-label(필수)을 가지며, ArrowUp/ArrowDown으로 증감합니다.
  • /+ 버튼은 각각 aria-label("감소"/"증가")을 가지고, 한계 도달 시 disabled 됩니다.
  • 입력은 경계에서 신뢰하지 않습니다 — 숫자만 받고 [min, max]로 clamp, 비숫자는 거부합니다.

토큰#

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

속성토큰
컨테이너input.height · input.bg · input.border(focus input.border-focus) · input.radius
버튼control.height-sm 시각 + 44px 히트 · color.text-muted(hover surface-hover → active surface-pressed) · radius.control
값/비활성input.fg · color.disabled-fg
포커스컨테이너 color.primary 18% 링 · 버튼 color.focus-ring 2px 아웃라인
모션duration.fast + ease.standard