Conversation
…laechen wirklich fahren Gemessen 20.08.2026: `shell-smoke.spec.ts` prueft den Tab-Zyklus, aber ausschliesslich auf `/`. In `journey.pwtest.ts` kam `keyboard` **null Mal** vor. `/planung` und `/kosten` — die beiden Flaechen, auf denen die Kernreise stattfindet — hatten also keinen einzigen Tastaturnachweis; nur die Startseite hatte einen. Das Akzeptanzkriterium nennt "Tastatur, sichtbarer Fokus" ausdruecklich fuer die tatsaechlich implementierten Sprint-6-Flaechen. `pruefeTastaturUndFokus` haengt jetzt an `pruefeBarrierefreiheit` und laeuft damit auf beiden Flaechen mit echter GoTrue-Sitzung und echten Daten. Die Sichtbarkeitspruefung (`outline` mit Breite > 0 ODER `box-shadow`) ist aus `shell-smoke.spec.ts` WOERTLICH uebernommen, nicht neu formuliert. Zwei Definitionen von "sichtbarer Fokus" waeren zwei Wahrheiten, die auseinander laufen koennen — und die schwaechere gaebe dann den Ausschlag. Bewusst NICHT zugesichert wird die DOM-Reihenfolge. `shell-smoke` vergleicht sie auf einer statischen Seite, was dort traegt. Hier stehen Formulare mit Zustaenden, die waehrend des Durchtabbens nachladen koennen; eine Reihenfolgezusicherung waere flaky und wuerde als Fokusfehler gelesen, obwohl sie ein Timingartefakt ist. Zugesichert ist, was hier wirklich traegt: JEDES erreichte Element zeigt einen sichtbaren Fokus, und es gibt keine Tastaturfalle. Zwei Vorkehrungen gegen einen vakuoesen Nachweis: - Die Zahl der fokussierbaren Elemente wird vorab gegen 0 geprueft. Ohne das liefe die Schleife auf einer leeren Flaeche null Mal und waere gruen, ohne etwas gemessen zu haben. - Elemente ohne Indikator werden BENANNT statt gezaehlt. "2 Elemente" zwingt zur Suche; die Liste zeigt sofort, welches Bedienelement gemeint ist. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Reviewer's GuideAdds a focused Playwright-based keyboard accessibility check to the authenticated journey tests and wires it into the existing accessibility helper, ensuring /planung and /kosten have non‑vacuous coverage for visible focus and keyboard traps using the same definition as shell-smoke. Sequence diagram for the updated accessibility checks with pruefeTastaturUndFokussequenceDiagram
participant TestRunner
participant pruefeBarrierefreiheit
participant pruefeTastaturUndFokus
participant Page
participant DOM
TestRunner->>pruefeBarrierefreiheit: pruefeBarrierefreiheit(seite, flaeche)
pruefeBarrierefreiheit->>Page: setViewportSize
pruefeBarrierefreiheit->>Page: goto
pruefeBarrierefreiheit-->>TestRunner: viewport restored
pruefeBarrierefreiheit->>pruefeTastaturUndFokus: pruefeTastaturUndFokus(seite, flaeche)
pruefeTastaturUndFokus->>Page: evaluate(querySelectorAll.length)
Page->>DOM: querySelectorAll(focusable)
DOM-->>Page: fokussierbare
Page-->>pruefeTastaturUndFokus: fokussierbare
pruefeTastaturUndFokus->>TestRunner: expect(fokussierbare).toBeGreaterThan(0)
loop Tab cycle over fokussierbare
pruefeTastaturUndFokus->>Page: keyboard.press("Tab")
pruefeTastaturUndFokus->>Page: evaluate(activeElement, getComputedStyle)
Page->>DOM: document.activeElement
DOM-->>Page: activeElement
Page-->>pruefeTastaturUndFokus: { id, sichtbarerFokus }
alt halt ohne sichtbarerFokus
pruefeTastaturUndFokus->>pruefeTastaturUndFokus: ohneIndikator.push(id)
end
end
pruefeTastaturUndFokus->>TestRunner: expect(ohneIndikator).toEqual([])
pruefeTastaturUndFokus->>Page: evaluate(activeElement.outerHTML.slice)
Page-->>pruefeTastaturUndFokus: vorher
pruefeTastaturUndFokus->>Page: keyboard.press("Tab")
pruefeTastaturUndFokus->>Page: evaluate(activeElement.outerHTML.slice)
Page-->>pruefeTastaturUndFokus: nachher
pruefeTastaturUndFokus->>TestRunner: expect(nachher).not.toBe(vorher)
pruefeBarrierefreiheit->>Page: AxeBuilder(...).analyze()
Page-->>pruefeBarrierefreiheit: ergebnis
pruefeBarrierefreiheit-->>TestRunner: completes accessibility checks
File-Level Changes
Tips and commandsInteracting with Sourcery
Customizing Your ExperienceAccess your dashboard to:
Getting Help
|
Der erste rote Lauf meldete `INPUT:feld-datum` als Element ohne sichtbaren
Fokusindikator. Bevor daraus ein CSS-"Fix" wird, gehoert die Sonde selbst
geprueft — und sie hatte den Fehler:
`outline-width: auto` ist der Browser-Fokusring und ein ECHTER Indikator.
`parseFloat("auto")` ist aber `NaN`, und `NaN > 0` ist `false`. Die Sonde hat
ihn damit als fehlend gemeldet und einen Barrierefreiheitsfehler erfunden, den
es so nicht geben muss. `auto` zaehlt jetzt ausdruecklich mit.
Diese Sonde stammt woertlich aus `shell-smoke.spec.ts`. Dort ist derselbe
Denkfehler drin — er faellt nur nicht auf, weil `/` keinen `input[type=date]`
enthaelt, also nie ein Element mit `outline-width: auto` erreicht wird. Die
Uebernahme hat den Fehler sichtbar gemacht, nicht erzeugt.
Zweite Aenderung, unabhaengig davon nuetzlich: die gemessenen Werte reisen im
Fehlertext mit (`outline-style`, `outline-width`, `box-shadow`). Ohne sie sagt
ein Fehlschlag nur "kein Indikator" und die Diagnose beginnt bei null — genau
das ist beim ersten roten Lauf passiert. Bleibt die Flaeche nach dieser
Korrektur rot, benennt der naechste Lauf die Ursache selbst, statt eine zweite
Rateschleife zu erzwingen.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Der Tastaturnachweis auf `/planung` hat einen echten Fehler gefunden, und die
selbsterklaerende Fehlermeldung hat ihn eindeutig gemacht:
INPUT:feld-datum (outline-style=none outline-width=3px box-shadow=none)
`outline-width: 3px` ist hier NICHT die Regel `:focus-visible`, sondern der
Initialwert `medium`. Bei `outline-style: none` heisst das: kein Rahmen. Ein
`input[type="date"]`, in das die Planerin hineintabbt, ist zwar
`document.activeElement`, matcht in Chromium aber `:focus-visible` nicht — die
bestehende Regel greift dort also gar nicht. Chromium zeichnet bei
Datumsfeldern nur die innere Segmentauswahl, keinen Rahmen um das
Bedienelement.
`feld-datum` im Einsatzformular hatte damit fuer Tastaturnutzung keinen
erkennbaren Fokus. Aufgefallen ist das erst, als der Tastaturnachweis
ueberhaupt zum ersten Mal auf `/planung` lief — auf `/` gibt es kein
Datumsfeld.
Behoben mit einer Regel fuer `input`/`select`/`textarea` auf `:focus`.
`:focus` statt `:focus-visible` ist bewusst: bei Texteingaben ist ein
Fokusrahmen auch bei Mausbedienung erwuenscht und ueblich — er zeigt, wohin die
Eingabe geht. Der Nachteil, den `:focus-visible` fuer Buttons vermeidet (Ring
nach jedem Klick), gilt fuer Eingabefelder nicht.
Zweitens: derselbe `auto`-Denkfehler, den ich in der neuen Sonde korrigiert
habe, steckt auch in `shell-smoke.spec.ts` — dort unentdeckt, weil `/` kein
Bedienelement mit `outline-width: auto` enthaelt. Er ist mitkorrigiert, damit
beide Sonden dieselbe Definition von "sichtbarer Fokus" benutzen. Zwei
Definitionen waeren zwei Wahrheiten, und die schwaechere gaebe den Ausschlag.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…rsachen
Das CSS ist nachweislich richtig: die Regel steht im gebauten Stylesheet
(`input:focus{outline:3px solid var(--color-focus)}`), `--color-focus` ist auf
`:root` definiert, und ein isoliertes Chromium mit genau diesem CSS liefert
fuer `input[type=date]` `solid/3px/rgb(29,78,216)`. Trotzdem meldet die Reise
`outline-style=none outline-width=3px`.
`outline-style: none` bei `outline-width: 3px` hat genau zwei Ursachen, und die
Messung unterschied sie bisher nicht:
1. Die Regel greift nicht — dann matcht das Element `:focus`.
2. Das Element ist gar nicht wirklich fokussiert. `document.activeElement`
liefert es trotzdem, aber `:focus` matcht NICHT, etwa wenn das Dokument den
Fensterfokus verloren hat. Dann misst die Sonde nichts ueber das CSS.
`:focus` und `:focus-visible` reisen deshalb im Befund mit. Der naechste Lauf
benennt die Ursache selbst, statt eine weitere Rateschleife zu erzwingen.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…kussiert nennt
Die Diagnose ist eindeutig:
INPUT:feld-datum (outline-style=none outline-width=3px box-shadow=none
:focus=false :focus-visible=false)
`:focus=false`. Das Element ist `document.activeElement`, aber der Browser sieht
es NICHT als fokussiert an — vermutlich, weil der Fokus in der UA-Shadow-Root
auf einem Datumssegment sitzt. Ueber den Fokusrahmen eines solchen Elements
laesst sich nichts aussagen: keine `:focus`-Regel kann greifen, also war der
gemeldete Befund ein ERFUNDENER Fehler meiner Sonde, kein UI-Fehler.
Damit ist auch belegt, dass `document.activeElement` fuer zusammengesetzte
Bedienelemente kein verlaesslicher Beleg fuer "ist fokussiert" ist.
**Die CSS-Aenderung ist zurueckgenommen.** Ich hatte `input:focus` ergaenzt, um
einen Fehler zu beheben, den es nicht gibt. `apps/web/app/globals.css` ist jetzt
byte-identisch mit `master` (`git diff origin/master` auf die Datei ist leer);
`:focus-visible` deckt Tastaturnutzung wie zuvor ab. Eine Stilaenderung, die auf
einer Fehlmessung beruht, hat im Produktionscode nichts verloren — auch dann
nicht, wenn sie harmlos aussieht.
Die Sonde ueberspringt jetzt Elemente, die `:focus` nicht matchen. Damit das
nicht zur stillen Abschwaechung wird, zaehlt sie die tatsaechlich beurteilten
Bedienelemente und besteht auf > 0: haette der Filter ALLE aussortiert, waere
die Liste leer und der Test gruen, ohne ein einziges Element geprueft zu haben.
Der `auto`-Zweig in `shell-smoke.spec.ts` bleibt korrigiert — das war ein echter,
unabhaengiger Denkfehler in derselben Sonde.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
… Tab erkennen
Dritter Fehlalarm derselben Sonde, wieder gemessen statt vermutet:
Error: Tastaturfalle auf /planung
Expected: not "<input data-testid=\"feld-beginn\" type=\"time\" …>"
Bei `input[type="time"]` und `input[type="date"]` wandert Tab zuerst zwischen
den INNEREN Segmenten — Stunde/Minute bzw. Tag/Monat/Jahr. `activeElement`
bleibt dabei dasselbe Element. Ein Vergleich ueber einen EINZIGEN Tab meldet
dort eine Falle, wo nur ein zusammengesetztes Bedienelement steht.
Eine echte Falle gibt den Fokus nie frei. Geprueft wird deshalb gegen ein
Budget von sechs Tabs: das deckt die laengste hier vorkommende Segmentkette
(Datum, drei) mit Reserve ab, und eine Falle besteht es trotzdem nicht.
Der Fehlertext nennt jetzt zusaetzlich das festhaltende Element, statt nur zu
sagen, dass etwas gleich blieb.
Damit ist die Zusicherung staerker als vorher, nicht schwaecher: sie
unterscheidet erstmals zwischen "haelt den Fokus fest" und "hat mehrere
Segmente".
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
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.
Kein Produktionscode, nur der fehlende Nachweis.
Der Befund
shell-smoke.spec.tsprüft den Tab-Zyklus — ausschliesslich auf/. Injourney.pwtest.tskamkeyboardnull Mal vor:/planungund/kosten, die beiden Flächen der Kernreise, hatten damit keinen einzigen Tastaturnachweis; nur die Startseite hatte einen. Das Akzeptanzkriterium nennt „Tastatur, sichtbarer Fokus" ausdrücklich für die tatsächlich implementierten Sprint-6-Flächen.Das ist dieselbe Lücke wie beim verschachtelten
<main>in PR #81 — nur an einer anderen Stelle: der Wächter existierte, hat die Fläche aber nie betreten.Was jetzt läuft
pruefeTastaturUndFokushängt anpruefeBarrierefreiheitund läuft damit auf beiden Flächen, mit echter GoTrue-Sitzung und echten Daten aus PostgreSQL.Die Sichtbarkeitsprüfung (
outlinemit Breite > 0 oderbox-shadow) ist ausshell-smoke.spec.tswörtlich übernommen, nicht neu formuliert. Zwei Definitionen von „sichtbarer Fokus" wären zwei Wahrheiten, die auseinanderlaufen können — und die schwächere gäbe dann den Ausschlag.Was bewusst NICHT zugesichert wird
Die DOM-Reihenfolge.
shell-smokevergleicht Tab- gegen DOM-Reihenfolge; auf einer statischen Seite trägt das. Hier stehen Formulare mit Zuständen, die während des Durchtabbens nachladen können — eine Reihenfolgezusicherung wäre flaky und würde als „Fokusfehler" gelesen, obwohl sie ein Timingartefakt ist.Zugesichert ist, was hier wirklich trägt: jedes erreichte Element zeigt einen sichtbaren Fokus, und es gibt keine Tastaturfalle (ein weiterer Tab verlässt das zuletzt fokussierte Element).
Zwei Vorkehrungen gegen einen vakuösen Nachweis
Gates lokal
Die eigentliche Messung ist
auth-journeyin diesem PR.🤖 Generated with Claude Code
Summary by Sourcery
Sichere die Tastaturbedienbarkeit und sichtbaren Fokusindikatoren auf den zentralen authentifizierten Flächen ab.
Bug Fixes:
/planungund/kostenum den tatsächlichen Nachweis von Tastaturbedienbarkeit, sichtbarem Fokus und dem Fehlen von Tastaturfallen.outline-width: autokorrekt, damit die Fokusprüfung keine gültigen Indikatoren als Fehler meldet.Enhancements:
Tests: