Preview
A product team reviews onboarding, synthesizes research, protects focus time, and plans a release across the next three days. Open an event for its organizer, attendees, location, notes, and meeting link. Accept or dismiss the suggested focus block to see caller-owned AI scheduling state change.
Wed, Oct 7 – Fri, Oct 9
Design guidance
Use Calendar for dated events that need more than date selection. Choose a view that matches the task: agenda for a short list, day or three-day for scheduling, week for planning, month for date context, or schedule to compare resources. Keep time zones explicit. Timed values need an ISO offset; all-day end dates are exclusive. Give events stable IDs and keep persistence, invitation policy, and AI decisions in the caller.
The React view is still React. Its date, interval, validation, and lane helpers are plain TypeScript and can be consumed from the calendar-core entry without mounting the UI.
Installation
Calendar composes Dialog, Avatar, Button, ScrollArea, EmptyState, Link, and Separator. The registry item includes those dependencies.
Load the shared foundation and Button styles once in your application entry. Calendar imports its own stylesheet.
Install Field and Input when you use the caller-owned creation dialog shown in the Preview.
Basic usage
Structures
The component renders its navigation, date grid, event cards, and detail or overflow dialog. Pass resources and event data from the caller. Use renderEvent when the card content needs product-specific treatment; the calendar still owns its event wrapper and interactions.
Examples
Agenda list
Use agenda to scan the day's events in chronological order and open details without a time grid.
Wednesday, October 7, 2026
Daily schedule
Use a day view when the team needs one detailed timeline. Empty timed slots can open a caller-owned creation flow.
Wednesday, October 7, 2026
Three-day planning
Compare adjacent days on one time axis. The Preview uses this view for the team's immediate plan.
Wed, Oct 7 – Fri, Oct 9
Week planning
Use the Monday-first week for broader planning. The caller owns the selected date and view when they need to control navigation.
Mon, Oct 5 – Sun, Oct 11
Month context
Use the month grid for date context. Crowded dates reveal the remaining events in a dialog.
October 2026
Resource schedule
Pass resources and matching resourceId values to compare team calendars. Unassigned events remain visible in the unassigned column.
Wednesday, October 7, 2026
Controlled edits and creation
Set editable and provide onEventChange to enable move and resize gestures in a time or date grid. Agenda remains a read-only chronological list. The callback returns a new event with its original metadata; update your controlled events value to commit it. Escape, cancellation, and invalid drops do not commit. onSlotSelect receives a draft range; create the event in your own dialog and add it only after the user submits.
Wed, Oct 7 – Fri, Oct 9
slotDuration defaults to 30 minutes and snapDuration to 15 minutes. Click or keyboard selection uses the same snapped slot. Move with Alt+Arrow keys; resize handles use Arrow keys. Timed events resize vertically; all-day and month events resize by date.
Overlap and overflow
Overlapping timed events use up to three visible lanes. Open +N to reach every hidden event. Adjacent events can reuse a lane.
Wednesday, October 7, 2026
Event details and responses
Organizer, participants, location, notes, link, status, and conflict are event data. Pending response actions appear only when onEventResponse is supplied; update the controlled event after the caller accepts or declines.
Wednesday, October 7, 2026
AI suggestion and scheduled provenance
Scheduling provenance is independent from invitation status. The callback requests an action; the caller decides what it means and updates the event. Accepting a suggestion changes its state to scheduled while retaining its AI source and reason.
Wednesday, October 7, 2026
Read-only data states
Without editable, event changes are disabled. Invalid data produces a visible alert. Empty data, very short events, midnight continuation, daylight-saving transitions, and event kinds are also represented in these examples.
Wed, Oct 7 – Fri, Oct 9
October 2026
Wednesday, October 7, 2026
Sunday, November 3, 2024
Wednesday, October 7, 2026
No events on this day
Choose another date to see scheduled moments.
Calendar data could not be shown. Timed events require an ISO date-time with an explicit offset.
Career history remains owned by Timeline. Date Picker owns date selection; Booking keeps its private date/time strip.
API reference
Source utilities
Import the framework-free date and layout helpers from the installed calendar.utils source (or the import package’s calendar-core entry) when a caller needs the same date validation, zone conversion, interval splitting, or lane layout without rendering the React view.
| Prop | Type | Default | Description |
|---|---|---|---|
eventsrequired | readonly CalendarEvent[] | Stable, unique event IDs and caller-owned event data. | |
daterequired | string | Controlled YYYY-MM-DD anchor date. | |
timeZonerequired | string | Valid IANA time zone used for day boundaries and labels. | |
view | "agenda" | "day" | "three-day" | "week" | "month" | "schedule" | agenda | Controlled visible view. |
resources | readonly CalendarResource[] | Resource columns for schedule view. | |
editable | boolean | false | Enables gestures only when onEventChange is supplied; event editable:false disables one event. |
onDateChange / onViewChange | callbacks | Receive navigation date and view changes. | |
onEventSelect | (event: CalendarEvent) => void | Receives the original event when details open. | |
onEventChange | (next, { previous, action }) => void | Commit a controlled move or endpoint resize. Action is move, resize-start, or resize-end. | |
onSlotSelect | (slot: CalendarSlot) => void | Receives a selected draft range; does not create an event. | |
slotDuration / snapDuration | number | 30 / 15 minutes | Draft length and movement/resize increment. |
onEventResponse | (event, "confirmed" | "declined") => void | Enables pending invitation response actions. | |
onSchedulingResponse | (event, "accept" | "dismiss") => void | Requests an AI suggestion response from caller policy. | |
renderEvent | (event, context) => ReactNode | Custom event content inside the shared event wrapper. | |
className / aria-label | string | Root styling context and accessible name. |
| Prop | Type | Default | Description |
|---|---|---|---|
id / titlerequired | string | Stable event identity and visible title. | |
start / endrequired | string | Timed events use ISO date-times with explicit offsets. All-day dates are YYYY-MM-DD; end is exclusive and optional for a one-day event. | |
allDay | boolean | false | Selects date-only all-day behavior. |
resourceId | string | Must match a supplied resource ID. | |
subtitle / summary / location / href / notes | string | Optional display and detail content. | |
organizer / participants | CalendarParticipant | People with stable IDs, labels, and optional avatar URLs. | |
status | "confirmed" | "pending" | "declined" | "attended" | Invitation state, independent of AI scheduling. | |
scheduling | { source: "ai"; state: "suggested" | "scheduled"; label?; reason? } | Visible AI scheduling provenance supplied by the caller. | |
editable | boolean | Set false to disable gestures for one event. |
| Prop | Type | Default | Description |
|---|---|---|---|
parseCalendarDate / addCalendarDays | date helpers | Validate and increment date-only values. | |
parseCalendarTimestamp / calendarDateInZone / formatCalendarTime | time helpers | Parse offset timestamps and format instants in a supplied zone. | |
getCalendarDay / getCalendarDates / navigateCalendarDate | view helpers | Compute zone-aware day boundaries and visible date ranges. | |
validateCalendarData / toCalendarInterval / splitCalendarInterval | data helpers | Validate events and derive interval/day segments. | |
assignCalendarLanes / limitCalendarLanes | layout helpers | Assign deterministic overlap lanes and return overflow events. | |
changeCalendarEvent / validateCalendarInteractionSettings | change helpers | Create immutable event changes and validate timing settings. |
Keyboard and accessibility
Tab reaches calendar controls, events, and the slot grid when creation is enabled. Enter or Space opens event details. Escape closes dialogs and cancels an unfinished gesture. Alt+Arrow keys move a focused editable event; resize handles use Arrow keys. Empty timed cells support arrow-key slot selection and Enter. Event and slot controls expose accessible names and status feedback.