Calendar
Grid de seleção de data construído sobre react-day-picker v10 - data única, várias datas ou um intervalo de datas, com tematização orientada por token e chevrons do lucide.
Visão geral
Calendar envolve o react-day-picker v10. Três modos via mode:
single- uma datarange- início + fim (intervalo de datas)multiple- várias datas independentes
Use Calendar standalone em páginas com bastante espaço (agendamento, planners). Para forms compactos, envolva-o em Popover - esse padrão composto é o DatePicker. Na v10 do react-day-picker as chaves de classNames foram migradas para o enum UI; nós chamamos getDefaultClassNames() e mesclamos nossos tokens semânticos por cima.
Preview
| Su | Mo | Tu | We | Th | Fr | Sa |
|---|---|---|---|---|---|---|
'use client';import { Calendar } from '@gremorie/rx-forms';import { useState } from 'react';export function CalendarPreview() { const [date, setDate] = useState<Date | undefined>(new Date()); return <Calendar mode="single" selected={date} onSelect={setDate} />;}Anatomia
Calendar self-contained DayPicker grid (caption + nav, weekday header, day buttons)Instalação
bash npx gremorie@latest add rx-calendar bash pnpm dlx gremorie@latest add rx-calendar bash yarn dlx gremorie@latest add rx-calendar bash bunx --bun gremorie@latest add rx-calendar Uso
import { Calendar } from "@gremorie/rx-forms";
export function Example() {
const [date, setDate] = React.useState<Date | undefined>(new Date());
return <Calendar mode="single" selected={date} onSelect={setDate} />;
}A edição Angular deste componente hoje é distribuída a partir do source (veja o side-by-side no workbench); sua entrada no registry vem a seguir.
API
<Calendar>
Encaminha toda prop para DayPicker do react-day-picker. As mais relevantes:
| Prop | Type | Default | Descrição |
|---|---|---|---|
mode | "single" | "multiple" | "range" | "single" | Modelo de seleção. |
selected | Date | Date[] | DateRange | - | Seleção controlada. O shape depende do mode. |
onSelect | depende do mode | - | Dispara quando o usuário escolhe uma data. |
disabled | Matcher | Matcher[] | - | Desabilita datas específicas (datas passadas, fins de semana, predicados customizados). |
showOutsideDays | boolean | true | Mostra dias esmaecidos de meses vizinhos. |
numberOfMonths | number | 1 | Mostra vários meses lado a lado (útil para seletores de intervalo). |
defaultMonth | Date | mês atual | Mês inicial exibido quando não controlado. |
locale | Locale | en-US | Locale do date-fns para labels de mês / dia da semana. |
autoFocus | boolean | false | Foca a primeira célula selecionada (ou a de hoje) no mount. Usado pelo DatePicker dentro de Popover. |
className | string | - | Classes no <div> wrapper. Padrão para p-3. |
classNames | Partial<ClassNames> | - | Sobrescreve qualquer classe interna. Mesclado nos defaults do Gremorie via cn. |
Para a lista completa de props, veja a documentação do react-day-picker.
O wrapper do Gremorie customiza:
button_previous/button_next- usambuttonVariants({ variant: "outline" })para que as setas combinem com o resto do design systemChevron- troca os chevrons padrão do react-day-picker pelosChevronLeftIcon/ChevronRightIcondo lucideselected- usa os tokens semânticosbg-primary text-primary-foregroundtoday- usabg-accent text-accent-foregroundoutside,disabled,hidden- todos orientados por token
Composição
<Calendar>é um widget autocontido. Coloque onde você precisa de um grid de data.- Para UI compacta, envolva-o em um
Popover+PopoverTrigger- essa composição é exportada comoDatePickerno bundle de overlays. - Para seletores de intervalo, defina
mode="range"enumberOfMonths={2}para que os usuários vejam o mês de início + fim de uma vez.
Variações
Data única
O modo padrão. O estado é Date | undefined.
function SingleDate() {
const [date, setDate] = React.useState<Date | undefined>(new Date());
return <Calendar mode="single" selected={date} onSelect={setDate} />;
}Intervalo de datas
O estado é { from?: Date; to?: Date }. Combine com numberOfMonths={2} para a UX clássica de calendário lado a lado.
import type { DateRange } from 'react-day-picker';
function DateRangeExample() {
const [range, setRange] = React.useState<DateRange | undefined>();
return (
<Calendar
mode="range"
selected={range}
onSelect={setRange}
numberOfMonths={2}
/>
);
}Desabilitar datas passadas
A prop disabled aceita um matcher. Use { before: today } para bloquear datas históricas.
<Calendar
mode="single"
selected={date}
onSelect={setDate}
disabled={{ before: new Date() }}
/>Várias datas independentes
mode="multiple" deixa os usuários selecionarem qualquer número de datas não contíguas. O estado é Date[].
function MultipleDates() {
const [dates, setDates] = React.useState<Date[] | undefined>();
return <Calendar mode="multiple" selected={dates} onSelect={setDates} />;
}Acessibilidade
- Semântica de grid: o react-day-picker renderiza um
role="grid"com linhas de células. Cada célula é um botão. - Teclado:
ArrowLeft/ArrowRightmovem um dia por vez.ArrowUp/ArrowDownmovem uma semana por vez.Home/Endpulam para o primeiro / último dia da linha.PageUp/PageDownmovem um mês;Shift+PageUp/Shift+PageDownmovem um ano.
- Anúncios de screen reader: a data em foco anuncia dia da semana, número do dia e mês. Dias desabilitados e de fora são anunciados como tal.
- Foco: quando envolvido em
Popover(o padrãoDatePicker), definaautoFocuspara que a data ativa receba foco ao abrir. - Reduced motion: o react-day-picker não tem movimento próprio; o calendário respeita as preferências de movimento do usuário automaticamente.
Relacionados
- Date Picker - a composição canônica Popover + Calendar
- Popover - o wrapper recomendado para UIs compactas
- Form - conecte o Calendar ao react-hook-form