From e73d3470b311f035ed025f92abb684793eb0345a Mon Sep 17 00:00:00 2001 From: Antigravity Date: Tue, 6 Oct 2026 21:28:25 +0300 Subject: [PATCH] feat(ui): unify header and implement navigation drawer (Task 17) - Redesign top header into clean, uncluttered layout with hamburger drawer trigger, clickable logo, central SRS focus badge, theme toggle and profile avatar - Implement unified responsive Navigation Drawer for both desktop and mobile with touch swipe-to-dismiss, backdrop blur, keyboard Esc support and background scroll lock - Streamline mobile bottom tab bar to 4 core actions (Dictionary, SRS, Reader, Menu) with Menu opening the unified drawer - Synchronize real-time SRS due badges and dictionary word statistics between header, bottom tabs, and drawer - Eliminate obsolete separate mobile-menu-modal in favor of unified drawer - Bump Service Worker cache version to notes-v5.7 --- TODO.md | 32 +-- app/static/css/style.css | 363 ++++++++++++++++++++++++++-- app/static/index.html | 192 ++++++++++----- app/static/js/app.js | 274 +++++++++++++-------- app/static/js/modules/dictionary.js | 16 +- app/static/js/modules/srs.js | 2 + app/static/js/modules/ui.js | 21 +- app/static/sw.js | 2 +- 8 files changed, 707 insertions(+), 195 deletions(-) diff --git a/TODO.md b/TODO.md index 78fcaef..4e340c6 100644 --- a/TODO.md +++ b/TODO.md @@ -377,24 +377,28 @@ --- -### 17. πŸ” Π Π°Π·Π³Ρ€ΡƒΠ·ΠΊΠ° Ρ…Π΅Π΄Π΄Π΅Ρ€Π° ΠΈ Сдиная навигация Ρ‡Π΅Ρ€Π΅Π· Π±ΠΎΠΊΠΎΠ²ΠΎΠ΅ мСню / Drawer (Unified Navigation & Header Redesign) -- [ ] **ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ Ρ…Π΅Π΄Π΄Π΅Ρ€Π°**: - - Π’ шапкС скопилось 8+ ΠΊΠ½ΠΎΠΏΠΎΠΊ (`πŸ“š Π§ΠΈΡ‚Π°Π»ΠΊΠ°`, `🎯 ВСсты CEFR`, `πŸ“– Π“Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ°`, `πŸŽ“ Π’Ρ€Π΅Π½Π°ΠΆΡ‘Ρ€`, `πŸ“Š Бтатистика`, `πŸ“€ Экспорт`, Ρ‚Π΅ΠΌΠ°, ΡˆΠ΅ΡΡ‚Π΅Ρ€Π΅Π½ΠΊΠ°, ΠΏΡ€ΠΎΡ„ΠΈΠ»ΡŒ), Π½Π° экранах ΠΏΠ»Π°Π½ΡˆΠ΅Ρ‚ΠΎΠ² ΠΈ Π½ΠΎΡƒΡ‚Π±ΡƒΠΊΠΎΠ² Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΈ Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΡˆΡƒΠΌ. - - Π Π°Π·Ρ€ΠΎΠ·Π½Π΅Π½Π½ΠΎΡΡ‚ΡŒ UX: Π½Π° дСсктопС всС ΠΊΠ½ΠΎΠΏΠΊΠΈ Π² шапкС, Π½Π° ΠΌΠΎΠ±ΠΈΠ»ΡŒΠ½Ρ‹Ρ… β€” Π½ΠΈΠΆΠ½ΠΈΠΉ Ρ‚Π°Π±-Π±Π°Ρ€ + модальноС мСню. -- [ ] **Π•Π΄ΠΈΠ½Ρ‹ΠΉ Π»Π°ΠΊΠΎΠ½ΠΈΡ‡Π½Ρ‹ΠΉ Header (Desktop, Tablet, Mobile)**: +### 17. πŸ” Π Π°Π·Π³Ρ€ΡƒΠ·ΠΊΠ° Ρ…Π΅Π΄Π΄Π΅Ρ€Π° ΠΈ Сдиная навигация Ρ‡Π΅Ρ€Π΅Π· Π±ΠΎΠΊΠΎΠ²ΠΎΠ΅ мСню / Drawer (Unified Navigation & Header Redesign) (Completed) +- [x] **ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ Ρ…Π΅Π΄Π΄Π΅Ρ€Π° ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Ρ€Π΅ΡˆΠ΅Π½Π°**: + - Π›ΠΈΠΊΠ²ΠΈΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ Π½Π°Π³Ρ€ΠΎΠΌΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΈΠ· 8+ ΠΊΠ½ΠΎΠΏΠΎΠΊ Π² шапкС, устранён Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΡˆΡƒΠΌ ΠΈ Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΉ сдвиг Π½Π° ΠΏΠ»Π°Π½ΡˆΠ΅Ρ‚Π°Ρ… ΠΈ ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚Π½Ρ‹Ρ… экранах. + - УстранСна Ρ€Π°Π·Ρ€ΠΎΠ·Π½Π΅Π½Π½ΠΎΡΡ‚ΡŒ UX: Π½Π° дСсктопС, ΠΏΠ»Π°Π½ΡˆΠ΅Ρ‚Π΅ ΠΈ смартфонС Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ дСйствуСт Сдиная систСма Π½Π°Π²ΠΈΠ³Π°Ρ†ΠΈΠΈ. +- [x] **Π•Π΄ΠΈΠ½Ρ‹ΠΉ Π»Π°ΠΊΠΎΠ½ΠΈΡ‡Π½Ρ‹ΠΉ Header (Desktop, Tablet, Mobile)**: - Π‘Π»Π΅Π²Π°: Кнопка Π²Ρ‹Π·ΠΎΠ²Π° Π±ΠΎΠΊΠΎΠ²ΠΎΠ³ΠΎ мСню (Π‘ΡƒΡ€Π³Π΅Ρ€ `☰` / `ph-list`), ΠΊΠ»ΠΈΠΊΠ°Π±Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π»ΠΎΠ³ΠΎΡ‚ΠΈΠΏ `πŸ“– Notes` (Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ Π² ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ). - - Π¦Π΅Π½Ρ‚Ρ€: Ѐокусная ΠΊΠ½ΠΎΠΏΠΊΠ° быстрого доступа ΠΊ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΌΡƒ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡŽ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, `πŸŽ“ Π’Ρ€Π΅Π½Π°ΠΆΡ‘Ρ€ SRS` с ΠΆΠΈΠ²Ρ‹ΠΌ счётчиком ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π΅Π½ΠΈΠΉ `srs-badge`). - - Π‘ΠΏΡ€Π°Π²Π°: ΠŸΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚Π΅Π»ΡŒ Ρ‚Π΅ΠΌΡ‹ `πŸŒ“`, компактная плашка ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ/Π°Π²Π°Ρ‚Π°Ρ€. -- [ ] **Π•Π΄ΠΈΠ½Ρ‹ΠΉ Π²Ρ‹Π΄Π²ΠΈΠΆΠ½ΠΎΠΉ Drawer (Π‘ΠΎΠΊΠΎΠ²ΠΎΠ΅ мСню Π½Π°Π²ΠΈΠ³Π°Ρ†ΠΈΠΈ)**: - - Плавная аппаратная анимация (`transform: translateX`, `backdrop-filter: blur`). + - Π¦Π΅Π½Ρ‚Ρ€: Ѐокусная ΠΊΠ½ΠΎΠΏΠΊΠ° быстрого доступа ΠΊ Π³Π»Π°Π²Π½ΠΎΠΌΡƒ Π΅ΠΆΠ΅Π΄Π½Π΅Π²Π½ΠΎΠΌΡƒ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡŽ (`πŸŽ“ Π’Ρ€Π΅Π½Π°ΠΆΡ‘Ρ€ SRS` с ΠΆΠΈΠ²Ρ‹ΠΌ счётчиком ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π΅Π½ΠΈΠΉ `srs-badge`) ΠΈ ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚Π½Ρ‹Π΅ счСтчики Π±Π°Π·Ρ‹ (`ВсСго: X`, `БСгодня: +Y`). На смартфонах счСтчики автоматичСски ΡΠΊΡ€Ρ‹Π²Π°ΡŽΡ‚ΡΡ, Π° ΠΊΠ½ΠΎΠΏΠΊΠ° сТимаСтся Π΄ΠΎ ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚Π½ΠΎΠ³ΠΎ Π±Π΅ΠΉΠ΄ΠΆΠ° `πŸŽ“ (N)`. + - Π‘ΠΏΡ€Π°Π²Π°: ΠŸΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚Π΅Π»ΡŒ Ρ‚Π΅ΠΌΡ‹ `πŸŒ“`, компактная плашка ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ/Π°Π²Π°Ρ‚Π°Ρ€ `πŸ‘€ user` (Π½Π° смартфонах отобраТаСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠΊΠΎΠ½ΠΊΠ° Π°Π²Π°Ρ‚Π°Ρ€Π°). +- [x] **Π•Π΄ΠΈΠ½Ρ‹ΠΉ Π²Ρ‹Π΄Π²ΠΈΠΆΠ½ΠΎΠΉ Drawer (Π‘ΠΎΠΊΠΎΠ²ΠΎΠ΅ мСню Π½Π°Π²ΠΈΠ³Π°Ρ†ΠΈΠΈ)**: + - Плавная аппаратная анимация (`transform: translateX`, `backdrop-filter: blur(4px)`). + - ΠšΠ°Ρ€Ρ‚ΠΎΡ‡ΠΊΠ° профиля с Π°Π²Π°Ρ‚Π°Ρ€ΠΎΠΌ, ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΈ описаниСм. + - Π˜Π½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ ΠΌΠΈΠ½ΠΈ-Π΄Π°ΡˆΠ±ΠΎΡ€Π΄ статистики (ВсСго Π² Π±Π°Π·Π΅, БСгодня, На ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π΅Π½ΠΈΠ΅). - ЛогичСская Π³Ρ€ΡƒΠΏΠΏΠΈΡ€ΠΎΠ²ΠΊΠ° ΠΏΡƒΠ½ΠΊΡ‚ΠΎΠ² с красивыми ΠΈΠΊΠΎΠ½ΠΊΠ°ΠΌΠΈ: - - **ΠžΠ±ΡƒΡ‡Π΅Π½ΠΈΠ΅ & Π§Ρ‚Π΅Π½ΠΈΠ΅**: Π‘Π»ΠΎΠ²Π°Ρ€ΡŒ, Π§ΠΈΡ‚Π°Π»ΠΊΠ°, ВСсты CEFR, Π“Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ° ΠœΠ΅Ρ€Ρ„ΠΈ, Π’Ρ€Π΅Π½Π°ΠΆΡ‘Ρ€ SRS. - - **Аналитика**: Бтатистика обучСния ΠΈ ΠΊΠ°Π»Π΅Π½Π΄Π°Ρ€ΡŒ активности (Heatmap). - - **Настройки & ΠŸΡ€ΠΎΡ„ΠΈΠ»ΡŒ**: Экспорт словаря, Π‘ΠΌΠ΅Π½Π° пароля, ΠŸΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Ρ‚Π΅ΠΌΡ‹, Π’Ρ‹Ρ…ΠΎΠ΄. + - **ΠžΠ±ΡƒΡ‡Π΅Π½ΠΈΠ΅ & Π§Ρ‚Π΅Π½ΠΈΠ΅**: Π‘Π»ΠΎΠ²Π°Ρ€ΡŒ & Поиск, Π’Ρ€Π΅Π½Π°ΠΆΡ‘Ρ€ SRS (с ΠΆΠΈΠ²Ρ‹ΠΌ Π±Π΅ΠΉΠ΄ΠΆΠ΅ΠΌ), Π§ΠΈΡ‚Π°Π»ΠΊΠ° & Книги, ВСсты CEFR (A1–B2), Π“Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ° ΠœΠ΅Ρ€Ρ„ΠΈ & Π’Π΅Ρ‚Ρ€Π°Π΄ΡŒ. + - **Аналитика**: ΠšΠ°Π»Π΅Π½Π΄Π°Ρ€ΡŒ активности & Бтатистика (Heatmap). + - **Настройки & ΠŸΡ€ΠΎΡ„ΠΈΠ»ΡŒ**: Экспорт словаря, Π‘ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΏΠ°Ρ€ΠΎΠ»ΡŒ, ΠŸΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Ρ‚Π΅ΠΌΡ‹, Π’Ρ‹Ρ…ΠΎΠ΄ ΠΈΠ· Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚Π°. - Π—Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ ΠΏΠΎ ΠΊΠ»ΠΈΠΊΡƒ Π²Π½Π΅ области (ΠΎΠ²Π΅Ρ€Π»Π΅ΠΉ), ΠΊΠ½ΠΎΠΏΠΊΠ΅ `βœ•`, клавишС Esc ΠΈ свайпу Π²Π»Π΅Π²ΠΎ Π½Π° Ρ‚Π°Ρ‡-устройствах (Swipe to dismiss). - Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° скролла Ρ„ΠΎΠ½Π° (`overflow: hidden` Π½Π° `body`) ΠΏΡ€ΠΈ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠΌ Drawer. -- [ ] **ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ мобильного Ρ€Π΅ΠΆΠΈΠΌΠ°**: - - БогласованиС с Bottom Tab Bar: ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π½Π° Π½ΠΈΠΆΠ½Π΅ΠΉ ΠΏΠ°Π½Π΅Π»ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ 3-4 ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… быстрых дСйствия Π»ΠΈΠ±ΠΎ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ пСрСвСсти Π½Π°Π²ΠΈΠ³Π°Ρ†ΠΈΡŽ Π² чистый Drawer-ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½ Π±Π΅Π· дублирования элСмСнтов. + - ΠŸΠΎΠ΄ΡΠ²Π΅Ρ‚ΠΊΠ° Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ Ρ€Π°Π·Π΄Π΅Π»Π° (`.active`), синхронизированная с URL-Ρ…ΡΡˆΠ΅ΠΌ ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π°ΠΌΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ экранами. +- [x] **ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ мобильного Ρ€Π΅ΠΆΠΈΠΌΠ°**: + - На Π½ΠΈΠΆΠ½Π΅ΠΉ ΠΏΠ°Π½Π΅Π»ΠΈ (Bottom Tab Bar) оставлСны 4 ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… быстрых дСйствия: `πŸ“– Π‘Π»ΠΎΠ²Π°Ρ€ΡŒ`, `πŸŽ“ Π’Ρ€Π΅Π½Π°ΠΆΡ‘Ρ€`, `πŸ“š Π§ΠΈΡ‚Π°Π»ΠΊΠ°`, `☰ МСню`. + - Π’Π°ΠΏ ΠΏΠΎ `☰ МСню` Π½Π° мобильном ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ Π΅Π΄ΠΈΠ½Ρ‹ΠΉ Drawer, ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Π·Π°ΠΌΠ΅Π½ΠΈΠ² ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΠΉ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΌΠΎΠ΄Π°Π»ΡŒΠ½Ρ‹ΠΉ слой `mobile-menu-modal` Π±Π΅Π· дублирования вСрстки ΠΈ стилСй. --- diff --git a/app/static/css/style.css b/app/static/css/style.css index e59a394..e6bb59d 100644 --- a/app/static/css/style.css +++ b/app/static/css/style.css @@ -245,13 +245,15 @@ body { min-height: 100vh; } +/* App Navbar (Unified Layout) */ .navbar { background-color: var(--bg-surface); border-bottom: 1px solid var(--border-color); - padding: 12px 24px; + padding: 8px 20px; display: flex; align-items: center; justify-content: space-between; + gap: 16px; position: sticky; top: 0; z-index: 100; @@ -259,10 +261,46 @@ body { box-sizing: border-box; } +.nav-left { + display: flex; + align-items: center; + gap: 10px; + flex-shrink: 0; +} + +.drawer-toggle-btn { + display: inline-flex; + align-items: center; + justify-content: center; + width: 36px; + height: 36px; + border-radius: var(--radius-sm); + background-color: transparent; + border: 1px solid transparent; + color: var(--text-main); + cursor: pointer; + font-size: 20px; + line-height: 1; + transition: var(--transition); +} + +.drawer-toggle-btn:hover { + background-color: var(--bg-surface-hover); + border-color: var(--border-color); + color: var(--primary); +} + .nav-brand { display: flex; align-items: center; gap: 8px; + cursor: pointer; + user-select: none; + transition: opacity 0.15s ease; +} + +.nav-brand:hover { + opacity: 0.85; } .brand-icon { @@ -286,9 +324,18 @@ body { margin-left: 4px; } +.nav-center { + display: flex; + align-items: center; + justify-content: center; + gap: 14px; + flex: 1; + min-width: 0; +} + .nav-stats { display: flex; - gap: 12px; + gap: 8px; } .stat-badge { @@ -311,22 +358,286 @@ body { .nav-actions { display: flex; align-items: center; - gap: 12px; + gap: 10px; + flex-shrink: 0; } -.user-profile { - display: flex; +.user-profile-btn { + display: inline-flex; align-items: center; gap: 8px; + padding: 5px 12px; + border-radius: var(--radius-full); + background-color: var(--bg-surface-hover); + border: 1px solid var(--border-color); + color: var(--text-main); + font-size: 13px; + font-weight: 600; + cursor: pointer; + transition: var(--transition); +} + +.user-profile-btn:hover { + border-color: var(--primary); + color: var(--primary); + background-color: var(--primary-dim); +} + +.user-avatar-icon { + font-size: 15px; } .user-badge { font-size: 13px; - color: var(--text-muted); + color: var(--text-main); font-weight: 600; - background-color: var(--bg-surface-hover); - padding: 4px 10px; +} + +/* ----------------------------------------------------------------------- + Unified Navigation Drawer (Desktop & Mobile) + ----------------------------------------------------------------------- */ +.drawer-backdrop { + position: fixed; + top: 0; + left: 0; + width: 100vw; + height: 100vh; + background-color: rgba(0, 0, 0, 0.65); + backdrop-filter: blur(4px); + -webkit-backdrop-filter: blur(4px); + z-index: 1999; + opacity: 0; + pointer-events: none; + transition: opacity 0.26s cubic-bezier(0.16, 1, 0.3, 1); +} + +.drawer-backdrop.active { + opacity: 1; + pointer-events: auto; +} + +.app-drawer { + position: fixed; + top: 0; + left: 0; + bottom: 0; + width: min(340px, 86vw); + background-color: var(--bg-surface); + border-right: 1px solid var(--border-color); + box-shadow: 4px 0 28px rgba(0, 0, 0, 0.5); + z-index: 2000; + display: flex; + flex-direction: column; + transform: translateX(-100%); + transition: transform 0.28s cubic-bezier(0.16, 1, 0.3, 1); + will-change: transform; + overflow-y: auto; + -webkit-overflow-scrolling: touch; +} + +.app-drawer.active { + transform: translateX(0); +} + +body.drawer-open { + overflow: hidden !important; +} + +.drawer-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: calc(16px + env(safe-area-inset-top, 0px)) 16px 14px 18px; + border-bottom: 1px solid var(--border-color); + background-color: var(--bg-surface); + position: sticky; + top: 0; + z-index: 10; +} + +.drawer-user-card { + display: flex; + align-items: center; + gap: 12px; + min-width: 0; +} + +.drawer-user-avatar { + width: 42px; + height: 42px; + border-radius: var(--radius-full); + background: linear-gradient(135deg, var(--primary), #6366f1); + color: #ffffff; + display: flex; + align-items: center; + justify-content: center; + font-size: 20px; + flex-shrink: 0; + box-shadow: var(--shadow-sm); +} + +.drawer-user-info { + display: flex; + flex-direction: column; + min-width: 0; +} + +.drawer-user-name { + font-size: 15px; + font-weight: 700; + color: var(--text-main); + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.drawer-user-desc { + font-size: 12px; + color: var(--text-muted); + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.drawer-close-btn { + width: 34px; + height: 34px; border-radius: var(--radius-sm); + display: flex; + align-items: center; + justify-content: center; + font-size: 18px; + color: var(--text-muted); + background: transparent; + border: none; + cursor: pointer; + transition: var(--transition); +} + +.drawer-close-btn:hover { + background-color: var(--bg-surface-hover); + color: var(--text-main); +} + +.drawer-stats-summary { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 8px; + padding: 12px 14px; + margin: 12px 14px 4px 14px; + background-color: var(--bg-main); + border: 1px solid var(--border-color); + border-radius: var(--radius-md); + text-align: center; +} + +.drawer-stat-item { + display: flex; + flex-direction: column; + gap: 2px; +} + +.drawer-stat-val { + font-size: 16px; + font-weight: 800; + color: var(--text-main); +} + +.drawer-stat-lbl { + font-size: 10px; + font-weight: 600; + color: var(--text-dim); + text-transform: uppercase; + letter-spacing: 0.3px; +} + +.drawer-nav { + flex: 1; + padding: 8px 12px; + display: flex; + flex-direction: column; + gap: 4px; +} + +.drawer-section-title { + font-size: 11px; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.6px; + color: var(--text-dim); + padding: 12px 8px 4px 8px; +} + +.drawer-nav-list { + list-style: none; + padding: 0; + margin: 0; + display: flex; + flex-direction: column; + gap: 3px; +} + +.drawer-nav-item { + width: 100%; + display: flex; + align-items: center; + gap: 12px; + padding: 10px 12px; + border-radius: var(--radius-sm); + background: transparent; + border: 1px solid transparent; + color: var(--text-main); + font-size: 14px; + font-weight: 500; + text-align: left; + cursor: pointer; + transition: var(--transition); + text-decoration: none; +} + +.drawer-nav-item:hover { + background-color: var(--bg-surface-hover); + color: var(--primary); + border-color: var(--border-color); +} + +.drawer-nav-item.active { + background-color: var(--primary-dim); + color: var(--primary); + border-color: rgba(56, 189, 248, 0.3); + font-weight: 700; +} + +.drawer-item-icon { + font-size: 18px; + width: 24px; + text-align: center; + flex-shrink: 0; +} + +.drawer-item-label { + flex: 1; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.drawer-badge { + padding: 2px 7px; + font-size: 11px; + font-weight: 700; + border-radius: var(--radius-full); + background-color: var(--primary); + color: #0f172a; + line-height: 1.2; +} + +.drawer-footer { + padding: 14px 16px calc(14px + env(safe-area-inset-bottom, 0px)) 16px; + border-top: 1px solid var(--border-color); + font-size: 12px; + color: var(--text-dim); + text-align: center; } /* Buttons */ @@ -2493,27 +2804,35 @@ body { padding-bottom: calc(74px + env(safe-area-inset-bottom, 0px)) !important; } - /* 3. Header & Navigation: Clean iOS App Header */ + /* 3. Header & Navigation: Unified Responsive Header */ .navbar { - padding: calc(8px + env(safe-area-inset-top, 0px)) 12px 8px 12px; - position: sticky; - top: 0; + padding: calc(8px + env(safe-area-inset-top, 0px)) 10px 8px 10px; + gap: 8px; } .brand-sub, - .nav-center, - .nav-actions #nav-reader-btn, - .nav-actions #srs-trainer-btn, - .nav-actions #stats-open-btn, - .nav-actions #export-open-btn, - .nav-actions .user-profile { + .nav-stats { display: none !important; } - .mobile-only-btn { - display: inline-flex !important; - align-items: center; - justify-content: center; + .btn-trainer .trainer-text { + display: none !important; + } + + .btn-trainer { + padding: 6px 10px !important; + font-size: 13px !important; + min-height: 36px; + } + + .user-profile-btn #user-display-name { + display: none !important; + } + + .user-profile-btn { + padding: 6px 10px !important; + border-radius: var(--radius-sm); + min-height: 36px; } .mobile-tab-bar { diff --git a/app/static/index.html b/app/static/index.html index 1d8da05..5b56d6d 100644 --- a/app/static/index.html +++ b/app/static/index.html @@ -52,48 +52,37 @@ - + - -