componentes / formulário
OTP Input
Uma caixa por dígito, com avanço automático, backspace e colagem.
539 B gzip client componentbase ui · otp-field
type or paste 6 digits
otp-input-default.tsx
"use client";
import { useState } from "react";
import { OtpInput } from "@/components/ui/otp-input";
export default function OtpInputDefault() {
const [code, setCode] = useState("");
return (
<div className="flex flex-col gap-3">
<OtpInput onValueChange={setCode} value={code} />
<p className="font-mono text-muted-foreground text-sm">{code.length === 6 ? `code: ${code}` : "type or paste 6 digits"}</p>
</div>
);
}Instalação
$ npx shadcn@latest add https://cd-ui.vercel.app/r/otp-input.jsonprimeira vez? configure o components.json e o tema antes: veja instalação.
Uso
import { OtpInput } from "@/components/ui/otp-input"
<OtpInput length={6} onValueComplete={(code) => verify(code)} />API
OtpInput
Base UI · OTPField.RootUma caixa por dígito, feito sobre o OTP Field do Base UI. Numérico por padrão, com preenchimento por SMS (autocomplete="one-time-code").
| prop | tipo | padrão |
|---|---|---|
lengthNúmero de caixas. | number | 6 |
value · defaultValueCódigo como string. Controlado ou inicial. | string | - |
onValueChangeChamado a cada mudança. | (value: string) => void | - |
onValueCompleteChamado quando todas as caixas estão preenchidas. | (value: string) => void | - |
invalidPinta as caixas com a cor de erro. | boolean | - |
classNameClasses extras, mescladas com | string | - |
Teclado
| tecla | ação |
|---|---|
| 0-9 | Preenche a caixa e vai para a próxima. |
| Backspace | Limpa a caixa e volta para a anterior. |
| ←→ | Move entre as caixas. |
| CtrlV | Colar um código completo preenche todas as caixas. |
Acessibilidade
- As caixas ficam em um
role="group"com o nome "Verification code" (mude comaria-label); cada caixa depois da primeira se chama "Digit N of 6".