Forms

Listbox

Lista di selezione sempre visibile (non dropdown) con supporto a selezione singola e multipla, filtro, opzioni raggruppate e checkmark. Ideale per pannelli e form con spazio dedicato.

Import

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

Esempio Base

Props

PropTipoDefaultDescrizione
modelValueListboxOptionValue | ListboxOptionValue[]undefinedValore selezionato (v-model)
optionsListboxOption[] | ListboxOptionGroup[][]Array di opzioni o gruppi
optionLabelstring | ((o) => string)nullProprietà o funzione per il testo visualizzato
optionValuestring | ((o) => ListboxOptionValue)nullProprietà o funzione per il valore
optionDisabledstring | ((o) => boolean)nullProprietà o funzione per opzione disabilitata
optionGroupLabelstring | ((o) => string)nullLabel del gruppo di opzioni
optionGroupChildrenstring | ((o) => ListboxOption[])nullProprietà con le opzioni figlie del gruppo
multiplebooleanfalseAbilita selezione multipla con checkbox
filterbooleanfalseMostra campo di ricerca nella lista
filterMatchMode'startsWith' | 'contains' | 'endsWith''contains'Modalità di matching del filtro
filterPlaceholderstring'Search...'Placeholder del campo filtro
filterLocalestringnullLocale per il confronto stringhe nel filtro
filterFieldsstring[]nullCampi su cui applicare il filtro
checkmarkbooleanfalseMostra checkmark accanto all'opzione selezionata (single)
highlightOnSelectbooleantrueEvidenzia le opzioni selezionate
metaKeySelectionbooleanfalseRichiede Meta/Ctrl per selezione multipla senza checkbox
scrollHeightstring'14rem'Altezza massima della lista con scroll
listStylestring | Record<string, string | number>nullStile inline per il contenitore lista
stripedbooleanfalseRighe alternate con sfondo alternato
labelstringnullLabel mostrata sopra la lista
helperTextstringnullTesto di aiuto sotto la lista
errorstringnullMessaggio di errore
invalidbooleanfalseStato di validazione invalido
disabledbooleanfalseDisabilita il componente
requiredbooleanfalseCampo obbligatorio
size'small' | 'medium' | 'large''medium'Dimensione del componente
dataKeystringnullChiave univoca per il confronto di oggetti
namestringnullNome per i form nativi
ariaLabelstringnullAria label per screen reader
ariaLabelledbystringnullID dell'elemento label ARIA
autoOptionFocusbooleantrueFocus automatico sulla prima opzione
focusOnHoverbooleantrueSposta il focus all'opzione al passaggio del mouse
selectOnFocusbooleanfalseSeleziona automaticamente l'opzione al focus da tastiera
defaultValueListboxOptionValue | ListboxOptionValue[]nullValore predefinito
filterInputPropsRecord<string, unknown>nullAttributi aggiuntivi per l'input di filtro

Emits

EventoPayloadDescrizione
update:modelValueListboxOptionValue | ListboxOptionValue[]Aggiornamento v-model
change{ originalEvent: Event, value: ListboxOptionValue | ListboxOptionValue[] }Cambio di selezione
value-changeListboxOptionValue | ListboxOptionValue[]Cambio valore (alias semplificato)
filter{ originalEvent: Event, value: string, filterValue: unknown[] }Cambio del testo filtro
focusEventLa lista riceve il focus
blurEventLa lista perde il focus
item-dblclick{ originalEvent: Event, value: ListboxOptionValue }Doppio click su un'opzione
option-dblclick{ originalEvent: Event, value: ListboxOptionValue }Alias di item-dblclick

Slot

SlotScopeDescrizione
header{ value, options }Contenuto in cima alla lista
footer{ value, options }Contenuto in fondo alla lista
option{ option, selected, index }Template per ogni singola opzione
optiongroup{ option, index }Template per l'intestazione del gruppo
emptyMessaggio quando non ci sono opzioni
emptyfilterMessaggio quando il filtro non produce risultati
content{ items, styleClass, contentRef, getItemOptions }Override completo del contenuto della lista
loader{ options }Stato di caricamento
filtericon{ class: string }Icona di ricerca personalizzata

Esempi

Selezione multipla

In modalità multipla ogni opzione ha una checkbox. Il v-model è un array:

Con filtro di ricerca

Con checkmark (selezione singola)

Opzioni raggruppate

Righe alternate

Con slot option personalizzato

<Listbox v-model="selected" :options="users" option-label="name">
  <template #option="{ option, selected }">
    <div class="flex items-center gap-3">
      <img :src="option.avatar" class="w-8 h-8 rounded-full" />
      <div>
        <div class="font-medium">{{ option.name }}</div>
        <div class="text-xs text-gray-500">{{ option.email }}</div>
      </div>
      <span v-if="selected" class="ml-auto text-primary-600">✓</span>
    </div>
  </template>
</Listbox>

Doppio click per azione rapida

<Listbox
  v-model="selected"
  :options="options"
  option-label="name"
  @item-dblclick="({ value }) => openDetail(value)"
/>

Stati

Accessibilità

  • Il contenitore lista ha role="listbox" con aria-multiselectable in modalità multipla
  • Supporto navigazione tastiera: ArrowDown/Up naviga le opzioni, Enter/Space seleziona, Home/End per primo/ultimo elemento
  • Ogni opzione ha role="option" con aria-selected e aria-disabled
  • L'input di filtro supporta navigazione con ArrowDown/Up ed Enter
  • aria-label e aria-labelledby configurabili

TypeScript

import type { ListboxProps, ListboxEmits, ListboxChangeEvent } from '@pzeta/vue-components'

function onChange(event: ListboxChangeEvent) {
  // event.value contiene il nuovo valore o array di valori
  console.log(event.value)
}