From d2a730a6aa0d73f4389d0949b6aeae52d733fe04 Mon Sep 17 00:00:00 2001 From: BoulderBadgeDad Date: Thu, 28 May 2026 22:38:55 -0700 Subject: [PATCH 1/9] UI consistency (page shell 1/2): extract shared .page-shell primitive First step of the page-layout-shell standardization (kettui's UI-consistency point #1). The dashboard, tools, watchlist and wishlist pages each defined a byte-identical "card" container (padding 28px 24px 30px, margin 20px, gradient bg, radius 24px, border + border-top, layered shadow) under four different class names. Extract that into a single `.page-shell` primitive (modeled on the canonical dashboard/stats look) and have the four pages adopt it. Each keeps its bespoke class for page-specific extras and as a JS/mobile hook: - dashboard-container: keeps display:flex / column / gap:25px - watchlist/wishlist-page-container: keep position:relative - tools-page-container: no extras (box now fully from .page-shell) Zero visual change: computed styles are identical (declarations relocated, not altered), and mobile.css overrides still target the retained bespoke classes. Per-page themed headers (watchlist amber, etc.) are intentionally NOT touched. The class name is intended for reuse by the React pages too, so the primitive is shared across both stacks. Next (wave 2): migrate settings / automations / playlist-explorer / library onto .page-shell, which snaps their slightly-off spacing to canonical. --- webui/index.html | 8 +++--- webui/static/style.css | 63 ++++++++++++------------------------------ 2 files changed, 21 insertions(+), 50 deletions(-) diff --git a/webui/index.html b/webui/index.html index c01545e8..d067db76 100644 --- a/webui/index.html +++ b/webui/index.html @@ -311,7 +311,7 @@
-
+

System Dashboard

@@ -6322,7 +6322,7 @@ TOOLS PAGE ═══════════════════════════════════════════════════════════════════ -->
-
+

@@ -6779,7 +6779,7 @@ WATCHLIST PAGE ═══════════════════════════════════════════════════════════════════ -->
-
+
@@ -6895,7 +6895,7 @@ WISHLIST PAGE ═══════════════════════════════════════════════════════════════════ -->
-
+
diff --git a/webui/static/style.css b/webui/static/style.css index 7c2aa9d2..a5fedaaf 100644 --- a/webui/static/style.css +++ b/webui/static/style.css @@ -7990,13 +7990,13 @@ body.helper-mode-active #dashboard-activity-feed:hover { /* ======================================================= */ /* Main Dashboard Layout */ -.dashboard-container { - display: flex; - flex-direction: column; - gap: 25px; - /* Spacing between sections */ - padding: 28px 24px 30px 24px; - +/* ── Shared page shell ────────────────────────────────────────────── + The canonical page card (the dashboard / stats look). Adopted by the + dashboard, tools, watchlist and wishlist pages — and intended for reuse + by the React pages too (same class name). Page-specific extras (flex + layout, position) stay on the per-page class. */ +.page-shell { + padding: 28px 24px 30px; /* Semi-transparent to let page particles show through */ background: linear-gradient(135deg, rgba(20, 20, 20, 0.55) 0%, @@ -8005,7 +8005,6 @@ body.helper-mode-active #dashboard-activity-feed:hover { border: 1px solid rgba(255, 255, 255, 0.08); border-top: 1px solid rgba(255, 255, 255, 0.12); margin: 20px; - /* Soft floating shadow */ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3), @@ -8013,6 +8012,13 @@ body.helper-mode-active #dashboard-activity-feed:hover { inset 0 1px 0 rgba(255, 255, 255, 0.08); } +.dashboard-container { + display: flex; + flex-direction: column; + gap: 25px; + /* Spacing between sections; card styling comes from .page-shell */ +} + .dashboard-section { display: flex; flex-direction: column; @@ -59446,20 +59452,7 @@ body.reduce-effects *::after { TOOLS PAGE ═══════════════════════════════════════════════════════════════════ */ -.tools-page-container { - padding: 28px 24px 30px; - margin: 20px; - background: linear-gradient(135deg, - rgba(20, 20, 20, 0.55) 0%, - rgba(12, 12, 12, 0.62) 100%); - border-radius: 24px; - border: 1px solid rgba(255, 255, 255, 0.08); - border-top: 1px solid rgba(255, 255, 255, 0.12); - box-shadow: - 0 8px 32px rgba(0, 0, 0, 0.3), - 0 4px 16px rgba(0, 0, 0, 0.2), - inset 0 1px 0 rgba(255, 255, 255, 0.08); -} +/* .tools-page-container: card styling now from .page-shell (no extras). */ .tools-page-header { padding: 20px 24px 18px; @@ -59632,18 +59625,7 @@ body.reduce-effects *::after { ═══════════════════════════════════════════════════════════════════ */ .watchlist-page-container { - padding: 28px 24px 30px; - margin: 20px; - background: linear-gradient(135deg, - rgba(20, 20, 20, 0.55) 0%, - rgba(12, 12, 12, 0.62) 100%); - border-radius: 24px; - border: 1px solid rgba(255, 255, 255, 0.08); - border-top: 1px solid rgba(255, 255, 255, 0.12); - box-shadow: - 0 8px 32px rgba(0, 0, 0, 0.3), - 0 4px 16px rgba(0, 0, 0, 0.2), - inset 0 1px 0 rgba(255, 255, 255, 0.08); + /* card styling from .page-shell; keep page-specific positioning */ position: relative; } @@ -60044,18 +60026,7 @@ body.reduce-effects *::after { ═══════════════════════════════════════════════════════════════════ */ .wishlist-page-container { - padding: 28px 24px 30px; - margin: 20px; - background: linear-gradient(135deg, - rgba(20, 20, 20, 0.55) 0%, - rgba(12, 12, 12, 0.62) 100%); - border-radius: 24px; - border: 1px solid rgba(255, 255, 255, 0.08); - border-top: 1px solid rgba(255, 255, 255, 0.12); - box-shadow: - 0 8px 32px rgba(0, 0, 0, 0.3), - 0 4px 16px rgba(0, 0, 0, 0.2), - inset 0 1px 0 rgba(255, 255, 255, 0.08); + /* card styling from .page-shell; keep page-specific positioning */ position: relative; } From def58a99076d354b6bcf6d5b535fde82c373e1a1 Mon Sep 17 00:00:00 2001 From: BoulderBadgeDad Date: Thu, 28 May 2026 22:54:31 -0700 Subject: [PATCH 2/9] UI consistency (page shell 2/N): automations adopts .page-shell card First of the "flat -> card" conversions. The automations list view sat directly on the page background (.automations-container = bare padding) while its inner .dashboard-header is the same header dashboard uses. Adopt .page-shell so the page becomes a floating gradient card structurally identical to the dashboard (page-shell card > dashboard-header > content). - Drop .automations-container's bespoke `padding: 20px 24px` (card padding now from .page-shell); keep the class as the mobile/JS hook. - Add `page-shell` to the container in markup. Visible change by design (this page was not previously a card). Mobile keeps its existing .automations-container padding override. --- webui/index.html | 2 +- webui/static/style.css | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/webui/index.html b/webui/index.html index d067db76..1f60ab60 100644 --- a/webui/index.html +++ b/webui/index.html @@ -2280,7 +2280,7 @@
-
+

Automations

diff --git a/webui/static/style.css b/webui/static/style.css index a5fedaaf..3846e676 100644 --- a/webui/static/style.css +++ b/webui/static/style.css @@ -43838,7 +43838,7 @@ body.downloads-disabled [onclick*="DownloadMissing"]:not([onclick*="close"]) { AUTOMATIONS PAGE =========================== */ -.automations-container { padding: 20px 24px; } +/* .automations-container: card styling from .page-shell */ .automations-list { display: flex; flex-direction: column; gap: 0; } #automations-list-view { padding-bottom: 10vh; } From 45bbc99d94b0728ddda9dd5c047d18c547c24c24 Mon Sep 17 00:00:00 2001 From: BoulderBadgeDad Date: Thu, 28 May 2026 22:57:09 -0700 Subject: [PATCH 3/9] UI consistency (page shell 3/N): playlist-explorer adopts .page-shell card MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Convert the playlist-explorer page from a flat padded container to the .page-shell floating card. Drop its bespoke `padding: 24px 32px`; keep the full-height flex layout (display:flex / column / min-height:100%) since the explorer fills the viewport. Visible change by design. Watch: the full-height min-height:100% inside a margin:20px card may run slightly tall — to be confirmed visually. --- webui/index.html | 2 +- webui/static/style.css | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/webui/index.html b/webui/index.html index 1f60ab60..d307039c 100644 --- a/webui/index.html +++ b/webui/index.html @@ -3632,7 +3632,7 @@
-
+
diff --git a/webui/static/style.css b/webui/static/style.css index 3846e676..276ca321 100644 --- a/webui/static/style.css +++ b/webui/static/style.css @@ -54451,7 +54451,7 @@ tr.tag-diff-same { ================================================================================== */ .explorer-container { - padding: 24px 32px; + /* card styling from .page-shell; keep full-height flex layout */ display: flex; flex-direction: column; min-height: 100%; From 44faf44fca4fba6161154ac3691e53ab8a0f0e64 Mon Sep 17 00:00:00 2001 From: BoulderBadgeDad Date: Thu, 28 May 2026 23:23:16 -0700 Subject: [PATCH 4/9] UI consistency (page shell 5/N): settings adopts .page-shell card MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Settings was the one flat page with no single wrapper — its .dashboard-header and .settings-content sat as siblings directly under .page. Wrap both in a single .page-shell div so the page becomes a floating card with the header banner at the top, matching the dashboard structure. HTML-only change (no CSS: .settings-content keeps its minor `0 4px` inner padding). Library is intentionally NOT converted — its full-height artist grid + A-Z jump rail overflow a margin:20px card, so it stays flat as a documented exception (same category as search/discover/active-downloads). --- webui/index.html | 2 ++ 1 file changed, 2 insertions(+) diff --git a/webui/index.html b/webui/index.html index d307039c..c5d5f2bd 100644 --- a/webui/index.html +++ b/webui/index.html @@ -3735,6 +3735,7 @@
+

Settings

@@ -6200,6 +6201,7 @@
+
From eebc58d3ff0e5ae2dbe7a49de274edeaf665cbd9 Mon Sep 17 00:00:00 2001 From: BoulderBadgeDad Date: Thu, 28 May 2026 23:40:10 -0700 Subject: [PATCH 5/9] UI consistency (buttons 1/N): add shared .btn primitive; migrate config-modal Start of the button-consolidation pass (kettui's #1). The app had ~236 button classes / ~8-10 distinct looks with heavy near-duplication. Introduce a canonical .btn design-system primitive (base + .btn--primary / .btn--secondary / .btn--danger), modeled on the dominant existing look (accent-gradient primary, translucent ghost, semantic danger) and built on the accent CSS vars. New markup and the React pages should use this; existing per-page button classes will migrate onto it family by family. First family migrated: the config/settings modal buttons (.config-modal-btn*, 4 static uses, no JS refs) -> .btn .btn--primary / .btn--secondary. Removed the now-dead .config-modal-btn* rules and re-scoped its mobile full-width override to `.config-modal-actions .btn`. Visible change is minor by design (padding 28->24px, gradient direction normalized). Proof step for sign-off on the .btn look before rolling wider. --- webui/index.html | 8 ++-- webui/static/style.css | 103 ++++++++++++++++++++++++----------------- 2 files changed, 64 insertions(+), 47 deletions(-) diff --git a/webui/index.html b/webui/index.html index c5d5f2bd..55be3e95 100644 --- a/webui/index.html +++ b/webui/index.html @@ -7467,11 +7467,11 @@