Feito sobre o UI SDK 0.1.0-beta.1 da Vercel. A API pode mudar.
Date picker
Um seletor de datas sobre o UI SDK da Vercel em que as pessoas digitam a data no próprio idioma ou a escolhem, com intervalos, predefinições e valores ISO.
- Componentes de formulário
- 18 partes
- 9 exemplos
@tabler/icons-react@ui-sdk/core@ui-sdk/react
pnpm dlx shadcn@latest add https://hextaui.com/r/ui-sdk-date-picker.jsonAdiciona o componente, os tokens de tema do HextaUI e quaisquer componentes do HextaUI dos quais ele depende.
Adicione os tokens de tema ao seu CSS global, se ainda não o fez.
Instale as dependências.
pnpm add @ui-sdk/react@0.1.0-beta.1 @ui-sdk/core@0.1.0-beta.1 @tabler/icons-react cnCopie e cole o código a seguir no seu projeto.
components/ui/ui-sdk-date-picker.tsx components/ui/button.tsx Atualize os caminhos de importação para corresponder à configuração do seu projeto.
O UI SDK adiciona um pouco de CSS próprio em uma camada de cascata chamada ui-sdk. Declare essa camada no topo da sua folha de estilos global, acima do import do Tailwind, para que suas classes vençam.
Os valores são strings de data ISO como 2026-11-20, sem hora nem fuso horário, então você não precisa de uma biblioteca de datas. As pessoas digitam na própria ordem de data, como 11/20/2026 ou 20.11.2026, e o campo formata a data ao pressionar Enter ou sair dele. DatePickerContent sem filhos renderiza um calendário estilizado.
Com mode="range", adicione um segundo input com end. O calendário fica aberto após a primeira data e fecha após a segunda. months={2} mostra dois meses lado a lado, empilhados em telas pequenas.
Um DatePickerPreset escolhe seu value e fecha o popup. Ele aparece pressionado enquanto seu valor está selecionado.
min, max e unavailable valem para digitar e escolher. Aqui fins de semana e dois feriados não podem ser escolhidos, e um digitado é marcado como inválido.
locale define o formato digitado, a dica e os nomes do calendário. Sem ele, o seletor lê o lang da página. Os botões têm nomes em inglês, então passe aria-label para traduzi-los.
Com um name, a data é enviada como string ISO. required bloqueia um envio vazio, texto que não é data também bloqueia, e reset volta para defaultValue.
Um controlador de createDatePickerController() define a data ou abre o calendário de qualquer lugar, e onValueChange informa cada mudança. Deixe value sem definir aqui, para que o calendário possa ir ao mês que o controlador escolhe.
disabled impede digitar e abrir. readOnly ainda abre o calendário para consulta, mas nada pode mudar.
Com uma localidade árabe dentro de dir=rtl, o campo, as setas e o calendário vão da direita.
| Tecla | Ação |
|---|---|
| Enter | No input, lê a data digitada. Em um dia, escolhe-o. |
| ←→↑↓ | Move entre dias, ou uma semana para cima e para baixo. |
| Page UpPage Down | Volta ou avança um mês. |
| HomeEnd | Move para o início ou o fim da semana. |
| Esc | Cancela um intervalo inacabado ou, senão, fecha o calendário. |
O calendário abre como um diálogo com uma grade de dias, cada um nomeado por completo, como “Friday, November 20, 2026”. A dica descreve o input, então leitores de tela ouvem o formato a digitar. Texto que não é data define aria-invalid e mantém o valor anterior, e dias indisponíveis continuam focáveis para que quem usa teclado ainda os ouça.
O gatilho, o popup e as setas têm nomes em inglês. Passe aria-label a cada um para traduzi-los. Os inputs usam fonte de 16px em telas sensíveis ao toque para o iOS não dar zoom, e o popup só entra com escala quando o movimento é permitido.
Cada parte envolve a parte do UI SDK de mesmo nome e aceita todas as suas props, incluindo render e um className que pode ser uma função do estado da parte. DatePickerControl, DatePickerSeparator e DatePickerCalendar são partes de layout do HextaUI.
| Prop | Tipo | Padrão |
|---|---|---|
mode | "single" | "range" | "single" |
value | string | [string, string] | null | – |
defaultValue | string | [string, string] | null | – |
onValueChange | (value, details) => void | – |
min | string | – |
max | string | – |
unavailableDatas ISO, { from, to }, { weekday }, { before }, { after } ou uma função. | DateMatchers | – |
months | number | 1 |
pageBy | "month" | "page" | "month" |
locale | string | – |
weekStartsOn | number | – |
minDays | number | – |
maxDays | number | – |
closeOnSelect | boolean | true |
disabled | boolean | false |
readOnly | boolean | false |
name | string | – |
startName | string | – |
endName | string | – |
required | boolean | false |
open | boolean | – |
onOpenChange | (open, details) => void | – |
controllerDe createDatePickerController(). | DatePickerController | – |
| Atributo | Descrição |
|---|---|
data-slot="date-picker" | Seleciona o seletor de datas no CSS. |
data-open | Presente enquanto aberto. |
data-invalid | Presente enquanto um input tem texto que não é uma data. |
data-disabled | Presente quando desabilitado. |
data-readonly | Presente quando somente leitura. |
| Prop | Tipo | Padrão |
|---|---|---|
endTorna-o o fim de um intervalo. | boolean | false |
| Prop | Tipo | Padrão |
|---|---|---|
childrenPor padrão, um ícone de calendário. | ReactNode | – |
aria-label | string | "Choose date" |
| Prop | Tipo | Padrão |
|---|---|---|
childrenPor padrão, um ícone X chamado Clear. Ele some enquanto não há nada para limpar. | ReactNode | – |
| Prop | Tipo | Padrão |
|---|---|---|
childrenPor padrão, um DatePickerCalendar. | ReactNode | – |
align | Align | "start" |
sideOffset | number | 6 |
collisionPadding | number | 8 |
| Atributo | Descrição |
|---|---|
data-slot="date-picker-content" | Para selecionar o popup no CSS. |
--cell-size | O tamanho de cada dia, maior em telas sensíveis ao toque. |
| Prop | Tipo | Padrão |
|---|---|---|
monthsQuantas grades mostrar, lado a lado. | number | 1 |
| Prop | Tipo | Padrão |
|---|---|---|
value | string | [string, string] | – |
render | ReactElement | (props, state) => ReactElement | – |
| Atributo | Descrição |
|---|---|
data-slot="calendar-day" | Seleciona um dia no CSS. |
data-today | Presente no dia de hoje. |
data-range-start | Presente onde um intervalo começa. |
data-range-end | Presente onde um intervalo termina. |
data-unavailable | Presente em um dia que não pode ser escolhido. |
data-outside | Presente em um dia do mês seguinte ou anterior. |
- ButtonBotões em todas as variantes e tamanhos, com um fluxo integrado de carregamento, sucesso e erro que dispensa o spinner em requisições rápidas.
- CalendarUma grade de datas para seleção única, de intervalo e múltipla, com meses deslizantes, prévias de intervalo e dias com tamanho adequado ao toque.
- CheckboxUma caixa de seleção cujo check é desenhado na tela, com pais indeterminados, grupos e rótulos que compartilham seu hover.
- ComboboxUm select filtrável com chips, grupos e resultados assíncronos, em um popup que se redimensiona conforme você digita.
- Date pickerUm botão que abre um calendário em um popover, ou em um bottom sheet no celular, para datas únicas e intervalos.
- FieldRótulos, descrições e erros ligados ao seu controle, com estados de validação e layouts para formulários.