Date & Time

DatePicker

A segmented date input paired with a calendar popover. Type into each segment or pick from the calendar, with granularity, min/max limits, locale support, and an optional time field.

Playground

Experiment with different props in real-time.

07202026

Basic Usage

Bind a DateValue from @internationalized/date.

07202026
<script lang="ts">
  import { DatePicker } from 'sv5ui';
  import { today, getLocalTimeZone } from '@internationalized/date';
  import type { DateValue } from '@internationalized/date';

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

<DatePicker bind:value />

Controlled Open

Bind open to control the popover externally.

mmddyyyy
<script lang="ts">
  import { DatePicker, Button } from 'sv5ui';

  let open = $state(false);
</script>

<DatePicker bind:open />
<Button label="Toggle calendar" onclick={() => (open = !open)} />

Date & Time Granularity

A time granularity adds time segments to the field.

mmddyyyy––––AM
<!-- Edit date and time in the segmented field -->
<DatePicker granularity="minute" />

Min & Max

mmddyyyy
<script lang="ts">
  import { DatePicker } from 'sv5ui';
  import { today, getLocalTimeZone } from '@internationalized/date';

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

<DatePicker minValue={now} maxValue={now.add({ months: 1 })} />

Disabled Dates

Disabled dates are dimmed with opacity-50 and cannot be selected.

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

  // Disable weekends
  const isWeekend = (date: DateValue) => {
    const day = date.toDate('UTC').getUTCDay();
    return day === 0 || day === 6;
  };
</script>

<DatePicker isDateDisabled={isWeekend} />

Time Input

Set timeInput to add a segmented time field below the calendar. The popover stays open for time entry.

mmddyyyy––––AM
<!-- Segmented time field below the calendar.
     The popover stays open for time entry. -->
<DatePicker timeInput />

Locale

jjmmaaaa
年 月日
<DatePicker locale="fr" />
<DatePicker locale="ja" />

Calendar Variant

Style the calendar inside the popover, mirroring <Calendar> variants.

mmddyyyy
mmddyyyy
mmddyyyy
<DatePicker calendarVariant="solid" />
<DatePicker calendarVariant="soft" />
<DatePicker calendarVariant="subtle" />

Multiple Months

mmddyyyy
<!-- Show two months in the popover -->
<DatePicker numberOfMonths={2} />

Variants

mmddyyyy
mmddyyyy
mmddyyyy
mmddyyyy
<DatePicker variant="outline" />
<DatePicker variant="soft" />
<DatePicker variant="subtle" />
<DatePicker variant="ghost" />

Sizes

mmddyyyy
mmddyyyy
mmddyyyy
<DatePicker size="xs" />
<DatePicker size="md" />
<DatePicker size="xl" />

Form Field

mmddyyyy

Please pick a date

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

  let date = $state<DateValue | undefined>(undefined);
  const error = $derived(date ? '' : 'Please pick a date');
</script>

<FormField label="Due date" {error}>
  <DatePicker bind:value={date} name="dueDate" />
</FormField>

UI Slots

Use the ui prop to override classes. Pass ui.calendarSlots to reach the calendar's own slots.

SlotDescription
rootThe field wrapper
fieldThe segmented date field
segmentEach editable date segment
literalSeparators between segments
triggerThe calendar popover trigger button
contentThe popover content
calendarThe calendar inside the popover
timeThe time-input row (when timeInput is set)

Props

PropTypeDefault
valueDateValue-
onValueChange(value) => void-
placeholderDateValuecurrent date
openbooleanfalse
granularity'day' | 'hour' | 'minute' | 'second''day'
hourCycle12 | 24-
localestring'en'
minValueDateValue-
maxValueDateValue-
isDateDisabledDateMatcher-
isDateUnavailableDateMatcher-
timeInputbooleanfalse
closeOnDateSelectbooleantrue
numberOfMonthsnumber1
weekStartsOn0-60
iconstring'lucide:calendar'
side'top' | 'right' | 'bottom' | 'left''bottom'
align'start' | 'center' | 'end''start'
variant'outline' | 'soft' | 'subtle' | 'ghost' | 'none''outline'
calendarVariant'solid' | 'outline' | 'soft' | 'subtle''solid'
colorColorType'primary'
size'xs' | 'sm' | 'md' | 'lg' | 'xl''md'
disabledbooleanfalse
readonlybooleanfalse
requiredbooleanfalse
namestring-
refHTMLElement | nullnull
classstring-
uiRecord<Slot, Class>-