Knit UI
GitHub

Playground

Loading playground…

Playground
<MonthPickerInput />

Examples

Default

Single month with a label.

Loading example…

DefaultSourceStorybook

Range

Range of months in the trigger.

Loading example…

RangeSourceStorybook

Clearable

Clearable single month.

Loading example…

ClearableSourceStorybook

Custom Format

Custom display format via valueFormat.

Loading example…

Custom FormatSourceStorybook

Modal Dropdown

Presenting the picker in a centered modal instead of a popover.

Loading example…

Modal DropdownSourceStorybook

With Validation

Required field with a description and an error message.

Loading example…

With ValidationSourceStorybook

Props

PropTypeDefaultDescription
allowDeselect(Type extends "default" ? boolean : never) | undefinedWhether the user can deselect a date by clicking it again — `type="default"` only.
allowSingleDateInRange(Type extends "range" ? boolean : never) | undefinedWhether a single day can be selected as a range — `type="range"` only.
ariaLabelsCalendarAriaLabels | undefined`aria-label`s for the controls on the different levels.
clearableboolean | undefinedfalseShow a clear button in the right section when the field has a value.
clearButtonPropsCloseButtonProps | undefinedProps passed to the clear button.
closeOnChangeboolean | undefinedtrueClose the dropdown when the value changes (not applicable to `multiple`).
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 | undefinedInitial displayed level in uncontrolled mode.
defaultValueDatePickerValue<Type, DateValue> | undefinedDefault value for uncontrolled component.
descriptionReactNodeDescription rendered below the label.
disabled systemboolean | undefined
dropdownTypePickerInputDropdownType | undefined'popover'Whether the picker opens in a floating `Popover` or a centered `Modal`.
errorReactNodeError message / state.
formstring | undefinedAssociated `<form>` id forwarded to the hidden input.
fullWidth systemboolean | undefinedfalseStretch the list (and its controls) to the full width of its container.
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`).
labelReactNodeField label rendered above the trigger.
labelSeparatorstring | undefinedSeparator rendered between the two dates of a range value.
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'decade'Max level the user can zoom out to.
minDatestring | Date | undefinedMinimum possible date in `YYYY-MM-DD` format or a `Date` object.
modalPropsPartial<Omit<ModalProps, "children">> | undefinedProps passed to the `Modal` when `dropdownType="modal"` (ignored for the `popover` dropdown). Spread before the component's own `opened`/`onClose`/ `title`, so those always win; the `withCloseButton={false}` default is overridable via `modalProps.withCloseButton`.
monthsListFormatstring | undefined'MMM'dayjs format for the month labels.
namestring | undefinedForm field name forwarded to the hidden input.
nextLabelstring | undefinedNext-button `aria-label`.
numberOfColumnsnumber | undefined1Number of columns displayed next to each other.
onChange((value: DatePickerValue<Type, string>) => void) | undefinedCalled when value changes.
onDateChange((date: DateStringValue) => void) | undefinedCalled when the displayed date changes.
onDropdownClose(() => void) | undefinedCalled when the dropdown closes, after the incomplete-range reset. Lets a wrapper run extra close-time logic (e.g. `DateTimePicker`'s min/max clamp).
onLevelChange((level: MonthPickerLevel) => void) | undefinedCalled when the displayed level changes.
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.
onNextYear((date: DateStringValue) => void) | undefinedCalled when the next-year button is clicked.
onPreviousDecade((date: DateStringValue) => void) | undefinedCalled when the previous-decade button is clicked.
onPreviousYear((date: DateStringValue) => void) | undefinedCalled when the previous-year button is clicked.
placeholderstring | undefinedInput placeholder shown when there is no value.
popoverPropsPartial<Omit<PopoverProps, "children">> | undefinedProps passed to the `Popover`.
presetsMonthPickerPreset<Type>[] | undefinedPredefined values to pick from.
previousLabelstring | undefinedPrevious-button `aria-label`.
readOnlyboolean | undefinedPrevent the value from being changed by the user (the dropdown stays closed).
refRef<TamaguiElement> | undefined
requiredboolean | undefinedMark the field as required (adds the asterisk to the label).
shadow system"xs" | "sm" | "md" | "lg" | "xl" | "xxs" | "xxl" | undefined
size systemCalendarSize | undefined'sm'Trigger / control size.
sortDatesboolean | undefinedtrueSort the selected dates before `onChange` — `multiple` only.
theme systemThemeName | null | undefinedApplies a theme to this element
typeDatePickerType | Type | undefinedPicker type: `range`, `multiple` or `default`.
valueDatePickerValue<Type, DateValue> | undefinedValue for controlled component.
valueFormatstring | undefined'MMMM YYYY'`dayjs` format for the displayed value.
valueFormatterDateFormatter | undefinedFormat the selected dates into the trigger string (defaults by picker type).
variant systemInputVariant | undefined'default'Visual variant of the input chrome (`default`/`filled`/`unstyled`).
withCellSpacingboolean | undefinedtrueSeparate controls/rows with spacing.
withTimeboolean | undefinedfalseSerialize the hidden field value with time.
yearLabelFormatDateLabelFormat | undefined'YYYY'dayjs format for the year label, or a function returning it.
yearsListFormatstring | undefined'YYYY'dayjs format for the year labels.

Plus 495 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.