vaiperui

componentes / date-range-picker

DateRangePicker

Campo que abre um Calendar para escolher início e fim, com atalhos prontos.

Como usar

Mostra `início – fim` e abre um `Calendar` em modo intervalo; o painel fecha após o segundo clique. `onValueChange` roda duas vezes por intervalo: primeiro só com `from`, depois com `from` e `to`. `presets` adiciona uma coluna de atalhos (Hoje, Últimos 7 dias...) que define o intervalo todo; passe `true` para os padrões ou sua própria lista, a partir de `getDatePresets()`.

preview
DateRangePicker.tsx
import { DateRangePicker, getDatePresets } from "vaiperui";
const [period, setPeriod] = useState<DateRange>({});
<DateRangePicker label="Hospedagem" presets value={period} onValueChange={setPeriod} />
// Custom list, translated labels
<DateRangePicker presets={[
...getDatePresets({ today: "Hoje" }).slice(0, 3),
{ label: "Q4", range: { from: new Date(2026, 9, 1), to: new Date(2026, 11, 31) } },
]} />

Atalhos

`presets` adiciona uma coluna de atalhos. `true` usa os padrões; passe uma lista para os seus.

preview
presets
no presets
atalhos.tsx
<DateRangePicker presets />
<DateRangePicker presets={[{ label: "Q4", range: { from, to } }]} />

Tamanhos

preview
sm
md
lg
tamanhos.tsx
<DateRangePicker size="sm" />
<DateRangePicker size="md" />
<DateRangePicker size="lg" />

Estados

preview
Detalhe extra
ajuda
Isto é obrigatório
erro
desabilitado
somente leitura
estados.tsx
<DateRangePicker label="..." helperText="..." />
<DateRangePicker label="..." errorMessage="..." />
<DateRangePicker label="..." disabled />
<DateRangePicker label="..." readOnly />

Props

PropValoresPadrãoDescrição
value / defaultValue{ from?: Date; to?: Date }nenhumIntervalo, controlado ou inicial. Sem `to`, só o início foi escolhido
onValueChange(range: DateRange) => voidnenhumChamado a cada clique
presetsboolean | { label: string; range: { from: Date; to: Date } }[]nenhumColuna de atalhos; true usa getDatePresets(). Atalhos fora de minDate/maxDate ficam desabilitados
presetLabels{ today, last7Days, last30Days, thisMonth, lastMonth }nenhumTraduz os atalhos padrão (presets={true})
fromName / toNamestringnenhumNomes dos campos de início e fim; cada um envia yyyy-mm-dd
label / helperTextstringnenhumRótulo acima do campo e texto de ajuda abaixo
errorMessagestringnenhumTexto de erro; só a presença dele já força o estado de erro
placeholderstringdo idiomaTexto quando nada foi escolhido (ex.: dd/mm/aaaa)
disabled / readOnlybooleanfalseNão abre o painel; readOnly ainda mostra o valor
variantring | outlineringEstilo de foco, igual ao Input
size / radiussm | md | lg / none | sm | md | lg | fullmd / mdAltura do campo e arredondamento dos cantos
aria-labelstringnenhumNome acessível quando não há rótulo
panelLabelstringnenhumNome acessível do painel aberto
minDate / maxDateDatenenhumPrimeiro e último dia permitidos; o resto e as setas de mês que levam para fora ficam desabilitados
localestring"en-US"Idioma dos nomes de mês/dia e formato da data (BCP 47)
weekStartsOn0 – 60Primeiro dia da semana (0 = domingo)
previousMonthLabel / nextMonthLabelstring"Previous month" / "Next month"Nomes acessíveis dos botões de mês
variantColor / customColor / animationprimary | success | warning | danger / CSS color / none | smooth | fast | bounceprimary / smoothCor da seleção e do foco, e velocidade da transição

Acessibilidade

  • O gatilho é um `<button>` com `aria-haspopup="dialog"` e `aria-expanded` refletindo o estado do painel.
  • O `label` é ligado por `htmlFor`; sem `label`, o gatilho usa `aria-label`.
  • `errorMessage` define `aria-invalid` e `aria-describedby` apontando para a mensagem; sem erro, o `helperText` é ligado por `aria-describedby`.
  • O painel é um `role="dialog"` nomeado por `panelLabel`, renderizado em um portal no `document.body`.
  • `disabled` desabilita o botão; `readOnly` mantém o foco possível, mas o painel nunca abre.
  • O texto do gatilho aparece como `início – fim`; enquanto só o início foi escolhido, mostra `início – …`.
  • Os presets são `<button>`s com `aria-pressed` quando coincidem com o intervalo atual e `disabled` quando ficam fora de `minDate`/`maxDate`.
  • Ao abrir, o foco vai para um dia no `Calendar` de intervalo, que segue o padrão de grade.

Teclado

TeclaAção
Enter / SpaceAbre ou fecha o painel a partir do gatilho.
Arrow keys, Home, End, Page Up/DownNavegam pelos dias dentro do painel aberto (veja Calendar); Enter ou Espaço escolhe o início e depois o fim, que fecha o painel.
EscFecha o painel e devolve o foco ao gatilho.

Tenha em mente

  • O painel não prende o foco: o Tab sai dele e, como ele é renderizado no fim do `<body>`, o Tab a partir do gatilho não entra nele sozinho.
  • Clicar fora fecha o painel sem devolver o foco; só o Esc restaura o foco no gatilho.
  • Passe `presetLabels` (ou seus próprios `presets`) traduzidos ao usar presets; os padrões estão em inglês. As datas não podem ser digitadas.