From fe0228c877ae2d4693b2b974915735e6866d658d Mon Sep 17 00:00:00 2001 From: kisfenyo Date: Thu, 15 Oct 2026 19:04:57 +0200 Subject: [PATCH] v0.315.0: style the app page's tab bar, and reuse the hero classes that already have rules MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit FOUND IN A BROWSER, and findable no other way. Every endpoint-level marker passed and the page was unusable: the tab bar rendered as four bare underlined links run together, and the app logo filled a third of the screen. The shell had been written with new class names — app-hero, app-hero-logo, app-tabs — and only the first two of those had any CSS at all, under the names the design system already uses. - the shell now reuses .app-info-hero / .app-info-logo / .app-info-hero-text, which carry the 80px logo box, the hairline border and the 2px radius. Inventing a parallel name is what left the logo unsized; REUSE.md's first rule, learned again. - .app-tabs / .app-tab / .app-tab-active are genuinely new and are now styled to design system v2: 2px radius, hairline --line border, no shadow, --text-2 for an inactive tab and --blue-bright only for the one the household is on (blue marks where you are, not a deviation), the active tab sitting on the bar's own line, and a narrower gutter under 640px. - .after-start-card gets a blue left hairline — it is a request, not a fault, so no amber. - .app-faq gets its dt/dd rules. TestAppPage_DeployedDefaultsToSettings sliced the header at `class="app-hero"`; it now slices at the reused class and fails loudly if either marker is gone, instead of slicing on -1. The 36 app-page parity fixtures are recaptured — and no other fixture moved, which is the evidence that the shell change reaches only the app page. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_0117kRTSgs3rJWUFGxyoWN6Y --- controller/internal/web/app_page_test.go | 9 +++- .../internal/web/templates/app_shell.html | 6 +-- controller/internal/web/templates/style.css | 44 +++++++++++++++++++ .../i18n_parity/app_data_deployed.html | 6 +-- .../testdata/i18n_parity/app_data_export.html | 6 +-- .../i18n_parity/app_data_not_hdd.html | 6 +-- .../i18n_parity/app_data_not_hdd_absent.html | 6 +-- .../app_data_not_hdd_protected.html | 6 +-- .../app_data_not_hdd_same_disk.html | 6 +-- .../app_data_notarget_disabled.html | 6 +-- .../i18n_parity/app_data_target_auto.html | 6 +-- .../i18n_parity/app_data_target_ssd.html | 6 +-- .../i18n_parity/app_guide_available.html | 6 +-- .../testdata/i18n_parity/app_guide_full.html | 6 +-- .../i18n_parity/app_guide_installable.html | 6 +-- .../i18n_parity/app_guide_no_guide.html | 6 +-- .../web/testdata/i18n_parity/app_logs.html | 6 +-- .../i18n_parity/app_settings_after_start.html | 6 +-- .../app_settings_close_signup.html | 6 +-- .../app_settings_close_signup_native.html | 6 +-- .../i18n_parity/app_settings_deployed.html | 6 +-- .../i18n_parity/app_settings_hold_log.html | 6 +-- .../app_settings_install_hold.html | 6 +-- .../app_settings_known_login_changed.html | 6 +-- .../app_settings_ladder_steps.html | 6 +-- .../i18n_parity/app_settings_lost_files.html | 6 +-- .../i18n_parity/app_settings_not_checked.html | 6 +-- .../app_settings_operator_creds.html | 6 +-- .../app_settings_restored_login.html | 6 +-- .../i18n_parity/app_settings_running.html | 6 +-- .../app_settings_setup_gate_button.html | 6 +-- .../app_settings_setup_gate_native.html | 6 +-- .../app_settings_setup_gate_probe.html | 6 +-- .../app_settings_signup_closed.html | 6 +-- .../app_settings_signup_native.html | 6 +-- ...pp_settings_signup_native_open_failed.html | 6 +-- .../app_settings_signup_window.html | 6 +-- .../i18n_parity/app_settings_stopped.html | 6 +-- .../i18n_parity/app_settings_updating.html | 6 +-- 39 files changed, 162 insertions(+), 113 deletions(-) diff --git a/controller/internal/web/app_page_test.go b/controller/internal/web/app_page_test.go index dde32ee..cb26ecb 100644 --- a/controller/internal/web/app_page_test.go +++ b/controller/internal/web/app_page_test.go @@ -149,8 +149,13 @@ func TestAppPage_DeployedDefaultsToSettings(t *testing.T) { // The header does not. This is the whole point of the Mukodes card: the three buttons used to // sit in the page header and read as menu items. - header := body[strings.Index(body, `class="page-header"`):] - header = header[:strings.Index(header, `class="app-hero"`)] + // The header is everything before the hero block; app-info-hero is the design system's existing + // hero class, which the shell reuses rather than inventing one with no rules behind it. + hi, hj := strings.Index(body, `class="page-header"`), strings.Index(body, `class="app-info-hero"`) + if hi < 0 || hj < 0 || hj < hi { + t.Fatalf("the shell's header/hero markers are gone (page-header=%d app-info-hero=%d)", hi, hj) + } + header := body[hi:hj] if strings.Contains(header, "stackAction(") { t.Errorf("the page header must carry no state-change button, got: %q", header) } diff --git a/controller/internal/web/templates/app_shell.html b/controller/internal/web/templates/app_shell.html index 76dbca1..9988911 100644 --- a/controller/internal/web/templates/app_shell.html +++ b/controller/internal/web/templates/app_shell.html @@ -28,11 +28,11 @@ -
- + -
+
{{if .AppInfo.Tagline}}

{{.AppInfo.Tagline}}

{{else}}

{{.Meta.Description}}

{{end}}
~{{.Meta.Resources.MemRequest}} RAM diff --git a/controller/internal/web/templates/style.css b/controller/internal/web/templates/style.css index ee90801..8d53b34 100644 --- a/controller/internal/web/templates/style.css +++ b/controller/internal/web/templates/style.css @@ -1300,6 +1300,50 @@ a.stat-card:hover { .login-footer a:hover { color: var(--blue); } /* --- App Info Page --- */ +/* THE APP PAGE'S TAB BAR (v0.315.0) — links, not panels. + Design system v2: 2px radius, hairline borders, no shadow, and blue reserved for the tab the + household is ON. An inactive tab is --text-2: a tab bar is navigation, not a deviation. */ +.app-tabs { + display: flex; + gap: .25rem; + flex-wrap: wrap; + margin: 1.25rem 0 1.5rem; + border-bottom: 1px solid var(--line); +} +.app-tab { + padding: .55rem 1rem; + color: var(--text-2); + text-decoration: none; + font-size: .9rem; + border: 1px solid transparent; + border-bottom: none; + border-radius: var(--radius) var(--radius) 0 0; + /* The bar's own 1px line is what the active tab sits on, so each tab reaches it. */ + margin-bottom: -1px; + white-space: nowrap; +} +.app-tab:hover { color: var(--text-1); background: var(--bg-1); } +.app-tab-active { + color: var(--blue-bright); + background: var(--bg-1); + border-color: var(--line); + border-bottom: 1px solid var(--bg-1); +} +.app-tab-active:hover { color: var(--blue-bright); } +@media (max-width: 640px) { + .app-tabs { gap: 0; } + .app-tab { padding: .55rem .6rem; font-size: .85rem; } +} + +/* „Még egy lépés" — a value the app wants once it is running (Part 4). It is a request, not a + fault, so it stays neutral: the blue hairline marks it as the thing to do next. */ +.after-start-card { border-left: 2px solid var(--blue); } + +/* The guide's FAQ. */ +.app-faq { margin: .5rem 0 0; } +.app-faq dt { color: var(--text-1); font-weight: 600; margin-top: .85rem; } +.app-faq dd { color: var(--text-2); margin: .25rem 0 0; padding: 0; } + .app-info-hero { display: flex; align-items: center; diff --git a/controller/internal/web/testdata/i18n_parity/app_data_deployed.html b/controller/internal/web/testdata/i18n_parity/app_data_deployed.html index 93062ba..c04b92d 100644 --- a/controller/internal/web/testdata/i18n_parity/app_data_deployed.html +++ b/controller/internal/web/testdata/i18n_parity/app_data_deployed.html @@ -189,11 +189,11 @@
-
- + -
+

Egy teszt alkalmazás leírása

~128M RAM diff --git a/controller/internal/web/testdata/i18n_parity/app_data_export.html b/controller/internal/web/testdata/i18n_parity/app_data_export.html index 9de2192..d394b28 100644 --- a/controller/internal/web/testdata/i18n_parity/app_data_export.html +++ b/controller/internal/web/testdata/i18n_parity/app_data_export.html @@ -189,11 +189,11 @@
-
- + -
+

Egy teszt alkalmazás leírása

~128M RAM diff --git a/controller/internal/web/testdata/i18n_parity/app_data_not_hdd.html b/controller/internal/web/testdata/i18n_parity/app_data_not_hdd.html index af6fafa..cad2116 100644 --- a/controller/internal/web/testdata/i18n_parity/app_data_not_hdd.html +++ b/controller/internal/web/testdata/i18n_parity/app_data_not_hdd.html @@ -189,11 +189,11 @@
-
- + -
+

Egy teszt alkalmazás leírása

~128M RAM diff --git a/controller/internal/web/testdata/i18n_parity/app_data_not_hdd_absent.html b/controller/internal/web/testdata/i18n_parity/app_data_not_hdd_absent.html index abc5439..3c0c048 100644 --- a/controller/internal/web/testdata/i18n_parity/app_data_not_hdd_absent.html +++ b/controller/internal/web/testdata/i18n_parity/app_data_not_hdd_absent.html @@ -189,11 +189,11 @@
-
- + -
+

Egy teszt alkalmazás leírása

~128M RAM diff --git a/controller/internal/web/testdata/i18n_parity/app_data_not_hdd_protected.html b/controller/internal/web/testdata/i18n_parity/app_data_not_hdd_protected.html index e91fa06..8a508e9 100644 --- a/controller/internal/web/testdata/i18n_parity/app_data_not_hdd_protected.html +++ b/controller/internal/web/testdata/i18n_parity/app_data_not_hdd_protected.html @@ -189,11 +189,11 @@
-
- + -
+

Egy teszt alkalmazás leírása

~128M RAM diff --git a/controller/internal/web/testdata/i18n_parity/app_data_not_hdd_same_disk.html b/controller/internal/web/testdata/i18n_parity/app_data_not_hdd_same_disk.html index 1b3d7d8..b77c77f 100644 --- a/controller/internal/web/testdata/i18n_parity/app_data_not_hdd_same_disk.html +++ b/controller/internal/web/testdata/i18n_parity/app_data_not_hdd_same_disk.html @@ -189,11 +189,11 @@
-
- + -
+

Egy teszt alkalmazás leírása

~128M RAM diff --git a/controller/internal/web/testdata/i18n_parity/app_data_notarget_disabled.html b/controller/internal/web/testdata/i18n_parity/app_data_notarget_disabled.html index f7d170e..f728cfa 100644 --- a/controller/internal/web/testdata/i18n_parity/app_data_notarget_disabled.html +++ b/controller/internal/web/testdata/i18n_parity/app_data_notarget_disabled.html @@ -189,11 +189,11 @@
-
- + -
+

Egy teszt alkalmazás leírása

~128M RAM diff --git a/controller/internal/web/testdata/i18n_parity/app_data_target_auto.html b/controller/internal/web/testdata/i18n_parity/app_data_target_auto.html index 077df92..2510977 100644 --- a/controller/internal/web/testdata/i18n_parity/app_data_target_auto.html +++ b/controller/internal/web/testdata/i18n_parity/app_data_target_auto.html @@ -189,11 +189,11 @@
-
- + -
+

Egy teszt alkalmazás leírása

~128M RAM diff --git a/controller/internal/web/testdata/i18n_parity/app_data_target_ssd.html b/controller/internal/web/testdata/i18n_parity/app_data_target_ssd.html index ba21617..341d1cd 100644 --- a/controller/internal/web/testdata/i18n_parity/app_data_target_ssd.html +++ b/controller/internal/web/testdata/i18n_parity/app_data_target_ssd.html @@ -189,11 +189,11 @@
-
- + -
+

Egy teszt alkalmazás leírása

~128M RAM diff --git a/controller/internal/web/testdata/i18n_parity/app_guide_available.html b/controller/internal/web/testdata/i18n_parity/app_guide_available.html index 84736c7..455dfb5 100644 --- a/controller/internal/web/testdata/i18n_parity/app_guide_available.html +++ b/controller/internal/web/testdata/i18n_parity/app_guide_available.html @@ -182,11 +182,11 @@
-
- + -
+

Titkosított jegyzetek.

~64M RAM diff --git a/controller/internal/web/testdata/i18n_parity/app_guide_full.html b/controller/internal/web/testdata/i18n_parity/app_guide_full.html index 5530e6c..ab38e9c 100644 --- a/controller/internal/web/testdata/i18n_parity/app_guide_full.html +++ b/controller/internal/web/testdata/i18n_parity/app_guide_full.html @@ -189,11 +189,11 @@
-
- + -
+

Titkosított szövegmegosztás.

~128M RAM diff --git a/controller/internal/web/testdata/i18n_parity/app_guide_installable.html b/controller/internal/web/testdata/i18n_parity/app_guide_installable.html index 64549eb..1dfda2f 100644 --- a/controller/internal/web/testdata/i18n_parity/app_guide_installable.html +++ b/controller/internal/web/testdata/i18n_parity/app_guide_installable.html @@ -182,11 +182,11 @@
-
- + -
+

~64M RAM diff --git a/controller/internal/web/testdata/i18n_parity/app_guide_no_guide.html b/controller/internal/web/testdata/i18n_parity/app_guide_no_guide.html index c3017d0..13f1003 100644 --- a/controller/internal/web/testdata/i18n_parity/app_guide_no_guide.html +++ b/controller/internal/web/testdata/i18n_parity/app_guide_no_guide.html @@ -182,11 +182,11 @@
-
- + -
+

Házi készletnyilvántartó.

~128M RAM diff --git a/controller/internal/web/testdata/i18n_parity/app_logs.html b/controller/internal/web/testdata/i18n_parity/app_logs.html index 71453f3..08f1293 100644 --- a/controller/internal/web/testdata/i18n_parity/app_logs.html +++ b/controller/internal/web/testdata/i18n_parity/app_logs.html @@ -189,11 +189,11 @@
-
- + -
+

Egy teszt alkalmazás leírása

~128M RAM diff --git a/controller/internal/web/testdata/i18n_parity/app_settings_after_start.html b/controller/internal/web/testdata/i18n_parity/app_settings_after_start.html index 2806261..92bf743 100644 --- a/controller/internal/web/testdata/i18n_parity/app_settings_after_start.html +++ b/controller/internal/web/testdata/i18n_parity/app_settings_after_start.html @@ -189,11 +189,11 @@
-
- + -
+

~ RAM diff --git a/controller/internal/web/testdata/i18n_parity/app_settings_close_signup.html b/controller/internal/web/testdata/i18n_parity/app_settings_close_signup.html index abeb951..47a696a 100644 --- a/controller/internal/web/testdata/i18n_parity/app_settings_close_signup.html +++ b/controller/internal/web/testdata/i18n_parity/app_settings_close_signup.html @@ -189,11 +189,11 @@
-
- + -
+

~ RAM diff --git a/controller/internal/web/testdata/i18n_parity/app_settings_close_signup_native.html b/controller/internal/web/testdata/i18n_parity/app_settings_close_signup_native.html index 72e26f2..95e8bc6 100644 --- a/controller/internal/web/testdata/i18n_parity/app_settings_close_signup_native.html +++ b/controller/internal/web/testdata/i18n_parity/app_settings_close_signup_native.html @@ -189,11 +189,11 @@
-
- + -
+

~ RAM diff --git a/controller/internal/web/testdata/i18n_parity/app_settings_deployed.html b/controller/internal/web/testdata/i18n_parity/app_settings_deployed.html index b4d0560..e7bbea9 100644 --- a/controller/internal/web/testdata/i18n_parity/app_settings_deployed.html +++ b/controller/internal/web/testdata/i18n_parity/app_settings_deployed.html @@ -189,11 +189,11 @@
-
- + -
+

Titkosított szövegmegosztás.

~64M RAM diff --git a/controller/internal/web/testdata/i18n_parity/app_settings_hold_log.html b/controller/internal/web/testdata/i18n_parity/app_settings_hold_log.html index bc576fe..ae12985 100644 --- a/controller/internal/web/testdata/i18n_parity/app_settings_hold_log.html +++ b/controller/internal/web/testdata/i18n_parity/app_settings_hold_log.html @@ -189,11 +189,11 @@
-
- + -
+

~ RAM diff --git a/controller/internal/web/testdata/i18n_parity/app_settings_install_hold.html b/controller/internal/web/testdata/i18n_parity/app_settings_install_hold.html index e2a3141..4c91413 100644 --- a/controller/internal/web/testdata/i18n_parity/app_settings_install_hold.html +++ b/controller/internal/web/testdata/i18n_parity/app_settings_install_hold.html @@ -189,11 +189,11 @@
-
- + -
+

~ RAM diff --git a/controller/internal/web/testdata/i18n_parity/app_settings_known_login_changed.html b/controller/internal/web/testdata/i18n_parity/app_settings_known_login_changed.html index 32cf66e..a77ea11 100644 --- a/controller/internal/web/testdata/i18n_parity/app_settings_known_login_changed.html +++ b/controller/internal/web/testdata/i18n_parity/app_settings_known_login_changed.html @@ -189,11 +189,11 @@
-
- + -
+

~ RAM diff --git a/controller/internal/web/testdata/i18n_parity/app_settings_ladder_steps.html b/controller/internal/web/testdata/i18n_parity/app_settings_ladder_steps.html index 0a0ae8b..c261e47 100644 --- a/controller/internal/web/testdata/i18n_parity/app_settings_ladder_steps.html +++ b/controller/internal/web/testdata/i18n_parity/app_settings_ladder_steps.html @@ -189,11 +189,11 @@
-
- + -
+

~ RAM diff --git a/controller/internal/web/testdata/i18n_parity/app_settings_lost_files.html b/controller/internal/web/testdata/i18n_parity/app_settings_lost_files.html index b1a7962..7dfb07c 100644 --- a/controller/internal/web/testdata/i18n_parity/app_settings_lost_files.html +++ b/controller/internal/web/testdata/i18n_parity/app_settings_lost_files.html @@ -189,11 +189,11 @@
-
- + -
+

~ RAM diff --git a/controller/internal/web/testdata/i18n_parity/app_settings_not_checked.html b/controller/internal/web/testdata/i18n_parity/app_settings_not_checked.html index 229013d..5c37cfa 100644 --- a/controller/internal/web/testdata/i18n_parity/app_settings_not_checked.html +++ b/controller/internal/web/testdata/i18n_parity/app_settings_not_checked.html @@ -189,11 +189,11 @@
-
- + -
+

~64M RAM diff --git a/controller/internal/web/testdata/i18n_parity/app_settings_operator_creds.html b/controller/internal/web/testdata/i18n_parity/app_settings_operator_creds.html index 9754e68..f0ba100 100644 --- a/controller/internal/web/testdata/i18n_parity/app_settings_operator_creds.html +++ b/controller/internal/web/testdata/i18n_parity/app_settings_operator_creds.html @@ -189,11 +189,11 @@
-
- + -
+

~ RAM diff --git a/controller/internal/web/testdata/i18n_parity/app_settings_restored_login.html b/controller/internal/web/testdata/i18n_parity/app_settings_restored_login.html index 1ce053b..e0937b1 100644 --- a/controller/internal/web/testdata/i18n_parity/app_settings_restored_login.html +++ b/controller/internal/web/testdata/i18n_parity/app_settings_restored_login.html @@ -189,11 +189,11 @@
-
- + -
+

Egy teszt alkalmazás leírása

~128M RAM diff --git a/controller/internal/web/testdata/i18n_parity/app_settings_running.html b/controller/internal/web/testdata/i18n_parity/app_settings_running.html index 29c0a98..1e1a8bc 100644 --- a/controller/internal/web/testdata/i18n_parity/app_settings_running.html +++ b/controller/internal/web/testdata/i18n_parity/app_settings_running.html @@ -189,11 +189,11 @@
-
- + -
+

Egy teszt alkalmazás leírása

~128M RAM diff --git a/controller/internal/web/testdata/i18n_parity/app_settings_setup_gate_button.html b/controller/internal/web/testdata/i18n_parity/app_settings_setup_gate_button.html index fe819ba..ce51b9d 100644 --- a/controller/internal/web/testdata/i18n_parity/app_settings_setup_gate_button.html +++ b/controller/internal/web/testdata/i18n_parity/app_settings_setup_gate_button.html @@ -189,11 +189,11 @@
-
- + -
+

~ RAM diff --git a/controller/internal/web/testdata/i18n_parity/app_settings_setup_gate_native.html b/controller/internal/web/testdata/i18n_parity/app_settings_setup_gate_native.html index 280d2d9..24ce978 100644 --- a/controller/internal/web/testdata/i18n_parity/app_settings_setup_gate_native.html +++ b/controller/internal/web/testdata/i18n_parity/app_settings_setup_gate_native.html @@ -189,11 +189,11 @@
-
- + -
+

~ RAM diff --git a/controller/internal/web/testdata/i18n_parity/app_settings_setup_gate_probe.html b/controller/internal/web/testdata/i18n_parity/app_settings_setup_gate_probe.html index 508a75c..0c361e2 100644 --- a/controller/internal/web/testdata/i18n_parity/app_settings_setup_gate_probe.html +++ b/controller/internal/web/testdata/i18n_parity/app_settings_setup_gate_probe.html @@ -189,11 +189,11 @@
-
- + -
+

~ RAM diff --git a/controller/internal/web/testdata/i18n_parity/app_settings_signup_closed.html b/controller/internal/web/testdata/i18n_parity/app_settings_signup_closed.html index 0db6016..4534388 100644 --- a/controller/internal/web/testdata/i18n_parity/app_settings_signup_closed.html +++ b/controller/internal/web/testdata/i18n_parity/app_settings_signup_closed.html @@ -189,11 +189,11 @@
-
- + -
+

~ RAM diff --git a/controller/internal/web/testdata/i18n_parity/app_settings_signup_native.html b/controller/internal/web/testdata/i18n_parity/app_settings_signup_native.html index 9019e4c..2ed22f4 100644 --- a/controller/internal/web/testdata/i18n_parity/app_settings_signup_native.html +++ b/controller/internal/web/testdata/i18n_parity/app_settings_signup_native.html @@ -189,11 +189,11 @@
-
- + -
+

~ RAM diff --git a/controller/internal/web/testdata/i18n_parity/app_settings_signup_native_open_failed.html b/controller/internal/web/testdata/i18n_parity/app_settings_signup_native_open_failed.html index 8b0afe2..f78a2fe 100644 --- a/controller/internal/web/testdata/i18n_parity/app_settings_signup_native_open_failed.html +++ b/controller/internal/web/testdata/i18n_parity/app_settings_signup_native_open_failed.html @@ -189,11 +189,11 @@
-
- + -
+

~ RAM diff --git a/controller/internal/web/testdata/i18n_parity/app_settings_signup_window.html b/controller/internal/web/testdata/i18n_parity/app_settings_signup_window.html index 2a8794a..076aba5 100644 --- a/controller/internal/web/testdata/i18n_parity/app_settings_signup_window.html +++ b/controller/internal/web/testdata/i18n_parity/app_settings_signup_window.html @@ -189,11 +189,11 @@
-
- + -
+

~ RAM diff --git a/controller/internal/web/testdata/i18n_parity/app_settings_stopped.html b/controller/internal/web/testdata/i18n_parity/app_settings_stopped.html index c601b16..dd6570a 100644 --- a/controller/internal/web/testdata/i18n_parity/app_settings_stopped.html +++ b/controller/internal/web/testdata/i18n_parity/app_settings_stopped.html @@ -189,11 +189,11 @@
-
- + -
+

Egy teszt alkalmazás leírása

~128M RAM diff --git a/controller/internal/web/testdata/i18n_parity/app_settings_updating.html b/controller/internal/web/testdata/i18n_parity/app_settings_updating.html index 902c91f..6b9a47f 100644 --- a/controller/internal/web/testdata/i18n_parity/app_settings_updating.html +++ b/controller/internal/web/testdata/i18n_parity/app_settings_updating.html @@ -189,11 +189,11 @@
-
- + -
+

~ RAM