fix(a11y): sechs Bestands-Verstoesse beheben, Ausnahmen ersatzlos entfernen (#60) - #72
Merged
Merged
Conversation
…fernen (#60) Der a11y-CI-Job aus PR #71 hat auf den Kernseiten sechs belegte Verstoesse gefunden und sie als benannte Ausnahmen eingefroren. Dieser PR behebt sie und nimmt die Ausnahmen aus BEIDEN Configs wieder heraus. 1) duplicate-id-aria (critical, 2x) + form-field-multiple-labels (moderate, 2x) auf /: RegionEinstieg steht auf der Startseite zweimal (Hero + CTA- Wiederholung) und vergab die IDs statisch — jede ID existierte doppelt. Real spuerbar an der Label-Zuordnung: <label for="plz"> zeigt immer auf das ERSTE Feld, ein Klick auf das Label des unteren Formulars sprang nach oben, Screenreader lasen die falsche Beschreibung vor. Jetzt useId() statt fester Suffixe (skaliert auf beliebig viele Instanzen); htmlFor, aria-describedby und die Fehler-/Hinweisknoten ziehen mit. 2) heading-order (moderate, 1x) auf /umfragen: In der anonymen Sicht folgten die Gruppentitel (Ortsteil/Kommune/Kreis/Land) als h3 direkt auf die Seiten-h1 — Ebenensprung. GruppierteListe bekommt eine Prop `ebene` (Default 3, eingeloggte Sicht unveraendert unter ihrer Sektions-h2); die anonyme Sicht rendert h2. Nur die Ebene aendert sich, die Klassen und damit die Optik bleiben identisch. 3) link-in-text-block (serious, 1x) auf /anliegen: Der Link im Fliesstext war nur farblich vom Text unterschieden, `hover:underline` greift erst beim Hover. Statt punktuell: eine Basis-Regel in globals.css unterstreicht jeden <a> in einem <p> dauerhaft (ausser .pz-btn). So schleppt auch der naechste neu geschriebene Fliesstext-Link den Verstoss nicht wieder ein. Ausnahmen entfernt: duplicate-id-aria, form-field-multiple-labels, heading-order und link-in-text-block samt Kommentarbloecken aus .pa11yci.js und .pa11yci.streng.js. Die color-contrast-Ausnahme auf / bleibt — sie ist keine Altlast, sondern die dokumentierte Grenze bei Verlaufshintergruenden. Verifiziert: beide pa11y-Laeufe gruen ohne die Ausnahmen (4/4 URLs, 0 errors), Label-Zuordnung am gerenderten DOM geprueft (IDs eindeutig, label.control zeigt je auf das Feld im eigenen Formular, Label-Klick fokussiert das richtige Feld, Hinweisknoten haengt am ausloesenden Formular). Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BervJUSWK8ymMbcuBuu9d9
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Folge-PR zu #71. Der dort gebaute a11y-Job hat sechs belegte Verstöße gefunden und als benannte Ausnahmen eingefroren. Dieser PR behebt sie wirklich und nimmt die Ausnahmen aus beiden Configs ersatzlos heraus.
Die Fixes
1 + 2 ·
duplicate-id-aria(critical, 2x) undform-field-multiple-labels(moderate, 2x) auf/RegionEinstiegsteht auf der Startseite zweimal (Hero + CTA-Wiederholung) und vergab die IDs statisch (plz,plz-funktion,plz-fehler,plz-hinweis) — jede ID existierte doppelt.Real spürbar war das an der Label-Zuordnung:
<label for="plz">zeigt immer auf das erste Feld im Dokument. Ein Klick auf das Label des unteren Formulars sprang nach oben, Screenreader lasen die Beschreibung des falschen Feldes vor.Fix:
useId()statt fester Suffixe — ein Suffix trägt nur so lange, wie die Zahl der Instanzen bekannt ist.htmlFor,aria-describedbysowie die Fehler- und Hinweisknoten ziehen mit.name="plz"bleibt (Formularfeld-Name, keine ID).3 ·
heading-order(moderate, 1x) auf/umfragenIn der anonymen Sicht folgten die Gruppentitel (Ortsteil/Kommune/Kreis/Land) als
h3direkt auf die Seiten-h1— Ebenensprung.GruppierteListebekommt eine Propebene(Default 3, die eingeloggte Sicht bleibt unter ihrer Sektions-h2unverändert); die anonyme Sicht renderth2. Es ändert sich nur die Ebene — die Klassen und damit die Optik sind identisch.4 ·
link-in-text-block(serious, 1x) auf/anliegenDer Link im Fließtext unterschied sich nur farblich vom umgebenden Text;
hover:underlinegreift erst beim Hover — wer nicht mit der Maus darüberfährt (Touch, Tastatur, Restsehen), sieht es nie.Das Muster steckt an ~70 Stellen im Repo, deshalb nicht punktuell, sondern eine Basis-Regel in
globals.css: jeder<a>in einem<p>ist dauerhaft unterstrichen (ausgenommen.pz-btn— die tragen Fläche und Rahmen als Nicht-Farb-Merkmal). So schleppt auch der nächste neu geschriebene Fließtext-Link den Verstoß nicht wieder ein. Geprüft: es gibt aktuell keinen button-artigen<a>innerhalb eines<p>, die Regel trifft also nur echten Fließtext.Ausnahmen entfernt
Aus
.pa11yci.jsund.pa11yci.streng.jssindduplicate-id-aria,form-field-multiple-labels,heading-orderundlink-in-text-blocksamt ihrer Kommentarblöcke raus.Geblieben: die
color-contrast-Ausnahme auf/in.pa11yci.streng.js. Sie ist keine Altlast, sondern die dokumentierte Grenze bei Verlaufshintergründen (axe kann dort prinzipiell nicht rechnen). An der Gate-Mechanik selbst ändert sich nichts.Verifikation
Lokal gegen
npm run start:standalonemitPILOT_TENANT_SLUG=taunusstein, frische DB (migrate + seed:regions + seed):npm run a11y→ Exit 0, beide Läufe ohne die entfernten Ausnahmen:Zusätzlich am gerenderten DOM von Hand geprüft (Gate-Grün allein beweist nicht, dass die Zuordnung fachlich stimmt — eine ID kann eindeutig und trotzdem falsch verdrahtet sein):
input#_R_24lfmbtb_-plz,label[for]identisch,label.control === input(Browser-eigene Auflösung),input.labels.length === 1.input#_R_9lfmbtb_-plz, ebenso,input.labels.length === 1.aria-describedbywächst auf…-plz-funktion …-plz-hinweis, beide Knoten liegen im zweiten Block; das erste Feld bleibt unberührt, weiter keine doppelten IDs./umfragenanonym: Überschriften h1 → h2 → h3 → h2 → h3 → h2 → h3, keine Ebenensprünge./anliegen: beide Fließtext-Links haben im Ruhezustandtext-decoration-line: underline.npm run lint→ Exit 0 ·npm run typecheck→ Exit 0 ·npx vitest run→ Exit 0, 95 Dateien / 1168 Tests grün.🤖 Generated with Claude Code
https://claude.ai/code/session_01BervJUSWK8ymMbcuBuu9d9