Feito sobre o UI SDK 0.1.0-beta.2 da Vercel. A API pode mudar.
Time input
Um campo de hora no UI SDK da Vercel digitado parte por parte, em relógio de 12 ou 24 horas com segundos opcionais, mínimo e máximo, e um valor de 24 horas para formulários.
- 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-time-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-time-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.
O valor é uma hora de 24 horas como "14:30", igual à de um input de hora nativo, seja qual for o relógio que o campo mostra. Ele continua null até que todas as partes tenham algo. Cada parte é um input pequeno: digite números e ele avança, ou pressione A ou P para a metade do dia.
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.
TimeInput renderiza suas partes sozinho. Adicione TimeInputSegments você mesmo para colocar um ícone ou outro conteúdo ao lado.
O campo mostra o relógio do idioma. hourCycle escolhe 12 ou 24 horas, e granularity adiciona segundos ou mostra só a hora. Todos enviam valores de 24 horas.
Uma hora antes de min ou depois de max marca o campo como inválido, e o formulário não é enviado.
invalid marca o campo para verificações próprias, como um horário de término antes do início.
locale define a ordem, os separadores e os nomes da metade do dia. Sem ele, o campo segue o idioma da página quando fica interativo.
Um input oculto envia a hora sob name. required impede uma hora vazia ou digitada pela metade, e redefinir traz de volta o padrão.
createTimeInputController() define, limpa ou foca o campo de qualquer lugar. Foque uma parte pela unidade, como "minute".
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. |
| ↑↓ | Muda a parte em um, dando a volta. Uma parte vazia começa na hora atual. |
| PageUpPageDown | Muda mais, como 15 minutos. |
| 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. |
| AP | Escolhe AM ou PM num relógio de 12 horas. |
| Enter | Envia o formulário com o que foi digitado. |
A raiz é um grupo. Cada parte é um spinbutton nomeado pela unidade, como “hour”, 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 | – |
hourCyclePor padrão, o relógio do idioma. | 12 | 24 | – |
granularity | "hour" | "minute" | "second" | "minute" |
min | string | – |
max | string | – |
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 createTimeInputController(). | TimeInputController | – |
childrenPor padrão, TimeInputSegments. | ReactNode | (state) => ReactNode | – |
render | ReactElement | (props, state) => ReactElement | – |
| Atributo | Descrição |
|---|---|
data-slot="time-input" | Para mirar o campo de hora no CSS. |
data-invalid | Presente quando a hora está fora de min e max, ou quando 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 TimeInputSegment para cada parte, na ordem do idioma, com o texto entre elas.
| Prop | Tipo | Padrão |
|---|---|---|
segmentUm dos segments do estado da raiz. | TimeInputSegmentData | – |
render | ReactElement | (props, state) => ReactElement | – |
| Atributo | Descrição |
|---|---|
data-slot="time-input-segment" | Para mirar uma parte no CSS. |
data-type | 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.