diff --git a/specs/frontend/e4-variety-settings-kachel.html b/specs/frontend/e4-variety-settings-kachel.html new file mode 100644 index 0000000..48297f7 --- /dev/null +++ b/specs/frontend/e4-variety-settings-kachel.html @@ -0,0 +1,981 @@ + + + + + + Recipe App — E4 Vielfalt-Einstellungen · Implementierungsspezifikation + + + + +
+ + +
+
+

E4 — Vielfalt-Einstellungen

+

Implementierungsspezifikation · V2 Kontext-Preset · Journey J9

+
+
+ v1.0
+ Screens: E1 (Update) + E4
+ States: 5
+ Rolle: Planer only +
+
+ + +
+
J9
+
+

Vielfalt-Algorithmus konfigurieren

+

Planer passt Bewertungsregeln an den Haushaltskontext an — primär das Deaktivieren der Protein-Prüfung für vegetarische Haushalte.

+
E1 → E4 → C3 · Planer only · Auto-Save · Reset benötigt Bestätigung
+
+
+ + + +
+
E1 — Settings-Hub (Update)
+

Der bestehende Settings-Hub (E1) erhält eine dritte Kachel: "Vielfalt-Einstellungen". Die Kachel zeigt den aktuellen Vielfalt-Score als Kennzahl. Das Grid-Layout wird von 2-spaltig zu einem Mix aus Hauptkachel oben und zwei gleichbreiten Kacheln unten angepasst.

+ + +
+

S0 · Settings-Hub mit Vielfalt-Kachel

E1
+
Die neue Vielfalt-Kachel erscheint in der unteren Reihe neben der Haushalt-Kachel. Zeigt den aktuellen Score als lila Kennzahl. Bei Score < 6.0 färbt sich die Kennzahl orange als Aufmerksamkeitshinweis.
+
Änderung gegenüber E1 v1: dritte Kachel + Grid-Anpassung. Vorräte-Kachel bleibt primär (2fr oben).
+ +
+
+
Mobile · 320px
+
+
9:41●●●
+
+
Einstellungen
+
+ +
+
12
+
Vorräte
+
Zutaten immer vorrätig
+
Bearbeiten →
+
+ +
+
+
3
+
Haushalt
+
Mitglieder
+
Verwalten →
+
+
+
7.4
+
Vielfalt
+
Diese Woche
+
Einstellungen →
+
+
+
+
+
📅
Plan
+
🛒
Einkauf
+
🍳
Rezepte
+
⚙️
Einstellungen
+
+
+
+
+ +
+
Desktop · 1040px
+
+
+ +
+
Planung
+
📅 Wochenplan
+
🛒 Einkaufsliste
+
🍳 Rezepte
+
Haushalt
+
⚙️ Einstellungen
+
+
+
+
Einstellungen
+
+
+ +
+
+
12
+
Vorräte
+
Zutaten, die immer vorrätig sind und nicht auf die Einkaufsliste kommen
+
+
Bearbeiten →
+
+ +
+
+
+
3
+
Haushalt
+
Mitglieder & Rollen
+
+
Verwalten →
+
+
+
+
7.4
+
Vielfalt-Einstellungen
+
Algorithmus anpassen
+
+
Einstellungen →
+
+
+
+
+
+
+
+
+ +
+

E1 Hub Update · S0

+
/* E1 grid: Vorräte (full width, 2fr, border-left: 3px solid --green-dark) on top row.
+ * Bottom row: 2 equal columns — Haushalt + Vielfalt-Einstellungen.
+ * Vielfalt card: border-left: 3px solid --purple. Stat color: --purple (7.4).
+ * If score < 6.0: stat color switches to --orange (Aufmerksamkeit) with no other change.
+ * Score value: load from GET /v1/week-plans?weekStart=current → GET /v1/week-plans/{id}/variety-score.
+ * If no current plan: show "–" as stat value, sub: "Kein Plan".
+ * Tap/click Vielfalt card → navigate to E4. */
+ + + + + + + + + + +
ElementWertNotizen
Vielfalt-Kachel
KennzahlvarietyScore.score, 1 DezimalstelleFarbe: --purple normal, --orange wenn < 6.0
LabelVielfalt-EinstellungenDesktop; Mobile: "Vielfalt"
Sub-Label"Diese Woche" / "Kein Plan" / "–"Kein Plan = kein weekPlan für aktuelle Woche
Randborder-left: 3px solid --purpleAnalog zu Vorräte → --green-dark
AktionTap → navigate /settings/varietyRoute: +page.svelte unter (app)/settings/variety/
Grid-Layout
MobileVorräte fullwidth + grid-template-columns: 1fr 1fr untenGap: 12px
DesktopVorräte fullwidth + grid-template-columns: 1fr 1fr untenMax-width: 640px, gap: 16px
+
+
+
+ + + +
+
E4 — Vielfalt-Einstellungen · States
+ +
+

S1 · Standard (kein Custom-Config)

E4
+
Erster Aufruf, kein haushaltsindividueller Config-Eintrag. Omnivor-Chip ist ausgewählt (Default-Zustand). Score-Preview zeigt den aktuellen tatsächlichen Score — keine Simulation nötig, da noch nichts geändert wurde. Hinweis-Text erklärt kurz den Zweck der Seite.
+
S1 · Omnivor selected · Score-Preview = aktueller Score · Erweiterte Einstellungen eingeklappt
+ +
+
+
Mobile · 320px
+
+
9:41●●●
+
+
← Einstellungen
Vielfalt
+
+
Passe den Algorithmus an deinen Haushalt an. Änderungen werden sofort übernommen.
+ +
Haushaltskontext
+
+
+
🥩
+
Omnivor
+
Alle Regeln aktiv
+
+
+
🥦
+
Vegetarisch
+
Protein deaktiviert
+
+
+
🌱
+
Vegan
+
Protein deaktiviert
+
+
+ +
Aktive Regeln
+
+
✓ Protein
+
✓ Küche
+
✓ Zutaten · Mittel
+
✓ Letzte Wochen · Mittel
+
⚠ Duplikate · Hoch
+
+ +
+
+
Erweiterte Einstellungen
+
+
+
+ +
+
+
Aktueller Score
+
7.4
+
Keine Änderungen
+
+
📊
+
+ + +
+
+
📅
Plan
+
🛒
Einkauf
+
🍳
Rezepte
+
⚙️
Einstellungen
+
+
+
+
+ +
+
Desktop · 1040px
+
+
+ +
+
Planung
+
📅 Wochenplan
+
🛒 Einkaufsliste
+
🍳 Rezepte
+
Haushalt
+
⚙️ Einstellungen
+
+
+
+
Einstellungen Vielfalt-Einstellungen
Vielfalt-Einstellungen
+
+
+
+
Passe den Algorithmus an deinen Haushaltskontext an. Änderungen werden sofort übernommen und wirken sich auf den nächsten Score-Abruf aus.
+
Haushaltskontext
+
+
🥩
Omnivor
Alle Regeln aktiv
+
🥦
Vegetarisch
Protein deaktiviert
+
🌱
Vegan
Protein deaktiviert
+
+
+
Erweiterte Einstellungen
+
+ +
+
+
+
+
Aktueller Score
+
7.4 / 10
+
Keine Änderungen aktiv
+
+
📊
+
+
Aktive Regeln
+
+
ProteinMittel
+
KücheMittel
+
ZutatenNiedrig
+
Letzte WochenMittel
+
DuplikateHoch
+
+
+
+
+
+
+
+
+ +
+

E4 · S1 Default

+
/* Load: GET /v1/households/mine/variety-config → 404 if no custom config.
+ * On 404: use defaults (Omnivor preset), show Omnivor chip as selected.
+ * Score banner: show actual GET /v1/week-plans/{id}/variety-score (no simulation).
+ * "Bereits Standard-Einstellungen" replaces reset link if no custom config exists.
+ * Accordion: closed. */
+ + + + + + + + + + + + +
ElementWertNotizen
Laden
Config-LoadGET /v1/households/mine/variety-config404 → Defaults verwenden, Omnivor selected
Score-LoadGET /v1/week-plans/{id}/variety-scoreNur wenn weekPlan existiert; sonst Score-Banner ausblenden
Kontext-Chips
OmnivorrepeatTagTypes: ["protein","cuisine"], alle Gewichte StandardDefault-Preset = backend defaults
VegetarischrepeatTagTypes: ["cuisine"], wTagRepeat StandardProtein deaktiviert
VeganrepeatTagTypes: ["cuisine"], wTagRepeat StandardIdentisch zu Vegetarisch in v1
IndividuellErscheint automatisch wenn Advanced abweicht vom PresetKein manuell wählbarer Chip — nur automatisch
Score-Banner (S1)
WertAktueller Score (keine Simulation)Label: "Aktueller Score"
Sub-Label"Keine Änderungen"Neutral-Farbe (#6B6A63)
+
+
+ + + +
+

S2 · Vegetarisch ausgewählt — Score-Simulation

E4
+
Planer tippt auf "Vegetarisch". Config wird sofort per PATCH gespeichert. Score-Banner lädt die simulierte Punktzahl: wie würde der aktuelle Plan mit der neuen Config abschneiden. Delta wird grün hervorgehoben. Protein-Pill wechselt zu "off". Erweiterte Einstellungen zeigt Protein-Toggle als deaktiviert.
+
S2 · Vegetarisch selected · Score-Preview = simuliert · Protein-Pill = off
+ +
+
+
Mobile · 320px
+
+
9:41●●●
+
+
← Einstellungen
Vielfalt
+
+
Passe den Algorithmus an deinen Haushalt an. Änderungen werden sofort übernommen.
+ +
Haushaltskontext
+
+
🥩
Omnivor
Alle Regeln aktiv
+
🥦
Vegetarisch
Protein deaktiviert
+
🌱
Vegan
Protein deaktiviert
+
+ +
Aktive Regeln
+
+
– Protein
+
✓ Küche
+
✓ Zutaten · Mittel
+
✓ Letzte Wochen · Mittel
+
⚠ Duplikate · Hoch
+
+ +
+
Erweiterte Einstellungen
+
+ +
+
+
Mit diesen Einstellungen
+
8.9
+
↑ +1.5 gegenüber vorher
+
+
📈
+
+ + +
+
+
📅
Plan
+
🛒
Einkauf
+
🍳
Rezepte
+
⚙️
Einstellungen
+
+
+
+
+ +
+
Desktop · 1040px
+
+
+ +
+
Planung
+
📅 Wochenplan
+
🛒 Einkaufsliste
+
🍳 Rezepte
+
Haushalt
+
⚙️ Einstellungen
+
+
+
+
Einstellungen Vielfalt-Einstellungen
Vielfalt-Einstellungen
+
+
+
+
Passe den Algorithmus an deinen Haushaltskontext an. Änderungen werden sofort übernommen und wirken sich auf den nächsten Score-Abruf aus.
+
Haushaltskontext
+
+
🥩
Omnivor
Alle Regeln aktiv
+
🥦
Vegetarisch
Protein deaktiviert
+
🌱
Vegan
Protein deaktiviert
+
+
+
Erweiterte Einstellungen
+
+ +
+
+
+
+
Mit diesen Einstellungen
+
8.9 / 10
+
↑ +1.5 gegenüber vorher
+
+
📈
+
+
Aktive Regeln
+
+
ProteinDeaktiviert
+
KücheMittel
+
ZutatenNiedrig
+
Letzte WochenMittel
+
DuplikateHoch
+
+
+
+
+
+
+
+
+ +
+

E4 · S2 Vegetarisch

+
/* On chip tap (Vegetarisch):
+ * 1. Optimistic UI: swap selected chip, update pills, update sum-rows immediately.
+ * 2. PATCH /v1/households/mine/variety-config { repeatTagTypes: ["cuisine"],
+ *    wTagRepeat: 1.5, wIngredientOverlap: 0.3, wRecentRepeat: 1.0, wPlanDuplicate: 2.0 }
+ * 3. On PATCH success: fire GET /v1/week-plans/{id}/variety-score?simulate=true
+ *    with same config body → update score-banner with simulated score + delta.
+ * 4. On PATCH error: rollback to previous chip selection + show toast "Fehler beim Speichern".
+ * Score-Banner during load: show spinner in place of val. */
+ + + + + + + + + + + + +
ElementWertNotizen
Score-Banner (S2)
Label"Mit diesen Einstellungen"Statt "Aktueller Score"
Delta"↑ +X.X gegenüber vorher"Grün (#6FCF97) wenn positiv; rot wenn negativ; neutral wenn = 0
Simulation-EndpointPOST /v1/week-plans/{id}/variety-score/simulateBody: VarietyScoreConfig-Felder. Neuer Endpoint nötig (Backend-Task).
Kein PlanScore-Banner ausblendenKein simulierter Score ohne Plan möglich
Chip-Preset Vegetarisch
repeatTagTypes["cuisine"]Protein entfernt
wTagRepeat1.5 (Standard)Unverändert
wIngredientOverlap0.3 (Standard)Unverändert
wRecentRepeat1.0 (Standard)Unverändert
wPlanDuplicate2.0 (Standard)Unverändert
+
+
+ + + +
+

S3 · Erweiterte Einstellungen geöffnet

E4
+
Planer öffnet das Accordion "Erweiterte Einstellungen". Er sieht Segmented Controls (Niedrig / Mittel / Hoch) für jeden Gewichts-Parameter. Ändert er einen Wert, der nicht mehr dem aktuellen Preset entspricht, erscheint automatisch ein vierter Chip "Individuell" (lila) und ersetzt den aktiven Preset-Chip. Score-Banner aktualisiert sich nach jeder Änderung.
+
S3 · Erweiterte Einstellungen offen · "Individuell"-Chip erschienen (Planer hat Zutaten-Gewicht angepasst)
+ +
+
+
Mobile · 320px
+
+
9:41●●●
+
+
← Einstellungen
Vielfalt
+
+
Haushaltskontext
+
+
🥩
Omnivor
+
🥦
Vegetarisch
+
🌱
Vegan
+
Individuell
+
+ +
+
– Protein
+
✓ Küche
+
✓ Zutaten · Hoch
+
✓ Letzte Wochen · Mittel
+
⚠ Duplikate · Hoch
+
+ +
+
Erweiterte Einstellungen
+
+
Protein ist über den Kontext deaktiviert. Die übrigen Gewichte kannst du hier anpassen.
+
+
Küche
Tag-Wiederholung
+
Niedrig
Mittel
Hoch
+
+
+
Zutaten
Überschneidung
+
Niedrig
Mittel
Hoch
+
+
+
Letzte Wochen
Kochverlauf
+
Niedrig
Mittel
Hoch
+
+
+
Duplikate
Im Plan
+
Niedrig
Mittel
Hoch
+
+
+
+ +
+
+
Mit diesen Einstellungen
+
8.1
+
↑ +0.7 gegenüber vorher
+
+
📈
+
+ +
+
+
📅
Plan
+
🛒
Einkauf
+
🍳
Rezepte
+
⚙️
Einstellungen
+
+
+
+
+ +
+
Desktop · 1040px
+
+
+ +
+
Planung
+
📅 Wochenplan
+
🛒 Einkaufsliste
+
🍳 Rezepte
+
Haushalt
+
⚙️ Einstellungen
+
+
+
+
Einstellungen Vielfalt-Einstellungen
Vielfalt-Einstellungen
+
+
+
+
Haushaltskontext
+
+
🥩
Omnivor
Alle Regeln
+
🥦
Vegetarisch
Protein aus
+
🌱
Vegan
Protein aus
+
Individuell
Benutzerdefiniert
+
+
+
Erweiterte Einstellungen
+
+
Protein ist über den Haushaltskontext deaktiviert. Passe die Stärke der übrigen Regeln an.
+
+
Küchen-Wiederholung
Gleiche Küche an aufeinanderfolgenden Tagen
+
Niedrig
Mittel
Hoch
+
+
+
Zutaten-Überschneidung
Gleiche Zutaten an aufeinanderfolgenden Tagen
+
Niedrig
Mittel
Hoch
+
+
+
Letzte Wochen
Kochverlauf (14 Tage)
+
Niedrig
Mittel
Hoch
+
+
+
Doppelte Rezepte
Gleiches Rezept mehrfach im Plan
+
Niedrig
Mittel
Hoch
+
+
+
+ +
+
+
+
+
Mit diesen Einstellungen
+
8.1 / 10
+
↑ +0.7 gegenüber vorher
+
+
📈
+
+
Aktive Regeln
+
+
ProteinDeaktiviert
+
KücheMittel
+
ZutatenHoch ↑
+
Letzte WochenMittel
+
DuplikateHoch
+
+
+
+
+
+
+
+
+ +
+

E4 · S3 Erweiterte Einstellungen

+
/* Accordion öffnet sich per Click/Tap auf acc-hd. Keine Animation nötig — display toggle reicht.
+ * Erweiterte Einstellungen zeigt NUR aktive Tag-Typen als Gewichts-Rows.
+ * Wenn Protein deaktiviert (über Preset): Protein-Row wird in acc-b NICHT angezeigt.
+ * "Individuell"-Chip: erscheint automatisch wenn die Kombination repeatTagTypes+weights
+ *   nicht exakt einem der drei Presets entspricht. Kein manueller Auslöser.
+ * Gewichts-Änderung → PATCH → Score-Simulation → Banner-Update.
+ * Debounce der Simulation: 300ms nach letzter Interaktion. */
+ + + + + + + + + + + + +
ElementWertNotizen
Gewicht-Mapping
NiedrigFaktor 0.5 × Standard-GewichtwTagRepeat: 0.75, wIngredient: 0.15, wRecent: 0.5, wDuplicate: 1.0
MittelFaktor 1.0 (Standard)wTagRepeat: 1.5, wIngredient: 0.3, wRecent: 1.0, wDuplicate: 2.0
HochFaktor 1.5 × Standard-GewichtwTagRepeat: 2.25, wIngredient: 0.45, wRecent: 1.5, wDuplicate: 3.0
Individuell-Chip
TriggerWenn gespeicherter Config ≠ Omnivor, Vegetarisch, oder Vegan PresetLila Border + Hintergrund
Symbol✦ (U+2726)Statt Emoji
LabelIndividuellNicht anklickbar — nur Status-Indikator
Simulation-Debounce
Delay300msNach letzter Segmented-Control-Interaktion
Während LadenScore-Wert zeigt Spinner (CSS animation)Kein Skeleton — nur val-Bereich
+
+
+ + + +
+

S4 · Reset-Bestätigung

E4
+
Planer tippt "Auf Standard zurücksetzen". Ein Dialog erscheint und benennt explizit, was zurückgesetzt wird. Bestätigung löscht den Custom-Config-Eintrag (DELETE) und stellt die Omnivor-Defaults wieder her. Kein Backdrop-Dismiss — der Planer muss explizit wählen.
+
S4 · Modal über S2-Zustand · Backdrop nicht anklickbar · Mobile: Bottom Sheet
+ +
+
+
Mobile · 320px (Bottom Sheet)
+
+
9:41●●●
+
+ +
← Einstellungen
Vielfalt
+
+
+
🥦
Vegetarisch
+
+
+ +
+
+
Auf Standard zurücksetzen?
+
Alle individuellen Einstellungen werden gelöscht. Der Algorithmus verwendet dann wieder:

• Protein: Aktiv
• Küche: Aktiv
• Alle Gewichte: Mittel
+
Zurücksetzen
+
Abbrechen
+
+
+
📅
Plan
+
🛒
Einkauf
+
🍳
Rezepte
+
⚙️
Einstellungen
+
+
+
+
+ +
+
Desktop · 1040px (Centered Modal)
+
+
+ +
+
+
Vielfalt-Einstellungen
+
🥦
Vegetarisch
+
+ +
+
+
+ +
+

E4 · S4 Reset-Bestätigung

+
/* Reset-Link Tap → Dialog öffnet (kein Backdrop-Dismiss, kein Escape-Dismiss).
+ * "Zurücksetzen" → DELETE /v1/households/mine/variety-config
+ * On success: optimistic reset von UI zu S1 (Omnivor), Score-Banner zeigt echten Score.
+ * On error: Toast "Fehler beim Zurücksetzen".
+ * Mobile: Bottom Sheet (position:fixed, bottom 0, border-radius 20px 20px 0 0).
+ * Desktop: centered modal, backdrop rgba(28,28,24,0.4), max-width 380px. */
+ + + + + + + + + +
ElementWertNotizen
Dialog-Inhalt
Titel"Auf Standard zurücksetzen?"Fraunces 18px (Mobile), 20px (Desktop)
BodyAuflistung der zurückgesetzten WerteMuss konkret benennen: Protein aktiv, Küche aktiv, alle Gewichte Mittel
Primär-Aktion"Zurücksetzen" → DELETEHintergrund: --red, Text: weiß
Sekundär-Aktion"Abbrechen"Ghost-Button, schließt Dialog
API
EndpointDELETE /v1/households/mine/variety-configLöscht Custom-Config-Row; Backend fällt auf Defaults zurück
On SuccessUI reset zu S1Omnivor chip selected, Score-Banner: echter Score
+
+
+
+ + + +
+

Maschinenlesbare Spezifikation — E4 Vielfalt-Einstellungen

+ +

Screens

+ + + + + + +
ScreenRouteZugriffZweck
E1 (Update)/settingsPlanerSettings-Hub: dritte Kachel "Vielfalt-Einstellungen" mit aktuellem Score
E4/settings/varietyPlaner onlyVielfalt-Algorithmus per Kontext-Preset und Feineinstellungen konfigurieren
+ +

States

+ + + + + + + + + +
StateTriggerBeschreibung
S0E1 loadSettings-Hub zeigt Score-Kachel (lila Kennzahl)
S1E4 load, kein Custom-ConfigOmnivor chip selected, Score = aktueller echter Score, Reset-Link = deaktiviert/neutral
S2Preset-Chip tapChip wechselt, PATCH, Score-Simulation lädt und zeigt Delta
S3Accordion öffnen + Gewicht ändernIndividuell-Chip erscheint, Score-Simulation mit Debounce 300ms
S4Reset-Link tapModal/Bottom Sheet — Bestätigung vor DELETE
+ +

API-Endpoints (neu + bestehend)

+ + + + + + + + + +
MethodEndpointNeu?Zweck
GET/v1/households/mine/variety-configNeuAktuellen Config laden; 404 = Defaults verwenden
PATCH/v1/households/mine/variety-configNeuConfig speichern (auto-save bei jedem Preset/Gewicht-Wechsel)
DELETE/v1/households/mine/variety-configNeuCustom-Config löschen, Backend fällt auf Defaults zurück
POST/v1/week-plans/{id}/variety-score/simulateNeuScore simulieren mit temporärem Config-Body (nicht persistiert)
GET/v1/week-plans/{id}/variety-scoreBestehendAktuellen Score laden (für S1 Banner + E1 Kachel)
+ +

Kontext-Preset Mapping

+ + + + + + + + +
PresetrepeatTagTypeswTagRepeatwIngredientOverlapwRecentRepeatwPlanDuplicate
Omnivor (Default)["protein","cuisine"]1.50.31.02.0
Vegetarisch["cuisine"]1.50.31.02.0
Vegan["cuisine"]1.50.31.02.0
IndividuellBeliebig (≠ obige Presets)BeliebigBeliebigBeliebigBeliebig
+ +

Gewicht-Preset Mapping

+ + + + + + + +
StufeFaktorwTagRepeatwIngredientOverlapwRecentRepeatwPlanDuplicate
Niedrig×0.50.750.150.51.0
Mittel×1.01.50.31.02.0
Hoch×1.52.250.451.53.0
+ +

Implementierungsregeln (für Agenten)

+ +
+ +
+ +