DatePicker · Docs

스토리북 개발자들을 위한 내부 문서

Components

DatePicker

Docs

DatePicker · DatePickerTrigger API.

API

DatePicker(루트) + DatePickerTrigger. single은 하루, duration은 start→end 기간.

import {
  DatePicker,
  DatePickerTrigger,
  DatePickerError,
  emptyDuration,
  type DatePickerDuration,
} from "@/components/datepicker";
import { Field, FieldLabel, FieldError } from "@/components/field";

const [date, setDate] = useState<Date | null>(null);
const invalid = date == null;

// 하루
<DatePicker selected={date} onChange={setDate} format="yyyy.MM.dd" />

// 필수 누락 에러 (error prop → 트리거 아래 + Context)
<DatePicker
  required
  invalid={invalid}
  error={invalid ? "필수 항목입니다." : undefined}
  selected={date}
  onChange={setDate}
/>

// DatePickerError children
<DatePicker invalid={invalid} selected={date} onChange={setDate}>
  {invalid ? <DatePickerError>필수 항목입니다.</DatePickerError> : null}
</DatePicker>

// Field · FieldLabel · FieldError 조합
<Field data-invalid={invalid || undefined}>
  <FieldLabel>예약일</FieldLabel>
  <DatePicker invalid={invalid} selected={date} onChange={setDate} />
  {invalid ? <FieldError>필수 항목입니다.</FieldError> : null}
</Field>

// 기간
<DatePicker
  mode="duration"
  duration={range}
  onDurationChange={setRange}
  format="yyyy.MM.dd"
/>

// asChild
<DatePicker selected={date} onChange={setDate}>
  <DatePickerTrigger asChild>
    <button type="button">날짜 선택</button>
  </DatePickerTrigger>
</DatePicker>

// month
<DatePicker view="month" format="yyyy.MM" selected={date} onChange={setDate} />

Props

NameTypeDefaultDescription
mode
"single" | "duration""single"single: 하루 · duration: 한 피커에서 시작→종료.
selected / onChange
Date | null · (date) => voidmode="single" 선택 날짜.
duration / onDurationChange
DatePickerDuration · (d) => voidmode="duration" 기간. { start, end }.
required
booleanfalsearia-required. 자동 검증 없음 — 앱이 invalid/error 설정.
invalid
booleanfalse검증 실패. 트리거 에러 보더 · aria-invalid. error 있으면 true로 취급.
error
ReactNode에러 메시지. Context로 전달. DatePickerError 없으면 트리거 아래 표시.
rangeSeparator
string" - "기간 표시 구분자.
format
string"yyyy.MM.dd"date-fns 포맷. YYYY/DD 표기도 자동 변환.
emptyLabel
stringformat · format - format미선택 시 트리거 텍스트.
view
"day" | "month""day"일 달력 | 월 달력.
side
"top" | "bottom" | "left" | "right""bottom"input 기준 캘린더 열림 방향.
popperPlacement
Placementfloating placement 직접 지정. 있으면 side보다 우선.
children
ReactNodeDatePickerTrigger · DatePickerError 등. 생략 시 기본 Trigger.
DatePickerTrigger.asChild
booleanfalse단일 자식에 onClick/ref 병합.
DatePickerError
component검증 메시지 슬롯. children 또는 Context error 표시 (FieldError와 동일 톤).

Events

NameSignatureDescription
onChange(date: Date | null) => voidsingle 날짜 선택.
onDurationChange(duration: DatePickerDuration) => voidduration 기간 변경 (start 선택·end 선택 각각 호출).

Notes

  • 엔진: react-datepicker (customInput = Trigger, selectsRange = duration).
  • 필수 검증은 앱이 수행 후 invalid · error 를 넘김. required 는 aria만.
  • Field + FieldLabel + FieldError 조합 권장. DatePickerError 로 내장 표시도 가능.
  • 값 지우기(X): 내장 clear 없음. Button+Icon → setDate(null) / emptyDuration().
  • mode="duration": 첫 클릭 start, 둘째 end. end까지 고르면 닫힘.
  • 기간 UX 권장(강제 아님): 시작일 재설정 시 종료일을 최대 조회 기간으로 맞춤 · 종료일 선택은 시작일 이전을 minDate/disabled 로 막는 것을 우선.
  • side: top | bottom | left | right (기본 bottom).