fix(theme): generated waybar/rofi CSS invisible on on-surface palettes (item 27)
All checks were successful
Check / eval (push) Successful in 2m53s

Follow-on to the swaync fix (a643391): the generated Waybar CSS colored
the module row and #window @subtext and dim states @muted, and the
generated rofi theme put @fg text on @surface chips — invisible where
palettes use those roles as "on-surface" (flexoki-light: subtext==base,
surface==text; gruvbox: muted/base = 1.27). flexoki-light has no
whole-swap, so it ran this CSS. Generated surfaces only — the summer
whole-swaps are hand-authored and untouched.

- waybar: secondary text → alpha(@text, 0.85); dim states (inactive
  workspaces, DND bell, muted volume) → alpha(@text, 0.5).
- rofi: @dim → text+"80", @surface → text+"1a" (#RRGGBBAA fg tints).
- check-theme-contrast.py pairings/docs now cover all three generated
  surfaces; status glyphs (good/warn/bad on base, worst 2.05) are
  deliberately not held to a text ratio — raising them is palette
  design, a human decision.

Verified: V0; V1 (checks.theme-contrast green over 21 themes;
downstream-template-home builds; rendered waybar style has zero
@subtext/@muted/@surface; rendered custom.rasi shows fg-derived
tints). Honesty: NOT visually verified — V3 queued (flexoki-light
eyeball + dark-theme regression spot-check).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Bernardo Magri
2026-07-04 19:08:18 +01:00
parent a643391d3d
commit fd6e5f60e9
7 changed files with 54 additions and 37 deletions

View File

@@ -696,8 +696,13 @@ in
"*" = {
bg = mkLiteral c.base;
fg = mkLiteral c.text;
dim = mkLiteral c.subtext;
surface = mkLiteral c.surface;
# @dim/@surface are fg-derived #RRGGBBAA tints, NOT the
# palette's subtext/surface roles — "on-surface" palettes
# (flexoki-light: subtext==base, surface==text) made the
# inputbar, textbox and alternate rows invisible (item 27;
# guarded by tools/check-theme-contrast.py).
dim = mkLiteral (c.text + "80");
surface = mkLiteral (c.text + "1a");
accent = mkLiteral c.accent;
background-color = mkLiteral "transparent";

View File

@@ -253,9 +253,13 @@ let
border-radius: ${toString t.ui.rounding}px;
}
/* Dim/secondary shades are alpha(@text) tints, NOT the palette's
subtext/muted roles those mean "on-surface" in some palettes
(flexoki-light: subtext==base, gruvbox: mutedbase) and vanish
against the bar (item 27; tools/check-theme-contrast.py). */
#workspaces button {
padding: 0 8px;
color: @muted;
color: alpha(@text, 0.5);
border-radius: ${toString t.ui.rounding}px;
}
@@ -270,7 +274,7 @@ let
}
#window {
color: @subtext;
color: alpha(@text, 0.85);
padding: 0 12px;
}
@@ -280,7 +284,7 @@ let
}
#tray, #pulseaudio, #cpu, #memory, #custom-powerprofile, #custom-nightlight, #custom-updates, #custom-vpn, #language, #battery, #custom-notification {
color: @subtext;
color: alpha(@text, 0.85);
padding: 0 10px;
}
@@ -300,9 +304,9 @@ let
/* notifications waiting accent; Do-Not-Disturb muted bell-off */
#custom-notification.notification { color: @accent; }
#custom-notification.dnd-none,
#custom-notification.dnd-notification { color: @muted; }
#custom-notification.dnd-notification { color: alpha(@text, 0.5); }
#pulseaudio.muted { color: @muted; }
#pulseaudio.muted { color: alpha(@text, 0.5); }
#battery.warning { color: @warn; }
#battery.critical { color: @bad; }
#battery.charging { color: @good; }