Calendar

Date-grid primitive on bits-ui Calendar. Keyboard-first roving focus across weeks, a calm ring-on-focus hand-off on each cell, and a 4xl cell radius that softens the grid without erasing it.

Usage

June 2026
SuMoTuWeThFrSa
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4

Swap the heading for month + year selects. Useful when users need to leap across years without hammering the nav arrows.

SuMoTuWeThFrSa
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4

Range

Multi-day span selection via RangeCalendar. Click a start date, then an end date — the in-between days highlight as a connected band.

June 2026
SuMoTuWeThFrSa
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4

Date of Birth Picker

Month and year dropdowns above the grid let users reach a birth year without paging through decades of months.

SuMoTuWeThFrSa
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4

Date and Time Picker

Compose Calendar with a time input below the grid. The date and time values stay independent — combine them when submitting.

June 2026
SuMoTuWeThFrSa
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
Time

Natural Language Picker

A text input parses plain-English phrases — today, tomorrow, in 3 days, 2025-06-15 — and syncs to the calendar below. Shows the pattern; swap the regex parser for chrono-node in production.

June 2026
SuMoTuWeThFrSa
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4

Multi-month

Pass numberOfMonths=2 to render side-by-side months — the canonical date-range picker layout. Nav arrows page both grids together.

June 2026
SuMoTuWeThFrSa
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
July 2026
SuMoTuWeThFrSa
28
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1

Keyboard navigation

Roving tabindex — Tab once to enter the grid, then arrow keys move day by day. Focused cell lights up with the standard --ring outline (focus-visible only — clicks don't show a ring).

June 2026
SuMoTuWeThFrSa
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
←/→
Previous / next day
↑/↓
Previous / next week
PgUp / PgDn
Previous / next month
Home / End
Start / end of week
Enter / Space
Select focused day

Source

June 2026
SuMoTuWeThFrSa
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4

Calendar props

Inherits bits-ui Calendar.Root props via spread. Subcomponents (Months, Nav, Grid, Cell, Day, HeadCell, MonthSelect, YearSelect) are composed internally; override by passing a `day` snippet.

PropTypeDescription
'single' | 'multiple'Required. `single` accepts one date at a time; `multiple` accepts an array. Narrows the `value` type.
DateValue | DateValue[] | undefined (bindable)The selected date(s). `DateValue` when type is `single`, `DateValue[]` when `multiple`.
DateValue (bindable)The visible month anchor. Controls which month renders when `value` is empty.
'label' | 'dropdown' | 'dropdown-months' | 'dropdown-years'Heading style. `dropdown` swaps both month and year for selects; the others mix one label with one dropdown.
ButtonVariantVariant applied to the Prev/Next nav buttons.
stringBCP-47 tag used for weekday names, month labels, and number formatting.
'narrow' | 'short' | 'long'Intl.DateTimeFormat option for the weekday header row.
booleanWhen true, days drawn from adjacent months are rendered but not interactive.
Snippet<[{ day: DateValue; outsideMonth: boolean }]>Optional render override for a single cell. Falls back to `Calendar.Day`.
stringMerged onto the root container via tailwind-merge.