DatePicker

Accessible React date picker with an in-calendar Hijri (Umm al-Qura) and Gregorian toggle, min and max bounds, and Arabic support. Value is always a Date.

DatePicker selects a single date, with an in-calendar Gregorian/Hijri toggle. The value is always Date | null; the Hijri view is display only.

When to use

Use DatePicker for a single date such as a birth date, an appointment, or a document issue date. Saudi services often need both calendars: enable the Hijri view and showSecondaryCalendar so each day shows its counterpart.

Bound the range with minValue and maxValue to prevent invalid dates. For a start and end, use DateRangePicker.

Examples

Basic

Hijri calendar (Arabic)

Bounded range

Controlled with readout

Props

Props declared by DatePicker. Native attributes of the underlying element pass through.

PropTypeDefaultDescription
size"md" | "lg"
variant"default" | "filled-lighter" | "filled-darker"
valueDateCurrently selected date (controlled). Local Y/M/D.
defaultValueDateInitial value when uncontrolled.
onChange(value: Date | null) => voidFires whenever the user picks a day. null when cleared.
minValueDateEarliest pickable date (inclusive).
maxValueDateLatest pickable date (inclusive).
labelreact.ReactNodeVisible label above the trigger.
helperTextreact.ReactNodeHint shown below the trigger. Hidden while an error message is showing.
errorMessagereact.ReactNodeMessage shown below the trigger when error is true.
errorbooleanMarks the field invalid - sets aria-invalid and error styling.
requiredbooleanMarks the field required - adds the asterisk + aria-required.
disabledbooleanDisables the trigger entirely.
readOnlybooleanRead-only: value is shown but not editable (segments + calendar locked).
idstringCaller-supplied id for the field.
classNamestringForwarded to the Group (the trigger row), matching Input/Select.
aria-labelstring
aria-labelledbystring
calendarCalendarSystemCalendar system (controlled). Omit to let the user toggle freely with the in-popover switch.
defaultCalendarCalendarSystemInitial calendar system when uncontrolled. Defaults to 'gregorian'.
onCalendarChange(calendar: CalendarSystem) => voidFires whenever the calendar system toggles.
showCalendarTogglebooleanShow the Gregorian↔Hijri toggle inside the popover. Defaults to true, but is forced off when calendar is controlled - a toggle that ignores its click is a worse footgun than no toggle.
calendarLabelsCalendarLabelsOverride the toggle labels. Defaults are locale-aware (English / Arabic).
showSecondaryCalendarbooleanWhen true, each day cell also shows the other calendar's day number as small secondary text (e.g., Hijri active → Gregorian day shown small underneath). Helps users cross-reference dates between calendar systems without round-tripping the toggle. Defaults to false.

Accessibility

The calendar follows the grid pattern from React Aria. Arrow keys move between days, Page Up and Page Down change the month, and Escape closes the popover. The field label, helper text, and error are wired like TextInput, and the calendar toggle has an accessible name.

Dates are announced in the active calendar system, so Hijri users hear Hijri dates.