El campo OTP parece una fila de casillas, pero por debajo es un único <input> nativo. El autocompletado por SMS (autocomplete="one-time-code"), el pegado, los gestores de contraseñas, los formularios y los lectores de pantalla ven un campo de texto normal.
Los códigos pegados se limpian, así que «123-456» y «123 456» funcionan, y se rechazan los caracteres que el patrón no admite. En Android, webOtp rellena el código desde el SMS en cuanto llega.
Verificación
(completed) se dispara cuando se llena la última casilla. Pon aria-invalid en la entrada para rechazar un código: las casillas se ponen rojas y tiemblan.
Try 123456, or anything else.
Letras, grupos y enmascarado
pattern="alphanumeric" también acepta letras, [groups] añade separadores y masked dibuja puntos.