DateRangePicker

A date range field with a calendar popover for visual range selection. Combines segmented range input with a dropdown range calendar.

Example

Select range

Range: 2026-04-03 to 2026-04-10

Root Props

PropTypeDefaultDescription
value{ start: DateValue; end: DateValue }Selected date range, bindable
onValueChange(value) => voidCalled when range changes
placeholderDateValuePlaceholder date, bindable
openbooleanfalseControls popover state, bindable
onOpenChange(open: boolean) => voidCalled when popover toggles
minValueDateValueMinimum selectable date
maxValueDateValueMaximum selectable date
disabledbooleanfalseDisable the picker
readonlybooleanfalseMake the field read-only
isDateDisabledDateMatcherFunction to disable specific dates
isDateUnavailableDateMatcherFunction to mark dates unavailable
localestring'en'Locale for formatting
granularity'day' | 'month' | 'year' | 'hour' | 'minute' | 'second'Finest unit to display
closeOnRangeSelectbooleantrueClose popover after selecting range
numberOfMonthsnumber1Months shown in calendar
weekStartsOn0 | 1 | 2 | 3 | 4 | 5 | 60First day of week
fixedWeeksbooleanfalseAlways show 6 weeks
minDaysnumberMinimum range length
maxDaysnumberMaximum range length
requiredbooleanfalseMark as required
onStartValueChange(value) => voidCalled when start date changes
onEndValueChange(value) => voidCalled when end date changes

Sub-components

ComponentKey PropsDescription
DateRangePicker.LabelclassLabel for the picker
DateRangePicker.Inputtype, name, classSegmented date input for start or end (type="start" | "end")
DateRangePicker.Segmentpart, classIndividual date segment
DateRangePicker.TriggerclassButton to open the calendar popover
DateRangePicker.Contentside, sideOffset, classPopover container
DateRangePicker.CalendarclassPre-built range calendar with header and grid

Usage

<script>
  import { DateRangePicker } from '@chrissnell/chonky-ui';
  import { CalendarDate } from '@internationalized/date';

  let value = $state({
    start: new CalendarDate(2026, 4, 3),
    end: new CalendarDate(2026, 4, 10)
  });
</script>

<DateRangePicker.Root bind:value>
  <DateRangePicker.Label>Select range</DateRangePicker.Label>
  <div style="display: flex; align-items: center; gap: 0.25rem;">
    <DateRangePicker.Input type="start" />
    <span class="date-range-field-separator">–</span>
    <DateRangePicker.Input type="end" />
    <DateRangePicker.Trigger />
  </div>
  <DateRangePicker.Content>
    <DateRangePicker.Calendar />
  </DateRangePicker.Content>
</DateRangePicker.Root>