Knit UI
GitHub

Playground

Loading playground…

Playground
<DateTimePicker />

Examples

Default

Single date + time selection (type="default").

Loading example…

DefaultSourceStorybook

With Seconds

Seconds input shown in the dropdown and reflected in the trigger format.

Loading example…

With SecondsSourceStorybook

Default Time Value

A new selection picks up defaultTimeValue instead of midnight.

Loading example…

Default Time ValueSourceStorybook

Range

Range selection (type="range") — a start and end date, each with its own time.

Loading example…

RangeSourceStorybook

Clearable

Clearable field — a clear button appears in the right section once a value is set.

Loading example…

ClearableSourceStorybook

Min Max

Bounded selection — out-of-[minDate, maxDate] days are disabled and the value is clamped on close.

Loading example…

Min MaxSourceStorybook

Custom Format

Custom trigger format via a valueFormat string.

Loading example…

Custom FormatSourceStorybook

Modal Dropdown

Opens in a centered modal instead of a popover (dropdownType="modal").

Loading example…

Modal DropdownSourceStorybook

Disabled

Disabled trigger — the dropdown can't open.

Loading example…

DisabledSourceStorybook

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.
defaultTimeValuestring | undefinedDefault time value in `HH:mm` or `HH:mm:ss` format. Assigned to the time when a date is selected.
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.
endTimePickerPropsOmit<TimePickerProps, "value" | "defaultValue"> | undefinedProps passed down to the end time `TimePicker` component in range mode.
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 systemInlineDateTimePickerSize | undefined'sm'Trigger / control size.
sortDatesboolean | undefinedtrueSort the selected dates before `onChange` — `multiple` only.
submitButtonPropsActionIconProps | undefinedProps passed down to the submit button.
theme systemThemeName | null | undefinedApplies a theme to this element
timePickerPropsOmit<TimePickerProps, "value" | "defaultValue"> | undefinedProps passed down to the `TimePicker` component.
typeDatePickerType | Type | undefinedPicker type: `range`, `multiple` or `default`.
valueDatePickerValue<Type, DateValue> | undefinedValue for controlled component.
valueFormatstring | ((date: DateStringValue) => string) | undefined"DD/MM/YYYY HH:mm"`dayjs` format for the displayed value, or a function that receives the value as a `YYYY-MM-DD HH:mm:ss` string and returns the formatted 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.
withSecondsboolean | undefinedfalseWhether the seconds input is displayed.
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.