fix(a11y): pijl en onthulstap zeiden het verkeerde (#1844) #1852

Merged
brenno merged 4 commits from fix/1844-pijl-dubbele-naam into main 2026-08-29 16:59:49 +00:00
Owner

Vervolg op #1851. Twee gebreken die niet uit de code kwamen maar uit het draaiende product: een échte HTML-export in een browser, en de presenter die werkelijk een stap zette.

1. Pijlmodus noemde elke verwijzing twee keer

De pijllijn en de badge aan het raileinde droegen allebei role="img" met dezelfde naam. Een schermlezer die over de afbeelding loopt hoorde daardoor "A, het donkere blok" en meteen daarna hetzelfde nog eens — dezelfde fout als de markering die in #1851 haar eigen letter herhaalde, een laag hoger.

Gevonden door de export te openen en de accessibility tree te lezen, niet de markup:

find "het donkere blok"
  listitem "Het donkere blok links (A)"
  img "A, het donkere blok"
  img "A, het donkere blok"      <- twee
  generic "het donkere blok"

De pijl is decoratie bij een markering die haar naam al draagt; hij staat nu met aria-hidden buiten de boom. Dat geldt ook voor de pijl naar een gebied: daar draagt het rechthoekje de naam.

2. De onthulstap kondigde het verkeerde aan

De melding luidde Punt 1/3, 1 markeringen. Twee dingen mis:

  • fout meervoud bij één markering;
  • het getal telde de verwijzingen die inmiddels stonden, niet de markeringen die bij déze stap verschenen. Een opsommingsregel zónder verwijzing herhaalde daardoor het totaal van de vorige stap — Punt 3/3, 2 markeringen terwijl er niets bij was gekomen. §12.2 vraagt letterlijk "how many marks came with it".

CalloutRevealStepPlan kent nu het aantal targets per verwijzing en levert marksAtStep; de melding zwijgt over markeringen als er geen bij kwamen en kiest enkelvoud of meervoud. De sleutel markering is in alle 31 talen toegevoegd.

Twee bestaande vertalingen van het meervoud waren fout en zijn meegenomen: Fries liet het Nederlandse markeringen staan (de doorlaatpoort telt pas vanaf drie woorden en zag het niet), en Klingon had nugh — dat is "gemeenschap", niet "markering". Beide staan in hetzelfde bestand al goed onder de hoofdletter-sleutel.

Wat er onderweg nog uit kwam

De PPTX- en ODP-alt-tekstsleuf uit #1851 is op de échte exports uit de app nagemeten, niet alleen in een unit-test: alle vijf de dia's met verwijzingen dragen hun beschrijving in descr respectievelijk <svg:desc>, en de dia zonder verwijzingen draagt niets. Alle twaalf aria-describedby in de HTML-export wijzen naar een bestaand, clip-verborgen element — gemeten in de browser, met getComputedStyle.

Test plan

  • make check groen
  • make check-secrets groen (gitleaks: no leaks; trufflehog: 0 geverifieerd)
  • make sast groen (semgrep, 0 bevindingen)
  • Nieuw: test/callout_reveal_announcement_test.dart — de presenter zet echte stappen en de aankondigingen worden op de accessibility-kanaal onderschept; plus unit-toetsen op stepAnnouncement
  • Twee nieuwe pijltoetsen in callout_accessibility_test.dart
  • Mutatieproef op beide: de pijl weer benoemen maakt één toets rood, de telling terugzetten op revealedReferences maakt de aankondigingstoets rood met exact de oude fout
  • make l10n-check groen na de 31 vertalingen

Bewaker

Geen bestandsformaat, geen opslag, geen afhankelijkheid, geen uitgaand verkeer. Wel een publieke belofte — de aankondiging die een schermlezer-gebruiker hoort — en die klopt nu met wat het ontwerp zegt in plaats van met wat er stond.

🤖 Generated with Claude Code

Vervolg op #1851. Twee gebreken die niet uit de code kwamen maar uit het draaiende product: een échte HTML-export in een browser, en de presenter die werkelijk een stap zette. ## 1. Pijlmodus noemde elke verwijzing twee keer De pijllijn en de badge aan het raileinde droegen allebei `role="img"` met dezelfde naam. Een schermlezer die over de afbeelding loopt hoorde daardoor "A, het donkere blok" en meteen daarna hetzelfde nog eens — dezelfde fout als de markering die in #1851 haar eigen letter herhaalde, een laag hoger. Gevonden door de export te openen en de accessibility tree te lezen, niet de markup: ``` find "het donkere blok" listitem "Het donkere blok links (A)" img "A, het donkere blok" img "A, het donkere blok" <- twee generic "het donkere blok" ``` De pijl is decoratie bij een markering die haar naam al draagt; hij staat nu met `aria-hidden` buiten de boom. Dat geldt ook voor de pijl naar een gebied: daar draagt het rechthoekje de naam. ## 2. De onthulstap kondigde het verkeerde aan De melding luidde `Punt 1/3, 1 markeringen`. Twee dingen mis: - **fout meervoud** bij één markering; - **het getal telde de verwijzingen die inmiddels stonden**, niet de markeringen die bij déze stap verschenen. Een opsommingsregel zónder verwijzing herhaalde daardoor het totaal van de vorige stap — `Punt 3/3, 2 markeringen` terwijl er niets bij was gekomen. §12.2 vraagt letterlijk "how many marks came with it". `CalloutRevealStepPlan` kent nu het aantal targets per verwijzing en levert `marksAtStep`; de melding zwijgt over markeringen als er geen bij kwamen en kiest enkelvoud of meervoud. De sleutel `markering` is in alle 31 talen toegevoegd. Twee bestaande vertalingen van het meervoud waren fout en zijn meegenomen: **Fries** liet het Nederlandse `markeringen` staan (de doorlaatpoort telt pas vanaf drie woorden en zag het niet), en **Klingon** had `nugh` — dat is "gemeenschap", niet "markering". Beide staan in hetzelfde bestand al goed onder de hoofdletter-sleutel. ## Wat er onderweg nog uit kwam De PPTX- en ODP-alt-tekstsleuf uit #1851 is op de échte exports uit de app nagemeten, niet alleen in een unit-test: alle vijf de dia's met verwijzingen dragen hun beschrijving in `descr` respectievelijk `<svg:desc>`, en de dia zonder verwijzingen draagt niets. Alle twaalf `aria-describedby` in de HTML-export wijzen naar een bestaand, clip-verborgen element — gemeten in de browser, met `getComputedStyle`. ## Test plan - [x] `make check` groen - [x] `make check-secrets` groen (gitleaks: no leaks; trufflehog: 0 geverifieerd) - [x] `make sast` groen (semgrep, 0 bevindingen) - [x] Nieuw: `test/callout_reveal_announcement_test.dart` — de presenter zet echte stappen en de aankondigingen worden op de accessibility-kanaal onderschept; plus unit-toetsen op `stepAnnouncement` - [x] Twee nieuwe pijltoetsen in `callout_accessibility_test.dart` - [x] Mutatieproef op beide: de pijl weer benoemen maakt één toets rood, de telling terugzetten op `revealedReferences` maakt de aankondigingstoets rood met exact de oude fout - [x] `make l10n-check` groen na de 31 vertalingen ### Bewaker Geen bestandsformaat, geen opslag, geen afhankelijkheid, geen uitgaand verkeer. Wel een publieke belofte — de aankondiging die een schermlezer-gebruiker hoort — en die klopt nu met wat het ontwerp zegt in plaats van met wat er stond. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
De pijllijn en de badge aan het raileinde droegen allebei `role="img"` met
dezelfde naam. Een schermlezer die over de afbeelding loopt hoorde daardoor
"A, het donkere blok" en meteen daarna hetzelfde nog eens — dezelfde fout als
een markering die haar eigen letter herhaalt.

De pijl is decoratie bij een markering die haar naam al draagt; hij staat nu
met `aria-hidden` buiten de boom. Dat geldt ook voor de pijl naar een gebied:
daar draagt het rechthoekje de naam.

Gevonden door een echte HTML-export in een browser te openen en de
accessibility tree te lezen, niet de markup: `find "het donkere blok"` gaf
twee `img`-knopen met dezelfde naam.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
De aankondiging bij een onthulstap zei "Punt 1/3, 1 markeringen": een fout
meervoud, en een getal dat de verwijzingen telde die inmiddels stonden in
plaats van de markeringen die bij deze stap verschenen. Op een opsommingsregel
zonder verwijzing herhaalde de melding daardoor het totaal van de vorige stap,
terwijl er niets was bijgekomen.

CalloutRevealStepPlan kent nu het aantal targets per verwijzing en levert
`marksAtStep`; de melding zwijgt over markeringen als er geen bij kwamen, en
kiest enkelvoud of meervoud. `markering` is in alle 31 talen toegevoegd.

Twee bestaande vertalingen van het meervoud waren fout en zijn meegenomen:
Fries liet het Nederlandse `markeringen` staan (de doorlaatpoort telt pas
vanaf drie woorden), en Klingon had `nugh` — dat is "gemeenschap", niet
"markering".

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
De melding groeide _FullscreenPresenterState zes regels over zijn plafond.
De tekst is pure logica op het stapplan; `stepAnnouncement` staat nu los,
zonder BuildContext, en is direct toetsbaar — inclusief de tijdlijntak.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
refactor(html): markeringen van één dia naar een eigen functie
All checks were successful
scans / scans (pull_request) Successful in 3m30s
static-gate / static-gate (pull_request) Successful in 7m36s
d5d33b5f39
_renderImgslot liep over het methodeplafond. De lus die per target een pin,
een gebied of een pijl schrijft is het enige stuk dat per presentatiewijze
uiteenloopt; die staat nu apart.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
brenno merged commit c49e285dd3 into main 2026-08-29 16:59:49 +00:00
Sign in to join this conversation.
No description provided.