Calendar

A calendar is a month grid for picking one day or a range. It works on its own on a page, and it's the grid inside Date picker and Date range picker. In range mode the range is drawn as one bar per week, and while the second day is chosen it previews under the pointer or the keyboard. It has the whole keyboard model of a date grid, bounds and rules for the days that can't be picked, a week that starts on Sunday or Monday, and names in any locale.

October 2026
Sun
Mon
Tue
Wed
Thu
Fri
Sat
CalendarPick a day, or tab into the grid and move with the arrows. Page Up and Page Down turn the month.

Examples

Range

Two months side by side. The first pick sets the start, and the bar follows the pointer until the second; picking an earlier day orders the range. Where there isn't room for two months side by side, they stack; the days never shrink below their size.

October 2026
Sun
Mon
Tue
Wed
Thu
Fri
Sat
November 2026
Sun
Mon
Tue
Wed
Thu
Fri
Sat
Oct 6 – 12, 2026, 7 days
RangePick a start, then an end. On a phone the months stack.
October 2026
Sun
Mon
Tue
Wed
Thu
Fri
Sat
Disabled daysDays before minDate, after maxDate or rejected by isDateDisabled are struck through and can't be picked. They still take focus, so the keyboard walks through them.
October 2026
Mon
Tue
Wed
Thu
Fri
Sat
Sun
Week starts MondayweekStartsOn={1} puts Monday in the first column. Home and End follow it.
octobre 2026
lun.
mar.
mer.
jeu.
ven.
sam.
dim.
novembre 2026
lun.
mar.
mer.
jeu.
ven.
sam.
dim.
15 oct. 2026, 1 day
LocaleMonth names, weekdays and day numbers come from Intl in the locale given.

On a phone

type="scroll" stacks a year either side of the selection in one vertical scroll, under a weekday header that stays put. Use it with size="lg", which makes each day 44 pixels, in a drawer on a phone. Date picker's drawer, which it opens below the sm breakpoint, is built this way.

Month view

type="month" is a full-page month of events: the month and its date span as the title, Previous, Today and Next, and a grid of day cells that fills its parent. Each cell shows its day and the first two events as cards, then a count of the rest. Picking a day lists all its events, beside the grid from 1024 pixels wide and under it below that. It picks one day, with the same value, onChange, month and bounds as the other types.

October 2026
Oct 1 – 31, 2026
Sun
Mon
Tue
Wed
Thu
Fri
Sat
1 event: Quarterly planning, 9:00 – 11:00 AM
2 events: Design review, 10:00 – 11:00 AM; 1:1 with Ana, 2:00 PM
1 event: Team offsite, All day
2 events: Standup, 9:30 AM; Launch prep, 1:00 – 3:00 PM
2 events: Design review, 10:00 AM; Dentist, 4:30 PM
1 event: Research workshop, 1:00 PM
1 event: Release 0.3, All day
1 event: Retro, 3:00 – 4:00 PM
1 event: Halloween party, 6:00 PM
Wednesday, October 14
  • Standup9:30 AM
  • Launch prep1:00 – 3:00 PM
Month viewPick a day; its events list beside the grid. Laid out at 1100 pixels and scaled to fit.

Month on a phone

The layout follows the calendar's own width, not the screen's. Below 768 pixels the cells shrink to the day and up to three dots, and the selected day's events fill the space under the grid.

October 2026
Oct 1 – 31, 2026
Sun
Mon
Tue
Wed
Thu
Fri
Sat
1 event: Quarterly planning, 9:00 – 11:00 AM
2 events: Design review, 10:00 – 11:00 AM; 1:1 with Ana, 2:00 PM
1 event: Team offsite, All day
2 events: Standup, 9:30 AM; Launch prep, 1:00 – 3:00 PM
2 events: Design review, 10:00 AM; Dentist, 4:30 PM
1 event: Research workshop, 1:00 PM
1 event: Release 0.3, All day
1 event: Retro, 3:00 – 4:00 PM
1 event: Halloween party, 6:00 PM
Tuesday, October 20
  • Design review10:00 AM
  • Dentist4:30 PM
On a phoneTap a day with dots to list its events.

With actions

Children go at the end of the header, for actions such as search and a new event. The other types ignore children.

October 2026
Oct 1 – 31, 2026
Sun
Mon
Tue
Wed
Thu
Fri
Sat
1 event: Quarterly planning, 9:00 – 11:00 AM
2 events: Design review, 10:00 – 11:00 AM; 1:1 with Ana, 2:00 PM
1 event: Team offsite, All day
2 events: Standup, 9:30 AM; Launch prep, 1:00 – 3:00 PM
2 events: Design review, 10:00 AM; Dentist, 4:30 PM
1 event: Research workshop, 1:00 PM
1 event: Release 0.3, All day
1 event: Retro, 3:00 – 4:00 PM
1 event: Halloween party, 6:00 PM
Wednesday, October 14
  • Standup9:30 AM
  • Launch prep1:00 – 3:00 PM
With actionsSearch and New event, passed in as children.

The month view fills its parent, so give the parent a height. It picks one day: with mode="range" it draws the paged type and warns in the console. Its English words (Today, +N more, No events, All day) come from labels.

Anatomy

Previous and next buttons over the months on screen, each a title and a grid of week rows. In range mode a bar sits behind each week the range crosses.

October 2026
Sun
Mon
Tue
Wed
Thu
Fri
Sat
Oct 13 – 22, 2026, 10 days
  1. Previous
  2. Next
  3. Grid
  4. Range bar
  5. Day
The calendarA range in one month.

Guidelines

  • 01Use Calendar on its own when the dates are the content, such as availability on a booking page. In a form, use Date picker so the field takes one line until it's needed.
  • 02Show two months for a range that often crosses a month end, such as a stay or a report period. One is enough for a single day.
  • 03Set bounds with minDate and maxDate rather than rejecting a pick after the fact.
  • 04Start the week where your readers do: Monday in most of Europe, Sunday in the US.

Best practices

October 2026
Sun
Mon
Tue
Wed
Thu
Fri
Sat
DoDisable the days that can't be picked, so people see the rule before they try.
October 2026
Sun
Mon
Tue
Wed
Thu
Fri
Sat

Pick a day from October 5.

Don'tDon't let them pick it and then explain why it was wrong.

Accessibility

  • 01Each month is a grid labelled by its title. Column headers carry the full weekday name, and each day button the full date, such as Tuesday, October 20, 2026.
  • 02The grid is one tab stop. Arrows move by a day or a week, Home and End to the ends of the week, Page Up and Page Down by a month, and with Shift by a year. Moving past the page turns it.
  • 03Enter or Space picks the focused day. The picked days' cells are aria-selected, and today is aria-current.
  • 04Days that can't be picked are aria-disabled rather than disabled, so they stay in the keyboard path and are announced as unavailable.
  • 05In range mode a polite live region says what happened: the start and that an end is needed, then the range and its length.
  • 06The page slide fades in and is off under reduced motion.

References