Date & Time

Calendar

Display an inline date picker. Supports single and multiple date selection, min/max constraints, week numbers, multiple months, and full keyboard navigation.

Playground

Experiment with different props in real-time.

SunMonTueWedThuFriSat
1234567
891011121314
15161718192021
22232425262728
2930311234
567891011

Basic Usage

Import and use the Calendar component with bind:value for two-way binding.

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

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

<Calendar bind:value />

Sizes

3 sizes from small to 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 size="xs" />
<Calendar size="sm" />
<Calendar size="md" />
<Calendar size="lg" />
<Calendar size="xl" />

Colors

Semantic color schemes applied to the selected date indicator.

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
SunMonTueWedThuFriSat
1234567
891011121314
15161718192021
22232425262728
2930311234
567891011
SunMonTueWedThuFriSat
1234567
891011121314
15161718192021
22232425262728
2930311234
567891011
SunMonTueWedThuFriSat
1234567
891011121314
15161718192021
22232425262728
2930311234
567891011
<Calendar color="primary" />
<Calendar color="secondary" />
<Calendar color="tertiary" />
<Calendar color="success" />
<Calendar color="warning" />
<Calendar color="error" />
<Calendar color="info" />
<Calendar color="surface" />

Variants

Choose between solid, outline, soft, and subtle styling for the selected date.

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 variant="solid" />
<Calendar variant="outline" />
<Calendar variant="soft" />
<Calendar variant="subtle" />

Multiple Months

Display multiple months side by side with the numberOfMonths prop.

SunMonTueWedThuFriSat
1234567
891011121314
15161718192021
22232425262728
2930311234
567891011
SunMonTueWedThuFriSat
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789
<Calendar numberOfMonths={2} />

With Min/Max Date

Restrict the selectable date range with minValue and maxValue.

SunMonTueWedThuFriSat
1234567
891011121314
15161718192021
22232425262728
2930311234
567891011
<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

Show ISO week numbers alongside each row with the weekNumbers prop.

# SunMonTueWedThuFriSat
1 1234567
2 891011121314
3 15161718192021
4 22232425262728
5 2930311234
6 567891011
<Calendar weekNumbers />

Multiple Selection

Allow selecting multiple dates by setting type="multiple".

SunMonTueWedThuFriSat
1234567
891011121314
15161718192021
22232425262728
2930311234
567891011
<script lang="ts">
  import { Calendar } from 'sv5ui';
  import type { DateValue } from '@internationalized/date';

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

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

In a Popover

Combine with a Popover to create 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

Use the ui prop to override classes on specific internal elements of the Calendar.

SlotDescription
rootOutermost wrapper element — controls overall layout and spacing
headerTop section containing navigation and heading
bodyMain body wrapping the calendar grid
headingMonth/year heading text
gridThe calendar grid table element
gridRowA row in the calendar grid
gridWeekDaysRowRow containing weekday name headers
gridBodyBody of the calendar grid containing date cells
headCellIndividual weekday header cell (Mon, Tue, etc.)
headCellWeekHeader cell for the week numbers column
cellIndividual date cell wrapper
cellTriggerClickable button inside each date cell
cellWeekCell containing the week number
navButtonPrevious/next month navigation buttons
navButtonIconIcon inside navigation buttons

Snippets

Use Svelte 5 snippets to customize specific parts of the Calendar.

SnippetTypeDescription
headingSnippet<[CalendarHeadingSlotProps]>Custom month/year heading renderer
daySnippet<[CalendarDaySlotProps]>Custom day cell content renderer
weekDaySnippet<[CalendarWeekDaySlotProps]>Custom weekday header content renderer

Props

PropTypeDefault
valueDateValue-
onValueChange(value: DateValue | undefined) => void-
placeholderDateValuetoday
type'single' | 'multiple''single'
rangebooleanfalse
colorColor'primary'
size'xs' | 'sm' | 'md' | 'lg' | 'xl''md'
variant'solid' | 'outline' | 'soft' | 'subtle''solid'
minValueDateValue-
maxValueDateValue-
disabledbooleanfalse
fixedWeeksbooleantrue
numberOfMonthsnumber1
weekStartsOn0-60
localestring'en'
weekNumbersbooleanfalse
monthControlsbooleantrue
yearControlsbooleantrue
readonlybooleanfalse
preventDeselectbooleanfalse
prevMonthIconstring'lucide:chevron-left'
nextMonthIconstring'lucide:chevron-right'
prevYearIconstring'lucide:chevrons-left'
nextYearIconstring'lucide:chevrons-right'
isDateDisabledDateMatcher-
isDateUnavailableDateMatcher-
classstring-
uiRecord<Slot, Class>-