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 | undefined—Displayed date in controlled mode.
decadeLabelFormatDecadeLabelFormat | undefined'YYYY'dayjs format for the decade label, or a function returning it.
defaultDatestring | Date | undefined—Initial 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) | undefined—Predicate 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) | undefined—Assigns each `Day` an `aria-label` based on its date.
getDayProps((date: DateStringValue) => Partial<DayProps>) | undefined—Passes props down to every `Day` (wins over `styles.day`).
getMonthControlProps((date: DateStringValue) => Partial<PickerControlProps>) | undefined—Passes props down to each month `PickerControl`, keyed by date (wins over `styles.control`).
getYearControlProps((date: DateStringValue) => Partial<PickerControlProps>) | undefined—Passes 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 | undefined—Current displayed level in controlled mode.
localestring | undefined—dayjs locale; falls back to the value defined in `DatesProvider`.
maxDatestring | Date | undefined—Maximum 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 | undefined—Minimum 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.
nextIconReactNode—Replace the next-button icon.
nextLabelstring | undefined—Next button `aria-label`.
numberOfColumnsnumber | undefined1Number of month columns displayed next to each other.
onDateChange((date: DateStringValue) => void) | undefined—Called when the displayed date changes.
onLevelChange((level: CalendarLevel) => void) | undefined—Called when the displayed level changes.
onMonthMouseEnter((event: unknown, date: DateStringValue) => void) | undefined—Called 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) | undefined—Called when the user selects a month.
onMouseLeave((event: unknown) => void) | undefined—Called 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) | undefined—Called when the next-decade button is clicked.
onNextMonth((date: DateStringValue) => void) | undefined—Called when the next-month button is clicked.
onNextYear((date: DateStringValue) => void) | undefined—Called when the next-year button is clicked.
onPreviousDecade((date: DateStringValue) => void) | undefined—Called when the previous-decade button is clicked.
onPreviousMonth((date: DateStringValue) => void) | undefined—Called when the previous-month button is clicked.
onPreviousYear((date: DateStringValue) => void) | undefined—Called when the previous-year button is clicked.
onYearMouseEnter((event: unknown, date: DateStringValue) => void) | undefined—Called 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) | undefined—Called when the user selects a year.
previousIconReactNode—Replace the previous-button icon.
previousLabelstring | undefined—Previous button `aria-label`.
renderDayRenderDay | undefined—Custom 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 | undefined—Applies 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.

Edit this page on GitHub