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

Number field

Campo numérico com botões de menos e mais. Mantém o valor dentro dos limites, avança pelo teclado e formata como moeda, porcentagem ou unidade.

Feito com Base UIPadrão WAI-ARIA Spinbutton (keyboard)Componente clienteCódigo ↗
minimal · light · #3fa34d
disabled
readOnly

Instalação

Configure o Camaleo uma vez (Instalação) e importe o que precisar. Coloque dentro de um Field para ganhar um rótulo.

import { NumberField, Field, FieldLabel } from "@camaleo/react";

Anatomia

Uma caixa com três partes: o botão de menos, o input e o botão de mais.

−2+
[data-slot="number-field"] · [data-slot="number-field-group"][data-slot="number-field-button"][data-slot="number-field-input"]

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

Até 4 ingressos por pedido.

Mínimo e máximo

Clique no mais até parar. No max o botão se desativa, e a descrição explica o motivo antes de a pessoa chegar lá.

5 × R$ 24,00 = R$ 120,00 por mês

Total ao vivo

Mude as licenças. value e onValueChange atualizam o preço abaixo, anunciado com aria-live.

Até 50%. Shift + seta pula 25 pontos.

Porcentagem, com passos

O format={{ style: "percent" }} trabalha com frações, então step={0.05} são 5 pontos; o largeStep é o que Shift + seta soma.

Moeda

Passe format e locale e o campo mostra o R$ e os separadores que a pessoa espera, enquanto o valor continua um número.

Com unidade

Um formato unit coloca o "kg" dentro do campo, então o rótulo não precisa dizer e ninguém pensa em libras.

Obrigatório

Digite um número, apague e saia. Dentro de um Field, required e FieldError match="valueMissing" funcionam como em qualquer input.

Botões com nome

Os botões só mostram − e +. O decrementLabel e o incrementLabel dão nome a eles, então traduza junto com a página.

Em contexto

São pedaços inteiros de interface para copiar, no estilo que você escolheu.

Seu carrinho

R$ 59,90

R$ 42,00

SubtotalR$ 161,80

Carrinho de comprasCard · Field · NumberField · Button

Reserve sua estadia

Chalé na serra · 31/10 a 03/11

De 2 a 12 anos

ReservaCard · Field · NumberField · Button
Pacote
Tamanho do pacoteFieldset · Field · NumberField · NativeSelect

Boas práticas

FaçaQuantidades pequenas que a pessoa ajusta.

Hóspedes, ingressos, licenças: um clique ou uma seta chega lá mais rápido do que digitar.

EviteCódigos que são só dígitos.

CEP, telefone e número de cartão não são quantidades: os botões e os separadores estragam o valor. Use um Input com inputMode="numeric".

FaçaMostre a unidade no valor.

"45 min" não deixa dúvida.

EviteUm número solto.

45 são minutos, horas ou pessoas? Não faça a pessoa adivinhar.

Props

PropriedadeTipoPadrãoDescrição
placeholderstring—Dica mostrada no input vazio. Não substitui o rótulo.
decrementLabelstring"Decrease"Nome acessível do botão de menos. Traduza junto com a página.
incrementLabelstring"Increase"Nome acessível do botão de mais. Traduza junto com a página.
minnumber—O menor valor permitido.
maxnumber—O maior valor permitido.
stepnumber | "any"1Quanto os botões e as setas somam ou subtraem.
largeStepnumber10Quanto Shift + seta e Page Up / Page Down somam ou subtraem.
requiredbooleanfalseExige um valor no envio do formulário.
disabledbooleanfalseDesativa o campo e os botões.
readOnlybooleanfalseMostra o valor sem deixar mudar.
namestring—Identifica o valor no envio do formulário.
valuenumber | null—O valor, controlado. null quando o campo está vazio.
defaultValuenumber—O valor inicial, não controlado.
formatIntl.NumberFormatOptions—Opções do Intl.NumberFormat: moeda, porcentagem, unidade, casas decimais.
onValueChange(value: number | null, details) => void—Roda a cada mudança de valor, por digitação, botões ou teclado.
localeIntl.LocalesArgument—O idioma usado na formatação, como "pt-BR".

As outras props da raiz do Base UI passam direto, como smallStep, snapOnStep, allowWheelScrub e onValueCommitted.

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 campo.

Atributos

data-slot"number-field" · "number-field-group" · "number-field-input" · "number-field-button"
data-disabledna raiz quando desativado, num botão quando chega ao limite
data-readonlypresente quando só leitura
data-invalidpresente quando inválido
data-scrubbingpresente enquanto arrasta para mudar o valor

Tokens que ele lê

Cor

--cml-border--cml-border-control--cml-danger--cml-fg--cml-field-bg--cml-field-border-sides--cml-field-shadow--cml-focus-offset--cml-focus-ring--cml-focus-width

Forma e tamanho

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

Tipografia e movimento

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

Só deste componente

--cml-corner-shape--cml-disabled-opacity--cml-number-btn-align--cml-number-btn-block--cml-number-btn-radius--cml-number-btn-shadow--cml-number-btn-size--cml-number-divider--cml-number-gap--cml-number-padding--cml-number-weight
/* botões redondos, só no carrinho */
.cart [data-slot="number-field"] {
  --cml-number-btn-radius: 999px;
  --cml-number-divider: 0;
}

Acessibilidade

Arrow Up · Arrow DownSoma ou subtrai um passo.
Shift + ArrowSoma ou subtrai o largeStep.
Home · EndVai ao min ou ao max, quando definidos.
TabLeva o foco ao input. Os botões ficam fora, já que as setas fazem o mesmo.

Relacionados

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