Calendar
The macOS graphical date picker: today in red, the chosen day on an accent circle.
@cupertinoui/calendarRegistry JSON "use client"
import * as React from "react"
import { Calendar } from "@/components/ui/calendar"
export default function CalendarDemo() {
const [date, setDate] = React.useState<Date | undefined>(new Date(2026, 9, 27))
return (
<Calendar
mode="single"
selected={date}
onSelect={setDate}
defaultMonth={new Date(2026, 9, 1)}
className="rounded-[14px] shadow-[0_0_0_1px_var(--mac-grid)]"
/>
)
}Installation
pnpm dlx shadcn@latest add @cupertinoui/calendarThe first install also adds the macOS theme. See Installation to set up the registry.
Usage
import { Calendar } from "@/components/ui/calendar"
const [date, setDate] = React.useState<Date | undefined>(new Date())
<Calendar mode="single" selected={date} onSelect={setDate} />Built on react-day-picker, so every DayPicker prop works: single, multiple or range mode, disabled days, several months and locales.
Examples
Date Picker
A pop-up button that opens the calendar in a popover.
"use client"
import * as React from "react"
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"
// A date picker: a pop-up button that opens the calendar in a popover.
export default function CalendarDatePicker() {
const [date, setDate] = React.useState<Date | undefined>(new Date(2026, 9, 27))
const [open, setOpen] = React.useState(false)
return (
<Popover open={open} onOpenChange={setOpen}>
<PopoverTrigger render={<Button variant="secondary" className="w-48 justify-between" />}>
{date ? date.toLocaleDateString("en-GB", { day: "numeric", month: "long", year: "numeric" }) : "Choose a date"}
<CalendarIcon className="text-mac-label-secondary" />
</PopoverTrigger>
<PopoverContent className="w-auto p-0" align="start">
<Calendar
mode="single"
selected={date}
defaultMonth={date}
onSelect={(next) => {
setDate(next)
setOpen(false)
}}
className="bg-transparent"
/>
</PopoverContent>
</Popover>
)
}Range
Two months and a range of days.
"use client"
import * as React from "react"
import type { DateRange } from "react-day-picker"
import { Calendar } from "@/components/ui/calendar"
export default function CalendarRange() {
const [range, setRange] = React.useState<DateRange | undefined>({ from: new Date(2026, 9, 20), to: new Date(2026, 9, 24) })
return (
<Calendar
mode="range"
numberOfMonths={2}
selected={range}
onSelect={setRange}
defaultMonth={new Date(2026, 9, 1)}
className="rounded-[14px] shadow-[0_0_0_1px_var(--mac-grid)]"
/>
)
}API Reference
Every part forwards the props of the underlying element. The props below are the ones CupertinoUI adds or changes.
Calendar
| Prop | Type | Description |
|---|---|---|
mode | "single" | "multiple" | "range" | What can be chosen. |
selected / onSelect | | The chosen date(s). |
buttonVariant | Button variantDefault: "ghost" | The style of the month arrows. |
className | string | Extra classes, merged with the component's own. |