fix(a11y): donkere modus ronde twee — de foutkant van elke ernst-switch, en twee witte vlakken (#821) #823

Merged
brenno merged 3 commits from fix/donkere-modus-ronde-twee-821 into main 2026-07-24 21:03:51 +00:00
Owner

De tweede ronde door de donkere modus, over de oppervlakken die #780 niet
bekeken heeft. Hij leverde een patroon op, geen losse defecten.

Drie klassen, één oorzaak per klasse

De foutkant van elke ernst-switch. Er zijn vier manieren om een kleur op te
schrijven die geen enkele poort meet:

route poort
1 Color(0xFF…) check_conventions, basislijn nul
2 Colors.white38 sinds #780
3 Colors.red.shade700 wás er niet
4 surface: Colors.white wás er niet

Route 3 was goed voor vijftien plekken, en bijna elke vindplaats was de
foutkant van een switch waarvan de waarschuwingskant al een mode-afhankelijk
token had — result.isValid ? AppTheme.warningFg : Colors.red.shade700, in vier
bestanden. De tokenmigratie van #606 heeft die ene tak stelselmatig
overgeslagen, en dat is juist de foutmelding. Gemeten 2,68 tot 3,97:1.

Vast wit oppervlak, mode-afhankelijke tekst erop. Route 4, en de ergste in
getal. MarkdownEditorTheme.editorPanel schilderde het notitieveld op
Colors.white, terwijl de tekst mode-afhankelijk binnenkomt (licht in donkere
modus). Het veld werd een wit vlak met lichte tekst: 1,1:1 voor de tekst,
1,4:1 voor de werkbalkiconen. Dezelfde fout op de opslagkaart in de
instellingen: lichte inkt op een witte Material, 1,7 tot 3,0:1.

Wat er gemeten en gerepareerd is

  • Route 3: de syntaxfoutregel en de gutter van de Markdown-editor, de
    oefenrun-samenvatting, de exportdialoog en zijn kwaliteitssectie, het
    verwijder-item in het slide-menu, de TeX-terugval op een dia (die krijgt een
    vást token — een dia rendert in een export-isolate), twee bladeraar-iconen en
    de intrekken-knop in de privacy-instellingen.
  • Route 4: het notitieveld (editorPanelAppTheme.paper) en de
    opslagkaart (Materialpaper, plus de "niet getest"-status van vaste
    amber700 naar warningFg).

Draaiend gezien: de foutregel, de gebalkte notitiewerkbalk (die was een wit
vlak middenin de donkere interface) en het notitieveld met leesbare
amber-tekst.

Poorten

  • Route 3 → een bronwacht in app_theme_contrast_test naast de bestaande op
    vaste merkkleuren: geen kale Material-kleur (red, green, grey, …) als
    tekst of icoon. Vullingen mogen — daar draagt het label het contrast.
  • Route 4 → markdown_editor_theme_contrast_test: het paar per notitieblok in
    beide modi, plus een bronwacht op surface: Colors.white in die factory.

Beide bronwachten zijn één keer rood gezien door een vindplaats terug te
zetten; de rekensommen reproduceren 1,37:1 en 2,94:1.

Geen algemene "vast wit oppervlak"-poort. Die laat zich niet schrijven
zonder de vele terechte gevallen (wit label op een gekleurde vulling) mee te
vangen. De twee instanties hier zijn per stuk gemeten; de rest van die klasse
is wat de rondgang met eigen ogen moet vinden — daarvoor is #821 een rondgang
en geen grep.

Nog niet af

De rondgang zelf is niet klaar. Wat nog niet met eigen ogen bekeken is: het
beamerscherm en het tweede-schermpad, de bevindingkaarten met hun ernstbanden,
en de meeste slide-editors op rij. Ik heb de statisch vindbare klassen
weggewerkt; de overige oppervlakken blijven werk, en #821 blijft daarvoor open
met een reactie die opsomt wat nog staat.

Poorten (mechanisch)

make check groen, make test-golden groen, make check-secrets en
make sast groen. Bewaker overgeslagen, expliciet: geen bestandsformaat,
opslag, afhankelijkheid, uitgaand verkeer of publieke belofte geraakt — enkel
kleurtokens en twee toetsen.

Refs #821

De tweede ronde door de donkere modus, over de oppervlakken die #780 niet bekeken heeft. Hij leverde een patroon op, geen losse defecten. ## Drie klassen, één oorzaak per klasse **De foutkant van elke ernst-switch.** Er zijn vier manieren om een kleur op te schrijven die geen enkele poort meet: | | route | poort | |---|---|---| | 1 | `Color(0xFF…)` | `check_conventions`, basislijn nul | | 2 | `Colors.white38` | sinds #780 | | 3 | `Colors.red.shade700` | wás er niet | | 4 | `surface: Colors.white` | wás er niet | Route 3 was goed voor vijftien plekken, en bijna elke vindplaats was de *foutkant* van een switch waarvan de waarschuwingskant al een mode-afhankelijk token had — `result.isValid ? AppTheme.warningFg : Colors.red.shade700`, in vier bestanden. De tokenmigratie van #606 heeft die ene tak stelselmatig overgeslagen, en dat is juist de foutmelding. Gemeten 2,68 tot 3,97:1. **Vast wit oppervlak, mode-afhankelijke tekst erop.** Route 4, en de ergste in getal. `MarkdownEditorTheme.editorPanel` schilderde het notitieveld op `Colors.white`, terwijl de tekst mode-afhankelijk binnenkomt (licht in donkere modus). Het veld werd een wit vlak met lichte tekst: **1,1:1** voor de tekst, **1,4:1** voor de werkbalkiconen. Dezelfde fout op de opslagkaart in de instellingen: lichte inkt op een witte `Material`, 1,7 tot 3,0:1. ## Wat er gemeten en gerepareerd is - **Route 3:** de syntaxfoutregel en de gutter van de Markdown-editor, de oefenrun-samenvatting, de exportdialoog en zijn kwaliteitssectie, het verwijder-item in het slide-menu, de TeX-terugval op een dia (die krijgt een vást token — een dia rendert in een export-isolate), twee bladeraar-iconen en de intrekken-knop in de privacy-instellingen. - **Route 4:** het notitieveld (`editorPanel` → `AppTheme.paper`) en de opslagkaart (`Material` → `paper`, plus de "niet getest"-status van vaste `amber700` naar `warningFg`). Draaiend gezien: de foutregel, de gebalkte notitiewerkbalk (die was een wit vlak middenin de donkere interface) en het notitieveld met leesbare amber-tekst. ## Poorten - Route 3 → een bronwacht in `app_theme_contrast_test` naast de bestaande op vaste merkkleuren: geen kale Material-kleur (`red`, `green`, `grey`, …) als tekst of icoon. Vullingen mogen — daar draagt het label het contrast. - Route 4 → `markdown_editor_theme_contrast_test`: het paar per notitieblok in beide modi, plus een bronwacht op `surface: Colors.white` in die factory. Beide bronwachten zijn één keer rood gezien door een vindplaats terug te zetten; de rekensommen reproduceren 1,37:1 en 2,94:1. **Geen algemene "vast wit oppervlak"-poort.** Die laat zich niet schrijven zonder de vele terechte gevallen (wit label op een gekleurde vulling) mee te vangen. De twee instanties hier zijn per stuk gemeten; de rest van die klasse is wat de rondgang met eigen ogen moet vinden — daarvoor is #821 een rondgang en geen grep. ## Nog niet af De rondgang zelf is niet klaar. Wat nog niet met eigen ogen bekeken is: het beamerscherm en het tweede-schermpad, de bevindingkaarten met hun ernstbanden, en de meeste slide-editors op rij. Ik heb de statisch vindbare klassen weggewerkt; de overige oppervlakken blijven werk, en #821 blijft daarvoor open met een reactie die opsomt wat nog staat. ## Poorten (mechanisch) `make check` groen, `make test-golden` groen, `make check-secrets` en `make sast` groen. Bewaker overgeslagen, expliciet: geen bestandsformaat, opslag, afhankelijkheid, uitgaand verkeer of publieke belofte geraakt — enkel kleurtokens en twee toetsen. Refs #821
De tweede ronde door de donkere modus begon bij de oppervlakken die #780 niet
bekeken heeft, en liep meteen op een derde ontsnappingsroute vast. Er zijn
drie manieren om een kleur op te schrijven die niemand meet:

  1. `Color(0xFF…)`        — `check_conventions`, basislijn nul.
  2. `Colors.white38`      — bewaakt sinds #780.
  3. `Colors.red.shade700` — stond nergens op.

De derde was goed voor vijftien plekken, en het patroon is eenduidig: bijna
elke vindplaats is de **foutkant** van een ernst-switch waarvan de
waarschuwingskant al lang een mode-afhankelijk token had. Letterlijk, in vier
bestanden:

    result.isValid ? AppTheme.warningFg : Colors.red.shade700

De tokenmigratie van #606 heeft die ene tak stelselmatig overgeslagen — en
juist die tak is de foutmelding, het pad dat je leest als er al iets mis is.

Gemeten:

  red.shade700   op een donkere dialoog (#1E293B)   2,94 : 1
  green.shade700 op een donkere dialoog             3,55 : 1
  green.shade700 in lichte modus                    4,12 : 1
  Colors.red     als tekst, beide modi              3,68-3,97 : 1
  Colors.green   als icoon, lichte modus            2,78 : 1
  grey.shade500  als icoon, lichte modus            2,68 : 1
  wit op Colors.red[600] (knopvulling)              4,23 : 1

Geraakt: de syntaxfoutregel en de gutter van de Markdown-editor, de
oefenrun-samenvatting, de exportdialoog en zijn kwaliteitssectie, het
verwijder-item in het slide-menu, de TeX-terugval op een dia, twee
bladeraar-iconen en de intrekken-knop in de privacy-instellingen.

Twee keuzes die geen kleurwissel zijn:

  * De TeX-terugval in `text_previews.dart` krijgt `danger700` en géén
    `dangerFg`: dat rendert op een dia, en een dia rendert in een
    export-isolate waar `AppTheme.isDark` niet bestaat (PENTEST_MIAUW §11).
  * De drie overgebleven Material-kleuren zijn vullingen — twee
    onopgeslagen-stipjes en een snackbar — en die halen hun lat ruim
    (4,98 tot 9,42:1). Ze blijven staan; de poort gaat dan ook over tekst en
    iconen, niet over vullingen. Zakt er ooit een onder, dan is dat een
    meting en geen naamregel.

De poort staat in `app_theme_contrast_test`, naast de bestaande bronwacht op
vaste merkkleuren — zelfde regel, andere spelling. Eén keer rood gezien door
één vindplaats terug te zetten.

Refs #821

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
De vierde ontsnappingsroute, en de ergste in getal. Er zijn er nu vier:

  1. Color(0xFF…)          — check_conventions, basislijn nul.
  2. Colors.white38        — bewaakt sinds #780.
  3. Colors.red.shade700   — bewaakt sinds de vorige commit.
  4. surface: Colors.white — deze. Een vast wit *oppervlak*.

`MarkdownEditorTheme.editorPanel` bouwt de chrome van het notitieveld: de
gebalkte werkbalk en de tekst erin. De achtergrond stond vast op
`Colors.white`, terwijl tekst en iconen mode-afhankelijk binnenkomen
(`notesText`/`userNotesText`, in donkere modus juist licht). Gevolg in
donkere modus: lichte tekst op een wit vlak.

  notitietekst op de veldachtergrond   1,10 : 1
  werkbalkiconen                       1,37 : 1

Draaiend gezien: een witte balk met knoppen middenin een verder donkere
interface, met de uitgeschakelde H1/H2/H3 vrijwel onzichtbaar.

`surface` volgt nu het thema via `AppTheme.paper` — dezelfde tint als de
`fillColor` van het veld eronder, dus de werkbalk hoort weer bij de rest. De
lichte tekst leest daarmee op ~15:1 en de iconen op 9:1. De zusterfactory
`presenterOverlay` deed dit al goed met een luminantietoets; deze bleef
achter.

Wat er níet in zit: de hint-tekst (placeholder) staat op `text` @45%, en die
haalt in *lichte* modus 2,3:1 — maar dat is bestaand gedrag in beide modi en
placeholder-alpha raakt licht net zo hard als donker. Dat is een eigen
afweging (hoort een placeholder de bodytekst-lat te halen?) en geen
donkere-modus-bug; buiten deze ronde. De oppervlaktefix tilt de hint in
donkere modus wel mee van 1,1 naar 3,5:1.

Bewaakt door `markdown_editor_theme_contrast_test`: het paar per notitieblok
in beide modi, plus een bronwacht op `surface: Colors.white` in deze factory.
Beide één keer rood gezien — de rekensom reproduceert 1,37:1.

Refs #821

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
fix(a11y): de opslagkaart was ook een wit vlak, en zijn statusregel bleef vast (#821)
All checks were successful
scans / scans (pull_request) Successful in 3m21s
55d2440563
Zelfde klasse als het notitieveld: een `Material` met een vaste witte
achtergrond, terwijl de icoon- en statuskleuren erop mode-afhankelijk zijn.
In donkere modus stond de lichte inkt op wit:

  sleep-/verbindingsicoon (slate400/500)   3,0 / 2,1 : 1
  status "getest" (tealFg)                 1,7 : 1

`paper` in plaats van vast wit lost dat op — de SwitchListTile-inkt op deze
Material volgt vanzelf het thema, dus de reden dat het een `Material` moest
zijn blijft overeind. Op `paper` leest de inkt weer op 5,7 tot 10,2:1.

Eén regel die op de nieuwe achtergrond alsnog zakte: de status "niet getest"
gebruikte de vaste `amber700` (3,43:1 op donker paper). Die volgt nu
`warningFg`, net als elke andere waarschuwingstekst — 11,96 in donker, 7,09
in licht.

Het is dezelfde vorm als de vorige commit; een algemene bronwacht op "vast
wit oppervlak" laat zich niet schrijven zonder de vele terechte gevallen
(wit label op een gekleurde vulling) mee te vangen. Deze twee zijn per stuk
gemeten, en de rest van deze klasse is wat de rondgang met eigen ogen moet
vinden — dat is waarvoor #821 een rondgang is en geen grep.

Refs #821

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
brenno merged commit 33ad934bbf into main 2026-07-24 21:03:51 +00:00
Sign in to join this conversation.
No description provided.