Skip to content

Calendar

A date picker calendar supporting single date and date range selection.

May 2026
Su
Mo
Tu
We
Th
Fr
Sa
<Calendar onChange={setValue} value={value} />
May 2026
Su
Mo
Tu
We
Th
Fr
Sa
<Calendar
mode="range"
onChange={setValue}
value={value}
viewDate={plainDateCreate(2026, 5, 1)}
/>
May 2026 - June 2026
Su
Mo
Tu
We
Th
Fr
Sa
Su
Mo
Tu
We
Th
Fr
Sa
<Calendar
numberOfMonths={2}
onChange={setValue}
value={value}
viewDate={plainDateCreate(2026, 5, 1)}
/>
May 2026
Su
Mo
Tu
We
Th
Fr
Sa
<Calendar
max={plainDateCreate(2026, 5, 24)}
min={plainDateCreate(2026, 5, 8)}
onChange={setValue}
value={value}
viewDate={plainDateCreate(2026, 5, 1)}
/>
May 2026
Mo
Tu
We
Th
Fr
Sa
Su
18
19
20
21
22
23
<Calendar
hasWeekNumbers
onChange={setValue}
value={value}
viewDate={plainDateCreate(2026, 5, 1)}
weekStartsOn={1}
/>
May 2026
Su
Mo
Tu
We
Th
Fr
Sa
<Calendar
getIsDateDisabled={date => date.dayOfWeek === 6 || date.dayOfWeek === 7}
onChange={setValue}
value={value}
viewDate={plainDateCreate(2026, 5, 1)}
/>
May 2026
Su
Mo
Tu
We
Th
Fr
Sa
<Calendar
hasOutsideDays={false}
onChange={setValue}
value={value}
viewDate={plainDateCreate(2026, 5, 1)}
/>
February 2026
Su
Mo
Tu
We
Th
Fr
Sa
<Calendar
hasVariableRowCount
onChange={setValue}
value={value}
viewDate={plainDateCreate(2026, 2, 1)}
/>
May 2026
Su
Mo
Tu
We
Th
Fr
Sa
<Calendar
mode="range"
onChange={setValue}
value={value}
viewDate={plainDateCreate(2026, 5, 1)}
/>

A date picker calendar supporting single date and date range selection.

When mode: "single"

PropTypeDefaultDescription
defaultValuePlainDateDefault selected date for uncontrolled usage.
mode'single'Selection mode. Defaults to 'single'.
onChange*(value: PlainDate) => voidCalled when the selected date changes.
valuePlainDateControlled selected date.
classNamestringAdditional CSS class names applied to the root element.
data-testidstringTest ID applied to the root element.
getIsDateDisabled(date: PlainDate) => booleanReturns true for dates that should be disabled.
hasAutoFocusbooleanfalseWhether to move focus into the day grid — onto the selected date, otherwise today, otherwise the first enabled day. Focus is (re)applied whenever this transitions to true, so driving it from an open state focuses the grid each time the calendar opens.
hasOutsideDaysbooleantrueWhether to show outside-month days.
hasVariableRowCountbooleanfalseWhether month grids use only needed rows rather than a fixed six rows.
hasWeekNumbersbooleanfalseWhether to show ISO week numbers.
maxPlainDateMaximum selectable date.
minPlainDateMinimum selectable date.
numberOfMonths1 | 21Number of months displayed.
onViewDateChange(viewDate: PlainDate) => voidCalled when the visible month changes. Passing this alongside viewDate puts the visible month in controlled mode: the calendar stops tracking the month itself and renders whatever viewDate you feed back here.
refRef<CalendarHandle>Ref exposing imperative calendar navigation.
styleCSSPropertiesInline styles applied to the root element.
timezoneIDstringbrowser timezoneTimezone used to determine today's date.
viewDatePlainDateThe visible month. On its own this is just the initial month to display; the calendar then tracks the month internally. Pass onViewDateChange as well to make the visible month controlled, where viewDate is the source of truth on every render.
weekStartsOn0 | 1 | 2 | 3 | 4 | 5 | 60First day of week, where 0 is Sunday.

When mode: "range"

PropTypeDefaultDescription
defaultValueDateRangeDefault selected range for uncontrolled usage.
mode*'range'Selection mode set to 'range'.
onChange*(value: DateRange) => voidCalled when the selected date range changes.
valueDateRangeControlled selected date range.
classNamestringAdditional CSS class names applied to the root element.
data-testidstringTest ID applied to the root element.
getIsDateDisabled(date: PlainDate) => booleanReturns true for dates that should be disabled.
hasAutoFocusbooleanfalseWhether to move focus into the day grid — onto the selected date, otherwise today, otherwise the first enabled day. Focus is (re)applied whenever this transitions to true, so driving it from an open state focuses the grid each time the calendar opens.
hasOutsideDaysbooleantrueWhether to show outside-month days.
hasVariableRowCountbooleanfalseWhether month grids use only needed rows rather than a fixed six rows.
hasWeekNumbersbooleanfalseWhether to show ISO week numbers.
maxPlainDateMaximum selectable date.
minPlainDateMinimum selectable date.
numberOfMonths1 | 21Number of months displayed.
onViewDateChange(viewDate: PlainDate) => voidCalled when the visible month changes. Passing this alongside viewDate puts the visible month in controlled mode: the calendar stops tracking the month itself and renders whatever viewDate you feed back here.
refRef<CalendarHandle>Ref exposing imperative calendar navigation.
styleCSSPropertiesInline styles applied to the root element.
timezoneIDstringbrowser timezoneTimezone used to determine today's date.
viewDatePlainDateThe visible month. On its own this is just the initial month to display; the calendar then tracks the month internally. Pass onViewDateChange as well to make the visible month controlled, where viewDate is the source of truth on every render.
weekStartsOn0 | 1 | 2 | 3 | 4 | 5 | 60First day of week, where 0 is Sunday.