De donkere modus is nooit als geheel bekeken — vier defecten op één dag, drie ongemeld #780

Closed
opened 2026-07-23 22:36:35 +00:00 by brenno · 3 comments
Owner

Aanleiding

Op 23-07-2026 kwam er één melding binnen: het logo is in donkere modus een wit
vlak (#735). Bij het narekenen daarvan rolden er nog drie defecten uit, geen
ervan gemeld, allemaal in dezelfde modus:

Gevonden bij Was
Logo als wit vlak (#735) de melding ondoorzichtige asset
Tekstknoppen en links (#744 A) het toestemmingsscherm bekijken 1,21 : 1
Vinkje in een aangevinkt vakje (#744 B) de vorige narekenen 1,35 : 1
Label op de opslaan-knop (#750) de meting van #750 draaien 2,54 : 1

Vier defecten in één dag, waarvan er één was gemeld. De andere drie stonden er
al die tijd, in schermen die iedereen elke dag ziet — het toestemmingsscherm is
zelfs het eerste dat een nieuwe gebruiker moet passeren.

Ze zijn alle vier gerepareerd en er staan toetsen op. Dit issue gaat niet over
die vier
, maar over wat de vondst zegt: de donkere modus is nooit als geheel
bekeken. Elke vondst kwam voort uit toevallig ergens kijken, en elke keer dat ik
keek was er iets.

Waarom tests dit niet afvangen

De vier defecten hadden één ding gemeen: de code deed precies wat er stond.

  • #735 zat in een PNG, niet in Dart. Geen widgettest kijkt in pixels.
  • #744 kwam doordat Material een kleur invult die niemand kiest — er stond geen
    textButtonTheme, dus er was geen regel om fout te hebben.
  • #750 was een conditie die klopte voor het geval waarvoor hij geschreven was.

Er is nu wél een contrastpoort die deze klasse dekt (app_theme_contrast_test
meet sinds #750 wat ThemeData uitdeelt, per ingebouwd profiel). Maar die meet
tokens en thema's — niet of een scherm er goed uitziet. Een oppervlak dat zijn
kleuren met de hand schildert, of een asset die niet transparant is, valt er
buiten.

Wat er nog niet bekeken is

Wél nagelopen op 23-07 (draaiend, donkere modus): openscherm,
toestemmingsscherm, instellingen (Algemeen, App-thema, Beveiliging, Over
OciDeck), documentatielezer, licentiepagina.

Niet bekeken, en elk met een reden om er iets te verwachten:

  • Presentatiemodus en presenter-view — eigen palet (PresenterPalette),
    buiten elke contrasttoets. Ook: het beamerscherm en de ink-/annotatielaag.
  • De afbeeldingkiezer (coverflow en grid) — eigen palet, buiten elke toets;
    daar zit al een gemeten hint op 3,31:1.
  • De cockpit — eigen kleurschema's, en de gebruiker kan ze bewerken.
  • De 26 slide-editors — met name de tabel-, grafiek- en vraageditors, die
    veel eigen chrome hebben.
  • Het kwaliteits- en privacypaneel, de bevindingkaarten met hun ernstbanden.
  • De exportdialoog en de voortgangsmelding.
  • De git-panelen en de bladeraars (git/S3/WebDAV).
  • De diavoorbeelden zelf — die horen juist niet mee te bewegen (een dia is
    een wit canvas); waard om te bevestigen dat dat nog klopt.

Voorstel

Eén ronde: de app draaien in het profiel Donker en elk oppervlak hierboven met
eigen ogen langs. Per bevinding een regel met een schermafdruk en, waar het om
kleur gaat, de gemeten verhouding — niet "ziet er donker uit" maar een getal.

Wat eruit komt, komt eruit; de uitkomst kan ook "niets gevonden" zijn. Dat is
dan óók een resultaat, want dan is de rondgang zelf het bewijs dat er geen
tweede laag onder ligt.

Twee dingen die de ronde moet opleveren behalve bevindingen:

  1. Welke oppervlakken een toets kunnen krijgen in plaats van een tweede
    rondgang over een halfjaar. Alles wat via ThemeData gaat is te meten; wat
    met de hand geschilderd wordt, is dat pas na het onder een palet te brengen.
  2. Of het lichte thema hetzelfde probleem heeft. Alle vier de vondsten van
    vandaag waren donker-specifiek, maar dat komt doordat ik in donkere modus
    keek. De omgekeerde rondgang is nooit gedaan.

De skill beeldkeuring beschrijft de route die werkt (flutter run -d macos +
computer-use); het browserpaneel kan CanvasKit niet aansturen.

Kosten

Een dag voor de rondgang zelf. De reparaties komen daarbovenop en zijn pas te
schatten als bekend is wat eruit komt — als vandaag maatgevend is, is dat niet
weinig.

Suggestie voor de volgorde: presentatiemodus eerst. Dat is het oppervlak waar
een fout het duurst is, want daar staat iemand voor een zaal.

## Aanleiding Op 23-07-2026 kwam er één melding binnen: het logo is in donkere modus een wit vlak (#735). Bij het narekenen daarvan rolden er nog drie defecten uit, geen ervan gemeld, allemaal in dezelfde modus: | | Gevonden bij | Was | |---|---|---| | Logo als wit vlak (#735) | de melding | ondoorzichtige asset | | Tekstknoppen en links (#744 A) | het toestemmingsscherm bekijken | **1,21 : 1** | | Vinkje in een aangevinkt vakje (#744 B) | de vorige narekenen | **1,35 : 1** | | Label op de opslaan-knop (#750) | de meting van #750 draaien | **2,54 : 1** | Vier defecten in één dag, waarvan er één was gemeld. De andere drie stonden er al die tijd, in schermen die iedereen elke dag ziet — het toestemmingsscherm is zelfs het eerste dat een nieuwe gebruiker moet passeren. Ze zijn alle vier gerepareerd en er staan toetsen op. **Dit issue gaat niet over die vier**, maar over wat de vondst zegt: de donkere modus is nooit als geheel bekeken. Elke vondst kwam voort uit toevallig ergens kijken, en elke keer dat ik keek was er iets. ## Waarom tests dit niet afvangen De vier defecten hadden één ding gemeen: **de code deed precies wat er stond.** - #735 zat in een PNG, niet in Dart. Geen widgettest kijkt in pixels. - #744 kwam doordat Material een kleur invult die niemand kiest — er stond geen `textButtonTheme`, dus er was geen regel om fout te hebben. - #750 was een conditie die klopte voor het geval waarvoor hij geschreven was. Er is nu wél een contrastpoort die deze klasse dekt (`app_theme_contrast_test` meet sinds #750 wat `ThemeData` uitdeelt, per ingebouwd profiel). Maar die meet tokens en thema's — niet of een scherm er goed uitziet. Een oppervlak dat zijn kleuren met de hand schildert, of een asset die niet transparant is, valt er buiten. ## Wat er nog niet bekeken is Wél nagelopen op 23-07 (draaiend, donkere modus): openscherm, toestemmingsscherm, instellingen (Algemeen, App-thema, Beveiliging, Over OciDeck), documentatielezer, licentiepagina. Niet bekeken, en elk met een reden om er iets te verwachten: - **Presentatiemodus en presenter-view** — eigen palet (`PresenterPalette`), buiten elke contrasttoets. Ook: het beamerscherm en de ink-/annotatielaag. - **De afbeeldingkiezer** (coverflow en grid) — eigen palet, buiten elke toets; daar zit al een gemeten hint op 3,31:1. - **De cockpit** — eigen kleurschema's, en de gebruiker kan ze bewerken. - **De 26 slide-editors** — met name de tabel-, grafiek- en vraageditors, die veel eigen chrome hebben. - **Het kwaliteits- en privacypaneel**, de bevindingkaarten met hun ernstbanden. - **De exportdialoog en de voortgangsmelding.** - **De git-panelen en de bladeraars** (git/S3/WebDAV). - **De diavoorbeelden zelf** — die horen juist *niet* mee te bewegen (een dia is een wit canvas); waard om te bevestigen dat dat nog klopt. ## Voorstel Eén ronde: de app draaien in het profiel *Donker* en elk oppervlak hierboven met eigen ogen langs. Per bevinding een regel met een schermafdruk en, waar het om kleur gaat, de gemeten verhouding — niet "ziet er donker uit" maar een getal. Wat eruit komt, komt eruit; de uitkomst kan ook "niets gevonden" zijn. Dat is dan óók een resultaat, want dan is de rondgang zelf het bewijs dat er geen tweede laag onder ligt. Twee dingen die de ronde moet opleveren behalve bevindingen: 1. **Welke oppervlakken een toets kunnen krijgen** in plaats van een tweede rondgang over een halfjaar. Alles wat via `ThemeData` gaat is te meten; wat met de hand geschilderd wordt, is dat pas na het onder een palet te brengen. 2. **Of het lichte thema hetzelfde probleem heeft.** Alle vier de vondsten van vandaag waren donker-specifiek, maar dat komt doordat ik in donkere modus keek. De omgekeerde rondgang is nooit gedaan. De skill `beeldkeuring` beschrijft de route die werkt (`flutter run -d macos` + computer-use); het browserpaneel kan CanvasKit niet aansturen. ## Kosten Een dag voor de rondgang zelf. De reparaties komen daarbovenop en zijn pas te schatten als bekend is wat eruit komt — als vandaag maatgevend is, is dat niet weinig. Suggestie voor de volgorde: presentatiemodus eerst. Dat is het oppervlak waar een fout het duurst is, want daar staat iemand voor een zaal.
Author
Owner

Opgepakt. Tak: chore/donkere-modus-rondgang-780. Reikwijdte: eerst een rondgang met de app draaiend in het profiel Donker over de oppervlakken uit de lijst; per bevinding een aparte reparatie met test. Verwacht geraakt: lib/theme/, lib/widgets/presenter*, lib/widgets/image_picker*, lib/widgets/cockpit*, test/contrast.

Opgepakt. Tak: chore/donkere-modus-rondgang-780. Reikwijdte: eerst een rondgang met de app draaiend in het profiel *Donker* over de oppervlakken uit de lijst; per bevinding een aparte reparatie met test. Verwacht geraakt: lib/theme/, lib/widgets/presenter*, lib/widgets/image_picker*, lib/widgets/cockpit*, test/*contrast*.
Author
Owner

De rondgang

App draaiend (flutter run -d macos), profiel Donker, elk oppervlak met
eigen ogen langs. De verhoudingen hieronder zijn nagerekend op de tokens die
de betreffende regel werkelijk schildert, niet geschat uit een schermafdruk.

Nagelopen: openscherm · nieuwe-presentatiedialoog met sjabloonkiezer en
leegstaat · editor (slidestrook, slidetype-kiezer, kwaliteitspaneel,
sprekers- en gebruikersnotities, statusbalk) · cockpit-editor ·
afbeeldingkiezer (leegstaat, voorbeeldkolom, voettekst) · presentatiemodus
(dia, overlaybalk, toetsenlegenda) · presenter-view (klok, timers,
volgende-dia, notities, sneltoetsbalk) · slide-overzicht · annotatiebalk ·
opslaan-dialoog · Instellingen (Algemeen, App-thema) · de diavoorbeelden.

Niet gehaald, dus nog steeds onbekeken: het beamerscherm en het
tweede-schermpad, de git-panelen en de S3/WebDAV-bladeraars, de exportdialoog
met zijn voortgangsmelding, het privacypaneel met de bevindingkaarten en hun
ernstbanden, en 24 van de 26 slide-editors (alleen cockpit en bullets zijn
bekeken). Die staan er nog.

Uitkomst: niet "niets gevonden". Elf bevindingen, en de vermoedens uit het
issue klopten alle drie — de presentatiemodus, de afbeeldingkiezer en de
diavoorbeelden gedroegen zich precies zoals voorspeld. De diavoorbeelden in
de goede zin: die bewegen inderdaad niet mee, en dat is bevestigd.

Bevindingen

Presentatiemodus en presenter-view — tien plekken onder de lat

was gemeten waar
Colors.white24 2,06–2,21 : 1 de sneltoetsbalk in presenter-view (11px); de "–:––" van Resterend; de ring om een niet-gekozen inkkleur
Colors.white30 2,61–2,71 : 1 de afsluitregel van de toetsenlegenda (12px); "Geen notities voor deze slide" (14px)
Colors.white38 3,43–3,60 : 1 de ondertitel van het slide-overzicht; de kolomkoppen en de timerlabels; de paginateller in de notitiekolom; "Einde van de presentatie"; en twee timer-iconen

Acht tekstplekken, twee iconen, plus de inkring. Colors.white54 (5,4–6,0:1 —
het slidenummer, de voortgangsbalk) haalde de lat wél en is meegegaan om één
tweede niveau over te houden in plaats van vier dekkingen.

Twee doen extra pijn. Die sneltoetsbalk is de énige uitleg die een presentator
tijdens een presentatie op het scherm heeft. En de zwarte inkkleur in de
annotatiebalk is alleen aan die ring te herkennen — de vulling zelf is 1,4:1
tegen de balk, dus zonder ring is het geen keuze maar een gat.

Afbeeldingkiezer — drie kleuren en een layoutfout

gemeten was
Sneltoetshint in de voettekst 2,28 : 1 borderStrong — een randkleur als tekst
Bijschrift, zoekhint, metaregel 3,31 : 1 textDim (de hint die het issue al noemde)
Uitleg leegstaat, plaatshouder voorbeeldkolom 4,12 / 4,24 : 1 textDim

Plus een layoutdefect op dezelfde regel: die sneltoetshint kortte in tot
"Dubbelklik s…" terwijl er 400px leegte naast stond. Flexible en Spacer
hebben elk flex 1 en deelden de vrije ruimte.

De textDim-regels zijn onderweg door #779 opgelost. Terwijl deze ronde
liep, splitste die issue hetzelfde token op in iconDim (3:1, iconen) en
textMuted (4,5:1, tekst) — een betere uitkomst dan het niveau schrappen,
zoals ik het had gedaan, dus die is bij het rebasen overgenomen. Wat er van
deze kant overbleef zijn de eerste regel en de inkorting; die stonden er nog.
En de toetsen zijn samengevoegd in plaats van naast elkaar gezet: twee
bestanden die dezelfde twee paletten meten is precies de verdubbeling waar
dat bestand zelf voor waarschuwt.

Kwaliteitspaneel — twee, en hier is het lichte thema erger

De drie regels per controle stonden op 100, 85 en 70 procent van dezelfde
voorgrondkleur:

                        100%    85%    70%
  donker  fout          6,11   4,79   3,68
  licht   geen probl.   5,21   3,93   2,99
  licht   fout          5,30   4,31   3,35
  licht   waarschuwing  6,37   4,64   3,38
  licht   informatief   6,96   4,83   3,44

In donkere modus zakt alléén de foutstaat. In het lichte thema zakken alle
vier de staten op 70%, en de succesregel al op 85%. Uitgerekend in het paneel
dat de gebruiker over contrast vertelt.

De tweede: na het wisselen van app-thema bleef dit paneel in de kleuren van
het vórige thema staan.
Donkergroen op een lichte interface. Een andere dia
kiezen hielp niet, in- en uitklappen hielp niet; alleen een herstart.

Dat paneel is gerepareerd, de klasse niet — zie hieronder.

Dia — de drie mediaplaatshouders

"Bestand niet gevonden", "Online media staat uit" en de URL eronder staan op
2,08 : 1slideInkFaint op slideRuleSoft. De tabellen in
app_theme_contrast_test meten dia-inkt tegen wit, en op wit haalt dat token
4,4:1; deze plaatshouders vullen hun eigen vlak met een grijstint en daar valt
het om.

Dat is niet decoratief: het is het enige wat vertelt waarom er een grijs vlak
op je dia staat, en het reist mee de export in. Mode-onafhankelijk, dus dit
stond er in het lichte thema net zo goed.

Zwevende veldlabels — apart gezet

Een harde rand dwars door elk zwevend veldlabel in donkere modus. Geen
contrastdefect maar een straddle over de overgang schermachtergrond/veldvulling,
en de reparatie vraagt een ontwerpkeuze die élk tekstveld raakt. Uitgeschreven
in #811.

Wat het zegt

De vier defecten van 23-07 hadden gemeen dat de code deed wat er stond. Deze
elf hebben iets scherpers gemeen: de twee poorten die deze klasse
dekken, kunnen deze regels niet zien.

  • De ruwe-kleur-ratchet in check_conventions staat op nul en telt
    Color(0x…)-literals. Colors.white38 is dezelfde vrijheid met dezelfde
    gevolgen en matcht die regex niet. Alle tien de presenter-plekken kwamen
    daar vandaan. En aan white38 valt op de aanroepplek niet te zíen dat het
    3,5:1 wordt — dát is het bezwaar, niet dat 38 toevallig te weinig is.
  • app_theme_contrast_test meet wat ThemeData uitdeelt, en meet dia-inkt
    tegen wit. Het meet niet wélke twee tokens samen op het scherm landen, niet
    de verzwakking van een token, en niet een tint die een oppervlak zelf
    aanmaakt. Een palet met louter goede kleuren zegt niets: het defect zit in
    de combinatie. slideInkFaint haalt 4,4:1 op wit en 2,08:1 op
    slideRuleSoft — hetzelfde token, en alleen het paar verraadt het.

Opbrengst 1 — welke oppervlakken een toets kunnen krijgen

Alle drie, en ze staan er nu:

  • test/standalone_palette_contrast_test.dart — het bestand dat #779
    aanmaakte, uitgebreid met PresenterPalette.textMuted (dat token bestond
    toen nog niet), met de inkring gemeten tegen de annotatiebalk op een witte
    dia (een oppervlak dat in geen enkele lijst staat, en het krapste geval), en
    met een bronwacht op een doorzichtige Colors.white/black in een
    TextStyle. Die grens is bewust TextStyle en niet elke color:: een
    vulling, een schaduw of een scrim draagt geen letters, en daar is een
    doorzichtig zwart juist het goede gereedschap.
  • test/slide_quality_panel_contrast_test.dart — het paar per staat, in
    beide modi, plus een bronwacht die verbiedt dat er nog een alpha over de
    voorgrond komt.
  • test/appearance_scope_test.dart — de themawisseling, plus een
    bronwacht die bewaakt dat het paneel en zijn chip aangesloten blijven.
  • test/app_theme_contrast_test.dart — uitgebreid met dia-inkt op een
    eigen tint in plaats van alleen op wit, plus een bronwacht op het token dat
    daar 2,08:1 haalt.

Beide helften van elke toets zijn één keer rood gezien; de parentabel
reproduceert 3,31, 4,12 en 4,24 uit dit issue.

Twee structurele dingen bleken uit het paletwerk zelf, en die zijn belangrijker
dan de kleuren: ImagePickerPalette.textDim is opgeheven in plaats van
opgehoogd
, en het derde tekstniveau dat de presenter met vier verschillende
alpha's improviseerde is er níet gekomen. Op die oppervlakken is het tweede
niveau al de dunste grijstint die 4,5:1 haalt. Een niveau daaronder kán geen
tekst zijn, en zolang het bestaat wordt het gebruikt.

Opbrengst 2 — heeft het lichte thema hetzelfde probleem?

Ja, en op één plek erger. De omgekeerde rondgang is niet overbodig.

  • Het kwaliteitspaneel: donker zakt één staat, licht zakt alle vier (tabel
    hierboven). Dat de vier vondsten van 23-07 donker-specifiek waren, kwam
    inderdaad doordat er in donkere modus gekeken werd.
  • De plaatshouder van 2,08:1 staat er in beide thema's.
  • De veldlabels van #811 straddelen in beide thema's; alleen in het lichte
    liggen de twee kleuren zo dicht bij elkaar dat je het niet ziet. Dat is
    geen "licht is in orde" maar "licht verbergt het".
  • De twee vast-donkere oppervlakken kennen geen lichte variant: daar is geen
    tweede modus die het goedmaakt, en dat is precies waarom ze zo lang
    ongezien konden blijven.

Eén reparatie die niet mocht blijven staan

De themawissel-bevinding is een klasse: AppTheme.isDark is een statische
vlag, dus élke widget die zich daaruit kleurt en niet van Theme.of(context)
afhangt houdt de vorige kleuren vast. De klasse in één klap sluiten leek
simpel — geef de boom onder home: een sleutel op de modus — en die versie
stond een uur in de tak met een groene toets eronder.

Draaiend viel de app om:

ProviderException: Tried to use DeckNotifier after `dispose` was called
#33 _TabContent.build (shell/tab_bar.dart:202)

De deck-providers hangen aan het tabblad. Die boom afbreken disposet
DeckNotifier — en erger dan de crash is wat eraan voorafgaat: dat is het
niet-opgeslagen deck van de gebruiker. De toets bewees dat een blad
herkleurt; hij kon niet bewijzen dat de app het overleeft. Dáár is het
draaien voor.

Wat er nu staat is de bescheiden variant: de modus in een InheritedWidget,
en één regel per oppervlak dat erop aansluit. Het kwaliteitspaneel heeft die
regel; de rest van de app niet. De klasse staat dus nog open, met de
diagnose en de drie routes in #814 — inclusief waarom de voor de hand
liggende route niet kan zolang de deckstaat aan het tabblad hangt.

Reparaties

Zeven commits, met de reden en de gemeten waarde in de tekst. Wat níet in deze
ronde zit: de vijf oppervlakken hierboven onder "niet gehaald", #811, en de
klasse uit #814.


Uitgewerkt in #817. Twee dingen die eruit zijn gekomen en apart staan: #811 (zwevende veldlabels) en #814 (de themawissel-klasse).

## De rondgang App draaiend (`flutter run -d macos`), profiel *Donker*, elk oppervlak met eigen ogen langs. De verhoudingen hieronder zijn nagerekend op de tokens die de betreffende regel werkelijk schildert, niet geschat uit een schermafdruk. **Nagelopen:** openscherm · nieuwe-presentatiedialoog met sjabloonkiezer en leegstaat · editor (slidestrook, slidetype-kiezer, kwaliteitspaneel, sprekers- en gebruikersnotities, statusbalk) · cockpit-editor · afbeeldingkiezer (leegstaat, voorbeeldkolom, voettekst) · presentatiemodus (dia, overlaybalk, toetsenlegenda) · presenter-view (klok, timers, volgende-dia, notities, sneltoetsbalk) · slide-overzicht · annotatiebalk · opslaan-dialoog · Instellingen (Algemeen, App-thema) · de diavoorbeelden. **Niet gehaald, dus nog steeds onbekeken:** het beamerscherm en het tweede-schermpad, de git-panelen en de S3/WebDAV-bladeraars, de exportdialoog met zijn voortgangsmelding, het privacypaneel met de bevindingkaarten en hun ernstbanden, en 24 van de 26 slide-editors (alleen cockpit en bullets zijn bekeken). Die staan er nog. **Uitkomst: niet "niets gevonden".** Elf bevindingen, en de vermoedens uit het issue klopten alle drie — de presentatiemodus, de afbeeldingkiezer en de diavoorbeelden gedroegen zich precies zoals voorspeld. De diavoorbeelden in de goede zin: die bewegen inderdaad niet mee, en dat is bevestigd. ## Bevindingen ### Presentatiemodus en presenter-view — tien plekken onder de lat | was | gemeten | waar | |---|---|---| | `Colors.white24` | **2,06–2,21 : 1** | de sneltoetsbalk in presenter-view (11px); de "–:––" van *Resterend*; de ring om een niet-gekozen inkkleur | | `Colors.white30` | **2,61–2,71 : 1** | de afsluitregel van de toetsenlegenda (12px); "Geen notities voor deze slide" (14px) | | `Colors.white38` | **3,43–3,60 : 1** | de ondertitel van het slide-overzicht; de kolomkoppen en de timerlabels; de paginateller in de notitiekolom; "Einde van de presentatie"; en twee timer-iconen | Acht tekstplekken, twee iconen, plus de inkring. `Colors.white54` (5,4–6,0:1 — het slidenummer, de voortgangsbalk) haalde de lat wél en is meegegaan om één tweede niveau over te houden in plaats van vier dekkingen. Twee doen extra pijn. Die sneltoetsbalk is de énige uitleg die een presentator tijdens een presentatie op het scherm heeft. En de zwarte inkkleur in de annotatiebalk is *alleen* aan die ring te herkennen — de vulling zelf is 1,4:1 tegen de balk, dus zonder ring is het geen keuze maar een gat. ### Afbeeldingkiezer — drie kleuren en een layoutfout | | gemeten | was | |---|---|---| | Sneltoetshint in de voettekst | **2,28 : 1** | `borderStrong` — een *rand*kleur als tekst | | Bijschrift, zoekhint, metaregel | **3,31 : 1** | `textDim` (de hint die het issue al noemde) | | Uitleg leegstaat, plaatshouder voorbeeldkolom | **4,12 / 4,24 : 1** | `textDim` | Plus een layoutdefect op dezelfde regel: die sneltoetshint kortte in tot "Dubbelklik s…" terwijl er 400px leegte naast stond. `Flexible` en `Spacer` hebben elk flex 1 en deelden de vrije ruimte. **De `textDim`-regels zijn onderweg door #779 opgelost.** Terwijl deze ronde liep, splitste die issue hetzelfde token op in `iconDim` (3:1, iconen) en `textMuted` (4,5:1, tekst) — een betere uitkomst dan het niveau schrappen, zoals ik het had gedaan, dus die is bij het rebasen overgenomen. Wat er van deze kant overbleef zijn de eerste regel en de inkorting; die stonden er nog. En de toetsen zijn samengevoegd in plaats van naast elkaar gezet: twee bestanden die dezelfde twee paletten meten is precies de verdubbeling waar dat bestand zelf voor waarschuwt. ### Kwaliteitspaneel — twee, en hier is het lichte thema erger De drie regels per controle stonden op 100, 85 en 70 procent van dezelfde voorgrondkleur: ``` 100% 85% 70% donker fout 6,11 4,79 3,68 licht geen probl. 5,21 3,93 2,99 licht fout 5,30 4,31 3,35 licht waarschuwing 6,37 4,64 3,38 licht informatief 6,96 4,83 3,44 ``` In donkere modus zakt alléén de foutstaat. In het lichte thema zakken alle vier de staten op 70%, en de succesregel al op 85%. Uitgerekend in het paneel dat de gebruiker over contrast vertelt. De tweede: **na het wisselen van app-thema bleef dit paneel in de kleuren van het vórige thema staan.** Donkergroen op een lichte interface. Een andere dia kiezen hielp niet, in- en uitklappen hielp niet; alleen een herstart. Dat paneel is gerepareerd, de klasse niet — zie hieronder. ### Dia — de drie mediaplaatshouders "Bestand niet gevonden", "Online media staat uit" en de URL eronder staan op **2,08 : 1** — `slideInkFaint` op `slideRuleSoft`. De tabellen in `app_theme_contrast_test` meten dia-inkt tegen wit, en op wit haalt dat token 4,4:1; deze plaatshouders vullen hun eigen vlak met een grijstint en daar valt het om. Dat is niet decoratief: het is het enige wat vertelt waarom er een grijs vlak op je dia staat, en het reist mee de export in. Mode-onafhankelijk, dus dit stond er in het lichte thema net zo goed. ### Zwevende veldlabels — apart gezet Een harde rand dwars door elk zwevend veldlabel in donkere modus. Geen contrastdefect maar een straddle over de overgang schermachtergrond/veldvulling, en de reparatie vraagt een ontwerpkeuze die élk tekstveld raakt. Uitgeschreven in #811. ## Wat het zegt De vier defecten van 23-07 hadden gemeen dat de code deed wat er stond. Deze elf hebben iets scherpers gemeen: **de twee poorten die deze klasse dekken, kunnen deze regels niet zien.** * De ruwe-kleur-ratchet in `check_conventions` staat op nul en telt `Color(0x…)`-literals. `Colors.white38` is dezelfde vrijheid met dezelfde gevolgen en matcht die regex niet. Alle tien de presenter-plekken kwamen daar vandaan. En aan `white38` valt op de aanroepplek niet te zíen dat het 3,5:1 wordt — dát is het bezwaar, niet dat 38 toevallig te weinig is. * `app_theme_contrast_test` meet wat `ThemeData` uitdeelt, en meet dia-inkt tegen wit. Het meet niet wélke twee tokens samen op het scherm landen, niet de verzwakking van een token, en niet een tint die een oppervlak zelf aanmaakt. Een palet met louter goede kleuren zegt niets: het defect zit in de combinatie. `slideInkFaint` haalt 4,4:1 op wit en 2,08:1 op `slideRuleSoft` — hetzelfde token, en alleen het paar verraadt het. ## Opbrengst 1 — welke oppervlakken een toets kunnen krijgen Alle drie, en ze staan er nu: * **`test/standalone_palette_contrast_test.dart`** — het bestand dat #779 aanmaakte, uitgebreid met `PresenterPalette.textMuted` (dat token bestond toen nog niet), met de inkring gemeten tegen de annotatiebalk op een witte dia (een oppervlak dat in geen enkele lijst staat, en het krapste geval), en met een bronwacht op een doorzichtige `Colors.white/black` in een `TextStyle`. Die grens is bewust `TextStyle` en niet elke `color:`: een vulling, een schaduw of een scrim draagt geen letters, en daar is een doorzichtig zwart juist het goede gereedschap. * **`test/slide_quality_panel_contrast_test.dart`** — het paar per staat, in beide modi, plus een bronwacht die verbiedt dat er nog een alpha over de voorgrond komt. * **`test/appearance_scope_test.dart`** — de themawisseling, plus een bronwacht die bewaakt dat het paneel en zijn chip aangesloten blijven. * **`test/app_theme_contrast_test.dart`** — uitgebreid met dia-inkt op een eigen tint in plaats van alleen op wit, plus een bronwacht op het token dat daar 2,08:1 haalt. Beide helften van elke toets zijn één keer rood gezien; de parentabel reproduceert 3,31, 4,12 en 4,24 uit dit issue. Twee structurele dingen bleken uit het paletwerk zelf, en die zijn belangrijker dan de kleuren: **`ImagePickerPalette.textDim` is opgeheven in plaats van opgehoogd**, en het derde tekstniveau dat de presenter met vier verschillende alpha's improviseerde is er níet gekomen. Op die oppervlakken is het tweede niveau al de dunste grijstint die 4,5:1 haalt. Een niveau daaronder kán geen tekst zijn, en zolang het bestaat wordt het gebruikt. ## Opbrengst 2 — heeft het lichte thema hetzelfde probleem? **Ja, en op één plek erger.** De omgekeerde rondgang is niet overbodig. * Het kwaliteitspaneel: donker zakt één staat, licht zakt alle vier (tabel hierboven). Dat de vier vondsten van 23-07 donker-specifiek waren, kwam inderdaad doordat er in donkere modus gekeken werd. * De plaatshouder van 2,08:1 staat er in beide thema's. * De veldlabels van #811 straddelen in beide thema's; alleen in het lichte liggen de twee kleuren zo dicht bij elkaar dat je het niet ziet. Dat is geen "licht is in orde" maar "licht verbergt het". * De twee vast-donkere oppervlakken kennen geen lichte variant: daar is geen tweede modus die het goedmaakt, en dat is precies waarom ze zo lang ongezien konden blijven. ## Eén reparatie die niet mocht blijven staan De themawissel-bevinding is een *klasse*: `AppTheme.isDark` is een statische vlag, dus élke widget die zich daaruit kleurt en niet van `Theme.of(context)` afhangt houdt de vorige kleuren vast. De klasse in één klap sluiten leek simpel — geef de boom onder `home:` een sleutel op de modus — en die versie stond een uur in de tak met een groene toets eronder. Draaiend viel de app om: ``` ProviderException: Tried to use DeckNotifier after `dispose` was called #33 _TabContent.build (shell/tab_bar.dart:202) ``` De deck-providers hangen aan het tabblad. Die boom afbreken disposet `DeckNotifier` — en erger dan de crash is wat eraan voorafgaat: dat is het niet-opgeslagen deck van de gebruiker. De toets bewees dat een blad herkleurt; hij kon niet bewijzen dat de app het overleeft. Dáár is het draaien voor. Wat er nu staat is de bescheiden variant: de modus in een `InheritedWidget`, en één regel per oppervlak dat erop aansluit. Het kwaliteitspaneel heeft die regel; de rest van de app niet. **De klasse staat dus nog open**, met de diagnose en de drie routes in #814 — inclusief waarom de voor de hand liggende route niet kan zolang de deckstaat aan het tabblad hangt. ## Reparaties Zeven commits, met de reden en de gemeten waarde in de tekst. Wat níet in deze ronde zit: de vijf oppervlakken hierboven onder "niet gehaald", #811, en de klasse uit #814. --- Uitgewerkt in #817. Twee dingen die eruit zijn gekomen en apart staan: #811 (zwevende veldlabels) en #814 (de themawissel-klasse).
Author
Owner

Gemerged in ac997733 (PR #817), en op main geverifieerd: de vier contrasttoetsen draaien daar groen, en PresenterPalette.textMuted/outline plus AppearanceScope.modeOf staan erin.

Wat er in zit: de tien plekken in de presentatiemodus, de sneltoetshint van de kiezer en zijn inkorting, de verzwakte voorgrond van het kwaliteitspaneel in beide modi, de drie mediaplaatshouders op een dia, en het paneel dat na een themawissel bleef hangen. Plus de twee poorten die dit niet zagen: een bronwacht op een doorzichtige Colors.white/black in een TextStyle, en de paren van de vast-donkere paletten gemeten in plaats van de tokens.

Wat er níet in zit — dit issue mag daarom dicht, maar de rondgang is niet af:

  • Vijf oppervlakken zijn niet nagelopen: het beamerscherm en het tweede-schermpad, de git-panelen en de S3/WebDAV-bladeraars, de exportdialoog met zijn voortgangsmelding, het privacypaneel met de bevindingkaarten, en 24 van de 26 slide-editors. Dat is geen "waarschijnlijk goed" — het is niet gekeken, en elke keer dat er wél gekeken werd, lag er iets.
  • #811 — zwevende veldlabels straddelen in donkere modus een harde rand.
  • #814 — de klasse achter de themawissel: AppTheme.isDark is een statische vlag, dus élk oppervlak dat zich daaruit kleurt en niet van Theme.of(context) afhangt houdt de vorige kleuren vast. Het kwaliteitspaneel is aangesloten, de rest niet.

Een tweede rondgang over die vijf oppervlakken is dus nog steeds werk dat ligt; wie hem doet, kan de toetsen uit deze ronde als maatlat gebruiken.

Gemerged in `ac997733` (PR #817), en op main geverifieerd: de vier contrasttoetsen draaien daar groen, en `PresenterPalette.textMuted`/`outline` plus `AppearanceScope.modeOf` staan erin. **Wat er in zit:** de tien plekken in de presentatiemodus, de sneltoetshint van de kiezer en zijn inkorting, de verzwakte voorgrond van het kwaliteitspaneel in beide modi, de drie mediaplaatshouders op een dia, en het paneel dat na een themawissel bleef hangen. Plus de twee poorten die dit niet zagen: een bronwacht op een doorzichtige `Colors.white/black` in een `TextStyle`, en de paren van de vast-donkere paletten gemeten in plaats van de tokens. **Wat er níet in zit — dit issue mag daarom dicht, maar de rondgang is niet af:** - **Vijf oppervlakken zijn niet nagelopen:** het beamerscherm en het tweede-schermpad, de git-panelen en de S3/WebDAV-bladeraars, de exportdialoog met zijn voortgangsmelding, het privacypaneel met de bevindingkaarten, en 24 van de 26 slide-editors. Dat is geen "waarschijnlijk goed" — het is niet gekeken, en elke keer dat er wél gekeken werd, lag er iets. - **#811** — zwevende veldlabels straddelen in donkere modus een harde rand. - **#814** — de klasse achter de themawissel: `AppTheme.isDark` is een statische vlag, dus élk oppervlak dat zich daaruit kleurt en niet van `Theme.of(context)` afhangt houdt de vorige kleuren vast. Het kwaliteitspaneel is aangesloten, de rest niet. Een tweede rondgang over die vijf oppervlakken is dus nog steeds werk dat ligt; wie hem doet, kan de toetsen uit deze ronde als maatlat gebruiken.
brenno 2026-07-24 19:43:14 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
LibreKAT/Ocideck#780
No description provided.