quill
blockcalendar-rangesource: ok · hit
Calendar range picker
A stateful two-month range calendar for booking a span of days, with clear and reserve actions.
npx shadcn add "https://www.quilldesignsystem.com/r/calendar-range.json"free
Where it goes
statscalendar
Interaction
animated-counter
Tags auto-generated by rules on 9/24/2026 — empty means no evidence, not lack of support.
Dependencies
Bundle weight · lightreact-day-picker
Registry dependencies
cardcalendarbuttonbadge
Files1 · source cached 10/9/2026, 5:24:25 PM
registry/blocks/calendar-range.tsx
'use client'
import { useState } from 'react'
import type { DateRange } from 'react-day-picker'
import { Card, CardHeader, CardTitle, CardDescription, CardContent, CardFooter } from '@/components/ui/card'
import { Calendar } from '@/components/ui/calendar'
import { Button } from '@/components/ui/button'
import { Badge } from '@/components/ui/badge'
/** A stateful two-month range calendar for booking a span of days, with clear and reserve actions. */
export function CalendarRange() {
const [range, setRange] = useState<DateRange | undefined>({
from: new Date(2026, 6, 20),
to: new Date(2026, 6, 24),
})
return (
<Card className="w-fit">
<CardHeader>
<div className="flex items-center justify-between gap-4">
<CardTitle>Book a session</CardTitle>
<Badge variant="secondary">5 days selected</Badge>
</div>
<CardDescription>Pick the days you want with the product team.</CardDescription>
</CardHeader>
<CardContent>
<Calendar
mode="range"
numberOfMonths={2}
selected={range}
onSelect={setRange}
defaultMonth={new Date(2026, 6)}
className="rounded-lg border border-border"
/>
</CardContent>
<CardFooter className="justify-between">
<span className="text-sm text-muted-foreground">July 20 – 24, 2026</span>
<div className="flex gap-2">
<Button variant="ghost" size="sm">
Clear
</Button>
<Button size="sm">Reserve</Button>
</div>
</CardFooter>
</Card>
)
}