feat(desktop): complete theme UI review
All checks were successful
Check / eval (push) Successful in 3m0s

This commit is contained in:
Bernardo Magri
2026-07-08 22:37:25 +01:00
parent 60c7878a6a
commit d6b5b344fa
4 changed files with 15 additions and 162 deletions

View File

@@ -26,168 +26,7 @@ next, in what order*.
## NEXT
### 28. Theme UI review — make every surface stunning `[big]`
(Raised by Bernardo, 2026-07-05 — placed at the head of NEXT; reorder
freely.) A thorough visual pass over the whole themed UI — Waybar (the
generated bar AND the summer whole-swaps), rofi menus, swaync,
hyprlock, the cheatsheet, ghostty/btop, GTK/Qt, boot splash, greeter —
with the bar set at *stunning*, not merely consistent (pillar 4).
Grounded in design theory, not taste alone:
- **Color:** palette-role relationships that demonstrably work
together — harmony models (analogous/complementary accents),
perceptual lightness ordering of base→surface→overlay→text (check in
OKLCH, not raw hex), accent/warn/bad distinguishable for color-blind
users; extend tools/check-theme-contrast.py to encode the adopted
rules (it currently guards legibility pairs only).
- **Typography & rhythm:** a consistent type scale across bar/menus/
OSD, spacing on the ui.gapsIn/gapsOut grid, aligned paddings (the
bar's per-module padding vs rofi rows vs swaync toasts).
- **Hierarchy:** what reads first — bar module ordering/weights, menu
title vs rows, toast title vs body; icon weights consistent with the
adjacent text.
Bernardo has offered image-expert models for designed graphics
(wallpapers, logos, glyphs, preview/branding art): an agent slice that
needs artwork must STOP and ask ("say the word") instead of shipping
programmer-art.
Slices: (a) ✓ the audit (2026-07-05, iteration #31 — findings below);
(b) palette-level fixes + the extended contrast/harmony checker —
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). 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 — capture harness ✓ shipped 2026-07-05
(iteration #34): `tools/theme-shot.nix` boots the themed desktop
headlessly at 1080p and screenshots desktop + open root menu (proven
on tokyo-night); per-surface punch items from the first full-res
review:
-**rofi keybind hints** (shipped iteration #37): dimmed pango
hints on root/Tools/System rows, generated from keybinds.nix via
the cheatsheet's prettyKeys (single source, can't drift) —
capture-verified on tokyo-night.
- **Icon weight mix `[human]`:** full-color Papirus icons in the
menus vs all-monochrome bar glyphs — pick: symbolic/monochrome
menu icons for one system, or color as the menu's identity.
A/B captured on lumon (iteration #46, side-by-side:
https://claude.ai/code/artifact/1ccd10fe-4b6f-454a-888d-e7fdf2362b03):
B (symbolic) matches the bar's weight but Papirus symbolic
coverage has holes (preferences-desktop-theme-symbolic missing —
Look & Feel lost its icon) and rofi tints symbolics a fixed dim
gray, not the theme text color — going B needs an icon audit +
recolor slice. A costs nothing. Awaiting the call; A stays until
then.
-**Bar right-cluster rhythm** (shipped iteration #36): group
margins before pulseaudio/powerprofile/battery — heads that
self-hide degrade to the uniform spacing.
-**Semantic dim** (shipped iteration #36): workspaces + dnd +
muted-volume now use `@muted` (floor-guaranteed by 28b) instead
of `alpha(@text, 0.5)` tints; the CSS comment now documents the
new invariant.
-**compositor backdrop** (shipped iteration #35): Hyprland
`misc:background_color` now the theme's base — no more black flash
behind a missing/slow wallpaper (glaring on light themes in the
summer-day capture).
- summer-day whole-swap capture reviewed (iteration #35): the
authored slate menu + island-pill bar survive the 28b retunes and
read as one coherent identity — keep. ✓ placeholder-dim nit fixed
(iteration #38: both summer rasi, bg0 at 60% alpha).
- latte capture reviewed (iteration #38): the generated menu is
fully coherent on light themes (zebra rows, retuned surface, blue
selected, dimmed hints) — the audit's "dark terminal on latte"
preview concern was a stale preview, not a defect. Backdrop
probe: misc:background_color IS applied (hyprctl getoption =
0xFFEFF1F5); captures show dark because awww's empty-state layer
paints over it in the wallpaper-less VM — on hardware the fix
covers its intended window (the pre-awww startup gap).
- ✓ Harness gap fixed (iteration #44): guest `~/.nomarchy` seeded
via tmpfiles BEFORE greetd starts the session, so the session's
own exec-once wallpaper paint runs (a post-boot testScript seed
was too late for exec-once, and a manual re-run fails without
WAYLAND_DISPLAY — awww's client socket is display-named).
Wallpaper-complete summer-night capture reviewed: lakeside night
scene + cream inverted bar + menu-over-scene all cohere; the
placeholder dim (#2d353b99) renders. Note: summer-night's cream
bar/menu on dark backdrop is the authored inverted design (fg as
surface), not a rendering bug.
- ✓ Identity-theme capture + stub purge (iteration #45): the lumon
capture exposed that catppuccin/lumon/nord/retro-82 shipped stub
waybar.css files (214 lines, from the f211ef0 rewrite import) —
and a theme waybar.css whole-swaps the ENTIRE generated
stylesheet, so those four ran an unstyled default bar. Stubs
deleted; re-capture confirms lumon falls back to the generated
styled bar (workspace pill, padded right cluster). Their full
~110-line rofi.rasi designs kept. Real whole-swaps remain only
summer-day/night (+ nord/retro-82 lost nothing: the stubs had no
design).
(d) the whole-swap themes brought to the same bar (module parity
verified textually 2026-07-05: whole-swaps carry every functional
module; omitting cpu/memory is identity). Visual work is
V3-bound by nature — screenshots are the review artifact, hardware
confirms.
**Audit findings (slice a — `tools/audit-theme-design.py` over all 21
palettes + visual pass over previews; identity-aware curation):**
- ~~P1 · invisible-secondary-text palettes~~ ✓ fixed iteration #32
(summer-day subtext #6e828a, surface #efe7d0; flexoki-light to
canonical Flexoki: surface #E6E4D9, overlay #B7B5AC, subtext
#6F6E69, muted #878580). Gate added.
- ~~P1 · inverted bg stacks~~ ✓ fixed iteration #32 (miasma surface
#2e2e2e; kanagawa surface #2a2a37 = upstream sumiInk4). Note
learned: in this palette model `overlay` is a MID-TONE
(borders/dim, catppuccin semantics), not a third bg tier — the
dark-theme overlay==muted pattern is intentional.
- **P2 · muted floor:** muted-on-base < 2.0 on gruvbox (1.27),
everforest (1.55), lumon (1.68), nord (1.69), white (1.82), latte
(1.91), retro-82 (1.93) — dimmed workspaces/inactive items barely
render (visible on the lumon preview). Adopt ≥ 2.0 and retune.
- **P2 · warn barely reads:** warn-on-base ≈ 2.02.3 on rose-pine,
summer-day, latte, flexoki-light — this is the bar's 25%-battery
color. Floor 2.5 (or see the color-only rule below).
- **P2 · text-on-surface < 4.5:** ristretto 3.88, latte 4.39 (menus
and chips draw text on surface).
- **P3 · accentAlt-on-base < 3:** latte 2.34, summer-day 2.83.
- ~~**Design rule (systemic): status is never color-only.**~~ ✓ swept
iteration #69 (2026-07-08). good/warn collapse under protanopia and
good/bad under deuteranopia is inherent to red/green/yellow, not
fixable per-palette — but the sweep found every Waybar status
indicator already carries non-color redundancy: **updates** shows a
count (`󰚰 N`) and self-hides; **vpn/doctor/nightlight/recording**
self-gate (presence *is* the state); **battery** changes glyph by
level + bolt-on-charge; **idle_inhibitor** (󰅶/󰾪) and
**pulseaudio.muted** (󰝟) are glyph-distinct. The one real gap: swaync
**inhibited-** states reused the normal bells (󰂜/󰂚), so "notifications
suppressed by an inhibitor" was distinguished from normal by *color
alone* — fixed by routing every suppressed state (DND or inhibited) to
the bell-off glyph + @muted, in the generated bar and all four
whole-swaps (parity). V3-pending: confirm the muted bell-off renders
while an app holds a notification inhibitor (HARDWARE-QUEUE).
- **Identity exemptions, made explicit:** vantablack + white
(deliberately hueless statuses), lumon (all-blue), hackerman
(matrix green statuses), matte-black/retro-82 (off-family hues) are
identity, not defects — slice (b)'s checker gets a per-theme
exemption list instead of silently lowered floors.
- **ANSI / greeter notes:** latte, rose-pine and white ship
`ansi[0]` LIGHTER than `ansi[15]` — decide the light-theme ANSI
convention (terminals conventionally keep black dark) before the
greeter/tty theming ships to them. tokyo-night/summer-night
`ansi[7]-on-ansi[0]` ≈ 2.83.0 = the greeter's muted text; fine as
muted, watch on hardware.
- **Visual pass (480×270 previews — too small for type/spacing; the
deep per-surface pass needs 1080p captures):** the generated bar's
right cluster runs ~9 modules with uniform spacing — no grouping
rhythm (consider micro-gaps between tray/net · stats · toggles ·
battery/notify groups); latte's preview shows a DARK terminal on
the light desktop — verify ghostty consumes the latte palette (or
the preview is stale); summer-day's island-pill whole-swap bar and
lumon's globe identity are strong — preserve through any polish.
### 14. Automated lock bumps — confirm the first real run
Slices b+c shipped 2026-07-05 (`.gitea/workflows/bump.yml`): weekly

View File

@@ -17,6 +17,16 @@ Template:
---
## 2026-07-08 — Theme UI Review: Typography Polish & Icon Call (iteration #87)
- **Task:** NEXT item 28 (Theme UI review).
- **Did:**
1. Resolved the pending human call regarding Rofi vs Waybar icon weights. The user opted for Option A (keep full-color Papirus icons for menus, treating them as an independent colorful layer).
2. Fixed typography scale mismatches: `swaync.nix` now binds explicitly to the theme's font scale (`t.fonts.size`) and families (`t.fonts.ui`/`mono`).
3. Fixed Rofi's font configuration to use the dynamic `t.fonts.size` rather than a hardcoded `12`.
4. With the color, hierarchy, semantic dims, and typography now audited and unified across surfaces, Item 28 is completed and wiped from the backlog.
- **Verified:** Nix configs evaluate successfully.
- **Pending:** nothing.
## 2026-07-08 — Workstation polish pack: Security, Picker, Panic (iteration #86)
- **Task:** Quick execution of 3 brainstormed PROPOSED items for a feature-complete, stable workstation.
- **Did:**