Date Picker
A date picker component with calendar popup.
March 2026
| Su | Mo | Tu | We | Th | Fr | Sa |
|---|---|---|---|---|---|---|
start
center
end
#Installation
bunx --bun barefoot add date-picker#Usage
March 2026
| Su | Mo | Tu | We | Th | Fr | Sa |
|---|---|---|---|---|---|---|
1"use client"23import { createSignal } from '@barefootjs/dom'4import { DatePicker } from '@/components/ui/date-picker'56function DatePickerDemo() {7 const [date, setDate] = createSignal<Date | undefined>()89 return (10 <div className="flex flex-col gap-4">11 <DatePicker selected={date()} onSelect={setDate} />12 <p className="text-sm text-muted-foreground">13 {date()14 ? date()!.toLocaleDateString('en-US', {15 weekday: 'long', year: 'numeric',16 month: 'long', day: 'numeric',17 })18 : 'No date selected'}19 </p>20 </div>21 )22}#Examples
#Basic
March 2026
| Su | Mo | Tu | We | Th | Fr | Sa |
|---|---|---|---|---|---|---|
No date selected
1"use client"23import { createSignal } from '@barefootjs/dom'4import { DatePicker } from '@/components/ui/date-picker'56function DatePickerDemo() {7 const [date, setDate] = createSignal<Date | undefined>()89 return (10 <div className="flex flex-col gap-4">11 <DatePicker selected={date()} onSelect={setDate} />12 <p className="text-sm text-muted-foreground">13 {date()14 ? date()!.toLocaleDateString('en-US', {15 weekday: 'long', year: 'numeric',16 month: 'long', day: 'numeric',17 })18 : 'No date selected'}19 </p>20 </div>21 )22}#Form
March 2026
| Su | Mo | Tu | We | Th | Fr | Sa |
|---|---|---|---|---|---|---|
March 2026
| Su | Mo | Tu | We | Th | Fr | Sa |
|---|---|---|---|---|---|---|
1"use client"23import { createSignal, createMemo } from '@barefootjs/dom'4import { DatePicker } from '@/components/ui/date-picker'56function DatePickerForm() {7 const [startDate, setStartDate] = createSignal<Date | undefined>()8 const [endDate, setEndDate] = createSignal<Date | undefined>()910 const dayCount = createMemo(() => {11 const start = startDate()12 const end = endDate()13 if (!start || !end) return null14 const diff = Math.abs(end.getTime() - start.getTime())15 return Math.ceil(diff / (1000 * 60 * 60 * 24))16 })1718 return (19 <div className="flex flex-col gap-4">20 <div className="grid grid-cols-2 gap-4">21 <div className="space-y-2">22 <label className="text-sm font-medium">Start Date</label>23 <DatePicker24 selected={startDate()}25 onSelect={setStartDate}26 placeholder="Select start date"27 />28 </div>29 <div className="space-y-2">30 <label className="text-sm font-medium">End Date</label>31 <DatePicker32 selected={endDate()}33 onSelect={setEndDate}34 placeholder="Select end date"35 disabledDates={(d) => {36 const start = startDate()37 return start ? d.getTime() < start.getTime() : false38 }}39 />40 </div>41 </div>42 {dayCount() !== null && (43 <p className="text-sm text-muted-foreground">44 {dayCount()} days selected45 </p>46 )}47 </div>48 )49}#Date Range
March 2026
| Su | Mo | Tu | We | Th | Fr | Sa |
|---|---|---|---|---|---|---|
April 2026
| Su | Mo | Tu | We | Th | Fr | Sa |
|---|---|---|---|---|---|---|
No range selected
1"use client"23import { createSignal } from '@barefootjs/dom'4import { DateRangePicker, type DateRange } from '@/components/ui/date-picker'56function DateRangeDemo() {7 const [range, setRange] = createSignal<DateRange | undefined>()89 return (10 <DateRangePicker11 selected={range()}12 onSelect={setRange}13 numberOfMonths={2}14 />15 )16}#With Presets
March 2026
| Su | Mo | Tu | We | Th | Fr | Sa |
|---|---|---|---|---|---|---|
1"use client"23import { createSignal } from '@barefootjs/dom'4import { DatePicker } from '@/components/ui/date-picker'56function DatePickerWithPresets() {7 const [date, setDate] = createSignal<Date | undefined>()89 const addDays = (days: number): Date => {10 const result = new Date()11 result.setDate(result.getDate() + days)12 return result13 }1415 const presets = [16 { label: 'Today', value: new Date() },17 { label: 'Tomorrow', value: addDays(1) },18 { label: 'In a week', value: addDays(7) },19 ]2021 return (22 <div className="flex flex-col gap-4">23 <div className="flex flex-wrap gap-2">24 {presets.map(preset => (25 <button26 className="rounded-md border px-3 py-1.5 text-sm hover:bg-accent"27 onClick={() => setDate(preset.value)}28 >29 {preset.label}30 </button>31 ))}32 </div>33 <DatePicker34 selected={date()}35 onSelect={setDate}36 formatDate={(d) => d.toLocaleDateString('en-US', {37 month: 'short', day: 'numeric', year: 'numeric',38 })}39 />40 </div>41 )42}#API Reference
DatePicker
| Prop | Type | Default | Description |
|---|---|---|---|
| selected | Date | undefined | - | Currently selected date. |
| onSelect | (date: Date | undefined) => void | - | Callback when date selection changes. |
| formatDate | (date: Date) => string | Intl.DateTimeFormat | Custom date formatter function. |
| placeholder | string | "Pick a date" | Placeholder text when no date is selected. |
| disabled | boolean | false | Whether the picker is disabled. |
| disabledDates | (date: Date) => boolean | - | Function to disable specific dates in the calendar. |
| align | 'start' | 'center' | 'end' | 'start' | Alignment of the popover relative to the trigger. |
| triggerClassName | string | - | Additional CSS classes for the trigger button. |
DateRangePicker
| Prop | Type | Default | Description |
|---|---|---|---|
| selected | DateRange | undefined | - | Currently selected date range ({ from: Date; to?: Date }). |
| onSelect | (range: DateRange | undefined) => void | - | Callback when range selection changes. |
| formatDate | (date: Date) => string | Intl.DateTimeFormat | Custom date formatter function. |
| placeholder | string | "Pick a date range" | Placeholder text when no range is selected. |
| disabled | boolean | false | Whether the picker is disabled. |
| disabledDates | (date: Date) => boolean | - | Function to disable specific dates in the calendar. |
| align | 'start' | 'center' | 'end' | 'start' | Alignment of the popover relative to the trigger. |
| numberOfMonths | number | 2 | Number of months to display side by side. |
| triggerClassName | string | - | Additional CSS classes for the trigger button. |