Standalone calendar with date, month, and year panels for single, multiple, and range selection.
Introduction
Calendar is a standalone date picker surface with date, month, and year panels. It renders inline (not in a popover) and supports single, multiple, and range selection out of the box.
Calendar is the building block behind the popover-based pickers—DateField and DatePicker wrap it with a text input and overlay. Reach for Calendar directly when you want the grid visible at all times, such as in a sidebar, dashboard widget, or a custom scheduling layout.
Import
import { Calendar } from "@bridge-ui/vue/Components/Calendar";import { Calendar } from "@bridge-ui/react/Components/Calendar";Basic usage
Bind the selection with value/onChange in React or v-model in Vue. For uncontrolled usage with an initial value, use defaultValue in React or default-value in Vue. Use viewDate (React) / view-date (Vue) to control which month is initially displayed.
Range selection
Enable range to select a start/end pair. The bound value becomes a two-item tuple [start, end]; hovering a candidate end date previews the in-between fill before the second date is committed.
For a form field built on top of range selection, see DateRangeField. For a dual-month layout with two date panels side by side, see CalendarRange.
Multiple selection
Enable multiple to allow selecting any number of individual dates. The bound value becomes an array of dates; clicking a selected date removes it from the array.
Bounds and disabled dates
Restrict the selectable range with minDate and maxDate, and block individual dates with disableDates. Out-of-range and disabled tiles render with muted, non-interactive styling. Pair with disableMonths and disableYears to block entire months or years from the month/year panels.
Colors
Use the color prop to change the accent used for selected tiles across the date, month, and year panels. Available colors: primary (default), secondary, success, info, warning, error, and dark.
Primary
Success
Error
Primary
Success
Error
Building blocks
Calendar composes three smaller, independently usable panels—swap them in when you only need one grid instead of the full month/year-switching chrome:
- CalendarDate — the weekday header and day grid. Supports the same range/multiple selection modes as Calendar.
- CalendarMonth — a 12-tile month grid (0–11) for a given year.
- CalendarYear — a paginated year grid (pageSize years per page, default 15).
CalendarDate
CalendarMonth
CalendarYear
CalendarDate
CalendarMonth
CalendarYear
Related components
DateField, DateRangeField, DatePicker, CalendarRange
Accessibility
- The active panel (date, month, or year) exposes a header with a live text label (month/year or year-page range) and previous/next/today navigation buttons.
- Day, month, and year tiles are rendered as buttons, so they receive keyboard focus and can be activated with Enter or Space.
- Disabled and out-of-range tiles are marked non-interactive and skipped by pointer and keyboard activation alike.
- When embedding Calendar without a visible page heading nearby, add aria-label (via customProps.root) so assistive technology has context for the grid.
Anatomy
Calendar renders a header and a single body panel that swaps between date, month, and year grids:
Calendar (root)
├── Header
│ ├── Year selector — current year label, switches to the year panel
│ ├── Month selector — current month label, switches to the month panel
│ └── Nav — previous, today, and next buttons (date panel)
└── Body — active panel
├── CalendarDate — weekday row + day tiles (default view)
├── CalendarMonth — month tiles (when the month selector is active)
└── CalendarYear — year tiles (when the year selector is active)API
| Prop | Type | Default | Description |
|---|---|---|---|
| v-model | DatePickerModel | — | Two-way binding for the selection model (single, multiple, or range). |
| default-value | DatePickerModel | null | Initial value for uncontrolled usage (without v-model). |
| Prop | Type | Default | Description |
|---|---|---|---|
| value | DatePickerModel | — | Controlled selection model. Use with onChange. |
| defaultValue | DatePickerModel | null | Initial value for uncontrolled usage. |
| onChange | (value: DatePickerModel) => void | — | Called when the selection model changes. |
Calendar-specific
| Prop | Type | Default | Description |
|---|---|---|---|
| classes | CalendarClasses | — | Classes for root, header, body, selector, and navButton. |
| color | CalendarColor | "primary" | Accent color for selected tiles. |
| customProps | CalendarCustomProps | — | Extra props for internal parts (root, header, navButton, todayButton, selector, etc.). |
| defaultView / default-view | CalendarView | "date" | Uncontrolled initial panel ("date", "month", or "year"). |
| disabled | boolean | false | Disables the whole calendar. |
| disableDates / disable-dates | Date[] | — | Dates that cannot be selected. |
| disableMonths / disable-months | number[] | — | Month indexes (0–11) that cannot be selected. |
| disableYears / disable-years | number[] | — | Years that cannot be selected. |
| hideMonths / hide-months | boolean | false | Hides the month selector and month panel. |
| hideOutsideDays / hide-outside-days | boolean | false | Hides days that fall outside the displayed month. |
| hideWeekdays / hide-weekdays | boolean | false | Hides weekday labels on the date panel. |
| hideYears / hide-years | boolean | false | Hides the year selector and year panel. |
| maxDate / max-date | Date | — | Latest selectable date. |
| minDate / min-date | Date | — | Earliest selectable date. |
| multiple | boolean | false | Allows selecting multiple dates. |
| previewDate / preview-date | Date | null | — | Controlled range-preview hover date. |
| range | boolean | false | Selects a start/end date range. |
| readOnly / read-only | boolean | false | Prevents selection while keeping tiles visible. |
| rounded | CalendarRounded | "md" | Border radius of tiles and chrome. |
| slots | CalendarDateSlots | — | Named slots forwarded to CalendarDate (day). |
| startOfWeek / start-of-week | StartOfWeek | 0 | First day of the week (0 = Sunday). |
| timeZone / time-zone | string | — | IANA time zone. |
| tokens | CalendarTokens | — | Token overrides. |
| view | CalendarView | — | Controlled panel view. Pair with onViewChange (React) or @view-change (Vue). |
| viewDate / view-date | Date | — | Controlled displayed month. Pair with onViewDateChange (React) or @view-date-change (Vue). |
Events
| Event | Payload | Description |
|---|---|---|
| @preview-date-change | date: Date | null | Emitted when the range-preview hover date changes. |
| @view-change | view: CalendarView | Emitted when the active panel view changes. |
| @view-date-change | date: Date | Emitted when the displayed month changes. |
| Prop | Payload | Description |
|---|---|---|
| onPreviewDateChange | (date: Date | null) => void | Called when the range-preview hover date changes. |
| onViewChange | (view: CalendarView) => void | Called when the active panel view changes. |
| onViewDateChange | (date: Date) => void | Called when the displayed month changes. |
CalendarMonth and CalendarYear
When used standalone, CalendarMonth and CalendarYear bind a plain number instead of a DatePickerModel:
| Component | Binding | Extra props |
|---|---|---|
| CalendarMonth | value/onChange (React) or v-model (Vue) — number (0–11) | year — year context used to bound months by minDate/maxDate. |
| CalendarYear | value/onChange (React) or v-model (Vue) — number | pageSize (default 15) and startYear control paging. |
Both share the color, rounded, disabled, readOnly, minDate/maxDate, and disableMonths/disableYears props with Calendar.