Forms

RadioButton

Pulsante radio per selezione esclusiva all'interno di un gruppo, con supporto v-model condiviso, varianti stilistiche e stati di caricamento.

Import

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

Esempio Base

Props

PropTipoDefaultDescrizione
modelValueunknownundefinedValore del gruppo radio (v-model condiviso tra tutti i radio del gruppo).
valueunknown—Obbligatorio. Valore univoco del singolo radio. Viene emesso quando il radio viene selezionato.
labelstringundefinedEtichetta visualizzata accanto al radio.
helperTextstringundefinedTesto di aiuto visualizzato sotto il label.
errorstringundefinedMessaggio di errore; attiva lo stato di errore visivo.
size'small' | 'medium' | 'large''medium'Dimensione del radio button.
severity'primary' | 'secondary' | 'success' | 'info' | 'warn' | 'danger' | 'help' | 'contrast''primary'Colore/severità visiva.
variant'default' | 'outlined' | 'filled''default'Variante stilistica del radio button.
disabledbooleanfalseDisabilita il componente.
readonlybooleanfalseRende il componente non modificabile.
loadingbooleanfalseMostra il loading spinner.
loadingIconstringDa configIcona personalizzata per il loading.
requiredbooleanfalseMarca il campo come obbligatorio.
namestringnullAttributo name per raggruppare i radio in un form HTML.
inputIdstringnullID dell'input (per associazione a label).
inputClassstring | object—Classe CSS aggiuntiva sull'input.
inputStylestring | object—Style inline sull'input.
ariaLabelstring—Label accessibile per screen reader.
ariaLabelledbystring—Riferimento a elemento label esterno.
tabindexnumber—Indice tab per navigazione da tastiera.
autofocusboolean—Focus automatico al mount.

Emits

EventoPayloadDescrizione
update:modelValueunknownEmesso quando il radio viene selezionato (emette il value del radio).
change{ originalEvent: Event; value: unknown }Emesso al cambio con l'evento originale e il valore selezionato.
focusFocusEventEmesso quando il componente riceve il focus.
blurFocusEventEmesso quando il componente perde il focus.

Slot

SlotScopeDescrizione
label{ checked: boolean; value: unknown; disabled: boolean }Contenuto custom della label. A differenza del prop label, viene reso fuori dall'elemento <label>, così eventuali control interattivi (es. InputText, link) restano cliccabili e ricevono il focus correttamente.

Usa lo slot #label solo quando la label deve contenere elementi interattivi. Per testo semplice è preferibile il prop label.

Esempi

Pattern Gruppo Radio (v-model Condiviso)

Il meccanismo di gruppo si realizza condividendo lo stesso v-model tra più RadioButton. Quando l'utente seleziona un radio, modelValue viene aggiornato con il value del radio selezionato; gli altri si deselezionano automaticamente.

Gruppi Indipendenti

Con Helper Text

Severità e Varianti

Label personalizzata con slot

Lo slot #label sostituisce il testo con qualsiasi contenuto. Le slot props (checked, value, disabled) permettono di stilare in base allo stato.

Control interattivo nello slot

Poiché lo slot #label è reso fuori dal <label>, può contenere control interattivi (pattern "Altro: ___").

RadioButtonGroup

RadioButtonGroup costruisce il gruppo da un array di opzioni: fieldset/legend, name condiviso (frecce e un solo tab-stop gestiti dal browser) ed errore unico a livello di gruppo.

PropTipoDefaultDescrizione
modelValueunknown—Valore selezionato (v-model)
optionsRadioButtonGroupOption[][]Voci: { value, label, disabled?, helperText? }
labelstring—Etichetta del gruppo (legend)
ariaLabelstring—Nome accessibile se manca label
namestringgeneratoNome condiviso dei radio
requiredbooleanfalseCampo obbligatorio
disabledbooleanfalseDisabilita tutte le voci
errorstring | nullnullMessaggio di errore del gruppo
helperTextstring | nullnullTesto di aiuto del gruppo
orientation'horizontal' | 'vertical''vertical'Disposizione delle voci. In orizzontale ogni voce prende la larghezza del contenuto e le voci vanno a capo solo quando lo spazio finisce (dalla 1.22.0; prima restavano una per riga)
sizeSizeTouch'medium'Dimensione dei radio
severitySeverity'primary'Colore dei radio

Emette update:modelValue e change con il valore della voce scelta.

Accessibilità

  • L'input <input type="radio"> è nascosto visivamente (sr-only) ma accessibile agli screen reader.
  • Usare il prop name per raggruppare i radio a livello di form HTML (navigazione da tastiera).
  • inputId associa il radio a un <label> esterno.
  • Per un nome accessibile usare il prop label (o lo slot #label) oppure ariaLabel/ariaLabelledby, applicati all'<input>.
  • Quando required è true, viene aggiunta * visivamente e un testo (obbligatorio) per screen reader.
  • Contrasto nel tema scuro (dalla 1.24.0): il radio selezionato usa la tinta 400 della severity (primary-600 su slate-800 era 2,8:1, sotto il 3:1 di WCAG 1.4.11) con il punto interno scuro; il bordo dei non selezionati usa --color-field-border (era neutral-600, 1,94:1). Il tema chiaro non cambia.

TypeScript

import type { RadioButtonProps, RadioButtonEmits } from '@pzeta/vue-components'