- Docs
- components
- Calendar
Calendar
A calendar displays one or more date grids and allows users to select a single date.
Preview
Code
February 2025
Sun | Mon | Tue | Wed | Thu | Fri | Sat |
---|---|---|---|---|---|---|
26 | 27 | 28 | 29 | 30 | 31 | 1 |
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 1 |
Installation
CLI
Manual
Copy and paste the following code into your project.
"use client";
import { getLocalTimeZone, isToday } from "@internationalized/date";
import {
CalendarCell as CalendarCellPrimitive,
CalendarGridBody as CalendarGridBodyPrimitive,
CalendarGridHeader as CalendarGridHeaderPrimitive,
CalendarGrid as CalendarGridPrimitive,
CalendarHeaderCell as CalendarHeaderCellPrimitive,
Calendar as CalendarPrimitive,
type DateValue,
Heading,
} from "react-aria-components";
import { CalendarStyles } from "./styles";
export interface CalendarRootProps<T extends DateValue>
extends React.ComponentProps<typeof CalendarPrimitive<T>> {}
export const CalendarRoot = CalendarPrimitive;
export interface CalendarHeaderProps extends React.ComponentProps<"header"> {}
export function CalendarHeader({ className, ...props }: CalendarHeaderProps) {
return <header className={CalendarStyles.Header({ className })} {...props} />;
}
export interface CalendarMonthProps
extends React.ComponentProps<typeof Heading> {}
export function CalendarMonth({ className, ...props }: CalendarMonthProps) {
return (
<Heading {...props} className={CalendarStyles.Heading({ className })} />
);
}
export interface CalendarNavProps extends React.ComponentProps<"nav"> {}
export function CalendarNav({ className, ...props }: CalendarNavProps) {
return <nav {...props} className={CalendarStyles.Nav({ className })} />;
}
export interface CalendarGridProps
extends React.ComponentProps<typeof CalendarGridPrimitive> {}
export const CalendarGrid = CalendarGridPrimitive;
export interface CalendarGridHeaderProps
extends React.ComponentProps<typeof CalendarGridHeaderPrimitive> {}
export const CalendarGridHeader = CalendarGridHeaderPrimitive;
export interface CalendarHeaderCellProps
extends React.ComponentProps<typeof CalendarHeaderCellPrimitive> {}
export function CalendarHeaderCell({
className,
...props
}: CalendarHeaderCellProps) {
return (
<CalendarHeaderCellPrimitive
{...props}
className={CalendarStyles.HeaderCell({ className })}
/>
);
}
export interface CalendarGridBodyProps
extends React.ComponentProps<typeof CalendarGridBodyPrimitive> {}
export const CalendarGridBody = CalendarGridBodyPrimitive;
export interface CalendarCellProps
extends React.ComponentProps<typeof CalendarCellPrimitive> {}
export function CalendarCell({
className,
...props
}: React.ComponentProps<typeof CalendarCellPrimitive>) {
return (
<CalendarCellPrimitive
{...props}
className={(values) =>
CalendarStyles.Cell({
isToday: isToday(values.date, getLocalTimeZone()),
className:
typeof className === "function" ? className(values) : className,
})
}
/>
);
}
Update the import paths to match your project setup.
Usage
Single import
import { Button } from "~/components/ui/button";
import { Calendar } from "~/components/ui/calendar";
<Calendar.Root>
<Calendar.Header>
<Calendar.Nav>
<Button slot="previous"></Button>
<Calendar.Month />
<Button slot="next"></Button>
</Calendar.Nav>
</Calendar.Header>
<Calendar.Grid>
<Calendar.GridHeader>
{(weekDay) => <Calendar.HeaderCell>{weekDay}</Calendar.HeaderCell>}
</Calendar.GridHeader>
<Calendar.GridBody>
{(date) => <Calendar.Cell date={date} />}
</Calendar.GridBody>
</Calendar.Grid>
</Calendar.Root>
Multiple imports
import { Button } from "~/components/ui/button";
import {
CalendarCell,
CalendarGrid,
CalendarGridBody,
CalendarGridHeader,
CalendarHeader,
CalendarHeaderCell,
CalendarMonth,
CalendarNav,
CalendarRoot,
} from "~/components/ui/calendar";
<CalendarRoot>
<CalendarHeader>
<CalendarNav>
<Button slot="previous"></Button>
<CalendarMonth />
<Button slot="next"></Button>
</CalendarNav>
</CalendarHeader>
<CalendarGrid>
<CalendarGridHeader>
{(weekDay) => <CalendarHeaderCell>{weekDay}</CalendarHeaderCell>}
</CalendarGridHeader>
<CalendarGridBody>
{(date) => <CalendarCell date={date} />}
</CalendarGridBody>
</CalendarGrid>
</CalendarRoot>