Schedule
Print run
Type a date or open the calendar. The review also includes a local time.
Types or picks a date and optional local time. A 1px field opens a calendar in the native top layer.
Print run
Type a date or open the calendar. The review also includes a local time.
Three ways in. They share one source, so the pixels match whichever you pick.
npm install @noorddev/vlak-react
// once, next to your app's root
import "@noorddev/vlak-react/css";
import { CalendarPopover } from "@noorddev/vlak-react";Precompiled React and one stylesheet. No compiler to configure. Per-component imports work too: @noorddev/vlak-react/components/calendar-popover.
npx @noorddev/vlak-cli add calendar-popover
The StyleX leaf lands in components/vlak/ with its dependencies, for your own compiler to own. See StyleX.
npx shadcn add https://vlak.dev/r/calendar-popover.json
The same registry item, installed by shadcn's CLI.
<link rel="stylesheet" href="node_modules/@noorddev/vlak/css/vlak.css" />
No React. Link vlak.css and use the markup and classes below.
import { useState } from "react";
import { CalendarPopover } from "@noorddev/vlak-react";
const [date, setDate] = useState("2026-07-24");
const [review, setReview] = useState("2026-07-23T10:30");
<CalendarPopover label="Print date" name="printDate" value={date} onValueChange={setDate} required />
<CalendarPopover
label="Proof review"
name="review"
type="datetime-local"
value={review}
onValueChange={setReview}
hint="Local date and time, without a time zone."
/>Editable civil dates with native form validation and a top-layer calendar.
| Prop | Type | Default | Description |
|---|---|---|---|
type | "date" | "datetime-local" | "date" | |
value | string | Local canonical value. Typed partial drafts are emitted too. | |
defaultValue | string | "" | |
onValueChange | (value: string) => void | ||
min | string | ||
max | string | ||
weekStart | 0 | 1 | 1 | |
locale | string | "en" | |
triggerLabel | string | "Open calendar" | |
dialogLabel | string | ||
label | ReactNode | Label rendered above the field at 12px. | |
ok | boolean | Marks the field as validated: ink border and ink feedback text. | |
feedback | ReactNode | Quiet feedback line under the field. | |
hint | ReactNode | Hint under the field; it describes the control. | |
error | ReactNode | Error under the field; it describes the control and marks it invalid. |
Also accepts InputHTMLAttributes<HTMLInputElement>.
| Keys | Does |
|---|---|
| Tab | Moves through the date field, calendar trigger, and open panel controls; leaving closes the panel |
| Enter, Space on the trigger | Opens the calendar |
| Arrow down in the field or on the trigger | Opens the calendar and focuses the selected day |
| Arrow keys, Home, End | Moves between calendar days or to the ends of the week |
| Page up, Page down | Moves by month; hold Shift to move by year |
| Enter, Space on a day | Selects the date; local date and time fields wait for Done |
| Escape | Closes the panel and discards unconfirmed date and time changes |
<div class="rs-calendar-popover"><label class="rs-calendar-popover-label" for="deadline">Deadline</label><div class="rs-calendar-popover-control"><input id="deadline" class="rs-input rs-input-grouped rs-calendar-popover-input" type="text" value="2026-07-24" /><button class="rs-btn-ghost rs-calendar-popover-trigger" type="button" aria-label="Open calendar" aria-haspopup="dialog" aria-expanded="false"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" stroke="currentColor" aria-hidden="true"><path d="M3 3.5h10v10H3zM3 6.5h10M5.5 1.5v4M10.5 1.5v4" /></svg></button></div><input type="hidden" name="deadline" value="2026-07-24" /></div>