Data

SwipeListItem

Elemento di lista con azioni rivelate dallo scorrimento orizzontale, pensato per le code operative su mobile. Soglia di completamento configurabile, resistenza verso le azioni non eseguibili e fallback accessibile da tastiera.

Import

import { SwipeListItem } from '@pzeta/vue-components'
// oppure tramite plugin:
import { DataPlugin } from '@pzeta/vue-components'
app.use(DataPlugin)

Esempio Base

Su desktop il gesto si esegue trascinando con il mouse: il componente usa i Pointer Events, quindi mouse, dito e pennino seguono lo stesso percorso di codice.

Props

PropTipoDefaultDescrizione
rightActionSwipeListItemActionAzione rivelata scorrendo verso destra
leftActionSwipeListItemActionAzione rivelata scorrendo verso sinistra
thresholdnumber0.35Frazione della larghezza oltre cui il gesto si completa. Sotto la soglia il contenuto rientra senza emettere nulla
resistancenumber0.25Attrito applicato verso un'azione assente o disabilitata: 0 blocca del tutto il movimento, 1 lo lascia libero
disabledbooleanfalseDisabilita l'intero componente: nessuno swipe, nessun tap, pulsanti di fallback inattivi
actionButtons'always' | 'mobile' | 'never''always'Visibilità dei pulsanti di fallback accessibili
tapLabelstringSe valorizzata, il contenuto diventa attivabile da tastiera (role="button", tabindex="0", Invio/Spazio) con questa aria-label

SwipeListItemAction

CampoTipoDefaultDescrizione
labelstringObbligatorio. Etichetta del pannello rivelato e del pulsante di fallback
iconstringClasse CSS dell'icona (es. 'pi pi-check')
colorSeverity | string'primary'Severity del design system o colore CSS arbitrario (es. '#0f766e')
disabledbooleanfalseAzione non eseguibile: lo swipe in quella direzione oppone resistenza e non si completa mai

Emits

EventoPayloadDescrizione
swipe-rightSwipe verso destra completato, o click sul relativo pulsante di fallback
swipe-leftSwipe verso sinistra completato, o click sul relativo pulsante di fallback
tapTap sul contenuto senza trascinamento apprezzabile (meno di 5 px di spostamento residuo)

Slot

SlotScopeDescrizione
defaultContenuto trascinabile dell'elemento di lista (tipicamente una card)

Comportamento del gesto

FaseCosa succede
TrascinamentoIl contenuto segue il dito. Verso un'azione assente o disabilitata lo spostamento è ridotto dall'attrito (default: 25% del movimento)
Sotto la sogliaAl rilascio il contenuto rientra a riposo e non viene emesso nulla: uno sfioramento accidentale non conferma niente
Oltre la sogliaIl contenuto esce di campo e l'evento parte 150 ms dopo: il feedback precede l'effetto
Spostamento < 5 pxIl gesto è interpretato come tap, non come swipe
Scroll verticaleIl browser mantiene il controllo del pan verticale (touch-action: pan-y); alla presa in carico dello scroll il gesto orizzontale rientra

Esempi

Coda di lavorazioni

Azione non eseguibile (resistenza)

Quando un'azione non è possibile — per esempio una rilevazione senza cliente associato — lo swipe in quella direzione deve opporre resistenza, non fallire alla fine del gesto.

Con :resistance="0" la direzione bloccata non si muove affatto:

Soglia personalizzata

Visibilità dei pulsanti di fallback

Colori custom

Accessibilità

Le gesture non sono utilizzabili da tastiera né da screen reader: il componente espone perciò le stesse azioni anche come pulsanti.

  • Con actionButtons="always" (default) i pulsanti restano nel DOM su ogni viewport, quindi le azioni sono sempre raggiungibili con Tab e annunciate dagli screen reader. È l'unica modalità che garantisce l'accesso da tastiera anche su desktop.
  • actionButtons="mobile" replica il pattern sm:hidden: i pulsanti scompaiono da sm in su. Usare solo se il contenuto dello slot offre già un percorso alternativo alle azioni.
  • tapLabel rende il contenuto un target attivabile con Invio o Spazio, con role="button" e aria-label. Da omettere quando lo slot contiene già un elemento focusabile proprio, per non annidare due controlli.
  • Il pannello dell'azione rivelata è aria-hidden="true": è feedback visivo del gesto, non contenuto.
  • La preferenza prefers-reduced-motion: reduce elimina le transizioni di rientro e l'attesa prima dell'emissione dell'evento.

TypeScript

import type {
  SwipeListItemProps,
  SwipeListItemEmits,
  SwipeListItemAction,
  SwipeListItemActionButtons,
} from '@pzeta/vue-components'

// SwipeListItemActionButtons = 'always' | 'mobile' | 'never'

const conferma: SwipeListItemAction = {
  label: 'Conferma',
  icon: 'pi pi-check',
  color: 'success',
  disabled: false,
}