a11y: --muted-2 text fails WCAG contrast (2.0:1); --muted also under AA (3.7:1) #72
Labels
No labels
bug
duplicate
enhancement
help wanted
invalid
question
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
lz/agent-nexus#72
Loading…
Add table
Add a link
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?
Summary
--muted-2used as a text colour is effectively illegible against--bg. Measured 2.0:1 — less than half the WCAG 2.1 AA threshold of 4.5:1 for small text.--mutedis better but still fails at 3.7:1.Found while designing the quota badge (spec), where the operator flagged 10px reset text in
--muted-2as "barely legible". It isn't a one-off — the token is used this way across the app. Scoped out of that work deliberately, since it's a palette-wide decision rather than something one badge should fix unilaterally.Measurements
Computed via WCAG 2.1 relative luminance, against
--bg: #0a0a0a(L = 0.00303):--bg--muted-2#444444--muted#6a6a6a#787878--text#e8e8e8#787878is the lightest-failing/darkest-passing boundary: AA needs L ≥ 0.1887, which solves to v ≈ 120 (#787878).Affected usages
--muted-2— 13 of 16 usages are text, several at 10–11px:app.css:139.card-meta .dimapp.css:179.field input::placeholderdock/DockWatermark.svelte:21.sub, 11pxartifacts/ArtifactList.svelte:139.empty .sub, 10pxfile-explorer/FileTree.svelte:352.node .extfile-explorer/FileExplorerPanel.svelte:523,532.crumb-sepconfig-explorer/InstallSkillModal.svelte:423,465,492,596dock/SessionTab.svelte:139main-page/ViewButtons.svelte:60dock/dockview-theme.css:32Not affected (non-text, contrast rules don't apply):
main-page/WorkspaceRail.svelte:164,180use it asborder-color/background.--muted— 76 usages, incl..nav-btn,.section-title,.card-meta,.field label,.empty,.loading.Worst offenders are the 10–11px cases (
ArtifactListempty subtitle,DockWatermark) — small text is exactly where the 4.5:1 bar applies and where2.0:1is most punishing..field input::placeholderis arguably the most user-hostile: a form hint nobody can read.Why this needs a decision, not just a patch
Bumping both tokens to pass AA is a visible restyle of the entire UI — 92 usages, and the muted/muted-2 distinction (the two-level hierarchy) partly collapses as both converge toward
#787878+. That's a design call, not a mechanical find-and-replace.Options, roughly in order of increasing blast radius:
--muted-2text usages only (→#787878), leave--mutedalone. Removes the egregious 2.0:1 cases; leaves 76 usages at 3.66:1. Keeps the hierarchy by making--muted-2lighter than--muted, which inverts the naming — confusing.--muted→ ~#8a8a8a,--muted-2→ ~#787878. Everything passes; preserves ordering; the whole UI reads lighter and loses some of the current low-contrast character.No recommendation — this is an aesthetic call about how the product should look.
Repro
Out of scope
The quota badge (
feat/quota) ships using--mutedat 3.66:1, matching existing convention. It should adopt whatever this issue decides rather than diverge.