Een link in de kop- of voetband van een document wordt op contrast getoetst #1620

Merged
brenno merged 4 commits from fix/bandaccent-contrast into main 2026-08-20 18:59:19 +00:00
Owner

Het derde en laatste paar van het documentvlak, na documentHeadingColor en documentBandTextColor uit #1616. Daar stond het als openstaand punt in de PR-tekst; hier is het.

Het paar

De kop- en voetband tekent een link in de kop- of voettekst met de accentkleur. Niet als versiering en niet op één plek: in de app via linkColor: profile.accentColor (document_page_chrome.dart) en in de HTML-export via .document a{color:accentColor} — de band staat binnen .document, en _documentChromeMarkdownHtml zet echte <a>-elementen neer. De accentkleur werd alleen tegen het papier gemeten.

Een donkere huisstijlband met witte tekst erop is daarmee volgens élke poort in orde:

paar verhouding oordeel vóór deze PR
accent #003399 op papier #FFFFFF 10,9:1 'Thema accent' zwijgt — terecht
bandtekst #FFFFFF op band #14213D 16,0:1 'Thema documentband' zwijgt — terecht
accent #003399 op band #14213D 1,5:1 niemand keek

Beide kleuren op zichzelf deugen; het paar niet. Dat is dezelfde vorm als de zevende route uit de memory contrast-escape-routes (#1604, het codeblok-vlak onder gewone tekst): een kleur die klopt voor het blok waarvoor hij gemaakt is, gelegd onder iets anders.

Twee keuzes

De melding landt op de bandachtergrond, niet op het accent. Anders dan de twee paren ernaast, en met opzet: het accent is een gedeelde kleur die overal elders wél deugt, dus wat aan dít paar te herstellen valt is de band eronder. documentBandBackgroundColor krijgt daarom het anker, de inline waarschuwing en een plek in _documentOnlyThemeFields.

Alleen wanneer de auteur die bandachtergrond zélf zet. Laat hij hem leeg, dan ís de band het papier — en dan is dit letterlijk het paar dat 'Thema accent' al meet, op dezelfde drempel. Dezelfde regel als bij de andere twee.

De drempel is die voor gewone tekst: een link in de band is bandtekst, dezelfde twaalf beeldpunten.

Toetsen

Drie nieuwe, alle drie rood geproefd met de toets in plaats uitgeschakeld (geen git checkout over ongecommit werk): de analyzer-toets, de dialoogwaarschuwing en de sprong naar het juiste vlak.

De analyzer-toets isoleert het paar aantoonbaar: een aparte de opzet klopt-toets pint vast dat de andere twee paren hun drempel hálen, dus de melding die verschijnt kan maar van één kant komen.

Eén bestaande toets moest mee. een onleesbare kop-/voetband waarschuwt gebruikte een donkere band, en daar valt het accent nu óók op weg — twee waarschuwingen waar de toets er één telt. Hij staat nu op een lichte band (#999999 op #F0F0F0, 2,5:1) met het accent op 9,5:1. Dat is precies wat je van zo'n toets wilt: hij viel om omdat het gedrag veranderde, niet omdat hij bros was.

Meegeleverd, en waarom het erin zit

Een volgorde-afhankelijke toets buiten deze wijziging. De poort stond rood op mermaid_render_service_coverage_test.dart. Niet door deze PR: het bestand is byte-identiek aan main. MermaidRenderService is een singleton en hostNeeded overleeft de toets die hem zet; de suite draait met --test-randomize-ordering-seed random, dus liep requestHost eerst, dan viel zonder WebView-platform levert een render meteen niets op om. Reproduceerbaar met seed 7 en 42, groen met 1, 3 en 11 — dus eerst het mechanisme aangetoond, daarna pas gerepareerd. Eén setUp zet de vlag terug. Het zat er latent op main en had willekeurig iemands PR geraakt.

Een klasseplafond. De nieuwe wikkel duwde _DocumentStyleBuilder op 1005 regels (max 1000). Geen nieuwe regel in classSizeBaseline, maar _surfaceSections en de twee veldlijsten naar top-level: het zijn afleidingen uit de taal en uit vaste veldnamen, niet uit de staat van het dialoog.

Drie alinea's uit de gebruikershandleiding die #1605 had teruggedraaid — de contrastrij in de tabel en twee alinea's over de stijlprofielen, alle drie uit #1616. Die tak stond op een oudere gids en nam bij het samenvoegen haar eigen kant, terwijl ze over iets anders ging (afbeeldingen in een document). Ze staan er weer, meteen in drie-paren-vorm.

Wat ik bewust heb laten liggen

Diezelfde tak liet nog twee alinea's vallen: dat een document in de browserversie niet te exporteren is (in geen van de vier formaten), en de correctienoot over waar mermaid en formules terugvallen. Ik heb ze niet teruggezet. Het zijn beweringen over webgedrag die onder flutter test niet te toetsen zijn (kIsWeb is daar altijd false), en FilePicker.saveFile suggereert dat de grens nog geldt maar bewijst het niet. Een belofte in de gids terugzetten die je niet hebt nagekeken is precies de fout die docs-claims-verify-against-code beschrijft. Ze horen in een eigen wijziging, na een echte webbuild.

Poorten

make check groen op de huidige main (drie keer gerebased onderweg, de laatste keer op a732d4d2): 10.263 tests, dekking 87,2%, per-bestand-vloer 0. make check-secrets: geen bevindingen. make sast: 0 findings. make l10n-check groen — één nieuw label in 31 talen. DAST (ZAP) niet gedraaid: deze wijziging raakt het geserveerde weboppervlak niet.

Bewaker: overgeslagen, met reden. Geen bestandsformaat, geen opslag, geen afhankelijkheid, geen uitgaand verkeer. De gids-wijziging maakt een bestaande WCAG-AA-claim waar op een vlak waar hij stil niet gold; dat verbreedt een toegankelijkheidsgarantie in plaats van een nieuwe belofte toe te voegen.

Niet met eigen ogen nagekeken. Geen visuele ronde: de melding hangt aan bedrading die al beproefd is en er verandert niets aan hoe een document rendert. De widgettoetsen openen het echte dialoogvenster op het documentvlak en lezen de waarschuwingstekst én de verhouding (1.5:1) terug.

Het derde en laatste paar van het documentvlak, na `documentHeadingColor` en `documentBandTextColor` uit #1616. Daar stond het als openstaand punt in de PR-tekst; hier is het. ## Het paar De kop- en voetband tekent een link in de kop- of voettekst met de **accentkleur**. Niet als versiering en niet op één plek: in de app via `linkColor: profile.accentColor` (`document_page_chrome.dart`) en in de HTML-export via `.document a{color:accentColor}` — de band staat binnen `.document`, en `_documentChromeMarkdownHtml` zet echte `<a>`-elementen neer. De accentkleur werd alleen tegen het papier gemeten. Een donkere huisstijlband met witte tekst erop is daarmee volgens élke poort in orde: | paar | verhouding | oordeel vóór deze PR | | --- | --- | --- | | accent `#003399` op papier `#FFFFFF` | 10,9:1 | 'Thema accent' zwijgt — terecht | | bandtekst `#FFFFFF` op band `#14213D` | 16,0:1 | 'Thema documentband' zwijgt — terecht | | **accent `#003399` op band `#14213D`** | **1,5:1** | **niemand keek** | Beide kleuren op zichzelf deugen; het paar niet. Dat is dezelfde vorm als de zevende route uit de memory `contrast-escape-routes` (#1604, het codeblok-vlak onder gewone tekst): een kleur die klopt voor het blok waarvoor hij gemaakt is, gelegd onder iets anders. ## Twee keuzes **De melding landt op de bandachtergrond, niet op het accent.** Anders dan de twee paren ernaast, en met opzet: het accent is een gedeelde kleur die overal elders wél deugt, dus wat aan dít paar te herstellen valt is de band eronder. `documentBandBackgroundColor` krijgt daarom het anker, de inline waarschuwing en een plek in `_documentOnlyThemeFields`. **Alleen wanneer de auteur die bandachtergrond zélf zet.** Laat hij hem leeg, dan ís de band het papier — en dan is dit letterlijk het paar dat 'Thema accent' al meet, op dezelfde drempel. Dezelfde regel als bij de andere twee. De drempel is die voor gewone tekst: een link in de band is bandtekst, dezelfde twaalf beeldpunten. ## Toetsen Drie nieuwe, alle drie **rood geproefd** met de toets in plaats uitgeschakeld (geen `git checkout` over ongecommit werk): de analyzer-toets, de dialoogwaarschuwing en de sprong naar het juiste vlak. De analyzer-toets isoleert het paar aantoonbaar: een aparte `de opzet klopt`-toets pint vast dat de andere twee paren hun drempel hálen, dus de melding die verschijnt kan maar van één kant komen. **Eén bestaande toets moest mee.** `een onleesbare kop-/voetband waarschuwt` gebruikte een donkere band, en daar valt het accent nu óók op weg — twee waarschuwingen waar de toets er één telt. Hij staat nu op een lichte band (`#999999` op `#F0F0F0`, 2,5:1) met het accent op 9,5:1. Dat is precies wat je van zo'n toets wilt: hij viel om omdat het gedrag veranderde, niet omdat hij bros was. ## Meegeleverd, en waarom het erin zit **Een volgorde-afhankelijke toets buiten deze wijziging.** De poort stond rood op `mermaid_render_service_coverage_test.dart`. Niet door deze PR: het bestand is byte-identiek aan main. `MermaidRenderService` is een singleton en `hostNeeded` overleeft de toets die hem zet; de suite draait met `--test-randomize-ordering-seed random`, dus liep `requestHost` eerst, dan viel `zonder WebView-platform levert een render meteen niets op` om. Reproduceerbaar met seed 7 en 42, groen met 1, 3 en 11 — dus eerst het mechanisme aangetoond, daarna pas gerepareerd. Eén `setUp` zet de vlag terug. Het zat er latent op main en had willekeurig iemands PR geraakt. **Een klasseplafond.** De nieuwe wikkel duwde `_DocumentStyleBuilder` op 1005 regels (max 1000). Geen nieuwe regel in `classSizeBaseline`, maar `_surfaceSections` en de twee veldlijsten naar top-level: het zijn afleidingen uit de taal en uit vaste veldnamen, niet uit de staat van het dialoog. **Drie alinea's uit de gebruikershandleiding die #1605 had teruggedraaid** — de contrastrij in de tabel en twee alinea's over de stijlprofielen, alle drie uit #1616. Die tak stond op een oudere gids en nam bij het samenvoegen haar eigen kant, terwijl ze over iets anders ging (afbeeldingen in een document). Ze staan er weer, meteen in drie-paren-vorm. ## Wat ik bewust heb laten liggen Diezelfde tak liet nog twee alinea's vallen: dat een document in de **browserversie niet te exporteren is** (in geen van de vier formaten), en de correctienoot over waar mermaid en formules terugvallen. Ik heb ze **niet** teruggezet. Het zijn beweringen over webgedrag die onder `flutter test` niet te toetsen zijn (`kIsWeb` is daar altijd `false`), en `FilePicker.saveFile` suggereert dat de grens nog geldt maar bewijst het niet. Een belofte in de gids terugzetten die je niet hebt nagekeken is precies de fout die `docs-claims-verify-against-code` beschrijft. Ze horen in een eigen wijziging, na een echte webbuild. ## Poorten `make check` groen op de huidige main (drie keer gerebased onderweg, de laatste keer op `a732d4d2`): 10.263 tests, dekking 87,2%, per-bestand-vloer 0. `make check-secrets`: geen bevindingen. `make sast`: 0 findings. `make l10n-check` groen — één nieuw label in 31 talen. **DAST (ZAP) niet gedraaid**: deze wijziging raakt het geserveerde weboppervlak niet. **Bewaker: overgeslagen, met reden.** Geen bestandsformaat, geen opslag, geen afhankelijkheid, geen uitgaand verkeer. De gids-wijziging maakt een bestaande WCAG-AA-claim waar op een vlak waar hij stil niet gold; dat verbreedt een toegankelijkheidsgarantie in plaats van een nieuwe belofte toe te voegen. **Niet met eigen ogen nagekeken.** Geen visuele ronde: de melding hangt aan bedrading die al beproefd is en er verandert niets aan hoe een document rendert. De widgettoetsen openen het echte dialoogvenster op het documentvlak en lezen de waarschuwingstekst én de verhouding (1.5:1) terug.
Het derde paar van het documentvlak, na de kopkleur en de bandtekst. De
band tekent een link in de kop- of voettekst met de accentkleur — in de
app (`document_page_chrome.dart`) en in de HTML-export (`.document a`)
allebei — en die kleur werd alleen tegen het papier gemeten.

Een donkere huisstijlband met witte tekst erop is daarmee volledig in
orde volgens elke poort: het accent haalt 10,9:1 op het papier, de
bandtekst 16,0:1 op de band. De link erin staat op 1,5:1 en is niet te
lezen. Beide kleuren op zichzelf deugen; het paar niet.

De melding landt op de bandachtergrond en niet op het accent. Dat accent
is een gedeelde kleur die overal elders wél deugt — wat aan dít paar te
herstellen valt, is de band eronder.

Net als de andere twee telt hij alleen wanneer de auteur die
bandachtergrond zélf zet. Laat hij hem leeg, dan ís de band het papier,
en dan is dit letterlijk het paar dat 'Thema accent' al meet — op
dezelfde drempel.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Hetzelfde anker en dezelfde inline waarschuwing als de twee kleuren
ernaast, plus een plek in `_documentOnlyThemeFields` zodat een sprong
vanuit het kwaliteitspaneel op het documentvlak landt.

Eén bestaande toets moest mee. `een onleesbare kop-/voetband
waarschuwt` gebruikte een donkere band, en dáár valt het accent nu óók
op weg: twee waarschuwingen waar de toets er één telt. Hij staat nu op
een lichte band met te bleke tekst, zodat elke toets weer één paar
isoleert en de waarschuwing die verschijnt maar van één kant kan komen.

`_surfaceSections` en de twee veldlijsten verhuizen naar top-level: de
klasse liep met de nieuwe wikkel over haar plafond van 1000 regels, en
dit zijn afleidingen uit de taal en uit vaste veldnamen — niet uit de
staat van het dialoog. Geen nieuwe regel in classSizeBaseline dus.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Gevonden doordat de poort er rood op stond, niet door deze wijziging: de
toets staat ongewijzigd zo op main.

`MermaidRenderService` is een singleton en `hostNeeded` overleeft dus de
toets die hem zet. De suite draait met
`--test-randomize-ordering-seed random`, dus de volgorde binnen een
bestand ligt niet vast — liep `requestHost` eerst, dan zag `zonder
WebView-platform levert een render meteen niets op` een gevraagde host
en viel om. Reproduceerbaar met seed 7 en 42, groen met 1, 3 en 11.

Eén `setUp` zet de vlag terug, zodat elke toets op dezelfde stand
begint. De ad-hoc reset in de requestHost-toets kan daarmee weg; de
reden staat nu één keer, bovenaan.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
docs(kwaliteit): het derde documentpaar staat in de gids en de bronkaart
All checks were successful
scans / scans (pull_request) Successful in 2m58s
static-gate / static-gate (pull_request) Successful in 6m25s
0f90a1f970
Herstelt meteen drie alinea's die PR #1605 had teruggedraaid: de
contrastrij in de tabel en twee alinea's over de stijlprofielen. Die
tak stond op een oudere gids en nam bij het samenvoegen haar eigen
kant, terwijl ze over iets anders ging (afbeeldingen in een document).

Twee andere alinea's die diezelfde tak liet vallen — dat een document
in de browserversie niet te exporteren is, en de correctienoot over
waar mermaid en formules terugvallen — staan er bewust nog niet weer
in: dat zijn beweringen over webgedrag die onder `flutter test` niet te
toetsen zijn, en een belofte in de gids terugzetten die je niet hebt
nagekeken is precies de fout die we hier niet maken.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
brenno merged commit 54618a7692 into main 2026-08-20 18:59:19 +00:00
Sign in to join this conversation.
No description provided.