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 @@
- -