feat(desktop): complete theme UI review
All checks were successful
Check / eval (push) Successful in 3m0s
All checks were successful
Check / eval (push) Successful in 3m0s
This commit is contained in:
161
agent/BACKLOG.md
161
agent/BACKLOG.md
@@ -26,168 +26,7 @@ next, in what order*.
|
|||||||
|
|
||||||
## NEXT
|
## 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 (2–14 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.0–2.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.8–3.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
|
### 14. Automated lock bumps — confirm the first real run
|
||||||
Slices b+c shipped 2026-07-05 (`.gitea/workflows/bump.yml`): weekly
|
Slices b+c shipped 2026-07-05 (`.gitea/workflows/bump.yml`): weekly
|
||||||
|
|||||||
@@ -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)
|
## 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.
|
- **Task:** Quick execution of 3 brainstormed PROPOSED items for a feature-complete, stable workstation.
|
||||||
- **Did:**
|
- **Did:**
|
||||||
|
|||||||
@@ -1003,7 +1003,7 @@ in
|
|||||||
programs.rofi = {
|
programs.rofi = {
|
||||||
enable = true;
|
enable = true;
|
||||||
terminal = cfg.terminal;
|
terminal = cfg.terminal;
|
||||||
font = "${t.fonts.ui} 12";
|
font = "${t.fonts.ui} ${toString t.fonts.size}";
|
||||||
|
|
||||||
# Native rofi modi backing two menu modules: calc (live, via
|
# Native rofi modi backing two menu modules: calc (live, via
|
||||||
# libqalculate — no qalc CLI needed) and emoji (glyph picker, copies
|
# libqalculate — no qalc CLI needed) and emoji (glyph picker, copies
|
||||||
|
|||||||
@@ -45,6 +45,8 @@ in
|
|||||||
border: ${toString t.ui.borderSize}px solid alpha(@accent, 0.4);
|
border: ${toString t.ui.borderSize}px solid alpha(@accent, 0.4);
|
||||||
border-radius: ${r}px;
|
border-radius: ${r}px;
|
||||||
color: @text;
|
color: @text;
|
||||||
|
font-family: "${t.fonts.ui}", "${t.fonts.mono}";
|
||||||
|
font-size: ${toString t.fonts.size}pt;
|
||||||
}
|
}
|
||||||
|
|
||||||
.notification-content .summary {
|
.notification-content .summary {
|
||||||
@@ -65,6 +67,8 @@ in
|
|||||||
border: ${toString t.ui.borderSize}px solid alpha(@accent, 0.4);
|
border: ${toString t.ui.borderSize}px solid alpha(@accent, 0.4);
|
||||||
border-radius: ${r}px;
|
border-radius: ${r}px;
|
||||||
color: @text;
|
color: @text;
|
||||||
|
font-family: "${t.fonts.ui}", "${t.fonts.mono}";
|
||||||
|
font-size: ${toString t.fonts.size}pt;
|
||||||
}
|
}
|
||||||
|
|
||||||
.control-center .notification-row:focus,
|
.control-center .notification-row:focus,
|
||||||
|
|||||||
Reference in New Issue
Block a user