Pular para o conteúdo
// visualizar em
salvo em todas as páginas

Date range picker

Seletor de intervalo de datas — início e fim num só campo, digitadas ou escolhidas num calendário de intervalo. Use para hospedagens, férias, relatórios e tudo que dura mais de um dia.

Feito com React AriaPadrão WAI-ARIA Date Picker DialogComponente clienteCódigo ↗
minimal · light · #3fa34d

Aparece na página de status e nas respostas automáticas.

disabled
readOnly
invalid

Instalação

Configure o Camaleo uma vez (Instalação) e importe o que precisar. O valor é um objeto { start, end } com datas do @internationalized/date, reexportadas pela biblioteca. Coloque o seletor num Field para dar um rótulo a ele.

import { DateRangePicker, CalendarDate, isWeekend, Field, FieldLabel } from "@camaleo/react";

Anatomia

Dois campos de data unidos por um separador e um botão que abre um RangeCalendar num popup. O popup é renderizado num portal e mantém o estilo.

21/12/2026–31/12/2026botão
[data-slot="date-range-picker"] · [data-slot="date-picker-control"][data-slot="date-range-separator"] · [data-slot="date-picker-trigger"] · [data-slot="date-picker-popup"][data-slot="date-input"] · [data-slot="date-segment"]

Exemplos

Cada exemplo é um arquivo real que você pode copiar. Todos usam o estilo, o modo e a cor escolhidos na barra acima.

minimal · light · #3fa34d

Aparece na página de status e nas respostas automáticas.

5 diárias

Controlado, com a duração

Mude as datas. Contar as diárias abaixo do campo poupa a pessoa de fazer a conta de cabeça.

Até 14 dias seguidos.

Divida em dois pedidos de até 14 dias cada.

Intervalo máximo

Não há prop para duração máxima, então confira no onChange e use invalid no Field. O erro diz como corrigir.

De 24 a 26/11 está reservado. A estadia não pode passar por esses dias.

Datas reservadas

O isDateUnavailable risca os dias reservados, e o intervalo não pode passar por eles. Diga também na descrição quais datas estão ocupadas.

Fins de semana não contam, mas a sprint pode passar por eles.

Passando por fins de semana

Com allowsNonContiguousRanges, o intervalo pode atravessar dias indisponíveis, como os fins de semana de uma sprint, sem contar esses dias.

Separador próprio

O separator troca o traço, aqui por uma palavra. Ele fica escondido do leitor de tela, que chama os dois campos de data inicial e final.

Fechado em 01/11. Contestações para financeiro@padariapaodemel.com.br.

Somente leitura

O readOnly mostra um período fechado que ainda pode ser focado e lido. Diga onde reclamar se estiver errado.

Obrigatório num formulário

Envie vazio. startName e endName mandam duas datas ISO, e o erro some quando as duas são escolhidas.

Em contexto

Intervalos filtram, reservam e planejam. São pedaços inteiros de interface para copiar, no estilo que você escolheu.

Relatório de vendas

Dados até 28/10/2026.

Filtro de relatório com atalhosCard · Field · DateRangePicker · Button

Pousada Maré Alta, Paraty

R$ 450 por diária, com taxas

4 diárias · R$ 1.800

Reserva de hospedagemCard · Field · DateRangePicker · NumberField · Button

Pedir folga

Só os dias úteis são descontados do seu saldo.

Pedido de folgaCard · NativeSelect · Field · DateRangePicker · Textarea · Button

Boas práticas

FaçaUm campo para um intervalo.

O calendário mostra o período inteiro, e o fim não fica antes do início.

EviteDois seletores para uma hospedagem.

Nenhum calendário mostra o período, e a pessoa escolhe a segunda data sem ver a primeira.

10 dias úteis, volta na segunda, 25/01.

FaçaDiga quanto tempo dura.

"10 dias úteis, volta na segunda" confirma o intervalo em palavras.

EviteDeixar a pessoa contando.

Só as duas datas obrigam a contar os dias, e é fácil esquecer os fins de semana.

Props

O DateRangePicker recebe as props do date range picker do React Aria. Estas são as mais usadas:

PropriedadeTipoPadrãoDescrição
classNamestring—Classe do elemento raiz.
styleCSSProperties—Estilo inline do elemento raiz.
openboolean—Abre ou fecha o calendário, controlado. Use junto com onOpenChange.
disabledboolean—Desativa os dois campos e o botão do calendário.
readOnlybooleanfalseMostra o intervalo e deixa focável, mas não deixa mudar.
invalidboolean—Marca o seletor como inválido. Dentro de um Field, vale o invalid do campo quando esta prop não é passada.
requiredbooleanfalseMarca as duas datas como obrigatórias para as tecnologias assistivas.
localestring—O idioma que define a ordem dos segmentos, os nomes dos meses e o primeiro dia da semana, como "pt-BR". Usa o do navegador por padrão.
weekdayStyle"narrow" | "short" | "long""short"Como os dias da semana aparecem no calendário. O padrão é "short".
separatorReactNode"–"O que fica entre a data inicial e a final. Escondido do leitor de tela. O padrão é "–".
triggerLabelstring—Nome acessível do botão do calendário. O React Aria já traz um padrão traduzido.
previousLabelstring—Nome acessível do botão de mês anterior. O React Aria já traz um padrão traduzido.
nextLabelstring—Nome acessível do botão de próximo mês. O React Aria já traz um padrão traduzido.
calendarFooterReactNode—Conteúdo mostrado abaixo da grade do calendário, como uma legenda ou um aviso.
valueDateRange | null—O intervalo, controlado. null quando está vazio.
defaultValueDateRange | null—O intervalo inicial, não controlado.
onChange(value: DateRange | null) => void—Roda quando o intervalo muda, pelo teclado ou pelo calendário.
onOpenChange(isOpen: boolean) => void—Roda quando o calendário abre ou fecha.
minValueDateValue—A data mais cedo permitida.
maxValueDateValue—A data mais tarde permitida.
placeholderValueDateValue—A data usada para abrir o calendário e preencher os segmentos quando não há valor.
granularity"day" | "hour" | "minute" | "second"—A menor parte editável. "hour", "minute" e "second" adicionam a hora.
firstDayOfWeek"sun" | "mon" | "tue" | "wed" | "thu" | "fri" | "sat"—O primeiro dia da semana no calendário. Por padrão, segue o idioma.
allowsNonContiguousRangesboolean—Deixa o intervalo atravessar dias indisponíveis, como fins de semana.
isDateUnavailable(date: DateValue) => boolean—Devolve true para os dias que não podem ser escolhidos.
startNamestring—Identifica a data inicial no envio do formulário, no formato ISO.
endNamestring—Identifica a data final no envio do formulário, no formato ISO.

As outras props do React Aria passam direto, como defaultOpen, shouldCloseOnSelect, hourCycle, hideTimeZone, pageBehavior e autoFocus. Ao contrário do DatePicker, ele não pega o name do Field: use startName e endName.

Styling hooks

Mude o visual sem copiar o componente: use os atributos ou defina os tokens num elemento pai, num estilo ou no próprio seletor. O calendário do popup lê os tokens do RangeCalendar.

Atributos

data-slot"date-range-picker" · "date-picker-control" · "date-input" · "date-range-separator" · "date-picker-trigger" · "date-picker-popup"
data-openna raiz enquanto o calendário está aberto
data-invalidna raiz, no controle e nos segmentos quando inválido
data-disabledpresente quando desativado
data-focus-withinna raiz e no controle enquanto um segmento tem foco
data-placeholder · data-typenum segmento: ainda vazio · a parte dele (dia, mês, ano, literal…)

Tokens que ele lê

Cor

--cml-accent--cml-accent-fg--cml-border--cml-border-control--cml-danger--cml-fg--cml-fg-muted--cml-fg-secondary--cml-field-bg--cml-field-border-sides--cml-field-shadow--cml-focus-offset--cml-focus-ring--cml-focus-width--cml-popover-bg--cml-popover-border--cml-shadow-popover--cml-surface-raised

Forma e tamanho

--cml-border-width--cml-field-border-width--cml-field-height--cml-field-padding--cml-font-size-field--cml-popover-border-width--cml-radius-control--cml-radius-control-sm--cml-radius-field--cml-radius-popover

Tipografia e movimento

--cml-duration-fast--cml-ease-standard--cml-font-field

Só deste componente

--cml-corner-shape--cml-disabled-opacity--cml-item-highlight--cml-segment-focus-bg--cml-segment-focus-border--cml-segment-focus-fg--cml-segment-focus-shadow--cml-segment-radius
/* mais espaço em volta do separador, só nos filtros do relatório */
.filtros-relatorio [data-slot="date-range-separator"] {
  padding-inline: 0.5rem;
}

Acessibilidade

TabPassa pelos segmentos da data inicial, depois da final e depois pelo botão do calendário.
Seta para cima / Seta para baixoAumenta ou diminui o segmento focado.
Seta para a esquerda / Seta para a direitaVai para o segmento anterior ou o próximo, passando pelas duas datas.
0–9Digita no segmento e avança quando ele está completo.
Alt + Seta para baixoAbre o calendário a partir de um segmento.
Enter (calendário)Começa o intervalo no dia focado; um segundo Enter termina e fecha o calendário.
Setas (calendário)Andam entre os dias e estendem o intervalo enquanto ele está começado.
EscapeFecha o calendário e devolve o foco ao botão.

Relacionados

Esta página foi útil? · Editar esta página no GitHub