Skip to main content
Headless · SSR-safe · ISO strings in/out

Seven date primitives. One API.

Kalyx ships DatePicker, RangePicker, TimePicker, DateTimePicker, MonthPicker, YearPicker, and WeekPicker under one composition API. Zero CSS, SSR-safe, ISO-8601 in/out.

$pnpm add @kalyx/react
Kalyx: DatePicker, RangePicker, TimePicker, DateTimePicker, MonthPicker, YearPicker, WeekPicker
7date primitives
~19 KBgzip, one DatePicker with deps
0CSS files to import
jest-axechecks in component tests
What you get

Primitives that stay out of your way

Zero CSS

No stylesheet to import. Style every part with your existing system: Tailwind, shadcn, CSS Modules, plain CSS.

SSR-safe

No window/document access at render time. Every picker has a renderToString test, and the published entries carry the 'use client' directive for React Server Components.

Timezone-aware

IANA timezones on the platform’s own Intl, DST-aware, no extra dependency. ISO-8601 UTC strings in, ISO-8601 UTC strings out, so your storage layer stays clean.

~19 KB gzipped

One DatePicker, minified with its dependencies bundled and React external. All seven pickers plus hooks are ~26 KB. CI also gates the published file at 20 KB for the default entry and 22 KB for the headless entry.

Same JSX, your styles

One component. Every styling story.

Pass any class string to any part. No CSS file to import, no theme provider to wrap. The library never touches your design system.

<DatePicker value={iso} onChange={setIso}>
  <DatePicker.Calendar classNames={{
    day: 'rounded hover:bg-slate-100',
    daySelected: 'bg-indigo-600 text-white',
  }} />
</DatePicker>
Why Kalyx

Headless without the assembly.

Build a date with new Date in Seoul, store it, and the server sees the day before. Kalyx never takes a Date: values go in and out as ISO 8601 UTC strings, and the display timezone is a separate prop. On top of that, a list-style TimePicker and month, year, and week pickers share the same composition API.

Read the docs →
Ready in 60 seconds

Install. Compose. Ship.

1. Install
$pnpm add @kalyx/react
2. Compose
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>
  );
}