Feito sobre o UI SDK 0.1.0-beta.2 da Vercel. A API pode mudar.
Number input
Um campo numérico no UI SDK da Vercel com botões que repetem ao segurar, formatos de moeda, porcentagem e unidade em qualquer idioma, e uma alça para arrastar.
- Componentes de formulário
- 8 partes
- 13 exemplos
@tabler/icons-react@ui-sdk/core@ui-sdk/reactclass-variance-authority
pnpm dlx shadcn@latest add https://hextaui.com/r/ui-sdk-number-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 @tabler/icons-react class-variance-authority cnCopie e cole o código a seguir no seu projeto.
components/ui/ui-sdk-number-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 é um número, ou null quando o campo está vazio, e o campo o mostra formatado. Digitar atualiza o valor assim que o texto é um número válido. Enter ou sair do campo o confirma: o texto é lido, mantido entre min e max, ajustado ao passo e formatado de novo.
Um botão se desativa no seu limite. Um valor digitado fora dos limites é trazido de volta ao confirmar.
step é o incremento comum. Shift, Page Up e Page Down mudam em largeStep, e Alt ou Option com uma seta em smallStep. Segure um botão para repetir.
format recebe opções de Intl.NumberFormat. Dá para digitar no mesmo formato, e uma porcentagem é uma fração, então 15% é 0.15. O grupo variant="stacked" coloca setas pequenas no fim.
locale escolhe separadores, símbolos e agrupamento de dígitos, para exibir e para digitar. Sem ele, o campo segue o idioma da página quando fica interativo, e o servidor renderiza em inglês.
Arraste um NumberInputScrubArea para os lados para mudar o valor, como numa ferramenta de design. Onde o navegador permite travar o ponteiro, o arraste pode passar da borda da tela, e NumberInputScrubAreaCursor desenha o cursor.
Com wheel, rolar sobre o campo focado muda o valor. Fica desligado por padrão, então uma página que rola por cima do campo nunca o altera.
onValueChange roda a cada mudança válida, e onValueCommit quando uma interação termina, que é onde salvar. Um controlador muda ou define o valor a partir de qualquer botão.
Com um name, o número é enviado como está, como 1250, nunca formatado. required bloqueia um campo vazio, e redefinir o formulário volta ao padrão.
invalid marca o campo e define aria-invalid no input, para verificações próprias como estoque.
Um campo desativado não pode ser focado nem alterado, e não é enviado.
Um campo somente leitura pode ser focado e é enviado, mas botões, arraste e digitação não o alteram.
Os botões trocam de lado, e o idioma define os dígitos e a moeda.
| Tecla | Ação |
|---|---|
| ↑↓ | Muda o valor em step. |
| ShiftPageUpPageDown | Muda em largeStep, dez passos por padrão. Shift funciona com as setas, os botões, a roda e o arraste. |
| Alt | Com uma seta, muda em smallStep, um décimo de passo por padrão. |
| HomeEnd | Vai ao mínimo ou ao máximo, quando definidos. |
| Enter | Confirma e formata o que foi digitado. |
O campo segue o teclado do padrão spinbutton da WAI-ARIA em um input de texto nativo, então a edição de texto comum continua funcionando. Nomeie o input com um rótulo ou aria-label. Os botões se chamam “Increase” e “Decrease” por padrão, apontam para o input e ficam fora da ordem de tabulação porque as setas fazem o mesmo.
Um campo com decimais pede um teclado decimal nos celulares, e os botões crescem em telas de toque. Eles só encolhem ao toque 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.
| Prop | Tipo | Padrão |
|---|---|---|
value | number | null | – |
defaultValue | number | null | – |
onValueChange | (value: number | null, details) => void | – |
onValueCommitExecuta quando uma interação termina. Para salvar. | (value: number | null, details) => void | – |
min | number | – |
max | number | – |
step | number | 1 |
largeStep | number | step × 10 |
smallStep | number | step ÷ 10 |
format | Intl.NumberFormatOptions | – |
localePor padrão, o idioma da página. | string | – |
wheel | boolean | false |
invalid | boolean | false |
disabled | boolean | false |
readOnly | boolean | false |
required | boolean | false |
name | string | – |
form | string | – |
controllerDe createNumberInputController(). | NumberInputController | – |
| Atributo | Descrição |
|---|---|
data-slot="number-input" | Para mirar o campo numérico no CSS. |
data-scrubbing | Presente enquanto um arraste muda o valor. |
data-invalid | Presente quando inválido. |
data-disabled | Presente quando desabilitado. |
data-readonly | Presente quando somente leitura. |
data-required | Presente quando obrigatório. |
| Prop | Tipo | Padrão |
|---|---|---|
variantBotões dos dois lados, setas empilhadas no fim ou nenhum botão, para uma alça de arraste. | "split" | "stacked" | "plain" | "split" |
render | ReactElement | (props, state) => ReactElement | – |
| Atributo | Descrição |
|---|---|
data-slot="number-input-group" | Para mirar a caixa do campo no CSS. |
data-variant | A variante: split, stacked ou plain. |
| Prop | Tipo | Padrão |
|---|---|---|
id | string | – |
placeholder | string | – |
render | ReactElement | (props, state) => ReactElement | – |
| Prop | Tipo | Padrão |
|---|---|---|
aria-label | string | "Increase" |
disabledDesativa só este botão. | boolean | – |
childrenPor padrão, um sinal de mais, ou uma seta na variante stacked. | ReactNode | (state) => ReactNode | – |
render | ReactElement | (props, state) => ReactElement | – |
| Atributo | Descrição |
|---|---|
data-slot="number-input-increment" | Seleciona o botão no CSS. |
data-at-bound | Presente quando o valor está em max. |
data-disabled | Presente quando o botão não pode mudar o valor. |
| Prop | Tipo | Padrão |
|---|---|---|
aria-label | string | "Decrease" |
disabledDesativa só este botão. | boolean | – |
render | ReactElement | (props, state) => ReactElement | – |
| Atributo | Descrição |
|---|---|
data-slot="number-input-decrement" | Seleciona o botão no CSS. |
data-at-bound | Presente quando o valor está em min. |
Empilha o botão de aumentar sobre o de diminuir no fim de um grupo stacked.
| Prop | Tipo | Padrão |
|---|---|---|
orientationDireita e para cima aumentam o valor. | "horizontal" | "vertical" | "horizontal" |
pixelsPerStepQuanto o ponteiro se move para um passo. | number | – |
controllerConecta uma área de arraste fora do campo numérico, como um ícone numa barra de ferramentas. | NumberInputController | – |
| Atributo | Descrição |
|---|---|
data-slot="number-input-scrub-area" | Para mirar a área de arraste no CSS. |
data-orientation | horizontal ou vertical. |
data-scrubbing | Presente enquanto um arraste muda o valor. |
| Prop | Tipo | Padrão |
|---|---|---|
childrenPor padrão, uma seta horizontal centrada no ponteiro. | ReactNode | – |
- 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.