# P calendar 21

> Range calendar with date presets

A shadcn/ui block from the [@coss](https://coss.com/ui) registry, listed on [shadcn.exchange](https://shadcn.exchange/r/coss/p-calendar-21).

- Page, with a live preview: https://shadcn.exchange/r/coss/p-calendar-21
- Screenshot: https://abzjhwgwpdpz7ua5.public.blob.vercel-storage.com/shots/coss/p-calendar-21-light-62817b6a2e0ed3c7.png
- Registry item: https://coss.com/ui/r/p-calendar-21.json
- Categories: calendar, button
- Listed: 2026-10-13, source last changed 2026-10-13

## Install

```bash
npx shadcn@latest add https://coss.com/ui/r/p-calendar-21.json
```

Run it in a project that has shadcn/ui set up. It adds the files below and installs what they depend on.

## Dependencies

- npm packages: `date-fns`
- Registry items: `@coss/calendar`, `@coss/button`

## Files

### `registry/default/particles/p-calendar-21.tsx`

```tsx
"use client";

import type { DateRange } from "@daypicker/react";
import {
  endOfMonth,
  endOfYear,
  startOfMonth,
  startOfYear,
  subDays,
  subMonths,
  subYears,
} from "date-fns";
import { useState } from "react";
import { Button } from "@/registry/default/ui/button";
import { Calendar } from "@/registry/default/ui/calendar";

export default function Particle() {
  const today = new Date();
  const yesterday = {
    from: subDays(today, 1),
    to: subDays(today, 1),
  };
  const last7Days = {
    from: subDays(today, 6),
    to: today,
  };
  const last30Days = {
    from: subDays(today, 29),
    to: today,
  };
  const monthToDate = {
    from: startOfMonth(today),
    to: today,
  };
  const lastMonth = {
    from: startOfMonth(subMonths(today, 1)),
    to: endOfMonth(subMonths(today, 1)),
  };
  const yearToDate = {
    from: startOfYear(today),
    to: today,
  };
  const lastYear = {
    from: startOfYear(subYears(today, 1)),
    to: endOfYear(subYears(today, 1)),
  };
  const [month, setMonth] = useState(today);
  const [date, setDate] = useState<DateRange | undefined>(last7Days);

  return (
    <div className="flex max-sm:flex-col">
      <div className="relative py-1 ps-1 max-sm:order-1 max-sm:border-t">
        <div className="flex h-full flex-col sm:border-e sm:pe-3">
          <Button
            className="w-full justify-start"
            onClick={() => {
              setDate({
                from: today,
                to: today,
              });
              setMonth(today);
            }}
            size="sm"
            variant="ghost"
          >
            Today
          </Button>
          <Button
            className="w-full justify-start"
            onClick={() => {
              setDate(yesterday);
              setMonth(yesterday.to);
            }}
            size="sm"
            variant="ghost"
          >
            Yesterday
          </Button>
          <Button
            className="w-full justify-start"
            onClick={() => {
              setDate(last7Days);
              setMonth(last7Days.to);
            }}
            size="sm"
            variant="ghost"
          >
            Last 7 days
          </Button>
          <Button
            className="w-full justify-start"
            onClick={() => {
              setDate(last30Days);
              setMonth(last30Days.to);
            }}
            size="sm"
            variant="ghost"
          >
            Last 30 days
          </Button>
          <Button
            className="w-full justify-start"
            onClick={() => {
              setDate(monthToDate);
              setMonth(monthToDate.to);
            }}
            size="sm"
            variant="ghost"
          >
            Month to date
          </Button>
          <Button
            className="w-full justify-start"
            onClick={() => {
              setDate(lastMonth);
              setMonth(lastMonth.to);
            }}
            size="sm"
            variant="ghost"
          >
            Last month
          </Button>
          <Button
            className="w-full justify-start"
            onClick={() => {
              setDate(yearToDate);
              setMonth(yearToDate.to);
            }}
            size="sm"
            variant="ghost"
          >
            Year to date
          </Button>
          <Button
            className="w-full justify-start"
            onClick={() => {
              setDate(lastYear);
              setMonth(lastYear.to);
            }}
            size="sm"
            variant="ghost"
          >
            Last year
          </Button>
        </div>
      </div>
      <Calendar
        className="max-sm:pb-3 sm:ps-5"
        disabled={[{ after: today }]}
        mode="range"
        month={month}
        onMonthChange={setMonth}
        onSelect={(newDate) => {
          if (newDate) {
            setDate(newDate);
          }
        }}
        selected={date}
      />
    </div>
  );
}
```
