De donkere modus is nooit als geheel bekeken — vier defecten op één dag, drie ongemeld #780
Labels
No labels
accepted
bug
declined
docs
duplicate
enhancement
good first issue
in-progress
needs-info
privacy
security
triage
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
LibreKAT/Ocideck#780
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
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:
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.
textButtonTheme, dus er was geen regel om fout te hebben.Er is nu wél een contrastpoort die deze klasse dekt (
app_theme_contrast_testmeet sinds #750 wat
ThemeDatauitdeelt, per ingebouwd profiel). Maar die meettokens 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:
PresenterPalette),buiten elke contrasttoets. Ook: het beamerscherm en de ink-/annotatielaag.
daar zit al een gemeten hint op 3,31:1.
veel eigen chrome hebben.
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:
rondgang over een halfjaar. Alles wat via
ThemeDatagaat is te meten; watmet de hand geschilderd wordt, is dat pas na het onder een palet te brengen.
vandaag waren donker-specifiek, maar dat komt doordat ik in donkere modus
keek. De omgekeerde rondgang is nooit gedaan.
De skill
beeldkeuringbeschrijft 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.
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.
De rondgang
App draaiend (
flutter run -d macos), profiel Donker, elk oppervlak meteigen 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
Colors.white24Colors.white30Colors.white38Acht 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
borderStrong— een randkleur als teksttextDim(de hint die het issue al noemde)textDimPlus een layoutdefect op dezelfde regel: die sneltoetshint kortte in tot
"Dubbelklik s…" terwijl er 400px leegte naast stond.
FlexibleenSpacerhebben elk flex 1 en deelden de vrije ruimte.
De
textDim-regels zijn onderweg door #779 opgelost. Terwijl deze rondeliep, splitste die issue hetzelfde token op in
iconDim(3:1, iconen) entextMuted(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:
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 —
slideInkFaintopslideRuleSoft. De tabellen inapp_theme_contrast_testmeten dia-inkt tegen wit, en op wit haalt dat token4,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.
check_conventionsstaat op nul en teltColor(0x…)-literals.Colors.white38is dezelfde vrijheid met dezelfdegevolgen en matcht die regex niet. Alle tien de presenter-plekken kwamen
daar vandaan. En aan
white38valt op de aanroepplek niet te zíen dat het3,5:1 wordt — dát is het bezwaar, niet dat 38 toevallig te weinig is.
app_theme_contrast_testmeet watThemeDatauitdeelt, en meet dia-inkttegen 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.
slideInkFainthaalt 4,4:1 op wit en 2,08:1 opslideRuleSoft— 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 #779aanmaakte, uitgebreid met
PresenterPalette.textMuted(dat token bestondtoen 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/blackin eenTextStyle. Die grens is bewustTextStyleen niet elkecolor:: eenvulling, 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, inbeide modi, plus een bronwacht die verbiedt dat er nog een alpha over de
voorgrond komt.
test/appearance_scope_test.dart— de themawisseling, plus eenbronwacht die bewaakt dat het paneel en zijn chip aangesloten blijven.
test/app_theme_contrast_test.dart— uitgebreid met dia-inkt op eeneigen 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.textDimis opgeheven in plaats vanopgehoogd, 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.
hierboven). Dat de vier vondsten van 23-07 donker-specifiek waren, kwam
inderdaad doordat er in donkere modus gekeken werd.
liggen de twee kleuren zo dicht bij elkaar dat je het niet ziet. Dat is
geen "licht is in orde" maar "licht verbergt het".
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.isDarkis een statischevlag, 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 versiestond een uur in de tak met een groene toets eronder.
Draaiend viel de app om:
De deck-providers hangen aan het tabblad. Die boom afbreken disposet
DeckNotifier— en erger dan de crash is wat eraan voorafgaat: dat is hetniet-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).
Gemerged in
ac997733(PR #817), en op main geverifieerd: de vier contrasttoetsen draaien daar groen, enPresenterPalette.textMuted/outlineplusAppearanceScope.modeOfstaan 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/blackin eenTextStyle, 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:
AppTheme.isDarkis een statische vlag, dus élk oppervlak dat zich daaruit kleurt en niet vanTheme.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.