# Fachliche Anforderungen: Responsive UI **Modul:** parallel zu Features (kein festes Versions-Label) **Status:** Fachlich freigegeben, technische Implementierung ausstehend **Letzte Aktualisierung:** März 2026 --- ## 1. Überblick Die App soll vollständig responsive sein und auf allen Bildschirmgrößen optimal funktionieren – vom iPhone über iPad bis zum Desktop-Browser. Die PWA-Funktionalität auf dem iPhone bleibt vollständig erhalten. --- ## 2. Breakpoints | Bereich | Breite | Layout | |---------|--------|--------| | Mobile | < 1024px | Bottom Navigation (wie jetzt) | | Desktop | ≥ 1024px | Sidebar Navigation links, Content rechts | Ein separates Tablet-Layout (768px) wird **nicht** eingeführt – unterhalb 1024px verhält sich alles wie Mobile. --- ## 3. Mobile Layout (< 1024px) – unverändert Das bestehende Mobile-Layout bleibt exakt so wie es ist: - Bottom Navigation mit Icons + Labels - Volle Breite, 16px seitliches Padding - 80px Bottom-Padding für Navigation - PWA auf iPhone funktioniert wie bisher --- ## 4. Desktop Layout (≥ 1024px) ### 4.1 Grundstruktur ``` ┌─────────────────────────────────────────────┐ │ Sidebar (220px) │ Content (flex 1) │ │ │ │ │ [Logo] │ Seiteninhalt │ │ │ (max-width: 1200px, │ │ Dashboard │ zentriert) │ │ Erfassung │ │ │ Verlauf │ │ │ Analyse │ │ │ Einstellungen │ │ │ Admin │ │ │ │ │ │ [Avatar + Name] │ │ └─────────────────────────────────────────────┘ ``` ### 4.2 Sidebar **Position:** Fixed links, volle Höhe (100vh) **Breite:** 220px **Farben:** `var(--surface)` Hintergrund, `var(--border)` rechte Trennlinie **Inhalt von oben nach unten:** ``` ┌──────────────────┐ │ [Ensō-Logo] │ ← Icon (40px) + "Mitai Jinkendo" Text │ Mitai Jinkendo │ ├──────────────────┤ │ │ │ 🏠 Dashboard │ ← Icons + Text (gleiche Nav-Items wie Bottom Nav) │ ✏️ Erfassung │ ← Aktive Seite: var(--accent) Hintergrund (leicht) │ 📊 Verlauf │ + var(--accent) Text + linke Akzent-Linie (3px) │ 🧠 Analyse │ │ ⚙️ Einstellungen│ │ 👑 Admin │ ← nur sichtbar wenn role='admin' │ │ ├──────────────────┤ │ [Avatar] │ ← Nutzer-Avatar (32px) + Name + Tier-Badge │ Lars │ │ selfhosted │ └──────────────────┘ ``` **Aktive Seite hervorheben:** ```css /* Aktiver Nav-Item Desktop */ background: var(--accent-light); /* #E1F5EE leicht grüner Hintergrund */ color: var(--accent); /* #1D9E75 grüner Text */ border-left: 3px solid var(--accent); /* linke Akzent-Linie */ border-radius: 0 8px 8px 0; ``` ### 4.3 Content-Bereich - `margin-left: 220px` (Sidebar-Breite) - `padding: 24px 32px` - `max-width: 1200px` (zentriert innerhalb des verfügbaren Raums) - Kein Bottom-Padding für Navigation (Sidebar ersetzt Bottom Nav) --- ## 5. Seiten-spezifische Desktop-Layouts ### 5.1 Dashboard **Mobile:** Alle Karten untereinander **Desktop:** 2-spaltig oder 4-spaltig je nach Kartentyp ``` ┌──────────────────────────────────────────────┐ │ Hallo Lars 👋 Mo, 20. März 2026 │ ├──────────┬──────────┬──────────┬─────────────┤ │ Gewicht │ KF │ Mager- │ Kalorien │ │ 86,1 kg │ 19,9% │ masse │ 1.447 kcal │ ├──────────┴──────────┴──────────┴─────────────┤ │ Ziele [Details →] │ │ ████████░░ Gewicht: 27% ████░░░░ KF: 45% │ ├──────────────────────────────────────────────┤ │ Kalorien + Gewicht (Chart – volle Breite) │ └──────────────────────────────────────────────┘ ``` ### 5.2 Verlauf **Mobile:** Tabs oben, Chart/Tabelle darunter **Desktop:** Tabs links als vertikale Liste, Chart/Tabelle rechts ``` ┌────────────┬─────────────────────────────────┐ │ Gewicht ← │ Chart + Tabelle │ │ Körperfett │ (nimmt volle rechte Breite) │ │ Umfänge │ │ │ Ernährung │ │ │ Aktivität │ │ └────────────┴─────────────────────────────────┘ ``` ### 5.3 Analyse **Mobile:** Prompt-Liste, dann Ergebnis darunter **Desktop:** Prompt-Liste links (300px), Ergebnis rechts ``` ┌──────────────────┬──────────────────────────┐ │ Prompts │ Ergebnis / Verlauf │ │ ───────────── │ │ │ 🔍 Gesamt │ [Letzte Analyse] │ │ 🫧 Körper ← │ [Text der Analyse...] │ │ 🍽️ Ernährung │ │ │ 🏋️ Training │ [Ältere Analysen] │ │ ───────────── │ │ │ Pipeline ▶ │ │ └──────────────────┴──────────────────────────┘ ``` ### 5.4 Erfassung **Mobile:** Formular volle Breite **Desktop:** Formular zentriert, max-width 600px ``` ┌──────────────────────────────────────────────┐ │ Gewicht erfassen │ │ │ │ ┌─────────────────────────────┐ │ │ │ Datum [20.03.2026] │ │ │ │ Gewicht [86,1 ] kg │ │ │ │ Notiz [ ] │ │ │ │ │ │ │ │ [Speichern] │ │ │ └─────────────────────────────┘ │ └──────────────────────────────────────────────┘ ``` ### 5.5 Admin-Panel **Mobile:** Tabellen horizontal scrollbar **Desktop:** Tabellen nutzen volle Breite, mehr Spalten sichtbar --- ## 6. Übergangsverhalten ### Fenster-Resize - Beim Verkleinern unter 1024px: Sidebar verschwindet, Bottom Nav erscheint - Beim Vergrößern über 1024px: Bottom Nav verschwindet, Sidebar erscheint - Kein Flackern – CSS media queries, kein JavaScript-Resize-Listener nötig ### Aktiver Zustand synchronisiert - Aktive Seite wird in Sidebar UND Bottom Nav korrekt hervorgehoben - (Technisch: gleiche State-Variable, unterschiedliches Rendering) --- ## 7. Was sich nicht ändert - Farben, CSS-Variablen, Design-Tokens bleiben identisch - Alle Funktionen bleiben auf Desktop verfügbar - PWA auf iPhone bleibt vollständig funktionsfähig - Keine externen CSS-Frameworks (kein Tailwind, kein Bootstrap) - Inline-Styles + CSS-Variablen-Ansatz bleibt erhalten --- ## 8. Abgrenzung & offene Fragen ### In diesem Modul enthalten: - Sidebar Navigation Desktop - Content-Bereich mit max-width - Dashboard 4-spaltig - Verlauf 2-spaltig (Tabs + Chart) - Analyse 2-spaltig (Prompts + Ergebnis) - Erfassung zentriert schmal - Admin-Panel breite Tabellen ### Nicht in diesem Modul: - Dark Mode – separates Feature - Animationen / Transitions – optional später - Collapsed Sidebar (Icon-only Modus) – optional später ### Offene Fragen für technische Planung: 1. Wird AppLayout als neue Wrapper-Komponente eingeführt oder App.jsx direkt angepasst? 2. CSS Media Queries in app.css oder CSS-in-JS (Inline-Style mit window.innerWidth)? 3. Wie wird der aktive Nav-Item-State zwischen Sidebar und Bottom Nav geteilt? 4. Verlauf-Tabs: werden sie zu einer vertikalen Liste refactored oder per CSS umgestaltet?