Accessibilità
Come verifichiamo
Architettura dello strumento, regole implementate e limiti dichiarati. Versione 1.0.0, ultima esecuzione 3 settembre 2026.
La dichiarazione di accessibilità afferma che il sito è parzialmente conforme e indica quali problemi restano. Questa pagina spiega come quella affermazione è stata prodotta, così che chiunque possa giudicarne il valore — o rifarla.
Perché uno strumento nostro
Esistono verificatori pronti all'uso. Abbiamo preferito scriverne uno per tre ragioni. La prima è che possiamo dire esattamente che cosa controlla, invece di rimandare alla documentazione di terzi. La seconda è che le regole sono tarate sul modo in cui questo sito è costruito: il contrasto, per esempio, si calcola risolvendo le classi tipografiche del nostro sistema di design, che è l'unica fonte dei colori. La terza è che uno strumento nostro può essere pubblicato e discusso, mentre una spunta verde prodotta da un servizio esterno chiede solo di essere creduta.
Non usa alcuna libreria di terze parti, e le sue verifiche di funzionamento — parser, matematica del contrasto, regole su casi noti — si eseguono con npm run a11y:selftest. Uno strumento di controllo non verificato a sua volta non dimostra nulla.
Come è fatto
- Analisi delle pagine servite. Lo strumento scarica ogni pagina del perimetro così come arriva al browser e ne ricostruisce la struttura con un analizzatore HTML scritto internamente. Verifica gerarchia dei titoli, punti di riferimento della pagina, etichette dei campi, attributi ARIA, nomi degli elementi interattivi.
- Calcolo del contrasto. I colori vengono risolti dalle classi presenti nel markup contro la tavolozza del sistema di design, componendo le trasparenze sul fondo effettivo. La formula è quella della norma (luminanza relativa e rapporto di contrasto), implementata direttamente.
- Verifica manuale. Tutto ciò che una macchina non può giudicare — e sono molte cose — resta affidato a persone, con una lista di controllo tracciata.
Quali pagine, e perché queste
Il campione è di 48 pagine e copre l'intero percorso d'uso: informazione, catalogo, scheda prodotto, moduli di contatto e di prova, autenticazione, carrello, acquisto, esito, area riservata, testi legali e pagina di errore. Non è un campione statistico: è l'insieme delle pagine che una persona incontra davvero. Ogni nuova pagina pubblica viene aggiunta al perimetro.
Le 30 regole implementate
Ogni regola indica il criterio WCAG 2.1 e la clausola della EN 301 549 a cui si riferisce. L'elenco è generato dallo strumento stesso: è quello che gira davvero.
Struttura, semantica e moduli
| Regola | Criterio WCAG | Clausola EN | Che cosa controlla |
|---|---|---|---|
html-lang | 3.1.1 | 9.3.1.1 | L'elemento <html> dichiara la lingua della pagina con un codice valido. |
page-title | 2.4.2 | 9.2.4.2 | La pagina ha un <title> non vuoto. |
heading-h1-presente | 1.3.1 | 9.1.3.1 | La pagina ha esattamente un'intestazione di primo livello. |
heading-ordine | 1.3.1 | 9.1.3.1 | I livelli di intestazione non saltano (h2 → h4). |
heading-vuota | 1.3.1 | 9.1.3.1 | Nessuna intestazione è priva di testo. |
landmark-main | 1.3.1 | 9.1.3.1 | Esiste un solo landmark principale <main>. |
landmark-nav-anonimo | 1.3.1 | 9.1.3.1 | Con più <nav> nella stessa pagina, ognuno ha un nome distinto. |
skip-link | 2.4.1 | 9.2.4.1 | Il link di salto punta a un elemento che esiste. |
img-alt | 1.1.1 | 9.1.1.1 | Ogni <img> ha un attributo alt (vuoto se decorativa). |
svg-nome | 1.1.1 | 9.1.1.1 | Ogni <svg> è marcato come decorativo o ha un nome accessibile. |
iframe-title | 4.1.2 | 9.4.1.2 | Ogni <iframe> ha un title che ne descrive il contenuto. |
link-nome | 2.4.4 | 9.2.4.4 | Ogni link ha un nome accessibile. |
button-nome | 4.1.2 | 9.4.1.2 | Ogni <button> ha un nome accessibile. |
id-duplicato | 4.1.1 | 9.4.1.1 | Nessun id compare due volte (gli attributi aria-* vi fanno riferimento). |
lista-malformata | 1.3.1 | 9.1.3.1 | Gli elenchi contengono solo <li> come figli diretti. |
tabella-intestazioni | 1.3.1 | 9.1.3.1 | Le tabelle di dati hanno intestazioni di colonna o di riga. |
aria-attributo-sconosciuto | 4.1.2 | 9.4.1.2 | Gli attributi aria-* esistono e hanno un valore ammesso. |
aria-riferimento-rotto | 4.1.2 | 9.4.1.2 | aria-controls, aria-labelledby e aria-describedby puntano a id esistenti. |
aria-proprieta-obbligatoria | 4.1.2 | 9.4.1.2 | I ruoli che richiedono proprietà obbligatorie le dichiarano. |
aria-hidden-focalizzabile | 4.1.2 | 9.4.1.2 | Dentro aria-hidden="true" non ci sono elementi raggiungibili con Tab. |
ruolo-interattivo-non-focalizzabile | 2.1.1 | 9.2.1.1 | Un ruolo interattivo su un elemento non nativo dichiara anche tabindex. |
tabindex-positivo | 2.4.3 | 9.2.4.3 | Nessun tabindex maggiore di zero: altera l'ordine di tabulazione. |
disclosure-senza-controls | 4.1.2 | 9.4.1.2 | Chi dichiara aria-expanded indica anche quale elemento comanda. |
radiogroup-ridondante | 4.1.2 | 9.4.1.2 | role="radiogroup" non avvolge radio native (che formano già un gruppo con name). |
campo-senza-etichetta | 1.3.1 | 9.1.3.1 | Ogni campo di modulo ha un'etichetta programmatica. |
errore-non-associato | 3.3.1 | 9.3.3.1 | Un modulo che mostra errori marca i campi con aria-invalid e li collega al messaggio. |
autocomplete-mancante | 1.3.5 | 9.1.3.5 | I campi che raccolgono dati dell'utente dichiarano autocomplete. |
gruppo-senza-fieldset | 1.3.1 | 9.1.3.1 | I gruppi di radio hanno un <fieldset> con <legend> o un ruolo di gruppo. |
Contrasto dei colori
| Regola | Criterio WCAG | Clausola EN | Che cosa controlla |
|---|---|---|---|
contrasto-testo | 1.4.3 | 9.1.4.3 | Il testo raggiunge 4.5:1 sul proprio fondo (3:1 se grande), con l'opacità composta. |
contrasto-bordo-campo | 1.4.11 | 9.1.4.11 | Il bordo che delimita un campo di modulo raggiunge 3:1 sul fondo adiacente. |
Che cosa lo strumento non può fare
Questa è la parte più importante della pagina, e la ripetiamo anche nella dichiarazione: l'assenza di errori rilevati non equivale a conformità. Le verifiche automatiche possono dimostrare la presenza di un problema, mai la sua assenza.
- Non esegue un browser. Non valuta la cascata dei fogli di stile, gli stati al passaggio del mouse o al focus, né il contenuto generato dagli stili.
- Il contrasto è dedotto, non misurato. Vale dove il colore proviene da una classe risolvibile. Testo sopra gradienti, motivi grafici o immagini non viene giudicato: finisce fra i casi da verificare a mano — nell'ultima esecuzione erano 25.
- Vede solo la pagina iniziale. Menu aperti, moduli con errori già mostrati, carrello pieno, secondo passo dell'acquisto, lettore video avviato: sono stati che non esistono nel documento analizzato.
- I contenuti di terzi sono opachi. Il modulo di pagamento e il lettore video sono su un altro dominio: nessuno strumento nostro potrà mai ispezionarli.
- Non prova le tecnologie assistive. Non sostituisce l'uso reale con un lettore di schermo, un ingranditore o i comandi vocali. La conformità meccanica non è usabilità.
- Non giudica il significato. Se un testo alternativo sia pertinente, se il testo di un link dica dove porta, se un titolo descriva la sezione, se un messaggio d'errore aiuti davvero: sono valutazioni umane.
- L'analizzatore HTML non è conforme a HTML5. Gestisce il sottoinsieme di markup che il nostro sito produce. Su codice malformato o di terzi può ricostruire una struttura diversa da quella del browser.
- Non copre i documenti non web. Le ricevute PDF ricadono in una sezione diversa della norma e vanno valutate a parte; oggi non sono accessibili.
Verifiche affidate alle persone
Restano necessariamente manuali, fra gli altri:
- l'ordine di lettura e di attraversamento con la sola tastiera;
- l'uso reale con un lettore di schermo, in particolare durante l'acquisto;
- sottotitoli, trascrizioni e descrizioni dei contenuti audio e video;
- il ridisporsi della pagina a 320 pixel di larghezza e con ingrandimento al 200%;
- il colore come unico veicolo di un'informazione;
- la chiarezza dei messaggi di errore e la prevenzione degli errori nell'acquisto;
- il comportamento dei componenti interattivi costruiti su misura.
Conservazione dei risultati
Ogni esecuzione produce un report datato, conservato insieme al codice e confrontabile con i precedenti: si vede che cosa è stato risolto, che cosa è comparso e che cosa resta aperto. Le eccezioni motivate sono registrate con la ragione, chi le ha decise e quando — lo strumento rifiuta di eseguire l'audit se una di queste informazioni manca, perché un'eccezione senza motivazione non è un'eccezione, è un problema messo a tacere.