Date Picker

Facilitates the selection of dates through an input and calendar-based interface.

llms.txt
Birthday
mm
dd
yyyy
	<script lang="ts">
  import { DatePicker } from "bits-ui";
  import CalendarBlank from "phosphor-svelte/lib/CalendarBlank";
  import CaretLeft from "phosphor-svelte/lib/CaretLeft";
  import CaretRight from "phosphor-svelte/lib/CaretRight";
</script>
 
<DatePicker.Root weekdayFormat="short" fixedWeeks={true}>
  <div class="flex w-full max-w-[232px] flex-col gap-1.5">
    <DatePicker.Label class="block select-none text-sm font-medium"
      >Birthday</DatePicker.Label
    >
    <DatePicker.Input
      class="h-input rounded-input border-border-input bg-background text-foreground focus-within:border-border-input-hover focus-within:shadow-date-field-focus hover:border-border-input-hover flex w-full max-w-[232px] select-none items-center border px-2 py-3 text-sm tracking-[0.01em]"
    >
      {#snippet children({ segments })}
        {#each segments as { part, value }, i (part + i)}
          <div class="inline-block select-none">
            {#if part === "literal"}
              <DatePicker.Segment {part} class="text-muted-foreground p-1">
                {value}
              </DatePicker.Segment>
            {:else}
              <DatePicker.Segment
                {part}
                class="rounded-5px hover:bg-muted focus:bg-muted focus:text-foreground aria-[valuetext=Empty]:text-muted-foreground focus-visible:ring-0! focus-visible:ring-offset-0! px-1 py-1"
              >
                {value}
              </DatePicker.Segment>
            {/if}
          </div>
        {/each}
        <DatePicker.Trigger
          class="text-foreground/60 hover:bg-muted active:bg-dark-10 ml-auto inline-flex size-8 items-center justify-center rounded-[5px] transition-all"
        >
          <CalendarBlank class="size-6" />
        </DatePicker.Trigger>
      {/snippet}
    </DatePicker.Input>
    <DatePicker.Content sideOffset={6} class="z-50">
      <DatePicker.Calendar
        class="border-dark-10 bg-background-alt shadow-popover rounded-[15px] border p-[22px]"
      >
        {#snippet children({ months, weekdays })}
          <DatePicker.Header class="flex items-center justify-between">
            <DatePicker.PrevButton
              class="rounded-9px bg-background-alt hover:bg-muted inline-flex size-10 items-center justify-center transition-all active:scale-[0.98]"
            >
              <CaretLeft class="size-6" />
            </DatePicker.PrevButton>
            <DatePicker.Heading class="text-[15px] font-medium" />
            <DatePicker.NextButton
              class="rounded-9px bg-background-alt hover:bg-muted inline-flex size-10 items-center justify-center transition-all active:scale-[0.98]"
            >
              <CaretRight class="size-6" />
            </DatePicker.NextButton>
          </DatePicker.Header>
          <div
            class="flex flex-col space-y-4 pt-4 sm:flex-row sm:space-x-4 sm:space-y-0"
          >
            {#each months as month (month.value)}
              <DatePicker.Grid
                class="w-full border-collapse select-none space-y-1"
              >
                <DatePicker.GridHead>
                  <DatePicker.GridRow class="mb-1 flex w-full justify-between">
                    {#each weekdays as day (day)}
                      <DatePicker.HeadCell
                        class="text-muted-foreground font-normal! w-10 rounded-md text-xs"
                      >
                        <div>{day.slice(0, 2)}</div>
                      </DatePicker.HeadCell>
                    {/each}
                  </DatePicker.GridRow>
                </DatePicker.GridHead>
                <DatePicker.GridBody>
                  {#each month.weeks as weekDates (weekDates)}
                    <DatePicker.GridRow class="flex w-full">
                      {#each weekDates as date (date)}
                        <DatePicker.Cell
                          {date}
                          month={month.value}
                          class="p-0! relative size-10 text-center text-sm"
                        >
                          <DatePicker.Day
                            class="rounded-9px text-foreground hover:border-foreground data-selected:bg-foreground data-disabled:text-foreground/30 data-selected:text-background data-unavailable:text-muted-foreground data-disabled:pointer-events-none data-outside-month:pointer-events-none data-selected:font-medium data-unavailable:line-through group relative inline-flex size-10 items-center justify-center whitespace-nowrap border border-transparent bg-transparent p-0 text-sm font-normal transition-all"
                          >
                            <div
                              class="bg-foreground group-data-selected:bg-background group-data-today:block absolute top-[5px] hidden size-1 rounded-full transition-all"
                            ></div>
                            {date.day}
                          </DatePicker.Day>
                        </DatePicker.Cell>
                      {/each}
                    </DatePicker.GridRow>
                  {/each}
                </DatePicker.GridBody>
              </DatePicker.Grid>
            {/each}
          </div>
        {/snippet}
      </DatePicker.Calendar>
    </DatePicker.Content>
  </div>
</DatePicker.Root>

Structure

	<script lang="ts">
  import { DatePicker } from "bits-ui";
</script>
 
<DatePicker.Root>
  <DatePicker.Label />
  <DatePicker.Input>
    {#snippet children({ segments })}
      {#each segments as { part, value }}
        <DatePicker.Segment {part}>
          {value}
        </DatePicker.Segment>
      {/each}
      <DatePicker.Trigger />
    {/snippet}
  </DatePicker.Input>
  <DatePicker.Content>
    <DatePicker.Calendar>
      {#snippet children({ months, weekdays })}
        <DatePicker.Header>
          <DatePicker.PrevButton />
          <DatePicker.Heading />
          <DatePicker.NextButton />
        </DatePicker.Header>
        {#each months as month}
          <DatePicker.Grid>
            <DatePicker.GridHead>
              <DatePicker.GridRow>
                {#each weekdays as day}
                  <DatePicker.HeadCell>
                    {day}
                  </DatePicker.HeadCell>
                {/each}
              </DatePicker.GridRow>
            </DatePicker.GridHead>
            <DatePicker.GridBody>
              {#each month.weeks as weekDates}
                <DatePicker.GridRow>
                  {#each weekDates as date}
                    <DatePicker.Cell {date} month={month.value}>
                      <DatePicker.Day />
                    </DatePicker.Cell>
                  {/each}
                </DatePicker.GridRow>
              {/each}
            </DatePicker.GridBody>
          </DatePicker.Grid>
        {/each}
      {/snippet}
    </DatePicker.Calendar>
  </DatePicker.Content>
</DatePicker.Root>

Managing Placeholder State

This section covers how to manage the placeholder state of the component.

Two-Way Binding

Use bind:placeholder for simple, automatic state synchronization:

	<script lang="ts">
  import { DatePicker } from "bits-ui";
  import { CalendarDateTime } from "@internationalized/date";
  let myPlaceholder = $state();
</script>
 
<button
  onclick={() => {
    myPlaceholder = new CalendarDateTime(2024, 8, 3, 12, 30);
  }}
>
  Set placeholder to August 3rd, 2024
</button>
 
<DatePicker.Root bind:placeholder={myPlaceholder}>
  <!-- ... -->
</DatePicker.Root>

Fully Controlled

Use a Function Binding for complete control over the state's reads and writes.

	<script lang="ts">
  import { DatePicker } from "bits-ui";
  import type { DateValue } from "@internationalized/date";
  let myPlaceholder = $state<DateValue>();
 
  function getPlaceholder() {
    return myPlaceholder;
  }
 
  function setPlaceholder(newPlaceholder: DateValue) {
    myPlaceholder = newPlaceholder;
  }
</script>
 
<DatePicker.Root bind:placeholder={getPlaceholder, setPlaceholder}>
  <!-- ... -->
</DatePicker.Root>

Managing Value State

This section covers how to manage the value state of the component.

Two-Way Binding

Use bind:value for simple, automatic state synchronization:

	<script lang="ts">
  import { DatePicker } from "bits-ui";
  import { CalendarDateTime } from "@internationalized/date";
  let myValue = $state(new CalendarDateTime(2024, 8, 3, 12, 30));
</script>
 
<button onclick={() => (myValue = myValue.add({ days: 1 }))}>
  Add 1 day
</button>
<DatePicker.Root bind:value={myValue}>
  <!-- ... -->
</DatePicker.Root>

Fully Controlled

Use a Function Binding for complete control over the state's reads and writes.

	<script lang="ts">
  import { DatePicker } from "bits-ui";
  import type { DateValue } from "@internationalized/date";
  let myValue = $state<DateValue>();
 
  function getValue() {
    return myValue;
  }
 
  function setValue(newValue: DateValue) {
    myValue = newValue;
  }
</script>
 
<DatePicker.Root bind:value={getValue, setValue}>
  <!-- ... -->
</DatePicker.Root>

Managing Open State

This section covers how to manage the open state of the component.

Two-Way Binding

Use bind:open for simple, automatic state synchronization:

	<script lang="ts">
  import { DatePicker } from "bits-ui";
  let isOpen = $state(false);
</script>
 
<button onclick={() => (isOpen = true)}>Open DatePicker</button>
 
<DatePicker.Root bind:open={isOpen}>
  <!-- ... -->
</DatePicker.Root>

Fully Controlled

Use a Function Binding for complete control over the state's reads and writes.

	<script lang="ts">
  import { DatePicker } from "bits-ui";
  let myOpen = $state(false);
 
  function getOpen() {
    return myOpen;
  }
 
  function setOpen(newOpen: boolean) {
    myOpen = newOpen;
  }
</script>
 
<DatePicker.Root bind:open={getOpen, setOpen}>
  <!-- ... -->
</DatePicker.Root>

Customization

The DatePicker component is made up of three other Bits UI components: Date Field, Calendar, and Popover.

You can check out the documentation for each of these components to learn more about their customization options, each of which can be used to customize the DatePicker component.

API Reference

DatePicker.Root

The root date picker component.

Property Details
value
onValueChange
open
onOpenChange
onOpenChangeComplete
placeholder
onPlaceholderChange
isDateUnavailable
isDateDisabled
validate
onInvalid
required
errorMessageId
readonlySegments
disableDaysOutsideMonth
closeOnDateSelect
pagedNavigation
preventDeselect
weekStartsOn
weekdayFormat
calendarLabel
fixedWeeks
maxValue
minValue
locale
numberOfMonths
disabled
readonly
hourCycle
granularity
hideTimeZone
initialFocus
monthFormat
yearFormat
children
Data Attribute Details
data-invalid
data-disabled
data-readonly
data-date-picker-root

DatePicker.Label

The label for the date field.

Property Details
ref
children
child
Data Attribute Details
data-invalid
data-disabled
data-date-field-label

DatePicker.Input

The field input component which contains the segments of the date field.

Property Details
ref
children
child
name
Data Attribute Details
data-invalid
data-disabled
data-date-field-input

DatePicker.Segment

A segment of the date field.

Property Details
part
ref
children
child
Data Attribute Details
data-invalid
data-disabled
data-readonly
data-segment
data-date-field-segment

DatePicker.Trigger

A component which toggles the opening and closing of the popover on press.

Property Details
ref
children
child
Data Attribute Details
data-state
data-popover-trigger

DatePicker.Content

The contents of the popover which are displayed when the popover is open.

Property Details
side
sideOffset
align
alignOffset
arrowPadding
avoidCollisions
collisionBoundary
collisionPadding
sticky
hideWhenDetached
updatePositionStrategy
strategy
preventScroll
customAnchor
onInteractOutside
onFocusOutside
interactOutsideBehavior
onEscapeKeydown
escapeKeydownBehavior
onOpenAutoFocus
onCloseAutoFocus
trapFocus
preventOverflowTextSelection
forceMount
dir
ref
children
child
Data Attribute Details
data-state
data-popover-content
CSS Variable Details
--bits-popover-content-transform-origin
--bits-popover-content-available-width
--bits-popover-content-available-height
--bits-popover-anchor-width
--bits-popover-anchor-height

DatePicker.Portal

When used, will render the popover content into the body or custom to element when open

Property Details
to
disabled
children
Data Attribute Details

DatePicker.Calendar

The calendar component containing the grids of dates.

Data Attribute Details
data-invalid
data-disabled
data-readonly
data-calendar-root

The header of the calendar.

Property Details
ref
children
child
Data Attribute Details
data-disabled
data-readonly
data-calendar-header

DatePicker.PrevButton

The previous button of the calendar.

Property Details
ref
children
child
Data Attribute Details
data-disabled
data-calendar-prev-button

DatePicker.Heading

The heading of the calendar.

Property Details
ref
children
child
Data Attribute Details
data-disabled
data-readonly
data-calendar-heading

DatePicker.NextButton

The next button of the calendar.

Property Details
ref
children
child
Data Attribute Details
data-disabled
data-calendar-next-button

DatePicker.Grid

The grid of dates in the calendar, typically representing a month.

Property Details
ref
children
child
Data Attribute Details
data-disabled
data-readonly
data-calendar-grid

DatePicker.GridRow

A row in the grid of dates in the calendar.

Property Details
ref
children
child
Data Attribute Details
data-disabled
data-readonly
data-calendar-grid-row

DatePicker.GridHead

The head of the grid of dates in the calendar.

Property Details
ref
children
child
Data Attribute Details
data-disabled
data-readonly
data-calendar-grid-head

DatePicker.HeadCell

A cell in the head of the grid of dates in the calendar.

Property Details
ref
children
child
Data Attribute Details
data-disabled
data-readonly
data-calendar-head-cell

DatePicker.GridBody

The body of the grid of dates in the calendar.

Property Details
ref
children
child
Data Attribute Details
data-disabled
data-readonly
data-calendar-grid-body

DatePicker.Cell

A cell in the calendar grid.

Property Details
date
month
ref
children
child
Data Attribute Details
data-disabled
data-unavailable
data-today
data-outside-month
data-outside-visible-months
data-focused
data-selected
data-value
data-calendar-cell

DatePicker.Day

A day in the calendar grid.

Property Details
ref
children
child
Data Attribute Details
data-disabled
data-unavailable
data-today
data-outside-month
data-outside-visible-months
data-focused
data-selected
data-value
data-calendar-day

DatePicker.MonthSelect

A select you can use to navigate to a specific month in the calendar view.

Property Details
months
monthFormat
ref
children
child
Data Attribute Details
data-disabled
data-calendar-month-select

DatePicker.YearSelect

A select you can use to navigate to a specific year in the calendar view.

Property Details
years
yearFormat
ref
children
child
Data Attribute Details
data-disabled
data-calendar-year-select