Knit UI
GitHub

Playground

Loading playground…

Playground
<DatePickerInput />

Examples

Default

Single date with a label and placeholder.

Loading example…

DefaultSourceStorybook

Range

Range trigger — renders start – end once both ends are chosen.

Loading example…

RangeSourceStorybook

Clearable

Clearable — a clear button appears in the trigger once a value is set.

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 | undefined'month'Initial 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`.
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.
errorReactNodeError message / state.
excludeDate((date: DateStringValue) => boolean) | undefinedPredicate marking a day disabled.
firstDayOfWeekDayOfWeek | undefined`DatesProvider` (1)First weekday of each row, `0` (Sunday) … `6` (Saturday).
formstring | undefinedAssociated `<form>` id forwarded to the hidden input.
fullWidth systemboolean | undefinedfalseStretch the list (and its controls) 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.
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`.
monthLabelFormatDateLabelFormat | undefined'MMMM YYYY'dayjs format for the month label, or a function returning it.
monthsListFormatstring | undefined'MMM'dayjs format for the month labels.
namestring | undefinedForm field name forwarded to the hidden input.
nextIconReactNodeReplace the next-button icon.
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: 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.
placeholderstring | undefinedInput placeholder shown when there is no value.
popoverPropsPartial<Omit<PopoverProps, "children">> | undefinedProps passed to the `Popover`.
presetsDatePickerPreset<Type>[] | undefinedPredefined values to pick from.
previousIconReactNodeReplace the previous-button icon.
previousLabelstring | undefinedPrevious-button `aria-label`.
readOnlyboolean | undefinedPrevent the value from being changed by the user (the dropdown stays closed).
refRef<TamaguiElement> | undefined
renderDayRenderDay | undefinedCustom renderer for each day's content.
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 D, 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`).
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.
withTimeboolean | undefinedfalseSerialize the hidden field value with time.
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.

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.