From a8ef161e757e02451a7c5883fbd5c4683ac67892 Mon Sep 17 00:00:00 2001 From: Anton Afanasyeu Date: Fri, 12 Jun 2026 21:10:55 +0200 Subject: [PATCH] Hub nav: Short links with descriptions, drag shell, zoom-safe layout. Add URL shortener to the hub left shell with label and description when expanded; share nav_shell.js (click + horizontal drag on handle) across hub and crashes console; widen open nav to 240px; fix viewport overflow when browser zoom changes. Co-authored-by: Cursor --- examples/app_hub/assets/hub-landing.js | 8 +- examples/app_hub/assets/i18n/hub-en.json | 8 ++ examples/app_hub/assets/i18n/hub-ru.json | 8 ++ examples/app_hub/hub-landing.css | 33 ++++--- examples/app_hub/index.php | 19 ++-- .../backend/public/assets/css/app.css | 86 ++++++++++++++++--- .../backend/public/assets/i18n/en.json | 11 +++ .../backend/public/assets/i18n/ru.json | 11 +++ .../backend/public/assets/js/app.js | 9 +- .../backend/public/assets/js/nav_shell.js | 83 ++++++++++++++++++ .../crash_reporter/backend/views/layout.php | 41 +++++++-- 11 files changed, 260 insertions(+), 57 deletions(-) create mode 100644 examples/crash_reporter/backend/public/assets/js/nav_shell.js diff --git a/examples/app_hub/assets/hub-landing.js b/examples/app_hub/assets/hub-landing.js index 912b2a1..70dfa77 100644 --- a/examples/app_hub/assets/hub-landing.js +++ b/examples/app_hub/assets/hub-landing.js @@ -116,13 +116,7 @@ } function bindLeftNav() { - var pane = document.getElementById('landing-nav-pane'); - var handle = document.getElementById('landing-nav-handle'); - if (handle && pane) { - handle.addEventListener('click', function () { - pane.classList.toggle('open'); - }); - } + /* nav_shell.js handles #landing-nav-pane / #landing-nav-handle */ } function initFromUrl() { diff --git a/examples/app_hub/assets/i18n/hub-en.json b/examples/app_hub/assets/i18n/hub-en.json index 0e961f1..2a68924 100644 --- a/examples/app_hub/assets/i18n/hub-en.json +++ b/examples/app_hub/assets/i18n/hub-en.json @@ -16,6 +16,14 @@ "nav.graphs": "Graphs", "nav.remote": "Remote access", "nav.short_links": "Short links", + "nav.short_links_desc": "Mint bearer tokens and shorten URLs for s.f0xx.org.", + "nav.console_desc": "Crash triage home and workspace cards.", + "nav.git_desc": "Browse repos, branches, and tags.", + "nav.issues_desc": "Browse and triage crash reports.", + "nav.tickets_desc": "Roadmap tasks, QA items, and tags.", + "nav.graphs_desc": "Sessions, crashes, and device activity.", + "nav.remote_desc": "WireGuard sessions and device reachability.", + "nav.builder_desc": "Docker CI for APK baking and OTA artifacts.", "nav.builder": "Builder", "nav.toggle": "Navigation", "nav.security": "Security", diff --git a/examples/app_hub/assets/i18n/hub-ru.json b/examples/app_hub/assets/i18n/hub-ru.json index b7a7429..21492a1 100644 --- a/examples/app_hub/assets/i18n/hub-ru.json +++ b/examples/app_hub/assets/i18n/hub-ru.json @@ -16,6 +16,14 @@ "nav.graphs": "Графики", "nav.remote": "Удалённый доступ", "nav.short_links": "Короткие ссылки", + "nav.short_links_desc": "Токены и сокращение URL для s.f0xx.org.", + "nav.console_desc": "Главная консоли и карточки разделов.", + "nav.git_desc": "Репозитории, ветки и теги.", + "nav.issues_desc": "Просмотр и разбор отчётов о сбоях.", + "nav.tickets_desc": "Задачи roadmap, QA и теги.", + "nav.graphs_desc": "Сессии, сбои и активность устройств.", + "nav.remote_desc": "Сессии WireGuard и доступ к устройствам.", + "nav.builder_desc": "Docker CI для сборки APK и OTA.", "nav.builder": "Сборщик", "nav.toggle": "Навигация", "nav.security": "Безопасность", diff --git a/examples/app_hub/hub-landing.css b/examples/app_hub/hub-landing.css index d4c264e..c08f253 100644 --- a/examples/app_hub/hub-landing.css +++ b/examples/app_hub/hub-landing.css @@ -5,12 +5,19 @@ --landing-footer-h: 40px; --landing-left-w: 56px; --landing-rail-w: 44px; - overflow: hidden; + display: flex; + flex-direction: column; + min-height: 100vh; + min-height: 100dvh; + width: 100%; + max-width: 100%; + overflow-x: clip; + overflow-y: auto; } /* (1) Top header */ .landing-top { - position: fixed; + position: sticky; top: 0; left: 0; right: 0; @@ -145,11 +152,11 @@ /* Frame: (2) left + (3) body + space for (4) rail */ .landing-frame { - position: fixed; - top: var(--landing-header-h); - left: 0; - right: 0; - bottom: var(--landing-footer-h); + position: relative; + flex: 1 1 auto; + width: 100%; + max-width: 100%; + min-height: calc(100dvh - var(--landing-header-h) - var(--landing-footer-h)); display: flex; z-index: 5; pointer-events: none; @@ -162,8 +169,9 @@ flex-direction: column; flex: 0 0 var(--landing-left-w); width: var(--landing-left-w); - height: 100%; - max-height: 100%; + align-self: stretch; + min-height: 100%; + max-height: none; overflow: hidden; z-index: 3; pointer-events: auto; @@ -180,15 +188,16 @@ border-top: 1px solid var(--border); } .landing-left.nav-pane.open { - width: 200px; - flex-basis: 200px; + width: 240px; + flex-basis: 240px; } /* (3) Body — full viewport pages, scroll snap */ .landing-scroll { flex: 1; min-width: 0; - height: 100%; + align-self: stretch; + min-height: 100%; overflow-y: auto; overflow-x: hidden; scroll-snap-type: y mandatory; diff --git a/examples/app_hub/index.php b/examples/app_hub/index.php index 53e281f..146ebee 100644 --- a/examples/app_hub/index.php +++ b/examples/app_hub/index.php @@ -38,7 +38,7 @@ function hub_h(string $s): string { - + + @@ -137,14 +138,14 @@ function hub_h(string $s): string {