SwipeListItem
Import
import { SwipeListItem } from '@pzeta/vue-components'
// oppure tramite plugin:
import { DataPlugin } from '@pzeta/vue-components'
app.use(DataPlugin)
Esempio Base
Props
| Prop | Tipo | Default | Descrizione |
|---|---|---|---|
rightAction | SwipeListItemAction | — | Azione rivelata scorrendo verso destra |
leftAction | SwipeListItemAction | — | Azione rivelata scorrendo verso sinistra |
threshold | number | 0.35 | Frazione della larghezza oltre cui il gesto si completa. Sotto la soglia il contenuto rientra senza emettere nulla |
resistance | number | 0.25 | Attrito applicato verso un'azione assente o disabilitata: 0 blocca del tutto il movimento, 1 lo lascia libero |
disabled | boolean | false | Disabilita l'intero componente: nessuno swipe, nessun tap, pulsanti di fallback inattivi |
actionButtons | 'always' | 'mobile' | 'never' | 'always' | Visibilità dei pulsanti di fallback accessibili |
tapLabel | string | — | Se valorizzata, il contenuto diventa attivabile da tastiera (role="button", tabindex="0", Invio/Spazio) con questa aria-label |
SwipeListItemAction
| Campo | Tipo | Default | Descrizione |
|---|---|---|---|
label | string | — | Obbligatorio. Etichetta del pannello rivelato e del pulsante di fallback |
icon | string | — | Classe CSS dell'icona (es. 'pi pi-check') |
color | Severity | string | 'primary' | Severity del design system o colore CSS arbitrario (es. '#0f766e') |
disabled | boolean | false | Azione non eseguibile: lo swipe in quella direzione oppone resistenza e non si completa mai |
Emits
| Evento | Payload | Descrizione |
|---|---|---|
swipe-right | — | Swipe verso destra completato, o click sul relativo pulsante di fallback |
swipe-left | — | Swipe verso sinistra completato, o click sul relativo pulsante di fallback |
tap | — | Tap sul contenuto senza trascinamento apprezzabile (meno di 5 px di spostamento residuo) |
Slot
| Slot | Scope | Descrizione |
|---|---|---|
default | — | Contenuto trascinabile dell'elemento di lista (tipicamente una card) |
Comportamento del gesto
| Fase | Cosa succede |
|---|---|
| Trascinamento | Il contenuto segue il dito. Verso un'azione assente o disabilitata lo spostamento è ridotto dall'attrito (default: 25% del movimento) |
| Sotto la soglia | Al rilascio il contenuto rientra a riposo e non viene emesso nulla: uno sfioramento accidentale non conferma niente |
| Oltre la soglia | Il contenuto esce di campo e l'evento parte 150 ms dopo: il feedback precede l'effetto |
| Spostamento < 5 px | Il gesto è interpretato come tap, non come swipe |
| Scroll verticale | Il 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 patternsm:hidden: i pulsanti scompaiono dasmin su. Usare solo se il contenuto dello slot offre già un percorso alternativo alle azioni.tapLabelrende il contenuto un target attivabile con Invio o Spazio, conrole="button"earia-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: reduceelimina 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,
}
ReportDesigner
Designer visuale a tre pannelli per report personalizzati — palette dei componenti, canvas righe/colonne con riordino drag-and-drop e editor delle proprietà con formula builder e validazione della sintassi per motore di calcolo.
Timeline
Visualizza una sequenza di eventi in layout verticale, orizzontale o alternato, con marcatori stilizzabili e supporto alla selezione.