Data Display

Range Calendar

A date range picker using Calendar range. Select start and end dates with min/max constraints, two-month view, and popover integration.

Playground

SunMonTueWedThuFriSat
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456

Select a date range

Basic Usage

Use range prop to enable range mode.

SunMonTueWedThuFriSat
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456
<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 for easier range selection.

SunMonTueWedThuFriSat
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456
SunMonTueWedThuFriSat
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011
<script lang="ts">
  import { Calendar } from 'sv5ui';
  import type { DateRange } from 'bits-ui';

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

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

Min & Max Days

Constrain range length with minDays and maxDays.

SunMonTueWedThuFriSat
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456
<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

SunMonTueWedThuFriSat
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456
SunMonTueWedThuFriSat
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456
SunMonTueWedThuFriSat
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456
<Calendar range color="primary" />
<Calendar range color="secondary" />
<Calendar range color="success" />
<Calendar range color="error" />

Sizes

SunMonTueWedThuFriSat
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456
SunMonTueWedThuFriSat
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456
SunMonTueWedThuFriSat
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456
<Calendar range size="xs" />
<Calendar range size="sm" />
<Calendar range size="md" />
<Calendar range size="lg" />
<Calendar range size="xl" />

Min & Max Date

Restrict to a date window.

SunMonTueWedThuFriSat
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456
<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

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>

Range Props

Additional props when range={true}. Also inherits all Calendar shared props (color, size, variant, etc.).

PropTypeDefault
rangetrue-
valueDateRange{}
onValueChange(value) => void-
onStartValueChange(value) => void-
onEndValueChange(value) => void-
minDaysnumber-
maxDaysnumber-
excludeDisabledbooleanfalse
numberOfMonthsnumber1
minValueDateValue-
maxValueDateValue-
colorColorType'primary'
size'xs'|'sm'|'md'|'lg'|'xl''md'
variant'solid'|'outline'|'soft'|'subtle''solid'
classstring-
uiRecord<Slot, Class>-