Date picker
A date input you can type into or fill from a calendar popup. Use it for dates close to today, like a delivery, a booking or a deadline.
We deliver Monday to Saturday, 8 am to 6 pm.
Installation
Set up Camaleo once (Installation), then import what you need. Dates are @internationalized/date objects, re-exported from the library. Put the picker in a Field to give it a label.
import { DatePicker, CalendarDate, CalendarDateTime, isWeekend, Field, FieldLabel } from "@camaleo/react";Anatomy
A box with one editable segment per date part and a button that opens a Calendar in a popup. The popup renders in a portal and keeps the skin.
Examples
Every example is a real file you can copy. They all wear the skin, mode and brand from the bar above.
We deliver Monday to Saturday, 8 am to 6 pm.
Arrives Saturday, November 14, 2026
Controlled, with the weekday
Pick another day. Spelling out the weekday in the description catches a Saturday nobody meant to pick.
Open from November 2 to December 18, 2026.
Earliest and latest date
minValue and maxValue cross out the days outside the range. Check the value too and set invalid on the Field, so a typed date gets a message.
Monday to Friday. Weekends are crossed out in the calendar.
Unavailable dates
isDateUnavailable with isWeekend blocks weekends for the page's locale. Say the rule in the description, because the calendar is hidden until opened.
Eastern Time (ET). Attendees see it in their own time zone.
Date and time
Pass a CalendarDateTime and granularity="minute" to add hour and minute segments. hourCycle={24} drops AM/PM where a 24-hour clock is clearer, like a webinar schedule.
The calendar opens on March 2027, when the conference runs.
Opens on the right month
Without a value the calendar opens on today. placeholderValue opens it where the dates that matter are, without filling the field.
Set when the contract was signed. Ask your account manager to change it.
Read-only
readOnly keeps the date focusable and readable, unlike disabled. Say in the description who can change it.
Required in a form
Send the form empty. The error names what is missing, is linked to the input and goes away as soon as a date is picked.
In context
Dates are part of bigger tasks. These are whole pieces of UI you can copy, in the skin you picked.
Search flights
Schedule post
Eastern Time (ET). You can reschedule until it goes out.
New invoice
Issued on October 28, 2026.
Follows the payment terms. Change it for a one-off deal.
Guidelines
A delivery or a booking is a few clicks away, and the calendar shows the weekday.
Paging back 30 years month by month is slow. Use a DateField and let people type it.
Monday to Friday. Weekends are crossed out in the calendar.
The rule is visible before people open the calendar or type a date.
"Date not available." comes too late and does not say which dates are.
Props
DatePicker takes the props of the React Aria date picker. These are the ones you use most:
onOpenChange.Field, the field's invalid is used when this is not set."en-US". Defaults to the browser's."short"."day"
for dates, and "minute" for times.Other React Aria props pass through, such as defaultOpen, shouldCloseOnSelect, hideTimeZone, shouldForceLeadingZeros, pageBehavior and autoFocus.
Styling hooks
Restyle it without forking: target the attributes, or set the tokens on a parent, a skin or the picker itself. The calendar in the popup reads the Calendar tokens.
Attributes
Tokens it reads
Color
Shape & size
Type & motion
This component only
/* a softer segment highlight, only in the booking form */
.booking [data-slot="date-segment"] {
--cml-segment-focus-bg: var(--cml-item-highlight);
--cml-segment-focus-fg: var(--cml-fg);
}Accessibility
- Each segment is a spinbutton named by the field's label, so screen readers announce the part and the full date.
- The popup is a dialog. Focus moves into the calendar when it opens and back to the button when it closes.
- Unavailable and out-of-range days are announced as unavailable, not only crossed out.
- FieldDescription and FieldError are linked with aria-describedby, and an invalid picker sets aria-invalid.