Skip to main content

DatePicker

The DatePicker component provides a flexible date selection interface with multiple variants and themes.

Import

import { DatePicker } from '@dreamstack-us/kaal';

Props

Selection Mode

The DatePicker supports two selection modes: single date and range selection.

selectionMode

Type: 'single' | 'range' Default: 'single'

Determines whether the picker selects a single date or a date range.

Single Selection (Default)

value

Type: Date Required: Yes (when selectionMode is 'single')

The currently selected date.

const [date, setDate] = useState(new Date());
<DatePicker value={date} onChange={setDate} />

onChange

Type: (date: Date) => void Required: Yes (when selectionMode is 'single')

Callback fired when the selected date changes.

Range Selection

startDate

Type: Date | null Required: Yes (when selectionMode is 'range')

The start date of the selected range.

endDate

Type: Date | null Required: Yes (when selectionMode is 'range')

The end date of the selected range.

onRangeChange

Type: (range: { startDate: Date; endDate: Date | null }) => void Required: Yes (when selectionMode is 'range')

Callback fired when the range selection changes.

const [range, setRange] = useState({
startDate: new Date(),
endDate: null,
});

<DatePicker
selectionMode="range"
startDate={range.startDate}
endDate={range.endDate}
onRangeChange={setRange}
/>

Common Props

theme

Type: 'native' | 'ios' | 'android' | 'custom' Default: 'native'

The visual theme for the picker.

  • native - Uses platform-specific native picker (UIDatePicker on iOS, MaterialDatePicker on Android)
  • ios - iOS-style wheel picker on all platforms
  • android - Android-style picker on all platforms
  • custom - Custom styling (requires Unistyles theme)

variant

Type: 'wheel' | 'calendar' | 'compact' Default: 'calendar'

The picker variant to display.

  • wheel - Spinning wheel picker (iOS style)
  • calendar - Full month calendar grid
  • compact - Minimal date input
<DatePicker
value={date}
onChange={setDate}
variant="wheel"
/>

minDate

Type: Date Default: undefined

The minimum selectable date.

<DatePicker
value={date}
onChange={setDate}
minDate={new Date('2024-01-01')}
/>

maxDate

Type: Date Default: undefined

The maximum selectable date.

<DatePicker
value={date}
onChange={setDate}
maxDate={new Date('2025-12-31')}
/>

disabledDates

Type: Date[] Default: []

An array of dates that cannot be selected.

const holidays = [
new Date('2024-12-25'),
new Date('2024-12-26'),
];

<DatePicker
value={date}
onChange={setDate}
disabledDates={holidays}
/>

locale

Type: string Default: 'en-US'

The locale to use for formatting. Accepts any valid Unicode locale identifier.

<DatePicker
value={date}
onChange={setDate}
locale="de-DE"
/>

weekStartsOn

Type: 0 | 1 Default: 0

The first day of the week. 0 = Sunday, 1 = Monday.

// Calendar starts on Monday
<DatePicker
value={date}
onChange={setDate}
weekStartsOn={1}
/>
note

This is a temporary solution for week start configuration. Full locale support with automatic detection of week start day, localized day/month names, and RTL support is planned for a future release.

themeOverrides

Type: DatePickerThemeOverrides Default: undefined

Custom theme overrides for styling the DatePicker without using a theme provider. This is the recommended approach for web apps and when you want to integrate with your existing design system.

<DatePicker
value={date}
onChange={setDate}
themeOverrides={{
primaryColor: '#22d3ee',
cellSelectedColor: '#22d3ee',
cellTodayColor: 'rgba(34, 211, 238, 0.2)',
textColor: '#FFFFFF',
textSelectedColor: '#FFFFFF',
textDisabledColor: '#6b7280',
textWeekendColor: '#9ca3af',
backgroundColor: '#1f2937',
borderRadius: 16,
}}
/>

DatePickerThemeOverrides Properties

PropertyTypeDescription
primaryColorstringPrimary accent color for navigation and highlights
cellSelectedColorstringBackground color of the selected date cell
cellTodayColorstringBackground color of today's date cell
cellInRangeColorstringBackground color for dates within the selected range
cellBorderRadiusnumberBorder radius for date cells
textColorstringDefault text color for dates
textSelectedColorstringText color for the selected date
textDisabledColorstringText color for disabled dates
textWeekendColorstringText color for weekend dates
textInRangeColorstringText color for dates within the selected range
backgroundColorstringContainer background color
headerBackgroundstringHeader/navigation background color
borderRadiusnumberBorder radius for the calendar container
paddingnumberPadding for the calendar container

Examples

Basic Calendar

import { DatePicker } from '@dreamstack-us/kaal';
import { useState } from 'react';

function BasicCalendar() {
const [date, setDate] = useState(new Date());

return (
<DatePicker
value={date}
onChange={setDate}
theme="native"
variant="calendar"
/>
);
}

Wheel Picker with Date Range

import { DatePicker } from '@dreamstack-us/kaal';
import { useState } from 'react';

function WheelPickerWithRange() {
const [date, setDate] = useState(new Date());

return (
<DatePicker
value={date}
onChange={setDate}
theme="ios"
variant="wheel"
minDate={new Date('2024-01-01')}
maxDate={new Date('2024-12-31')}
/>
);
}

TypeScript

import type {
DatePickerProps,
DatePickerThemeOverrides,
DatePickerDateRange,
DatePickerSelectionMode,
} from '@dreamstack-us/kaal';

// DateRange type
type DateRange = {
startDate: Date;
endDate: Date | null;
};

// DatePickerProps is a union type supporting both modes:
// - Single selection: value, onChange
// - Range selection: selectionMode="range", startDate, endDate, onRangeChange

// Single selection example
const SinglePicker: React.FC = () => {
const [date, setDate] = useState(new Date());
return <DatePicker value={date} onChange={setDate} />;
};

// Range selection example
const RangePicker: React.FC = () => {
const [range, setRange] = useState<DateRange>({
startDate: new Date(),
endDate: null,
});
return (
<DatePicker
selectionMode="range"
startDate={range.startDate}
endDate={range.endDate}
onRangeChange={setRange}
/>
);
};

// DatePickerThemeOverrides interface
interface DatePickerThemeOverrides {
primaryColor?: string;
cellSelectedColor?: string;
cellTodayColor?: string;
cellInRangeColor?: string;
cellBorderRadius?: number;
textColor?: string;
textSelectedColor?: string;
textDisabledColor?: string;
textWeekendColor?: string;
textInRangeColor?: string;
backgroundColor?: string;
headerBackground?: string;
borderRadius?: number;
padding?: number;
}