E1 — Einstellungen

Kachel-Ansicht · Finale Spezifikation · Route: /settings/household/staples?ctx=settings

screens: E1, D3
journey: J8
variation: Kachel (V2)
version: 1.0
date: 2026-04-09

Die Einstellungsseite dient als Hub mit drei Kacheln: Vorräte (primäre Aktion, navigiert zu D3), Mitglieder (navigiert zu E2) und Profil. Die Vorräte-Kachel zeigt die aktive Zutatenanzahl als Display-Font-Zahl. D3 verwendet die bestehende StaplesManager-Komponente mit context="settings".

S1 — Hub-Ansicht (E1 /settings)
S1
Einstellungs-Hub — drei Kacheln
Vorräte-Kachel (2fr, primär mit grünem Akzentstreifen), Mitglieder-Kachel (1fr), Profil-Kachel (1fr). Desktop 2-spaltig oben, dann 2-spaltig unten.
Mobile
14
von 32 Vorräten aktiv
Vorräte
Welche Zutaten hast du immer zu Hause?
Vorräte bearbeiten →
👥 Mitglieder
3 Mitglieder · Einladen & Rollen
Verwalten →
👤 Profil
Marcel R.
Bearbeiten →
📅
Planer
🍽
Rezepte
🛒
Einkauf
⚙️
Einstellungen
Notizen
  • Vorräte-Kachel: grid-column: span 1 aber 2fr Spaltenbreite im 2-Spalten-Grid. Grüner Linksstreifen (border-left: 3px solid --green-dark).
  • Stat-Zahl: Anzahl Zutaten mit isStaple === true, aus dem gleichen Load-Call der D3-Seite
  • Mitglieder-Karte: Anzahl aus locals.haushalt oder separatem API-Call; navigiert zu /members
  • Profil-Karte: Name aus locals.benutzer.name; Zielseite /profile (noch nicht implementiert — Link disabled oder Placeholder)
  • Hover: box-shadow: --shadow-raised, leicht dunklerer Border
  • Alle Kacheln sind <a>-Tags für korrekte Navigation und Accessibility
  • Mobile: Kacheln stapeln sich vertikal in voller Breite, kein Grid
S2 — Vorräte-Seite (D3 /household/staples?ctx=settings)
S2
D3 — Vorräte bearbeiten (StaplesManager, context="settings")
Navigiert man von der Vorräte-Kachel aus, erscheint die bestehende StaplesManager-Komponente mit Breadcrumb zurück zu Einstellungen.
Desktop
Vorräte
Markierte Zutaten werden beim Einkaufen herausgefiltert.
Gewürze & Öle
Salz Pfeffer Olivenöl Paprika Kreuzkümmel Knoblauch Chili
Grundnahrung
Reis Nudeln Mehl Zucker Linsen Hülsenfrüchte
Kühlschrank
Butter Eier Milch Käse Joghurt
Änderungen werden automatisch gespeichert. Gilt ab der nächsten Einkaufsliste.
Mobile
Gewürze & Öle
Salz Pfeffer Olivenöl Paprika Knoblauch
Grundnahrung
Reis Nudeln Mehl Zucker
📅
Planer
🍽
Rezepte
🛒
Einkauf
⚙️
Einstellungen
Notizen
  • Breadcrumb "← Einstellungen" navigiert zurück zu /settings
  • "Einstellungen" bleibt in der Sidebar aktiv (kein eigener Nav-Eintrag für Vorräte)
  • StaplesManager-Komponente unverändert mit context="settings" (3-spaltig auf md+)
  • Kein Speichern-Button. Hinweistext "Änderungen werden automatisch gespeichert." unter den Chips
  • Mobile: Chips statt 3-spaltig 1-spaltig (volle Breite), Flex-Wrap bleibt bestehen
  • D3 hat eigene +page.server.ts die +page.svelte bei /household/staples gibt es bereits
S3 — Hover-Zustand der Kacheln
S3
Kachel-Hover — visuelles Feedback
Alle Kacheln sind anklickbare Links. Hover hebt die Kachel visuell an.
Notizen
  • Hover: box-shadow: --shadow-raised + border-color: #C0BFB8
  • Vorräte-Kachel behält den grünen Linksstreifen auch im Hover
  • Transition: box-shadow 150ms ease, border-color 150ms ease
  • Cursor: pointer auf allen Kacheln
  • Focus-visible: outline: 2px solid --green-dark; outline-offset: 2px
S4 — Leerer Zustand (kein Vorrat gesetzt)
S4
Vorräte-Kachel bei 0 aktiven Vorräten
Wenn noch kein Vorrat gesetzt wurde, zeigt die Kachel eine Einladung zur Aktion statt der Zahl.
Notizen
  • Wenn stapleCount === 0: Stat-Zahl weglassen, stattdessen "Noch keine Vorräte eingerichtet" in muted
  • CTA-Text ändert sich: "Jetzt einrichten →" statt "Vorräte bearbeiten →"
  • Kachel navigiert weiterhin zu D3 — StaplesManager lädt immer, unabhängig vom Count

Maschinen-lesbare Spezifikation

Diese Sektion enthält verbindliche Implementierungsregeln für den Coding-Agenten.

/* spec:rules — E1 Einstellungen Kachel
 *
 * ROUTE: /settings (E1 hub)
 * DATA LOAD (page.server.ts):
 *   - GET /v1/ingredient-categories to count stapleCount
 *     stapleCount = sum of ingredients where isStaple === true
 *   - member count available from layout data (locals.haushalt)
 *     or fetch GET /v1/households/mine/members and count length
 *   - profile name from locals.benutzer.name
 *
 * LAYOUT: E1 HUB
 *   grid: 2 columns (2fr 1fr) top row + 2 columns (1fr 1fr) bottom row; gap 16px
 *   mobile: single column, full-width cards, gap 12px
 *
 * CARD: all cards are  tags (href to target route)
 *   border-radius: --radius-xl
 *   border: 1px solid --color-border
 *   bg: white
 *   padding: 24px desktop / 16px mobile
 *   hover: box-shadow --shadow-raised, border-color #C0BFB8
 *   transition: box-shadow 150ms ease, border-color 150ms ease
 *   cursor: pointer
 *   focus-visible: outline 2px solid --green-dark, offset 2px
 *
 * VORRÄTE CARD (primary)
 *   border-left: 3px solid --green-dark
 *   stat number: font-family --font-display, font-size 36px, color --green-dark
 *   stat label: "von {total} Zutaten als Vorrat markiert", 11px, --color-text-muted
 *   empty state (stapleCount === 0): hide stat, show "Noch keine Vorräte eingerichtet"
 *   cta: "Vorräte bearbeiten →" (empty: "Jetzt einrichten →")
 *   href: /household/staples?ctx=settings
 *
 * MITGLIEDER CARD
 *   meta: "{memberCount} Mitglieder"
 *   href: /members
 *
 * PROFIL CARD
 *   meta: locals.benutzer.name
 *   href: /profile (not yet implemented — render as disabled or placeholder)
 *
 * ROUTE: /household/staples?ctx=settings (D3)
 *   component: StaplesManager with context="settings" (already exists)
 *   breadcrumb: "← Einstellungen" linking back to /settings
 *   sidebar: "Einstellungen" stays active (no separate nav item for staples)
 *   no save button — StaplesManager auto-saves via debounced PATCH 300ms
 *   hint text below grid: "Änderungen werden automatisch gespeichert. Gilt ab der nächsten Einkaufsliste."
 *   grid: 3-col on md+ (context="settings" already sets this in StaplesManager)
 *
 * CHIP STYLES (for reference — rendered by StapleChip, do NOT reimplement)
 *   selected:   bg --green-dark, color white, border-color --green-dark
 *   unselected: bg transparent, color --color-text-muted, border 1px solid --color-border
 *   hover unselected: border-color --green-light, color --green-dark
 *
 * CATEGORY LABEL TYPOGRAPHY
 *   font-size: 10px; font-weight: 500; letter-spacing: 0.08em; text-transform: uppercase
 *   color: --color-text-muted; margin-bottom: 10px
 */
    
PropertyValueNotes
E1 Hub Layout
grid-desktop2fr 1fr / 1fr 1frtop row / bottom row
grid-mobile1frfull-width stack
gap16px desktop / 12px mobile
Vorräte Card
stat-font--font-display, 36px, --green-darkFraunces
accent-borderborder-left: 3px solid --green-darkprimary indicator
stat-sourcecount isStaple=true from /v1/ingredient-categoriesload in page.server.ts
empty-statehide stat; show muted textwhen stapleCount === 0
href/household/staples?ctx=settingsD3 route
D3 Staples Page
componentStaplesManager context="settings"existing, do not modify
breadcrumb← Einstellungen → /settingsabove page title
active-navEinstellungen in sidebarnot a separate nav entry
save-hint"Änderungen werden automatisch gespeichert."below chip grid
debounce300ms (in StaplesManager)do not add extra debounce