

<Demo name="calendar/demos/single" />

## Installation [#installation]

<CodeBlockTabs defaultValue="npm">
  <CodeBlockTabsList>
    <CodeBlockTabsTrigger value="npm">
      npm
    </CodeBlockTabsTrigger>

    <CodeBlockTabsTrigger value="pnpm">
      pnpm
    </CodeBlockTabsTrigger>

    <CodeBlockTabsTrigger value="yarn">
      yarn
    </CodeBlockTabsTrigger>

    <CodeBlockTabsTrigger value="bun">
      bun
    </CodeBlockTabsTrigger>
  </CodeBlockTabsList>

  <CodeBlockTab value="npm">
    ```bash
    npx shadcn@latest add @dotui/calendar
    ```
  </CodeBlockTab>

  <CodeBlockTab value="pnpm">
    ```bash
    pnpm dlx shadcn@latest add @dotui/calendar
    ```
  </CodeBlockTab>

  <CodeBlockTab value="yarn">
    ```bash
    yarn dlx shadcn@latest add @dotui/calendar
    ```
  </CodeBlockTab>

  <CodeBlockTab value="bun">
    ```bash
    bun x shadcn@latest add @dotui/calendar
    ```
  </CodeBlockTab>
</CodeBlockTabs>

## Usage [#usage]

Use `Calendar` to allow users to select a single date value.

```tsx
import { Calendar } from '@/components/ui/calendar'
```

```tsx
<Calendar aria-label="Date" />
```

Use `RangeCalendar` to let users select a contiguous range of dates.

```tsx
import { RangeCalendar } from '@/components/ui/calendar'
```

```tsx
<RangeCalendar aria-label="Date range" />
```

## Composition [#composition]

For full control, compose the calendar from its parts.

```tsx
import {
  CalendarHeader,
  CalendarGrid,
  CalendarGridHeader,
  CalendarHeaderCell,
  CalendarGridBody,
  CalendarCell,
} from '@/components/ui/calendar'
```

```tsx
<Calendar>
  <CalendarGrid>
    <CalendarHeader>
      <Button slot="previous"><ChevronLeftIcon /></Button>
      <CalendarHeading />
      <Button slot="next"><ChevronRightIcon /></Button>
    </CalendarHeader>
    <CalendarGridBody>
      <CalendarGridHeader>
      {day => <CalendarHeaderCell />}
    </CalendarGridHeader>
    <CalendarGridBody>
      {date => <CalendarCell date={date} />}
    </CalendarGridBody>
  </CalendarGrid>
</Calendar>
```

## Value [#value]

Calendar values use [`@internationalized/date`](https://react-spectrum.adobe.com/internationalized/date/) objects. Pass `defaultValue` for uncontrolled state, or `value` with `onChange` to control it.

```tsx
import { parseDate } from '@internationalized/date'
;<Calendar defaultValue={parseDate('2020-02-03')} />
```

```tsx
import { useState } from 'react'
import { parseDate } from '@internationalized/date'
import type { DateValue } from 'react-aria-components'

const [value, setValue] = useState<DateValue>(parseDate('2020-02-03'))

;<Calendar value={value} onChange={setValue} />
```

## Examples [#examples]

<Examples className="lg:grid-cols-2">
  <Example name="calendar/demos/range" title="Range" />

  <Example name="calendar/demos/disabled-example" title="Disabled" />

  <Example name="calendar/demos/range-multiple-months" title="Multiple months" className="lg:col-span-2" />

  <Example name="calendar/demos/invalid" title="Validation" />

  <Example name="calendar/demos/min-max" title="Min and max dates" />

  <Example name="calendar/demos/unavailable-weekends" title="Unavailable dates" />

  <Example name="calendar/demos/today-indicator" title="Today indicator" />

  <Example name="calendar/demos/short-weekdays" title="Short weekdays" />

  <Example name="calendar/demos/international" title="Internationalization (arabic)" />

  <Example name="calendar/demos/with-dropdowns" title="Month and year dropdowns" />

  <Example name="calendar/demos/with-presets" title="With presets" />

  <Example name="calendar/demos/custom-days" title="Custom days" className="lg:col-span-2" />

  <Example name="calendar/demos/scheduler" title="Scheduler" className="lg:col-span-2" />
</Examples>

## API Reference [#api-reference]

### Calendar [#calendar]

<Reference name="calendar" />

### RangeCalendar [#rangecalendar]

<Reference name="range-calendar" />

### CalendarHeader [#calendarheader]

<Reference name="calendar-header" />

### CalendarGrid [#calendargrid]

<Reference name="calendar-grid" />

### CalendarGridHeader [#calendargridheader]

<Reference name="calendar-grid-header" />

### CalendarHeaderCell [#calendarheadercell]

<Reference name="calendar-header-cell" />

### CalendarGridBody [#calendargridbody]

<Reference name="calendar-grid-body" />

### CalendarCell [#calendarcell]

<Reference name="calendar-cell" />
