SelectableCard
Import
import { SelectableCard } from '@pzeta/vue-components'
import type { SelectableCardOption } from '@pzeta/vue-components'
Quando usarlo
| Scenario | Componente consigliato |
|---|---|
| Scelta esclusiva con forte componente visuale (piani tariffari, categorie con icone/immagini, scelta veicolo) | SelectableCard |
| Scelta esclusiva testuale, lista lunga di opzioni | RadioButton |
| Scelta multipla testuale | Checkbox array mode |
| Scelta multipla visuale (multi-tag con immagine) | SelectableCard con multiple: true |
| Scelta da molte opzioni con ricerca | Select o AutoComplete |
SelectableCard usa internamente <input type="radio"> (single) o <input type="checkbox"> (multiple) con sr-only, quindi è semanticamente corretto come gruppo di radio/checkbox e accessibile da screen reader e tastiera.
Struttura SelectableCardOption
interface SelectableCardOption {
value: string | number // Valore univoco
title: string // Titolo della card
description?: string // Descrizione opzionale
image?: string // URL immagine (priorità su icon)
icon?: string // Classe icona fallback se non c'è immagine (es. 'pi pi-desktop')
disabled?: boolean // Disabilita la singola card
}
Esempio Base
Props
| Prop | Tipo | Default | Descrizione |
|---|---|---|---|
modelValue | string | number | (string | number)[] | undefined | Valore selezionato (v-model) |
options | SelectableCardOption[] | [] | Array di card disponibili |
multiple | boolean | false | Abilita selezione multipla (checkbox invece di radio) |
columns | 1 | 2 | 3 | 4 | 6 | 3 | Numero di colonne nella griglia |
size | 'sm' | 'md' | 'lg' | 'md' | Dimensione delle card |
disabled | boolean | false | Disabilita globalmente tutte le card |
showCheckbox | boolean | true | Mostra l'indicatore di selezione (checkmark) sulla card |
Emits
| Evento | Payload | Descrizione |
|---|---|---|
update:modelValue | string | number | (string | number)[] | Aggiornamento v-model |
change | string | number | (string | number)[] | Cambio selezione (stesso payload di update:modelValue) |
select | SelectableCardOption | Opzione selezionata con tutti i suoi dati |
Esempi
Selezione multipla
In modalità multipla il v-model è un array. Le card usano internamente <input type="checkbox">:
Con icone invece di immagini
Se non viene fornita un'immagine, viene mostrata l'icona:
image ha priorità su icon. Se entrambi sono assenti, la card mostra solo titolo e descrizione senza area cover.
Con immagini reali
Dimensioni
Opzione singola disabilitata
Senza indicatore di selezione
Gestione eventi
Comportamento di selezione
- Selezione singola (
multiple: false): usa<input type="radio">internamente connameauto-generato (selectable-card-{useId}) condiviso fra tutte le card del gruppo. Cliccando una card già selezionata, rimane selezionata (comportamento radio nativo). - Selezione multipla (
multiple: true): usa<input type="checkbox">senza attributoname. Cliccando una card selezionata la deseleziona. - Card disabilitata: il prop
disabledglobale disabilita tutte le card;option.disableddisabilita solo quella specifica card. - Layout: la prop
columnsè statica (1, 2, 3, 4 o 6). Per layout responsive consigliato wrappare il componente in un container con media query CSS o renderizzare con uncolumnsdinamico viauseBreakpointsdi VueUse.
Accessibilità
- Ogni card è un elemento
<label>che avvolge un<input type="radio">o<input type="checkbox">nascosto - L'input nascosto è accessibile da screen reader e navigazione da tastiera nativa
- L'attributo
disabledviene applicato all'input per disabilitare la selezione - Il checkmark visivo è decorativo e l'interazione avviene tramite l'input nativo
TypeScript
import type {
SelectableCardProps,
SelectableCardEmits,
SelectableCardOption,
} from '@pzeta/vue-components'
// Selezione singola
const selected = ref<string>('')
// Selezione multipla
const selectedMultiple = ref<string[]>([])
// Tipizzazione opzioni
const options: SelectableCardOption[] = [
{
value: 'option-1',
title: 'Opzione 1',
description: 'Descrizione opzionale',
icon: 'pi pi-star',
},
]
Select
Dropdown di selezione singola o multipla con supporto a filtro, opzioni raggruppate e chips. Componente custom con navigazione tastiera e type-ahead integrati.
SignatureInput
Canvas interattivo per l'acquisizione di firme digitali tramite mouse o touch. Il valore emesso e un data URL base64 in formato PNG.