Capítulo 32 de 108
Componente de calendário para seleção de uma data ou intervalo de datas, construído sobre React DayPicker; base para date pickers e agendamento.
"single" (uma data) ou "range" (intervalo, usa DateRange com from/to).mode="range" o selected é { from, to }."label" (padrão, texto estático) ou "dropdown" (dropdowns de mês/ano).Intl.DateTimeFormat().resolvedOptions().timeZone dentro de useEffect (nunca no render, para evitar mismatch de hidratação SSR).Date para bloquear datas específicas (ex: datas já reservadas).booked) e classes CSS associadas.[--cell-size:--spacing(10)]) e responsiva por breakpoint.enUS, arSA, he de react-day-picker/locale), usada junto com dir para RTL.react-day-picker por react-day-picker/persian dentro de calendar.tsx.const [date, setDate] = React.useState<Date | undefined>(new Date())
<Calendar
mode="single"
selected={date}
onSelect={setDate}
className="rounded-lg border"
captionLayout="dropdown"
/>
const [dateRange, setDateRange] = React.useState<DateRange | undefined>({
from: new Date(new Date().getFullYear(), 0, 12),
to: addDays(new Date(new Date().getFullYear(), 0, 12), 30),
})
<Calendar
mode="range"
defaultMonth={dateRange?.from}
selected={dateRange}
onSelect={setDateRange}
numberOfMonths={2}
/>
<Calendar
mode="single"
selected={date}
onSelect={setDate}
disabled={bookedDates}
modifiers={{ booked: bookedDates }}
modifiersClassNames={{ booked: "[&>button]:line-through opacity-100" }}
/>
disabled + modifiers.- import { DayPicker } from "react-day-picker"
+ import { DayPicker } from "react-day-picker/persian"
| Prop | Tipo/Valores | Uso |
|---|---|---|
| mode | "single" | "range" | modo de seleção |
| captionLayout | "label" | "dropdown" | layout do cabeçalho de mês/ano |
| timeZone | string (IANA) | fuso horário para exibição/seleção |
| numberOfMonths | number | meses exibidos lado a lado |
| showWeekNumber | boolean | mostra número da semana |
| fixedWeeks | boolean | grade com altura fixa |
| locale | Locale (react-day-picker) | localização de texto/formatos |
| dir | "ltr" | "rtl" | direção para RTL |
useEffect.timeZone do usuário.--cell-size é o principal hook de customização visual (tamanho de célula), responsivo via classes Tailwind arbitrárias.locale manualmente em vários pontos (Calendar, CalendarDayButton, formatters) — não é automático.disabled + modifiers/modifiersClassNames é o padrão para estados customizados de dia (reservado, feriado, etc.), não apenas para bloqueio simples.