Feito sobre o UI SDK 0.1.0-beta.2 da Vercel. A API pode mudar.
Date input
Um campo de data no UI SDK da Vercel digitado parte por parte na ordem do idioma, com hora opcional, mínimo e máximo, dias indisponíveis e um valor ISO.
- Componentes de formulário
- 3 partes
- 10 exemplos
@ui-sdk/core@ui-sdk/react
pnpm dlx shadcn@latest add https://hextaui.com/r/ui-sdk-date-input.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.2 @ui-sdk/core@0.1.0-beta.2 cnCopie e cole o código a seguir no seu projeto.
components/ui/ui-sdk-date-input.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.
Use um campo de data para datas que se sabem de cor, como um aniversário. O valor é uma data ISO como "2026-11-02", e continua null até que todas as partes tenham algo. Cada parte se preenche ao digitar e avança, o dia fica dentro do mês, e uma data inteira pode ser colada em qualquer parte. Para escolher num calendário, use o Date Picker.
O campo é um grupo, então nomeie-o com aria-labelledby ou aria-label. Clicar em qualquer ponto da caixa foca a parte mais próxima.
DateInput renderiza suas partes sozinho. Adicione DateInputSegments você mesmo para colocar um ícone ou outro conteúdo ao lado.
granularity com "hour", "minute" ou "second" adiciona a hora, e o valor vira data e hora locais como "2026-11-02T14:30".
Uma data antes de min ou depois de max marca o campo como inválido, e o formulário não é enviado.
unavailable recebe datas ISO, intervalos { from, to }, dias da semana ou uma função, e uma data que coincida é inválida.
locale define a ordem e os separadores. Os dígitos são sempre de 0 a 9 e o calendário é sempre gregoriano, então o valor significa a mesma data em todo lugar.
Um input oculto envia a data ISO sob name, aqui ao lado de um Time Input. required impede uma data vazia ou digitada pela metade, e redefinir traz de volta o padrão.
createDateInputController() define, limpa ou foca o campo de qualquer lugar. Foque uma parte pela unidade, como "year".
Um campo desativado é pulado pelo foco e não é enviado.
Um campo somente leitura recebe foco e é enviado, mas teclas e digitação não o alteram.
As partes mantêm a ordem do idioma, e as setas as seguem na tela.
| Tecla | Ação |
|---|---|
| 0–9 | Preenche a parte e passa para a próxima. |
| /. | Vai para a próxima parte. |
| ↑↓ | Muda a parte em um, dando a volta. Uma parte vazia começa em hoje. |
| PageUpPageDown | Muda mais: ano em 5, mês em 3, dia em 7. |
| HomeEnd | Vai ao primeiro ou último valor da parte. |
| ←→ | Vai para a parte anterior ou seguinte. |
| Backspace | Apaga o último dígito, depois esvazia a parte e então volta. |
| Enter | Envia o formulário com o que foi digitado. |
A raiz é um grupo. Cada parte é um spinbutton nomeado pela unidade, como “month”, com seu valor e intervalo, e uma parte vazia é lida como “Empty”. O texto entre as partes fica oculto para leitores de tela.
As partes são inputs reais, então os celulares mostram um teclado numérico e a digitação funciona antes do script da página rodar. Elas crescem para 16px em telas de toque para os celulares não darem zoom, e a parte focada fica destacada em vez de mostrar um cursor.
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.
| Prop | Tipo | Padrão |
|---|---|---|
value | string | null | – |
defaultValue | string | null | – |
onValueChangeExecuta quando todas as partes têm algo, e com null quando uma é esvaziada. | (value: string | null, details) => void | – |
granularity | "day" | "hour" | "minute" | "second" | "day" |
hourCyclePor padrão, o relógio do idioma. | 12 | 24 | – |
min | string | – |
max | string | – |
unavailableDatas ISO, intervalos { from, to }, { weekday } ou uma função. | DateMatchers | – |
localePor padrão, o idioma da página. | string | – |
invalid | boolean | false |
disabled | boolean | false |
readOnly | boolean | false |
required | boolean | false |
name | string | – |
form | string | – |
controllerDe createDateInputController(). | DateInputController | – |
childrenPor padrão, DateInputSegments. | ReactNode | (state) => ReactNode | – |
render | ReactElement | (props, state) => ReactElement | – |
| Atributo | Descrição |
|---|---|
data-slot="date-input" | Para mirar o campo de data no CSS. |
data-invalid | Presente quando a data está fora de min e max, indisponível, ou invalid está definido. |
data-empty | Presente enquanto todas as partes estão vazias. |
data-disabled | Presente quando desabilitado. |
data-readonly | Presente quando somente leitura. |
data-required | Presente quando obrigatório. |
Renderiza um DateInputSegment para cada parte, na ordem do idioma, com o texto entre elas.
| Prop | Tipo | Padrão |
|---|---|---|
segmentUm dos segments do estado da raiz. | DateInputSegmentData | – |
render | ReactElement | (props, state) => ReactElement | – |
| Atributo | Descrição |
|---|---|
data-slot="date-input-segment" | Para mirar uma parte no CSS. |
data-type | year, month, day, hour, minute, second, dayPeriod, ou literal para o texto entre as partes. |
data-empty | Presente enquanto a parte está vazia. |
- 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.
- InputUm campo de texto com três tamanhos, estados inválido e somente leitura, estilo de validação nativa e fonte de 16px no toque para que os celulares nunca façam zoom.