Components / Forms
Calendar Stable A keyboard-accessible month grid for choosing a date or a date range.
Calendar is the always-visible date grid used inside DatePicker and DateRangePicker. Use it directly when a date choice is the main task of the view, such as scheduling a signature roll-out. Dates outside min/max or rejected by isDateDisabled cannot be selected. Month and weekday names come from Intl, so it follows the chosen locale with no date library.
Overview Mo Tu We Th Fr Sa Su 26 27 28 29 30 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 5 6
tsx Copy
import { useState } from 'react';
import { Calendar } from '@bindshq/stance-react';
const TODAY = new Date(2026, 10, 11);
export function Basic() {
const [date, setDate] = useState<Date | null>(new Date(2026, 10, 18));
return <Calendar today={TODAY} locale="en-GB" value={date} onValueChange={setDate} />;
}Light, dark and high contrast Every Stance component is designed and tested in all three appearance modes.
Import tsx Copy
import { Calendar } from '@bindshq/stance-react';Calendar has native counterparts. They share Stance tokens and intent, and use each platform’s own controls and conventions. The live previews on this page are the web implementation.
Web · React iOS and iPadOS · SwiftUI
tsx Copy
import { Calendar } from '@bindshq/stance-react';Examples Click a start and end date; hovering previews the range.
Mo Tu We Th Fr Sa Su 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
Mo Tu We Th Fr Sa Su 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
tsx Copy
import { useState } from 'react';
import { Calendar } from '@bindshq/stance-react';
import type { DateRange } from '@bindshq/stance-react';
const TODAY = new Date(2026, 10, 11);
export function Range() {
const [range, setRange] = useState<DateRange>({
start: new Date(2026, 10, 16),
end: new Date(2026, 10, 27),
});
return (
<Calendar
mode="range"
numberOfMonths={2}
today={TODAY}
locale="en-GB"
value={range}
onValueChange={setRange}
/>
);
}Only weekdays in the next three weeks are available.
Mo Tu We Th Fr Sa Su 26 27 28 29 30 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 5 6
tsx Copy
import { Calendar } from '@bindshq/stance-react';
const TODAY = new Date(2026, 10, 11);
export function Constraints() {
return (
<Calendar
today={TODAY}
locale="en-GB"
min={TODAY}
max={new Date(2026, 11, 2)}
isDateDisabled={(d) => d.getDay() === 0 || d.getDay() === 6}
/>
);
}US English with weeks starting on Sunday.
Su Mo Tu We Th Fr Sa 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 5 6 7 8 9 10 11 12
tsx Copy
import { Calendar } from '@bindshq/stance-react';
const TODAY = new Date(2026, 10, 11);
export function Localised() {
return (
<Calendar today={TODAY} locale="en-US" weekStartsOn={0} defaultValue={new Date(2026, 10, 26)} />
);
}Accessibility Month and year menus are native selects with accessible names, so they work with every keyboard, screen reader and touch device. Each month is a grid labelled by its month and year; weekday headers carry full names via abbr. Each day is a button with a full spoken label, e.g. “Wednesday, 11 November 2026, Today, Selected”; today has aria-current="date". Unavailable days stay discoverable but are announced as unavailable and cannot be chosen. The month title is a polite live region, so changing months by keyboard is announced. One day is in the Tab order; arrow keys, Page Up/Down and Home/End follow the APG date grid model. Keyboard Usage guidelines Do Set min and max whenever dates outside a window are invalid. Use the user’s locale. Don’t Use a calendar for dates far in the past, like birth dates; let people type instead (DatePicker).