Date Picker
A date input built by composing Calendar and Popover.
Usage
"use client"
import * as React from "react"
import { format } from "date-fns"
import { CalendarIcon } from "lucide-react"
import { Button } from "@/components/ui/button"
import { Calendar } from "@/components/ui/calendar"
import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover"
export function DatePicker() {
const [date, setDate] = React.useState<Date>()
return (
<Popover>
<PopoverTrigger asChild>
<Button
variant="outline"
data-empty={!date}
className="w-64 justify-start text-left font-normal data-[empty=true]:text-muted-foreground"
>
<CalendarIcon className="mr-2 size-4" />
{date ? format(date, "PPP") : <span>Pick a date</span>}
</Button>
</PopoverTrigger>
<PopoverContent className="w-auto p-0">
<Calendar mode="single" selected={date} onSelect={setDate} />
</PopoverContent>
</Popover>
)
}Examples
Date range
import type { DateRange } from "react-day-picker"
const [range, setRange] = React.useState<DateRange | undefined>()
<Popover>
<PopoverTrigger asChild>
<Button variant="outline" ...>
<CalendarIcon className="mr-2 size-4" />
{range?.from ? (
range.to
? `${format(range.from, "LLL dd, y")} – ${format(range.to, "LLL dd, y")}`
: format(range.from, "LLL dd, y")
) : "Pick a date range"}
</Button>
</PopoverTrigger>
<PopoverContent className="w-auto p-0" align="start">
<Calendar mode="range" selected={range} onSelect={setRange} numberOfMonths={2} />
</PopoverContent>
</Popover>With presets
<PopoverContent className="flex w-auto flex-col gap-2 p-2">
<div className="flex flex-col gap-1">
<Button variant="ghost" size="sm" className="justify-start" onClick={() => setDate(new Date())}>
Today
</Button>
<Button variant="ghost" size="sm" className="justify-start" onClick={() => setDate(addDays(new Date(), 1))}>
Tomorrow
</Button>
<Button variant="ghost" size="sm" className="justify-start" onClick={() => setDate(addDays(new Date(), 7))}>
In a week
</Button>
</div>
<div className="border-t pt-2">
<Calendar mode="single" selected={date} onSelect={setDate} />
</div>
</PopoverContent>Last updated on