308

Date Time Range Field

Date Time Range Field allows user to enter date and time value for a range of dates.

import * as DateTimeRangeFieldPrimitive from "@/components/ui/date-time-range-field-primitive";

export function DateTimeRangeFieldPrimitiveDemo() {

About

The <DateTimeRangeFieldPrimitive /> component is built on top of timescape, wrapping the library to deliver a more consistent API that aligns with Base UI conventions.

Installation

pnpm dlx shadcn@latest add junwen-k/ui-x/date-time-range-field-primitive

Anatomy

Import all parts and piece them together.

import * as DateTimeRangeFieldPrimitive from "@/components/ui/date-time-range-field-primitive";
 
export default () => (
  <DateTimeRangeFieldPrimitive.Root>
    <DateTimeRangeFieldPrimitive.From>
      <DateTimeRangeFieldPrimitive.Days />
      <DateTimeRangeFieldPrimitive.Separator />
      <DateTimeRangeFieldPrimitive.Months />
      <DateTimeRangeFieldPrimitive.Separator />
      <DateTimeRangeFieldPrimitive.Years />
      <DateTimeRangeFieldPrimitive.Separator />
      <DateTimeRangeFieldPrimitive.Hours />
      <DateTimeRangeFieldPrimitive.Separator />
      <DateTimeRangeFieldPrimitive.Minutes />
      <DateTimeRangeFieldPrimitive.Separator />
      <DateTimeRangeFieldPrimitive.Seconds />
      <DateTimeRangeFieldPrimitive.Separator />
      <DateTimeRangeFieldPrimitive.AmPm />
    </DateTimeRangeFieldPrimitive.From>
 
    <DateTimeRangeFieldPrimitive.Separator />
 
    <DateTimeRangeFieldPrimitive.To>
      <DateTimeRangeFieldPrimitive.Days />
      <DateTimeRangeFieldPrimitive.Separator />
      <DateTimeRangeFieldPrimitive.Months />
      <DateTimeRangeFieldPrimitive.Separator />
      <DateTimeRangeFieldPrimitive.Years />
      <DateTimeRangeFieldPrimitive.Separator />
      <DateTimeRangeFieldPrimitive.Hours />
      <DateTimeRangeFieldPrimitive.Separator />
      <DateTimeRangeFieldPrimitive.Minutes />
      <DateTimeRangeFieldPrimitive.Separator />
      <DateTimeRangeFieldPrimitive.Seconds />
      <DateTimeRangeFieldPrimitive.Separator />
      <DateTimeRangeFieldPrimitive.AmPm />
    </DateTimeRangeFieldPrimitive.To>
  </DateTimeRangeFieldPrimitive.Root>
);

Examples

Default

import * as DateTimeRangeFieldPrimitive from "@/components/ui/date-time-range-field-primitive";

export function DateTimeRangeFieldPrimitiveDemo() {

Disabled

import * as DateTimeRangeFieldPrimitive from "@/components/ui/date-time-range-field-primitive";

export function DateTimeRangeFieldPrimitiveDisabled() {

API Reference

Root

Runs timescape's range mode and provides the from and to fields to the parts below. Renders a <div> by default that manages focus across both fields.

PropTypeDefaultDescription
valueDateRange | null-The range value ({ from?: Date; to?: Date }). Use for controlled value; pass null for empty.
defaultValueDateRange-The initial value when uncontrolled.
onValueChange(value: DateRange | null) => void-Called when the range changes.
digits"numeric" | "2-digit""2-digit"Whether segments are zero-padded.
hour12booleanfalseUse a 12-hour clock. Required for the AmPm segments to render.
minDateDate-The minimum selectable date.
maxDateDate-The maximum selectable date.
snapToStepbooleanfalseSnap values to the segment's step when incrementing.
wheelControlbooleanfalseAllow changing segment values with the mouse wheel.
wrapAroundbooleanfalseWrap from the last value back to the first when incrementing past the end.
fromTimescapeOptions-Option overrides applied to the from field only.
toTimescapeOptions-Option overrides applied to the to field only.
disabledboolean-Disables every segment.
renderReactElement | function-Render as a different element.
...propsReact.ComponentProps<"div">-Props spread to the root element.

See the timescape options for more detail on the option props.

From, To

Containers that scope the segments inside them to the start or end of the range. Segments must be placed inside one of the two. Each renders a <div> by default.

PropTypeDefaultDescription
renderReactElement | function-Render as a different element.
...propsReact.ComponentProps<"div">-Props spread to the container element.

Segments

The Days, Months, Years, Hours, Minutes and Seconds parts, identical to the Date Time Field segments. Each renders an <input> and must live inside From or To.

PropTypeDefaultDescription
disabledboolean-Disables this segment only.
renderReactElement | function-Render as a different element.
...propsReact.ComponentProps<"input">-Props spread to the segment element.

AmPm

The meridiem segment. Renders only when hour12 is set for its field. Same props as the other segments.

Separator

A decorative separator, hidden from assistive technology with aria-hidden. Renders a <span> by default.

PropTypeDefaultDescription
renderReactElement | function-Render as a different element.
...propsReact.ComponentProps<"span">-Props spread to the separator element.

useDateTimeRangeField

Hook exposing the range field context (from, to, getRootProps, disabled) for building custom parts. Must be used within <DateTimeRangeFieldPrimitive.Root>.