Time away
Dates, without time zones
The end follows the start. Your device provides the calendar picker.
Collects start and end dates with two native date editors, shared constraints, and 44px controls.
Dates, without time zones
The end follows the start. Your device provides the calendar picker.
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 { DateRangePicker } from "@noorddev/vlak-react";Precompiled React and one stylesheet. No compiler to configure. Per-component imports work too: @noorddev/vlak-react/components/date-range-picker.
npx @noorddev/vlak-cli add date-range-picker
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/date-range-picker.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 { DateRangePicker } from "@noorddev/vlak-react";
<DateRangePicker label="Stay" name="stay" defaultValue={{ start: "2026-09-08", end: "2026-09-12" }} min="2026-09-01" required />Two native date editors share bounds; changing the start beyond the end clears the end.
| Prop | Type | Default | Description |
|---|---|---|---|
value | DateRangeValue | ISO calendar dates, YYYY-MM-DD; no time zone conversion. | |
defaultValue | DateRangeValue | { start: "", end: "" } | |
onValueChange | (value: DateRangeValue) => void | ||
label | ReactNode | "Date range" | |
startLabel | string | "Start date" | |
endLabel | string | "End date" | |
min | string | ||
max | string | ||
required | boolean |
Also accepts Omit<FieldsetHTMLAttributes<HTMLFieldSetElement>, "onChange" | "defaultValue">.
| Keys | Does |
|---|---|
| Tab | Moves through the two native date editors and their platform picker controls. |
| Arrow keys | Edits the active date segment according to the browser's native behavior. |
<fieldset class="rs-date-range-picker"><legend class="rs-date-range-picker-legend">Stay</legend><div class="rs-date-range-picker-fields"><label>Start date<input class="rs-input rs-date-range-picker-input" type="date" name="stay[start]" value="2026-09-08" /></label><label>End date<input class="rs-input rs-date-range-picker-input" type="date" name="stay[end]" min="2026-09-08" value="2026-09-12" /></label></div></fieldset>