Forms

PinInput

Campo PIN con visualizzazione a cifre separate, mascheramento automatico con ritardo e supporto per completamento. Ideale per OTP, codici di sicurezza e PIN numerici.

Import

import { PinInput } from '@pzeta/vue-components'

Esempio Base

Props

PropTipoDefaultDescrizione
modelValuestring''Valore PIN corrente (v-model)
lengthnumber4Numero di cifre del PIN
maskbooleantrueMaschera i caratteri dopo un ritardo
maskDelaynumber500Millisecondi prima di mascherare il carattere appena inserito
disabledbooleanfalseDisabilita il campo
errorbooleanfalseStato di errore
errorMessagestring''Messaggio di errore mostrato sotto il campo
placeholderstring''Placeholder per i digit vuoti
type'number' | 'text' | 'password''number'Tipo di input (filtra i caratteri in base al tipo)

Emits

EventoPayloadDescrizione
update:modelValuestringAggiornamento v-model
completestringEmesso quando tutti i digit sono stati inseriti
changestringEmesso ad ogni cambio di valore

Slot

SlotScopeDescrizione
defaultTesto label/messaggio mostrato sotto le cifre

Esempi

PIN numerico 4 cifre (default)

PIN con lunghezza personalizzata

Senza mascheramento

Con stato di errore

<template>
  <PinInput
    v-model="pin"
    :error="pinNonValido"
    error-message="PIN non corretto. Riprova."
    @complete="verificaPin"
  >
    Inserisci il PIN
  </PinInput>
</template>

Modalità testo (alfanumerica)

Note sul Comportamento

  • Il componente usa un input hidden sottostante e mostra i digit come elementi visuali separati
  • Il tipo 'number' filtra automaticamente i caratteri non numerici
  • Al mount il focus viene impostato automaticamente (se non disabilitato)
  • Il mascheramento: il digit appena inserito rimane visibile per maskDelay ms, poi viene mascherato
  • I digit precedenti vengono mascherati immediatamente
  • Il click sull'area dei digit riporta il focus all'input hidden

Accessibilità

  • L'input sottostante ha type="number" o type="text" in base alla prop type
  • La label e il messaggio di errore sono nel slot default e vengono renderizzati nel DOM
  • L'attributo maxlength è impostato automaticamente dalla prop length

TypeScript

import type { PinInputProps, PinInputEmits } from '@pzeta/vue-components'

const pinProps: PinInputProps = {
  length: 6,
  mask: true,
  maskDelay: 500,
  type: 'number',
}