Data Display

Calendar

A date picker supporting single, multiple, and range selection. Built on @internationalized/date for timezone-aware dates.

Playground

Experiment with different props.

SunMonTueWedThuFriSat
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456

Basic Usage

Single date selection with bind:value.

SunMonTueWedThuFriSat
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456
<script lang="ts">
  import { Calendar } from 'sv5ui';
  import { today, getLocalTimeZone } from '@internationalized/date';

  let value = $state(today(getLocalTimeZone()));
</script>

<Calendar bind:value />

Variants

4 visual styles.

SunMonTueWedThuFriSat
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456
SunMonTueWedThuFriSat
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456
SunMonTueWedThuFriSat
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456
SunMonTueWedThuFriSat
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456
<Calendar variant="solid" />
<Calendar variant="outline" />
<Calendar variant="soft" />
<Calendar variant="subtle" />

Sizes

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

Colors

SunMonTueWedThuFriSat
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456
SunMonTueWedThuFriSat
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456
SunMonTueWedThuFriSat
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456
SunMonTueWedThuFriSat
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456
<Calendar color="primary" />
<Calendar color="secondary" />
<Calendar color="tertiary" />
<Calendar color="success" />
<Calendar color="warning" />
<Calendar color="error" />
<Calendar color="info" />
<Calendar color="surface" />

Multiple Selection

Select multiple dates with type="multiple".

SunMonTueWedThuFriSat
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456

Selected: 0 date(s)

<script lang="ts">
  import { Calendar } from 'sv5ui';
  import type { DateValue } from '@internationalized/date';

  let values = $state<DateValue[]>([]);
</script>

<Calendar type="multiple" bind:value={values} />

Multiple Months

SunMonTueWedThuFriSat
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456
SunMonTueWedThuFriSat
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011
<Calendar numberOfMonths={2} />

Min & Max Date

Restrict selectable dates to a range.

SunMonTueWedThuFriSat
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456
<script lang="ts">
  import { Calendar } from 'sv5ui';
  import { today, getLocalTimeZone } from '@internationalized/date';

  const now = today(getLocalTimeZone());
</script>

<Calendar
  minValue={now}
  maxValue={now.add({ days: 14 })}
/>

Week Numbers

# SunMonTueWedThuFriSat
1 262728293012
2 3456789
3 10111213141516
4 17181920212223
5 24252627282930
6 31123456
<Calendar weekNumbers />

In a Popover

Combine with Popover for a date picker dropdown.

<script lang="ts">
  import { Calendar, Popover, Button } from 'sv5ui';
  import type { DateValue } from '@internationalized/date';

  let value = $state<DateValue | undefined>(undefined);
  let open = $state(false);
  let display = $derived(value ? value.toString() : '');
</script>

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

UI Slots

SlotDescription
rootOutermost wrapper
headerNavigation and heading
bodyMain grid area
navButtonNav buttons
navButtonIconNav button icons
gridCalendar grid table
headingMonth/year heading
headCellWeekday header cell
cellDate cell wrapper
cellTriggerClickable date button

Snippets

SnippetDescription
headingCustom month/year heading (receives value string)
dayCustom date cell content (receives day DateValue)
weekDayCustom weekday name (receives day string)

Props

PropTypeDefault
valueDateValue | DateValue[]-
type'single' | 'multiple''single'
rangebooleanfalse
colorColorType'primary'
size'xs'|'sm'|'md'|'lg'|'xl''md'
variant'solid'|'outline'|'soft'|'subtle''solid'
numberOfMonthsnumber1
minValueDateValue-
maxValueDateValue-
isDateDisabledDateMatcher-
fixedWeeksbooleantrue
weekNumbersbooleanfalse
weekStartsOn0-60
localestring'en'
monthControlsbooleantrue
yearControlsbooleantrue
disabledbooleanfalse
readonlybooleanfalse
refHTMLElement | nullnull
classstring-
uiRecord<Slot, Class>-