DatePicker
Pre-alphaThe registry and the CLI are not published yet.Roadmap

DatePicker

Date selection built from Calendar and BottomSheet.

Departure
Thu 17 Sep 2026
CancelDepartureDone

September 2026

MonTueWedThuFriSatSun1415161718192021222324252627

Installation

npx axiom add date-picker
pnpm dlx axiom add date-picker
yarn dlx axiom add date-picker
bun x axiom add date-picker

Also copies: calendar, bottom-sheet, button, chip, input and their dependencies.

Requires the calendar icon in your icon registry. The field borrows the colors of Input: DatePicker brings no tokens of its own.

Usage

import { DatePicker } from "@/components/ui/date-picker";

<DatePicker label="Departure" value={date} onChange={setDate} />;

How it’s built

          date-picker

       ┌───────┴───────┐
       ↓               ↓
   calendar      bottom-sheet

The field opens a sheet containing a calendar, so the user picks a date without leaving the screen.

Props

PropTypeDefaultDescription
mode'single' | 'range''single'One date, or a start and end date. Passed to the Calendar.
valueDate | { from: Date; to?: Date } | nullThe selected date or range. null shows the placeholder.
onChange(value) => voidCalled with the new value when the user confirms.
confirm'done' | 'instant''done'done: the value changes on Done, Cancel reverts it. instant: the sheet closes on the first press (single mode only).
labelstringLabel above the field, like Input.
placeholderstring'Select a date'Text in the empty field.
helperstringNote under the field, like Input.
errorstring | booleanPuts the field in the invalid state. A string also replaces helper.
format(value) => stringlocale medium dateHow the value is written in the field, e.g. “Thu 17 Sep 2026”.
titlestringlabelTitle of the sheet.
minDate / maxDateDateLimits, passed to the calendar.
isDateDisabled(date: Date) => booleanDisabled days, passed to the calendar.
presetsArray<{ label: string; value: Date | Range }>Shortcut chips above the calendar: “Today”, “Next weekend”.
clearablebooleanfalseAdds a Clear action in the sheet that sets the value to null.
disabledbooleanfalseThe field can’t open the sheet.
triggerReactElementinput fieldReplaces the default field, for example with a Chip or a Button.
calendarPropsPartial<CalendarRootProps>Any other Calendar.Root prop, like weekStartsOn or minRange.
renderCalendar() => ReactNodefull calendarChildren of the Calendar.Root inside the sheet, to change its parts: event dots, a custom header.

Use cases

Date of a task

confirm="instant": one press sets the date and closes the sheet. Presets cover the common choices.

Due dateClear

Today

Tomorrow

Next week

MTWTFSS1415161718192021222324252627
<DatePicker
	confirm="instant"
	clearable
	value={task.due}
	onChange={(due) => update({ due })}
	presets={[
		{ label: "Today", value: today },
		{ label: "Tomorrow", value: addDays(today, 1) },
		{ label: "Next week", value: nextMonday(today) },
	]}
	trigger={
		<Chip leading="calendar">
			{task.due ? formatShort(task.due) : "Due date"}
		</Chip>
	}
/>

Travel dates

mode="range" behind two fields that read as one. Done stays disabled until both dates are set.

Porto · 2 guests
Check-inThu 17 Sep
Check-outMon 21 Sep

Search stays

4 nights

<DatePicker
	mode="range"
	value={stay}
	onChange={setStay}
	minDate={today}
	calendarProps={{ minRange: 1 }}
	trigger={<StayField from={stay?.from} to={stay?.to} />}
/>

Form field with validation

A regular field in a form, with label, maxDate and an error when the date is missing.

Create account
Full name
Katherine Johnson
Date of birth
Select a date
We need your date of birth to continue.
<DatePicker
	label="Date of birth"
	value={birthdate}
	onChange={setBirthdate}
	maxDate={subYears(today, 13)}
	error={
		submitted && !birthdate
			? "We need your date of birth to continue."
			: undefined
	}
/>