OTP field
Campo para um código de uso único, dividido em uma casa por caractere. Digitar avança, Backspace volta, e colar ou o preenchimento automático do SMS completa todas as casas de uma vez.
Enviado por SMS para (11) •••••-4321.
Instalação
Configure o Camaleo uma vez (Instalação) e importe o que precisar. Coloque dentro de um Field para dar um rótulo.
import { OtpField, Field, FieldLabel } from "@camaleo/react";Anatomia
Uma fileira de casas, cada uma um input. O separator põe um traço entre os grupos, só para os olhos.
Exemplos
Cada exemplo é um arquivo real que você pode copiar. Todos usam o estilo, o modo e a cor escolhidos na barra acima.
Enviado por SMS para (11) •••••-4321.
Cole 482913 ou digite qualquer outro código.
Colar, verificar e erro
Cole um código. O onValueComplete roda quando a última casa é preenchida, então você confere na hora; um código errado marca todas as casas como inválidas.
Código vencido
Quando o servidor recusa o código, use invalid no Field e diga o que fazer em seguida, não só que falhou.
Enviar ao completar
Digite seis dígitos. O autoSubmit envia o formulário no último, e o name manda o código inteiro por um input oculto.
Os 4 dígitos que você usa no caixa eletrônico.
Senha mascarada
O mask esconde cada dígito depois de digitado. Use para uma senha que alguém poderia ver por cima do ombro, não para um código que vence em minutos.
Letras e números, dos códigos que você guardou ao ativar a verificação em duas etapas.
Letras e números
O validationType="alphanumeric" aceita letras e abre o teclado completo; o normalizeValue passa tudo para maiúsculas, então "k7p" confere.
Nomes das casas traduzidos
A primeira casa usa o rótulo do Field e as outras recebem o getCellLabel, então passe um no idioma da página.
Enviando um novo código para (11) •••••-4321…
Desativado durante o envio
Desative enquanto um código novo está a caminho e diga isso na descrição, para ninguém digitar o antigo.
Em contexto
São pedaços inteiros de interface para copiar, no estilo que você escolheu.
Confirme seu celular
Enviamos um código por SMS para (11) 98765-4321.
Confirme o Pix
R$ 1.250,00 para Marina Alves, Banco Pão de Açúcar.
Abra o app do banco e toque em Código de segurança.
Boas práticas
Enviado por SMS para (11) •••••-4321.
A pessoa sabe qual app abrir e percebe um número errado.
Do e-mail, do SMS ou do autenticador? A pessoa troca de app para adivinhar.
Ela compara com o SMS num relance.
Ele vence em minutos e só vale uma vez; esconder só dificulta achar o erro de digitação.
Props
separator casas (3 → 123–456).Field + FieldLabel.one-time-code para códigos por SMS e e-mail.details.reason diz qual.onValueChange. Confira o código aqui.As outras props da raiz do Base UI também funcionam, como readOnly, inputMode, form e onValueInvalid.
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
Tokens que ele lê
Cor
Forma e tamanho
Tipografia e movimento
Só deste componente
/* casas menores, só na tela de pagamento */
.payment-sheet [data-slot="otp-field"] {
--cml-otp-cell-width: 2.25rem;
--cml-otp-cell-height: 2.5rem;
--cml-otp-gap: 0.375rem;
}Acessibilidade
- A primeira casa recebe o nome do rótulo do Field; as outras, do getCellLabel, que vem em inglês por padrão ("Character 2 of 6").
- O autocomplete="one-time-code" vem ligado, então iOS e Android oferecem o código do SMS acima do teclado. Mantenha para códigos por SMS e e-mail.
- O separador é aria-hidden: o leitor de tela ouve as casas, não os traços.
- Um Field inválido marca aria-invalid em todas as casas, e cada casa é descrita pelo FieldDescription e pelo FieldError. Deixe o erro logo abaixo delas, onde a pessoa olha depois de digitar.