228 lines
9.1 KiB
Markdown
228 lines
9.1 KiB
Markdown
|
|
# 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?
|