본문으로 건너뛰기

빠른 시작

5분이면 동작하는 DatePicker를 만듭니다.

1. 설치

pnpm add @kalyx/react

2. 제어형 DatePicker

import { useState } from 'react';
import { DatePicker, type ISODateString } from '@kalyx/react';

export function BirthdayPicker() {
const [date, setDate] = useState<ISODateString | null>(null);

return (
<DatePicker value={date} onChange={setDate}>
<DatePicker.Input placeholder="YYYY-MM-DD" />
<DatePicker.Trigger />
<DatePicker.Popover>
<DatePicker.Calendar />
</DatePicker.Popover>
</DatePicker>
);
}

이게 전부입니다. CSS 임포트 없음, Provider 감싸기 없음, 셋업 파일 없음.

3. 스타일링

모든 서브 컴포넌트는 classNames를 받고 className/style/ref를 전달합니다.

Tailwind 예시

<DatePicker value={date} onChange={setDate}>
<DatePicker.Input
className="w-48 rounded-md border px-3 py-2 text-sm focus:ring-2 focus:ring-indigo-500"
/>
<DatePicker.Popover className="mt-2 rounded-lg border bg-white p-3 shadow-lg">
<DatePicker.Calendar
classNames={{
root: 'space-y-2',
header: 'flex items-center justify-between mb-2',
title: 'font-semibold text-sm',
navButton: 'p-1 rounded hover:bg-neutral-100',
grid: 'w-full',
day: 'h-8 w-8 rounded-md text-sm hover:bg-neutral-100',
daySelected: '!bg-indigo-600 !text-white',
dayToday: 'ring-1 ring-indigo-400',
dayDisabled: 'opacity-40 pointer-events-none',
dayOutsideMonth: 'text-neutral-400',
}}
/>
</DatePicker.Popover>
</DatePicker>

자세한 내용은 Tailwind 레시피 →에.

4. 값 읽기

Kalyx는 항상 ISO 8601 UTC 문자열 (또는 null)을 반환합니다.

onChange={(iso) => {
// iso === "2026-04-15T00:00:00.000Z" | null
fetch('/api/save', { method: 'POST', body: JSON.stringify({ date: iso }) });
}}

이유는 ISO 문자열 →에.

5. 범위 선택

import { useState } from 'react';
import { RangePicker, type DateRange } from '@kalyx/react';

export function VacationRange() {
const [range, setRange] = useState<DateRange>({ start: null, end: null });

return (
<RangePicker value={range} onChange={setRange}>
<RangePicker.Input part="start" placeholder="시작" />
<RangePicker.Input part="end" placeholder="종료" />
<RangePicker.Popover>
<RangePicker.Presets>
<RangePicker.Preset value="last7days">지난 7일</RangePicker.Preset>
<RangePicker.Preset value="thisMonth">이번 달</RangePicker.Preset>
</RangePicker.Presets>
<RangePicker.Calendar />
</RangePicker.Popover>
</RangePicker>
);
}

다음