From 44d55161910fbfdcc2e7c07dca3a42a173692550 Mon Sep 17 00:00:00 2001 From: Bernardo Magri Date: Sun, 5 Jul 2026 19:44:46 +0100 Subject: [PATCH] fix(themes): P2 contrast floors retuned + gated across 9 themes (item 28b done) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 18 hex retunes, hue-preserving OKLCH minimal raises except where the upstream palette defines a canonical value: muted lifted to >= 2.0 on lumon/white/retro-82/everforest (solved), gruvbox (bg4 #7c6f64), nord (#616e88, the community comment-brightening), catppuccin-latte (overlay1 #8c8fa1); text-on-surface >= 4.5 via surface nudges (ristretto darker, latte lighter); accentAlt >= 3.0 (latte, summer-day darkened); warn >= 2.5 — the bar's battery tint — darkened on the light bases (latte, rose-pine dawn, summer-day) and flexoki-light's four status colors moved to their canonical light-mode 600 series. check-theme-contrast.py now gates all four adopted floors (7 pairings x 21 themes, green). good/bad stay audit-only — identity themes sit at 2.0-2.3 there by design, so no exemption mechanism was needed. The design audit's contrast findings drop 20 -> 1 (miasma's earthy `bad`, kept as identity). Item 28 slice (b) complete. Verified: V0, checks.theme-contrast green, flake check green, re-audit. Rendering is V3 -> HARDWARE-QUEUE eyeball entries. Co-Authored-By: Claude Fable 5 --- agent/BACKLOG.md | 11 +++++++++-- agent/HARDWARE-QUEUE.md | 7 +++++++ agent/JOURNAL.md | 22 ++++++++++++++++++++++ themes/catppuccin-latte.json | 8 ++++---- themes/everforest.json | 2 +- themes/flexoki-light.json | 8 ++++---- themes/gruvbox.json | 2 +- themes/lumon.json | 2 +- themes/nord.json | 2 +- themes/retro-82.json | 2 +- themes/ristretto.json | 2 +- themes/rose-pine.json | 2 +- themes/summer-day.json | 4 ++-- themes/white.json | 2 +- tools/check-theme-contrast.py | 8 ++++++++ 15 files changed, 64 insertions(+), 20 deletions(-) diff --git a/agent/BACKLOG.md b/agent/BACKLOG.md index 1659bf4..e2e2632 100644 --- a/agent/BACKLOG.md +++ b/agent/BACKLOG.md @@ -55,8 +55,15 @@ P1s ✓ shipped 2026-07-05 (iteration #32): summer-day + flexoki-light subtext/surface/overlay/muted retuned (flexoki to its canonical upstream tones), miasma + kanagawa surfaces raised (kanagawa to sumiInk4); `subtext/base ≥ 3` now GATED in check-theme-contrast.py -(all 21 pass). Remaining (b): the P2 floors below + the per-theme -exemption-list mechanism, then re-audit; +(all 21 pass). P2s ✓ shipped 2026-07-05 (iteration #33): 18 hex +retunes across 9 themes (OKLCH hue-preserving minimal raises; +canonical where upstream defines one — gruvbox bg4, nord #616e88, +latte overlay1, flexoki 600-series statuses for light mode) and the +four floors GATED: muted ≥ 2, text/surface ≥ 4.5, accentAlt ≥ 3, +warn ≥ 2.5 (21×7 pairings green; audit contrast findings 20 → 1 — +miasma's earthy `bad` stays as identity, good/bad floors stay +audit-only so no exemption list was needed). Remaining (b): nothing — +further palette work graduates from slices (c)/(d) findings; (c) per-surface polish slices; (d) the whole-swap themes brought to the same bar. Visual work is V3-bound by nature — screenshots are the review artifact, hardware diff --git a/agent/HARDWARE-QUEUE.md b/agent/HARDWARE-QUEUE.md index 76d6608..d517de1 100644 --- a/agent/HARDWARE-QUEUE.md +++ b/agent/HARDWARE-QUEUE.md @@ -153,6 +153,13 @@ QA machine), the **T14s** (webcam case). applies the matching profile within ~3s (toast names it); unplugging switches back; Auto-switch off stops that; with two profiles naming the same outputs, no flapping (ties do nothing). +- [ ] **P2 retunes eyeball (item 28b)** — spot-check on top of the P1 + entry below: gruvbox/nord/lumon/everforest/retro-82/white dimmed + text (inactive workspaces, muted volume) now visible-but-dim; + latte + rose-pine(dawn) + summer-day warn/battery tint reads on + the light bases; flexoki-light statuses are the deeper canonical + 600s; latte selected-row/alt-accent pink darker. Anything that + lost its "dim" feel → reopen 28b. - [ ] **Retuned palettes eyeball (item 28b P1)** — switch through summer-day, flexoki-light, kanagawa, miasma: chips/menus/toasts now draw on a *raised* surface (summer-day's was slate-on-cream, diff --git a/agent/JOURNAL.md b/agent/JOURNAL.md index 0ff2304..f3a3397 100644 --- a/agent/JOURNAL.md +++ b/agent/JOURNAL.md @@ -17,6 +17,28 @@ Template: --- +## 2026-07-05 — P2 floors retuned + gated (iteration #33, item 28b done) +- **Task:** item 28 slice (b) remainder — the P2 contrast floors. +- **Did:** 18 hex retunes across 9 themes: muted raised on lumon/ + white/retro-82/everforest (OKLCH hue-preserving minimal solve to + ≥2.05) + gruvbox→bg4 #7c6f64, nord→#616e88 (community standard), + latte→overlay1 #8c8fa1; text-on-surface via surface nudges + (ristretto darker, latte lighter); accentAlt darkened (latte, + summer-day); warn darkened on the light themes (latte, summer-day, + rose-pine-dawn) and flexoki-light's four statuses moved to the + canonical 600 series. check-theme-contrast.py gates all four + adopted floors (muted ≥2, text/surface ≥4.5, accentAlt ≥3, warn + ≥2.5 — warn is the battery tint); good/bad stay audit-only + (identity), so no exemption mechanism was needed. Slice (b) done. +- **Verified:** V0 + checks.theme-contrast GREEN (21×7); re-audit: + contrast findings 20→1 (miasma bad = identity); flake check green. + Rendering is V3 → queued (P2 eyeball entry). +- **Pending:** slices (c) per-surface polish (needs 1080p captures) + and (d) whole-swap bar parity; ansi[] conventions decision still + open (audit notes). +- **Next suggestion:** slice (c) prep — 1080p captures via the VM + recipe, or hardware captures if Bernardo prefers eyeballing first. + ## 2026-07-05 — P1 palette retunes + gated subtext floor (iteration #32, item 28b) - **Task:** item 28 slice (b), P1s from the #31 audit. - **Did:** summer-day: surface #5c6a72(=text!)→#efe7d0 raised cream, diff --git a/themes/catppuccin-latte.json b/themes/catppuccin-latte.json index 321a28e..de8d0c7 100644 --- a/themes/catppuccin-latte.json +++ b/themes/catppuccin-latte.json @@ -7,15 +7,15 @@ "colors": { "base": "#eff1f5", "mantle": "#cbcdd0", - "surface": "#bcc0cc", + "surface": "#bfc4d0", "overlay": "#acb0be", "text": "#4c4f69", "subtext": "#5c5f77", - "muted": "#acb0be", + "muted": "#8c8fa1", "accent": "#1e66f5", - "accentAlt": "#ea76cb", + "accentAlt": "#d260b5", "good": "#40a02b", - "warn": "#df8e1d", + "warn": "#d6860a", "bad": "#d20f39" }, "border": { diff --git a/themes/everforest.json b/themes/everforest.json index e604bbd..1991db0 100644 --- a/themes/everforest.json +++ b/themes/everforest.json @@ -11,7 +11,7 @@ "overlay": "#475258", "text": "#d3c6aa", "subtext": "#d3c6aa", - "muted": "#475258", + "muted": "#59646a", "accent": "#7fbbb3", "accentAlt": "#d699b6", "good": "#a7c080", diff --git a/themes/flexoki-light.json b/themes/flexoki-light.json index 6dfd551..d5a5369 100644 --- a/themes/flexoki-light.json +++ b/themes/flexoki-light.json @@ -13,10 +13,10 @@ "subtext": "#6F6E69", "muted": "#878580", "accent": "#205EA6", - "accentAlt": "#CE5D97", - "good": "#879A39", - "warn": "#D0A215", - "bad": "#D14D41" + "accentAlt": "#A02F6F", + "good": "#66800B", + "warn": "#AD8301", + "bad": "#AF3029" }, "border": { "active": "accent", diff --git a/themes/gruvbox.json b/themes/gruvbox.json index fd8c94a..ce7815f 100644 --- a/themes/gruvbox.json +++ b/themes/gruvbox.json @@ -11,7 +11,7 @@ "overlay": "#3c3836", "text": "#d4be98", "subtext": "#d4be98", - "muted": "#3c3836", + "muted": "#7c6f64", "accent": "#7daea3", "accentAlt": "#d3869b", "good": "#a9b665", diff --git a/themes/lumon.json b/themes/lumon.json index 554c34b..cde77cc 100644 --- a/themes/lumon.json +++ b/themes/lumon.json @@ -11,7 +11,7 @@ "overlay": "#304860", "text": "#d6e2ee", "subtext": "#d6e2ee", - "muted": "#304860", + "muted": "#3c556e", "accent": "#f2fcff", "accentAlt": "#8bc9eb", "good": "#5e95bc", diff --git a/themes/nord.json b/themes/nord.json index b3f7910..5113b39 100644 --- a/themes/nord.json +++ b/themes/nord.json @@ -11,7 +11,7 @@ "overlay": "#4c566a", "text": "#d8dee9", "subtext": "#e5e9f0", - "muted": "#4c566a", + "muted": "#616e88", "accent": "#81a1c1", "accentAlt": "#b48ead", "good": "#a3be8c", diff --git a/themes/retro-82.json b/themes/retro-82.json index ccd05b6..6a53143 100644 --- a/themes/retro-82.json +++ b/themes/retro-82.json @@ -11,7 +11,7 @@ "overlay": "#134e5a", "text": "#f6dcac", "subtext": "#a7c9c6", - "muted": "#134e5a", + "muted": "#19525f", "accent": "#faa968", "accentAlt": "#3f8f8a", "good": "#028391", diff --git a/themes/ristretto.json b/themes/ristretto.json index eab2487..3855062 100644 --- a/themes/ristretto.json +++ b/themes/ristretto.json @@ -7,7 +7,7 @@ "colors": { "base": "#2c2525", "mantle": "#251f1f", - "surface": "#72696a", + "surface": "#675e5f", "overlay": "#948a8b", "text": "#e6d9db", "subtext": "#e6d9db", diff --git a/themes/rose-pine.json b/themes/rose-pine.json index 9ada386..bb8c330 100644 --- a/themes/rose-pine.json +++ b/themes/rose-pine.json @@ -15,7 +15,7 @@ "accent": "#56949f", "accentAlt": "#907aa9", "good": "#286983", - "warn": "#ea9d34", + "warn": "#d68a16", "bad": "#b4637a" }, "border": { diff --git a/themes/summer-day.json b/themes/summer-day.json index 52f398e..3699891 100644 --- a/themes/summer-day.json +++ b/themes/summer-day.json @@ -13,9 +13,9 @@ "subtext": "#6e828a", "muted": "#829181", "accent": "#3a94c5", - "accentAlt": "#df69ba", + "accentAlt": "#d863b4", "good": "#8da101", - "warn": "#dfa000", + "warn": "#ca9210", "bad": "#f85552" }, "border": { diff --git a/themes/white.json b/themes/white.json index 97dff38..2f42da7 100644 --- a/themes/white.json +++ b/themes/white.json @@ -11,7 +11,7 @@ "overlay": "#c0c0c0", "text": "#000000", "subtext": "#000000", - "muted": "#c0c0c0", + "muted": "#b5b5b5", "accent": "#6e6e6e", "accentAlt": "#2e2e2e", "good": "#3a3a3a", diff --git a/tools/check-theme-contrast.py b/tools/check-theme-contrast.py index 08a519e..6a8d206 100644 --- a/tools/check-theme-contrast.py +++ b/tools/check-theme-contrast.py @@ -26,6 +26,14 @@ PAIRINGS = [ # shipped subtext == base (ratio 1.0 — invisible secondary text; the # palette-level cause of items 25/27). Never again. ("subtext", "base", 3.0, "secondary text (tooltips, hints, fastfetch labels)"), + # Item-28 P2 floors (all 21 themes retuned to pass, 2026-07-05). + # warn IS held to a floor — it's the bar's 25%-battery color and the + # low-battery toast tint; good/bad stay audit-only (identity themes + # sit at 2.0–2.3 there by design — see tools/audit-theme-design.py). + ("muted", "base", 2.0, "dimmed text (inactive workspaces, muted volume)"), + ("text", "surface", 4.5, "text on chips / raised rows"), + ("accentAlt", "base", 3.0, "alt-accent glyphs"), + ("warn", "base", 2.5, "battery warning tint (bar + toast)"), ]