# Sidebar Requirements Specification v2 **Erstellt:** 2025-12-16 **Version:** 2.0 **Status:** Spezifikation für Neuimplementierung **Basierend auf:** `sidebar-analysis-current-state.md`, `daisyui-drawer-pattern.md` --- ## Executive Summary Diese Spezifikation definiert die Anforderungen für eine **standardkonforme Sidebar-Implementierung** basierend auf **DaisyUI Drawer Pattern** ohne Custom CSS Variants. Die Sidebar unterstützt Desktop (expanded/collapsed States) und Mobile (Overlay Drawer). **Kernprinzipien:** - ✅ **100% DaisyUI Standard** - keine Custom Variants - ✅ **Ein Layout** - keine Duplikate für Mobile/Desktop - ✅ **State via data-attribute** - CSS reagiert auf `[data-sidebar-expanded]` - ✅ **localStorage Persistence** - State bleibt über Seitenreloads erhalten - ✅ **WCAG 2.1 Level AA** - vollständig accessible --- ## 1. Funktionale Anforderungen ### 1.1 Logo | Eigenschaft | Wert | Begründung | |-------------|------|------------| | **Größe** | `size-8` (32px × 32px) | Konsistent, gut lesbar | | **Sichtbarkeit** | Immer sichtbar | Branding, Orientierung | | **States** | Gleich in expanded & collapsed | Keine unterschiedlichen Logo-Elemente | | **Position** | Links im Header | Standard-Pattern | | **Pfad** | `/images/mila.svg` | Projektspezifisch | **Verhalten:** - Expanded: Logo + Club-Name - Collapsed: Logo zentriert (horizontal & vertikal) ### 1.2 Toggle-Button | Eigenschaft | Wert | Begründung | |-------------|------|------------| | **Sichtbarkeit** | Nur Desktop (≥ lg) | Mobile nutzt Hamburger in Header | | **Position** | Rechts im Sidebar-Header | Schnell erreichbar | | **Icon (expanded)** | `hero-chevron-left` | Zeigt Collapse-Richtung | | **Icon (collapsed)** | `hero-chevron-right` | Zeigt Expand-Richtung | | **Größe** | `btn-sm btn-square` | Kompakt, icon-only | | **Variante** | `btn-ghost` | Dezent, nicht dominant | **Icon-Swap Strategie:** - Zwei separate `<.icon>` Elemente - CSS-Klassen: `.sidebar-expanded-icon` und `.sidebar-collapsed-icon` - CSS zeigt/versteckt basierend auf `[data-sidebar-expanded]` **ARIA:** - `aria-label="Toggle sidebar"` - `aria-expanded="true|false"` (via JavaScript) - `aria-controls="main-sidebar"` ### 1.3 Menü-Items (Flat) **Expanded State:** - Icon (links) + Text-Label (rechts) - Standard DaisyUI menu styling - Gap: `gap-3` zwischen Icon und Text **Collapsed State:** - Nur Icon (zentriert) - Tooltip erscheint rechts (`tooltip-right`) - Tooltip-Text aus `data-tip` Attribut **Hover-Effekt:** - Einheitlich für expanded UND collapsed - Standard DaisyUI: `hover:bg-base-300` - Keine Custom-Styles **Liste der Menü-Items:** 1. **Members** - `hero-users` - `/members` 2. **Users** - `hero-user-circle` - `/users` 3. **Custom Fields** - `hero-rectangle-group` - `/custom_fields` 4. **Settings** - `hero-cog-6-tooth` - `#` (Placeholder) ### 1.4 Nested Menu "Beiträge" (Contributions) **Problem:** Standard Menu-Item Pattern funktioniert nicht für verschachtelte Menüs. **Lösung:** Zwei unterschiedliche Darstellungen je nach State. #### Expanded State: ```html
Icon + "Beiträge"
``` **Eigenschaften:** - Native `
/` für auf/zuklappbar - Submenu eingerückt (`ml-4`) - Chevron-Icon rotiert automatisch (Browser-Standard) #### Collapsed State: ```html ``` **Eigenschaften:** - DaisyUI `dropdown` mit `dropdown-right` - Flyout erscheint RECHTS vom Icon - Menu-Title zeigt "Beiträge" - Tooltip auf Button (collapsed) **Wichtig:** - Nur EIN Hover-Effekt (nicht doppelt) - CSS-Klassen `.expanded-menu-group` und `.collapsed-menu-group` - CSS zeigt/versteckt basierend auf `[data-sidebar-expanded]` **Submenu-Items:** 1. **Beitragsarten** - `/contribution_types` 2. **Einstellungen** - `/contribution_settings` ### 1.5 Footer **Position:** - IMMER am unteren Ende der Sidebar - Flexbox: Navigation mit `flex-1`, Footer mit `mt-auto` **Komponenten:** #### 1.5.1 Language Selector - **Sichtbarkeit:** Nur expanded (`.expanded-only`) - **Typ:** `
``` ### B. CSS Selector Beispiele ```css /* Expanded (default) */ .sidebar { width: 16rem; } .menu-label { opacity: 1; } .expanded-only { display: block; } /* Collapsed */ [data-sidebar-expanded="false"] .sidebar { width: 4rem; } [data-sidebar-expanded="false"] .sidebar .menu-label { opacity: 0; } [data-sidebar-expanded="false"] .sidebar .expanded-only { display: none; } ``` ### C. localStorage Beispiel ```javascript // Save localStorage.setItem('sidebar-expanded', 'true'); // Load const expanded = localStorage.getItem('sidebar-expanded') !== 'false'; // Check if (localStorage.getItem('sidebar-expanded') === 'false') { // Collapsed } ``` ### D. ARIA Beispiele ```html ``` --- **Ende der Spezifikation**