# P calendar 20

> 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-20).

- Page, with a live preview: https://shadcn.exchange/r/coss/p-calendar-20
- Screenshot: https://abzjhwgwpdpz7ua5.public.blob.vercel-storage.com/shots/coss/p-calendar-20-light-823e624e5f9febd0.png
- Registry item: https://coss.com/ui/r/p-calendar-20.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-20.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-20.tsx`

```tsx
"use client";

import { 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 = subDays(today, 1);
  const lastWeek = subDays(today, 7);
  const lastMonth = subMonths(today, 1);
  const lastYear = subYears(today, 1);
  const [month, setMonth] = useState(today);
  const [date, setDate] = useState<Date>(today);

  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(today);
              setMonth(today);
            }}
            size="sm"
            variant="ghost"
          >
            Today
          </Button>
          <Button
            className="w-full justify-start"
            onClick={() => {
              setDate(yesterday);
              setMonth(yesterday);
            }}
            size="sm"
            variant="ghost"
          >
            Yesterday
          </Button>
          <Button
            className="w-full justify-start"
            onClick={() => {
              setDate(lastWeek);
              setMonth(lastWeek);
            }}
            size="sm"
            variant="ghost"
          >
            Last week
          </Button>
          <Button
            className="w-full justify-start"
            onClick={() => {
              setDate(lastMonth);
              setMonth(lastMonth);
            }}
            size="sm"
            variant="ghost"
          >
            Last month
          </Button>
          <Button
            className="w-full justify-start"
            onClick={() => {
              setDate(lastYear);
              setMonth(lastYear);
            }}
            size="sm"
            variant="ghost"
          >
            Last year
          </Button>
        </div>
      </div>
      <Calendar
        className="max-sm:pb-3 sm:ps-5"
        disabled={[{ after: today }]}
        mode="single"
        month={month}
        onMonthChange={setMonth}
        onSelect={(newDate) => {
          if (newDate) {
            setDate(newDate);
          }
        }}
        selected={date}
      />
    </div>
  );
}
```
