Knit UI
GitHub

Playground

Loading playground…

false
false
Playground
<Calendar
  size="md"
  numberOfColumns={1}
  minLevel="month"
  maxLevel="decade"
  static={false}
  fullWidth={false}
  defaultDate="2026-06-15"
/>

Examples

Month Level

Default month view, opened on June 2026.

Loading example…

Month LevelSourceStorybook

Year Level

Year view — pick a month to zoom into it.

Loading example…

Year LevelSourceStorybook

Decade Level

Decade view — pick a year to zoom into it.

Loading example…

Decade LevelSourceStorybook

Multiple Columns

Three months side by side — numberOfColumns={3}.

Loading example…

Multiple ColumnsSourceStorybook

Min Max Date

Bounded range — only March–September 2026 is navigable/selectable.

Loading example…

Min Max DateSourceStorybook

Custom Render Day

Custom day rendering — weekend numbers get a colored dot via renderDay.

Loading example…

Custom Render DaySourceStorybook

Themed

The accent recolors with the Tamagui theme= prop — no color prop, no hex. Here the whole calendar renders in the red ramp.

Loading example…

ThemedSourceStorybook

Framed Surface

Calendar.Frame is the styled root, exposed as the single extension point — styled(Calendar.Frame, …) (here a bordered, padded surface) and the forwarded frame style props both land on the root.

Loading example…

Framed SurfaceSourceStorybook

Sizes

Every size token, from xxs to xxl, at the month level.

Loading example…

SizesSourceStorybook

Full Width

fullWidth stretches the whole calendar — header, weekday row and grid — to its container's width, with the cells sharing each row equally. Unlike the standalone Month, this exercises the full container chain (Calendar → level group → level → grid), so every wrapper must opt into the stretch.

Loading example…

Full WidthSourceStorybook

Full Width Filled

fullWidth fills BOTH axes. Given a fixed container height, the level fills it below the header and the week rows distribute the extra vertical space (the day cells grow taller). Switch levels to see the month/year grids fill the same way.

Loading example…

Full Width FilledSourceStorybook

Props

PropTypeDefaultDescription
ariaLabelsCalendarAriaLabels | undefined`aria-label`s for the controls on the different levels.
columnsToScrollnumber | undefined`numberOfColumns`Number of columns to scroll with the next/prev buttons.
datestring | Date | undefinedDisplayed date in controlled mode.
decadeLabelFormatDecadeLabelFormat | undefined'YYYY'dayjs format for the decade label, or a function returning it.
defaultDatestring | Date | undefinedInitial displayed date in uncontrolled mode.
defaultLevelCalendarLevel | undefined
unset · month · year · decade
Initial displayed level (uncontrolled).
disabled systemboolean | undefined
enableKeyboardNavigationboolean | undefinedtrueEnable enhanced keyboard navigation (web only): Ctrl/Cmd+Arrow steps a year, Ctrl/Cmd+Shift+Arrow steps a decade, `Y` opens the year view.
excludeDate((date: DateStringValue) => boolean) | undefinedPredicate marking a day disabled.
firstDayOfWeekDayOfWeek | undefined`DatesProvider` (1)First weekday of each row, `0` (Sunday) … `6` (Saturday).
fullWidth systemboolean | undefinedfalseStretch the calendar to the full width of its container.
getDayAriaLabel((date: DateStringValue) => string) | undefinedAssigns each `Day` an `aria-label` based on its date.
getDayProps((date: DateStringValue) => Partial<DayProps>) | undefinedPasses props down to every `Day` (wins over `styles.day`).
getMonthControlProps((date: DateStringValue) => Partial<PickerControlProps>) | undefinedPasses props down to each month `PickerControl`, keyed by date (wins over `styles.control`).
getYearControlProps((date: DateStringValue) => Partial<PickerControlProps>) | undefinedPasses props down to each year `PickerControl`, keyed by date (wins over `styles.control`).
headerControlsOrderCalendarHeaderControlName[] | undefined['previous', 'level', 'next']Order in which the controls are rendered.
hideOutsideDatesboolean | undefinedfalseHide days outside the current month.
hideWeekdaysboolean | undefinedfalseHide the weekday header row.
highlightTodayboolean | undefinedfalseHighlight today with a border.
levelCalendarLevel | undefinedCurrent displayed level in controlled mode.
localestring | undefineddayjs locale; falls back to the value defined in `DatesProvider`.
maxDatestring | Date | undefinedMaximum possible date in `YYYY-MM-DD` format or a `Date` object.
maxLevelCalendarLevel | undefined
month · year · decade
'decade'Max level the user can zoom out to.
minDatestring | Date | undefinedMinimum possible date in `YYYY-MM-DD` format or a `Date` object.
minLevelCalendarLevel | undefined
month · year · decade
'month'Min level the user can zoom in to.
monthLabelFormatDateLabelFormat | undefined'MMMM YYYY'dayjs format for the month label, or a function returning it.
monthsListFormatstring | undefined'MMM'dayjs format for the month labels.
nextIconReactNodeReplace the next-button icon.
nextLabelstring | undefinedNext button `aria-label`.
numberOfColumnsnumber | undefined1Number of month columns displayed next to each other.
onDateChange((date: DateStringValue) => void) | undefinedCalled when the displayed date changes.
onLevelChange((level: CalendarLevel) => void) | undefinedCalled when the displayed level changes.
onMonthMouseEnter((event: unknown, date: DateStringValue) => void) | undefinedCalled when the pointer enters a month control (web hover; used for range preview). Cross-platform — the event type is opaque, never a DOM event.
onMonthSelect((date: DateStringValue) => void) | undefinedCalled when the user selects a month.
onMouseLeave((event: unknown) => void) | undefinedCalled when the pointer leaves the calendar root (web hover; used by range pickers to clear the hover preview). Cross-platform — the event type is opaque, never a DOM event; Tamagui no-ops it on native.
onNextDecade((date: DateStringValue) => void) | undefinedCalled when the next-decade button is clicked.
onNextMonth((date: DateStringValue) => void) | undefinedCalled when the next-month button is clicked.
onNextYear((date: DateStringValue) => void) | undefinedCalled when the next-year button is clicked.
onPreviousDecade((date: DateStringValue) => void) | undefinedCalled when the previous-decade button is clicked.
onPreviousMonth((date: DateStringValue) => void) | undefinedCalled when the previous-month button is clicked.
onPreviousYear((date: DateStringValue) => void) | undefinedCalled when the previous-year button is clicked.
onYearMouseEnter((event: unknown, date: DateStringValue) => void) | undefinedCalled when the pointer enters a year control (web hover; used for range preview). Cross-platform — the event type is opaque, never a DOM event.
onYearSelect((date: DateStringValue) => void) | undefinedCalled when the user selects a year.
previousIconReactNodeReplace the previous-button icon.
previousLabelstring | undefinedPrevious button `aria-label`.
renderDayRenderDay | undefinedCustom renderer for each day's content.
shadow system"xs" | "sm" | "md" | "lg" | "xl" | "xxs" | "xxl" | undefined
size systemCalendarSize | undefined
xxs · xs · sm · md · lg · xl · xxl
'md'Width/font of the header controls and cells.
staticboolean | undefinedfalseRender days as static (non-interactive) display cells.
theme systemThemeName | null | undefinedApplies a theme to this element
weekdayFormatDateLabelFormat | undefined'dd'dayjs format for weekday names, or a custom renderer.
weekendDaysDayOfWeek[] | undefined`DatesProvider` ([0, 6])Indices of weekend days.
withCellSpacingboolean | undefinedtrueSeparate controls/rows with spacing.
withWeekNumbersboolean | undefinedfalseDisplay a leading week-number column.
yearLabelFormatDateLabelFormat | undefined'YYYY'dayjs format for the year label, or a function returning it.
yearsListFormatstring | undefined'YYYY'dayjs format for the year labels.
Accessibility & DOM props (2)
PropType
keyKey | null | undefined
refRef<TamaguiElement> | undefined

Plus 497 inherited style props from Box — the full Tamagui/React Native style surface, including token shorthands like p, mx, bg and c. See Tokens for the scales they accept, or the full list.