Skip to content

OtpInput

Composant de saisie OTP (One-Time Password) pour les codes de verification. Supporte plusieurs variantes visuelles, groupement configurable, validation flexible et soumission automatique. Conforme aux normes WCAG avec support complet clavier et lecteurs d'ecran.

Exemples d'utilisation

Basique

Code a 6 chiffres

vue
<SuOtpInput :length="6" />

Variantes visuelles

boxes / underline / seamless

Boxes (defaut)

Underline

Seamless

vue
<SuOtpInput variant="boxes" :length="6" />
<SuOtpInput variant="underline" :length="6" />
<SuOtpInput variant="seamless" :length="6" />

Tailles

sm / md / lg

vue
<SuOtpInput size="sm" :length="6" />
<SuOtpInput size="md" :length="6" />
<SuOtpInput size="lg" :length="6" />

Groupement

Groupement configurable

6 digits en [3, 3]

6 digits en [2, 2, 2]

8 digits en [4, 4]

vue
<SuOtpInput :length="6" :grouping="[3, 3]" separator="-" />
<SuOtpInput :length="6" :grouping="[2, 2, 2]" separator="·" />
<SuOtpInput :length="8" :grouping="[4, 4]" separator="-" />

Types de saisie

Numerique / Alphanumerique / Alphabetique

Numerique (defaut)

Alphanumerique

Alphabetique

vue
<SuOtpInput inputType="numeric" :length="6" />
<SuOtpInput inputType="alphanumeric" :length="6" />
<SuOtpInput inputType="alphabetic" :length="6" />

Validation personnalisee

Hexadecimal uniquement

vue
<!-- Via pattern regex -->
<SuOtpInput :length="6" pattern="^[0-9a-fA-F]$" inputType="alphanumeric" />

<!-- Via fonction validate -->
<SuOtpInput :length="6" :validate="(char) => /^[0-9a-fA-F]$/.test(char)" />

Masquage

Caracteres masques

vue
<SuOtpInput :length="6" :masked="true" />

Etats de validation

error / success / warning

vue
<SuOtpInput state="error" :length="6" />
<SuOtpInput state="success" :length="6" />
<SuOtpInput state="warning" :length="6" />

Soumission automatique

vue
<SuOtpInput :length="6" :autoSubmit="true" @complete="handleComplete" />
vue
<script setup>
const handleComplete = (code) => {
  console.log('Code complet :', code)
  // Verifier le code...
}
</script>

Avec FormField (OtpInputField)

Label, message et etat

vue
<SuOtpInputField
  label="Code de verification"
  message="Entrez le code recu par SMS"
  :length="6"
  :grouping="[3, 3]"
/>

4 digits (code SMS)

Code court

vue
<SuOtpInput :length="4" placeholder="0" />

API

Props (OtpInput)

PropTypeDefautDescription
modelValuestring''Valeur du code OTP (v-model)
lengthnumber6Nombre de caracteres
variant'boxes' | 'underline' | 'seamless''boxes'Variante visuelle
inputType'numeric' | 'alphanumeric' | 'alphabetic''numeric'Type de caracteres acceptes
patternstringRegex personnalisee (surcharge inputType)
validate(char: string, index: number) => booleanFonction de validation par caractere
size'sm' | 'md' | 'lg''md'Taille
stateState'default'Etat de validation
disabledbooleanfalseDesactive
readonlybooleanfalseLecture seule
requiredbooleanfalseRequis
maskedbooleanfalseMasquer les caracteres
groupingnumber[]Schema de groupement (ex: [3, 3])
separatorstring'-'Caractere separateur entre groupes
autoSubmitbooleanfalseEmettre complete quand tous les champs sont remplis
placeholderstring''Placeholder par champ
autoFocusbooleanfalseAuto-focus au montage

Props (OtpInputField)

Herite de FormFieldProps + OtpInputProps. Props supplementaires :

PropTypeDefautDescription
labelstringLabel du champ
messagestringMessage d'aide ou d'erreur
fieldIdstringID personnalise
requiredTextstring'requis'Texte indicateur requis

Evenements

EvenementPayloadDescription
update:modelValuestringMise a jour du v-model
completestringTous les champs sont remplis (si autoSubmit)
changestringValeur modifiee
focusFocusEvent, numberFocus sur un champ (avec index)
blurFocusEvent, numberPerte de focus (avec index)

Slots

SlotDescription
separatorContenu personnalise du separateur entre groupes

Methodes exposees

MethodeDescription
focus()Focus le premier champ
clear()Efface tous les champs et focus le premier

Accessibilite

  • role="group" avec aria-label descriptif sur le conteneur
  • Chaque champ a un aria-label individuel ("Caractere X sur Y")
  • Zone aria-live="polite" pour annoncer la progression
  • Navigation clavier : fleches gauche/droite, Home, End, Backspace, Delete
  • autocomplete="one-time-code" pour le remplissage automatique mobile
  • inputmode="numeric" pour afficher le clavier numerique sur mobile
  • Support collage (paste) avec distribution automatique des caracteres
  • Support prefers-contrast: high et prefers-reduced-motion: reduce

Publié sous licence MIT.