[Bug] Tekstknoppen en links zijn onleesbaar in donkere modus (1,21:1) #744
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#744
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?
Wat er gebeurt
In donkere modus zijn tekstknoppen, links en een aantal iconen praktisch
onzichtbaar: bijna zwart op een donkere ondergrond.
Het meest zichtbaar op het toestemmingsscherm — de eerste keer dat iemand de
app opent. De twee licentielinks ("Lees de volledige licentie", "Volledige
licentie online (23 officiële taalversies)") staan er als donkere vlekken in de
kaart. Wie de app voor het eerst start in donkere modus krijgt een licentie
voorgelegd waarvan hij de weg naar de tekst niet kan zien.
Reproduceren: Instellingen → App-thema → profiel Donker. Zichtbaar op het
openscherm ("Gebruikershandleiding", "Instellingen"), in "Over OciDeck"
("Website van de stichting"), in de documentatielezer, en op het
toestemmingsscherm.
Waarom
Het profiel Donker zet
primaryColor: '#111827'— bijna zwart. Dat is primaals merk-/paneelkleur, maar het gaat in
AppTheme.fromProfileongewijzigd doornaar
ColorScheme.primary, en Material gebruiktprimaryals voorgrondkleurvan een
TextButton.Gemeten:
surfaceprimary#111827op#1E293B(donker)primary#1C2B47op#FFFFFF(licht)WCAG AA vraagt 4,5:1 voor gewone tekst. 1,21:1 is geen "krap", dat is weg.
Het is bovendien al eens half opgelost.
app_theme.dartheeft precies dezeconstatering staan, maar alleen voor de omlijnde knop:
Er is géén
textButtonTheme. Daarom is in "Over OciDeck" de knop "Allelicentieteksten tonen" (omlijnd) wél leesbaar en de link "Website van de
stichting" (tekstknop) ernaast niet — twee regels uit elkaar, hetzelfde paneel.
Daarnaast wordt
colorScheme.primaryop zes plekken rechtstreeks als voorgrondgebruikt en heeft daar hetzelfde probleem:
lib/widgets/privacy_statement_content.dart:265— de sectie-iconen op hettoestemmingsscherm
lib/widgets/reader/document_markdown_view.dart:473,477,482— opsommingsteken,link en citaatbalk in de documentatielezer
lib/widgets/shell/welcome_screen.dart:397— het wolkje bij een op afstandopgehaald recent bestand
lib/widgets/dialogs/consent_dialog.dart:125— rand van het akkoordvak (30%alfa, dus minder erg, maar dezelfde bron)
Twee routes
A — chirurgisch. Een
textButtonThememet dezelfde regel als de omlijndeknop hierboven, plus de zes aanroepplekken naar een kleur die in beide modi
leest. Volgt een beslissing die in dit bestand al genomen is, raakt verder niets,
en laat de donkere modus er verder uitzien zoals hij eruitziet.
B — bij de wortel.
primaryin het profiel Donker zelf licht maken (of infromProfileafdwingen datscheme.primaryopsurfaceleest). Eén wijzigingdie alle acht plekken tegelijk oplost, inclusief de zevende die volgende maand
wordt toegevoegd. Maar
primaryis niet alleen voorgrond: het is ook de vullingvan een selectievakje, een schakelaar, de focusring en de tekstselectie. Die zijn
nu bijna zwart — vermoedelijk ook fout, maar het verandert wél hoe donkere modus
eruitziet.
Aanbeveling: A nu, omdat het aantoonbaar geen bijwerkingen heeft en de
eerste-start-blokkade meteen weg is. B is de eigenlijke vraag en verdient een
eigen ronde met de andere
primary-gebruiken (vullingen, focus) erbij.Regressietest
De bestaande
test/app_theme_contrast_test.dart(#606) meet losse tokens, maarniet de kleuren die
ThemeDatazélf uitdeelt — precies het gat waar dit doorviel. Toe te voegen: voor elk ingebouwd
AppAppearanceProfilehet opgelostevoorgrondkleur van
TextButton,OutlinedButtonenElevatedButtonnaastcolorScheme.surfaceleggen en 4,5:1 eisen. Die toets staat vandaag rood op hetprofiel Donker.
Plus een bronwacht in dezelfde stijl als de bestaande:
colorScheme.primarynietals
color:van tekst of icoon.Kosten
Route A: een paar uur. Geen nieuwe
l10n.d('…'), geen afhankelijkheid, geenSBOM-gevolg. Wel documentatie: CHANGELOG, en
docs/ACCESSIBILITY.mdals daar eenuitspraak over contrast in staat.
Route A gemerged:
927c76a2(PR #746). Het issue blijft open voor route B.Wat er staat: dezelfde regel als de omlijnde knop nu ook op
textButtonTheme, enAppPalette.accentInkvoor de zes plekken diecolorScheme.primaryrechtstreeks als inkt namen. Nietsecondary— in het profiel Europa is het accent EU-geel, op wit net zo onleesbaar als het probleem zelf.Twee toetsen erbij in
app_theme_contrast_test.dart: per ingebouwd profiel de opgeloste knopvoorgronden plusaccentInktegen 4,5:1 op het eigen oppervlak, en een bronwacht opcolorScheme.primaryalscolor:. Drie mutaties rood gezien, waaronder de gemeten{TextButton: 1.2126638…}op Donker.Draaiend nagelopen in donkere modus: toestemmingsscherm, openscherm en de documentatielezer.
Wat nog openstaat (route B).
primaryin het profiel Donker is nog steeds#111827, en dat is ook de vulling van het selectievakje, de schakelaar, de focusring en de tekstselectie. Die zijn nu bijna zwart. Vermoedelijk ook fout, maar het verandert hoe donkere modus eruitziet, dus dat hoort in een eigen ronde mét die gebruiken erbij — niet meeliftend op een contrastreparatie.Route B opgepakt. Tak:
fix/primary-donker-b-744.Gemeten in het profiel Donker voordat ik iets aanraak:
primary#111827opsurface#1E293BonPrimary#122F60opprimary#111827cursorColorcolorScheme.primaryDat tweede getal is erger dan waar dit issue mee begon: een aangevinkt selectievakje is een bijna-zwart vlak met een donkerblauw vinkje erop — je kunt niet zien óf het aan staat. En omdat er geen
TextSelectionThemeis, is de tekstcursor in élk invoerveld#111827op#1E293B.De oorzaak is dat
primarytwee dingen tegelijk is:appBarTheme.backgroundColorgebruikt hem als balkkleur (en dáár moet hij donker blijven), terwijl Material hem als accent voor interactieve onderdelen gebruikt (en dáár moet hij licht zijn). Die twee kunnen in donkere modus niet dezelfde waarde hebben.primaryColorin het profiel simpelweg licht maken zou de bovenbalk licht maken — dus dat is niet de reparatie.Reikwijdte:
ColorScheme.primaryloskoppelen van de balkkleur, eenTextSelectionThemeData, en toetsen opprimary/surface(3:1, WCAG 1.4.11) enonPrimary/primary(4,5:1) per ingebouwd profiel.Route B gemerged:
bf8e55d3(PR #749). Daarmee is dit issue af — route A zat in #746.ColorScheme.primaryis losgekoppeld van de balkkleur: in donkere modus volgt hij het accent van het profiel, deAppBarhoudt de merkkleur. Plus eenTextSelectionThemeData, die er helemaal niet was.primaryopsurfaceonPrimaryopprimary(het vinkje)#60A5FA, explicietBeide lichte profielen komen er byte-identiek uit.
Vier toetsen erbij, per ingebouwd profiel — waaronder één die de verkeerde uitweg dichthoudt: een lichte
primaryColorlaat nu de titel in de bovenbalk vallen. Drie mutaties rood gezien. Draaiend nagelopen: schakelaar, focusrand en tekstselectie.Wat bewust níét is gedaan. Dit dekt de drie ingebouwde profielen. Wie zelf een donker profiel maakt met een donkere
accentColorkrijgt hetzelfde terug. Ik heb daar geen stille correctie op gezet — een kleur die je kiest en die de app dan negeert is een ander soort verrassing. Als dat opgevangen moet worden hoort het zichtbaar in de profielbewerker, zoals de diakwaliteitscontrole dat voor het dek van de gebruiker al doet. Aparte afweging; zeg maar of je daar een issue voor wilt.