RangeCalendar

A calendar for selecting a date range. Uses the same grid structure as Calendar but supports start/end range selection.

Example

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
placeholderDateValueControls visible month, bindable
minValueDateValueMinimum selectable date
maxValueDateValueMaximum selectable date
disabledbooleanfalseDisable the calendar
readonlybooleanfalsePrevent selection changes
numberOfMonthsnumber1Months shown at once
pagedNavigationbooleanfalseNavigate by full page of months
weekStartsOn0 | 1 | 2 | 3 | 4 | 5 | 60First day of week (0 = Sunday)
weekdayFormat'long' | 'short' | 'narrow''narrow'Weekday header format
isDateDisabledDateMatcherFunction to disable specific dates
isDateUnavailableDateMatcherFunction to mark dates unavailable
fixedWeeksbooleanfalseAlways show 6 weeks
minDaysnumberMinimum range length in days
maxDaysnumberMaximum range length in days
localestring'en'Locale for formatting
calendarLabelstringAccessible label
initialFocusbooleanfalseFocus calendar on mount
classstringAdditional CSS classes

Sub-components

ComponentDescription
RangeCalendar.HeaderContainer for navigation controls
RangeCalendar.HeadingDisplays current month/year
RangeCalendar.PrevButtonNavigate to previous month
RangeCalendar.NextButtonNavigate to next month
RangeCalendar.GridTable wrapper for a month grid
RangeCalendar.GridHeadTable header for weekday labels
RangeCalendar.HeadCellIndividual weekday label cell
RangeCalendar.GridBodyTable body containing date rows
RangeCalendar.GridRowA row of date cells
RangeCalendar.CellContainer for a day (requires date and month)
RangeCalendar.DayRenders the day number button

Usage

<script>
  import { RangeCalendar } 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>

<RangeCalendar.Root bind:value>
  {#snippet children({ months, weekdays })}
    <RangeCalendar.Header>
      <RangeCalendar.PrevButton>&larr;</RangeCalendar.PrevButton>
      <RangeCalendar.Heading />
      <RangeCalendar.NextButton>&rarr;</RangeCalendar.NextButton>
    </RangeCalendar.Header>
    {#each months as month}
      <RangeCalendar.Grid>
        <RangeCalendar.GridHead>
          <RangeCalendar.GridRow>
            {#each weekdays as day}
              <RangeCalendar.HeadCell>{day}</RangeCalendar.HeadCell>
            {/each}
          </RangeCalendar.GridRow>
        </RangeCalendar.GridHead>
        <RangeCalendar.GridBody>
          {#each month.weeks as week}
            <RangeCalendar.GridRow>
              {#each week as date}
                <RangeCalendar.Cell {date} month={month.value} />
              {/each}
            </RangeCalendar.GridRow>
          {/each}
        </RangeCalendar.GridBody>
      </RangeCalendar.Grid>
    {/each}
  {/snippet}
</RangeCalendar.Root>