Splitter
2패널 드래그 리사이즈 — APG window splitter 패턴. 구분선이 role=separator + aria-valuenow(0~100)를 보고하고 키보드 화살표·Home/End·더블클릭 리셋을 지원합니다. 비율(%) 비제어 (DK 사양 승격).
마지막 업데이트 2026-06-11
한눈에#
2패널을 드래그로 리사이즈하는 분할 컨테이너입니다 — 구분선이 role="separator" + aria-valuenow(0~100)를 보고하고 키보드·더블클릭 리셋을 지원합니다.
minSize 아래로는 좁아지지 않습니다.
구분선을 끌어 비율을 조절합니다.
- 2패널 드래그 리사이즈
- APG window splitter
- role=separator aria-valuenow
- 키보드·더블클릭 리셋
구분선을 드래그하거나 포커스 후 화살표로 비율 조절 — 더블클릭이면 50% 리셋
정확히 2개의 자식을 받습니다 — 첫 자식이 비율(flex-basis %)을 차지하고
두 번째 자식이 나머지를 채웁니다. 구분선 핸들 점은 hover/active/focus에서
color.primary로 강조됩니다.
사용 시점#
사용자가 드래그로 두 패널의 비율을 조절하면 Splitter — 조절 없는 고정 구분이나 한 번에 한 뷰는 다른 컴포넌트입니다.
에디터·미리보기 분할처럼 사용자가 드래그로 두 패널 비율을 조절할 때
플레이그라운드#
컨트롤로 props를 조작하면 미리보기와 코드가 실시간 갱신됩니다.
import { Splitter } from '@wds/ui-web';
<Splitter><div>좌측 패널</div>
<div>우측 패널</div></Splitter>변형#
vertical은 위/아래로 패널을 가릅니다.
구분선은 가로 막대이고 ↑/↓로 조절합니다.
direction이 변형 축입니다 — 'horizontal'(기본)은 좌/우, 'vertical'은
상/하 패널입니다. minSize(px)로 각 패널의 최소 크기를 클램프하고,
defaultRatio로 첫 패널의 초기 비율(0~1)을 지정합니다.
크기#
루트는 폭 100%이고 높이는 콘텐츠/소비자가 결정합니다 — 데모는 인라인
height로 영역을 줬습니다. 구분선은 시각 8px(space.2) 트랙에 중앙 2px
라인이고, 히트 영역은 44px로 확장돼 터치 타깃을 채웁니다. minSize는 컨테이너
진행 축 크기를 비율 경계로 환산해 양쪽 끝에서 50%까지만 허용합니다.
상태#
- Default — 구분선 라인
color.border, 핸들 점color.border-strong - Hover / Active / Focus — 라인·핸들 점 모두
color.primary로 강조 - Focus —
:focus-visible에color.primary2px 아웃라인 +radius.sm - Dragging — 패널 텍스트 선택 방지(
user-select: none)
Props#
| Prop | 타입 | 기본값 | 설명 |
|---|---|---|---|
direction | 'horizontal' | 'vertical' | 'horizontal' | 패널 배치 축 — horizontal: 좌/우 · vertical: 상/하 |
children | [ReactNode, ReactNode] | — | 정확히 2개의 패널 (첫째가 비율, 둘째가 나머지) |
defaultRatio | number | 0.5 | 첫 패널의 초기 비율(0~1) — 이후 상태는 내부 소유(비제어) |
minSize | number | 80 | 각 패널의 최소 크기(px) — 드래그/키보드 모두 클램프 |
onRatioChange | (ratio: number) => void | — | 비율 변경 콜백 (0~1) — 같은 비율은 발화하지 않음 |
separatorLabel | string | '패널 크기 조절' | 구분선 aria-label |
…rest | Omit<HTMLAttributes<HTMLDivElement>, 'children'> | — | style · className 등은 루트 div로 전달 |
접근성#
구분선이 role="separator" + tabIndex=0이고 aria-valuenow(0~100,
첫 패널 비율%)·aria-valuemin/max를 보고합니다. aria-orientation은 구분선
자체의 방향이라 좌우 패널을 가르는 세로 막대는 'vertical'을 보고합니다(ARIA 명세).
| 키 | 동작 |
|---|---|
← / → (horizontal) | 비율 2%씩 감소 / 증가 (minSize 클램프) |
↑ / ↓ (vertical) | 비율 2%씩 감소 / 증가 (minSize 클램프) |
Home | 최소(첫 패널을 minSize까지 축소) |
End | 최대(첫 패널을 minSize 경계까지 확대) |
| 더블클릭 | 50% 균등 분할로 리셋 |
- 포인터 드래그는
setPointerCapture기반이고 핸들 점은aria-hidden(포인터 보조 경로)입니다 - 핸들 강조·라인 전환은 background/color만 사용해
prefers-reduced-motion에서 전환을 끕니다
토큰#
component 토큰 없이 semantic을 직접 소비합니다(신설 기준 §4 미충족).
| 속성 | 토큰 |
|---|---|
| 구분선 트랙 | 폭/높이 space.2 |
| 구분선 라인 | color.border — hover/active/focus color.primary |
| 핸들 점 | color.border-strong — hover/active/focus color.primary · radius.full |
| Focus | color.primary(2px 아웃라인) · radius.sm |
| 모션 | duration.fast + ease.standard |