DayPicker
반복 일정 요일/일자 다중 선택 — week는 기본 월~일 7버튼(값은 일=0…토=6), monthly는 1~31 그리드를 aria-pressed 토글 버튼 그룹으로 제공하는 비제어 컴포넌트입니다.
마지막 업데이트 2026-06-29
한눈에#
반복 일정의 요일/일자를 다중 선택합니다 — week는 기본 월~일 7버튼(값은 일=0…토=6), monthly는 1~31 그리드를 aria-pressed 토글 버튼 그룹으로 제공합니다.
- 반복 요일/일자 다중 선택
- week 0~6 · monthly 1~31
- aria-pressed 토글
- 비제어
버튼은 44px 정사각 터치 타깃 — 선택은 색 + aria-pressed 병행(색맹 안전)
사용 시점#
매주/매월 반복되는 요일·일자를 다중 선택하면 DayPicker — 특정 날짜나 일반 다중 선택은 다른 컴포넌트입니다.
권장 — 이렇게 쓰세요
지양 — 이러지 마세요
쓴다 — 반복 일정의 요일(월·수·금) 또는 매월 일자(1·15)를 다중 선택
대신 DatePicker — 달력에서 특정 날짜(반복 아님)를 고를 때
대신 Checkbox — 요일/일자가 아닌 일반 항목 다중 선택일 때
플레이그라운드#
컨트롤로 props를 조작하면 미리보기와 코드가 실시간 갱신됩니다.
DayPicker를 직접 조작해 보세요
속성·테마·토큰을 바꾸고 React·Flutter 코드를 확인하는 풀스크린 빌더로 엽니다.
플레이그라운드는 넓은 작업 영역이 필요해 웹·태블릿에서 편집할 수 있어요.
변형#
mode가 변형 축입니다 — 'week'(기본)는 월~일 7버튼(값은 일=0…토=6),
'monthly'는 1~31 일자를 달력과 같은 7열 그리드(값 1~31)로 펼칩니다.
weekStartsOn="sunday"를 주면 표시 순서를 일~토로 바꾸며, 선택값 인덱스는
기존처럼 일=0 … 토=6으로 유지됩니다.
weekLabels로 week 모드 라벨을 오버라이드할 수 있습니다(7개, 값 인덱스는
일=0 … 토=6 고정). 표시 순서만 weekStartsOn을 따릅니다.
크기#
단일 크기입니다 — 버튼은 control.height-md(44px) 정사각으로 터치 히트
영역을 그대로 충족합니다. monthly 그리드는 7열로 고정되어 한 달 31일이
5줄 안에 들어갑니다.
상태#
- 선택 —
aria-pressed="true"+color.primary채움 +color.on-primary잉크 - Hover — 미선택
color.surface-hover· 선택color.primary-hover - Focus —
:focus-visible에color.primary아웃라인 링 - Disabled —
disabled배열의 값은 버튼disabled로 클릭·토글 차단
비제어 컴포넌트입니다 — defaultValue로 시작하고 토글마다 오름차순 정렬된
onChange(values)로 알립니다.
Props#
| Prop | 타입 | 기본값 | 설명 |
|---|---|---|---|
aria-label | string | — | 그룹 접근성 이름 — 필수 |
mode | 'week' | 'monthly' | week | week: 기본 월~일 7버튼(값은 일=0 … 토=6) · monthly: 1~31 그리드 |
defaultValue | readonly number[] | — | 초기 선택값 — week는 0~6, monthly는 1~31 (비제어) |
onChange | (values: number[]) => void | — | 토글 콜백 — 오름차순 정렬된 선택값 배열 |
disabled | readonly number[] | — | 선택 불가 값 목록 |
weekStartsOn | 'monday' | 'sunday' | monday | 주 시작 요일 — 기본 monday. sunday면 일~토 순서 |
weekLabels | readonly string[] | ['일', '월', '화', '수', '목', '금', '토'] | week 모드 버튼 라벨 오버라이드 — 7개, 값 순서는 일=0 … 토=6 |
ref | Ref<HTMLDivElement> | — | 루트 <div>로 전달되는 ref (React 19 ref-as-prop) |
접근성#
루트가 role="group"이고 aria-label이 필수입니다 — 버튼 7~31개가 하나의
질문(“어느 요일/일자에 반복?”)에 속함을 보조기술에 알립니다. 각 버튼은
네이티브 button + aria-pressed 토글 버튼입니다.
| 키 | 동작 |
|---|---|
Tab / Shift+Tab | 버튼 사이 포커스 이동 (네이티브 순서) |
Enter / Space | 포커스된 버튼 토글 — aria-pressed 갱신 |
비활성 값은 disabled로 보고되어 포커스·클릭이 차단되고, 선택 상태는 색상만이
아니라 aria-pressed로도 전달됩니다.
토큰#
component 토큰 없이 semantic을 직접 소비합니다(신설 기준 §4 미충족 — Calendar의 선택 어휘 공유).
| 속성 | 토큰 |
|---|---|
| 버튼 | color.surface · color.border · color.text · radius.full |
| 히트 영역 | control.height-md(44px) 정사각 |
| 선택 | color.primary 채움 + color.on-primary 잉크 |
| 선택 Hover | color.primary-hover |
| 미선택 Hover | color.surface-hover |
| 미선택 눌림 | color.surface-pressed (선택 배경은 안 덮음) |
| 포커스 | color.focus-ring 아웃라인 |
| 비활성 | input.bg-disabled · color.text-placeholder |
| 모션 | duration.fast + ease.standard |