Date & Time

RangeCalendar

Select a date range by using the Calendar component with range={true}. This is not a separate component — it uses the same Calendar import from sv5ui.

Playground

Experiment with different props in real-time.

SunMonTueWedThuFriSat
1234567
891011121314
15161718192021
22232425262728
2930311234
567891011

Basic Usage

Import the Calendar component and pass range to enable range selection. Bind a DateRange value for two-way binding.

SunMonTueWedThuFriSat
1234567
891011121314
15161718192021
22232425262728
2930311234
567891011
<script lang="ts">
  import { Calendar } from 'sv5ui';
  import type { DateRange } from 'bits-ui';

  let value = $state<DateRange>({});
</script>

<Calendar range bind:value />

{#if value.start && value.end}
  <p>Selected: {value.start} — {value.end}</p>
{/if}

Two Months

Display two months side by side with numberOfMonths={2} for a better range selection experience.

SunMonTueWedThuFriSat
1234567
891011121314
15161718192021
22232425262728
2930311234
567891011
SunMonTueWedThuFriSat
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789
<script lang="ts">
  import { Calendar } from 'sv5ui';
  import type { DateRange } from 'bits-ui';

  let value = $state<DateRange>({});
</script>

<Calendar range numberOfMonths={2} bind:value />

With Min/Max Days

Restrict the range length with minDays and maxDays. In this example the range must be between 3 and 14 days.

SunMonTueWedThuFriSat
1234567
891011121314
15161718192021
22232425262728
2930311234
567891011
<script lang="ts">
  import { Calendar } from 'sv5ui';
  import type { DateRange } from 'bits-ui';

  let value = $state<DateRange>({});
</script>

<Calendar range minDays={3} maxDays={14} bind:value />

Colors

Apply any semantic color to the selected range highlight.

SunMonTueWedThuFriSat
1234567
891011121314
15161718192021
22232425262728
2930311234
567891011
SunMonTueWedThuFriSat
1234567
891011121314
15161718192021
22232425262728
2930311234
567891011
SunMonTueWedThuFriSat
1234567
891011121314
15161718192021
22232425262728
2930311234
567891011
SunMonTueWedThuFriSat
1234567
891011121314
15161718192021
22232425262728
2930311234
567891011
<Calendar range color="primary" />
<Calendar range color="secondary" />
<Calendar range color="success" />
<Calendar range color="error" />

Sizes

3 sizes — small, medium, and large.

SunMonTueWedThuFriSat
1234567
891011121314
15161718192021
22232425262728
2930311234
567891011
SunMonTueWedThuFriSat
1234567
891011121314
15161718192021
22232425262728
2930311234
567891011
SunMonTueWedThuFriSat
1234567
891011121314
15161718192021
22232425262728
2930311234
567891011
SunMonTueWedThuFriSat
1234567
891011121314
15161718192021
22232425262728
2930311234
567891011
SunMonTueWedThuFriSat
1234567
891011121314
15161718192021
22232425262728
2930311234
567891011
<Calendar range size="xs" />
<Calendar range size="sm" />
<Calendar range size="md" />
<Calendar range size="lg" />
<Calendar range size="xl" />

With Min/Max Date

Restrict the selectable date range with minValue and maxValue. In this example, only the next 30 days are selectable.

SunMonTueWedThuFriSat
1234567
891011121314
15161718192021
22232425262728
2930311234
567891011
<script lang="ts">
  import { Calendar } from 'sv5ui';
  import type { DateRange } from 'bits-ui';
  import { today, getLocalTimeZone } from '@internationalized/date';

  const now = today(getLocalTimeZone());
  let value = $state<DateRange>({});
</script>

<Calendar
  range
  minValue={now}
  maxValue={now.add({ days: 30 })}
  bind:value
/>

In a Popover

Combine with a Popover to create a date range picker dropdown.

<script lang="ts">
  import { Calendar, Popover, Button } from 'sv5ui';
  import type { DateRange } from 'bits-ui';

  let value = $state<DateRange>({});
  let open = $state(false);
  let display = $derived(
    value.start && value.end
      ? `${value.start} — ${value.end}`
      : ''
  );
</script>

<Popover bind:open>
  <Button
    variant="outline"
    color="surface"
    leadingIcon="lucide:calendar"
    label={display || 'Pick a date range'}
  />
  {#snippet content()}
    <div class="p-3">
      <Calendar
        range
        bind:value
        onValueChange={(v) => { if (v.start && v.end) open = false; }}
        size="sm"
      />
    </div>
  {/snippet}
</Popover>

Props

Range-specific and commonly used Calendar props. See the Calendar docs for the full prop list.

PropTypeDefault
rangebooleanfalse
value{ start?: DateValue; end?: DateValue }{}
onValueChange(value: DateRange) => void-
minDaysnumber-
maxDaysnumber-
colorColor'primary'
size'xs' | 'sm' | 'md' | 'lg' | 'xl''md'
variant'solid' | 'outline' | 'soft' | 'subtle''solid'
numberOfMonthsnumber1
minValueDateValue-
maxValueDateValue-
weekNumbersbooleanfalse
disabledbooleanfalse
fixedWeeksbooleantrue
localestring'en'
weekStartsOn0-60
readonlybooleanfalse
monthControlsbooleantrue
yearControlsbooleantrue
classstring-
uiRecord<Slot, Class>-