feat(recipes): add image upload, fix save 500, seed HelloFresh data

- Store hero image as base64 data URI in text column (V023 migration)
- Add file upload UI to RecipeForm with FileReader preview
- Remove isChildFriendly from RecipeCreateRequest (no form field)
- Fix 500 on save: effort values now lowercase, serves/cookTimeMin changed
  from primitive short to nullable Integer to survive omitted fields
- Fix empty categories panel: removed stale tagType=category filter
- Group category tags by type with German headings in recipe form
- Split SuggestionResponse.SuggestionRecipe (no image) from SlotRecipe
- Seed 11 HelloFresh recipes with ingredients, steps and tags (V101)
- Add frontend e2e scaffold, specs and dev yml

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-04-09 20:23:28 +02:00
parent 116e400a91
commit 520dae5adf
34 changed files with 9862 additions and 84 deletions

764
specs/e1-settings.html Normal file
View File

@@ -0,0 +1,764 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<title>E1 / D3 — Einstellungen &amp; Vorräte · 5 Variationen</title>
<link href="https://fonts.googleapis.com/css2?family=Fraunces:opsz,wght@9..144,300;9..144,400;9..144,500&family=DM+Sans:wght@300;400;500;600&family=DM+Mono:wght@400;500&display=swap" rel="stylesheet"/>
<!--
spec:agent
document: E1 Settings Hub + D3 Staples — Design Variations
version: 1.0
journey: J8 Edit pantry staples
routes: /settings (E1 hub) → /household/staples?ctx=settings (D3)
screens: E1, D3
variations: V1 Section rows | V2 Card sections | V3 Accordion | V4 Settings sub-nav | V5 Dashboard tiles
last-updated: 2026-04
note: D3 = A3 (same StaplesManager component). settings context removes onboarding chrome.
note: StaplesManager renders categories as chip grids (StapleChip), not checkbox lists.
-->
<style>
:root {
--color-page: #FAFAF7;
--color-surface: #F5F4EE;
--color-subtle: #EDECEA;
--color-border: #D8D7D0;
--color-text-muted: #6B6A63;
--color-text: #1C1C18;
--green-tint: #E8F5EA;
--green-light: #AEDCB0;
--green: #3D8C4A;
--green-dark: #2E6E39;
--green-deeper: #1E4A26;
--yellow-tint: #FDF6D8;
--yellow-light: #F9E08A;
--yellow-text: #8A6800;
--color-error: #DC4C3E;
--blue-tint: #E6F1FB;
--blue: #185FA5;
--blue-dark: #0C447C;
--font-display: 'Fraunces', Georgia, serif;
--font-sans: 'DM Sans', system-ui, sans-serif;
--font-mono: 'DM Mono', monospace;
--radius-sm: 4px; --radius-md: 6px; --radius-lg: 10px; --radius-xl: 16px; --radius-full: 9999px;
--shadow-card: 0 1px 3px rgba(28,28,24,.06), 0 1px 2px rgba(28,28,24,.04);
--shadow-raised: 0 4px 12px rgba(28,28,24,.08), 0 2px 4px rgba(28,28,24,.04);
}
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
body { font-family: var(--font-sans); background: var(--color-page); color: var(--color-text); font-size: 14px; line-height: 1.6; }
/* ── Doc layout ── */
.doc { max-width: 960px; margin: 0 auto; padding: 48px 40px 96px; }
.doc-header { display: flex; justify-content: space-between; align-items: flex-end; padding-bottom: 28px; border-bottom: 1px solid var(--color-border); margin-bottom: 48px; }
.doc-header h1 { font-family: var(--font-display); font-size: 26px; font-weight: 500; letter-spacing: -0.02em; margin-bottom: 4px; }
.doc-header p { font-size: 13px; color: var(--color-text-muted); }
.doc-meta { font-family: var(--font-mono); font-size: 11px; color: var(--color-text-muted); text-align: right; line-height: 1.9; }
.intro { font-size: 14px; line-height: 1.75; color: var(--color-text); max-width: 640px; margin-bottom: 48px; }
.section-label { font-size: 10px; font-weight: 500; letter-spacing: 0.12em; text-transform: uppercase; color: var(--color-text-muted); padding-bottom: 10px; border-bottom: 1px solid var(--color-border); margin-bottom: 36px; }
/* ── Variation sections ── */
.variation { margin-bottom: 72px; }
.var-header { display: flex; align-items: flex-start; gap: 20px; margin-bottom: 20px; }
.var-num { font-family: var(--font-display); font-size: 44px; font-weight: 300; color: var(--yellow-light); line-height: 1; flex-shrink: 0; width: 56px; letter-spacing: -0.03em; }
.var-meta { flex: 1; padding-top: 4px; }
.var-title { font-size: 18px; font-weight: 500; letter-spacing: -0.01em; margin-bottom: 4px; }
.var-desc { font-size: 13px; color: var(--color-text-muted); line-height: 1.5; max-width: 540px; }
.var-tag { font-size: 10px; font-weight: 500; letter-spacing: 0.07em; text-transform: uppercase; padding: 3px 8px; border-radius: var(--radius-sm); background: var(--color-subtle); color: var(--color-text-muted); white-space: nowrap; margin-top: 6px; display: inline-block; }
.var-tag.rec { background: var(--green-tint); color: var(--green-dark); }
/* ── Preview containers ── */
.preview-pair { display: flex; gap: 24px; align-items: flex-start; margin-bottom: 20px; }
.preview-d-wrap { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 6px; }
.preview-m-wrap { flex-shrink: 0; display: flex; flex-direction: column; gap: 6px; }
.preview-label { font-size: 9px; font-weight: 500; letter-spacing: 0.09em; text-transform: uppercase; color: var(--color-text-muted); }
.preview-d-clip { height: 340px; overflow: hidden; border: 1px solid var(--color-border); border-radius: var(--radius-lg); background: var(--color-page); }
.preview-d-scale { transform: scale(0.5); transform-origin: top left; width: 200%; }
.preview-m-clip { width: 196px; height: 340px; overflow: hidden; border: 1.5px solid var(--color-border); border-radius: 24px; background: var(--color-page); }
.preview-m-scale { transform: scale(0.5); transform-origin: top left; width: 200%; }
/* ── Notes ── */
.var-notes { background: var(--color-surface); border: 1px solid var(--color-border); border-radius: var(--radius-lg); padding: 16px 20px; }
.var-notes-label { font-size: 9px; font-weight: 500; letter-spacing: 0.08em; text-transform: uppercase; color: var(--color-text-muted); margin-bottom: 10px; }
.var-notes ul { list-style: none; display: flex; flex-direction: column; gap: 5px; }
.var-notes li { font-size: 12px; color: var(--color-text-muted); line-height: 1.5; display: flex; align-items: flex-start; gap: 8px; }
.var-notes li::before { content: '→'; color: var(--green); font-weight: 500; flex-shrink: 0; }
/* ── Agent section ── */
.agent-section { background: var(--color-text); color: #E8E8E2; padding: 40px 48px; margin-top: 64px; }
.agent-section h2 { font-size: 10px; font-weight: 500; letter-spacing: 0.1em; text-transform: uppercase; color: #6B6A63; margin-bottom: 4px; }
.agent-section > p { font-size: 13px; color: #9A9990; margin-bottom: 28px; line-height: 1.6; max-width: 640px; }
.spec-comment { font-family: var(--font-mono); font-size: 11px; color: #3A3A36; margin-bottom: 32px; line-height: 1.9; white-space: pre-wrap; }
.agent-table { width: 100%; border-collapse: collapse; font-family: var(--font-mono); font-size: 11px; margin-bottom: 40px; }
.agent-table thead tr { border-bottom: 1px solid #2A2A26; }
.agent-table th { text-align: left; padding: 8px 14px; font-size: 9px; font-weight: 500; letter-spacing: 0.09em; text-transform: uppercase; color: #5A5A55; font-family: var(--font-sans); }
.agent-table td { padding: 9px 14px; border-bottom: 1px solid #1E1E1A; vertical-align: top; line-height: 1.5; }
.agent-table tr:last-child td { border-bottom: none; }
.agent-table td:first-child { color: #7A7A72; white-space: nowrap; }
.agent-table td:nth-child(2) { color: #E8E8E2; font-weight: 500; }
.agent-table td:nth-child(3) { color: #5A5A55; }
.group-row td { padding-top: 20px; font-family: var(--font-sans); font-size: 9px; font-weight: 500; letter-spacing: 0.09em; text-transform: uppercase; color: #3A3A36; border-bottom: none; }
</style>
</head>
<body>
<div class="doc">
<div class="doc-header">
<div>
<h1>E1 / D3 — Einstellungen &amp; Vorräte</h1>
<p>5 Design-Variationen · Desktop-first · Routes /settings + /household/staples · Journey J8</p>
</div>
<div class="doc-meta">
Version: 1.0<br>
Screens: E1, D3<br>
Journey: J8<br>
Actor: Planner<br>
Last updated: 2026-04
</div>
</div>
<p class="intro">Two pages, one journey. <strong style="font-weight:500">E1</strong> is the settings hub at <code style="font-family:var(--font-mono);font-size:12px;background:var(--color-subtle);padding:1px 5px;border-radius:3px;">/settings</code> — currently a placeholder. <strong style="font-weight:500">D3</strong> is the StaplesManager component at <code style="font-family:var(--font-mono);font-size:12px;background:var(--color-subtle);padding:1px 5px;border-radius:3px;">/household/staples</code>, rendered with <code style="font-family:var(--font-mono);font-size:12px;background:var(--color-subtle);padding:1px 5px;border-radius:3px;">context="settings"</code>. The component uses StapleChip — ingredient pills in flex-wrap grids per category, not a checklist. Five variations explore how the hub and staples editing relate: from navigating to a sub-page, to showing staples inline on the settings page itself. The recommended variation for v1 is <strong style="font-weight:500">V3 (Accordion)</strong> — one page, no navigation, staples always one tap away.</p>
<div class="section-label">Five design variations</div>
<!-- ══════════════════════════════════════
V1 — SECTION ROWS (LINKED HUB)
══════════════════════════════════════ -->
<div class="variation">
<div class="var-header">
<div class="var-num">V1</div>
<div class="var-meta">
<div class="var-title">Verknüpfte Abschnitte</div>
<div class="var-desc">Settings als Hub-Seite mit klickbaren Abschnitt-Zeilen. Jeder Bereich (Profil, Vorräte, Haushalt) ist eine Zeile mit Titel, Beschreibung, Stat und Pfeil. Tippen navigiert zur jeweiligen Unterseite. Klassisches iOS-Settings-Muster.</div>
<span class="var-tag">Maximal erweiterbar für künftige Settings</span>
</div>
</div>
<div class="preview-pair">
<!-- Desktop: Hub view -->
<div class="preview-d-wrap">
<div class="preview-label">Desktop · 1200px — Hub-Ansicht</div>
<div class="preview-d-clip">
<div class="preview-d-scale">
<div style="display:flex;width:1200px;min-height:680px;background:var(--color-page);">
<!-- Sidebar -->
<aside style="width:224px;flex-shrink:0;background:var(--color-surface);border-right:1px solid var(--color-border);padding:0;display:flex;flex-direction:column;min-height:680px;">
<div style="padding:18px 16px 16px;border-bottom:1px solid var(--color-border);display:flex;align-items:center;gap:10px;"><div style="width:22px;height:22px;background:var(--green);border-radius:5px;flex-shrink:0;"></div><div><div style="font-family:var(--font-display);font-size:15px;font-weight:500;color:var(--color-text);">Mealprep</div><div style="font-size:10px;color:var(--color-text-muted);">Familie Raddatz</div></div></div>
<nav style="padding:16px 0;flex:1;"><div style="font-size:8px;font-weight:500;letter-spacing:0.1em;text-transform:uppercase;color:var(--color-text-muted);padding:0 16px 6px;">Plan</div><a style="display:flex;align-items:center;gap:8px;padding:7px 16px;font-size:13px;color:var(--color-text-muted);text-decoration:none;"><span style="width:16px;height:16px;background:var(--color-border);border-radius:3px;flex-shrink:0;display:inline-block;"></span>Planer</a><a style="display:flex;align-items:center;gap:8px;padding:7px 16px;font-size:13px;color:var(--color-text-muted);text-decoration:none;"><span style="width:16px;height:16px;background:var(--color-border);border-radius:3px;flex-shrink:0;display:inline-block;"></span>Rezepte</a><a style="display:flex;align-items:center;gap:8px;padding:7px 16px;font-size:13px;color:var(--color-text-muted);text-decoration:none;"><span style="width:16px;height:16px;background:var(--color-border);border-radius:3px;flex-shrink:0;display:inline-block;"></span>Einkauf</a><div style="font-size:8px;font-weight:500;letter-spacing:0.1em;text-transform:uppercase;color:var(--color-text-muted);padding:16px 16px 6px;">Haushalt</div><a style="display:flex;align-items:center;gap:8px;padding:7px 16px;font-size:13px;color:var(--color-text-muted);text-decoration:none;margin:0 8px;"><span style="width:16px;height:16px;background:var(--color-border);border-radius:3px;flex-shrink:0;display:inline-block;"></span>Mitglieder</a><a style="display:flex;align-items:center;gap:8px;padding:7px 16px;font-size:13px;background:var(--green-tint);color:var(--green-dark);font-weight:500;text-decoration:none;border-radius:var(--radius-md);margin:0 8px;"><span style="width:16px;height:16px;background:var(--green-light);border-radius:3px;flex-shrink:0;display:inline-block;"></span>Einstellungen</a></nav>
</aside>
<!-- Hub content -->
<main style="flex:1;padding:40px 56px;">
<h1 style="font-family:var(--font-display);font-size:28px;font-weight:500;letter-spacing:-0.02em;margin-bottom:32px;">Einstellungen</h1>
<div style="max-width:600px;display:flex;flex-direction:column;gap:8px;">
<!-- Vorräte row (highlighted as primary) -->
<a style="display:flex;align-items:center;gap:16px;padding:20px 20px;background:var(--color-surface);border:1px solid var(--color-border);border-left:3px solid var(--green-dark);border-radius:var(--radius-lg);text-decoration:none;cursor:pointer;box-shadow:var(--shadow-card);">
<div style="flex:1;">
<div style="font-size:15px;font-weight:500;color:var(--color-text);margin-bottom:3px;">Vorräte</div>
<div style="font-size:12px;color:var(--color-text-muted);">Zutaten die immer im Haushalt vorhanden sind — werden aus Einkaufslisten gefiltert</div>
</div>
<div style="text-align:right;flex-shrink:0;">
<div style="font-size:20px;font-weight:300;font-family:var(--font-display);color:var(--green-dark);letter-spacing:-0.02em;">14</div>
<div style="font-size:10px;color:var(--color-text-muted);">aktiv</div>
</div>
<div style="color:var(--color-text-muted);font-size:18px;"></div>
</a>
<a style="display:flex;align-items:center;gap:16px;padding:20px 20px;background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius-lg);text-decoration:none;cursor:pointer;">
<div style="flex:1;">
<div style="font-size:15px;font-weight:500;color:var(--color-text);margin-bottom:3px;">Profil</div>
<div style="font-size:12px;color:var(--color-text-muted);">Marcel Raddatz · marcel@email.com</div>
</div>
<div style="color:var(--color-text-muted);font-size:18px;"></div>
</a>
<a style="display:flex;align-items:center;gap:16px;padding:20px 20px;background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius-lg);text-decoration:none;cursor:pointer;">
<div style="flex:1;">
<div style="font-size:15px;font-weight:500;color:var(--color-text);margin-bottom:3px;">Haushalt</div>
<div style="font-size:12px;color:var(--color-text-muted);">Familie Raddatz · 3 Mitglieder</div>
</div>
<div style="color:var(--color-text-muted);font-size:18px;"></div>
</a>
</div>
</main>
</div>
</div>
</div>
</div>
<!-- Mobile -->
<div class="preview-m-wrap">
<div class="preview-label">Mobile · 390px</div>
<div class="preview-m-clip">
<div class="preview-m-scale">
<div style="width:390px;min-height:680px;background:var(--color-page);display:flex;flex-direction:column;">
<div style="padding:16px 20px 16px;border-bottom:1px solid var(--color-border);background:var(--color-surface);"><div style="font-family:var(--font-display);font-size:20px;font-weight:500;">Einstellungen</div></div>
<div style="flex:1;padding:16px 20px;display:flex;flex-direction:column;gap:8px;">
<a style="display:flex;align-items:center;gap:14px;padding:16px;background:var(--color-surface);border:1px solid var(--color-border);border-left:3px solid var(--green-dark);border-radius:var(--radius-lg);text-decoration:none;cursor:pointer;">
<div style="flex:1;"><div style="font-size:15px;font-weight:500;color:var(--color-text);">Vorräte</div><div style="font-size:12px;color:var(--color-text-muted);margin-top:2px;">14 aktiv · Einkaufsliste-Filter</div></div>
<div style="color:var(--color-text-muted);font-size:16px;"></div>
</a>
<a style="display:flex;align-items:center;gap:14px;padding:16px;background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius-lg);text-decoration:none;cursor:pointer;">
<div style="flex:1;"><div style="font-size:15px;font-weight:500;color:var(--color-text);">Profil</div><div style="font-size:12px;color:var(--color-text-muted);margin-top:2px;">Marcel Raddatz</div></div>
<div style="color:var(--color-text-muted);font-size:16px;"></div>
</a>
<a style="display:flex;align-items:center;gap:14px;padding:16px;background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius-lg);text-decoration:none;cursor:pointer;">
<div style="flex:1;"><div style="font-size:15px;font-weight:500;color:var(--color-text);">Haushalt</div><div style="font-size:12px;color:var(--color-text-muted);margin-top:2px;">Familie Raddatz · 3 Mitglieder</div></div>
<div style="color:var(--color-text-muted);font-size:16px;"></div>
</a>
</div>
<nav style="background:var(--color-surface);border-top:1px solid var(--color-border);padding:8px 0 20px;display:flex;"><a style="flex:1;display:flex;flex-direction:column;align-items:center;gap:3px;font-size:10px;color:var(--color-text-muted);text-decoration:none;padding:4px 0;"><span style="width:20px;height:20px;background:var(--color-border);border-radius:3px;display:inline-block;"></span>Planer</a><a style="flex:1;display:flex;flex-direction:column;align-items:center;gap:3px;font-size:10px;color:var(--color-text-muted);text-decoration:none;padding:4px 0;"><span style="width:20px;height:20px;background:var(--color-border);border-radius:3px;display:inline-block;"></span>Rezepte</a><a style="flex:1;display:flex;flex-direction:column;align-items:center;gap:3px;font-size:10px;color:var(--color-text-muted);text-decoration:none;padding:4px 0;"><span style="width:20px;height:20px;background:var(--color-border);border-radius:3px;display:inline-block;"></span>Einkauf</a><a style="flex:1;display:flex;flex-direction:column;align-items:center;gap:3px;font-size:10px;color:var(--green-dark);font-weight:500;text-decoration:none;padding:4px 0;"><span style="width:20px;height:20px;background:var(--green-light);border-radius:3px;display:inline-block;"></span>Einstellungen</a></nav>
</div>
</div>
</div>
</div>
</div>
<!-- Second preview: staples sub-page (D3 in settings context) -->
<div style="margin-bottom:20px;">
<div class="preview-label" style="margin-bottom:6px;">Desktop · D3 Vorräte-Unterseite (nach Navigation)</div>
<div class="preview-d-clip">
<div class="preview-d-scale">
<div style="display:flex;width:1200px;min-height:680px;background:var(--color-page);">
<aside style="width:224px;flex-shrink:0;background:var(--color-surface);border-right:1px solid var(--color-border);padding:0;display:flex;flex-direction:column;min-height:680px;"><div style="padding:18px 16px 16px;border-bottom:1px solid var(--color-border);display:flex;align-items:center;gap:10px;"><div style="width:22px;height:22px;background:var(--green);border-radius:5px;flex-shrink:0;"></div><div><div style="font-family:var(--font-display);font-size:15px;font-weight:500;color:var(--color-text);">Mealprep</div><div style="font-size:10px;color:var(--color-text-muted);">Familie Raddatz</div></div></div><nav style="padding:16px 0;flex:1;"><div style="font-size:8px;font-weight:500;letter-spacing:0.1em;text-transform:uppercase;color:var(--color-text-muted);padding:0 16px 6px;">Plan</div><a style="display:flex;align-items:center;gap:8px;padding:7px 16px;font-size:13px;color:var(--color-text-muted);text-decoration:none;"><span style="width:16px;height:16px;background:var(--color-border);border-radius:3px;flex-shrink:0;display:inline-block;"></span>Planer</a><a style="display:flex;align-items:center;gap:8px;padding:7px 16px;font-size:13px;color:var(--color-text-muted);text-decoration:none;"><span style="width:16px;height:16px;background:var(--color-border);border-radius:3px;flex-shrink:0;display:inline-block;"></span>Rezepte</a><a style="display:flex;align-items:center;gap:8px;padding:7px 16px;font-size:13px;color:var(--color-text-muted);text-decoration:none;"><span style="width:16px;height:16px;background:var(--color-border);border-radius:3px;flex-shrink:0;display:inline-block;"></span>Einkauf</a><div style="font-size:8px;font-weight:500;letter-spacing:0.1em;text-transform:uppercase;color:var(--color-text-muted);padding:16px 16px 6px;">Haushalt</div><a style="display:flex;align-items:center;gap:8px;padding:7px 16px;font-size:13px;color:var(--color-text-muted);text-decoration:none;margin:0 8px;"><span style="width:16px;height:16px;background:var(--color-border);border-radius:3px;flex-shrink:0;display:inline-block;"></span>Mitglieder</a><a style="display:flex;align-items:center;gap:8px;padding:7px 16px;font-size:13px;background:var(--green-tint);color:var(--green-dark);font-weight:500;text-decoration:none;border-radius:var(--radius-md);margin:0 8px;"><span style="width:16px;height:16px;background:var(--green-light);border-radius:3px;flex-shrink:0;display:inline-block;"></span>Einstellungen</a></nav></aside>
<main style="flex:1;padding:40px 56px;overflow:hidden;">
<div style="display:flex;align-items:center;gap:10px;margin-bottom:6px;">
<a style="font-size:13px;color:var(--color-text-muted);text-decoration:none;">← Einstellungen</a>
</div>
<div style="display:flex;align-items:center;justify-content:space-between;margin-bottom:28px;">
<div><h1 style="font-family:var(--font-display);font-size:28px;font-weight:500;letter-spacing:-0.02em;">Vorräte</h1><div style="font-size:13px;color:var(--color-text-muted);margin-top:4px;">14 von 32 Zutaten als Vorrat markiert</div></div>
</div>
<!-- StaplesManager: category + chip grid -->
<div style="display:flex;flex-direction:column;gap:24px;">
<div>
<div style="font-size:10px;font-weight:500;letter-spacing:0.08em;text-transform:uppercase;color:var(--color-text-muted);margin-bottom:10px;">Gemüse</div>
<div style="display:flex;flex-wrap:wrap;gap:8px;">
<span style="padding:7px 14px;border-radius:var(--radius-full);font-size:13px;font-weight:500;background:var(--green-dark);color:#fff;cursor:pointer;">Karotten</span>
<span style="padding:7px 14px;border-radius:var(--radius-full);font-size:13px;font-weight:500;background:var(--green-dark);color:#fff;cursor:pointer;">Zwiebeln</span>
<span style="padding:7px 14px;border-radius:var(--radius-full);font-size:13px;font-weight:400;background:transparent;color:var(--color-text-muted);border:1px solid var(--color-border);cursor:pointer;">Lauch</span>
<span style="padding:7px 14px;border-radius:var(--radius-full);font-size:13px;font-weight:500;background:var(--green-dark);color:#fff;cursor:pointer;">Knoblauch</span>
<span style="padding:7px 14px;border-radius:var(--radius-full);font-size:13px;font-weight:400;background:transparent;color:var(--color-text-muted);border:1px solid var(--color-border);cursor:pointer;">Fenchel</span>
<span style="padding:7px 14px;border-radius:var(--radius-full);font-size:13px;font-weight:500;background:var(--green-dark);color:#fff;cursor:pointer;">Paprika</span>
</div>
</div>
<div>
<div style="font-size:10px;font-weight:500;letter-spacing:0.08em;text-transform:uppercase;color:var(--color-text-muted);margin-bottom:10px;">Getreide &amp; Hülsenfrüchte</div>
<div style="display:flex;flex-wrap:wrap;gap:8px;">
<span style="padding:7px 14px;border-radius:var(--radius-full);font-size:13px;font-weight:500;background:var(--green-dark);color:#fff;cursor:pointer;">Pasta</span>
<span style="padding:7px 14px;border-radius:var(--radius-full);font-size:13px;font-weight:500;background:var(--green-dark);color:#fff;cursor:pointer;">Reis</span>
<span style="padding:7px 14px;border-radius:var(--radius-full);font-size:13px;font-weight:400;background:transparent;color:var(--color-text-muted);border:1px solid var(--color-border);cursor:pointer;">Couscous</span>
<span style="padding:7px 14px;border-radius:var(--radius-full);font-size:13px;font-weight:500;background:var(--green-dark);color:#fff;cursor:pointer;">Linsen</span>
<span style="padding:7px 14px;border-radius:var(--radius-full);font-size:13px;font-weight:400;background:transparent;color:var(--color-text-muted);border:1px solid var(--color-border);cursor:pointer;">Kichererbsen</span>
</div>
</div>
</div>
</main>
</div>
</div>
</div>
</div>
<div class="var-notes">
<div class="var-notes-label">Design-Entscheidungen</div>
<ul>
<li>Vorräte-Zeile hat einen grünen linken Rand (border-left: 3px solid --green-dark) — signalisiert "primäre Aktion" ohne ihn visuell zu überfrachten.</li>
<li>Die aktive Zutat-Zahl ("14") wird als Display-Schrift-Zahl dargestellt — schafft eine Verbindung zum Wert-Versprechen der App (Varietät-Scores sind ebenfalls Zahlen).</li>
<li>D3 Unterseite im settings-Kontext: kein Onboarding-Sidebar, kein "Weiter"-Button — nur die Kategorie-Chip-Liste. "← Einstellungen" Breadcrumb für die Rücknavigation.</li>
<li>StapleChip: Ausgewählt = --green-dark Hintergrund + weißer Text. Nicht ausgewählt = transparenter Hintergrund + --color-border Rahmen + --color-text-muted Text. Kein separater Speicher-Button — Auto-Save auf Toggle.</li>
</ul>
</div>
</div>
<!-- ══════════════════════════════════════
V2 — CARD SECTIONS
══════════════════════════════════════ -->
<div class="variation">
<div class="var-header">
<div class="var-num">V2</div>
<div class="var-meta">
<div class="var-title">Einstellungs-Kacheln</div>
<div class="var-desc">Jeder Einstellungsbereich als Kachel mit Titel, Beschreibung, Schlüsselstatistik und direktem Aktions-Button. Die Vorräte-Kachel zeigt "14 von 32 aktiv" und einen "Bearbeiten"-Button der direkt in den D3-Kontext führt.</div>
<span class="var-tag">Gute Übersicht auf großen Bildschirmen</span>
</div>
</div>
<div class="preview-pair">
<div class="preview-d-wrap">
<div class="preview-label">Desktop · 1200px</div>
<div class="preview-d-clip">
<div class="preview-d-scale">
<div style="display:flex;width:1200px;min-height:680px;background:var(--color-page);">
<aside style="width:224px;flex-shrink:0;background:var(--color-surface);border-right:1px solid var(--color-border);padding:0;display:flex;flex-direction:column;min-height:680px;"><div style="padding:18px 16px 16px;border-bottom:1px solid var(--color-border);display:flex;align-items:center;gap:10px;"><div style="width:22px;height:22px;background:var(--green);border-radius:5px;flex-shrink:0;"></div><div><div style="font-family:var(--font-display);font-size:15px;font-weight:500;color:var(--color-text);">Mealprep</div><div style="font-size:10px;color:var(--color-text-muted);">Familie Raddatz</div></div></div><nav style="padding:16px 0;flex:1;"><div style="font-size:8px;font-weight:500;letter-spacing:0.1em;text-transform:uppercase;color:var(--color-text-muted);padding:0 16px 6px;">Plan</div><a style="display:flex;align-items:center;gap:8px;padding:7px 16px;font-size:13px;color:var(--color-text-muted);text-decoration:none;"><span style="width:16px;height:16px;background:var(--color-border);border-radius:3px;flex-shrink:0;display:inline-block;"></span>Planer</a><a style="display:flex;align-items:center;gap:8px;padding:7px 16px;font-size:13px;color:var(--color-text-muted);text-decoration:none;"><span style="width:16px;height:16px;background:var(--color-border);border-radius:3px;flex-shrink:0;display:inline-block;"></span>Rezepte</a><a style="display:flex;align-items:center;gap:8px;padding:7px 16px;font-size:13px;color:var(--color-text-muted);text-decoration:none;"><span style="width:16px;height:16px;background:var(--color-border);border-radius:3px;flex-shrink:0;display:inline-block;"></span>Einkauf</a><div style="font-size:8px;font-weight:500;letter-spacing:0.1em;text-transform:uppercase;color:var(--color-text-muted);padding:16px 16px 6px;">Haushalt</div><a style="display:flex;align-items:center;gap:8px;padding:7px 16px;font-size:13px;color:var(--color-text-muted);text-decoration:none;margin:0 8px;"><span style="width:16px;height:16px;background:var(--color-border);border-radius:3px;flex-shrink:0;display:inline-block;"></span>Mitglieder</a><a style="display:flex;align-items:center;gap:8px;padding:7px 16px;font-size:13px;background:var(--green-tint);color:var(--green-dark);font-weight:500;text-decoration:none;border-radius:var(--radius-md);margin:0 8px;"><span style="width:16px;height:16px;background:var(--green-light);border-radius:3px;flex-shrink:0;display:inline-block;"></span>Einstellungen</a></nav></aside>
<main style="flex:1;padding:40px 56px;">
<h1 style="font-family:var(--font-display);font-size:28px;font-weight:500;letter-spacing:-0.02em;margin-bottom:32px;">Einstellungen</h1>
<div style="display:grid;grid-template-columns:1fr 1fr;gap:16px;max-width:820px;">
<!-- Vorräte (primary, spans or just prominent) -->
<div style="background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius-xl);padding:28px;display:flex;flex-direction:column;gap:12px;box-shadow:var(--shadow-card);">
<div style="display:flex;justify-content:space-between;align-items:flex-start;">
<div style="font-size:16px;font-weight:500;">Vorräte</div>
<div style="text-align:right;"><div style="font-family:var(--font-display);font-size:28px;font-weight:300;color:var(--green-dark);letter-spacing:-0.02em;line-height:1;">14</div><div style="font-size:10px;color:var(--color-text-muted);">von 32 aktiv</div></div>
</div>
<div style="font-size:13px;color:var(--color-text-muted);line-height:1.5;flex:1;">Zutaten, die immer im Haushalt vorhanden sind. Sie werden beim Generieren der Einkaufsliste automatisch herausgefiltert.</div>
<button style="align-self:flex-start;background:var(--green-dark);color:#fff;font-family:var(--font-sans);font-size:13px;font-weight:500;letter-spacing:0.04em;padding:9px 18px;border-radius:var(--radius-md);border:none;cursor:pointer;">Vorräte bearbeiten</button>
</div>
<!-- Haushalt -->
<div style="background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius-xl);padding:28px;display:flex;flex-direction:column;gap:12px;box-shadow:var(--shadow-card);">
<div style="display:flex;justify-content:space-between;align-items:flex-start;">
<div style="font-size:16px;font-weight:500;">Haushalt</div>
<div style="text-align:right;"><div style="font-family:var(--font-display);font-size:28px;font-weight:300;color:var(--color-text-muted);letter-spacing:-0.02em;line-height:1;">3</div><div style="font-size:10px;color:var(--color-text-muted);">Mitglieder</div></div>
</div>
<div style="font-size:13px;color:var(--color-text-muted);line-height:1.5;flex:1;">Familie Raddatz. Haushaltsname und Mitgliederverwaltung.</div>
<button style="align-self:flex-start;background:var(--color-page);color:var(--color-text);font-family:var(--font-sans);font-size:13px;font-weight:500;letter-spacing:0.04em;padding:9px 18px;border-radius:var(--radius-md);border:1px solid var(--color-border);cursor:pointer;">Verwalten</button>
</div>
<!-- Profil -->
<div style="background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius-xl);padding:28px;display:flex;flex-direction:column;gap:12px;box-shadow:var(--shadow-card);">
<div style="font-size:16px;font-weight:500;">Profil</div>
<div style="font-size:13px;color:var(--color-text-muted);flex:1;">Marcel Raddatz<br>marcel@email.com</div>
<button style="align-self:flex-start;background:var(--color-page);color:var(--color-text);font-family:var(--font-sans);font-size:13px;font-weight:500;letter-spacing:0.04em;padding:9px 18px;border-radius:var(--radius-md);border:1px solid var(--color-border);cursor:pointer;">Bearbeiten</button>
</div>
</div>
</main>
</div>
</div>
</div>
</div>
<div class="preview-m-wrap">
<div class="preview-label">Mobile · 390px</div>
<div class="preview-m-clip">
<div class="preview-m-scale">
<div style="width:390px;min-height:680px;background:var(--color-page);display:flex;flex-direction:column;">
<div style="padding:16px 20px;border-bottom:1px solid var(--color-border);background:var(--color-surface);"><div style="font-family:var(--font-display);font-size:20px;font-weight:500;">Einstellungen</div></div>
<div style="flex:1;padding:16px 20px;display:flex;flex-direction:column;gap:12px;">
<div style="background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius-lg);padding:20px;">
<div style="display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:10px;"><div style="font-size:15px;font-weight:500;">Vorräte</div><div><div style="font-family:var(--font-display);font-size:24px;font-weight:300;color:var(--green-dark);line-height:1;">14</div><div style="font-size:10px;color:var(--color-text-muted);">von 32</div></div></div>
<div style="font-size:12px;color:var(--color-text-muted);margin-bottom:14px;">Immer vorhandene Zutaten, automatisch aus Einkaufslisten gefiltert.</div>
<button style="width:100%;background:var(--green-dark);color:#fff;font-size:13px;font-weight:500;padding:10px;border-radius:var(--radius-md);border:none;">Vorräte bearbeiten</button>
</div>
<div style="background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius-lg);padding:20px;">
<div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:8px;"><div style="font-size:15px;font-weight:500;">Haushalt</div><div style="font-size:12px;color:var(--color-text-muted);">3 Mitglieder</div></div>
<div style="font-size:12px;color:var(--color-text-muted);margin-bottom:14px;">Familie Raddatz</div>
<button style="width:100%;background:var(--color-page);color:var(--color-text);font-size:13px;font-weight:500;padding:10px;border-radius:var(--radius-md);border:1px solid var(--color-border);">Verwalten</button>
</div>
<div style="background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius-lg);padding:20px;">
<div style="font-size:15px;font-weight:500;margin-bottom:8px;">Profil</div>
<div style="font-size:12px;color:var(--color-text-muted);margin-bottom:14px;">Marcel Raddatz · marcel@email.com</div>
<button style="width:100%;background:var(--color-page);color:var(--color-text);font-size:13px;font-weight:500;padding:10px;border-radius:var(--radius-md);border:1px solid var(--color-border);">Bearbeiten</button>
</div>
</div>
<nav style="background:var(--color-surface);border-top:1px solid var(--color-border);padding:8px 0 20px;display:flex;"><a style="flex:1;display:flex;flex-direction:column;align-items:center;gap:3px;font-size:10px;color:var(--color-text-muted);text-decoration:none;padding:4px 0;"><span style="width:20px;height:20px;background:var(--color-border);border-radius:3px;display:inline-block;"></span>Planer</a><a style="flex:1;display:flex;flex-direction:column;align-items:center;gap:3px;font-size:10px;color:var(--color-text-muted);text-decoration:none;padding:4px 0;"><span style="width:20px;height:20px;background:var(--color-border);border-radius:3px;display:inline-block;"></span>Rezepte</a><a style="flex:1;display:flex;flex-direction:column;align-items:center;gap:3px;font-size:10px;color:var(--color-text-muted);text-decoration:none;padding:4px 0;"><span style="width:20px;height:20px;background:var(--color-border);border-radius:3px;display:inline-block;"></span>Einkauf</a><a style="flex:1;display:flex;flex-direction:column;align-items:center;gap:3px;font-size:10px;color:var(--green-dark);font-weight:500;text-decoration:none;padding:4px 0;"><span style="width:20px;height:20px;background:var(--green-light);border-radius:3px;display:inline-block;"></span>Einstellungen</a></nav>
</div>
</div>
</div>
</div>
</div>
<div class="var-notes">
<div class="var-notes-label">Design-Entscheidungen</div>
<ul>
<li>Kacheln mit Display-Schrift-Zahlen (14, 3) als Schlüsselmetriken — konsistentes Designmuster mit der Varietätspunktzahl im Planer.</li>
<li>Der "Vorräte bearbeiten"-Button auf der Kachel führt direkt zur D3-Unterseite. Keine Zwischennavigation.</li>
<li>Nachteil gegenüber V3: erfordert einen Navigationswechsel für die häufigste Aufgabe (Vorräte bearbeiten). V3 macht das inline möglich.</li>
</ul>
</div>
</div>
<!-- ══════════════════════════════════════
V3 — ACCORDION (INLINE STAPLES)
══════════════════════════════════════ -->
<div class="variation">
<div class="var-header">
<div class="var-num">V3</div>
<div class="var-meta">
<div class="var-title">Akkordeon mit inline Vorräten</div>
<div class="var-desc">Die Settings-Seite zeigt alle Bereiche als aufklappbare Abschnitte. Der Vorräte-Bereich ist beim Öffnen der Seite standardmäßig aufgeklappt und zeigt direkt die StapleChip-Kategorien. Kein Seitenwechsel nötig.</div>
<span class="var-tag rec">Empfohlen · v1</span>
</div>
</div>
<div class="preview-pair">
<div class="preview-d-wrap">
<div class="preview-label">Desktop · 1200px — Vorräte aufgeklappt (Standard)</div>
<div class="preview-d-clip">
<div class="preview-d-scale">
<div style="display:flex;width:1200px;min-height:680px;background:var(--color-page);">
<aside style="width:224px;flex-shrink:0;background:var(--color-surface);border-right:1px solid var(--color-border);padding:0;display:flex;flex-direction:column;min-height:680px;"><div style="padding:18px 16px 16px;border-bottom:1px solid var(--color-border);display:flex;align-items:center;gap:10px;"><div style="width:22px;height:22px;background:var(--green);border-radius:5px;flex-shrink:0;"></div><div><div style="font-family:var(--font-display);font-size:15px;font-weight:500;color:var(--color-text);">Mealprep</div><div style="font-size:10px;color:var(--color-text-muted);">Familie Raddatz</div></div></div><nav style="padding:16px 0;flex:1;"><div style="font-size:8px;font-weight:500;letter-spacing:0.1em;text-transform:uppercase;color:var(--color-text-muted);padding:0 16px 6px;">Plan</div><a style="display:flex;align-items:center;gap:8px;padding:7px 16px;font-size:13px;color:var(--color-text-muted);text-decoration:none;"><span style="width:16px;height:16px;background:var(--color-border);border-radius:3px;flex-shrink:0;display:inline-block;"></span>Planer</a><a style="display:flex;align-items:center;gap:8px;padding:7px 16px;font-size:13px;color:var(--color-text-muted);text-decoration:none;"><span style="width:16px;height:16px;background:var(--color-border);border-radius:3px;flex-shrink:0;display:inline-block;"></span>Rezepte</a><a style="display:flex;align-items:center;gap:8px;padding:7px 16px;font-size:13px;color:var(--color-text-muted);text-decoration:none;"><span style="width:16px;height:16px;background:var(--color-border);border-radius:3px;flex-shrink:0;display:inline-block;"></span>Einkauf</a><div style="font-size:8px;font-weight:500;letter-spacing:0.1em;text-transform:uppercase;color:var(--color-text-muted);padding:16px 16px 6px;">Haushalt</div><a style="display:flex;align-items:center;gap:8px;padding:7px 16px;font-size:13px;color:var(--color-text-muted);text-decoration:none;margin:0 8px;"><span style="width:16px;height:16px;background:var(--color-border);border-radius:3px;flex-shrink:0;display:inline-block;"></span>Mitglieder</a><a style="display:flex;align-items:center;gap:8px;padding:7px 16px;font-size:13px;background:var(--green-tint);color:var(--green-dark);font-weight:500;text-decoration:none;border-radius:var(--radius-md);margin:0 8px;"><span style="width:16px;height:16px;background:var(--green-light);border-radius:3px;flex-shrink:0;display:inline-block;"></span>Einstellungen</a></nav></aside>
<main style="flex:1;padding:40px 56px;overflow:hidden;">
<h1 style="font-family:var(--font-display);font-size:28px;font-weight:500;letter-spacing:-0.02em;margin-bottom:28px;">Einstellungen</h1>
<div style="max-width:680px;display:flex;flex-direction:column;gap:4px;">
<!-- Vorräte — expanded (default) -->
<div style="border:1px solid var(--color-border);border-radius:var(--radius-lg);overflow:hidden;">
<button style="width:100%;display:flex;align-items:center;gap:12px;padding:16px 20px;background:var(--color-surface);border:none;cursor:pointer;text-align:left;">
<span style="font-size:15px;font-weight:500;flex:1;color:var(--color-text);">Vorräte</span>
<span style="font-size:12px;color:var(--color-text-muted);margin-right:8px;">14 aktiv</span>
<span style="font-size:14px;color:var(--color-text-muted);"></span>
</button>
<div style="padding:20px;border-top:1px solid var(--color-border);background:var(--color-page);">
<div style="font-size:13px;color:var(--color-text-muted);margin-bottom:16px;">Tippe eine Zutat an um sie als Vorrat zu markieren oder zu entfernen. Änderungen werden sofort gespeichert.</div>
<div style="margin-bottom:16px;">
<div style="font-size:10px;font-weight:500;letter-spacing:0.08em;text-transform:uppercase;color:var(--color-text-muted);margin-bottom:8px;">Gemüse</div>
<div style="display:flex;flex-wrap:wrap;gap:7px;">
<span style="padding:6px 13px;border-radius:var(--radius-full);font-size:13px;font-weight:500;background:var(--green-dark);color:#fff;cursor:pointer;">Karotten</span>
<span style="padding:6px 13px;border-radius:var(--radius-full);font-size:13px;font-weight:500;background:var(--green-dark);color:#fff;cursor:pointer;">Zwiebeln</span>
<span style="padding:6px 13px;border-radius:var(--radius-full);font-size:13px;font-weight:400;background:transparent;color:var(--color-text-muted);border:1px solid var(--color-border);cursor:pointer;">Lauch</span>
<span style="padding:6px 13px;border-radius:var(--radius-full);font-size:13px;font-weight:500;background:var(--green-dark);color:#fff;cursor:pointer;">Knoblauch</span>
<span style="padding:6px 13px;border-radius:var(--radius-full);font-size:13px;font-weight:400;background:transparent;color:var(--color-text-muted);border:1px solid var(--color-border);cursor:pointer;">Fenchel</span>
</div>
</div>
<div>
<div style="font-size:10px;font-weight:500;letter-spacing:0.08em;text-transform:uppercase;color:var(--color-text-muted);margin-bottom:8px;">Getreide</div>
<div style="display:flex;flex-wrap:wrap;gap:7px;">
<span style="padding:6px 13px;border-radius:var(--radius-full);font-size:13px;font-weight:500;background:var(--green-dark);color:#fff;cursor:pointer;">Pasta</span>
<span style="padding:6px 13px;border-radius:var(--radius-full);font-size:13px;font-weight:500;background:var(--green-dark);color:#fff;cursor:pointer;">Reis</span>
<span style="padding:6px 13px;border-radius:var(--radius-full);font-size:13px;font-weight:400;background:transparent;color:var(--color-text-muted);border:1px solid var(--color-border);cursor:pointer;">Couscous</span>
<span style="padding:6px 13px;border-radius:var(--radius-full);font-size:13px;font-weight:500;background:var(--green-dark);color:#fff;cursor:pointer;">Mehl</span>
</div>
</div>
</div>
</div>
<!-- Profil — collapsed -->
<div style="border:1px solid var(--color-border);border-radius:var(--radius-lg);overflow:hidden;">
<button style="width:100%;display:flex;align-items:center;gap:12px;padding:16px 20px;background:var(--color-surface);border:none;cursor:pointer;text-align:left;">
<span style="font-size:15px;font-weight:500;flex:1;color:var(--color-text);">Profil</span>
<span style="font-size:12px;color:var(--color-text-muted);margin-right:8px;">Marcel Raddatz</span>
<span style="font-size:14px;color:var(--color-text-muted);"></span>
</button>
</div>
<!-- Haushalt — collapsed -->
<div style="border:1px solid var(--color-border);border-radius:var(--radius-lg);overflow:hidden;">
<button style="width:100%;display:flex;align-items:center;gap:12px;padding:16px 20px;background:var(--color-surface);border:none;cursor:pointer;text-align:left;">
<span style="font-size:15px;font-weight:500;flex:1;color:var(--color-text);">Haushalt</span>
<span style="font-size:12px;color:var(--color-text-muted);margin-right:8px;">3 Mitglieder</span>
<span style="font-size:14px;color:var(--color-text-muted);"></span>
</button>
</div>
</div>
</main>
</div>
</div>
</div>
</div>
<div class="preview-m-wrap">
<div class="preview-label">Mobile · 390px</div>
<div class="preview-m-clip">
<div class="preview-m-scale">
<div style="width:390px;min-height:680px;background:var(--color-page);display:flex;flex-direction:column;">
<div style="padding:16px 20px;border-bottom:1px solid var(--color-border);background:var(--color-surface);"><div style="font-family:var(--font-display);font-size:20px;font-weight:500;">Einstellungen</div></div>
<div style="flex:1;padding:12px 20px;display:flex;flex-direction:column;gap:4px;">
<!-- Vorräte expanded -->
<div style="border:1px solid var(--color-border);border-radius:var(--radius-lg);overflow:hidden;">
<button style="width:100%;display:flex;align-items:center;padding:14px 16px;background:var(--color-surface);border:none;cursor:pointer;text-align:left;gap:10px;"><span style="font-size:14px;font-weight:500;flex:1;">Vorräte</span><span style="font-size:11px;color:var(--color-text-muted);">14 aktiv</span><span style="font-size:12px;color:var(--color-text-muted);"></span></button>
<div style="padding:14px 16px;border-top:1px solid var(--color-border);background:var(--color-page);">
<div style="font-size:10px;font-weight:500;letter-spacing:0.08em;text-transform:uppercase;color:var(--color-text-muted);margin-bottom:8px;">Gemüse</div>
<div style="display:flex;flex-wrap:wrap;gap:6px;margin-bottom:12px;">
<span style="padding:5px 11px;border-radius:var(--radius-full);font-size:12px;font-weight:500;background:var(--green-dark);color:#fff;">Karotten</span>
<span style="padding:5px 11px;border-radius:var(--radius-full);font-size:12px;font-weight:500;background:var(--green-dark);color:#fff;">Zwiebeln</span>
<span style="padding:5px 11px;border-radius:var(--radius-full);font-size:12px;font-weight:400;background:transparent;color:var(--color-text-muted);border:1px solid var(--color-border);">Lauch</span>
<span style="padding:5px 11px;border-radius:var(--radius-full);font-size:12px;font-weight:500;background:var(--green-dark);color:#fff;">Knoblauch</span>
</div>
<div style="font-size:10px;font-weight:500;letter-spacing:0.08em;text-transform:uppercase;color:var(--color-text-muted);margin-bottom:8px;">Getreide</div>
<div style="display:flex;flex-wrap:wrap;gap:6px;">
<span style="padding:5px 11px;border-radius:var(--radius-full);font-size:12px;font-weight:500;background:var(--green-dark);color:#fff;">Pasta</span>
<span style="padding:5px 11px;border-radius:var(--radius-full);font-size:12px;font-weight:500;background:var(--green-dark);color:#fff;">Reis</span>
<span style="padding:5px 11px;border-radius:var(--radius-full);font-size:12px;font-weight:400;background:transparent;color:var(--color-text-muted);border:1px solid var(--color-border);">Couscous</span>
</div>
</div>
</div>
<div style="border:1px solid var(--color-border);border-radius:var(--radius-lg);overflow:hidden;"><button style="width:100%;display:flex;align-items:center;padding:14px 16px;background:var(--color-surface);border:none;cursor:pointer;text-align:left;gap:10px;"><span style="font-size:14px;font-weight:500;flex:1;">Profil</span><span style="font-size:11px;color:var(--color-text-muted);">Marcel R.</span><span style="font-size:12px;color:var(--color-text-muted);"></span></button></div>
<div style="border:1px solid var(--color-border);border-radius:var(--radius-lg);overflow:hidden;"><button style="width:100%;display:flex;align-items:center;padding:14px 16px;background:var(--color-surface);border:none;cursor:pointer;text-align:left;gap:10px;"><span style="font-size:14px;font-weight:500;flex:1;">Haushalt</span><span style="font-size:11px;color:var(--color-text-muted);">3 Mitglieder</span><span style="font-size:12px;color:var(--color-text-muted);"></span></button></div>
</div>
<nav style="background:var(--color-surface);border-top:1px solid var(--color-border);padding:8px 0 20px;display:flex;"><a style="flex:1;display:flex;flex-direction:column;align-items:center;gap:3px;font-size:10px;color:var(--color-text-muted);text-decoration:none;padding:4px 0;"><span style="width:20px;height:20px;background:var(--color-border);border-radius:3px;display:inline-block;"></span>Planer</a><a style="flex:1;display:flex;flex-direction:column;align-items:center;gap:3px;font-size:10px;color:var(--color-text-muted);text-decoration:none;padding:4px 0;"><span style="width:20px;height:20px;background:var(--color-border);border-radius:3px;display:inline-block;"></span>Rezepte</a><a style="flex:1;display:flex;flex-direction:column;align-items:center;gap:3px;font-size:10px;color:var(--color-text-muted);text-decoration:none;padding:4px 0;"><span style="width:20px;height:20px;background:var(--color-border);border-radius:3px;display:inline-block;"></span>Einkauf</a><a style="flex:1;display:flex;flex-direction:column;align-items:center;gap:3px;font-size:10px;color:var(--green-dark);font-weight:500;text-decoration:none;padding:4px 0;"><span style="width:20px;height:20px;background:var(--green-light);border-radius:3px;display:inline-block;"></span>Einstellungen</a></nav>
</div>
</div>
</div>
</div>
</div>
<div class="var-notes">
<div class="var-notes-label">Design-Entscheidungen</div>
<ul>
<li>Vorräte-Abschnitt ist beim Öffnen der Seite standardmäßig aufgeklappt (per URL-Hash oder initial state) — der häufigste Grund für diesen Seitenaufruf ist das Bearbeiten von Vorräten.</li>
<li>Kein Seitenwechsel zu /household/staples nötig — die StaplesManager-Komponente rendert direkt im Akkordeon-Bereich. Routing-Vorteil: die /settings URL bleibt beim Bearbeiten erhalten.</li>
<li>Akkordeon-Trigger zeigt den aktuellen Wert im eingeklappten Zustand (z. B. "14 aktiv", "Marcel Raddatz") — der Nutzer kann den Status scannen ohne aufzuklappen.</li>
<li>Auf Mobile perfekt: kein separater "Zurück"-Button nötig. Ein langer Scroll kann mit einem "Nach oben"-Link oder sticky Akkordeon-Headern optimiert werden.</li>
<li>Implementierungshinweis: Der aufgeklappte Bereich enthält direkt die StaplesManager-Komponente (<code style="font-family:var(--font-mono);font-size:11px;background:var(--color-subtle);padding:1px 4px;border-radius:2px;">&lt;StaplesManager categories={data.categories} context="settings" /&gt;</code>). Keine Seiten-Navigation erforderlich.</li>
</ul>
</div>
</div>
<!-- ══════════════════════════════════════
V4 — SETTINGS SUB-NAV
══════════════════════════════════════ -->
<div class="variation">
<div class="var-header">
<div class="var-num">V4</div>
<div class="var-meta">
<div class="var-title">Einstellungs-Sub-Navigation</div>
<div class="var-desc">Auf Desktop: eine zweite Navigationsleiste links neben dem Inhalt (Profil · Vorräte · Haushalt). Der Vorräte-Abschnitt ist der Standard-Inhalt. Auf Mobile: flache Liste als Einstieg, dann Drill-down.</div>
<span class="var-tag">Skaliert gut bei vielen Settings-Bereichen</span>
</div>
</div>
<div class="preview-pair">
<div class="preview-d-wrap">
<div class="preview-label">Desktop · 1200px — Vorräte als Standardansicht</div>
<div class="preview-d-clip">
<div class="preview-d-scale">
<div style="display:flex;width:1200px;min-height:680px;background:var(--color-page);">
<!-- Main sidebar -->
<aside style="width:224px;flex-shrink:0;background:var(--color-surface);border-right:1px solid var(--color-border);padding:0;display:flex;flex-direction:column;min-height:680px;"><div style="padding:18px 16px 16px;border-bottom:1px solid var(--color-border);display:flex;align-items:center;gap:10px;"><div style="width:22px;height:22px;background:var(--green);border-radius:5px;flex-shrink:0;"></div><div><div style="font-family:var(--font-display);font-size:15px;font-weight:500;color:var(--color-text);">Mealprep</div><div style="font-size:10px;color:var(--color-text-muted);">Familie Raddatz</div></div></div><nav style="padding:16px 0;flex:1;"><div style="font-size:8px;font-weight:500;letter-spacing:0.1em;text-transform:uppercase;color:var(--color-text-muted);padding:0 16px 6px;">Plan</div><a style="display:flex;align-items:center;gap:8px;padding:7px 16px;font-size:13px;color:var(--color-text-muted);text-decoration:none;"><span style="width:16px;height:16px;background:var(--color-border);border-radius:3px;flex-shrink:0;display:inline-block;"></span>Planer</a><a style="display:flex;align-items:center;gap:8px;padding:7px 16px;font-size:13px;color:var(--color-text-muted);text-decoration:none;"><span style="width:16px;height:16px;background:var(--color-border);border-radius:3px;flex-shrink:0;display:inline-block;"></span>Rezepte</a><a style="display:flex;align-items:center;gap:8px;padding:7px 16px;font-size:13px;color:var(--color-text-muted);text-decoration:none;"><span style="width:16px;height:16px;background:var(--color-border);border-radius:3px;flex-shrink:0;display:inline-block;"></span>Einkauf</a><div style="font-size:8px;font-weight:500;letter-spacing:0.1em;text-transform:uppercase;color:var(--color-text-muted);padding:16px 16px 6px;">Haushalt</div><a style="display:flex;align-items:center;gap:8px;padding:7px 16px;font-size:13px;color:var(--color-text-muted);text-decoration:none;margin:0 8px;"><span style="width:16px;height:16px;background:var(--color-border);border-radius:3px;flex-shrink:0;display:inline-block;"></span>Mitglieder</a><a style="display:flex;align-items:center;gap:8px;padding:7px 16px;font-size:13px;background:var(--green-tint);color:var(--green-dark);font-weight:500;text-decoration:none;border-radius:var(--radius-md);margin:0 8px;"><span style="width:16px;height:16px;background:var(--green-light);border-radius:3px;flex-shrink:0;display:inline-block;"></span>Einstellungen</a></nav></aside>
<!-- Settings sub-nav + content -->
<div style="flex:1;display:flex;">
<!-- Sub-nav -->
<div style="width:180px;flex-shrink:0;border-right:1px solid var(--color-border);background:var(--color-surface);padding:32px 0;">
<div style="font-size:8px;font-weight:500;letter-spacing:0.1em;text-transform:uppercase;color:var(--color-text-muted);padding:0 16px 12px;">Einstellungen</div>
<a style="display:block;padding:8px 16px;font-size:13px;background:var(--green-tint);color:var(--green-dark);font-weight:500;text-decoration:none;border-radius:var(--radius-md);margin:0 8px 2px;">Vorräte</a>
<a style="display:block;padding:8px 16px;font-size:13px;color:var(--color-text-muted);text-decoration:none;margin:0 8px 2px;">Profil</a>
<a style="display:block;padding:8px 16px;font-size:13px;color:var(--color-text-muted);text-decoration:none;margin:0 8px 2px;">Haushalt</a>
</div>
<!-- Content: Staples -->
<main style="flex:1;padding:32px 40px;overflow:hidden;">
<div style="display:flex;align-items:baseline;gap:12px;margin-bottom:24px;">
<h2 style="font-family:var(--font-display);font-size:22px;font-weight:500;letter-spacing:-0.02em;">Vorräte</h2>
<span style="font-size:13px;color:var(--color-text-muted);">14 von 32 aktiv</span>
</div>
<div style="font-size:13px;color:var(--color-text-muted);margin-bottom:20px;line-height:1.5;">Tippe eine Zutat an um den Vorrats-Status zu ändern. Automatisch gespeichert.</div>
<div style="margin-bottom:18px;">
<div style="font-size:10px;font-weight:500;letter-spacing:0.08em;text-transform:uppercase;color:var(--color-text-muted);margin-bottom:8px;">Gemüse</div>
<div style="display:flex;flex-wrap:wrap;gap:7px;">
<span style="padding:6px 13px;border-radius:var(--radius-full);font-size:13px;font-weight:500;background:var(--green-dark);color:#fff;cursor:pointer;">Karotten</span>
<span style="padding:6px 13px;border-radius:var(--radius-full);font-size:13px;font-weight:500;background:var(--green-dark);color:#fff;cursor:pointer;">Zwiebeln</span>
<span style="padding:6px 13px;border-radius:var(--radius-full);font-size:13px;font-weight:400;background:transparent;color:var(--color-text-muted);border:1px solid var(--color-border);cursor:pointer;">Lauch</span>
<span style="padding:6px 13px;border-radius:var(--radius-full);font-size:13px;font-weight:500;background:var(--green-dark);color:#fff;cursor:pointer;">Knoblauch</span>
<span style="padding:6px 13px;border-radius:var(--radius-full);font-size:13px;font-weight:400;background:transparent;color:var(--color-text-muted);border:1px solid var(--color-border);cursor:pointer;">Fenchel</span>
<span style="padding:6px 13px;border-radius:var(--radius-full);font-size:13px;font-weight:500;background:var(--green-dark);color:#fff;cursor:pointer;">Paprika</span>
</div>
</div>
<div>
<div style="font-size:10px;font-weight:500;letter-spacing:0.08em;text-transform:uppercase;color:var(--color-text-muted);margin-bottom:8px;">Getreide</div>
<div style="display:flex;flex-wrap:wrap;gap:7px;">
<span style="padding:6px 13px;border-radius:var(--radius-full);font-size:13px;font-weight:500;background:var(--green-dark);color:#fff;cursor:pointer;">Pasta</span>
<span style="padding:6px 13px;border-radius:var(--radius-full);font-size:13px;font-weight:500;background:var(--green-dark);color:#fff;cursor:pointer;">Reis</span>
<span style="padding:6px 13px;border-radius:var(--radius-full);font-size:13px;font-weight:400;background:transparent;color:var(--color-text-muted);border:1px solid var(--color-border);cursor:pointer;">Couscous</span>
<span style="padding:6px 13px;border-radius:var(--radius-full);font-size:13px;font-weight:500;background:var(--green-dark);color:#fff;cursor:pointer;">Mehl</span>
</div>
</div>
</main>
</div>
</div>
</div>
</div>
</div>
<div class="preview-m-wrap">
<div class="preview-label">Mobile · 390px (Drill-down)</div>
<div class="preview-m-clip">
<div class="preview-m-scale">
<div style="width:390px;min-height:680px;background:var(--color-page);display:flex;flex-direction:column;">
<div style="padding:16px 20px 12px;display:flex;align-items:center;gap:12px;border-bottom:1px solid var(--color-border);background:var(--color-surface);">
<div style="font-size:18px;color:var(--color-text-muted);"></div>
<div style="font-family:var(--font-display);font-size:18px;font-weight:500;">Vorräte</div>
<div style="flex:1;text-align:right;font-size:12px;color:var(--color-text-muted);">14 aktiv</div>
</div>
<div style="flex:1;padding:16px 20px;">
<div style="font-size:10px;font-weight:500;letter-spacing:0.08em;text-transform:uppercase;color:var(--color-text-muted);margin-bottom:10px;">Gemüse</div>
<div style="display:flex;flex-wrap:wrap;gap:6px;margin-bottom:16px;">
<span style="padding:6px 12px;border-radius:var(--radius-full);font-size:12px;font-weight:500;background:var(--green-dark);color:#fff;">Karotten</span>
<span style="padding:6px 12px;border-radius:var(--radius-full);font-size:12px;font-weight:500;background:var(--green-dark);color:#fff;">Zwiebeln</span>
<span style="padding:6px 12px;border-radius:var(--radius-full);font-size:12px;font-weight:400;background:transparent;color:var(--color-text-muted);border:1px solid var(--color-border);">Lauch</span>
<span style="padding:6px 12px;border-radius:var(--radius-full);font-size:12px;font-weight:500;background:var(--green-dark);color:#fff;">Knoblauch</span>
</div>
<div style="font-size:10px;font-weight:500;letter-spacing:0.08em;text-transform:uppercase;color:var(--color-text-muted);margin-bottom:10px;">Getreide</div>
<div style="display:flex;flex-wrap:wrap;gap:6px;">
<span style="padding:6px 12px;border-radius:var(--radius-full);font-size:12px;font-weight:500;background:var(--green-dark);color:#fff;">Pasta</span>
<span style="padding:6px 12px;border-radius:var(--radius-full);font-size:12px;font-weight:500;background:var(--green-dark);color:#fff;">Reis</span>
<span style="padding:6px 12px;border-radius:var(--radius-full);font-size:12px;font-weight:400;background:transparent;color:var(--color-text-muted);border:1px solid var(--color-border);">Couscous</span>
<span style="padding:6px 12px;border-radius:var(--radius-full);font-size:12px;font-weight:500;background:var(--green-dark);color:#fff;">Mehl</span>
</div>
</div>
<nav style="background:var(--color-surface);border-top:1px solid var(--color-border);padding:8px 0 20px;display:flex;"><a style="flex:1;display:flex;flex-direction:column;align-items:center;gap:3px;font-size:10px;color:var(--color-text-muted);text-decoration:none;padding:4px 0;"><span style="width:20px;height:20px;background:var(--color-border);border-radius:3px;display:inline-block;"></span>Planer</a><a style="flex:1;display:flex;flex-direction:column;align-items:center;gap:3px;font-size:10px;color:var(--color-text-muted);text-decoration:none;padding:4px 0;"><span style="width:20px;height:20px;background:var(--color-border);border-radius:3px;display:inline-block;"></span>Rezepte</a><a style="flex:1;display:flex;flex-direction:column;align-items:center;gap:3px;font-size:10px;color:var(--color-text-muted);text-decoration:none;padding:4px 0;"><span style="width:20px;height:20px;background:var(--color-border);border-radius:3px;display:inline-block;"></span>Einkauf</a><a style="flex:1;display:flex;flex-direction:column;align-items:center;gap:3px;font-size:10px;color:var(--green-dark);font-weight:500;text-decoration:none;padding:4px 0;"><span style="width:20px;height:20px;background:var(--green-light);border-radius:3px;display:inline-block;"></span>Einstellungen</a></nav>
</div>
</div>
</div>
</div>
</div>
<div class="var-notes">
<div class="var-notes-label">Design-Entscheidungen</div>
<ul>
<li>Dreifache Navigationsstruktur auf Desktop (App-Sidebar → Settings-Sub-Nav → Inhalt) ist für 3 Einstellungsbereiche Overkill. Skaliert erst ab 6+ Bereichen.</li>
<li>Vorrat als Default-Selektion in der Sub-Nav sinnvoll — direktester Einstieg für J8. Verhindert eine "leere Hub"-Seite.</li>
<li>Mobile-Drill-down: Sub-Nav-Liste → Unterseite. Entspricht dem Standard-Mobile-Pattern (z. B. iOS Systemeinstellungen). Klare Navigation, aber erfordert eine Zurück-Navigation.</li>
<li>Nicht empfohlen für v1: zu viel Struktur für zu wenig Inhalt. V3 (Akkordeon) ist einfacher und erreicht dasselbe Ergebnis ohne Sub-Navigation.</li>
</ul>
</div>
</div>
<!-- ══════════════════════════════════════
V5 — DASHBOARD WITH SHORTCUT
══════════════════════════════════════ -->
<div class="variation">
<div class="var-header">
<div class="var-num">V5</div>
<div class="var-meta">
<div class="var-title">Schnellzugriff-Dashboard</div>
<div class="var-desc">Settings als kleines Dashboard: Haushalt-Zusammenfassung oben (Name + Mitgliederzahl), darunter ein prominenter "Vorräte bearbeiten" Einstieg mit aktuellem Zählstand und zuletzt bearbeiteten Chips als Vorschau. Alles auf einer Seite — kein Drill-down.</div>
<span class="var-tag">Informationsdicht · klarer Schwerpunkt</span>
</div>
</div>
<div class="preview-pair">
<div class="preview-d-wrap">
<div class="preview-label">Desktop · 1200px</div>
<div class="preview-d-clip">
<div class="preview-d-scale">
<div style="display:flex;width:1200px;min-height:680px;background:var(--color-page);">
<aside style="width:224px;flex-shrink:0;background:var(--color-surface);border-right:1px solid var(--color-border);padding:0;display:flex;flex-direction:column;min-height:680px;"><div style="padding:18px 16px 16px;border-bottom:1px solid var(--color-border);display:flex;align-items:center;gap:10px;"><div style="width:22px;height:22px;background:var(--green);border-radius:5px;flex-shrink:0;"></div><div><div style="font-family:var(--font-display);font-size:15px;font-weight:500;color:var(--color-text);">Mealprep</div><div style="font-size:10px;color:var(--color-text-muted);">Familie Raddatz</div></div></div><nav style="padding:16px 0;flex:1;"><div style="font-size:8px;font-weight:500;letter-spacing:0.1em;text-transform:uppercase;color:var(--color-text-muted);padding:0 16px 6px;">Plan</div><a style="display:flex;align-items:center;gap:8px;padding:7px 16px;font-size:13px;color:var(--color-text-muted);text-decoration:none;"><span style="width:16px;height:16px;background:var(--color-border);border-radius:3px;flex-shrink:0;display:inline-block;"></span>Planer</a><a style="display:flex;align-items:center;gap:8px;padding:7px 16px;font-size:13px;color:var(--color-text-muted);text-decoration:none;"><span style="width:16px;height:16px;background:var(--color-border);border-radius:3px;flex-shrink:0;display:inline-block;"></span>Rezepte</a><a style="display:flex;align-items:center;gap:8px;padding:7px 16px;font-size:13px;color:var(--color-text-muted);text-decoration:none;"><span style="width:16px;height:16px;background:var(--color-border);border-radius:3px;flex-shrink:0;display:inline-block;"></span>Einkauf</a><div style="font-size:8px;font-weight:500;letter-spacing:0.1em;text-transform:uppercase;color:var(--color-text-muted);padding:16px 16px 6px;">Haushalt</div><a style="display:flex;align-items:center;gap:8px;padding:7px 16px;font-size:13px;color:var(--color-text-muted);text-decoration:none;margin:0 8px;"><span style="width:16px;height:16px;background:var(--color-border);border-radius:3px;flex-shrink:0;display:inline-block;"></span>Mitglieder</a><a style="display:flex;align-items:center;gap:8px;padding:7px 16px;font-size:13px;background:var(--green-tint);color:var(--green-dark);font-weight:500;text-decoration:none;border-radius:var(--radius-md);margin:0 8px;"><span style="width:16px;height:16px;background:var(--green-light);border-radius:3px;flex-shrink:0;display:inline-block;"></span>Einstellungen</a></nav></aside>
<main style="flex:1;padding:40px 56px;">
<!-- Profile strip -->
<div style="display:flex;align-items:center;justify-content:space-between;margin-bottom:32px;padding-bottom:24px;border-bottom:1px solid var(--color-border);">
<div style="display:flex;align-items:center;gap:14px;">
<div style="width:44px;height:44px;border-radius:50%;background:var(--green-tint);display:flex;align-items:center;justify-content:center;font-size:16px;font-weight:600;color:var(--green-dark);">MR</div>
<div><div style="font-size:16px;font-weight:500;">Marcel Raddatz</div><div style="font-size:13px;color:var(--color-text-muted);">marcel@email.com · Planner</div></div>
</div>
<button style="font-family:var(--font-sans);font-size:12px;font-weight:500;padding:7px 14px;border-radius:var(--radius-md);background:var(--color-surface);border:1px solid var(--color-border);cursor:pointer;">Profil bearbeiten</button>
</div>
<!-- Main area: Staples primary + Household secondary -->
<div style="display:grid;grid-template-columns:2fr 1fr;gap:20px;max-width:820px;">
<!-- Staples primary block -->
<div style="background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius-xl);padding:28px;box-shadow:var(--shadow-card);">
<div style="display:flex;align-items:baseline;gap:12px;margin-bottom:6px;">
<div style="font-size:16px;font-weight:500;">Vorräte</div>
<div style="font-family:var(--font-display);font-size:28px;font-weight:300;color:var(--green-dark);letter-spacing:-0.02em;line-height:1;">14</div>
<div style="font-size:12px;color:var(--color-text-muted);">von 32 aktiv</div>
</div>
<div style="font-size:13px;color:var(--color-text-muted);margin-bottom:18px;">Immer vorhandene Zutaten werden automatisch aus Einkaufslisten gefiltert.</div>
<!-- Chip preview -->
<div style="display:flex;flex-wrap:wrap;gap:6px;margin-bottom:18px;">
<span style="padding:5px 11px;border-radius:var(--radius-full);font-size:12px;font-weight:500;background:var(--green-dark);color:#fff;">Karotten</span>
<span style="padding:5px 11px;border-radius:var(--radius-full);font-size:12px;font-weight:500;background:var(--green-dark);color:#fff;">Pasta</span>
<span style="padding:5px 11px;border-radius:var(--radius-full);font-size:12px;font-weight:500;background:var(--green-dark);color:#fff;">Zwiebeln</span>
<span style="padding:5px 11px;border-radius:var(--radius-full);font-size:12px;font-weight:500;background:var(--green-dark);color:#fff;">Reis</span>
<span style="padding:5px 11px;border-radius:var(--radius-full);font-size:12px;color:var(--color-text-muted);border:1px solid var(--color-border);">+10 weitere</span>
</div>
<button style="background:var(--green-dark);color:#fff;font-family:var(--font-sans);font-size:13px;font-weight:500;letter-spacing:0.04em;padding:10px 20px;border-radius:var(--radius-md);border:none;cursor:pointer;">Alle Vorräte bearbeiten</button>
</div>
<!-- Household secondary -->
<div style="background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius-xl);padding:24px;display:flex;flex-direction:column;gap:12px;">
<div style="font-size:15px;font-weight:500;">Haushalt</div>
<div style="font-family:var(--font-display);font-size:32px;font-weight:300;color:var(--color-text-muted);line-height:1;">3</div>
<div style="font-size:12px;color:var(--color-text-muted);">Mitglieder · Familie Raddatz</div>
<div style="flex:1;"></div>
<button style="font-family:var(--font-sans);font-size:12px;font-weight:500;padding:8px 14px;border-radius:var(--radius-md);background:var(--color-page);border:1px solid var(--color-border);cursor:pointer;">Verwalten</button>
</div>
</div>
</main>
</div>
</div>
</div>
</div>
<div class="preview-m-wrap">
<div class="preview-label">Mobile · 390px</div>
<div class="preview-m-clip">
<div class="preview-m-scale">
<div style="width:390px;min-height:680px;background:var(--color-page);display:flex;flex-direction:column;">
<!-- Profile strip -->
<div style="padding:16px 20px;border-bottom:1px solid var(--color-border);background:var(--color-surface);display:flex;align-items:center;gap:12px;">
<div style="width:36px;height:36px;border-radius:50%;background:var(--green-tint);display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:600;color:var(--green-dark);flex-shrink:0;">MR</div>
<div style="flex:1;"><div style="font-size:14px;font-weight:500;">Marcel Raddatz</div><div style="font-size:11px;color:var(--color-text-muted);">Planner · Familie Raddatz</div></div>
</div>
<div style="flex:1;padding:16px 20px;display:flex;flex-direction:column;gap:12px;">
<!-- Staples block -->
<div style="background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius-lg);padding:18px;">
<div style="display:flex;align-items:baseline;gap:10px;margin-bottom:10px;"><div style="font-size:15px;font-weight:500;">Vorräte</div><div style="font-family:var(--font-display);font-size:24px;font-weight:300;color:var(--green-dark);line-height:1;">14</div><div style="font-size:11px;color:var(--color-text-muted);">von 32</div></div>
<div style="display:flex;flex-wrap:wrap;gap:5px;margin-bottom:14px;">
<span style="padding:4px 10px;border-radius:var(--radius-full);font-size:11px;font-weight:500;background:var(--green-dark);color:#fff;">Karotten</span>
<span style="padding:4px 10px;border-radius:var(--radius-full);font-size:11px;font-weight:500;background:var(--green-dark);color:#fff;">Pasta</span>
<span style="padding:4px 10px;border-radius:var(--radius-full);font-size:11px;font-weight:500;background:var(--green-dark);color:#fff;">Zwiebeln</span>
<span style="padding:4px 10px;border-radius:var(--radius-full);font-size:11px;color:var(--color-text-muted);border:1px solid var(--color-border);">+11</span>
</div>
<button style="width:100%;background:var(--green-dark);color:#fff;font-size:13px;font-weight:500;padding:10px;border-radius:var(--radius-md);border:none;">Vorräte bearbeiten</button>
</div>
<!-- Household -->
<div style="background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius-lg);padding:18px;display:flex;align-items:center;justify-content:space-between;">
<div><div style="font-size:14px;font-weight:500;">Haushalt</div><div style="font-size:12px;color:var(--color-text-muted);">Familie Raddatz · 3 Mitglieder</div></div>
<button style="font-size:12px;font-weight:500;padding:7px 14px;border-radius:var(--radius-md);background:var(--color-page);border:1px solid var(--color-border);cursor:pointer;"></button>
</div>
</div>
<nav style="background:var(--color-surface);border-top:1px solid var(--color-border);padding:8px 0 20px;display:flex;"><a style="flex:1;display:flex;flex-direction:column;align-items:center;gap:3px;font-size:10px;color:var(--color-text-muted);text-decoration:none;padding:4px 0;"><span style="width:20px;height:20px;background:var(--color-border);border-radius:3px;display:inline-block;"></span>Planer</a><a style="flex:1;display:flex;flex-direction:column;align-items:center;gap:3px;font-size:10px;color:var(--color-text-muted);text-decoration:none;padding:4px 0;"><span style="width:20px;height:20px;background:var(--color-border);border-radius:3px;display:inline-block;"></span>Rezepte</a><a style="flex:1;display:flex;flex-direction:column;align-items:center;gap:3px;font-size:10px;color:var(--color-text-muted);text-decoration:none;padding:4px 0;"><span style="width:20px;height:20px;background:var(--color-border);border-radius:3px;display:inline-block;"></span>Einkauf</a><a style="flex:1;display:flex;flex-direction:column;align-items:center;gap:3px;font-size:10px;color:var(--green-dark);font-weight:500;text-decoration:none;padding:4px 0;"><span style="width:20px;height:20px;background:var(--green-light);border-radius:3px;display:inline-block;"></span>Einstellungen</a></nav>
</div>
</div>
</div>
</div>
</div>
<div class="var-notes">
<div class="var-notes-label">Design-Entscheidungen</div>
<ul>
<li>Chip-Vorschau auf der Hub-Seite (4 aktive Vorräte + "+10 weitere") gibt dem Nutzer sofort Kontext über den aktuellen Zustand — kein Klick nötig um zu verstehen, was konfiguriert ist.</li>
<li>Profil-Leiste oben als Identitätsanker: Name, E-Mail, Rolle. Schafft eine klare "Wer bin ich in diesem Haushalt"-Aussage ohne eigene Profil-Seite besuchen zu müssen.</li>
<li>2:1 Grid-Layout auf Desktop betont Vorräte als primäre Einstellung — genau das richtige Gewicht für J8.</li>
<li>Nachteil: Der "Alle Vorräte bearbeiten"-Button navigiert trotzdem zur D3-Unterseite (oder öffnet ein Modal). Keine wirklich inline-Bearbeitung wie bei V3. Funktioniert aber gut als Schnellzugriff-Übersicht.</li>
</ul>
</div>
</div>
</div><!-- /doc -->
<!-- ═══════════════════════════════════════════════════════
MACHINE-READABLE SPEC (LLM AGENT REGION)
════════════════════════════════════════════════════════ -->
<!--
spec:agent:start
document: E1 Settings + D3 Staples
version: 1.0
-->
<div class="agent-section">
<h2>Machine-readable spec — E1 Einstellungen / D3 Vorräte</h2>
<p>Authoritative implementation reference for /settings and /household/staples?ctx=settings. Use before building either page.</p>
<pre class="spec-comment">/* E1 Settings + D3 Staples — implementation rules
* 1. Recommended variation: V3 (Accordion). Vorräte section is open by default. No navigation to sub-page required.
* 2. D3 = A3: StaplesManager is the same component. context="settings" removes the onboarding sidebar and "Weiter" button.
* 3. StapleChip renders as a pill button, NOT a checkbox. Selected = --green-dark bg + white text. Unselected = transparent bg + --color-border border + --color-text-muted text.
* 4. Auto-save on toggle. No explicit save button. The component already implements debounced PATCH to /household/staples.
* 5. Category label: font-size 10px · font-weight 500 · letter-spacing 0.08em · text-transform uppercase · color --color-text-muted.
* 6. Staple count display ("14 von 32 aktiv"): derive from categories prop — count isStaple=true vs total ingredients.
* 7. Sidebar active item: "Einstellungen" (not "Vorräte" — there is no separate Vorräte sidebar item). Active style: --green-tint bg + --green-dark text.
* 8. Mobile bottom nav active tab: "Einstellungen". Same for both /settings and /household/staples routes.
* 9. Accordion trigger shows current stat in collapsed state: "14 aktiv" for Vorräte. Stat updates reactively as user toggles chips.
* 10. Changes to staples (J8) do NOT retroactively update an already-generated shopping list. If the current list should reflect changes, the planner must regenerate it via J5. Consider a note in the UI: "Gilt ab der nächsten Einkaufsliste."
* 11. Profile section: show name + email. Edit action navigates to /profile or opens an inline form. Not in scope for J8 — implement minimally.
*/</pre>
<table class="agent-table">
<thead>
<tr><th>Element</th><th>Value / Rule</th><th>Notes</th></tr>
</thead>
<tbody>
<tr class="group-row"><td colspan="3">StapleChip</td></tr>
<tr><td>Shape</td><td>border-radius: --radius-full · padding: 6px 14px</td><td>font-size: 13px (desktop) · 12px (mobile)</td></tr>
<tr><td>Selected state</td><td>background: --green-dark · color: #fff · font-weight: 500</td><td>Toggle off: PATCH ingredient isStaple=false</td></tr>
<tr><td>Unselected state</td><td>background: transparent · border: 1px solid --color-border · color: --color-text-muted · font-weight: 400</td><td>Toggle on: PATCH ingredient isStaple=true</td></tr>
<tr><td>Debounce</td><td>300ms after last toggle before PATCH fires</td><td>Already implemented in StaplesManager. Do not add extra debounce layers.</td></tr>
<tr><td>Error state</td><td>Revert chip to previous state · show inline error message</td><td>StaplesManager already handles rollback on API error</td></tr>
<tr class="group-row"><td colspan="3">Category section</td></tr>
<tr><td>Label</td><td>10px · weight 500 · tracking 0.08em · uppercase · --color-text-muted</td><td>German category names from API</td></tr>
<tr><td>Chip grid</td><td>display: flex · flex-wrap: wrap · gap: 7px (desktop) · 6px (mobile)</td><td>No fixed column count — chips wrap naturally</td></tr>
<tr class="group-row"><td colspan="3">Settings page (E1) — V3 Accordion</td></tr>
<tr><td>Vorräte section</td><td>Open by default on page load</td><td>Use Svelte derived state or URL hash to control. Default open state.</td></tr>
<tr><td>Collapsed stat</td><td>Show "N aktiv" reactively next to chevron</td><td>Derive from stapleState in StaplesManager — count true values</td></tr>
<tr><td>Accordion trigger min-height</td><td>48px (desktop) · 44px (mobile)</td><td>WCAG: interactive controls must have 44px min touch target</td></tr>
<tr><td>Accordion chevron</td><td>▲ (open) / ▼ (closed) · color: --color-text-muted</td><td>Or use CSS transform on a single chevron SVG</td></tr>
<tr class="group-row"><td colspan="3">Responsive</td></tr>
<tr><td>Desktop (≥1024px)</td><td>224px app sidebar + content area (max-width ~680px centered)</td><td>Active sidebar: "Einstellungen" (Haushalt section)</td></tr>
<tr><td>Mobile (&lt;768px)</td><td>No sidebar · bottom nav "Einstellungen" active · accordion stacks full-width</td><td>Chips wrap to multiple lines — no truncation</td></tr>
</tbody>
</table>
</div>
<!--
spec:agent:end
-->
</body>
</html>