Date Picker

Date Picker allows users to select a date from a calendar popover.

Source
Theme Source
pnpm dlx dreamy add date-picker

Date Picker provides a calendar interface for selecting dates. It can be used with either an input field or a button trigger.

The most common usage is with an input field that displays the selected date.

<DatePicker.Root>
    <DatePicker.Input />
    <DatePicker.PopoverContent>
        <DatePicker.Calendar />
    </DatePicker.PopoverContent>
</DatePicker.Root>

You can also use a button as the trigger instead of an input field.

<DatePicker.Root>
    <DatePicker.Trigger>Select Date</DatePicker.Trigger>
    <DatePicker.PopoverContent>
        <DatePicker.Calendar />
    </DatePicker.PopoverContent>
</DatePicker.Root>

You can control the date picker's value using the value and onChange props.

function ControlledDatePicker() {
    const [date, setDate] = useState<Date | null>(null);
 
    return (
        <DatePicker.Root
            value={date}
            onChange={setDate}
        >
            <DatePicker.Input />
            <DatePicker.PopoverContent>
                <DatePicker.Calendar />
            </DatePicker.PopoverContent>
        </DatePicker.Root>
    );
}

Set an initial date using the defaultValue prop.

<DatePicker.Root defaultValue={new Date()}>
    <DatePicker.Input />
    <DatePicker.PopoverContent>
        <DatePicker.Calendar />
    </DatePicker.PopoverContent>
</DatePicker.Root>

Use minDate and maxDate to restrict selectable dates.

<DatePicker.Root
    minDate={new Date(2024, 0, 1)}
    maxDate={new Date(2024, 11, 31)}
>
    <DatePicker.Input />
    <DatePicker.PopoverContent>
        <DatePicker.Calendar />
    </DatePicker.PopoverContent>
</DatePicker.Root>

Customize the date format displayed in the input using the dateFormat prop. The format uses dayjs format strings.

<DatePicker.Root dateFormat="DD/MM/YYYY">
    <DatePicker.Input />
    <DatePicker.PopoverContent>
        <DatePicker.Calendar />
    </DatePicker.PopoverContent>
</DatePicker.Root>

Set a custom placeholder text for the input field.

<DatePicker.Root placeholder="Choose your date">
    <DatePicker.Input />
    <DatePicker.PopoverContent>
        <DatePicker.Calendar />
    </DatePicker.PopoverContent>
</DatePicker.Root>

Enable the footer with Cancel and Apply buttons by setting showFooter to true. This is useful when you want users to confirm their selection before closing the popover.

function DatePickerWithFooter() {
    const [date, setDate] = useState<Date | null>(null);
 
    function handleApply() {
        console.log("Date applied:", date);
    }
 
    function handleCancel() {
        console.log("Date selection cancelled");
    }
 
    return (
        <DatePicker.Root
            value={date}
            onChange={setDate}
            showFooter
            onApply={handleApply}
            onCancel={handleCancel}
        >
            <DatePicker.Input />
            <DatePicker.PopoverContent>
                <DatePicker.Calendar />
                <DatePicker.Footer />
            </DatePicker.PopoverContent>
        </DatePicker.Root>
    );
}

Date Picker comes in three sizes: sm, md, and lg.

<VStack gap={8} w="full">
    <DatePicker.Root size="sm">
        <DatePicker.Input />
        <DatePicker.PopoverContent>
            <DatePicker.Calendar />
        </DatePicker.PopoverContent>
    </DatePicker.Root>
 
    <DatePicker.Root size="md">
        <DatePicker.Input />
        <DatePicker.PopoverContent>
            <DatePicker.Calendar />
        </DatePicker.PopoverContent>
    </DatePicker.Root>
 
    <DatePicker.Root size="lg">
        <DatePicker.Input />
        <DatePicker.PopoverContent>
            <DatePicker.Calendar />
        </DatePicker.PopoverContent>
    </DatePicker.Root>
</VStack>