본문으로 건너뛰기
Headless · SSR-safe · 16 KB 이하

7개의 날짜 프리미티브. 하나의 API.

Kalyx는 DatePicker · RangePicker · TimePicker · DateTimePicker · MonthPicker · YearPicker · WeekPicker를 하나의 Composition API로 제공합니다. CSS 없음, SSR 안전, ISO-8601 그대로 입출력.

$pnpm add @kalyx/react
Kalyx — DatePicker, RangePicker, TimePicker, DateTimePicker, MonthPicker, YearPicker, WeekPicker
제공하는 것

방해되지 않는 프리미티브

Zero CSS

import할 스타일시트 없음. Tailwind · shadcn · CSS Modules · 순수 CSS 등 기존 스타일링 시스템으로 모든 파트를 직접 꾸미세요.

SSR 안전

렌더 시점에 window/document 접근 없음. RSC, Next.js App Router, Remix loader 안에서도 그대로 동작합니다.

Timezone-aware

date-fns-tz 기반 IANA timezone, DST까지 처리. 입력도 출력도 ISO-8601 UTC string — 저장 계층은 깔끔하게.

16 KB gzip 이하

7종 picker + hook + date-fns 어댑터 전부 포함. react-datepicker의 1/4 크기. tree-shakable — 쓰는 것만 비용 부담.

같은 JSX, 당신의 스타일

하나의 컴포넌트. 모든 스타일링 시나리오.

어떤 파트에도 원하는 클래스 문자열을 넘기세요. import할 CSS 파일도, 감쌀 테마 프로바이더도 없습니다. 라이브러리가 디자인 시스템을 침범하지 않습니다.

Tailwind
<DatePicker value={iso} onChange={setIso}>
  <DatePicker.Input
    className="border rounded px-2 py-1" />
  <DatePicker.Popover>
    <DatePicker.Calendar classNames={{
      day: 'rounded hover:bg-slate-100',
      daySelected: 'bg-indigo-600 text-white',
    }} />
  </DatePicker.Popover>
</DatePicker>
shadcn / cva
<DatePicker value={iso} onChange={setIso}>
  <DatePicker.Input className={cn(inputBase)} />
  <DatePicker.Popover>
    <DatePicker.Calendar classNames={{
      day: cn(dayBase),
      daySelected: cn(dayBase, daySelected),
    }} />
  </DatePicker.Popover>
</DatePicker>
Plain CSS
<DatePicker value={iso} onChange={setIso}>
  <DatePicker.Input className="kx-input" />
  <DatePicker.Popover>
    <DatePicker.Calendar classNames={{
      day: 'kx-day',
      daySelected: 'kx-day-selected',
    }} />
  </DatePicker.Popover>
</DatePicker>
왜 Kalyx인가

조립 비용 없는 Headless.

react-day-picker는 headless지만 Calendar뿐. react-datepicker는 통합이지만 CSS를 강제합니다. Kalyx는 둘 다 — 모든 프리미티브, 스타일시트 없음, 16 KB 이하.

문서 보기 →
60초면 준비 완료

설치 → 조합 → 출시.

1. 설치
$pnpm add @kalyx/react
2. 조합
import { DatePicker } from '@kalyx/react';

function BirthdayField() {
  const [iso, setIso] = useState<string | null>(null);
  return (
    <DatePicker value={iso} onChange={setIso}>
      <DatePicker.Input />
      <DatePicker.Popover>
        <DatePicker.Calendar />
      </DatePicker.Popover>
    </DatePicker>
  );
}