/* ═══════════════════════════════════════════════════════════
   style.css — KüchenApp
   ═══════════════════════════════════════════════════════════ */

:root {
  --gruen-dunkel  : #1a2e1a;
  --gruen-mittel  : #2d4a2d;
  --gruen-hell    : #4a7c4a;
  --gruen-accent  : #6db86d;
  /*
    Gruen als SCHRIFTFARBE. Bewusst getrennt von --gruen-dunkel, obwohl es
    hier derselbe Ton ist: --gruen-dunkel dient auch als Hintergrund
    (Kopfbereich, Knoepfe). Im Dunkelmodus muss die Schrift hell werden,
    die Flaechen aber dunkel bleiben. Mit einer Variablen fuer beides ginge
    das nicht, und einzelne body.dark-Regeln waeren 50 Stueck gewesen.
  */
  --gruen-schrift : #1a2e1a;
  /*
    Gegenstueck: Schrift auf gruenen Flaechen (Knoepfe, Kopfbereich,
    Bon-Scanner). Sie muss in BEIDEN Modi hell bleiben, weil die Flaeche
    darunter immer gruen ist.

    Vorher stand dort var(--creme). Das kippt im Dunkelmodus auf #1a1a1a,
    und damit war zum Beispiel der Schriftzug "Pott&Pann" im Kopfbereich
    unsichtbar: dunkles Gruen auf dunklem Gruen.
  */
  --auf-gruen     : #f5f0e8;
  /*
    Rot als SCHRIFTFARBE. Dieselbe Trennung wie bei --gruen-schrift:
    --rot-warn dient auch als Flaeche und als Rahmen, und auf dunklem
    Grund kommt es als Schrift nur auf 2.64 statt der geforderten 4.5.
  */
  --rot-schrift   : #c0392b;
  --creme         : #f5f0e8;
  --creme-dunkel  : #ede5d5;
  --weiss         : #ffffff;
  --text-dunkel   : #1a2e1a;
  --text-mittel   : #4a5c4a;
  --text-hell     : #8a9e8a;
  --rot-warn      : #c0392b;
  --orange-warn   : #e67e22;
  --schatten      : rgba(26, 46, 26, 0.12);
  --font-titel    : 'Playfair Display', Georgia, serif;
  --font-text     : 'DM Sans', sans-serif;
  --radius        : 16px;
  --radius-klein  : 8px;
  --padding       : 20px;
  /*
    Wie viel oben freibleiben muss, damit nichts unter der Statusleiste des
    Geraets liegt.

    In der App misst MainActivity.java den Wert und setzt --android-top.
    Im Browser und auf iOS gibt es diese Variable nicht, dort greift env()
    als Rueckfall, und fehlt beides, bleiben es 0 Pixel.

    Jeder Bereich, der am oberen Bildschirmrand klebt, muss das
    einrechnen: der Kopfbereich, der Bon-Scanner, der Haushalts-Drawer.
    Seit targetSdk 36 (2026-09-28) zeichnet die App wirklich randlos, ohne
    das Polster liegt die Uhrzeit mitten im Inhalt.
  */
  --oben-frei     : var(--android-top, env(safe-area-inset-top, 0px));
  /*
    Dasselbe fuer unten, also fuer Androids Navigationsleiste. Gilt fuer
    alles, was am unteren Bildschirmrand klebt: die Hauptnavigation, der
    Haushalts-Drawer, Vollbild-Bereiche.

    --android-nav kommt ebenfalls aus MainActivity.java, --viewport-versatz
    gleicht aus, dass die Seite ihre Hoehe anders rechnet als die WebView
    tatsaechlich misst.
  */
  --unten-frei    : calc(var(--android-nav, env(safe-area-inset-bottom, 0px))
                         + var(--viewport-versatz, 0px));

  /*
    Hoehe der Bildschirmtastatur. Setzt app.js, siehe _tastaturAnwenden().
    0px solange nichts getippt wird.

    ⚠️ Bewusst NICHT in --unten-frei eingerechnet. Daran haengt auch die
    untere Hauptnavigation, und die soll bei offener Tastatur liegen
    bleiben statt nach oben zu springen. Gebraucht wird der Wert nur
    dort, wo etwas sonst UNTER der Tastatur verschwindet: in den Modalen.
  */
  --tastatur-hoehe: 0px;

  /*
    Was einem Modal unten weggenommen werden muss.

    Nicht Leiste UND Tastatur addieren: die Tastatur liegt ueber der
    Systemleiste, nicht darunter. Addiert waere das Modal unnoetig flach.

    Zwei Zeilen als Rueckfall. Kann der Browser kein max() — sehr alte
    WebView —, verwirft er die zweite und nimmt die erste. Dann ist das
    Modal bei offener Tastatur ein paar Pixel zu hoch, statt dass die
    ganze Regel ungueltig wird und es GAR keine Begrenzung mehr gibt.
  */
  --unten-modal   : var(--unten-frei);
  --unten-modal   : max(var(--unten-frei), var(--tastatur-hoehe));
}

*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
/*
  Sicherheitsnetz gegen waagerechtes Verschieben.

  Ein einziges zu breites Element macht die ganze Seite seitlich wischbar —
  in einer App fuehlt sich das kaputt an. "clip" statt "hidden", weil hidden
  einen Scroll-Container erzeugt und damit position: sticky im Header
  brechen kann.

  Das ersetzt keine Ursachensuche: zu breite Elemente gehoeren trotzdem
  gefixt (siehe .btn-haushalt). Es verhindert nur, dass ein uebersehener
  Fall gleich die Bedienung ruiniert.
*/
html { scroll-behavior: smooth; overflow-x: clip; }
body { overflow-x: clip; }

/*
  GUMMIBAND-EFFEKT ABSCHALTEN

  Zieht man am Seitenende weiter, dehnt Android die Seite wie Gummi: der
  Kopfbereich wird groesser, die untere Navigation gestaucht. In einem
  Browser gehoert das so, in einer App fuehlt es sich wackelig an, weil
  Kopf und Navigation eigentlich feststehen sollen.

  "none" statt "contain": contain haelt die Dehnung nur innerhalb des
  Bereichs, verhindert sie aber nicht. Unterbindet zugleich das
  Nachladen-durch-Ziehen, das wir nirgends nutzen.

  Reicht allein nicht: die WebView zeichnet den Effekt teilweise selbst,
  unabhaengig vom CSS. Deshalb setzt MainActivity.java zusaetzlich
  OVER_SCROLL_NEVER.
*/
html, body { overscroll-behavior: none; }

/*
  KNOEPFE ERBEN DIE SCHRIFTFARBE

  <button> erbt color NICHT, der Browser setzt System-Schwarz. Im hellen
  Modus faellt das nie auf, im Dunkelmodus stand dadurch schwarze Schrift
  auf dunklen Flaechen: die Kacheln "Favoriten", "Community" und "Meine
  Rezepte" hatten einen Kontrast von 1.46 statt der geforderten 4.5.

  Betraf 23 Knopf-Klassen. Einzeln nachzuziehen haette beim naechsten
  neuen Knopf wieder gefehlt, deshalb hier einmal zentral. Knoepfe mit
  eigener Farbe (btn-primary und Konsorten) sind davon unberuehrt, ihre
  Regel ist spezifischer.
*/
button { color: inherit; }

/* Auch in den Bereichen, die selbst scrollen: sonst dehnt sich dort der
   Inhalt und schiebt am Ende die ganze Seite mit. */
.modal-body, .oma-modal-body, .sc-liste, .rechtlich-inhalt,
.haushalt-drawer, .main { overscroll-behavior: contain; }
body { font-family: var(--font-text); background-color: var(--creme); color: var(--text-dunkel); min-height: 100vh; line-height: 1.6; }

/* HEADER */
/* Polster oben: siehe --oben-frei im :root-Block. Die gruene Flaeche reicht
   dabei bis ganz nach oben, damit die Statusleiste auf Gruen sitzt. */
.header { background: var(--gruen-dunkel); position: sticky; top: 0; z-index: 100; box-shadow: 0 2px 20px var(--schatten);
          padding-top: var(--oben-frei); }
.header-inner { max-width: 800px; margin: 0 auto; padding: 14px var(--padding); display: flex; align-items: center; justify-content: space-between; gap: 16px; flex-wrap: wrap; }
.logo { display: flex; align-items: center; gap: 10px; }
/* Seit dem Rebranding das App-Logo statt eines Kochtopf-Emojis.
   Emoji sehen auf jedem Geraet anders aus, das Logo ist ueberall gleich. */
.logo-icon { width: 30px; height: 30px; border-radius: 7px; object-fit: contain;
             flex-shrink: 0; display: block; }
.logo-text { font-family: var(--font-titel); font-size: 1.4rem; color: var(--auf-gruen); font-weight: 700; letter-spacing: -0.02em; }
.nav { display: flex; gap: 8px; }
.version-footer { text-align: center; padding: 12px; font-size: 0.7rem; color: var(--text-hell); opacity: 0.6; display: flex; align-items: center; justify-content: center; gap: 6px; flex-wrap: wrap; }
.footer-link { font-size: 0.7rem; color: var(--text-hell); padding: 0; }
.footer-link:hover { color: var(--gruen-schrift); }
.footer-trenner { color: var(--text-hell); }
.modal-rechtlich { max-width: 560px; width: 95vw; max-height: calc(80vh - var(--oben-frei) - var(--unten-modal)); }
.rechtlich-inhalt { overflow-y: auto; max-height: 60vh; }
.rechtlich-inhalt h3 { font-size: 0.9rem; color: var(--gruen-schrift); margin: 16px 0 4px; }
.rechtlich-inhalt p { font-size: 0.85rem; color: var(--text-mittel); line-height: 1.5; margin: 0 0 8px; }
.rechtlich-inhalt a { color: var(--gruen-schrift); }
.faq-details { border-bottom: 1px solid var(--rahmen); }
.faq-details summary { cursor: pointer; font-weight: 600; padding: 10px 0; font-size: 0.9rem; list-style: none; display: flex; justify-content: space-between; align-items: center; }
.faq-details summary::after { content: "▶"; font-size: 0.7rem; color: var(--text-hell); transition: transform 0.2s; }
.faq-details[open] summary::after { transform: rotate(90deg); }
.faq-details[open] summary { color: var(--gruen-schrift); }
.faq-details .faq-inhalt { padding: 0 0 12px; font-size: 0.85rem; color: var(--text-mittel); line-height: 1.6; }
.faq-details .faq-inhalt p { margin: 0 0 6px; }
.faq-neu-starten { width: 100%; margin-top: 16px; }
.btn-translate { background: transparent; border: 2px solid rgba(245,240,232,0.3); color: rgba(245,240,232,0.85); padding: 6px 14px; border-radius: 50px; cursor: pointer; font-size: 0.8rem; font-weight: 500; transition: all 0.2s ease; }
.btn-translate:hover { background: var(--gruen-accent); border-color: var(--gruen-accent); color: var(--auf-gruen); }
.nav-btn { background: transparent; border: 2px solid rgba(245, 240, 232, 0.3); color: rgba(245, 240, 232, 0.7); padding: 8px 16px; border-radius: 50px; cursor: pointer; font-family: var(--font-text); font-size: 0.85rem; font-weight: 500; transition: all 0.2s ease; }
.nav-btn:hover, .nav-btn.active { background: var(--gruen-accent); border-color: var(--gruen-accent); color: var(--auf-gruen); }

/* MAIN */
.main { max-width: 800px; margin: 0 auto; padding: 0 var(--padding) 100px; }

/* SEITEN */
.seite { display: none; }
.seite.aktiv { display: block; animation: einblenden 0.3s ease; overflow-x: hidden; }
@keyframes einblenden { from { opacity: 0; transform: translateY(12px); } to { opacity: 1; transform: translateY(0); } }

/* HERO */
.hero { padding: 36px 28px 28px; background: linear-gradient(135deg, var(--gruen-dunkel) 0%, #2d5a3d 60%, #4a8c5c 100%); border-radius: var(--radius); border-bottom: none; margin-bottom: 24px; box-shadow: 0 4px 20px rgba(26,46,26,0.28); }
.hero-titel { font-family: var(--font-titel); font-size: clamp(2rem, 6vw, 3rem); color: #fff; line-height: 1.2; letter-spacing: -0.03em; }
.hero-titel em { font-style: italic; color: #a8d5a8; }
.hero-sub { margin-top: 8px; color: rgba(255,255,255,0.78); font-size: 1rem; font-weight: 300; }

/* AKTIONS-LEISTE */
.aktions-leiste { display: flex; align-items: center; gap: 12px; margin-bottom: 24px; flex-wrap: nowrap; overflow-x: auto; scrollbar-width: none; }
.aktions-leiste::-webkit-scrollbar { display: none; }
.filter-gruppe { display: flex; gap: 6px; flex-wrap: wrap; }
.kuechen-auswahl { display: flex; align-items: center; gap: 10px; margin-bottom: 14px; }
.kueche-dropdown { font-size: 0.85rem; padding: 8px 12px; border-radius: var(--radius-klein); border: 2px solid var(--creme-dunkel); background: var(--weiss); color: var(--text-dunkel); cursor: pointer; font-family: var(--font-text); min-width: 180px; }
.kueche-dropdown:focus { outline: none; border-color: var(--gruen-hell); }
.wp-kueche-select { font-size: 0.72rem; padding: 3px 6px; border-radius: var(--radius-klein); border: 1px solid var(--creme-dunkel); background: var(--weiss); color: var(--text-dunkel); cursor: pointer; max-width: 120px; font-family: var(--font-text); }
.einplanen-name { font-weight: 600; margin-bottom: 14px; text-align: center; font-size: 1rem; color: var(--text-dunkel); }
.einplanen-tage { display: grid; grid-template-columns: repeat(2, 1fr); gap: 8px; }
.einplanen-tag-btn { font-size: 0.9rem; padding: 12px 8px; border-radius: var(--radius-klein); border: 1px solid var(--creme-dunkel); background: var(--weiss); color: var(--text-dunkel); cursor: pointer; transition: background 0.2s; font-family: var(--font-text); text-align: center; }
.einplanen-tag-btn:hover { background: var(--gruen-dunkel); color: var(--auf-gruen); border-color: var(--gruen-dunkel); }
.filter-btn { background: var(--weiss); border: 2px solid var(--creme-dunkel); color: var(--text-mittel); padding: 6px 14px; border-radius: 50px; cursor: pointer; font-family: var(--font-text); font-size: 0.8rem; font-weight: 500; transition: all 0.2s ease; }
.filter-btn:hover, .filter-btn.aktiv { background: var(--gruen-dunkel); border-color: var(--gruen-dunkel); color: var(--auf-gruen); }
.filter-btn.filter-ablauf { border-color: var(--orange-warn); color: var(--orange-warn); }
.filter-btn.filter-ablauf:hover, .filter-btn.filter-ablauf.aktiv { background: var(--orange-warn); border-color: var(--orange-warn); color: white; }

/* BUTTONS */
.btn { padding: 10px 22px; border-radius: 50px; border: none; cursor: pointer; font-family: var(--font-text); font-size: 0.9rem; font-weight: 500; transition: all 0.2s ease; white-space: nowrap; }
.btn-primary { background: var(--gruen-dunkel); color: var(--auf-gruen); box-shadow: 0 4px 14px rgba(26, 46, 26, 0.25); }
.btn-primary:hover { background: var(--gruen-mittel); transform: translateY(-1px); box-shadow: 0 6px 20px rgba(26, 46, 26, 0.35); }
.btn-secondary { background: var(--weiss); color: var(--text-mittel); border: 2px solid var(--creme-dunkel); }
.btn-secondary:hover { border-color: var(--gruen-hell); color: var(--gruen-schrift); }
.btn-scan { background: var(--gruen-accent); color: var(--auf-gruen); box-shadow: 0 4px 14px rgba(109, 184, 109, 0.35); }
.btn-scan:hover { background: var(--gruen-hell); transform: translateY(-1px); }
.btn-danger { background: transparent; color: var(--rot-schrift); border: none; padding: 4px 8px; cursor: pointer; font-size: 0.85rem; border-radius: var(--radius-klein); transition: background 0.2s; }
.btn-danger:hover { background: rgba(192, 57, 43, 0.1); }
.btn-edit { background: transparent; color: var(--text-mittel); border: none; padding: 4px 8px; cursor: pointer; font-size: 0.85rem; border-radius: var(--radius-klein); transition: background 0.2s; }
.btn-edit:hover { background: var(--creme-dunkel); color: var(--gruen-schrift); }

/* LEBENSMITTEL GRID */
.lebensmittel-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); gap: 10px; }
.lebensmittel-karte { background: var(--weiss); border-radius: var(--radius); padding: 12px; box-shadow: 0 2px 8px var(--schatten); border: 2px solid transparent; transition: all 0.2s ease; animation: karteRein 0.3s ease; position: relative; overflow: hidden; }
@keyframes karteRein { from { opacity: 0; transform: scale(0.96); } to { opacity: 1; transform: scale(1); } }
.lebensmittel-karte:hover { border-color: var(--gruen-accent); box-shadow: 0 4px 16px var(--schatten); }
.lebensmittel-karte.ausgewaehlt { border-color: var(--rot-warn); background: #fff5f5; }
.karte-auswahlbox { position: absolute; top: 8px; right: 8px; width: 20px; height: 20px; border: 2px solid var(--text-hell); border-radius: 4px; cursor: pointer; display: flex; align-items: center; justify-content: center; font-size: 0.7rem; transition: all 0.15s ease; color: transparent; background: var(--weiss); }
.lebensmittel-karte.ausgewaehlt .karte-auswahlbox { background: var(--rot-warn); border-color: var(--rot-warn); color: white; }
.karte-kategorie-badge { font-size: 0.65rem; font-weight: 500; color: var(--text-hell); text-transform: uppercase; letter-spacing: 0.08em; margin-bottom: 6px; }
.karte-name { font-family: var(--font-titel); font-size: 1rem; font-weight: 600; color: var(--text-dunkel); margin-bottom: 4px; line-height: 1.2; }
.karte-menge { font-size: 0.8rem; color: var(--gruen-schrift); font-weight: 500; }
.karte-ablauf { font-size: 0.7rem; margin-top: 6px; padding: 3px 8px; border-radius: 50px; display: inline-block; font-weight: 500; }
.karte-ablauf.gut { background: rgba(109, 184, 109, 0.15); color: var(--gruen-schrift); }
.karte-ablauf.diese-woche { background: rgba(241, 196, 15, 0.2); color: #b7860a; }
.karte-ablauf.bald { background: rgba(230, 126, 34, 0.2); color: var(--orange-warn); }
.karte-ablauf.abgelaufen { background: rgba(192, 57, 43, 0.2); color: var(--rot-schrift); }
/* Farbton immer UEBER Weiss legen: im Kuehlschrank liegt ein Foto als Hintergrund,
   ein reiner rgba-Ton (oder opacity) laesst es durchscheinen. */
.lebensmittel-karte.karte-diese-woche { border-left: 3px solid #f1c40f; background: linear-gradient(rgba(241, 196, 15, 0.06), rgba(241, 196, 15, 0.06)), var(--weiss); }
.lebensmittel-karte.karte-bald { border-left: 3px solid var(--orange-warn); background: linear-gradient(rgba(230, 126, 34, 0.07), rgba(230, 126, 34, 0.07)), var(--weiss); }
.lebensmittel-karte.karte-heute { border-left: 3px solid var(--rot-warn); background: linear-gradient(rgba(192, 57, 43, 0.08), rgba(192, 57, 43, 0.08)), var(--weiss); }
.lebensmittel-karte.karte-abgelaufen { border-left: 3px solid var(--rot-warn); background: linear-gradient(rgba(192, 57, 43, 0.1), rgba(192, 57, 43, 0.1)), var(--weiss); }
.karte-aktionen { display: flex; justify-content: flex-end; gap: 4px; margin-top: 10px; padding-top: 8px; border-top: 1px solid var(--creme-dunkel); }

/* ANSICHT-TOGGLE */
.ansicht-toggle { display: flex; gap: 3px; }
.ansicht-toggle-btn { background: var(--weiss); border: 1px solid var(--creme-dunkel); color: var(--text-mittel); padding: 5px 11px; border-radius: var(--radius-klein); cursor: pointer; font-size: 1rem; line-height: 1; transition: all 0.2s; }
.ansicht-toggle-btn.aktiv { background: var(--gruen-dunkel); color: var(--auf-gruen); border-color: var(--gruen-dunkel); }

/* LISTENANSICHT */
/* Luecke fuer die Werbekachel (nur App). Leer, Android legt die echte
   Anzeige genau darauf (PottWerbungPlugin). Die Hoehe ergibt sich in der
   Kachelansicht aus der Rasterzeile, min-height nur fuer die erste Zeile. */
.lm-werbekachel { min-height: 170px; border-radius: var(--radius); background: var(--weiss); box-shadow: 0 2px 8px var(--schatten); }
.lm-werbekachel-zeile { min-height: 0; height: 58px; border-radius: 0; box-shadow: none; border-bottom: 1px solid var(--creme-dunkel); }
.lebensmittel-grid.lm-liste-modus { display: flex; flex-direction: column; gap: 0; background: var(--weiss); border-radius: var(--radius); overflow: hidden; box-shadow: 0 2px 8px var(--schatten); }
.lm-zeile { display: grid; grid-template-columns: 2rem 1fr auto auto auto auto; align-items: center; gap: 10px; padding: 10px 14px; border-bottom: 1px solid var(--creme-dunkel); transition: background 0.15s; }
.lm-zeile.ausgewaehlt { background: rgba(74,124,89,0.07); }
.lm-zeile:last-child { border-bottom: none; }
.lm-zeile:hover { background: var(--creme); }
.lm-zeile.karte-diese-woche { border-left: 3px solid #f1c40f; background: rgba(241, 196, 15, 0.04); }
.lm-zeile.karte-bald { border-left: 3px solid var(--orange-warn); background: rgba(230, 126, 34, 0.05); }
.lm-zeile.karte-heute { border-left: 3px solid var(--rot-warn); background: rgba(192, 57, 43, 0.06); }
.lm-zeile.karte-abgelaufen { border-left: 3px solid var(--rot-warn); background: rgba(192, 57, 43, 0.07); }
.lm-zeile-kat { font-size: 1.1rem; text-align: center; }
.lm-zeile-name { font-weight: 600; font-size: 0.9rem; color: var(--text-dunkel); min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.lm-zeile-menge { font-size: 0.8rem; color: var(--gruen-schrift); font-weight: 500; white-space: nowrap; }
.lm-zeile-kein-mhd { font-size: 0.8rem; color: var(--text-hell); }
.lm-zeile-preis { font-size: 0.75rem; color: var(--gruen-schrift); font-weight: 600; white-space: nowrap; background: rgba(74,124,89,0.08); padding: 2px 6px; border-radius: 8px; }
.lm-zeile-checkbox { width: 16px; height: 16px; cursor: pointer; accent-color: var(--gruen-accent); flex-shrink: 0; }
.lm-zeile-aktionen { display: flex; align-items: center; gap: 6px; }
.lm-datum-header { display: flex; align-items: center; gap: 8px; padding: 10px 4px 4px; border-bottom: 1px solid rgba(74,124,89,0.2); margin-bottom: 2px; margin-top: 8px; }
.lm-datum-header:first-child { margin-top: 0; }
.lm-datum-label { font-size: 0.8rem; font-weight: 700; color: var(--gruen-schrift); text-transform: uppercase; letter-spacing: 0.05em; }
.lm-datum-anzahl { font-size: 0.75rem; color: var(--text-hell); background: rgba(74,124,89,0.1); padding: 1px 7px; border-radius: 10px; }
.lm-datum-header-grid { grid-column: 1 / -1; }

/* EINKAUFSLISTE */
.einkauf-liste { display: flex; flex-direction: column; gap: 10px; }

/* Swipe-Wrapper */
.einkauf-item-swipe-wrap { position: relative; overflow: hidden; border-radius: var(--radius); margin-bottom: 8px; }
.einkauf-item-swipe-bg {
  position: absolute; inset: 0;
  display: flex; align-items: center;
  font-size: 1.8rem; padding: 0 22px;
  border-radius: var(--radius);
  opacity: 0; pointer-events: none;
  transition: opacity 0.1s;
}
.einkauf-swipe-bg-links  { background: #2e7d32; color: #fff; justify-content: flex-end; }
.einkauf-swipe-bg-rechts { background: #c0392b; color: #fff; justify-content: flex-start; }

/* Eine Zeile je Artikel statt einer Karte. Vorher fuellten vier Artikel
   den ganzen Bildschirm; im Laden braucht man den Ueberblick, nicht die
   Optik. Polster von 14/18 auf 9/14, kein Schatten mehr, nur eine feine
   Trennlinie. */
.einkauf-item { background: var(--weiss); border-radius: var(--radius-klein); padding: 9px 14px; display: flex; align-items: center; gap: 10px; transition: transform 0.2s ease; border: 2px solid transparent; touch-action: pan-y; will-change: transform; }
.einkauf-item.gekauft { opacity: 0.5; background: var(--creme-dunkel); }
.einkauf-item.ausgewaehlt { border-color: var(--rot-warn); background: #fff5f5; }
/* Standardmaessig weg. Erscheint erst im Auswahlmodus, siehe
   toggleEinkaufAuswahlModus(). Vorher stand es permanent neben dem
   gruenen Abhak-Kreis und sah aus wie ein zweites Kaestchen fuer
   dasselbe. */
.einkauf-auswahlbox { display: none; width: 22px; height: 22px; border: 2px solid var(--text-hell); border-radius: 4px; cursor: pointer; align-items: center; justify-content: center; flex-shrink: 0; font-size: 0.75rem; transition: all 0.15s ease; color: transparent; }
body.einkauf-auswahl-modus .einkauf-auswahlbox { display: flex; }
.einkauf-item.ausgewaehlt .einkauf-auswahlbox { background: var(--rot-warn); border-color: var(--rot-warn); color: white; }
/* Feste Flaeche statt transparent: ueber dem Kuechenfoto (Kuehlschrank,
   Einkauf) war "Loeschen" sonst kaum lesbar (Emanuel 2026-10-21). */
.btn-danger-outline { background: var(--weiss); border: 2px solid var(--rot-warn); color: var(--rot-schrift); border-radius: var(--radius); padding: 8px 18px; font-size: 0.9rem; font-weight: 500; cursor: pointer; transition: all 0.2s ease; }
.btn-danger-outline:hover { background: var(--rot-warn); color: white; }
.einkauf-checkbox { width: 24px; height: 24px; border: 2px solid var(--gruen-accent); border-radius: 50%; cursor: pointer; display: flex; align-items: center; justify-content: center; flex-shrink: 0; transition: all 0.2s ease; font-size: 0.8rem; }
.einkauf-item.gekauft .einkauf-checkbox { background: var(--gruen-accent); border-color: var(--gruen-accent); color: white; }
.einkauf-info { flex: 1; min-width: 0; }
/* Name nimmt den Platz, Menge steht rechts daneben statt darunter. */
.einkauf-name { font-weight: 500; color: var(--text-dunkel); flex: 1; min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.einkauf-item.gekauft .einkauf-name { text-decoration: line-through; }
.einkauf-menge-text { font-size: 0.8rem; color: var(--text-hell); flex-shrink: 0; white-space: nowrap; }
/* Nur noch ein Symbol. Der Rezeptname stand hier ohnehin abgeschnitten
   ("Spaetzle mit Bl…") und half so niemandem. Voller Name im title,
   antippen oeffnet weiterhin das Rezept. */
.einkauf-rezept-badge { flex-shrink: 0; font-size: 0.85rem; background: none; border: none; padding: 2px 4px; cursor: pointer; line-height: 1; opacity: 0.75; }
.einkauf-rezept-badge:hover { opacity: 1; }
.einkauf-item.gekauft .einkauf-rezept-badge { opacity: 0.5; }
.einkauf-kat-header { font-size: 0.72rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.05em; color: var(--text-hell); background: var(--creme); padding: 3px 10px; margin-top: 10px; border-radius: var(--radius-klein); }
.einkauf-kat-header:first-child { margin-top: 0; }
.einkauf-kat-header.einkauf-kat-gekauft { color: var(--gruen-schrift); background: rgba(74, 124, 89, 0.08); }

/* LEER-ZUSTAND */
.leer-zustand { text-align: center; padding: 60px 20px; color: var(--text-hell); }
.leer-icon { font-size: 4rem; margin-bottom: 16px; opacity: 0.6; }
.leer-zustand p { font-size: 1.1rem; font-weight: 500; color: var(--text-mittel); }
.leer-zustand small { font-size: 0.9rem; color: var(--text-hell); }

/* MODAL */
.modal-overlay { position: fixed; inset: 0; background: rgba(26, 46, 26, 0.6); backdrop-filter: blur(4px); z-index: 3500; display: flex; align-items: center; justify-content: center; padding: 20px; animation: overlayRein 0.2s ease; }
/*
  Die Tastatur unten freihalten. Das Modal wird per align-items: center
  mittig gesetzt — ohne dieses Polster bleibt die Mitte die des ganzen
  Bildschirms und die untere Haelfte des Modals steckt hinter der
  Tastatur. Mit dem Polster ist die Mitte die des SICHTBAREN Rests.

  Zusammen mit --unten-modal an der Modal-Hoehe: das eine schiebt, das
  andere verkleinert. Beides noetig, sonst ragt ein hohes Modal wieder
  oben und unten heraus.
*/
.modal-overlay { padding-bottom: calc(20px + var(--tastatur-hoehe)); }
/*
  Das Einplan-Modal geht AUS dem Rezept-Modal heraus auf, steht im HTML
  aber davor (Zeile 1376 gegen 1395). Bei gleichem z-index gewinnt das
  spaetere Element, deshalb lag es dahinter und war nicht zu bedienen.

  Alle anderen verschachtelten Modale (Gekocht, Kassenbuch-Loeschen,
  Tag-Zutaten) stehen zufaellig nach ihrem Aufrufer und liegen richtig.
  Nur dieses eine braucht den Vorrang.

  3600 statt einer groesseren Zahl: der Tag-Waehler aus Omas Modal steht
  auf 4000 und soll weiterhin darueber liegen koennen.
*/
#modal-einplanen { z-index: 3600; }

/*
  Die drei Rechtstexte muessen UEBER dem Anmeldebildschirm liegen.

  Sie sind seit 2026-10-02 auch von dort aus erreichbar (Impressumspflicht,
  und wer ein Konto anlegt muss vorher lesen koennen was mit seinen Daten
  passiert). .login-overlay steht aber auf z-index 9999, ein normales
  Modal nur auf 3500 — das Modal ging also brav auf, lag aber dahinter.
  Von aussen sah es aus, als liesse sich der Knopf nicht druecken.

  10001 statt eines Werts dazwischen: der Toast sitzt auf 10000, und
  zwischen 9999 und 10000 ist kein Platz. Dass ein Toast waehrend des
  Lesens verdeckt wird, ist das kleinere Uebel.

  ⚠️ Gleiche Falle wie bei #modal-einplanen oben. Wer ein Modal aus einer
  Ebene heraus oeffnet, die selbst hoch liegt, muss den z-index pruefen.
*/
#modal-impressum,
#modal-datenschutz,
#modal-agb { z-index: 10001; }

/*
  Dieselbe Falle, deshalb gleich mitbehandelt: beide Dialoge koennen
  erscheinen, waehrend der Anmeldebildschirm vorne liegt.

  Der Update-Hinweis kommt direkt beim Start, da ist man noch nicht
  angemeldet. Und die iPhone-Anleitung haengt am Installieren-Knopf, den
  es auch im Tutorial gibt.

  10002 fuer den Update-Hinweis: ein Pflicht-Update laesst sich nicht
  wegklicken, es darf also unter keinen Umstaenden hinter etwas anderem
  liegen. Sonst sieht der Nutzer eine Seite, die auf nichts mehr reagiert.
*/
#modal-ios-installieren { z-index: 10001; }
#modal-update           { z-index: 10002; }

@keyframes overlayRein { from { opacity: 0; } to { opacity: 1; } }
.modal { background: var(--weiss); border-radius: var(--radius); width: 100%; max-width: 500px; max-height: calc(90vh - var(--oben-frei) - var(--unten-modal)); display: flex; flex-direction: column; box-shadow: 0 8px 40px rgba(0,0,0,0.2); animation: modalRein 0.3s cubic-bezier(0.34, 1.56, 0.64, 1); }
@keyframes modalRein { from { transform: translateY(20px); opacity: 0; } to { transform: translateY(0); opacity: 1; } }
.modal-body { overflow-y: auto; flex: 1; }
.modal-header { display: flex; justify-content: space-between; align-items: center; padding: 20px 24px 0; }
.modal-titel { font-family: var(--font-titel); font-size: 1.3rem; color: var(--text-dunkel); }
.modal-schliessen { background: var(--creme); border: none; width: 32px; height: 32px; border-radius: 50%; cursor: pointer; font-size: 0.85rem; color: var(--text-mittel); transition: background 0.2s; }
.modal-schliessen:hover { background: var(--creme-dunkel); }
.modal-body { padding: 20px 24px; display: flex; flex-direction: column; gap: 14px; }
/*
  Schatten an der Kante, solange noch Inhalt in der Richtung liegt.

  Bei offener Tastatur bleiben dem Modal auf einem 760-Pixel-Bildschirm
  nur rund 450 Pixel. Es MUSS dann etwas abgeschnitten werden, und der
  Schnitt geht mitten durch eine Zeile — das sah nach kaputt aus statt
  nach "da kommt noch was". Der Schatten macht aus dem Abbruch einen
  sichtbaren Hinweis zum Weiterscrollen.

  Wie es funktioniert: vier Lagen. Die beiden Verlaeufe in --weiss sind
  per "local" am Inhalt festgemacht und scrollen mit, die beiden
  Schattenbogen stehen per "scroll" fest. Oben am Anfang und unten am
  Ende schiebt sich die mitscrollende Lage ueber den Schatten und deckt
  ihn zu. Dadurch erscheint er genau dann, wenn es dort weitergeht —
  ganz ohne JavaScript.

  --weiss ist in beiden Modi die Modalflaeche (#ffffff hell, #2a2a2a
  dunkel), der Verlauf passt sich also mit an.
*/
.modal-body {
  background:
    linear-gradient(var(--weiss) 30%, rgba(255, 255, 255, 0)) top    / 100% 28px no-repeat,
    linear-gradient(rgba(255, 255, 255, 0), var(--weiss) 70%) bottom / 100% 28px no-repeat,
    radial-gradient(farthest-side at 50% 0,    rgba(0, 0, 0, 0.13), rgba(0, 0, 0, 0)) top    / 100% 11px no-repeat,
    radial-gradient(farthest-side at 50% 100%, rgba(0, 0, 0, 0.13), rgba(0, 0, 0, 0)) bottom / 100% 11px no-repeat;
  background-attachment: local, local, scroll, scroll;
}
.modal-footer { padding: 0 24px 20px; display: flex; justify-content: flex-end; gap: 10px; flex-wrap: wrap; }

/* SCANNER */
#scan-modus-toggle { display: flex; gap: 8px; margin-bottom: 14px; }
#scan-modus-toggle.versteckt { display: none !important; }
.scan-modus-btn { flex: 1; padding: 9px; border-radius: 8px; border: 1.5px solid var(--gruen-mittel); background: white; color: var(--gruen-schrift); font-weight: 600; cursor: pointer; font-size: 0.9rem; transition: background 0.15s, color 0.15s; }
.scan-modus-btn.aktiv { background: var(--gruen-mittel); color: white; }
.scan-hinweis { text-align: center; color: var(--text-mittel); font-size: 0.9rem; margin-bottom: 12px; }
#scanner-container { width: 100%; border-radius: var(--radius-klein); overflow: hidden; }
#scanner-container video { width: 100% !important; border-radius: var(--radius-klein); }
.scan-status { display: flex; align-items: center; gap: 10px; justify-content: center; padding: 12px; background: var(--creme); border-radius: var(--radius-klein); margin-top: 12px; }
.scan-spinner { width: 20px; height: 20px; border: 3px solid var(--creme-dunkel); border-top-color: var(--gruen-accent); border-radius: 50%; animation: drehen 0.8s linear infinite; }
@keyframes drehen { to { transform: rotate(360deg); } }

/* FORMULAR */
.form-gruppe { display: flex; flex-direction: column; gap: 6px; flex: 1; }
.form-zeile { display: flex; gap: 12px; }
.form-label { font-size: 0.8rem; font-weight: 500; color: var(--text-mittel); text-transform: uppercase; letter-spacing: 0.06em; }
.form-input { padding: 10px 14px; border: 2px solid var(--creme-dunkel); border-radius: var(--radius-klein); font-family: var(--font-text); font-size: 0.95rem; color: var(--text-dunkel); background: var(--creme); transition: border-color 0.2s; width: 100%; }
.form-input:focus { outline: none; border-color: var(--gruen-accent); background: var(--weiss); }

/* ─────────────────────────────────────────────
   TOAST — oben anzeigen damit Tastatur
   ihn nicht verdeckt!
   ───────────────────────────────────────────── */
.toast {
  position   : fixed;
  top        : 80px;        /* ← oben statt unten! */
  left       : 50%;
  transform  : translateX(-50%);
  background : var(--gruen-dunkel);
  /* --auf-gruen, nicht --creme: die Flaeche bleibt im Dunkelmodus gruen,
     die Schrift muss also hell bleiben. Mit --creme stand hier dunkles
     Grau auf dunklem Gruen. */
  color      : var(--auf-gruen);
  padding    : 12px 24px;
  border-radius : 50px;
  font-size  : 0.9rem;
  font-weight: 500;
  z-index    : 10000;
  box-shadow : 0 8px 24px rgba(0,0,0,0.2);
  animation  : toastRein 0.3s cubic-bezier(0.34, 1.56, 0.64, 1);
  white-space: nowrap;
  max-width  : 90vw;
  text-align : center;
}

@keyframes toastRein {
  from { opacity: 0; transform: translateX(-50%) translateY(-20px); }
  to   { opacity: 1; transform: translateX(-50%) translateY(0);     }
}

/* REZEPTE TABS & SUCHE */
.rezepte-tab-leiste { margin-bottom: 16px; }
.rezept-tab-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; margin-bottom: 20px; }
.rezept-tab-kachel-breit { grid-column: 1 / -1; flex-direction: row; gap: 14px; padding: 14px 20px; justify-content: center; }
.re-fortschritt-container { height: 4px; background: var(--creme-dunkel); flex-shrink: 0; }
.re-fortschritt-bar { height: 100%; background: var(--gruen-hell); transition: width 0.3s ease; width: 33%; }
.re-schritt { padding: 20px 16px; display: flex; flex-direction: column; gap: 12px; }
.re-modus-toggle { display: flex; gap: 0; background: var(--creme-dunkel); border-radius: 10px; padding: 3px; }
.re-modus-btn { flex: 1; padding: 10px; border: none; background: transparent; border-radius: 8px; cursor: pointer; font-size: 0.88rem; font-weight: 500; color: var(--text-hell); transition: all 0.2s; font-family: inherit; }
.re-modus-btn.aktiv { background: var(--weiss); color: var(--gruen-schrift); box-shadow: 0 1px 5px rgba(0,0,0,0.12); }
.re-modus-hinweis { font-size: 0.78rem; color: var(--text-hell); text-align: center; }
body.dark .re-modus-toggle { background: #2a2a2a; }
body.dark .re-modus-btn.aktiv { background: #3a3a3a; color: #e8e8e8; }
body.dark .re-fortschritt-container { background: #333; }
.rezept-tab-kachel { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 6px; padding: 18px 12px; background: var(--weiss); border: 2px solid var(--creme-dunkel); border-radius: var(--radius); cursor: pointer; transition: all 0.2s ease; box-shadow: 0 2px 8px var(--schatten); font-family: inherit; }
.rezept-tab-kachel:hover { border-color: var(--gruen-accent); transform: translateY(-2px); box-shadow: 0 6px 16px var(--schatten); }
.rezept-tab-kachel.aktiv { background: var(--gruen-hell); border-color: var(--gruen-hell); color: white; box-shadow: 0 4px 14px rgba(76,175,80,0.35); }
.rezept-tab-emoji { font-size: 1.8rem; line-height: 1; }
.rezept-tab-label { font-size: 0.85rem; font-weight: 600; letter-spacing: 0.02em; }
.rezept-tab-kachel.aktiv .rezept-tab-label { color: white; }
.rezept-tab-oma { background: linear-gradient(135deg, #f5f0e8 0%, #ede8df 100%) !important; border-color: var(--gruen-accent) !important; }
.rezept-tab-oma:hover { background: linear-gradient(135deg, #ede8df 0%, #e5dfd4 100%) !important; }
.rezept-tab-oma-bild { width: 60px; height: 60px; object-fit: cover; border-radius: 50%; }
body.dark .rezept-tab-kachel { background: #2a2a2a; border-color: #3a3a3a; }
body.dark .rezept-tab-kachel.aktiv { background: var(--gruen-hell); border-color: var(--gruen-hell); }
/* Omas Kachel ist die hervorgehobene und deshalb hell. Im Dunkelmodus
   wuerde sie blenden, und die geerbte helle Schrift verschwaende darauf.
   Sie bleibt hervorgehoben, nur in dunklem Gruen statt Creme. */
body.dark .rezept-tab-oma { background: linear-gradient(135deg, #2f3d2f 0%, #263226 100%) !important; }
.rezept-tab-oma.aktiv { background: var(--gruen-hell) !important; border-color: var(--gruen-hell) !important; }

/* Omas Kuechenjournal im Rezepte-Tab (ladeJournal in app.js). Die Kachel
   zeigt das Bild des neuesten Beitrags, "Neu: ..." und einen Punkt fuer
   Ungelesenes. Die Beitraege stehen als Karten im Raster (volle Breite). */
/* Rezepte-Tab seit 2026-10-22 (Entwurf C): runde Knoepfe statt Kacheln,
   darunter "Für dich" mit Vorrats-Rezepten (zeigeFuerDich in app.js). */
.rz-leiste { display: grid; grid-template-columns: repeat(5, minmax(0, 1fr)); gap: 4px; background: var(--weiss); border-radius: var(--radius); padding: 12px 6px 10px; box-shadow: 0 2px 10px var(--schatten); margin-bottom: 14px; }
.rz-knopf { display: flex; flex-direction: column; align-items: center; gap: 6px; background: none; border: 0; padding: 0; font-family: inherit; cursor: pointer; color: var(--text-dunkel); min-height: 44px; }
.rz-kreis { position: relative; width: 52px; height: 52px; border-radius: 50%; display: flex; align-items: center; justify-content: center; background: var(--creme); border: 1.5px solid var(--creme-dunkel); color: var(--text-dunkel); transition: transform 0.15s ease, box-shadow 0.15s ease; }
.rz-kreis-dunkel { background: var(--gruen-dunkel); border-color: var(--gruen-dunkel); color: var(--auf-gruen); }
.rz-kreis-herz { color: #b5452f; }
.rz-kreis-welt { color: var(--gruen-schrift); }
.rz-kreis-journal { border: 2px solid #c9a24a; padding: 0; }
.rz-kreis-journal img { width: 100%; height: 100%; object-fit: cover; border-radius: 50%; }
.rz-kreis-journal .journal-kachel-punkt { top: -2px; right: -2px; }
.rz-knopf-text { font-size: 0.74rem; font-weight: 500; line-height: 1.1; }
/* Ausgewaehlt = dunkel gefuellt; Suchen ist sonst wie die anderen hell,
   sonst sah es immer ausgewaehlt aus */
.rz-kreis-dunkel { background: var(--creme); border-color: var(--creme-dunkel); color: var(--text-dunkel); }
.rz-knopf.aktiv .rz-kreis { background: var(--gruen-dunkel); border-color: var(--gruen-dunkel); color: var(--auf-gruen); transform: scale(1.04); }
.rz-knopf.aktiv .rz-knopf-text { font-weight: 700; color: var(--gruen-schrift); }
.rz-fuerdich { background: var(--weiss); border-radius: var(--radius); padding: 16px 14px; box-shadow: 0 2px 10px var(--schatten); margin-bottom: 16px; }
.rz-fd-ober { font-size: 0.72rem; font-weight: 700; letter-spacing: 0.06em; text-transform: uppercase; color: #8a6d3b; }
.rz-fd-titel { font-family: var(--font-titel); font-size: 1.45rem; color: var(--text-dunkel); margin: 2px 0 12px; }
.rz-fd-laedt { display: flex; align-items: center; gap: 10px; color: var(--text-mittel); font-size: 0.9rem; padding: 18px 4px; }
.rz-fd-leer { color: var(--text-mittel); font-size: 0.9rem; margin: 6px 0; }
.rz-fd-gross { border-radius: 14px; overflow: hidden; background: var(--creme); border: 1px solid var(--creme-dunkel); }
.rz-fd-gross .rz-fd-bild { display: block; width: 100%; height: 180px; object-fit: cover; }
.rz-fd-gross-inhalt { padding: 12px 14px 14px; display: flex; flex-direction: column; gap: 10px; }
.rz-fd-zeile { display: flex; justify-content: space-between; align-items: center; gap: 10px; }
.rz-fd-name { font-family: var(--font-titel); font-size: 1.15rem; margin: 0; color: var(--text-dunkel); line-height: 1.25; }
.rz-fd-chip { flex: none; font-size: 0.74rem; font-weight: 700; color: var(--gruen-schrift); background: rgba(76, 175, 80, 0.14); border-radius: 50px; padding: 4px 10px; white-space: nowrap; }
.rz-fd-chip-leer { color: var(--text-mittel); background: var(--creme-dunkel); }
.rezept-karte-inhalt .rz-fd-chip { display: inline-block; align-self: flex-start; margin: 2px 0 10px; }
.rz-kreis-buch { color: #8a5a2b; }
.rezept-quelle { display: inline-block; margin-left: 8px; font-size: 0.68rem; font-weight: 700; letter-spacing: 0.02em; text-transform: none; padding: 2px 8px; border-radius: 50px; vertical-align: 1px; background: var(--creme-dunkel); color: var(--text-mittel); }
.rezept-quelle-meins { background: #f3e6d4; color: #7a4d1e; }
.rezept-quelle-favorit { background: #f8e1dc; color: #9c3b28; }
.rezept-quelle-oma { background: #f5ecd0; color: #7a5a12; }
.rezept-quelle-community { background: #dfeadc; color: #2f5d34; }
.rz-fd-knoepfe { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 8px; }
.rz-fd-knoepfe .btn { width: 100%; min-height: 44px; }
.rz-fd-raster { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px; margin-top: 12px; }
.rz-fd-klein { display: flex; flex-direction: column; align-items: flex-start; gap: 6px; background: none; border: 0; padding: 0; text-align: left; font-family: inherit; cursor: pointer; color: var(--text-dunkel); min-width: 0; }
.rz-fd-klein .rz-fd-bild { display: block; width: 100%; height: 100px; object-fit: cover; border-radius: 12px; }
.rz-fd-klein .rz-fd-chip { font-size: 0.7rem; padding: 3px 8px; }
.rz-fd-klein-name { font-size: 0.9rem; font-weight: 600; line-height: 1.25; overflow: hidden; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; }
.rz-fd-bild-leer { display: flex; align-items: center; justify-content: center; background: var(--creme-dunkel); font-size: 2rem; }
.rz-fd-gross .rz-fd-bild-leer { height: 180px; }
.rz-fd-klein .rz-fd-bild-leer { height: 100px; width: 100%; border-radius: 12px; }

.journal-kachel-bildrahmen { position: relative; display: inline-block; }
.journal-kachel-punkt { position: absolute; top: 1px; right: 1px; width: 13px; height: 13px; border-radius: 50%; background: #e67e22; border: 2px solid var(--weiss); }
.journal-kachel-neu { font-size: 0.72rem; line-height: 1.25; color: var(--text-hell); text-align: center; max-width: 100%; overflow: hidden; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; }
.journal-kachel-neu:empty { display: none; }
.rezept-tab-kachel.aktiv .journal-kachel-neu { color: rgba(255,255,255,0.85); }
.journal-liste { grid-column: 1 / -1; display: grid; gap: 18px; max-width: 720px; width: 100%; margin: 0 auto; }
.journal-kopf { display: flex; gap: 12px; align-items: center; background: var(--weiss); border-radius: var(--radius); padding: 12px 14px; box-shadow: 0 2px 10px var(--schatten); }
.journal-kopf img { width: 52px; flex: none; }
.journal-kopf b { display: block; font-family: "Playfair Display", serif; color: var(--gruen-schrift); }
.journal-kopf span { font-size: 0.85rem; color: var(--text-hell); }
/* Deckend statt var(--weiss): im Rezepte-Tab liegt ein Foto dahinter */
.journal-kopf { background: #fffdf9; }
.journal-datum { justify-self: start; font-family: "Playfair Display", serif; font-size: 0.95rem; color: var(--text-dunkel); background: #fffdf9; padding: 3px 13px; border-radius: 999px; box-shadow: 0 1px 6px var(--schatten); margin: 4px 0 -8px; }
.journal-karte { background: #fffdf9; border-radius: var(--radius); overflow: hidden; box-shadow: 0 2px 12px var(--schatten); }
.journal-karte-bild { position: relative; display: block; width: 100%; aspect-ratio: 16 / 9; background: var(--creme-dunkel); border: 0; padding: 0; cursor: default; }
.journal-karte-bild.mit-video { cursor: pointer; }
.journal-karte-bild img { width: 100%; height: 100%; object-fit: cover; display: block; }
.journal-karte-bild .jm { position: absolute; font-size: 0.68rem; color: #fff; background: rgba(0,0,0,0.55); padding: 3px 9px; border-radius: 999px; }
.journal-karte-bild .jm-ki { left: 10px; bottom: 10px; }
.journal-karte-bild .jm-video { right: 10px; top: 10px; font-size: 0.78rem; font-weight: 700; }
.journal-karte-inhalt { padding: 14px 16px 18px; }
.journal-art { font-size: 0.7rem; font-weight: 700; letter-spacing: 0.08em; text-transform: uppercase; color: var(--gruen-accent); }
.journal-titel { font-family: "Playfair Display", serif; font-size: 1.35rem; line-height: 1.2; margin: 4px 0 10px; color: var(--text-dunkel); }
.journal-text p { margin: 0 0 9px; font-size: 0.93rem; line-height: 1.55; }
.journal-rezepte { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 6px; }
.journal-rezept { display: flex; align-items: center; gap: 8px; background: var(--creme); border: 0; border-radius: 12px; padding: 5px 12px 5px 5px; font: inherit; font-size: 0.84rem; font-weight: 600; cursor: pointer; color: inherit; text-align: left; }
.journal-rezept img { width: 38px; height: 38px; border-radius: 9px; object-fit: cover; flex: none; }
.journal-video-knopf { margin-top: 14px; }
.journal-karte.dunkel { background: #221b15; color: #f3ead9; }
.journal-karte.dunkel .journal-titel { color: #f3ead9; }
.journal-karte.dunkel .journal-art { color: #e58b3a; }
.journal-karte.dunkel .journal-rezept { background: #2c231b; }
body.dark .journal-kopf, body.dark .journal-karte, body.dark .journal-datum { background: #2a2a2a; color: #e8e8e8; }
body.dark .journal-titel { color: #e8e8e8; }
body.dark .journal-rezept { background: #333; }
.rezepte-suche-bar { display: flex; flex-wrap: wrap; gap: 10px; margin-bottom: 16px; }
.rezepte-suche-bar .form-input { flex: 1 1 100%; }
.rezepte-suche-bar .kueche-dropdown { flex: 1 1 auto; min-width: 0; }
.rezepte-suche-bar .btn { flex-shrink: 0; white-space: nowrap; }

/* REZEPTE */
.rezepte-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: 16px; }
.rezept-karte { background: var(--weiss); border-radius: var(--radius); overflow: hidden; box-shadow: 0 2px 12px var(--schatten); border: 2px solid transparent; transition: all 0.25s ease; animation: karteRein 0.3s ease; }
.rezept-karte:hover { border-color: var(--gruen-accent); transform: translateY(-3px); box-shadow: 0 8px 24px var(--schatten); }
.rezept-bild { width: 100%; height: 160px; object-fit: cover; }
.rezept-bild-platzhalter { width: 100%; height: 160px; background: var(--creme-dunkel); display: flex; align-items: center; justify-content: center; font-size: 3rem; }
.rezept-karte-inhalt { padding: 16px; display: flex; flex-direction: column; gap: 8px; }
.rezept-karte-top { display: flex; align-items: center; justify-content: space-between; }
.rezept-kategorie { font-size: 0.7rem; font-weight: 500; color: var(--text-hell); text-transform: uppercase; letter-spacing: 0.08em; }
.fav-btn { background: none; border: none; font-size: 1.25rem; cursor: pointer; padding: 0 2px; transition: transform 0.15s; line-height: 1; }
.fav-btn:hover { transform: scale(1.25); }
.rezept-name { font-family: var(--font-titel); font-size: 1.05rem; font-weight: 600; color: var(--text-dunkel); line-height: 1.3; }
.rezept-treffer { font-size: 0.8rem; color: var(--gruen-schrift); font-weight: 500; }
.rezept-btn { margin-top: 4px; font-size: 0.85rem; padding: 8px 16px; }
.rezepte-lade-status { display: flex; align-items: center; gap: 12px; padding: 20px; background: var(--creme); border-radius: var(--radius); margin-bottom: 16px; color: var(--text-mittel); font-size: 0.9rem; }

/* REZEPT MODAL */
.modal-rezept-gross { max-height: calc(88vh - var(--oben-frei) - var(--unten-modal)); }
.modal-body-scroll { overflow-y: auto; flex: 1; }
.rezept-modal-bild { width: 100%; height: 200px; object-fit: cover; border-radius: var(--radius-klein); margin-bottom: 8px; }
.rezept-abschnitt { margin-top: 12px; }
.rezept-abschnitt-titel { font-family: var(--font-titel); font-size: 1.1rem; color: var(--gruen-schrift); font-weight: 600; }
.rezept-abschnitt-titel-zeile { display: flex; align-items: center; justify-content: space-between; margin-bottom: 10px; padding-bottom: 6px; border-bottom: 2px solid var(--creme-dunkel); }
.portionen-rechner { display: flex; align-items: center; gap: 8px; }
.portionen-btn { background: var(--gruen-hell); color: white; border: none; border-radius: 50%; width: 28px; height: 28px; font-size: 1.1rem; line-height: 1; cursor: pointer; display: flex; align-items: center; justify-content: center; }
.portionen-btn:hover { background: var(--gruen-dunkel); }
.portionen-anzeige { font-size: 0.85rem; font-weight: 600; color: var(--gruen-schrift); white-space: nowrap; }
.rezept-zutaten-liste { list-style: none; display: flex; flex-direction: column; gap: 4px; }
.rezept-zutat-item { display: flex; align-items: center; gap: 10px; font-size: 0.9rem; padding: 6px 0; border-bottom: 1px solid var(--creme-dunkel); }
.rezept-zutat-menge { color: var(--gruen-schrift); font-weight: 500; min-width: 80px; flex-shrink: 0; }
.rezept-zutat-name { color: var(--text-dunkel); }
.zutat-indikator { font-size: 0.85rem; font-weight: 700; min-width: 18px; flex-shrink: 0; }
.btn-zutat-kaufen {
  margin-left: auto; flex-shrink: 0;
  width: 28px; height: 28px; border-radius: 50%;
  border: 1.5px solid var(--gruen-accent);
  background: transparent; color: var(--gruen-accent);
  font-size: 1.15rem; line-height: 1; cursor: pointer;
  display: flex; align-items: center; justify-content: center;
  transition: background 0.15s, color 0.15s;
  font-family: var(--font-text);
}
.btn-zutat-kaufen:hover { background: var(--gruen-accent); color: var(--auf-gruen); }
.btn-zutat-kaufen:active { transform: scale(0.9); }
.zutat-ok { color: #2e7d32; }
.zutat-fehlt { color: #c62828; }
/* Fehlt im Vorrat, steht aber schon auf der Einkaufsliste (2026-10-21) */
.zutat-liste { color: #3d6b3d; }
.rezept-anleitung { font-size: 0.9rem; color: var(--text-mittel); line-height: 1.7; white-space: pre-line; }
.rezept-youtube-link { display: block; margin-top: 16px; padding: 12px; background: #cc0000; color: var(--auf-gruen); text-align: center; border-radius: var(--radius-klein); text-decoration: none; font-weight: 500; font-size: 0.9rem; transition: background 0.2s; }
.rezept-youtube-link:hover { background: #aa0000; }

/* MAHLZEITEN-PLAN */
.plan-datum-input { flex: 1; min-width: 120px; }

.plan-tag-gruppe { margin-bottom: 20px; }

.plan-tag-header {
  font-size: 0.8rem; font-weight: 700; letter-spacing: 0.05em;
  text-transform: uppercase; color: var(--text-mittel);
  padding: 6px 0; border-bottom: 2px solid var(--creme-dunkel);
  margin-bottom: 8px; display: flex; align-items: center; gap: 8px;
}
.plan-tag-header.heute { color: var(--gruen-accent); border-bottom-color: var(--gruen-accent); }
.plan-tag-label-heute {
  font-size: 0.68rem; background: var(--gruen-accent); color: #fff;
  padding: 2px 8px; border-radius: 20px; font-weight: 700; text-transform: none; letter-spacing: 0;
}

.plan-eintrag {
  display: flex; align-items: center; gap: 12px;
  padding: 10px 12px; margin-bottom: 8px;
  background: var(--weiss); border-radius: var(--radius-klein);
  box-shadow: 0 1px 6px var(--schatten);
  border-left: 3px solid transparent;
  transition: box-shadow 0.2s;
}
.plan-eintrag:hover { box-shadow: 0 3px 12px var(--schatten); }
.plan-eintrag.heute { border-left-color: var(--gruen-accent); }

.plan-eintrag-bild {
  width: 60px; height: 60px; border-radius: 8px;
  object-fit: cover; flex-shrink: 0;
}
.plan-eintrag-bild-platzhalter {
  width: 60px; height: 60px; border-radius: 8px;
  background: var(--creme-dunkel); display: flex;
  align-items: center; justify-content: center;
  font-size: 1.6rem; flex-shrink: 0;
}
.plan-eintrag-info { flex: 1; min-width: 0; }
.plan-eintrag-name {
  font-weight: 600; font-size: 0.95rem; color: var(--text-dunkel);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.plan-eintrag-kategorie { font-size: 0.72rem; color: var(--text-hell); margin-top: 2px; }
.plan-eintrag-geplant { font-size: 0.72rem; color: var(--gruen-accent); margin-top: 3px; font-weight: 500; }

.plan-verlauf-eintrag { opacity: 0.75; }
.plan-verlauf-eintrag .plan-eintrag-name { color: var(--text-mittel); }
.verlauf-fav-btn { background: none; border: none; font-size: 1.2rem; cursor: pointer; padding: 4px 6px; border-radius: 50%; flex-shrink: 0; transition: transform 0.15s; }
.verlauf-fav-btn:hover { transform: scale(1.2); }

/* Leerer Tag */
.plan-leerer-tag {
  font-size: 0.8rem; color: var(--text-hell); padding: 6px 4px 4px;
  font-style: italic;
}

/* Pro-Tag Aktions-Leiste */
.plan-tag-aktionen {
  display: flex; align-items: center; gap: 6px;
  margin-top: 8px; flex-wrap: wrap;
}
.plan-kueche-select {
  flex: 1; min-width: 0; font-size: 0.72rem; padding: 5px 6px;
  border-radius: var(--radius-klein); border: 1px solid var(--creme-dunkel);
  background: var(--weiss); color: var(--text-dunkel); cursor: pointer;
  font-family: var(--font-text);
}
.btn-sm {
  font-size: 0.78rem; padding: 6px 12px; min-height: 34px;
  white-space: nowrap; flex-shrink: 0;
}

/* ═══════════════════════════════════════════════════════════ */
/* NEUES WOCHENPLAN-DESIGN                                    */
/* ═══════════════════════════════════════════════════════════ */

/* Kalenderstreifen */
/* Ueberschrift ueber dem Streifen: welche Woche man gerade sieht.
   Ohne sie standen dort nur Tageszahlen, der Monat fehlte. */
#plan-kal-woche-label {
  display: flex; align-items: baseline; gap: 8px;
  padding: 0 4px 6px;
  font-size: 0.95rem; color: var(--gruen-schrift);
  font-family: var(--font-titel);
}
#plan-kal-woche-label strong { font-weight: 600; }
.plan-kal-woche-zusatz {
  font-family: var(--font-text); font-size: 0.78rem;
  font-weight: 400; color: var(--text-hell);
}
body.dark #plan-kal-woche-label { color: var(--gruen-accent); }

#plan-kalender-streifen {
  display: flex; align-items: center; gap: 4px;
  background: var(--weiss); border-radius: var(--radius-klein);
  padding: 8px 6px; margin-bottom: 16px;
  box-shadow: 0 1px 6px var(--schatten);
}
#plan-kalender-tage { display: flex; flex: 1; gap: 2px; overflow: hidden; }
.plan-kal-pfeil {
  background: none; border: none; font-size: 1.4rem; cursor: pointer;
  color: var(--gruen-schrift); padding: 4px 6px; border-radius: var(--radius-klein);
  flex-shrink: 0; line-height: 1; transition: background 0.15s; font-family: inherit;
  /* Die Pfeile sind Textzeichen, der Kalender ein SVG. Ohne diese Zeile
     saessen sie auf unterschiedlicher Hoehe. */
  display: flex; align-items: center; justify-content: center;
}
.plan-kal-pfeil:hover { background: var(--creme-dunkel); }
.plan-kal-tag {
  flex: 1; display: flex; flex-direction: column; align-items: center; gap: 2px;
  padding: 6px 2px; background: none; border: none; border-radius: 8px;
  cursor: pointer; font-family: var(--font-text); transition: background 0.15s;
}
.plan-kal-tag:hover { background: var(--creme-dunkel); }
.plan-kal-heute { background: var(--gruen-dunkel) !important; border-radius: 8px; }
.plan-kal-tagname {
  font-size: 0.6rem; font-weight: 700; text-transform: uppercase;
  color: var(--text-mittel); letter-spacing: 0.04em;
}
.plan-kal-heute .plan-kal-tagname { color: rgba(255,255,255,0.8); }
.plan-kal-datum { font-size: 0.95rem; font-weight: 800; color: var(--text-dunkel); }
.plan-kal-heute .plan-kal-datum { color: #fff; }

/* Tageskopf (neues Design: groß + bold) */
.plan-tag-header {
  font-size: 1.25rem; font-weight: 800; letter-spacing: -0.01em;
  text-transform: none; color: var(--text-dunkel);
  padding: 4px 0 10px 0; border-bottom: none; margin-bottom: 8px;
  display: flex; align-items: center; gap: 6px;
}
.plan-tag-pfeil { color: var(--gruen-schrift); font-size: 0.85rem; flex-shrink: 0; }
.plan-tag-datum-text { flex: 1; }
.plan-tag-einkauf-btn {
  background: none; border: none; color: var(--text-hell); font-size: 1rem;
  cursor: pointer; padding: 4px 6px; border-radius: 6px; flex-shrink: 0;
  transition: background 0.15s; font-family: inherit; line-height: 1;
}
.plan-tag-einkauf-btn:hover { background: var(--creme-dunkel); }

/* Slot-Zeile: Icon links + Karte rechts */
.plan-slot-zeile {
  display: flex; align-items: flex-start; gap: 10px; margin-bottom: 8px;
}
.plan-slot-icon {
  width: 44px; height: 44px; flex-shrink: 0;
  display: flex; align-items: center; justify-content: center;
  font-size: 1.4rem; margin-top: 6px; border-radius: 8px;
}

/* Einzelne Slot-Karte */
.plan-slot-karte {
  flex: 1; background: var(--weiss); border-radius: 10px;
  padding: 10px 12px; box-shadow: 0 1px 5px var(--schatten); min-width: 0;
}
.plan-slot-label {
  font-size: 0.78rem; font-weight: 700; color: var(--text-hell);
  margin-bottom: 7px; letter-spacing: 0.02em;
}

/* Leerer Slot — gestrichelter grüner Button */
.plan-slot-leer {
  display: flex; align-items: center; gap: 10px; width: 100%;
  border: 2px dashed var(--gruen-accent); border-radius: 24px;
  padding: 9px 16px; background: transparent; cursor: pointer;
  color: var(--gruen-accent); font-weight: 600; font-size: 0.88rem;
  font-family: var(--font-text); transition: border-color 0.15s, background 0.15s;
}
.plan-slot-leer:hover { background: rgba(46,125,50,0.05); }
.plan-slot-leer-plus {
  display: inline-flex; align-items: center; justify-content: center;
  width: 22px; height: 22px; background: var(--gruen-accent);
  color: #fff; border-radius: 50%; font-size: 1.1rem; flex-shrink: 0; line-height: 1;
}

/* Befüllter Slot */
.plan-slot-befuellt {
  display: flex; align-items: center; gap: 10px;
  cursor: pointer; width: 100%; min-width: 0;
}
.plan-slot-bild {
  width: 44px; height: 44px; border-radius: 8px;
  object-fit: cover; flex-shrink: 0;
}
.plan-slot-bild-platzhalter {
  width: 44px; height: 44px; border-radius: 8px; flex-shrink: 0;
  background: var(--creme-dunkel); display: flex; align-items: center;
  justify-content: center; font-size: 1.3rem;
}
.plan-slot-info { flex: 1; min-width: 0; display: flex; flex-direction: column; }
.plan-slot-name {
  font-weight: 600; font-size: 0.88rem; color: var(--text-dunkel);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.plan-slot-geplant { font-size: 0.68rem; color: var(--text-hell); margin-top: 1px; }
.plan-slot-loeschen {
  background: none; border: none; color: var(--text-hell); font-size: 0.8rem;
  cursor: pointer; padding: 4px 6px; border-radius: 50%; flex-shrink: 0;
  transition: color 0.15s, background 0.15s; font-family: inherit;
}
.plan-slot-loeschen:hover { color: var(--rot-schrift); background: rgba(192,57,43,0.08); }

/* Vollkalender */
.vollkal-header {
  display: flex; align-items: center; justify-content: space-between; gap: 8px;
}
.vollkal-monat-label {
  flex: 1; text-align: center; font-weight: 700; font-size: 1rem;
  letter-spacing: 0.05em; color: var(--text-dunkel);
}
.vollkal-wochentage {
  display: grid; grid-template-columns: repeat(7, 1fr);
  text-align: center; margin-bottom: 4px;
}
.vollkal-wochentage span {
  font-size: 0.7rem; font-weight: 700; color: var(--text-hell);
  text-transform: uppercase; padding: 4px 0;
}
.vollkal-grid {
  display: grid; grid-template-columns: repeat(7, 1fr); gap: 2px;
}
.vollkal-tag {
  aspect-ratio: 1; display: flex; align-items: center; justify-content: center;
  background: none; border: none; border-radius: 50%; cursor: pointer;
  font-size: 0.88rem; font-family: var(--font-text); color: var(--text-dunkel);
  transition: background 0.15s; font-weight: 500;
}
.vollkal-tag:hover { background: var(--creme-dunkel); }
.vollkal-tag.heute { background: var(--gruen-dunkel); color: #fff; font-weight: 800; }
.vollkal-tag.anderer-monat { color: var(--text-hell); opacity: 0.45; }
.vollkal-tag.anderer-monat:hover { background: none; cursor: default; }

/* Tages-Zutaten Modal */
.tag-zutaten-rezept-header {
  font-size: 0.78rem; font-weight: 700; text-transform: uppercase;
  letter-spacing: 0.06em; color: var(--gruen-schrift);
  padding: 12px 16px 6px; background: var(--creme);
  border-bottom: 1px solid var(--creme-dunkel);
}
.tag-zutaten-zeile {
  display: flex; align-items: center; gap: 10px;
  padding: 10px 16px; border-bottom: 1px solid var(--creme-dunkel);
}
.tag-zutaten-zeile.vorhanden { opacity: 0.45; }
.tag-zutaten-ok, .tag-zutaten-fehlt { font-size: 0.95rem; flex-shrink: 0; width: 20px; text-align: center; }
.tag-zutaten-name { flex: 1; font-size: 0.88rem; font-weight: 500; color: var(--text-dunkel); }
.tag-zutaten-menge { font-size: 0.75rem; color: var(--text-hell); flex-shrink: 0; max-width: 80px; text-align: right; }
.tag-zutaten-plus {
  background: var(--gruen-accent); color: #fff; border: none;
  border-radius: 50%; width: 26px; height: 26px; font-size: 1.1rem;
  cursor: pointer; flex-shrink: 0; font-family: inherit;
  display: flex; align-items: center; justify-content: center;
  transition: background 0.15s; line-height: 1;
}
.tag-zutaten-plus:hover { background: var(--gruen-dunkel); }
body.dark .tag-zutaten-rezept-header { background: #252525; color: var(--gruen-accent); border-bottom-color: #333; }
body.dark .tag-zutaten-zeile { border-bottom-color: #333; }
body.dark .tag-zutaten-name { color: #e0e0e0; }

/* Plan-Suche */
.plan-suche-datum-zeile { display: flex; gap: 16px; margin-bottom: 4px; }
.plan-suche-datum-label { flex: 1; font-size: 0.82rem; color: var(--text-mittel); font-weight: 600; }
.plan-suche-eintrag {
  display: flex; align-items: center; gap: 10px;
  padding: 10px 0; border-bottom: 1px solid var(--creme-dunkel); cursor: pointer;
}
.plan-suche-eintrag:hover { background: var(--creme); border-radius: 6px; padding-left: 6px; }
.plan-suche-bild { width: 40px; height: 40px; border-radius: 6px; object-fit: cover; flex-shrink: 0; }
.plan-suche-info { flex: 1; min-width: 0; }
.plan-suche-name { font-weight: 600; font-size: 0.88rem; color: var(--text-dunkel); }
.plan-suche-meta { font-size: 0.72rem; color: var(--text-hell); margin-top: 2px; }

/* Einstellung Sektion Label */
.einstellung-sektion-label {
  font-size: 0.72rem; font-weight: 700; text-transform: uppercase;
  letter-spacing: 0.08em; color: var(--gruen-schrift); margin: 4px 0 8px;
}

/* Dark Mode — neues Wochenplan-Design */
body.dark #plan-kalender-streifen { background: #1a1a1a; box-shadow: none; border-bottom: 1px solid #333; }
body.dark .plan-kal-pfeil { color: var(--gruen-accent); }
body.dark .plan-kal-pfeil:hover { background: #2a2a2a; }
body.dark .plan-kal-tagname { color: #888; }
body.dark .plan-kal-datum { color: #e0e0e0; }
body.dark .plan-tag-header { color: #e8e8e8; }
body.dark .plan-slot-karte { background: #1e1e1e; box-shadow: none; }
body.dark .plan-slot-label { color: #777; }
body.dark .plan-slot-name { color: #e0e0e0; }
body.dark .plan-slot-leer { border-color: var(--gruen-accent); color: var(--gruen-accent); }
body.dark .plan-slot-leer:hover { background: rgba(46,125,50,0.12); }
body.dark .plan-slot-bild-platzhalter { background: #2a2a2a; }
body.dark .plan-tag-einkauf-btn:hover { background: #2a2a2a; }
body.dark .vollkal-monat-label { color: #e0e0e0; }
body.dark .vollkal-tag { color: #e0e0e0; }
body.dark .vollkal-tag:hover { background: #2a2a2a; }

/* Einplanen-Modal (2026-10-21): Wochenraster wie im Wochenplan.
   So hoch wie das Rezept-Fenster, damit eine ganze Woche ohne Scrollen passt. */
.modal-einplanen-gross { max-height: calc(88vh - var(--oben-frei) - var(--unten-modal)); display: flex; flex-direction: column; }
.einplanen-trenner { font-size: 0.72rem; text-transform: uppercase; letter-spacing: 0.08em; color: var(--text-hell); font-weight: 700; padding: 8px 0 2px; border-top: 1px solid var(--creme-dunkel); margin-top: 4px; }
.einplanen-kopf { display: grid; grid-template-columns: 56px minmax(0,1fr) 32px; gap: 12px; align-items: center; padding: 18px 20px 12px; border-bottom: 1px solid var(--creme-dunkel); }
.einplanen-kopf-bild { width: 56px; height: 56px; border-radius: 12px; background: var(--creme); display: flex; align-items: center; justify-content: center; font-size: 1.6rem; overflow: hidden; }
.einplanen-kopf-bild img { width: 100%; height: 100%; object-fit: cover; }
.einplanen-eyebrow { font-size: 0.72rem; text-transform: uppercase; letter-spacing: 0.08em; color: var(--text-hell); font-weight: 700; }
.einplanen-kopf .einplanen-name { font-family: var(--font-titel); font-size: 1.08rem; line-height: 1.25; margin: 2px 0 0; text-align: left; color: var(--text-dunkel); font-weight: 600; }
.einplanen-modal-body { flex: 1; overflow-y: auto; padding: 14px 20px 18px; display: block; }
.einplanen-tage-liste { display: block; }
.einplanen-fest { display: flex; align-items: center; justify-content: space-between; gap: 8px; background: var(--creme); border-radius: 10px; padding: 8px 12px; margin-bottom: 12px; font-size: 0.86rem; color: var(--text-mittel); }
.einplanen-fest b { color: var(--gruen-schrift); }
.einplanen-fest button { border: 0; background: transparent; color: var(--text-mittel); font: inherit; font-size: 0.8rem; text-decoration: underline; cursor: pointer; padding: 0; flex-shrink: 0; }
.einplanen-woche-nav { display: grid; grid-template-columns: 36px minmax(0,1fr) 36px; align-items: center; gap: 8px; margin-bottom: 10px; }
.einplanen-woche-nav button { width: 36px; height: 36px; border-radius: 50%; border: 0; background: var(--creme); color: var(--text-dunkel); font-size: 1.05rem; cursor: pointer; }
.einplanen-woche-nav button:disabled { opacity: 0.35; cursor: default; }
.einplanen-woche-nav b { text-align: center; font-size: 0.92rem; color: var(--text-dunkel); }
.einplanen-raster { display: grid; gap: 5px; align-items: stretch; }
.einplanen-raster.eine { grid-template-columns: 72px minmax(0,1fr); gap: 6px; }
.einplanen-spalte-kopf { text-align: center; font-size: 0.72rem; font-weight: 700; color: var(--text-hell); }
.einplanen-tz { font-size: 0.82rem; line-height: 1.15; display: flex; flex-direction: column; justify-content: center; color: var(--text-dunkel); }
.einplanen-tz small { color: var(--text-hell); font-variant-numeric: tabular-nums; }
.einplanen-tz.heute b { color: var(--gruen-accent); }
.einplanen-tz.vorbei { opacity: 0.35; }
.einplanen-zelle { height: 52px; border-radius: 10px; font-family: var(--font-text); display: flex; align-items: center; gap: 6px; padding: 0 6px; min-width: 0; justify-content: center; }
.einplanen-raster.eine .einplanen-zelle { justify-content: flex-start; padding: 0 12px; gap: 8px; }
.einplanen-zelle.frei { border: 1.5px dashed var(--creme-dunkel); background: var(--weiss); color: var(--gruen-hell); font-weight: 600; font-size: 0.86rem; cursor: pointer; }
.einplanen-raster:not(.eine) .einplanen-zelle.frei { font-size: 1.3rem; font-weight: 400; }
.einplanen-zelle.frei:hover { border-style: solid; border-color: var(--gruen-hell); }
.einplanen-zelle.belegt { background: var(--creme); color: var(--text-hell); }
.einplanen-zelle .mini { width: 26px; height: 26px; border-radius: 7px; flex-shrink: 0; object-fit: cover; background: var(--creme-dunkel); display: flex; align-items: center; justify-content: center; font-size: 0.85rem; }
.einplanen-zelle .n { font-size: 0.74rem; line-height: 1.15; overflow: hidden; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; text-align: left; min-width: 0; }
.einplanen-raster:not(.eine) .einplanen-zelle .n { font-size: 0.64rem; }
.einplanen-zelle.ja { border: 0; background: var(--gruen-mittel); color: var(--auf-gruen); font-weight: 700; font-size: 0.86rem; }
.einplanen-zelle.leer { visibility: hidden; }
body.dark .einplanen-zelle.frei { background: #1e1e1e; }
body.dark .einplanen-zelle.belegt, body.dark .einplanen-fest, body.dark .einplanen-kopf-bild, body.dark .einplanen-woche-nav button { background: #2a2a2a; }
body.dark .einplanen-kopf .einplanen-name, body.dark .einplanen-tz, body.dark .einplanen-woche-nav b { color: #e0e0e0; }
/* Rueckgaengig im Toast */
.toast .toast-knopf { margin-left: 12px; border: 0; background: transparent; color: var(--auf-gruen); font: inherit; font-weight: 700; text-decoration: underline; cursor: pointer; padding: 0; }
.toast.mit-knopf { pointer-events: auto; }

/* BON-SCAN */
.modal-bon-gross { max-height: calc(88vh - var(--oben-frei) - var(--unten-modal)); display: flex; flex-direction: column; }
.bon-modal-body { flex: 1; overflow-y: auto; }
.bon-vorschau-bild { width: 100%; max-height: 220px; object-fit: contain; border-radius: var(--radius-klein); margin-bottom: 12px; background: var(--creme-dunkel); }
.bon-hinweis { font-size: 0.85rem; color: var(--text-hell); text-align: center; padding: 16px 0; }
.bon-status { display: flex; align-items: center; gap: 10px; padding: 10px 0; font-size: 0.9rem; color: var(--text-mittel); }
.bon-kassenbuch-hinweis { font-size: 0.8rem; color: var(--gruen-accent); background: rgba(74,124,89,0.08); border-radius: var(--radius-klein); padding: 8px 10px; margin-bottom: 10px; }
.bon-tipp-icon { font-size: 1.15rem; color: var(--gruen-schrift); cursor: pointer; user-select: none; padding: 0 4px; opacity: 0.8; }
.bon-tipps-panel { background: var(--creme-dunkel); border-radius: 8px; padding: 10px 14px; margin: 0 0 8px 0; font-size: 0.83rem; color: var(--text-mittel); display: flex; flex-direction: column; gap: 5px; }
.bon-ergebnis-liste { display: flex; flex-direction: column; gap: 4px; }
.bon-artikel-zeile { display: flex; align-items: center; gap: 10px; padding: 8px 4px; border-bottom: 1px solid var(--creme-dunkel); }
.bon-checkbox { width: 18px; height: 18px; accent-color: var(--gruen-accent); flex-shrink: 0; cursor: pointer; }
.bon-artikel-name { flex: 1; font-size: 0.9rem; color: var(--text-dunkel); font-weight: 500; }
.bon-name-input { flex: 1; font-size: 0.85rem; padding: 3px 6px; border: 1px solid #ccc; border-radius: var(--radius-klein); background: white; color: var(--text-dunkel); font-family: var(--font-text); min-width: 0; }
.bon-name-input:focus { outline: none; border-color: var(--gruen-accent); }
.bon-kat-select { font-size: 0.78rem; padding: 3px 6px; border: 1px solid #ccc; border-radius: var(--radius-klein); background: white; color: var(--text-dunkel); font-family: var(--font-text); cursor: pointer; max-width: 145px; }
.bon-leer { font-size: 0.85rem; color: var(--text-hell); text-align: center; padding: 20px 0; }
.bon-abschnitt-trenner { text-align: center; font-size: 0.75rem; color: var(--text-hell); padding: 8px 0 4px; letter-spacing: 0.05em; }

/* TAGESSUCHE */
/* Leeren Platz im Wochenplan fuellen (2026-10-21): gross wie das Rezept-
   Fenster, Treffer fuellen den Platz, Blaettern statt Scrollen. */
/* Gleiche Groesse wie das Rezept-Fenster (#modal-rezept .rz-neu) */
.modal-tagessuche-gross { max-width: 540px; max-height: none; display: flex; flex-direction: column;
  height: calc(90vh - var(--oben-frei) - var(--unten-modal));
  height: calc(90dvh - var(--oben-frei) - var(--unten-modal)); }
@media (max-width: 640px) {
  #modal-tagessuche { padding: 6px; padding-bottom: calc(6px + var(--tastatur-hoehe)); }
  .modal-tagessuche-gross {
    height: calc(98vh - var(--oben-frei) - var(--unten-modal));
    height: calc(98dvh - var(--oben-frei) - var(--unten-modal));
    border-radius: 18px;
  }
}
.tagessuche-body { flex: 1; min-height: 0; display: flex; flex-direction: column; gap: 10px; overflow: hidden; }
.ts-chips { display: flex; flex-wrap: wrap; gap: 6px; }
.ts-chip { border: 1.5px solid var(--creme-dunkel); background: var(--weiss); color: var(--text-dunkel); border-radius: 999px; padding: 5px 11px; font-family: var(--font-text); font-size: 0.8rem; font-weight: 600; cursor: pointer; }
.ts-chip.aktiv { background: var(--gruen-dunkel); border-color: var(--gruen-dunkel); color: var(--auf-gruen); }
.ts-ergebnisse { flex: 1; min-height: 0; display: flex; flex-direction: column; }
.tagessuche-liste { display: flex; flex-direction: column; gap: 6px; }
.tagessuche-eintrag { display: flex; align-items: center; gap: 10px; background: var(--creme); border-radius: 12px; padding: 6px 8px 6px 6px; cursor: pointer; min-height: 56px; }
.tagessuche-eintrag:hover { outline: 1.5px solid var(--gruen-hell); }
.ts-bild { width: 44px; height: 44px; object-fit: cover; border-radius: 9px; flex-shrink: 0; }
.ts-bild-platzhalter { width: 44px; height: 44px; background: var(--creme-dunkel); border-radius: 9px; display: flex; align-items: center; justify-content: center; font-size: 1.3rem; flex-shrink: 0; }
.ts-info { flex: 1; min-width: 0; }
.ts-name { font-family: var(--font-titel); font-weight: 600; font-size: 0.9rem; line-height: 1.2; color: var(--text-dunkel); overflow: hidden; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; }
.ts-kat { font-size: 0.7rem; color: var(--text-hell); font-weight: 600; margin-top: 2px; }
/* Das Plus ist der einzige Einplan-Knopf; gross genug zum Treffen */
.ts-plus { width: 44px; height: 44px; border-radius: 50%; border: 0; background: var(--gruen-dunkel); color: var(--auf-gruen); font-size: 1.5rem; line-height: 1; cursor: pointer; flex-shrink: 0; display: flex; align-items: center; justify-content: center; }
.ts-leer { color: var(--text-hell); font-size: 0.88rem; text-align: center; padding: 18px 8px; margin: 0; }

.versteckt { display: none !important; }

/* ─────────────────────────────────────────────
   BOTTOM NAVIGATION + FAB (standardmäßig versteckt)
   ───────────────────────────────────────────── */
.bottom-nav { display: none; }
.fab { display: none; }

/* RESPONSIVE */
@media (max-width: 768px) {

  /* Header: Nav ausblenden — nur Logo + Haushalt */
  .nav { display: none; }

  /*
    Kochtopf-Symbol auf dem Handy weglassen (Emanuels Vorschlag).
    Der Schriftzug "Pott&Pann" traegt die Marke ohnehin, und die
    gewonnenen ~40 Pixel kommen dem Haushaltsnamen zugute — der wurde
    sonst schon nach vier Zeichen mit "…" gekuerzt.
    Auf breiten Bildschirmen bleibt der Topf.
  */
  .logo-icon { display: none; }
  .header-inner {
    display: flex;
    align-items: center;
    justify-content: space-between;
    padding: 12px var(--padding);
    flex-wrap: nowrap;
  }

  /* Haushalt-Dropdown auf Mobile */
  .haushalt-dropdown {
    top: 64px;
    left: 8px;
    right: 8px;
    min-width: unset;
    max-width: unset;
  }

  /* Mehr Platz für Bottom Nav */
  .main { padding-bottom: calc(64px + var(--android-nav, env(safe-area-inset-bottom, 0px)) + 20px + var(--viewport-versatz, 0px)) !important; }

  /* ─── PAGE HEADER (App-Stil statt Website-Hero) ─── */
  .hero {
    padding: 18px 16px 14px;
    border-bottom: none;
    margin-bottom: 14px;
    display: flex;
    flex-direction: column;
    gap: 2px;
  }

  .hero-titel {
    font-family: var(--font-text) !important;
    font-size: 1.75rem !important;
    font-weight: 800;
    letter-spacing: -0.03em;
    line-height: 1.1;
    color: #fff !important;
  }

  .hero-titel em {
    font-style: normal;
    color: #a8d5a8 !important;
  }

  .hero-sub {
    font-size: 0.78rem;
    color: rgba(255,255,255,0.75) !important;
    margin-top: 0;
    font-weight: 400;
  }

  /* Primär-Hinzufügen-Button verstecken — FAB übernimmt das */
  #btn-hinzufuegen { display: none; }
  #btn-einkauf-hinzufuegen { display: none; }

  /* Aktions-Leiste: kompakt */
  .aktions-leiste { gap: 8px; flex-wrap: nowrap; overflow-x: auto; margin-bottom: 12px; }

  /* Primärbuttons kleiner */
  .btn { padding: 10px 16px; font-size: 0.84rem; min-height: 44px; }

  /* Filter horizontal scrollbar statt vieler Zeilen */
  .filter-gruppe {
    width: 100%;
    overflow-x: auto;
    flex-wrap: nowrap;
    -webkit-overflow-scrolling: touch;
    scrollbar-width: none;
    padding-bottom: 2px;
  }
  .filter-gruppe::-webkit-scrollbar { display: none; }
  .filter-btn { font-size: 0.72rem; padding: 7px 12px; white-space: nowrap; min-height: 36px; }

  /* Kacheln */
  .lebensmittel-grid { grid-template-columns: repeat(auto-fill, minmax(130px, 1fr)); gap: 8px; }

  /* ─── FAB (Floating Action Button) ─── */
  .fab {
    position: fixed;
    bottom: calc(64px + var(--android-nav, env(safe-area-inset-bottom, 0px)) + 14px + var(--viewport-versatz, 0px));
    right: 20px;
    width: 56px;
    height: 56px;
    border-radius: 50%;
    background: var(--gruen-dunkel);
    color: var(--auf-gruen);
    border: none;
    font-size: 2rem;
    font-weight: 300;
    line-height: 1;
    cursor: pointer;
    box-shadow: 0 4px 14px rgba(26,46,26,0.45), 0 8px 28px rgba(26,46,26,0.2);
    z-index: 130;
    display: flex;
    align-items: center;
    justify-content: center;
    transition: transform 0.2s cubic-bezier(0.34, 1.56, 0.64, 1), box-shadow 0.2s;
    -webkit-tap-highlight-color: transparent;
  }

  .fab:active { transform: scale(0.9); }
  .fab.versteckt { display: none; }

  /* ─── Scan&Collect FAB (über normalem FAB) ─── */
  #fab-scan-collect {
    bottom: calc(64px + var(--android-nav, env(safe-area-inset-bottom, 0px)) + 14px + 56px + 12px + var(--viewport-versatz, 0px));
    background: #2d6a4f;
    font-size: 1.4rem;
  }
  #fab-scan-collect.versteckt { display: none; }

  /* ─── REZEPTE: iOS-Segmented-Control ─── */
  .rezepte-tab-leiste {
    background: var(--creme-dunkel);
    border-radius: 10px;
    padding: 3px;
    margin-bottom: 16px;
    display: flex;
    gap: 0;
  }

  .rezepte-tab-leiste .filter-btn {
    flex: 1;
    text-align: center;
    border-radius: 8px;
    background: transparent;
    border: none;
    color: var(--text-mittel);
    padding: 8px 4px;
    font-size: 0.78rem;
    font-weight: 500;
    min-height: 36px;
    white-space: nowrap;
    transition: all 0.2s;
  }

  .rezepte-tab-leiste .filter-btn.aktiv {
    background: var(--weiss);
    color: var(--gruen-schrift);
    box-shadow: 0 1px 5px rgba(0,0,0,0.12);
    font-weight: 600;
  }

  /* Edeka Grid auf Mobile: 2 Spalten */
  .edeka-angebote-grid { grid-template-columns: 1fr 1fr; gap: 10px; }

  /* Version-Footer über der Bottom-Nav */
  .version-footer { display: block; padding-bottom: 4px; }

  /* ─── BOTTOM NAV ─── */
  .bottom-nav {
    display: flex;
    position: fixed;
    /*
      NICHT bottom: 0 — "fixed" bezieht sich auf die GEDACHTE Seitenhoehe, und
      die ist in der Android-WebView groesser als der sichtbare Bereich
      (gemessen: 841 gerechnet, 817 sichtbar). Die Leiste haette sonst ihre
      unteren 24 Pixel unterhalb des Bildschirms — genau dort lagen die
      Beschriftungen, deshalb waren sie unsichtbar.
      --viewport-versatz wird in app.js gemessen; wo es das Problem nicht
      gibt, ist der Wert 0 und es aendert sich nichts.
    */
    /*
      Die Leiste bleibt am Rand kleben — NICHT per bottom/right hochschieben.
      Das war ein Fehlversuch: dadurch loeste sie sich vom Bildschirmrand und
      schwebte ueber dem Seiteninhalt (auf dem Rezepte-Tab gut zu sehen).
      Stattdessen wird unten/rechts INNEN gepolstert, siehe padding weiter
      unten: der Rand bleibt buendig, nur der Inhalt rutscht in den sichtbaren
      Bereich.
    */
    bottom: 0;
    left: 0;
    right: 0;
    /*
      Unten muss Platz fuer die Systemleiste des Geraets bleiben, sonst liegt
      die halbe Navigationsleiste dahinter.

      --android-nav wird von MainActivity.java gesetzt (siehe dort): auf
      Android meldet env(safe-area-inset-bottom) die Navigationsleiste NICHT,
      deshalb reicht die App den gemessenen Wert herein. Im Browser und auf
      iOS existiert die Variable nicht, dort greift env() als Rueckfall — und
      wenn beides fehlt, bleiben es schlicht 0 Pixel.

      Die Hoehe MUSS den Wert mitrechnen: global gilt box-sizing: border-box
      (Zeile 26), ein Polster wuerde sonst von INNEN abgezogen und die
      Beschriftungen abschneiden.
    */
    --systemleiste-unten: env(safe-area-inset-bottom, 0px);
    /*
      min-height statt height: die Leiste darf wachsen, wenn Symbol und
      Beschriftung mehr Platz brauchen — etwa bei groesserer Systemschrift.
      Mit fester Hoehe wurden die Beschriftungen abgeschnitten, und zwar
      lautlos: nichts ueberlief, sie waren einfach weg.
    */
    /*
      48px statt frueher 64: an Bring! ausgemessen. Deren Leiste ist auf
      demselben Geraet (1220x2712) 310 Geraetepixel hoch, unsere war 334.

      ACHTUNG, hier haengen ZWEI Werte zusammen: der Mindestwert hier und
      das Polster in .bottom-nav-btn. Wer nur einen aendert, aendert gar
      nichts — der jeweils andere haelt die Hoehe. Und weil die Knoepfe
      mittig sitzen, wandert dabei auch der Inhalt nicht.
    */
    min-height: calc(48px + var(--android-nav, var(--systemleiste-unten))
                          + var(--viewport-versatz, 0px));
    /*
      Zwei Anteile:
      --android-nav      = was Systemleisten verdecken (meist 0)
      --viewport-versatz = wie viel die Seite unter dem Bildschirm rechnet
                           (in der WebView gemessen 24 Pixel)
      Beide zusammen halten Symbole und Beschriftungen im sichtbaren Bereich.
    */
    padding-bottom: calc(var(--android-nav, var(--systemleiste-unten))
                         + var(--viewport-versatz, 0px));
    /* Waagerecht dasselbe: rechts ragte die Seite ueber den Bildschirm,
       "Wochenplan" war angeschnitten. */
    padding-right: var(--viewport-versatz-x, 0px);
    background: rgba(255, 255, 255, 0.97);
    backdrop-filter: blur(16px);
    -webkit-backdrop-filter: blur(16px);
    border-top: 1px solid var(--creme-dunkel);
    box-shadow: 0 -4px 20px rgba(26, 46, 26, 0.08);
    z-index: 150;
    overflow: visible;
  }

  /*
    DUNKLER STREIFEN HINTER ANDROIDS KNOEPFEN

    In der PWA zeichnet Chrome nicht unter die Systemleiste, dort bleibt ein
    schwarzer Streifen. Die App zeichnet seit targetSdk 36 randlos, dadurch
    lief die weisse Flaeche bis zum Bildschirmrand durch und Androids
    Knoepfe sassen darauf. Emanuel gefiel der Streifen besser.

    Die Hoehe ist dieselbe Rechnung wie das padding-bottom darueber. Ist der
    Wert 0 (Browser, iOS), hat der Streifen keine Hoehe und faellt weg, ohne
    dass etwas passiert.
  */
  .bottom-nav::after {
    content: "";
    position: absolute;
    left: 0; right: 0; bottom: 0;
    /*
      NUR --android-nav, bewusst ohne --viewport-versatz.

      Der Versatz misst den Unterschied zwischen gerechneter und sichtbarer
      Fensterhoehe. In Chrome auf dem Handy ist das die Hoehe der
      ADRESSLEISTE: sie verschwindet beim Scrollen nach unten und kommt
      beim Hochscrollen zurueck. Mit dem Versatz in der Rechnung blitzte
      dadurch in der Webversion ein schwarzer Balken auf, je nachdem wie
      man gerade gescrollt hatte.

      Auch kein env()-Rueckfall: --android-nav wird ausschliesslich von
      MainActivity.java gesetzt, es gibt den Streifen also genau dort, wo
      Androids Knoepfe wirklich ueber der App liegen. Im Browser, in der
      PWA und auf iOS bleibt er aus.
    */
    height: var(--android-nav, 0px);
    background: #000;
    pointer-events: none;
  }

  .bottom-nav-btn {
    flex: 1;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 3px;
    background: none;
    border: none;
    cursor: pointer;
    font-family: var(--font-text);
    color: var(--text-hell);
    /*
      4px statt 8: die Leiste war 8 CSS-Pixel hoeher als die von Bring!,
      und dieses Polster war der Grund. min-height allein aendert nichts,
      solange der Inhalt hoeher ist als der Mindestwert.
    */
    padding: 4px 4px;
    transition: color 0.2s, transform 0.15s;
    -webkit-tap-highlight-color: transparent;
    position: relative;
  }

  .bottom-nav-btn::before {
    content: "";
    position: absolute;
    top: 0;
    left: 22%;
    right: 22%;
    height: 2.5px;
    background: transparent;
    border-radius: 0 0 4px 4px;
    transition: background 0.2s;
  }

  .bottom-nav-btn.active {
    background: none;
    border-color: transparent;
    color: var(--gruen-schrift);
  }

  .bottom-nav-btn.active::before {
    background: var(--gruen-accent);
  }

  .bottom-nav-btn.active .bottom-nav-icon {
    transform: scale(1.12);
  }

  .bottom-nav-icon {
    width: 22px;
    height: 22px;
    display: flex;
    align-items: center;
    justify-content: center;
    line-height: 1;
    transition: transform 0.2s cubic-bezier(0.34, 1.56, 0.64, 1);
  }

  .bottom-nav-icon svg {
    width: 22px;
    height: 22px;
    display: block;
  }

  .bottom-nav-label {
    font-size: 0.62rem;
    font-weight: 500;
    letter-spacing: 0.01em;
  }
}

@media (max-width: 480px) {
  .lebensmittel-grid { grid-template-columns: 1fr 1fr; }
  .hero-titel { font-size: 1.5rem; }
  .hero-sub { font-size: 0.85rem; }
  .modal { border-radius: var(--radius); }
  .rezepte-grid { grid-template-columns: 1fr; }
}

@media (max-width: 320px) {
  .lebensmittel-grid { grid-template-columns: 1fr; }
  .bottom-nav-label { display: none; }
  .bottom-nav { height: 56px; }
}

/* INSTALLIEREN AUF DEM IPHONE
   Rest des alten PWA-Install-Gates. Das Overlay samt Kasten ist raus, es
   war tot (display:none und nichts, was es wieder einblendet). Was das
   neue #modal-ios-installieren benutzt, bleibt: Logo und Anleitung. */
.pwa-logo { width: 72px; height: 72px; border-radius: 16px; object-fit: contain; margin: 0 auto 8px; display: block; }
.pwa-anleitung { background: var(--creme); border-radius: 12px; padding: 16px 20px; text-align: left; }
.pwa-anleitung p { font-size: 0.9rem; color: var(--text-mittel); margin-bottom: 8px; line-height: 1.5; }
.pwa-anleitung p:last-child { margin-bottom: 0; }

/* LOGIN */
/* Der Kasten steht mittig, kann bei kleinen Bildschirmen aber oben und unten
   anstossen. Deshalb auch hier die Systemleisten einrechnen, siehe
   --oben-frei. Der Verlauf selbst fuellt weiter die ganze Flaeche. */
.login-overlay { position: fixed; inset: 0; background: linear-gradient(160deg, #1a2e1a 0%, #2d4a2d 45%, #3a6a4a 100%); display: flex; align-items: center; justify-content: center; z-index: 9999;
                 padding-top: var(--oben-frei);
                 padding-bottom: var(--android-nav, env(safe-area-inset-bottom, 0px)); }
/* Bewusst OHNE max-height und overflow: der Kasten hatte eine eigene
   Bildlaufleiste, die Spalte drumherum auch. Zwei Scrollbereiche
   ineinander fuehlen sich an wie ein Rahmen im Rahmen, und der
   "Konto erstellen"-Knopf war unten abgeschnitten. Gescrollt wird
   jetzt nur noch an einer Stelle: .login-spalte. */
.login-box { background: #fff; border-radius: 24px; padding: 34px 28px; width: 100%; max-width: 360px; box-shadow: 0 24px 64px rgba(0,0,0,0.35); }

/* ── Login-Screen: Oma-Begrüßung + Feature-Zeile ──────────────
   Der Login-Screen bestand vorher nur aus der weißen Box, die in einer
   großen leeren Fläche schwebte. Oma oben und die Kernfunktionen unten
   füllen den Platz und zeigen gleich, worum es in der App geht. */
.login-spalte {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 14px;
  width: 100%;
  max-width: 360px;
  max-height: 100%;
  overflow-y: auto;
  padding: 8px 0;
}

/* Zweitknopf: gleiche Groesse wie "Anmelden", andere Gewichtung.
   Vorher war das ein Textlink im Kleingedruckten — auf einer Seite, die
   fast nur neue Leute sehen, war der wichtigste Weg der unauffaelligste. */
.btn-login-zweit {
  width: 100%;
  background: transparent;
  color: var(--gruen-schrift);
  border: 2px solid var(--gruen-mittel);
  font-weight: 600;
  padding: 9px 22px;
}
.btn-login-zweit:hover { background: var(--gruen-mittel); color: var(--auf-gruen); }

.login-wechsel-trenner {
  display: flex; align-items: center; gap: 10px;
  margin: 16px 0 10px;
  color: var(--text-hell); font-size: 0.78rem;
}
.login-wechsel-trenner::before, .login-wechsel-trenner::after {
  content: ""; flex: 1; height: 1px; background: var(--creme-dunkel);
}


/* Rechtliches auf dem Anmeldebildschirm. Eigene Klassen statt
   .version-footer, weil dessen Schrift auf dem dunkelgruenen Verlauf
   nicht lesbar waere — --text-hell ist dunkel. --auf-gruen ist die
   Farbe, die in BEIDEN Modi hell auf gruen bleibt. */
.login-footer {
  display: flex;
  align-items: center;
  justify-content: center;
  flex-wrap: wrap;
  gap: 8px;
  padding: 4px 4px 14px;
  width: 100%;
}
.login-footer-link {
  font-size: 0.78rem;
  color: var(--auf-gruen);
  opacity: 0.75;
  padding: 0;
  text-decoration: underline;
}
.login-footer-link:hover { opacity: 1; }
.login-footer-trenner { color: var(--auf-gruen); opacity: 0.45; font-size: 0.78rem; }

/* ═══════════════════════════════════════════════════════════════════ */
/*  ANMELDEBILDSCHIRM MIT OMA POTT                                      */
/*                                                                      */
/*  Alles an #login-screen gehaengt, NICHT an .login-overlay: die       */
/*  Klasse traegt auch #haushalt-screen, und der soll unveraendert      */
/*  bleiben.                                                            */
/*                                                                      */
/*  Werte am Geraet eingestellt, nicht geschaetzt: Kachel 38 %,         */
/*  Funktionskacheln 50 %, Knoepfe 65 %, Bildausschnitt 25 %.           */
/* ═══════════════════════════════════════════════════════════════════ */

/*
  Das Foto, ganzflaechig hinter allem.

  ⚠️ height und top statt inset: 0. Das Bild ist 608x1080, Verhaeltnis
  0,563, ein Handybildschirm rund 0,53 — im Verhaeltnis ist das Bild also
  BREITER. "cover" beschneidet es deshalb an den Seiten und setzt es
  senkrecht genau passend, es gibt gar keinen Ueberstand zum Verschieben.
  background-position liefe ins Leere. Ueber die Hoehe (--login-zoom)
  entsteht erst der Spielraum, den --login-schnitt dann nutzt.
*/
#login-screen { --login-zoom: 100; --login-schnitt: 25; }

#login-screen::before {
  content: "";
  position: absolute;
  left: 0; right: 0;
  height: calc(var(--login-zoom) * 1%);
  top: calc((100% - var(--login-zoom) * 1%) * var(--login-schnitt) / 100);
  background-image: url('assets/login-oma.webp');
  background-size: cover;
  background-position: center;
}

/*
  Schleier ueber dem Foto. Oben und unten kraeftiger, in der Mitte
  duenner — dort steht der Anmeldekasten, und dort soll Oma durchkommen.
  Ohne ihn verschwinden Ueberschrift und Fussleiste in den hellen
  Stellen der Kueche.
*/
#login-screen::after {
  content: "";
  position: absolute;
  inset: 0;
  background: linear-gradient(to bottom,
              rgba(16,28,16,0.48) 0%,
              rgba(16,28,16,0.22) 38%,
              rgba(16,28,16,0.60) 100%);
}

#login-screen .login-spalte { position: relative; z-index: 1; }

/*
  App-Symbol statt Schriftzug. 22 % Rundung ist dasselbe Verhaeltnis,
  das Android fuer seine Symbole benutzt — es sieht dadurch aus wie das
  Symbol auf dem Startbildschirm, von dem der Nutzer gerade kam.
*/
#login-screen .login-logo {
  width: 92px;
  height: 92px;
  margin: 0 auto 18px;
  border-radius: 22%;
  background-image: url('icon-512.png');
  background-size: cover;
  box-shadow: 0 8px 22px rgba(0,0,0,0.3);
}

/*
  Die dunkle Kachel.

  ⚠️ Dunkel, NICHT weiss mit Weichzeichner. Weiss bei niedriger Deckkraft
  waescht das Foto aus und wirkt milchig; dunkle Durchsicht legt sich wie
  ein Schatten darueber und laesst die Farben stehen. Dafuer muss die
  Schrift hell werden. Der feine Schattenwurf ersetzt den Weichzeichner:
  er loest den Text vom Bild, ohne die Kueche zuzukleistern.
*/
#login-screen .login-box {
  background: rgba(10, 20, 10, 0.38);
  border: 1px solid rgba(255,255,255,0.16);
  box-shadow: 0 18px 50px rgba(0,0,0,0.35);
}
#login-screen .login-box,
#login-screen .login-wechsel-text,
#login-screen .login-trenner,
#login-screen .login-wechsel-trenner { text-shadow: 0 1px 4px rgba(0,0,0,0.55); }

#login-screen .login-wechsel-text,
#login-screen .login-trenner,
#login-screen .login-wechsel-trenner { color: rgba(255,255,255,0.72); }
#login-screen .login-trenner::before,
#login-screen .login-trenner::after,
#login-screen .login-wechsel-trenner::before,
#login-screen .login-wechsel-trenner::after { background: rgba(255,255,255,0.28); }

#login-screen .btn-link { color: rgba(255,255,255,0.88); }
#login-screen .login-box p { color: rgba(255,255,255,0.84); }
#login-screen .login-fehler-text { color: #ff9a8f; }

#login-screen .form-input {
  background: rgba(255,255,255,0.13);
  border-color: rgba(255,255,255,0.32);
  color: #fff;
}
#login-screen .form-input::placeholder { color: rgba(255,255,255,0.62); }
#login-screen .form-input:focus {
  background: rgba(255,255,255,0.2);
  border-color: rgba(255,255,255,0.6);
}

/*
  Login und Konto erstellen sehen gleich aus und sind halbdurchsichtig.
  Heller als --gruen-schrift, sonst verschwinden sie in der dunklen
  Kachel. Schattenwurf an der Schrift, sonst flimmert sie ueber den
  Blumenmustern im Foto.
*/
#login-screen .btn-primary,
#login-screen .btn-login-zweit {
  background: rgba(74, 124, 89, 0.65);
  color: #fff;
  border: none;
  padding: 12px 18px;
  box-shadow: none;
  text-shadow: 0 1px 3px rgba(0,0,0,0.4);
}
#login-screen .btn-primary:hover,
#login-screen .btn-login-zweit:hover {
  background: rgba(74, 124, 89, 0.85);
  transform: none;
  color: #fff;
}

/*
  Auge zum Aufdecken des Passworts.

  ⚠️ Das Feld steckt jetzt in einem Wrapper, damit der Knopf darin
  schweben kann. Dadurch greift kein "margin-top" am Feld mehr — der
  Abstand haengt am Wrapper.

  44 Pixel Tastflaeche: darunter trifft man auf dem Handy daneben.
  padding-right am Feld, damit lange Passwoerter nicht unters Auge laufen.
*/
.passwort-feld { position: relative; margin-top: 10px; }
.passwort-feld .form-input { padding-right: 48px; }
.pw-auge {
  position: absolute;
  right: 4px; top: 50%;
  transform: translateY(-50%);
  width: 44px; height: 44px;
  display: flex; align-items: center; justify-content: center;
  background: none; border: none; cursor: pointer;
  color: var(--text-hell);
  border-radius: 50%;
}
.pw-auge svg { width: 21px; height: 21px; display: block; }
#login-screen .pw-auge { color: rgba(255,255,255,0.72); }

/*
  Funktionskacheln, wie auf der Werbeseite nur schmaler.

  ⚠️ Zwoelf Prozentpunkte dichter als der Anmeldekasten (0.50 statt
  0.38). Hier steht kleiner Fliesstext, und der braucht mehr ruhigen
  Grund als eine Ueberschrift. Bei gleicher Deckkraft waeren die Kacheln
  zuerst unlesbar gewesen.
*/
#login-screen .funktionen { width: 100%; padding: 4px 0 6px; }
#login-screen .funktionen-kopf { text-align: center; margin-bottom: 14px; }
#login-screen .funktionen-kopf h2 {
  font-family: var(--font-titel);
  font-weight: 700;
  font-size: 1.25rem;
  color: var(--auf-gruen);
  line-height: 1.2;
  text-shadow: 0 1px 5px rgba(0,0,0,0.6);
}
#login-screen .funktionen-kopf p {
  font-size: 0.8rem;
  color: rgba(255,255,255,0.68);
  margin-top: 4px;
  line-height: 1.45;
  text-shadow: 0 1px 5px rgba(0,0,0,0.6);
}
#login-screen .funktionen-gitter { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }
#login-screen .funktion {
  background: rgba(10, 20, 10, 0.50);
  border: 1px solid rgba(255,255,255,0.16);
  border-radius: 14px;
  padding: 14px 13px 15px;
  box-shadow: 0 10px 28px rgba(0,0,0,0.3);
  display: flex;
  flex-direction: column;
  min-width: 0;
}
#login-screen .funktion.neu { border-top: 3px solid var(--gruen-hell, #6aab7a); }
#login-screen .funktion-neu {
  align-self: flex-start;
  background: var(--gruen-hell, #6aab7a);
  color: #fff;
  font-size: 0.6rem; font-weight: 700;
  padding: 2px 8px; border-radius: 50px;
  margin-bottom: 7px;
  text-transform: uppercase; letter-spacing: 0.5px;
}
#login-screen .funktion-icon { font-size: 1.5rem; line-height: 1; margin-bottom: 9px; }
#login-screen .funktion h3 {
  font-size: 0.83rem; font-weight: 700; line-height: 1.25;
  color: var(--auf-gruen); margin-bottom: 5px;
  text-shadow: 0 1px 4px rgba(0,0,0,0.55);
}
#login-screen .funktion p {
  font-size: 0.72rem; line-height: 1.5;
  color: rgba(255,255,255,0.8);
  text-shadow: 0 1px 4px rgba(0,0,0,0.5);
}

/* Nativer Google-Button (nur in der App — GSI läuft dort nicht) */
.btn-google-nativ {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 10px;
  width: 100%;
  padding: 11px 16px;
  /*
    ⚠️ Werte direkt aus Googles Markenrichtlinien, nicht frei gewaehlt:
    developers.google.com/identity/branding-guidelines

      hell     #FFFFFF  Rahmen #747775  Schrift #1F1F1F
      dunkel   #131314  Rahmen #8E918F  Schrift #E3E3E3
      neutral  #F2F2F2  KEIN Rahmen     Schrift #1F1F1F

    Wir nehmen NEUTRAL: ohne Rahmen, ruhiger auf dem Foto als das harte
    Weiss. Eigene Farben oder Durchsichtigkeit sind nicht erlaubt,
    deshalb bleibt dieser Knopf als einziger voll deckend.
    Schrift laut Vorgabe Roboto Medium 14/20.
  */
  background: #f2f2f2;
  border: none;
  border-radius: 999px;
  font-family: Roboto, var(--font-text);
  font-weight: 500;
  font-size: 14px;
  line-height: 20px;
  color: #1f1f1f;
  cursor: pointer;
  transition: background 0.15s, box-shadow 0.15s;
}
.btn-google-nativ:hover { background: #e8e8e8; box-shadow: 0 1px 6px rgba(0,0,0,0.12); }
.btn-google-nativ:disabled { opacity: 0.6; cursor: default; }
/* Googles eigenes Logo. Ein getipptes "G" waere ein Verstoss. */
.btn-google-nativ svg { width: 18px; height: 18px; flex-shrink: 0; }

/* Kleine Displays: enger setzen, damit der Kasten nicht gequetscht wird.
   .login-claim und .login-vorstellung gibt es seit dem Umbau nicht mehr,
   stattdessen schrumpfen Symbol und Kachelabstand. */
@media (max-height: 700px) {
  .login-box { padding: 26px 22px; }
  #login-screen .login-logo { width: 74px; height: 74px; margin-bottom: 14px; }
  #login-screen .funktionen-gitter { gap: 8px; }
}
.login-trenner { display: flex; align-items: center; gap: 12px; margin: 14px 0; color: var(--text-hell); font-size: 0.8rem; }
.login-trenner::before, .login-trenner::after { content: ""; flex: 1; height: 1px; background: var(--creme-dunkel); }
.login-wechsel-text { text-align: center; margin-top: 14px; font-size: 0.85rem; color: var(--text-mittel); }
.btn-link { background: none; border: none; color: var(--gruen-schrift); cursor: pointer; font-size: 0.85rem; padding: 0; text-decoration: underline; font-family: var(--font-text); }
.login-fehler-text { color: var(--rot-schrift); font-size: 0.85rem; margin-top: 12px; text-align: center; }
.einladung-hinweis { background: var(--creme); border-left: 3px solid var(--gruen-hell); border-radius: var(--radius-klein); padding: 10px 14px; font-size: 0.85rem; color: var(--text-mittel); margin-bottom: 12px; }
.haushalt-mitglied { display: flex; align-items: center; justify-content: space-between; gap: 8px; }
.btn-mitglied-kick { background: none; border: none; color: #c0392b; cursor: pointer; font-size: 0.9rem; padding: 2px 6px; border-radius: 4px; line-height: 1; }
.btn-mitglied-kick:hover { background: rgba(192,57,43,0.12); }

/* ─────────────────────────────────────────────
   EDEKA ANGEBOTE BEREICH
   ───────────────────────────────────────────── */
.edeka-bereich {
  margin-top: 32px;
  border-top: 2px solid var(--creme-dunkel);
  padding-top: 20px;
}

.edeka-bereich-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  margin-bottom: 14px;
}

.edeka-header-links {
  display: flex;
  align-items: center;
  gap: 10px;
  flex-wrap: wrap;
}

.edeka-titel {
  font-family: var(--font-titel);
  font-size: 1.2rem;
  font-weight: 700;
  color: var(--text-dunkel);
}

.edeka-plz-anzeige {
  font-size: 0.78rem;
  color: var(--text-hell);
  background: var(--creme-dunkel);
  padding: 2px 10px;
  border-radius: 50px;
  font-weight: 500;
}

.btn-edeka-aktualisieren {
  background: var(--creme-dunkel);
  border: none;
  width: 34px;
  height: 34px;
  border-radius: 50%;
  cursor: pointer;
  font-size: 1.1rem;
  color: var(--text-mittel);
  display: flex;
  align-items: center;
  justify-content: center;
  transition: background 0.2s, transform 0.3s;
  flex-shrink: 0;
}

.btn-edeka-aktualisieren:hover { background: var(--creme); transform: rotate(180deg); }

.edeka-suche-bar {
  display: flex;
  gap: 10px;
  margin-bottom: 14px;
}

.edeka-suche-input { flex: 1; width: 100%; }

.edeka-lade-status {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 14px;
  background: var(--creme);
  border-radius: var(--radius);
  color: var(--text-mittel);
  font-size: 0.9rem;
  margin-bottom: 10px;
}

.edeka-kein-plz {
  background: var(--creme);
  border-radius: var(--radius);
  padding: 16px 20px;
  color: var(--text-mittel);
  font-size: 0.9rem;
  line-height: 1.5;
  margin-bottom: 10px;
}

/* Angebots-Karten */
.edeka-angebote-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
  gap: 12px;
}

.edeka-karte {
  background: var(--weiss);
  border-radius: var(--radius);
  padding: 14px;
  box-shadow: 0 2px 8px var(--schatten);
  border-left: 4px solid var(--gruen-dunkel);
  display: flex;
  flex-direction: column;
  gap: 6px;
  animation: karteRein 0.3s ease;
}

.edeka-markt-badge {
  display: inline-block;
  font-size: 0.68rem;
  font-weight: 700;
  padding: 2px 8px;
  border-radius: 50px;
  background: var(--creme-dunkel);
  color: var(--text-mittel);
  text-transform: uppercase;
  letter-spacing: 0.04em;
  align-self: flex-start;
}

.edeka-karte-name {
  font-weight: 600;
  font-size: 0.92rem;
  color: var(--text-dunkel);
  line-height: 1.3;
}

.edeka-karte-preis {
  font-size: 1.2rem;
  font-weight: 800;
  color: #e30613;
  letter-spacing: -0.02em;
}

.edeka-karte-rabatt {
  font-size: 0.75rem;
  color: var(--text-hell);
}

.edeka-karte-meta {
  font-size: 0.72rem;
  color: var(--text-hell);
  margin-top: 2px;
}

.edeka-karte-gueltig {
  font-size: 0.72rem;
  color: var(--orange-warn);
  font-weight: 500;
}

.btn-edeka-zur-liste {
  margin-top: 6px;
  background: var(--gruen-dunkel);
  color: var(--auf-gruen);
  border: none;
  border-radius: var(--radius-klein);
  padding: 8px 12px;
  font-size: 0.8rem;
  font-weight: 600;
  cursor: pointer;
  font-family: var(--font-text);
  transition: background 0.2s;
  width: 100%;
}

.btn-edeka-zur-liste:hover { background: var(--gruen-mittel); }

/* Preis-Badge auf Einkaufslisten-Items */
.einkauf-angebot-badge {
  display: inline-block;
  margin-top: 3px;
  font-size: 0.7rem;
  background: rgba(227, 6, 19, 0.08);
  color: #c00;
  padding: 1px 8px;
  border-radius: 10px;
  font-weight: 600;
}

/* HAUSHALT BUTTON */
/*
  Der Haushalts-Knopf darf den Bildschirm nicht sprengen.

  Vorher hatte er nur white-space: nowrap und keine Breitengrenze: bei einem
  langen Haushaltsnamen wuchs er ueber den rechten Rand hinaus (gemessen 419
  statt 406 Pixel). Damit liess sich die GANZE Seite waagerecht wegschieben —
  in einer App fuehlt sich das kaputt an, und der Name war trotzdem
  abgeschnitten, nur ohne Hinweis darauf.

  min-width: 0 ist der entscheidende Teil: Flex-Elemente schrumpfen sonst
  nicht unter ihre Inhaltsbreite, egal welche max-width man setzt.
*/
.haushalt-menu { position: relative; min-width: 0; flex-shrink: 1; }
.btn-haushalt {
  background: transparent;
  border: 2px solid rgba(245,240,232,0.3);
  color: rgba(245,240,232,0.85);
  padding: 6px 14px;
  border-radius: 50px;
  cursor: pointer;
  font-size: 0.8rem;
  font-weight: 500;
  white-space: nowrap;
  display: inline-flex;
  align-items: center;
  gap: 5px;
  max-width: 100%;
  min-width: 0;
}
/* Der Name selbst wird gekuerzt — mit "…", damit man sieht dass da mehr steht. */
.btn-haushalt > span {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  min-width: 0;
}

/* POTTIS BALANCE im Header */
.btn-pottis-balance {
  background: linear-gradient(135deg, rgba(255, 215, 100, 0.18) 0%, rgba(255, 180, 60, 0.10) 100%);
  border: 2px solid rgba(255, 215, 100, 0.5);
  color: #ffd870;
  padding: 6px 12px;
  border-radius: 50px;
  cursor: pointer;
  font-size: 0.85rem;
  font-weight: 600;
  display: inline-flex;
  align-items: center;
  gap: 5px;
  margin-right: 8px;
  transition: transform 0.15s ease, box-shadow 0.15s ease;
}
.btn-pottis-balance:hover {
  transform: translateY(-1px);
  box-shadow: 0 4px 12px rgba(255, 200, 80, 0.25);
}
/* Die Potti-Muenze. Ersetzt das Emoji, das auf jedem Geraet anders aussah.
   Als Daten-Adresse eingebettet statt als Datei: keine neue Datei unter
   /static/ (Cloudflare-404 bei doppeltem Container) und im App-Paket ohne
   Pfadfragen. Quelle zum Bearbeiten: assets/potti.svg, danach hier neu
   einbetten (auch in landing.html). Im JS: POTTI_HTML. */
.potti { display: inline-block; width: 1.15em; height: 1.15em; vertical-align: -0.22em; flex: none;
  background: url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 64 64%22%3E%3Cdefs%3E%3ClinearGradient id=%22kante%22 x1=%220%22 y1=%220%22 x2=%220%22 y2=%221%22%3E%3Cstop offset=%220%22 stop-color=%22%23b27a22%22/%3E%3Cstop offset=%221%22 stop-color=%22%237a4f12%22/%3E%3C/linearGradient%3E%3ClinearGradient id=%22rand%22 x1=%220%22 y1=%220%22 x2=%221%22 y2=%221%22%3E%3Cstop offset=%220%22 stop-color=%22%23f6d77e%22/%3E%3Cstop offset=%220.5%22 stop-color=%22%23e2ad45%22/%3E%3Cstop offset=%221%22 stop-color=%22%23c08528%22/%3E%3C/linearGradient%3E%3ClinearGradient id=%22flaeche%22 x1=%220%22 y1=%220%22 x2=%221%22 y2=%221%22%3E%3Cstop offset=%220%22 stop-color=%22%23f9dc86%22/%3E%3Cstop offset=%220.5%22 stop-color=%22%23ebbb52%22/%3E%3Cstop offset=%221%22 stop-color=%22%23d79d36%22/%3E%3C/linearGradient%3E%3ClinearGradient id=%22streif%22 x1=%220%22 y1=%220%22 x2=%221%22 y2=%221%22%3E%3Cstop offset=%220.2%22 stop-color=%22%23fff8df%22 stop-opacity=%220%22/%3E%3Cstop offset=%220.3%22 stop-color=%22%23fff8df%22 stop-opacity=%220.5%22/%3E%3Cstop offset=%220.4%22 stop-color=%22%23fff8df%22 stop-opacity=%220%22/%3E%3C/linearGradient%3E%3C/defs%3E%3Ccircle cx=%2231%22 cy=%2233%22 r=%2230.5%22 fill=%22url(%23kante)%22/%3E%3Ccircle cx=%2231%22 cy=%2230%22 r=%2230.5%22 fill=%22url(%23rand)%22/%3E%3Cg stroke=%22%23a8721f%22 stroke-opacity=%220.5%22 stroke-width=%220.9%22%3E%3Cline x1=%2259.2%22 y1=%2230.0%22 x2=%2261.2%22 y2=%2230.0%22/%3E%3Cline x1=%2258.9%22 y1=%2233.6%22 x2=%2260.9%22 y2=%2233.9%22/%3E%3Cline x1=%2258.2%22 y1=%2237.3%22 x2=%2260.1%22 y2=%2237.8%22/%3E%3Cline x1=%2257.0%22 y1=%2240.7%22 x2=%2258.9%22 y2=%2241.5%22/%3E%3Cline x1=%2255.4%22 y1=%2244.1%22 x2=%2257.1%22 y2=%2245.1%22/%3E%3Cline x1=%2253.3%22 y1=%2247.1%22 x2=%2254.9%22 y2=%2248.3%22/%3E%3Cline x1=%2250.9%22 y1=%2249.9%22 x2=%2252.3%22 y2=%2251.3%22/%3E%3Cline x1=%2248.1%22 y1=%2252.3%22 x2=%2249.3%22 y2=%2253.9%22/%3E%3Cline x1=%2245.1%22 y1=%2254.4%22 x2=%2246.1%22 y2=%2256.1%22/%3E%3Cline x1=%2241.7%22 y1=%2256.0%22 x2=%2242.5%22 y2=%2257.9%22/%3E%3Cline x1=%2238.3%22 y1=%2257.2%22 x2=%2238.8%22 y2=%2259.1%22/%3E%3Cline x1=%2234.6%22 y1=%2257.9%22 x2=%2234.9%22 y2=%2259.9%22/%3E%3Cline x1=%2231.0%22 y1=%2258.2%22 x2=%2231.0%22 y2=%2260.2%22/%3E%3Cline x1=%2227.3%22 y1=%2257.9%22 x2=%2227.0%22 y2=%2259.9%22/%3E%3Cline x1=%2223.7%22 y1=%2257.2%22 x2=%2223.1%22 y2=%2259.1%22/%3E%3Cline x1=%2220.2%22 y1=%2256.0%22 x2=%2219.4%22 y2=%2257.9%22/%3E%3Cline x1=%2216.9%22 y1=%2254.4%22 x2=%2215.9%22 y2=%2256.1%22/%3E%3Cline x1=%2213.8%22 y1=%2252.3%22 x2=%2212.6%22 y2=%2253.9%22/%3E%3Cline x1=%2211.0%22 y1=%2249.9%22 x2=%229.6%22 y2=%2251.3%22/%3E%3Cline x1=%228.6%22 y1=%2247.1%22 x2=%227.0%22 y2=%2248.3%22/%3E%3Cline x1=%226.5%22 y1=%2244.1%22 x2=%224.8%22 y2=%2245.1%22/%3E%3Cline x1=%224.9%22 y1=%2240.7%22 x2=%223.1%22 y2=%2241.5%22/%3E%3Cline x1=%223.7%22 y1=%2237.3%22 x2=%221.8%22 y2=%2237.8%22/%3E%3Cline x1=%223.0%22 y1=%2233.6%22 x2=%221.0%22 y2=%2233.9%22/%3E%3Cline x1=%222.8%22 y1=%2230.0%22 x2=%220.8%22 y2=%2230.0%22/%3E%3Cline x1=%223.0%22 y1=%2226.3%22 x2=%221.0%22 y2=%2226.0%22/%3E%3Cline x1=%223.7%22 y1=%2222.7%22 x2=%221.8%22 y2=%2222.1%22/%3E%3Cline x1=%224.9%22 y1=%2219.2%22 x2=%223.1%22 y2=%2218.4%22/%3E%3Cline x1=%226.5%22 y1=%2215.9%22 x2=%224.8%22 y2=%2214.9%22/%3E%3Cline x1=%228.6%22 y1=%2212.8%22 x2=%227.0%22 y2=%2211.6%22/%3E%3Cline x1=%2211.0%22 y1=%2210.0%22 x2=%229.6%22 y2=%228.6%22/%3E%3Cline x1=%2213.8%22 y1=%227.6%22 x2=%2212.6%22 y2=%226.0%22/%3E%3Cline x1=%2216.9%22 y1=%225.5%22 x2=%2215.9%22 y2=%223.8%22/%3E%3Cline x1=%2220.2%22 y1=%223.9%22 x2=%2219.4%22 y2=%222.1%22/%3E%3Cline x1=%2223.7%22 y1=%222.7%22 x2=%2223.1%22 y2=%220.8%22/%3E%3Cline x1=%2227.3%22 y1=%222.0%22 x2=%2227.0%22 y2=%220.0%22/%3E%3Cline x1=%2231.0%22 y1=%221.8%22 x2=%2231.0%22 y2=%22-0.2%22/%3E%3Cline x1=%2234.6%22 y1=%222.0%22 x2=%2234.9%22 y2=%220.0%22/%3E%3Cline x1=%2238.3%22 y1=%222.7%22 x2=%2238.8%22 y2=%220.8%22/%3E%3Cline x1=%2241.7%22 y1=%223.9%22 x2=%2242.5%22 y2=%222.1%22/%3E%3Cline x1=%2245.1%22 y1=%225.5%22 x2=%2246.1%22 y2=%223.8%22/%3E%3Cline x1=%2248.1%22 y1=%227.6%22 x2=%2249.3%22 y2=%226.0%22/%3E%3Cline x1=%2250.9%22 y1=%2210.0%22 x2=%2252.3%22 y2=%228.6%22/%3E%3Cline x1=%2253.3%22 y1=%2212.8%22 x2=%2254.9%22 y2=%2211.6%22/%3E%3Cline x1=%2255.4%22 y1=%2215.9%22 x2=%2257.1%22 y2=%2214.9%22/%3E%3Cline x1=%2257.0%22 y1=%2219.2%22 x2=%2258.9%22 y2=%2218.4%22/%3E%3Cline x1=%2258.2%22 y1=%2222.7%22 x2=%2260.1%22 y2=%2222.1%22/%3E%3Cline x1=%2258.9%22 y1=%2226.3%22 x2=%2260.9%22 y2=%2226.0%22/%3E%3C/g%3E%3Ccircle cx=%2231%22 cy=%2230%22 r=%2226.6%22 fill=%22%23b47c24%22/%3E%3Ccircle cx=%2231%22 cy=%2230.6%22 r=%2226%22 fill=%22url(%23flaeche)%22/%3E%3Cg transform=%22translate(-1 -2)%22%3E%3Cg transform=%22translate(0 0.9)%22 fill=%22%23fff3c8%22 fill-opacity=%220.7%22%3E%3Cpath d=%22M19 30h26v8.5c0 4.6-3.6 8-8 8h-10c-4.4 0-8-3.4-8-8z%22/%3E%3Crect x=%2217%22 y=%2226.2%22 width=%2230%22 height=%223.4%22 rx=%221.7%22/%3E%3C/g%3E%3Cg fill=%22%238a5612%22%3E%3Cpath d=%22M19 30h26v8.5c0 4.6-3.6 8-8 8h-10c-4.4 0-8-3.4-8-8z%22/%3E%3Cpath d=%22M19 32.5h-3.2a2.3 2.3 0 0 0 0 4.6H19z%22/%3E%3Cpath d=%22M45 32.5h3.2a2.3 2.3 0 0 1 0 4.6H45z%22/%3E%3Crect x=%2217%22 y=%2226.2%22 width=%2230%22 height=%223.4%22 rx=%221.7%22/%3E%3Crect x=%2229.6%22 y=%2222.6%22 width=%224.8%22 height=%223.4%22 rx=%221.4%22/%3E%3C/g%3E%3Cg fill=%22none%22 stroke=%22%238a5612%22 stroke-width=%222%22 stroke-linecap=%22round%22%3E%3Cpath d=%22M26.5 21c-1.6-1.6-1.6-3.4 0-5s1.6-3.4 0-5%22/%3E%3Cpath d=%22M38 21c-1.6-1.6-1.6-3.4 0-5s1.6-3.4 0-5%22/%3E%3C/g%3E%3C/g%3E%3Ccircle cx=%2231%22 cy=%2230%22 r=%2230.5%22 fill=%22url(%23streif)%22/%3E%3C/svg%3E") center / contain no-repeat; }
.btn-pottis-balance .pottis-icon { font-size: 1rem; }
.btn-pottis-balance .pottis-zahl { color: #fff5d0; font-weight: 700; }
.pottis-zahl-bump { animation: pottisBump 0.5s ease; }
@keyframes pottisBump {
  0%   { transform: scale(1);    color: #fff5d0; }
  35%  { transform: scale(1.45); color: #ffe066; }
  70%  { transform: scale(1.15); color: #ffe066; }
  100% { transform: scale(1);    color: #fff5d0; }
}

/* POTTIS COST-BADGE auf Buttons */
.pottis-cost-badge {
  display: inline-block;
  padding: 3px 9px;
  background: rgba(255, 215, 100, 0.22);
  color: #5c4a00;
  border: 1px solid rgba(255, 200, 80, 0.55);
  border-radius: 50px;
  font-size: 0.78rem;
  font-weight: 700;
  white-space: nowrap;
}
.pottis-cost-badge.nicht-genug {
  background: rgba(220, 80, 80, 0.18);
  color: #a33;
  border-color: rgba(200, 80, 80, 0.5);
}
.pottis-cost-badge.premium-active {
  background: linear-gradient(135deg, #ffe48a 0%, #ffd24d 100%);
  color: #4a3700;
  border-color: #f0c040;
}

/* Auf dunklem Hintergrund (btn-primary, .nav-btn-omapott etc.) braucht das
   Badge solides Gold statt transparentem Look — sonst kaum lesbar. */
.btn-primary .pottis-cost-badge,
.nav-btn-omapott .pottis-cost-badge {
  background: linear-gradient(135deg, #ffd24d 0%, #ffb938 100%);
  color: #3a2900;
  border-color: #e8a820;
  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15);
}
.btn-primary .pottis-cost-badge.nicht-genug {
  background: linear-gradient(135deg, #ff9090 0%, #e25c5c 100%);
  color: #fff;
  border-color: #c44;
}

/* POTTIS SHOP-MODAL */
.shop-modal-body { padding: 18px 20px; gap: 16px; display: flex; flex-direction: column; }

.shop-balance-box {
  text-align: center;
  padding: 14px;
  background: linear-gradient(135deg, #fffaf0 0%, #fff5d4 100%);
  border-radius: 12px;
  border: 1.5px solid #f0d890;
}
.shop-balance-zahl { font-size: 1.8rem; color: var(--text-dunkel); }
.shop-premium-status {
  margin-top: 6px;
  font-size: 0.9rem;
  color: var(--gruen-schrift);
  font-weight: 600;
  display: none;
}

.shop-streak-box {
  background: #fff7ed;
  border: 1px solid #ffe5c1;
  border-radius: 10px;
  padding: 14px;
}
/* Omas Erklaerung vor Googles Werbe-Einwilligung (nur App, _werbungOmaErklaert) */
.werbung-oma-overlay { position: fixed; inset: 0; z-index: 10001; background: rgba(26, 46, 26, 0.6); backdrop-filter: blur(4px);
  display: flex; align-items: center; justify-content: center; padding: 20px; }
.werbung-oma-karte { background: var(--creme); border-radius: var(--radius); padding: 24px 22px 20px; max-width: 380px; width: 100%;
  text-align: center; box-shadow: 0 12px 40px rgba(0, 0, 0, 0.3); animation: popIn 0.25s cubic-bezier(0.34, 1.56, 0.64, 1); }
.werbung-oma-bild { width: 84px; height: 84px; object-fit: contain; margin-bottom: 8px; }
.werbung-oma-titel { font-family: var(--font-titel); font-size: 1.35rem; color: var(--text-dunkel); margin: 0 0 10px; line-height: 1.25; }
.werbung-oma-text { font-size: 0.92rem; color: var(--text-dunkel); line-height: 1.5; margin: 0 0 10px; }
.werbung-oma-btn { margin-top: 8px; width: 100%; padding: 12px 18px; border: none; border-radius: 50px; background: var(--gruen-dunkel);
  color: #fff; font-weight: 700; font-size: 1rem; cursor: pointer; }
body.dark .werbung-oma-btn { background: var(--gruen-accent); color: #10200f; }

/* Pottis per Werbevideo (nur App) */
.shop-video-box {
  background: #f0f7f1;
  border: 1px solid #cfe5d4;
  border-radius: 10px;
  padding: 14px;
}
.shop-video-titel { font-weight: 700; color: var(--text-dunkel); margin-bottom: 4px; }
.shop-video-text { font-size: 0.85rem; color: var(--text-dunkel); margin-bottom: 10px; }
.shop-video-btn { width: 100%; padding: 10px 14px; border: none; border-radius: 10px; background: var(--gruen-accent); color: #fff; font-weight: 700; font-size: 0.95rem; cursor: pointer; }
.shop-video-btn:disabled { opacity: 0.6; cursor: default; }
body.dark .shop-video-box { background: #1e2a20; border-color: #2f4a35; }
.streak-titel { margin: 0 0 8px; font-size: 1rem; color: var(--text-dunkel); }
.streak-liste { list-style: none; padding: 0; margin: 0; font-size: 0.85rem; color: var(--text-dunkel); }
.streak-meilenstein { opacity: 0.5; padding: 2px 0; }
.streak-meilenstein.erreicht { opacity: 1; }

.shop-section-title { margin: 0 0 10px; font-size: 1rem; color: var(--text-dunkel); }

.shop-scope-toggle {
  display: flex;
  gap: 6px;
  margin-bottom: 12px;
  background: #f0f0f0;
  padding: 4px;
  border-radius: 8px;
}
.shop-scope-btn {
  flex: 1;
  padding: 8px;
  border: none;
  border-radius: 6px;
  cursor: pointer;
  font-size: 0.88rem;
  background: transparent;
  font-weight: 600;
  transition: all 0.18s ease;
  color: var(--text-mittel);
}
.shop-scope-btn.aktiv { background: #fff; color: var(--gruen-schrift); box-shadow: 0 1px 3px rgba(0,0,0,0.1); }
.shop-scope-btn:disabled { opacity: 0.45; cursor: not-allowed; }

.shop-pakete-liste { display: flex; flex-direction: column; gap: 8px; }
.shop-paket {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  padding: 12px 14px;
  background: #fff;
  border: 1.5px solid #e8e8e8;
  border-radius: 10px;
  transition: border-color 0.18s ease;
}
.shop-paket:hover { border-color: var(--gruen-accent); }
.shop-paket-label { font-weight: 600; color: var(--text-dunkel); font-size: 0.95rem; }

.shop-verdienen-hinweis {
  background: #f9f9f9;
  border-radius: 8px;
  padding: 12px;
  font-size: 0.85rem;
  color: var(--text-mittel);
}
.shop-verdienen-hinweis summary {
  cursor: pointer;
  font-weight: 600;
  color: var(--gruen-schrift);
}
.shop-verdienen-hinweis ul {
  margin: 10px 0 0;
  padding-left: 20px;
  line-height: 1.7;
  color: var(--text-mittel);
}
.shop-verdienen-hinweis strong { color: var(--text-dunkel); }

/* POTTIS UNZUREICHEND — Mini-Modal statt hässlicher Toast */
.pottis-unzureichend-overlay {
  position: fixed;
  inset: 0;
  background: rgba(0, 0, 0, 0.55);
  z-index: 10001;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 20px;
  animation: fadeIn 0.2s ease;
}
.pottis-unzureichend-modal {
  background: var(--weiss, #fff);
  border-radius: 16px;
  padding: 24px 22px 18px;
  max-width: 360px;
  width: 100%;
  text-align: center;
  box-shadow: 0 12px 40px rgba(0, 0, 0, 0.3);
  animation: popIn 0.25s cubic-bezier(0.34, 1.56, 0.64, 1);
  color: var(--text-dunkel);
}
.pu-icon {
  font-size: 3rem;
  margin-bottom: 6px;
  filter: drop-shadow(0 4px 8px rgba(255, 200, 80, 0.35));
}
.pu-titel { margin: 0 0 8px; font-size: 1.2rem; color: var(--text-dunkel); }
.pu-text { margin: 0 0 16px; font-size: 0.92rem; color: var(--text-mittel); line-height: 1.5; font-style: italic; }
.pottis-unzureichend-zahlen {
  background: linear-gradient(135deg, #fffaf0 0%, #fff5d4 100%);
  border: 1.5px solid #f0d890;
  border-radius: 10px;
  padding: 12px 16px;
  margin-bottom: 18px;
}
.pu-zeile {
  display: flex;
  justify-content: space-between;
  font-size: 0.9rem;
  padding: 3px 0;
  color: var(--text-dunkel);
}
.pu-zeile.pu-fehlt {
  border-top: 1px dashed rgba(0,0,0,0.18);
  margin-top: 4px;
  padding-top: 6px;
  font-weight: 700;
  color: #c44;
}
.pu-buttons { display: flex; flex-direction: column; gap: 8px; }
.pu-btn-primary {
  background: linear-gradient(135deg, #ffd24d 0%, #ffb938 100%);
  color: #3a2900;
  border: 1.5px solid #e8a820;
  padding: 12px 18px;
  border-radius: 50px;
  font-weight: 700;
  font-size: 0.95rem;
  cursor: pointer;
  box-shadow: 0 2px 8px rgba(255, 180, 60, 0.35);
}
.pu-btn-primary:hover { transform: translateY(-1px); }
.pu-btn-sekundaer {
  background: transparent;
  border: none;
  color: var(--text-hell);
  font-size: 0.85rem;
  padding: 8px;
  cursor: pointer;
}
@keyframes popIn {
  from { transform: scale(0.85); opacity: 0; }
  to   { transform: scale(1);    opacity: 1; }
}
body.dark .pottis-unzureichend-modal { background: #2a2a2a; }
body.dark .pottis-unzureichend-zahlen {
  background: linear-gradient(135deg, #3a3220 0%, #4a3a18 100%);
  border-color: #6a5520;
}
body.dark .pu-zeile.pu-fehlt { color: #ff8a8a; border-top-color: rgba(255,255,255,0.15); }

/* ── Pottis: Dashboard Streak-Mini ── */
.dash-streak-mini {
  font-size: 0.8rem;
  color: var(--text-hell);
  margin: 2px 0 0;
  cursor: pointer;
  user-select: none;
}
.dash-streak-mini:hover { color: var(--gruen-schrift); }

/* ── Pottis: Welcome Modal ── */
.pottis-welcome-schritte { display: flex; flex-direction: column; gap: 14px; text-align: left; }
.pottis-welcome-schritt { display: flex; align-items: flex-start; gap: 12px; }
.pws-icon { font-size: 1.5rem; flex-shrink: 0; width: 32px; text-align: center; margin-top: 1px; }
.pottis-welcome-schritt strong { display: block; font-size: 0.88rem; color: var(--gruen-schrift); margin-bottom: 2px; }
.pottis-welcome-schritt p { font-size: 0.8rem; color: var(--text-hell); margin: 0; line-height: 1.4; }

/* ── Pottis: Onboarding-Tooltip ── */
.pottis-onboarding-tooltip {
  position: fixed;
  z-index: 9500;
  background: var(--gruen-dunkel);
  color: #fff;
  border-radius: 12px;
  padding: 12px 14px 10px;
  max-width: 230px;
  font-size: 0.83rem;
  line-height: 1.45;
  box-shadow: 0 8px 24px rgba(0,0,0,0.3);
  animation: potTooltipEin 0.2s ease;
  pointer-events: auto;
}
.pottis-onboarding-tooltip.pfeil-oben::before {
  content: '';
  position: absolute;
  top: -7px;
  left: 18px;
  width: 14px;
  height: 14px;
  background: var(--gruen-dunkel);
  transform: rotate(45deg);
}
.pot-tooltip-close {
  display: block;
  margin-top: 9px;
  background: rgba(255,255,255,0.2);
  border: none;
  color: #fff;
  border-radius: 6px;
  padding: 5px 10px;
  font-size: 0.78rem;
  cursor: pointer;
  width: 100%;
  font-family: inherit;
}
.pot-tooltip-close:hover { background: rgba(255,255,255,0.3); }
@keyframes potTooltipEin {
  from { opacity: 0; transform: translateY(5px); }
  to   { opacity: 1; transform: none; }
}

/* DARK MODE Overrides */
body.dark .shop-balance-box {
  background: linear-gradient(135deg, #3a3220 0%, #4a3a18 100%);
  border-color: #6a5520;
}
body.dark .shop-streak-box {
  background: #2a2418;
  border-color: #4a3a18;
}
body.dark .shop-scope-toggle { background: #1f1f1f; }
body.dark .shop-scope-btn.aktiv { background: #3a3a3a; color: var(--gruen-accent); }
body.dark .shop-paket { background: #1f1f1f; border-color: #333; }
body.dark .shop-paket:hover { border-color: var(--gruen-accent); }
body.dark .shop-verdienen-hinweis { background: #1f1f1f; }
body.dark .shop-verdienen-hinweis summary { color: var(--gruen-accent); }
body.dark .shop-paket-btn.nicht-bezahlbar {
  background: #2a2a2a;
  color: #666;
  border-color: #333;
}
.shop-paket-btn {
  padding: 10px 18px;
  border-radius: 50px;
  cursor: pointer;
  border: 1.5px solid transparent;
  font-weight: 700;
  font-size: 0.92rem;
  white-space: nowrap;
  transition: transform 0.12s ease, box-shadow 0.15s ease;
}
.shop-paket-btn.bezahlbar {
  background: linear-gradient(135deg, #ffd24d 0%, #ffb938 100%);
  color: #3a2900;
  border-color: #e8a820;
  box-shadow: 0 2px 6px rgba(255, 180, 60, 0.35);
}
.shop-paket-btn.bezahlbar:hover {
  transform: translateY(-1px);
  box-shadow: 0 4px 12px rgba(255, 180, 60, 0.5);
}
.shop-paket-btn.nicht-bezahlbar {
  background: #f0f0f0;
  color: #999;
  border-color: #e0e0e0;
  cursor: not-allowed;
}
.btn-disabled { background: #e8e8e8 !important; color: #999 !important; cursor: not-allowed !important; }
.btn-kopieren { background: none; border: none; cursor: pointer; font-size: 1rem; padding: 2px 4px; }

/* HAUSHALT DRAWER */
.drawer-overlay { position: fixed; inset: 0; background: rgba(0,0,0,0.45); z-index: 400; }
/*
  HOEHE: dvh statt vh.

  In Chrome auf dem Handy ist 100vh die Hoehe OHNE Adressleiste. Ist sie
  eingeblendet, ragt der untere Rand unter den Bildschirm, und genau dort
  sitzt der Abmelden-Knopf: er war mal zu sehen und mal nicht, je nachdem
  ob man vorher gescrollt hatte.

  100dvh folgt dem tatsaechlich sichtbaren Bereich. Die vh-Zeile bleibt als
  Rueckfall fuer aeltere Browser stehen, neuere nehmen die zweite.
  In der App aendert sich nichts, dort gibt es keine Adressleiste.
*/
.haushalt-drawer { position: fixed; top: 0; right: 0; width: 300px; max-width: 90vw; height: 100vh; height: 100dvh; background: #fff; z-index: 401; display: flex; flex-direction: column; box-shadow: -4px 0 24px rgba(0,0,0,0.18); transform: translateX(100%); transition: transform 0.28s cubic-bezier(0.4,0,0.2,1); overflow-y: auto; }
.haushalt-drawer.offen { transform: translateX(0); }
/* Der Drawer beginnt bei top:0, sein Kopf braucht das Polster ebenfalls. */
.drawer-header { background: var(--gruen-dunkel); padding: calc(20px + var(--oben-frei)) 16px 16px; display: flex; align-items: flex-start; justify-content: space-between; gap: 10px; }
.drawer-haushalt-name { color: white; font-size: 1.1rem; font-weight: 700; margin-bottom: 4px; }
.drawer-code-zeile { display: flex; align-items: center; gap: 4px; }
.drawer-code-label { color: rgba(245,240,232,0.8); font-size: 0.8rem; }
.drawer-schliessen { background: rgba(255,255,255,0.15); border: none; color: white; width: 30px; height: 30px; border-radius: 50%; cursor: pointer; font-size: 1rem; flex-shrink: 0; display: flex; align-items: center; justify-content: center; }
.drawer-schliessen:hover { background: rgba(255,255,255,0.25); }
.drawer-mitglieder { padding: 12px 20px 4px; border-bottom: 1px solid #f0f0f0; }
.haushalt-mitglied { font-size: 0.85rem; color: #555; padding: 2px 0; }
.drawer-plz-zeile { display: flex; align-items: center; gap: 8px; padding: 10px 20px; border-bottom: 1px solid #f0f0f0; }
.drawer-plz-label { font-size: 0.85rem; color: #555; white-space: nowrap; }
.haushalt-plz-input { flex: 1; border: 1.5px solid #ddd; border-radius: 8px; padding: 6px 10px; font-size: 0.9rem; min-width: 0; outline: none; }
.haushalt-plz-input:focus { border-color: var(--gruen-mittel); }
.btn-plz-speichern { background: var(--gruen-mittel); border: none; color: white; border-radius: 8px; padding: 6px 12px; cursor: pointer; font-size: 0.9rem; flex-shrink: 0; }
.drawer-trennlinie { height: 1px; background: #f0f0f0; margin: 4px 0; }
.drawer-item { display: block; width: 100%; background: none; border: none; text-align: left; padding: 15px 20px; font-size: 0.95rem; color: #222; cursor: pointer; font-family: var(--font-text); border-bottom: 1px solid #f5f5f5; }
.drawer-item:hover { background: #f8f8f8; }
.drawer-item-rot { color: #c0392b; }
.drawer-item-rot:hover { background: #fff5f5; }
/* Der Abmelden-Knopf sass hinter Androids Knoepfen, siehe --unten-frei. */
.drawer-footer { margin-top: auto; padding: 16px 20px calc(16px + var(--unten-frei)); border-top: 1px solid #eee; }
.drawer-abmelden { width: 100%; background: var(--gruen-dunkel); color: white; border: none; padding: 11px; border-radius: 10px; font-size: 0.95rem; font-weight: 600; cursor: pointer; font-family: var(--font-text); }
.drawer-abmelden:hover { background: var(--gruen-mittel); }
/* Alte Klassen die noch anderswo referenziert werden */
.btn-kassenbuch { display: none; }
.btn-account-loeschen { display: none; }
.btn-abmelden { display: none; }

/* KASSENBUCH MODAL */
.modal-kassenbuch { max-width: 560px; width: 95vw; }
.kassenbuch-tabelle { width: 100%; border-collapse: collapse; font-size: 0.88rem; }
.kassenbuch-tabelle td { padding: 7px 10px; border-bottom: 1px solid rgba(0,0,0,0.05); vertical-align: middle; }
.kassenbuch-tabelle tr:last-child td { border-bottom: none; }
.kassenbuch-tabelle tr:hover td { background: rgba(0,0,0,0.02); }
.kb-datum { color: #888; font-size: 0.78rem; white-space: nowrap; width: 50px; }
.kb-betrag { text-align: right; font-weight: 600; color: var(--gruen-schrift); white-space: nowrap; font-variant-numeric: tabular-nums; }
.kb-betrag-minus { color: var(--rot-schrift); }
.kb-betrag-plus  { color: var(--gruen-schrift); }
.kb-nutzer-badge { display: inline-block; font-size: 0.72rem; background: var(--creme); color: var(--text-hell); border-radius: 10px; padding: 1px 7px; margin-left: 6px; vertical-align: middle; }
.feedback-typ-auswahl { display: flex; gap: 8px; }
.feedback-typ-btn { flex: 1; padding: 8px 6px; border: 2px solid var(--creme-dunkel); background: white; border-radius: 8px; cursor: pointer; font-size: 0.85rem; font-family: var(--font-text); color: var(--text-mittel); transition: all 0.15s; }
.feedback-typ-btn.aktiv { border-color: var(--gruen-hell); background: var(--gruen-hell); color: white; font-weight: 600; }
.feedback-typ-btn:hover:not(.aktiv) { border-color: var(--gruen-hell); color: var(--gruen-schrift); }
.kb-loeschen-btn { background: none; border: none; color: #bbb; cursor: pointer; font-size: 0.85rem; padding: 2px 6px; border-radius: 4px; }
.kb-loeschen-btn:hover { background: rgba(200,0,0,0.08); color: #c00; }
.kb-monat-gruppe { margin-bottom: 8px; border: 1px solid rgba(0,0,0,0.08); border-radius: var(--radius-klein); overflow: hidden; }
.kb-monat-header { display: flex; align-items: center; justify-content: space-between; padding: 10px 12px; background: var(--gruen-licht); cursor: pointer; user-select: none; gap: 8px; }
.kb-monat-header:hover { background: #d8e8d0; }
.kb-monat-name { font-weight: 600; font-size: 0.88rem; color: var(--gruen-schrift); flex: 1; }
/* Keine eigene Farbe: .kb-betrag-minus / -plus sollen entscheiden. */
.kb-monat-summe { font-weight: 700; font-size: 0.88rem; }
.kb-toggle { font-size: 0.7rem; color: #888; }
.kassenbuch-summe-zeile { padding: 12px 10px; text-align: right; font-weight: 700; font-size: 0.95rem; border-top: 2px solid var(--gruen-accent); margin-top: 4px; }

/* MHD DATUM EINGABE */
.mhd-eingabe { display: flex; align-items: center; gap: 4px; }
.mhd-feld { width: 52px; padding: 8px 6px; border: 1.5px solid var(--creme-dunkel); border-radius: var(--radius-klein); font-size: 0.95rem; font-family: var(--font-text); text-align: center; color: var(--text-dunkel); background: var(--weiss); -moz-appearance: textfield; }
.mhd-feld::-webkit-outer-spin-button,
.mhd-feld::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; }
.mhd-feld:focus { outline: none; border-color: var(--gruen-accent); }
.mhd-feld-jahr { width: 72px; }

/* Offene Tastatur (app.js _tastaturAnwenden): Fenster ruecken zusammen,
   damit Formulare wie "Lebensmittel bearbeiten" samt Ablaufdatum und
   Speichern-Knopf ueber die Tastatur passen (Emanuel 2026-10-21). */
html.tastatur-offen .modal-header { padding: 10px 20px 0; }
html.tastatur-offen .modal-titel { font-size: 1.1rem; }
html.tastatur-offen .modal-body { padding: 8px 20px; gap: 8px; }
html.tastatur-offen .form-gruppe { gap: 2px; }
html.tastatur-offen .form-label { font-size: 0.68rem; }
html.tastatur-offen .form-input { padding-top: 6px; padding-bottom: 6px; }
html.tastatur-offen .mhd-feld { padding-top: 5px; padding-bottom: 5px; }
html.tastatur-offen .modal-footer { padding: 6px 20px 10px; }
html.tastatur-offen .modal-footer .btn { padding-top: 7px; padding-bottom: 7px; }
.mhd-trenner { font-weight: 700; color: var(--text-mittel); font-size: 1.1rem; }

/* LM SUCHE + SORTIERUNG */
.lm-suche-wrapper { display: flex; align-items: center; }
.lm-suche-input { padding: 6px 12px; border: 1.5px solid var(--creme-dunkel); border-radius: 20px; font-size: 0.85rem; font-family: var(--font-text); background: var(--weiss); color: var(--text-dunkel); width: 180px; transition: border-color 0.2s; }
.lm-suche-input:focus { outline: none; border-color: var(--gruen-accent); }
.sort-gruppe { display: flex; gap: 4px; align-items: center; }
.sort-btn { padding: 5px 10px; border: 1.5px solid var(--creme-dunkel); border-radius: 20px; background: var(--weiss); color: var(--text-mittel); font-size: 0.78rem; font-family: var(--font-text); cursor: pointer; transition: all 0.15s; }
.sort-btn.aktiv { background: var(--gruen-dunkel); color: var(--auf-gruen); border-color: var(--gruen-dunkel); font-weight: 600; }
.sort-btn:hover:not(.aktiv) { border-color: var(--gruen-accent); color: var(--gruen-schrift); }

/* ─────────────────────────────────────────────
   DASHBOARD
   ───────────────────────────────────────────── */
/* ── DASHBOARD NEU ─────────────────────────────────────────────── */

.dash-header {
  padding: 4px 0 18px;
}
.dash-gruss {
  font-family: var(--font-titel);
  font-size: 1.7rem;
  color: var(--gruen-schrift);
  margin: 0;
  line-height: 1.15;
}
.dash-datum {
  font-size: 0.85rem;
  color: var(--text-hell);
  margin: 3px 0 0;
}

/* Tab-Kopf (einheitlicher Header-Stil für alle Tabs, wie Dashboard) */
.tab-kopf {
  padding: 8px 0 22px;
}
/* Statt Ueberschrift in Rezepte und Wochenplan, halb so hoch wie .tab-kopf */
.tab-kopf-platzhalter { height: 20px; }
.tab-kopf-titel {
  font-family: var(--font-titel);
  font-size: clamp(2rem, 5.5vw, 2.8rem);
  font-weight: 700;
  font-style: italic;
  color: var(--gruen-schrift);
  margin: 0;
  line-height: 1.1;
  letter-spacing: -0.03em;
  text-shadow: 0 1px 3px rgba(26,46,26,0.08);
}
.tab-kopf-sub {
  font-size: 0.85rem;
  color: var(--text-hell);
  margin: 6px 0 0;
  font-weight: 400;
  letter-spacing: 0.02em;
}
body.dark .tab-kopf-titel { color: var(--gruen-accent); text-shadow: none; }
body.dark .tab-kopf-sub   { color: var(--text-hell); }

/* Heute-Karte (volle Breite, mit Bild-Hintergrund) */
.dash-heute {
  position: relative;
  overflow: hidden;
  background: var(--gruen-dunkel);
  background-image: url('assets/dashboard-food.webp');
  background-position: 72% 82%;
  background-size: 230%;
  border-radius: var(--radius);
  padding: 18px;
  margin-bottom: 14px;
  cursor: pointer;
  box-shadow: 0 4px 16px var(--schatten);
  transition: transform 0.18s ease;
}
.dash-heute::before {
  content: '';
  position: absolute;
  inset: 0;
  background: linear-gradient(135deg, rgba(26,46,26,0.55) 20%, rgba(26,46,26,0.15) 100%);
  border-radius: var(--radius);
}
.dash-heute > * { position: relative; }
.dash-heute:hover { transform: translateY(-2px); }

.dash-heute-kopf {
  display: flex;
  align-items: center;
  gap: 7px;
  margin-bottom: 10px;
}
.dash-heute-icon { font-size: 1rem; }
.dash-heute-label {
  font-size: 0.7rem;
  font-weight: 700;
  letter-spacing: 0.09em;
  color: rgba(255,255,255,0.65);
}

/* 2×2 Grid */
.dash-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 12px;
  padding-bottom: 20px;
}
.dash-karte-breit { grid-column: 1 / -1; }
.dash-karte-ablauf { border-top-color: var(--orange-warn); }
.dash-wert-warn   { color: var(--orange-warn); }

.dash-karte {
  position: relative;
  overflow: hidden;
  background: var(--weiss);
  border-radius: var(--radius);
  padding: 16px;
  box-shadow: 0 2px 10px var(--schatten);
  cursor: pointer;
  transition: transform 0.18s ease, box-shadow 0.18s ease;
  border-top: 3px solid var(--gruen-hell);
}
.dash-karte:hover {
  transform: translateY(-2px);
  box-shadow: 0 6px 20px var(--schatten);
}
/* Dekoratives SVG-Icon rechts in jeder Karte */
.dash-karte-svg {
  position: absolute;
  right: -8px;
  bottom: -12px;
  width: 110px;
  height: 110px;
  color: var(--gruen-schrift);
  opacity: 0.16;
  pointer-events: none;
  z-index: 0;
}
.dash-karte > *:not(.dash-karte-svg) { position: relative; z-index: 1; }
.dash-karte-ablauf .dash-karte-svg { color: var(--orange-warn); opacity: 0.20; }

.dash-karte-kopf { margin-bottom: 10px; }
.dash-karte-label {
  font-size: 0.7rem;
  font-weight: 700;
  letter-spacing: 0.08em;
  color: var(--text-hell);
}

/* Inhalts-Klassen — dunkel auf weiß */
.dash-wert {
  font-family: var(--font-titel);
  font-size: 2.2rem;
  color: var(--gruen-schrift);
  line-height: 1.05;
  font-weight: 800;
}
.dash-sub {
  font-size: 0.82rem;
  color: var(--text-mittel);
  margin-top: 3px;
}
.dash-warn {
  font-size: 0.82rem;
  color: var(--orange-warn);
  font-weight: 600;
  margin-top: 3px;
}
.dash-ok {
  font-size: 0.82rem;
  color: var(--gruen-schrift);
  font-weight: 600;
  margin-top: 3px;
}

/* In der Heute-Karte: Text bleibt weiß */
.dash-heute .dash-wert  { color: #fff; }
.dash-heute .dash-sub   { color: rgba(255,255,255,0.78); }
.dash-heute .dash-warn  { color: #ffd17a; }
.dash-heute .dash-ok    { color: #a8e6a8; }

.dash-rezept-bild {
  width: 100%;
  height: 70px;
  object-fit: cover;
  border-radius: var(--radius-klein);
  margin-top: 4px;
}
.dash-rezept-name {
  font-size: 0.88rem;
  font-weight: 600;
  color: #fff;
  line-height: 1.3;
}
.dash-kein-rezept {
  font-size: 0.82rem;
  color: rgba(255,255,255,0.72);
  line-height: 1.4;
}

.dash-heute-slot {
  display: flex; align-items: center; gap: 10px;
  padding: 5px 0; border-bottom: 1px solid rgba(255,255,255,0.12);
}
.dash-heute-slot:last-child { border-bottom: none; }
.dash-heute-icon { font-size: 1.1rem; flex-shrink: 0; width: 22px; text-align: center; }
.dash-heute-info { flex: 1; min-width: 0; }
.dash-heute-label { font-size: 0.62rem; color: rgba(255,255,255,0.55); display: block; text-transform: uppercase; letter-spacing: 0.05em; }
.dash-heute-name { font-size: 0.82rem; font-weight: 600; color: #fff; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; display: block; }
.dash-heute-bild { width: 36px; height: 36px; border-radius: 6px; object-fit: cover; flex-shrink: 0; }

/* Die Mahlzeit, die gerade dran ist. Zurueckhaltend gehalten: die anderen
   sollen lesbar bleiben, es geht nur darum, den Blick zuerst hierher zu
   ziehen. Das Bild im Hintergrund gehoert zu dieser Zeile. */
.dash-heute-slot.dash-heute-dran .dash-heute-label { color: var(--gruen-accent); }
.dash-heute-slot.dash-heute-dran .dash-heute-name  { font-weight: 700; }
.dash-heute-jetzt {
  margin-left: 6px; padding: 1px 6px; border-radius: 20px;
  background: var(--gruen-accent); color: var(--gruen-schrift);
  font-size: 0.55rem; font-weight: 700; letter-spacing: 0.04em;
  vertical-align: 1px;
}

/* Zeilen, hinter denen ein Rezept liegt. Der Pfeil sagt das an, ohne dass
   man es ausprobieren muss. Zeilen ohne Rezept bekommen ihn nicht. */
.dash-heute-slot.dash-heute-klickbar { cursor: pointer; margin: 0 -6px; padding-left: 6px; padding-right: 6px; border-radius: 8px; }
.dash-heute-slot.dash-heute-klickbar:active { background: rgba(255,255,255,0.10); }
.dash-heute-pfeil { color: rgba(255,255,255,0.45); font-size: 1.1rem; flex-shrink: 0; line-height: 1; }

.btn-dash-planen {
  margin-top: auto;
  font-size: 0.76rem;
  padding: 6px 12px;
  background: rgba(255,255,255,0.2);
  color: #fff;
  border: 1px solid rgba(255,255,255,0.35);
  border-radius: 50px;
  cursor: pointer;
  font-family: var(--font-text);
  font-weight: 500;
  transition: background 0.2s;
  align-self: flex-start;
  backdrop-filter: blur(4px);
}

.btn-dash-planen:hover {
  background: rgba(255,255,255,0.32);
}

.dash-lade-text {
  color: var(--text-hell);
  font-size: 0.84rem;
}
.dash-heute .dash-lade-text { color: rgba(255,255,255,0.62); }

.dash-kassenbuch-betrag {
  font-family: var(--font-titel);
  font-size: 1.8rem;
  color: #fff;
  line-height: 1;
}

.dash-kassenbuch-detail {
  font-size: 0.78rem;
  color: rgba(255,255,255,0.75);
  line-height: 1.4;
}

@media (max-width: 600px) {
  .dashboard-grid { grid-template-columns: 1fr; }
}

/* ─────────────────────────────────────────────
   KÜHLSCHRANK STEUERLEISTE (3-Zeilen-Layout)
   ───────────────────────────────────────────── */
.lm-steuerleiste {
  display: flex;
  flex-direction: column;
  gap: 10px;
  margin-bottom: 20px;
}

/* Zeile 1: Suche volle Breite */
.lm-steuer-suche { width: 100%; }
.lm-steuer-suche .lm-suche-input { width: 100%; box-sizing: border-box; }

/* Zeile 2: Scan + Bon — hervorgehoben */
/* Abstand nach unten: darunter folgt die Auswahl-Leiste und teils noch
   der Bring!-Knopf. Ohne Abstand stapeln sich drei verschieden breite
   Knoepfe direkt aufeinander, das wirkt gedraengt. */
.lm-steuer-hauptaktionen { display: flex; gap: 8px; margin-bottom: 10px; }

/* Beide Knoepfe kleiner: sie nahmen zusammen ein Sechstel des Bildschirms
   ein, obwohl die Liste darunter das Eigentliche ist. Polster von 14 auf 9,
   Schrift eine Stufe runter, kein wuchtiger Schatten mehr. */
.lm-btn-scan-gross {
  flex: 2; background: var(--gruen-dunkel); color: #fff;
  font-size: 0.9rem; font-weight: 600; padding: 9px 14px;
  border-radius: 50px; border: none; cursor: pointer;
  box-shadow: 0 2px 8px rgba(46,125,50,0.22);
  display: flex; align-items: center; justify-content: center; gap: 7px;
  white-space: nowrap;
  transition: background 0.15s, transform 0.1s; font-family: var(--font-text);
}
.lm-btn-scan-gross:hover { background: var(--gruen-mittel); transform: translateY(-1px); }
.lm-btn-scan-gross:active { transform: translateY(0); }

.lm-btn-bon-gross {
  flex: 1; background: var(--weiss); color: var(--gruen-schrift);
  font-size: 0.86rem; font-weight: 600; padding: 9px 12px;
  border-radius: 50px; border: 2px solid var(--gruen-dunkel);
  cursor: pointer; display: flex; align-items: center; justify-content: center; gap: 6px;
  white-space: nowrap;
  transition: background 0.15s, color 0.15s; font-family: var(--font-text);
}
.lm-btn-bon-gross:hover { background: var(--gruen-dunkel); color: #fff; }

/* Zeile 1: Sort + Ansicht oben (eine durchgehende Zeile) */
.lm-steuer-top {
  display: flex;
  align-items: center;
  justify-content: space-between;
  flex-wrap: nowrap;
  gap: 8px;
}
.lm-steuer-top .sort-gruppe {
  display: flex;
  align-items: center;
  gap: 6px;
  flex-wrap: nowrap;
}
.lm-steuer-top .ansicht-toggle {
  flex-shrink: 0;
}

/* Zeile 4: Filter-Chips */
.lm-filter-scroll {
  display: flex; flex-wrap: nowrap; align-items: center;
  overflow-x: auto; gap: 6px;
  padding-bottom: 2px; scrollbar-width: none;
}
.lm-filter-scroll::-webkit-scrollbar { display: none; }

/* Kategorie-Dropdown im Filter-Chip-Look */
.lm-kategorie-dropdown {
  padding: 6px 14px;
  border: 2px solid var(--creme-dunkel);
  border-radius: 50px;
  background: var(--weiss);
  color: var(--text-mittel);
  font-family: var(--font-text);
  font-size: 0.8rem;
  font-weight: 500;
  cursor: pointer;
  appearance: none;
  -webkit-appearance: none;
  flex-shrink: 0;
  transition: all 0.2s ease;
}
.lm-kategorie-dropdown:focus { outline: none; border-color: var(--gruen-accent); }
.lm-kategorie-dropdown.aktiv {
  background: var(--gruen-dunkel);
  border-color: var(--gruen-dunkel);
  color: var(--auf-gruen);
}
body.dark .lm-kategorie-dropdown { background: #2a2a2a; color: #bbb; border-color: #444; }
body.dark .lm-kategorie-dropdown.aktiv { background: var(--gruen-mittel); color: white; }

/* Trennstrich zwischen Filter-Chips, Sort und Ansicht-Toggle */
.lm-chip-divider {
  display: inline-block;
  width: 1px; height: 18px;
  background: var(--creme-dunkel);
  flex-shrink: 0;
  margin: 0 4px;
  align-self: center;
}

/* Auswahl-Bar (leer wenn beide Buttons versteckt, nimmt dann keinen Platz ein) */
.lm-auswahl-bar {
  display: flex; gap: 8px; align-items: center; flex-wrap: wrap;
  margin-bottom: 10px;
}
.lm-auswahl-bar.versteckt { display: none; }

/* Dark Mode Scan/Bon */
body.dark .lm-btn-scan-gross { background: var(--gruen-mittel); box-shadow: none; }
body.dark .lm-btn-bon-gross  { background: #2a2a2a; color: var(--gruen-accent); border-color: var(--gruen-accent); }
body.dark .lm-btn-bon-gross:hover { background: var(--gruen-accent); color: #fff; }

/* Kleinere Buttons für die Aktionszeile */
.btn-sm { padding: 7px 14px !important; font-size: 0.82rem !important; }

/* PRODUKT-INFO (Scan) */
.produkt-info-box { display: flex; gap: 12px; background: var(--creme-dunkel); border-radius: var(--radius-klein); padding: 12px; margin-bottom: 4px; }
.produkt-info-bild { width: 64px; height: 64px; object-fit: contain; border-radius: 6px; background: white; flex-shrink: 0; }
.produkt-info-rechts { flex: 1; min-width: 0; }
.nutriscore-badge { display: inline-block; font-weight: 800; font-size: 0.85rem; padding: 2px 10px; border-radius: 20px; color: white; margin-bottom: 6px; }
.nutriscore-a { background: #1a9c3e; }
.nutriscore-b { background: #78bb42; }
.nutriscore-c { background: #f5c518; color: #333; }
.nutriscore-d { background: #ef8000; }
.nutriscore-e { background: #e63312; }
.naehrwert-zeile { display: flex; flex-wrap: wrap; gap: 8px; font-size: 0.78rem; color: var(--text-mittel); }
.naehrwert-item { background: white; border-radius: 6px; padding: 3px 8px; }
.naehrwert-item strong { color: var(--text-dunkel); }

/* LEBENSMITTEL KARTE BILD */
.karte-bild { width: 100%; max-width: 100%; height: 90px; object-fit: contain; border-radius: var(--radius-klein); background: var(--creme-dunkel); margin-bottom: 8px; display: block; }
.karte-bild-platzhalter { display: none; }

/* ═══════════════════════════════════════════════════════════
   DARK MODE
   ═══════════════════════════════════════════════════════════ */
body.dark {
  --creme         : #1a1a1a;
  --creme-dunkel  : #242424;
  --weiss         : #2a2a2a;
  --text-dunkel   : #e8e8e8;
  --text-mittel   : #aaaaaa;
  --text-hell     : #777777;
  --schatten      : rgba(0,0,0,0.4);
  /*
    Gruene Schrift wird hell. Nicht das kraeftige --gruen-accent nehmen:
    das ist fuer Akzente gedacht und leuchtet als Fliesstext unangenehm.
    Dieser Ton hat auf #1a1a1a einen Kontrast von rund 8:1, also deutlich
    ueber den geforderten 4.5.
  */
  --gruen-schrift : #9ccf9c;
  --rot-schrift   : #ef7a7a;
  background-color: #1a1a1a;
  color: #e8e8e8;
}
body.dark .header { background: #0f1f0f; }
body.dark .seite { background: #1a1a1a; }
body.dark .karte, body.dark .modal, body.dark .haushalt-drawer { background: #2a2a2a; color: #e8e8e8; }
body.dark .form-input, body.dark .haushalt-plz-input { background: #333; border-color: #444; color: #e8e8e8; }
body.dark .form-input::placeholder { color: #666; }
body.dark .btn-secondary { background: #333; color: #ccc; border-color: #444; }
body.dark .lm-karte, body.dark .einkauf-item, body.dark .plan-tag-karte { background: #2a2a2a; border-color: #3a3a3a; }
body.dark .nav-leiste { background: #0f1f0f; border-top-color: #2a2a2a; }
body.dark .nav-btn { color: #888; }
body.dark .nav-btn.active { color: var(--gruen-accent); }
body.dark .modal-overlay { background: rgba(0,0,0,0.7); }
body.dark .sektion-titel { color: #aaa; }
body.dark .lm-filter-scroll { background: #222; }
body.dark .lm-filter-btn { background: #333; color: #bbb; border-color: #444; }
body.dark .lm-filter-btn.aktiv { background: var(--gruen-mittel); color: white; border-color: var(--gruen-mittel); }
body.dark .einkauf-kat-header { background: #222; color: #888; }
body.dark .drawer-item { background: none; color: #ddd; border-bottom-color: #333; }
body.dark .drawer-item:hover { background: #333; }
body.dark .drawer-item-rot { color: #e88; }
body.dark .drawer-footer { border-top-color: #333; }
body.dark .drawer-mitglieder { border-bottom-color: #333; }
body.dark .drawer-trennlinie { background: #333; }
body.dark .haushalt-drawer { background: #2a2a2a; }
body.dark input, body.dark textarea { background: #333; color: #e8e8e8; border-color: #444; }
body.dark table th { background: #222; color: #888; }
/* Nur den Rahmen anfassen. Die Schriftfarbe hier zu setzen war zu grob:
   die Regel ist spezifischer als .kb-betrag-minus und faerbte im
   Kassenbuch jeden Betrag grau, egal ob Einnahme oder Ausgabe. Zellen
   ohne eigene Farbe erben ohnehin --text-dunkel, das im Dunkelmodus
   hell ist. */
body.dark table td { border-bottom-color: #333; }
body.dark .login-box, body.dark .karte { background: #2a2a2a; }
body.dark .login-trenner::before, body.dark .login-trenner::after { background: #444; }
body.dark .login-trenner span { background: #2a2a2a; color: #666; }

/* Login & Hero */
body.dark .login-overlay { background: #1a1a1a; }
body.dark .hero { filter: brightness(0.85); }
body.dark .hero-titel { color: #fff !important; }
body.dark .hero-sub { color: rgba(255,255,255,0.72) !important; }
body.dark .leer-zustand { color: #666; }
body.dark .leer-icon { opacity: 0.4; }

/* Modals */
body.dark .modal { background: #2a2a2a; color: #e8e8e8; }
body.dark .modal-header { background: #222; border-bottom-color: #333; }
body.dark .modal-titel { color: #e8e8e8; }
body.dark .modal-body { background: #2a2a2a; color: #e8e8e8; }
body.dark .modal-footer { background: #222; border-top-color: #333; }
body.dark .modal-schliessen { color: #aaa; }
body.dark .modal-schliessen:hover { background: #333; color: #fff; }
body.dark .form-label { color: #aaa; }

/* Buttons */
body.dark .btn-primary { background: var(--gruen-hell); }
body.dark .btn-danger-outline { border-color: #c0392b; color: #e88; }
body.dark .filter-btn { background: #333; color: #bbb; border-color: #444; }
body.dark .filter-btn.aktiv { background: var(--gruen-mittel); color: white; border-color: var(--gruen-mittel); }
body.dark .ansicht-toggle-btn { background: #333; color: #bbb; border-color: #444; }
body.dark .ansicht-toggle-btn.aktiv { background: var(--gruen-mittel); color: white; }
body.dark .sort-btn { background: #333; color: #bbb; border-color: #444; }

/* ── Mitbringen ────────────────────────────────────────────────── */
.aufgaben-badge {
  display: inline-flex; align-items: center; justify-content: center;
  background: var(--rot-warn); color: #fff; border-radius: 50%;
  width: 18px; height: 18px; font-size: 0.65rem; font-weight: 700;
  margin-left: 6px; flex-shrink: 0;
}
.aufgaben-karte {
  border-bottom: 1px solid var(--creme-dunkel); padding: 14px 16px;
}
.aufgaben-karte:last-child { border-bottom: none; }
.aufgaben-karte-header {
  display: flex; align-items: center; justify-content: space-between;
  margin-bottom: 8px;
}
.aufgaben-von   { font-weight: 600; font-size: 0.88rem; color: var(--text-dunkel); }
.aufgaben-faellig { font-size: 0.78rem; color: var(--text-hell); }
.aufgaben-produkte { margin: 0 0 10px 16px; padding: 0; font-size: 0.85rem; color: var(--text-mittel); }
.aufgaben-produkte li { margin-bottom: 3px; }
.aufgaben-aktionen { display: flex; gap: 8px; }
.mitbringen-eingabe-zeile { display: flex; gap: 6px; align-items: center; flex-wrap: wrap; }
.mitbringen-check-zeile {
  display: flex; align-items: center; gap: 10px;
  padding: 8px 0; border-bottom: 1px solid var(--creme-dunkel); cursor: pointer;
}
.mitbringen-check-zeile:last-child { border-bottom: none; }
.mitbringen-check-zeile input[type="checkbox"] {
  width: 18px; height: 18px; flex-shrink: 0; accent-color: var(--gruen-dunkel); cursor: pointer;
}
.mitbringen-check-zeile span { font-size: 0.88rem; color: var(--text-dunkel); flex: 1; }
.aufgaben-produkt-zeile {
  display: flex; align-items: center; justify-content: space-between;
  gap: 8px; padding: 6px 0; border-bottom: 1px solid var(--creme-dunkel);
}
.aufgaben-produkt-zeile:last-child { border-bottom: none; }
.aufgaben-produkt-zeile span { font-size: 0.85rem; color: var(--text-dunkel); flex: 1; }
.aufgaben-kat-select {
  font-size: 0.75rem; padding: 4px 6px; border-radius: 6px;
  border: 1px solid var(--creme-dunkel); background: var(--weiss);
  color: var(--text-dunkel); cursor: pointer; flex-shrink: 0;
}
body.dark .mitbringen-check-zeile { border-bottom-color: #333; }
body.dark .mitbringen-check-zeile span { color: #e0e0e0; }
body.dark .aufgaben-produkt-zeile { border-bottom-color: #333; }
body.dark .aufgaben-produkt-zeile span { color: #e0e0e0; }
body.dark .aufgaben-kat-select { background: #2a2a2a; color: #e0e0e0; border-color: #444; }
body.dark .aufgaben-karte  { border-bottom-color: #333; }
body.dark .aufgaben-von    { color: #e0e0e0; }

/* Bottom Navigation */
body.dark .bottom-nav { background: #111; border-top-color: #2a2a2a; }
body.dark .bottom-nav-btn { color: #666; }
body.dark .bottom-nav-btn.active { color: var(--gruen-accent); }
body.dark .bottom-nav-label { color: inherit; }
body.dark .bottom-nav-icon-omapott { box-shadow: 0 4px 16px rgba(0, 0, 0, 0.5); }

/* Lebensmittel-Karten Details */
body.dark .karte-name { color: #e8e8e8; }
body.dark .karte-menge { color: #aaa; }
body.dark .karte-kategorie-badge { background: #333; color: #aaa; }
body.dark .karte-aktionen { border-top-color: #3a3a3a; }

/* Einkaufsliste */
body.dark .einkauf-name { color: #e8e8e8; }
body.dark .einkauf-menge-text { color: #aaa; }
body.dark .einkauf-rezept-badge { background: #1a3a4a; color: #7bc; }

/* Wochenplan */
body.dark .plan-tag-header { border-bottom-color: #333; color: #aaa; }
body.dark .plan-eintrag { background: #333; border-color: #444; }
body.dark .plan-eintrag-name { color: #e8e8e8; }
body.dark .plan-eintrag-kategorie { color: #888; }

/* Rezepte */
body.dark .rezept-karte { background: #2a2a2a; border-color: #3a3a3a; }
body.dark .rezept-name { color: #e8e8e8; }
body.dark .rezept-kategorie { color: #888; }
body.dark .rezept-bild-platzhalter { background: #333; }
body.dark .rezepte-tab-leiste { background: #222; border-bottom-color: #333; }
body.dark .rezepte-tab-btn { color: #888; }
body.dark .rezepte-tab-btn.aktiv { color: var(--gruen-accent); border-bottom-color: var(--gruen-accent); }

/* Dashboard — Gradienten bleiben auch im Dark Mode, nur leicht dunkler */
body.dark .dashboard-kachel { filter: brightness(0.82); }
body.dark #dash-rezept, body.dark #dash-kuehlschrank,
body.dark #dash-einkauf, body.dark #dash-kassenbuch { filter: brightness(0.82); }
body.dark .dash-ok { color: var(--gruen-accent); }

/* Scanner & Sonstiges */
body.dark .scan-status { background: #222; color: #aaa; }
body.dark .scan-hinweis { color: #888; }
body.dark select { background: #333; color: #e8e8e8; border-color: #444; }
body.dark .lm-suche-input { background: #333; color: #e8e8e8; border-color: #444; }
body.dark .kueche-dropdown { background: #333; color: #e8e8e8; border-color: #444; }

/* ── Tutorial ── */
@keyframes tutorial-puls {
  0%,100% { box-shadow: 0 0 0 9999px rgba(0,0,0,0.65), 0 0 0 0 rgba(255,255,255,0.4); }
  50%      { box-shadow: 0 0 0 9999px rgba(0,0,0,0.65), 0 0 0 8px rgba(255,255,255,0); }
}
.tutorial-spotlight {
  position: fixed; border-radius: 12px;
  box-shadow: 0 0 0 9999px rgba(0,0,0,0.65);
  z-index: 8999; pointer-events: none;
  transition: top 0.35s cubic-bezier(.4,0,.2,1), left 0.35s cubic-bezier(.4,0,.2,1), width 0.35s cubic-bezier(.4,0,.2,1), height 0.35s cubic-bezier(.4,0,.2,1);
  animation: tutorial-puls 2s infinite;
}
.tutorial-tooltip {
  position: fixed; background: #fff; border-radius: 20px;
  padding: 0; max-width: 300px; width: 86vw; overflow: hidden;
  z-index: 9000; box-shadow: 0 12px 40px rgba(0,0,0,0.25);
  transition: top 0.35s cubic-bezier(.4,0,.2,1), left 0.35s cubic-bezier(.4,0,.2,1);
}
.tutorial-fortschritt-balken { height: 4px; background: #e8f0e8; width: 100%; }
.tutorial-fortschritt-fill { height: 4px; background: var(--gruen-dunkel); transition: width 0.4s ease; }
.tutorial-pott-kopf {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 14px 20px 8px;
  position: relative;
}
.tutorial-pott-avatar {
  width: 52px;
  height: 52px;
  border-radius: 50%;
  background: linear-gradient(145deg, var(--gruen-mittel), var(--gruen-dunkel));
  display: flex;
  align-items: center;
  justify-content: center;
  overflow: hidden;
  font-size: 1.55rem;
  border: 2px solid var(--weiss);
  box-shadow: 0 3px 10px rgba(0,0,0,0.15);
  flex-shrink: 0;
}
.tutorial-pott-avatar img {
  width: 100%;
  height: 100%;
  object-fit: contain;
}
.tutorial-pott-name {
  font-weight: 700;
  font-size: 0.95rem;
  color: var(--gruen-schrift);
  flex: 1;
}
.tutorial-pott-kopf .tutorial-emoji {
  font-size: 1.6rem;
  padding: 0;
  text-align: right;
  line-height: 1;
}
.tutorial-tooltip h3 { margin: 0 0 6px; font-size: 1.05rem; color: #1a2e1a; padding: 0 20px; }
.tutorial-tooltip p  { margin: 0 0 16px; font-size: 0.88rem; color: #555; line-height: 1.5; padding: 0 20px; }
.tutorial-nav { display: flex; justify-content: space-between; align-items: center; padding: 0 20px 16px; }
.tutorial-schritt-info { font-size: 0.78rem; color: #aaa; }
.btn-tutorial-weiter { background: var(--gruen-dunkel); color: #fff; border: none; border-radius: 10px; padding: 10px 18px; font-size: 0.9rem; cursor: pointer; font-family: inherit; }
.btn-tutorial-skip   { background: none; border: none; color: #aaa; font-size: 0.82rem; cursor: pointer; text-decoration: underline; font-family: inherit; }

/* ── Community Suchleiste ── */
.community-suche-bar { display: flex; gap: 8px; margin-top: 12px; flex-wrap: wrap; }
.community-suche-bar .form-input { flex: 1; min-width: 0; }
.community-suche-bar .kueche-dropdown { flex-shrink: 0; max-width: 160px; }
.community-import-bar { display: flex; gap: 8px; }
.community-import-bar .form-input { flex: 1; min-width: 0; }
.community-import-bar .btn { flex-shrink: 0; }

/* ── Benachrichtigungen Modal ── */
.notif-sektion { padding: 16px 20px; border-bottom: 1px solid var(--border, #e8e0d0); }
.notif-zeile { display: flex; align-items: flex-start; justify-content: space-between; gap: 12px; }
.notif-info { flex: 1; }
.notif-titel { font-size: 0.95rem; font-weight: 600; color: var(--text, #1a2e1a); margin-bottom: 2px; }
.notif-beschr { font-size: 0.8rem; color: var(--text-hell, #888); line-height: 1.4; }
.notif-sub { margin-top: 12px; transition: opacity 0.2s; }
.notif-label { font-size: 0.82rem; color: var(--text-hell, #888); display: block; margin-bottom: 4px; }
.notif-select { margin-bottom: 4px; }
.notif-toggle-label { position: relative; display: inline-block; width: 46px; height: 26px; flex-shrink: 0; cursor: pointer; margin-top: 2px; }
.notif-toggle-label input { opacity: 0; width: 0; height: 0; position: absolute; }
.notif-toggle-slider { position: absolute; inset: 0; background: #ccc; border-radius: 26px; transition: 0.3s; }
.notif-toggle-slider:before { content: ""; position: absolute; width: 20px; height: 20px; left: 3px; bottom: 3px; background: #fff; border-radius: 50%; transition: 0.3s; box-shadow: 0 1px 3px rgba(0,0,0,0.2); }
.notif-toggle-label input:checked + .notif-toggle-slider { background: #1a2e1a; }
.notif-toggle-label input:checked + .notif-toggle-slider:before { transform: translateX(20px); }
body.dark .notif-sektion { border-color: #333; }
body.dark .notif-titel { color: #e8e8e8; }

/* ══════════════════════════════════════════════════════════════════
   SCAN & COLLECT — Vollbild-Overlay
   ══════════════════════════════════════════════════════════════════ */

.sc-overlay {
  position: fixed;
  top: 0; left: 0; right: 0; bottom: 0;
  z-index: 300;
  background: var(--creme);
  display: flex;
  flex-direction: column;
  overflow: hidden;
}
.sc-overlay.versteckt { display: none; }

.sc-header {
  display: flex;
  align-items: center;
  gap: 10px;
  /* Oben zusaetzlich die Statusleiste freihalten, siehe --oben-frei. */
  padding: calc(14px + var(--oben-frei)) 16px 10px;
  background: var(--gruen-dunkel);
  color: var(--auf-gruen);
  flex-shrink: 0;
}
.sc-btn-beenden {
  background: none;
  border: none;
  color: var(--auf-gruen);
  font-size: 1rem;
  cursor: pointer;
  padding: 4px 8px;
  border-radius: 6px;
  white-space: nowrap;
}
.sc-btn-beenden:active { opacity: 0.7; }
.sc-titel {
  flex: 1;
  font-size: 1.1rem;
  font-weight: 700;
  margin: 0;
}
.sc-zaehler {
  font-size: 0.82rem;
  opacity: 0.85;
  white-space: nowrap;
}

.sc-aktionen {
  display: flex;
  gap: 10px;
  padding: 12px 14px;
  background: var(--creme-dunkel);
  flex-shrink: 0;
}
.sc-btn-scan, .sc-btn-manuell {
  flex: 1;
  padding: 11px 8px;
  font-size: 0.9rem;
  border-radius: 10px;
  border: none;
  cursor: pointer;
  font-weight: 600;
}
.sc-btn-scan {
  background: var(--gruen-dunkel);
  color: var(--auf-gruen);
}
.sc-btn-manuell {
  background: #fff;
  color: var(--gruen-schrift);
  border: 1.5px solid var(--gruen-dunkel);
}

.sc-liste-header {
  padding: 10px 16px 4px;
  font-size: 0.78rem;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 0.05em;
  color: var(--text-mittel);
  flex-shrink: 0;
}

.sc-scroll-container {
  flex: 1;
  overflow-y: auto;
  display: flex;
  flex-direction: column;
}

.sc-liste {
  flex: 1;
  overflow-y: auto;
  padding: 4px 14px 8px;
}

.sc-leer {
  text-align: center;
  padding: 40px 20px;
  color: var(--text-mittel);
  font-size: 0.9rem;
}

.sc-produkt-zeile {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 9px 0;
  border-bottom: 1px solid var(--creme-dunkel);
}
.sc-produkt-name {
  flex: 1;
  font-size: 0.9rem;
  font-weight: 500;
}
.sc-produkt-kat {
  font-size: 0.75rem;
  color: var(--text-mittel);
}
.sc-menge-ctrl {
  display: flex;
  align-items: center;
  gap: 4px;
}
.sc-menge-btn {
  width: 28px;
  height: 28px;
  border-radius: 50%;
  border: 1.5px solid var(--gruen-dunkel);
  background: #fff;
  color: var(--gruen-schrift);
  font-size: 0.95rem;
  font-weight: 700;
  cursor: pointer;
  display: flex;
  align-items: center;
  justify-content: center;
  line-height: 1;
  padding: 0;
}
.sc-menge-btn:active { background: var(--creme-dunkel); }
.sc-menge-wert {
  min-width: 26px;
  text-align: center;
  font-size: 0.9rem;
  font-weight: 600;
}
.sc-edit-btn { background: none; border: none; cursor: pointer; font-size: 1rem; padding: 4px 2px; opacity: 0.7; }
.sc-edit-btn:active { opacity: 1; }
.sc-unbekannt { background: rgba(255,160,50,0.10); border-left: 3px solid #f09820; padding-left: 8px; border-radius: 4px; }
.sc-unbekannt .sc-produkt-name { color: #c07000; }
.sc-edit-panel { background: var(--creme-dunkel); border-radius: 8px; padding: 10px 12px; margin: -4px 0 6px 0; display: flex; flex-direction: column; gap: 8px; }
.sc-edit-zeile { display: flex; align-items: center; gap: 8px; }
.sc-edit-label { font-size: 0.78rem; color: var(--text-mittel); min-width: 64px; }
.sc-edit-input { flex: 1; font-size: 0.85rem; padding: 5px 8px; border: 1px solid var(--border); border-radius: 6px; background: #fff; }
.sc-edit-speichern { align-self: flex-end; background: var(--gruen-dunkel); color: #fff; border: none; border-radius: 8px; padding: 6px 16px; font-size: 0.85rem; font-weight: 600; cursor: pointer; }

.sc-liste-inner { padding: 4px 14px 8px; }
.sc-bon-foto-toggle { width:100%; background:none; border:none; text-align:left; padding:10px 16px; font-size:0.85rem; color:var(--gruen-schrift); font-weight:600; cursor:pointer; }
.sc-bon-foto-img { display:block; width:calc(100% - 32px); margin:0 16px 10px; border-radius:8px; border:1px solid var(--creme-dunkel); }
.sc-bon-abschnitt-label { font-size:0.75rem; font-weight:600; color:var(--text-hell); text-align:center; padding:4px 0 2px; letter-spacing:0.04em; }

.sc-retry-ui { padding:12px 16px 4px; flex-shrink:0; }
.sc-retry-label { text-align:center; font-size:0.88rem; color:var(--text-mittel); margin-bottom:8px; }
.sc-retry-bar-container { height:6px; background:var(--creme-dunkel); border-radius:3px; }
.sc-retry-bar { height:100%; background:var(--gruen-dunkel); border-radius:3px; transition:width 0.5s ease; width:0%; }
.sc-retry-abbrechen { display:block; margin:10px auto 0; background:none; border:1px solid var(--border); border-radius:8px; padding:6px 22px; font-size:0.85rem; cursor:pointer; color:var(--text-mittel); }

#sc-bon-fehlend { margin-top: 8px; border-top: 2px solid var(--creme-dunkel); }
#sc-bon-fehlend .sc-liste-header { color: var(--gruen-schrift); }
.sc-bon-artikel {
  display: flex;
  align-items: center;
  padding: 10px 16px;
  gap: 10px;
  border-bottom: 1px solid var(--creme-dunkel);
  background: rgba(74,124,89,0.05);
}
.sc-bon-artikel .sc-produkt-name { flex: 1; font-size: 0.9rem; font-weight: 500; }
.sc-bon-artikel .sc-produkt-kat  { font-size: 0.75rem; color: var(--text-mittel); }
.sc-bon-add-btn {
  flex-shrink: 0;
  background: var(--gruen-dunkel);
  color: #fff;
  border: none;
  border-radius: 20px;
  padding: 6px 14px;
  font-size: 0.85rem;
  font-weight: 600;
  cursor: pointer;
}
.sc-bon-add-btn:active { opacity: 0.8; }

.sc-abschluss {
  display: flex;
  flex-direction: column;
  gap: 8px;
  /* env(safe-area-inset-bottom) allein reichte nicht: auf Android meldet
     das nur Display-Aussparungen, nicht die Navigationsleiste. Die Knoepfe
     lagen dahinter. Siehe --unten-frei. */
  padding: 12px 14px calc(14px + var(--unten-frei));
  background: var(--creme-dunkel);
  flex-shrink: 0;
}
.sc-btn-abschluss {
  width: 100%;
  padding: 13px;
  font-size: 1rem;
  font-weight: 700;
  background: var(--gruen-dunkel);
  color: var(--auf-gruen);
  border: none;
  border-radius: 12px;
  cursor: pointer;
}
.sc-btn-abschluss:disabled { opacity: 0.6; }
.sc-btn-ohne-bon {
  width: 100%;
  padding: 10px;
  font-size: 0.88rem;
  background: none;
  color: var(--text-mittel);
  border: 1.5px solid var(--creme-dunkel2, #ccc);
  border-radius: 10px;
  cursor: pointer;
}

/* ─── Scan&Collect Banner (aktive Session beim App-Start) ─── */
.sc-banner {
  display: flex;
  align-items: center;
  gap: 10px;
  /*
    Unten die Systemleiste freihalten. Seit targetSdk 36 reicht die
    WebView unter Androids Leisten, und auf Tablets liegt dort die
    Taskleiste. Ein Tester hat genau das gemeldet: der Knopf "Fortsetzen"
    lag unter den Symbolen der Taskleiste und war nicht zu treffen.
  */
  padding: 10px 14px calc(10px + var(--unten-frei));
  background: #2d6a4f;
  color: #fff;
  font-size: 0.88rem;
}
.sc-banner.versteckt { display: none; }
.sc-banner span { flex: 1; }
.sc-banner-btn {
  background: #fff;
  color: #2d6a4f;
  border: none;
  border-radius: 7px;
  padding: 5px 12px;
  font-weight: 700;
  cursor: pointer;
  font-size: 0.82rem;
}
.sc-banner-x {
  background: none;
  border: none;
  color: rgba(255,255,255,0.8);
  font-size: 1.1rem;
  cursor: pointer;
  padding: 2px 4px;
}

/* ═══════════════════════════════════════════════════════════
   OMA POTT (KI-Koch)
   ═══════════════════════════════════════════════════════════ */
.nav-btn-omapott { font-weight: 700; }
.bottom-nav-icon-omapott {
  width: 52px;
  height: 52px;
  display: flex;
  align-items: center;
  justify-content: center;
  background: var(--gruen-dunkel);
  border-radius: 50%;
  color: white;
  box-shadow: 0 4px 16px rgba(26, 46, 26, 0.3);
  margin-top: -20px;
  transition: transform 0.2s cubic-bezier(0.34, 1.56, 0.64, 1), background 0.2s;
}
.bottom-nav-icon-omapott svg { width: 26px; height: 26px; display: block; }
.bottom-nav-btn-omapott.active .bottom-nav-icon-omapott { background: var(--gruen-accent); box-shadow: 0 4px 20px rgba(109, 184, 109, 0.4); transform: scale(1.08); }
.bottom-nav-btn-omapott.active::before { background: transparent; }
.bottom-nav-btn-omapott .bottom-nav-label { color: var(--gruen-schrift); font-weight: 600; }

.omapott-begruessung-box {
  display: flex;
  gap: 14px;
  align-items: flex-start;
  background: var(--weiss);
  border-radius: var(--radius);
  padding: 18px 20px;
  margin: 0 16px 14px;
  box-shadow: 0 2px 12px var(--schatten);
  border-left: 4px solid var(--gruen-accent);
}
.omapott-avatar {
  font-size: 2.4rem;
  flex-shrink: 0;
  line-height: 1;
  width: 64px;
  height: 64px;
}
.omapott-avatar img {
  width: 100%;
  height: 100%;
  object-fit: contain;
  pointer-events: none;
}
.omapott-spruch {
  font-family: var(--font-titel);
  font-style: italic;
  font-size: 1.02rem;
  color: var(--text-dunkel);
  line-height: 1.5;
}

.omapott-status-leiste {
  margin: 0 16px 14px;
  padding: 10px 14px;
  background: var(--creme-dunkel);
  border-radius: var(--radius-klein);
  font-size: 0.88rem;
  color: var(--text-mittel);
  display: flex;
  gap: 12px;
  flex-wrap: wrap;
  justify-content: space-between;
  align-items: center;
}
.omapott-status-badge {
  display: inline-block;
  padding: 2px 10px;
  border-radius: 999px;
  font-size: 0.78rem;
  font-weight: 600;
  background: var(--gruen-accent);
  color: var(--auf-gruen);
}
.omapott-status-badge.premium { background: linear-gradient(135deg, #d4af37, #b8860b); }

/* ── Oma Pott schlanker Tab ── */
.oma-kochen-btn {
  width: 100%;
  font-size: 1.05rem;
  padding: 16px;
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 10px;
}
.oma-einst-link {
  font-size: 0.88rem;
  color: var(--text-hell, #888);
}

/* ── Oma Einstellungen Modal Sub-Tabs ── */
.oma-einst-tabs {
  display: flex;
  border-bottom: 1px solid var(--rand, #e0e0e0);
  padding: 0 16px;
  gap: 4px;
}
.oma-einst-tab {
  padding: 10px 16px;
  border: none;
  background: none;
  cursor: pointer;
  font-size: 0.9rem;
  font-family: var(--font-text);
  color: var(--text-hell, #888);
  border-bottom: 2px solid transparent;
  margin-bottom: -1px;
  transition: color 0.15s, border-color 0.15s;
}
.oma-einst-tab.aktiv {
  color: var(--gruen-dunkel, #2d5a27);
  border-bottom-color: var(--gruen-dunkel, #2d5a27);
  font-weight: 600;
}

.omapott-bereich {
  background: var(--weiss);
  border-radius: var(--radius);
  margin: 0 16px 14px;
  padding: 16px 20px;
  box-shadow: 0 1px 8px var(--schatten);
}
.omapott-bereich summary.omapott-titel {
  font-family: var(--font-titel);
  font-size: 1.25rem;
  font-weight: 700;
  color: var(--gruen-schrift);
  cursor: pointer;
  list-style: none;
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 4px 0;
}
.omapott-bereich summary.omapott-titel::after {
  content: "▼";
  font-size: 0.7rem;
  color: var(--text-hell);
  transition: transform 0.2s;
}
.omapott-bereich[open] summary.omapott-titel::after { transform: rotate(180deg); }
.omapott-sub {
  font-size: 0.85rem;
  color: var(--text-mittel);
  margin: 6px 0 14px;
}
.omapott-feldgruppe {
  padding: 12px 0;
  border-top: 1px solid var(--creme-dunkel);
}
.omapott-feldgruppe:first-of-type { border-top: none; padding-top: 0; }
.omapott-untertitel {
  font-size: 0.85rem;
  font-weight: 700;
  color: var(--gruen-schrift);
  text-transform: uppercase;
  letter-spacing: 0.04em;
  margin-bottom: 10px;
}
.omapott-grid-2 {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 10px;
}
@media (max-width: 480px) {
  .omapott-grid-2 { grid-template-columns: 1fr; }
}
.omapott-slider {
  width: 100%;
  accent-color: var(--gruen-accent);
  margin-top: 6px;
}

.omap-geschmack-liste {
  display: flex;
  flex-direction: column;
  gap: 8px;
  margin-bottom: 16px;
}
.omap-geschmack-eintrag {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 10px 12px;
  background: var(--creme);
  border-radius: var(--radius-klein);
  border-left: 3px solid var(--gruen-accent);
}
.omap-geschmack-eintrag.typ-neg { border-left-color: var(--rot-warn); }
.omap-geschmack-eintrag.typ-notiz { border-left-color: var(--text-hell); }
/* Allergien deutlich absetzen — sie sind keine Geschmacksfrage, und beim
   Durchsehen der Liste soll sofort auffallen, was davon gesundheitlich
   relevant ist. */
.omap-geschmack-eintrag.typ-allergie {
  border-left-width: 4px;
  border-left-color: var(--rot-warn);
  background: rgba(192, 57, 43, 0.06);
}
.omap-geschmack-eintrag.typ-allergie strong { color: var(--rot-schrift); }

/* Hinweis unter dem Allergie-Feld im Profil: was Oma zusaetzlich aus
   Gespraechen gelernt hat. */
.omap-gelernt-hinweis {
  margin-top: 6px;
  padding: 8px 10px;
  border-left: 3px solid var(--rot-warn);
  background: rgba(192, 57, 43, 0.06);
  border-radius: 0 6px 6px 0;
  font-size: 0.82rem;
  line-height: 1.45;
  color: var(--text-dunkel);
}
.omap-gelernt-hinweis span { color: var(--text-hell); font-size: 0.78rem; }
.omap-geschmack-eintrag-icon { font-size: 1.2rem; flex-shrink: 0; }
.omap-geschmack-eintrag-text { flex: 1; font-size: 0.9rem; }
.omap-geschmack-eintrag-kontext { font-size: 0.78rem; color: var(--text-hell); display: block; margin-top: 2px; }
.omap-geschmack-eintrag-loeschen {
  background: none;
  border: none;
  color: var(--text-hell);
  font-size: 1.1rem;
  cursor: pointer;
  padding: 4px 8px;
}
.omap-geschmack-eintrag-loeschen:hover { color: var(--rot-schrift); }
.omap-geschmack-neu {
  padding-top: 14px;
  border-top: 1px dashed var(--creme-dunkel);
}

.omapott-hinweis {
  background: var(--creme-dunkel);
  border-radius: var(--radius);
  padding: 14px 18px;
  margin: 0 16px 20px;
  color: var(--text-mittel);
  font-size: 0.9rem;
  line-height: 1.5;
}

/* ── OMA POTT: SCHWEBEND (Clippy-Style) — Landing-Look ── */
.pott-schwebend {
  position: fixed;
  bottom: 240px;
  right: 10px;
  z-index: 1500;
  cursor: grab;
  user-select: none;
  display: flex;
  align-items: flex-end;
  gap: 0;
  touch-action: none;
}
/*
  ⚠️ Die 240 Pixel oben sind der Platz fuer die untere Navileiste — und
  die gibt es nur UNTER 768 Pixeln Breite (siehe .bottom-nav). Auf
  Tablets und am Rechner steht die Navigation oben, dort landete Oma
  dadurch mitten im Inhalt und saß auf der Haushaltsbuch-Kachel. Von
  einem Tester gemeldet, mit Bildschirmfoto.

  Greift nur, solange der Nutzer sie nicht selbst verschoben hat: eine
  gespeicherte Position setzt pottPositionAnwenden() als Inline-Stil und
  gewinnt damit gegen diese Regel. Genau richtig so.
*/
@media (min-width: 769px) {
  .pott-schwebend { bottom: 28px; }
}
.pott-schwebend.wird-gezogen { cursor: grabbing; }
.pott-schwebend.wird-gezogen .pott-figur { animation: none; transform: scale(1.08); transition: none; }
.pott-schwebend.versteckt { display: none !important; }
@keyframes pottFliegtRein {
  from { transform: translateX(180px); opacity: 0; }
  to   { transform: translateX(0);     opacity: 1; }
}
@keyframes pottFliegtRaus {
  from { transform: translateX(0);     opacity: 1; }
  to   { transform: translateX(180px); opacity: 0; }
}
.pott-schwebend.fliegt-rein { animation: pottFliegtRein 0.55s cubic-bezier(0.34,1.56,0.64,1) forwards !important; }
.pott-schwebend.fliegt-raus { animation: pottFliegtRaus 0.35s ease-in forwards !important; }

/* ── Oma-Chat-Bubble ── */
.pott-chat-verlauf {
  flex: 1 1 0%;
  min-height: 0;
  overflow-y: auto;
  display: flex;
  flex-direction: column;
  gap: 8px;
  margin-bottom: 10px;
  scroll-behavior: smooth;
}
/* Chat-Bubble = Flex-Container damit Input immer unten bleibt, Verlauf schrumpft */
.pott-bubble-chat {
  display: flex !important;
  flex-direction: column;
  max-height: min(70vh, 560px);
  /* min-height entfernt — sonst überlauft sie */
}
.pott-bubble-chat .pott-bubble-kopf,
.pott-bubble-chat .pott-bubble-quelle,
.pott-bubble-chat .pott-chat-input-zeile,
.pott-bubble-chat .pott-chat-kosten,
.pott-bubble-chat > div[id$="-bild-vorschau"] { flex-shrink: 0; }
/* Mobile: Bubble nimmt fast volle Breite, oben/unten genug Platz */
@media (max-width: 640px) {
  .pott-bubble.pott-bubble-chat {
    left: 8px !important;
    right: 8px !important;
    bottom: 90px !important;
    top: auto !important;
    width: auto !important;
    max-width: none !important;
    max-height: calc(100dvh - 200px) !important;
  }
  /* Offene Tastatur: Seit targetSdk 36 legt sie sich ueber die App. Stand
     der Chat weiter bei 90px, lag das Eingabefeld dahinter, Android schob
     die ganze Seite hoch und der Chat-Kopf rutschte unter die Statusleiste.
     Darum direkt ueber die Tastatur setzen und die Hoehe begrenzen. */
  html.tastatur-offen .pott-bubble.pott-bubble-chat {
    bottom: calc(8px + var(--tastatur-hoehe)) !important;
    max-height: calc(100dvh - var(--tastatur-hoehe) - var(--oben-frei) - 16px) !important;
  }
}
.pott-chat-msg-oma { align-self: flex-start; background: #f0f7f0; border-radius: 12px 12px 12px 0; padding: 8px 11px; font-size: 0.84rem; line-height: 1.45; max-width: 88%; color: var(--text-dunkel); }
.pott-chat-msg-user { align-self: flex-end; background: var(--gruen-hell); color: #fff; border-radius: 12px 12px 0 12px; padding: 8px 11px; font-size: 0.84rem; line-height: 1.45; max-width: 88%; }
.pott-chat-msg-tipp { align-self: center; font-size: 0.75rem; color: var(--text-hell); font-style: italic; }
.pott-chat-input-zeile { display: flex; gap: 6px; align-items: center; }
.pott-chat-input { flex: 1; border: 1px solid var(--creme-dunkel); border-radius: 20px; padding: 7px 12px; font-size: 0.85rem; font-family: inherit; outline: none; }
.pott-chat-input:focus { border-color: var(--gruen-accent); }
.pott-chat-senden { background: var(--gruen-mittel); color: #fff; border: none; border-radius: 50%; width: 34px; height: 34px; cursor: pointer; font-size: 1.05rem; display: flex; align-items: center; justify-content: center; flex-shrink: 0; transition: background 0.15s; }
.pott-chat-senden:hover { background: var(--gruen-dunkel); }
.pott-chat-senden:disabled { opacity: 0.5; cursor: not-allowed; }
.pott-chat-bild-btn { background: var(--creme); color: var(--text-mittel); border: 1px solid var(--creme-dunkel); border-radius: 50%; width: 34px; height: 34px; cursor: pointer; font-size: 0.95rem; display: flex; align-items: center; justify-content: center; flex-shrink: 0; transition: background 0.15s; }
.pott-chat-bild-btn:hover { background: var(--creme-dunkel); }
.pott-chat-msg-bild { display: block; max-width: 220px; max-height: 220px; border-radius: 10px; margin-top: 6px; cursor: pointer; transition: transform 0.15s; object-fit: cover; }
.pott-chat-msg-bild:hover { transform: scale(1.02); }
.pott-chat-kosten { font-size: 0.7rem; color: var(--text-hell); text-align: right; margin-top: 3px; }

/* Lösch-Button (Mülleimer) im Chat-Header */
.pott-bubble-x-aktion {
  background: none;
  border: none;
  font-size: 1rem;
  cursor: pointer;
  padding: 2px 6px;
  margin-right: 4px;
  opacity: 0.55;
  transition: opacity 0.15s;
}
.pott-bubble-x-aktion:hover { opacity: 1; }

/* ── Oma-Bubble Quellen-Banner (z.B. "Vom Pott&Pann-Team") ── */
.pott-bubble-quelle {
  padding: 7px 11px;
  margin: 0 0 10px;
  border-radius: 8px;
  font-size: 0.78rem;
  font-weight: 600;
  line-height: 1.3;
  border-left: 3px solid;
}
.pott-bubble-quelle-team {
  background: linear-gradient(135deg, #fff8e7 0%, #ffe8a8 100%);
  color: #8b5a00;
  border-left-color: #d4a017;
}
.pott-bubble-quelle-ok {
  background: linear-gradient(135deg, #e8f5e9 0%, #c8e6c9 100%);
  color: #1b5e20;
  border-left-color: #2d5a27;
}
.pott-bubble-quelle-info {
  background: linear-gradient(135deg, #e3f2fd 0%, #bbdefb 100%);
  color: #0d47a1;
  border-left-color: #1565c0;
}
.pott-bubble-quelle-neutral {
  background: #f5f0e8;
  color: #555;
  border-left-color: #999;
}

/* Rezept-Karte in der Chat-Bubble */
.pott-chat-rezept-karte {
  align-self: flex-start;
  display: flex;
  align-items: center;
  gap: 10px;
  background: linear-gradient(135deg, #fff8e7 0%, #ffe8a8 100%);
  border: 2px solid #e0c878;
  border-radius: 12px;
  padding: 10px 12px;
  cursor: pointer;
  max-width: 92%;
  transition: transform 0.15s ease, box-shadow 0.15s ease;
}
.pott-chat-rezept-karte:hover {
  transform: translateY(-1px);
  box-shadow: 0 4px 12px rgba(0,0,0,0.12);
}
.pcrk-icon { font-size: 1.5rem; flex-shrink: 0; }
.pcrk-text { flex: 1; min-width: 0; }
.pcrk-name { font-weight: 700; font-size: 0.88rem; color: var(--gruen-schrift); }
.pcrk-meta { font-size: 0.72rem; color: var(--text-hell); margin-top: 2px; }
.pcrk-pfeil { font-size: 1.3rem; color: var(--gruen-schrift); font-weight: 700; flex-shrink: 0; }
.pott-figur {
  width: 140px;
  height: 140px;
  display: flex;
  align-items: center;
  justify-content: center;
  filter: drop-shadow(0 8px 18px rgba(26, 46, 26, 0.45));
  transition: filter 0.2s ease, transform 0.2s ease;
  animation: pottSchweben 3s ease-in-out infinite;
  position: relative;
}
.pott-figur:hover {
  filter: drop-shadow(0 10px 20px rgba(26, 46, 26, 0.45));
  transform: scale(1.05);
}
.pott-figur-bild {
  position: relative;
  z-index: 1;
  width: 100%;
  height: 100%;
  object-fit: contain;
  pointer-events: none;
  -webkit-user-drag: none;
  user-select: none;
}
@keyframes pottSchweben {
  0%, 100% { transform: translateY(0); }
  50%      { transform: translateY(-7px); }
}
.pott-figur-pulse {
  position: absolute;
  inset: 8%;
  border-radius: 50%;
  background: radial-gradient(circle, rgba(106, 171, 122, 0.55) 0%, transparent 70%);
  animation: pottPulse 2.5s ease-out infinite;
  pointer-events: none;
  z-index: 0;
}
.pott-sparkle {
  position: fixed;
  font-size: 1.4rem;
  pointer-events: none;
  z-index: 1600;
  animation: sparkleFly 0.9s ease-out forwards;
}
@keyframes sparkleFly {
  0%   { transform: translate(0, 0) scale(0.4) rotate(0deg);                opacity: 0; }
  15%  {                                                                     opacity: 1; }
  100% { transform: translate(var(--dx), var(--dy)) scale(1.4) rotate(180deg); opacity: 0; }
}
@keyframes pottPulse {
  0% { transform: scale(1); opacity: 0.5; }
  100% { transform: scale(1.6); opacity: 0; }
}
.pott-bubble {
  position: fixed;
  bottom: 160px;
  right: 20px;
  max-width: 340px;
  width: calc(100vw - 40px);
  background: #ffffff;
  border-radius: 18px;
  padding: 18px 20px 16px;
  box-shadow: 0 12px 40px rgba(0,0,0,0.18);
  border: 2px solid #6aab7a;
  z-index: 1501;
  animation: pottBubbleEin 0.3s ease;
  font-size: 0.95rem;
  line-height: 1.55;
  color: #1a1a1a;
}
@keyframes pottBubbleEin {
  from { opacity: 0; transform: translateY(10px) scale(0.95); }
  to   { opacity: 1; transform: none; }
}
.pott-bubble::after {
  content: "";
  position: absolute;
  bottom: -10px;
  right: 28px;
  width: 20px;
  height: 20px;
  background: #ffffff;
  border-right: 2px solid #6aab7a;
  border-bottom: 2px solid #6aab7a;
  transform: rotate(45deg);
}
.pott-bubble-kopf {
  display: flex;
  justify-content: space-between;
  align-items: center;
  margin-bottom: 8px;
}
.pott-bubble-name {
  font-weight: 700;
  color: #2d5a27;
  font-size: 1.05rem;
}
.pott-bubble-x {
  background: none;
  border: none;
  font-size: 1.2rem;
  color: #666;
  cursor: pointer;
  padding: 0;
  line-height: 1;
}
.pott-bubble-x:hover { color: #1a1a1a; }
.pott-bubble-text { margin-bottom: 14px; }
.pott-bubble-btns { display: flex; gap: 8px; flex-wrap: wrap; }
.pott-bubble-btn {
  flex: 1;
  min-width: 100px;
  padding: 9px 14px;
  border-radius: 50px;
  font-size: 0.85rem;
  font-weight: 600;
  cursor: pointer;
  border: none;
  transition: transform 0.15s, background 0.15s;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 6px;
}
.pott-bubble-btn.primaer .pottis-cost-badge {
  background: rgba(255, 215, 100, 0.95);
  color: #3a2900;
  border-color: rgba(232, 168, 32, 0.9);
}
.pott-bubble-btn:hover { transform: translateY(-1px); }
.pott-bubble-btn.primaer { background: #4a7c59; color: #ffffff; }
.pott-bubble-btn.primaer:hover { background: #2d5a27; }
.pott-bubble-btn.sekundaer { background: #f5f0e8; color: #666; }
.pott-bubble-btn.sekundaer:hover { background: #ebe5d7; }
.pott-bubble-fortschritt {
  font-size: 0.78rem;
  color: #666;
  margin-top: 10px;
  text-align: center;
}
@media (max-width: 480px) {
  .pott-schwebend { bottom: 240px; right: 8px; }
  .pott-figur { width: 110px; height: 110px; }
  .pott-bubble { bottom: 160px; right: 12px; }
}

/* ============================================================
   OMA POTT — Phase 3: Vorschlag-Modal (Oma-Karte)
   ============================================================ */
.oma-modal-overlay {
  position: fixed;
  inset: 0;
  background: rgba(0,0,0,0.55);
  z-index: 3000;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 16px;
}
.oma-modal {
  background: #fff;
  border-radius: 18px;
  width: 100%;
  max-width: 480px;
  /* Systemleisten abziehen, sonst ragt das zentrierte Modal dahinter.
     Auf schmalen Bildschirmen gilt die Regel weiter unten im @media-Block. */
  max-height: calc(88vh - var(--oben-frei) - var(--unten-modal));
  display: flex;
  flex-direction: column;
  box-shadow: 0 8px 40px rgba(0,0,0,0.22);
  overflow: hidden;
}
.oma-modal-kopf {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 16px 20px 12px;
  border-bottom: 1px solid #f0ece4;
  font-weight: 700;
  font-size: 1rem;
  color: #2d4a2d;
  background: #f5f0e8;
  flex-shrink: 0;
}
.oma-modal-x {
  background: none;
  border: none;
  font-size: 1.1rem;
  cursor: pointer;
  color: #888;
  padding: 0 4px;
}
.oma-modal-x:hover { color: #333; }
.oma-modal-body {
  overflow-y: auto;
  padding: 18px 20px;
  flex: 1;
}

/* ── Omas Wochen-Vorschläge ───────────────────────────────────
   Oma liefert einen Schwung Rezepte, der Nutzer verteilt sie selbst
   über das bestehende Einplanen-Modal. */
/* Omas Vorschlaege (2026-10-21): Reiter je Mahlzeit, kompakte Karten, ohne Scrollen */
.wv-body { padding-top: 6px; }
/* Am Handy mittig mit Rand statt als Blatt von unten (die allgemeine
   .oma-modal-Regel im @media-Block weiter unten setzt flex-end). */
@media (max-width: 640px) {
  .oma-modal-overlay.wv-overlay { align-items: center; padding: 10px; padding-bottom: calc(10px + var(--tastatur-hoehe)); }
  .oma-modal.wv-modal { border-radius: 18px; align-self: auto; max-height: calc(92vh - var(--oben-frei) - var(--unten-modal)); }
  .oma-modal.wv-modal .oma-modal-body { padding-bottom: 18px; }
}
.wv-reiter { display: grid; gap: 4px; background: var(--creme); padding: 4px; border-radius: 14px; margin-bottom: 12px; }
.wv-reiter button { border: 0; background: transparent; color: var(--text-mittel); font-family: var(--font-text); font-size: 0.84rem; font-weight: 600; padding: 7px 4px; border-radius: 10px; cursor: pointer; display: flex; flex-direction: column; align-items: center; gap: 1px; line-height: 1.15; }
.wv-reiter button small { font-weight: 500; font-size: 0.7rem; color: var(--text-hell); }
.wv-reiter button[aria-selected="true"] { background: var(--weiss); color: var(--text-dunkel); box-shadow: 0 1px 4px rgba(26,46,26,0.15); }
.wv-liste { display: flex; flex-direction: column; gap: 6px; }
.wv-karte { display: grid; grid-template-columns: 44px minmax(0,1fr) auto; gap: 10px; align-items: center; background: var(--creme); border-radius: 12px; padding: 7px 8px 7px 7px; cursor: pointer; transition: opacity 0.2s, background 0.2s; }
.wv-karte-fertig { opacity: 0.6; }
.wv-bild { width: 44px; height: 44px; border-radius: 9px; object-fit: cover; flex-shrink: 0; }
.wv-bild-leer { background: var(--creme-dunkel); display: flex; align-items: center; justify-content: center; font-size: 1.3rem; }
body.dark .wv-bild-leer { background: #2a2a2a; }
.wv-name { font-family: var(--font-titel); font-size: 0.9rem; line-height: 1.2; color: var(--gruen-schrift); overflow: hidden; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; min-width: 0; }
.wv-kommentar { grid-column: 1 / -1; font-size: 0.8rem; color: var(--text-mittel); line-height: 1.4; font-style: italic; padding: 0 4px 2px; }
.wv-aktion { flex-shrink: 0; }
.wv-btn { padding: 7px 10px; font-size: 0.78rem; white-space: nowrap; border-radius: 9px; }
.wv-blaettern { display: flex; align-items: center; justify-content: center; gap: 14px; margin-top: 8px; font-size: 0.85rem; color: var(--text-mittel); font-variant-numeric: tabular-nums; }
.wv-blaettern button { width: 34px; height: 34px; border-radius: 50%; border: 0; background: var(--creme); color: var(--text-dunkel); font-size: 1.05rem; cursor: pointer; }
.wv-blaettern button:disabled { opacity: 0.35; cursor: default; }
.wv-eingeplant { font-size: 0.74rem; color: var(--gruen-mittel, #4a7c4a); font-weight: 600; white-space: nowrap; text-align: right; display: block; }

/* Schmale Displays: Knopf unter den Rezeptnamen statt daneben */
@media (max-width: 400px) {
  .wv-karte { flex-direction: column; align-items: stretch; gap: 8px; }
  .wv-btn { width: 100%; }
  .wv-eingeplant { text-align: center; display: block; }
}

/* ── Omas Wochenplan-Ergebnis (ungenutzt, seit die Vorschlagsliste
   die Ergebnisanzeige ersetzt hat — schadet nicht, kann bei einer
   späteren CSS-Aufräumrunde weg) ──────────────────────────────
   Zeigt nach dem Planen, was Oma eingeplant hat — nach Tagen gruppiert.
   Vorher gab es nur ein "X Mahlzeiten eingeplant" und der Nutzer musste
   sich die Woche selbst zusammensuchen. */
.oma-plan-intro {
  font-size: 0.92rem;
  color: var(--text-mittel);
  line-height: 1.6;
  margin: 0 0 14px;
}
.oma-plan-liste { display: flex; flex-direction: column; gap: 12px; }
.oma-plan-tag {
  background: var(--creme);
  border-radius: var(--radius-klein);
  padding: 10px 12px;
}
.oma-plan-tag-name {
  font-family: var(--font-titel);
  font-size: 0.92rem;
  color: var(--gruen-schrift);
  margin-bottom: 6px;
}
.oma-plan-zeile {
  display: flex;
  gap: 10px;
  align-items: baseline;
  padding: 3px 0;
}
.oma-plan-typ {
  flex: 0 0 88px;
  font-size: 0.75rem;
  color: var(--text-hell);
  text-transform: uppercase;
  letter-spacing: 0.03em;
}
.oma-plan-name {
  flex: 1;
  font-size: 0.9rem;
  color: var(--text-dunkel);
  line-height: 1.4;
}
.oma-plan-ok { width: 100%; margin-top: 16px; }

/* Schmale Displays: Mahlzeit-Label über den Namen statt daneben */
@media (max-width: 380px) {
  .oma-plan-zeile { flex-direction: column; gap: 1px; }
  .oma-plan-typ { flex: none; }
}

/* Loading */
.oma-loading {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  min-height: 160px;
  gap: 18px;
}
.oma-lade-punkte { display: flex; gap: 8px; }
.oma-lade-punkte span {
  width: 10px; height: 10px;
  border-radius: 50%;
  background: #4a7c59;
  animation: omaPuls 1.2s infinite ease-in-out;
}
.oma-lade-punkte span:nth-child(2) { animation-delay: 0.2s; }
.oma-lade-punkte span:nth-child(3) { animation-delay: 0.4s; }
@keyframes omaPuls {
  0%, 80%, 100% { transform: scale(0.6); opacity: 0.4; }
  40%           { transform: scale(1);   opacity: 1; }
}
.oma-lade-text { color: #666; font-size: 0.9rem; }

/* Inhalt */
.oma-kommentar {
  font-style: italic;
  color: #4a7c59;
  background: #f0f7f0;
  border-radius: 10px;
  padding: 12px 14px;
  margin-bottom: 14px;
  font-size: 0.92rem;
  line-height: 1.5;
}
.oma-warnung {
  background: #fff8e1;
  border: 1px solid #ffe082;
  border-radius: 8px;
  padding: 8px 12px;
  font-size: 0.82rem;
  color: #7a6000;
  margin-bottom: 12px;
}
.oma-rezept-kopf { margin-bottom: 12px; }
.oma-rezept-name { font-size: 1.05rem; color: #1a1a1a; display: block; margin-bottom: 4px; }
.oma-rezept-meta { font-size: 0.82rem; color: #777; }
.oma-abschnitt { margin-bottom: 14px; }
.oma-abschnitt strong { font-size: 0.85rem; text-transform: uppercase; letter-spacing: 0.04em; color: #555; display: block; margin-bottom: 6px; }
.oma-zutaten { margin: 0; padding-left: 18px; }
.oma-zutaten li { font-size: 0.9rem; margin-bottom: 3px; color: #333; }
.oma-anleitung { font-size: 0.9rem; color: #333; line-height: 1.6; white-space: pre-line; }

/* Aktionen */
.oma-aktionen { border-top: 1px solid #f0ece4; padding-top: 14px; margin-top: 14px; display: flex; flex-direction: column; gap: 10px; }
.oma-feedback-reihe { display: flex; gap: 8px; }
.oma-btn-gut, .oma-btn-schlecht {
  flex: 1;
  /* min-width: 0 ist Pflicht, sonst laesst ein Flex-Kind sich nicht unter
     seine Inhaltsbreite druecken und schiebt die Reihe ueber den Rand.
     "Nicht mein Geschmack" ist deutlich breiter als das fruehere "Noe". */
  min-width: 0;
  padding: 9px 6px;
  border-radius: 50px;
  font-size: 0.86rem;
  font-weight: 600;
  line-height: 1.2;
  cursor: pointer;
  border: 2px solid;
  transition: background 0.15s;
}
.oma-btn-gut     { border-color: #4a7c59; color: #4a7c59; background: transparent; }
.oma-btn-gut:hover     { background: #4a7c59; color: #fff; }
.oma-btn-gut:disabled, .oma-btn-schlecht:disabled { opacity: 0.5; cursor: default; }
.oma-btn-schlecht { border-color: #c0392b; color: #c0392b; background: transparent; }
.oma-btn-schlecht:hover { background: #c0392b; color: #fff; }

/* Sterne-Bewertung */
.oma-sterne-reihe { display: flex; align-items: center; gap: 4px; flex-wrap: wrap; }
.oma-sterne-label { font-size: 0.82rem; color: #666; margin-right: 4px; }
.oma-stern {
  background: none; border: none; font-size: 1.3rem;
  cursor: pointer; color: #f39c12; padding: 0 2px;
  transition: transform 0.1s;
}
.oma-stern:hover { transform: scale(1.2); }
.oma-stern:disabled { cursor: default; }

.oma-plan-reihe { display: flex; gap: 8px; }
.oma-btn-aktion {
  flex: 1;
  padding: 8px 0;
  border-radius: 50px;
  font-size: 0.84rem;
  font-weight: 600;
  cursor: pointer;
  border: none;
  background: #f5f0e8;
  color: #4a4a4a;
  transition: background 0.15s;
}
.oma-btn-aktion:hover { background: #ebe5d7; }

.oma-alt-reihe { display: flex; gap: 8px; }
.oma-btn-alt {
  flex: 1;
  padding: 7px 10px;
  border-radius: 50px;
  font-size: 0.82rem;
  font-weight: 600;
  cursor: pointer;
  border: 1px solid #ccc;
  background: transparent;
  color: #666;
  transition: background 0.15s, border-color 0.15s;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 6px;
}
.oma-btn-alt:hover { background: #f5f0e8; border-color: #bbb; }
.oma-btn-alt .pottis-cost-badge { font-size: 0.7rem; padding: 2px 6px; }

.oma-btn-speichern {
  width: 100%;
  padding: 9px;
  border-radius: 50px;
  font-size: 0.88rem;
  font-weight: 600;
  cursor: pointer;
  border: 2px solid #2980b9;
  color: #2980b9;
  background: transparent;
  transition: background 0.15s;
}
.oma-btn-speichern:hover { background: #2980b9; color: #fff; }
.oma-btn-speichern:disabled { opacity: 0.5; cursor: default; }

.oma-limit-info {
  font-size: 0.78rem;
  color: #999;
  text-align: center;
  margin: 0;
}
.oma-fehler-text { color: #c0392b; font-size: 0.92rem; margin-bottom: 14px; }

/* Auswahl-Kacheln bei 3 Vorschlägen */
.oma-auswahl-liste { display: flex; flex-direction: column; gap: 10px; margin-bottom: 14px; }
.oma-auswahl-karte {
  background: #f9f7f4;
  border: 2px solid #e8e2d6;
  border-radius: 12px;
  padding: 14px 16px;
  text-align: left;
  cursor: pointer;
  transition: border-color 0.15s, background 0.15s;
  width: 100%;
}
.oma-auswahl-karte:hover { border-color: #4a7c59; background: #f0f7f0; }
.oma-auswahl-karte strong { display: block; font-size: 0.95rem; margin-bottom: 4px; color: #1a1a1a; }
.oma-auswahl-erfunden { font-size: 0.75rem; font-weight: normal; color: #888; background: #fff8e1; padding: 2px 6px; border-radius: 20px; margin-left: 6px; }
.oma-auswahl-kommentar { font-size: 0.82rem; color: #666; font-style: italic; margin: 6px 0 0; }

@media (max-width: 480px) {
  /*
    Auf dem Handy ist das ein Blatt, das von unten hochfaehrt und buendig
    am Rand sitzt. Genau dort liegt aber Androids Navigationsleiste: die
    unteren Knoepfe ("Als eigenes Rezept speichern") lagen dahinter.

    Das Blatt bleibt buendig, damit die weisse Flaeche bis zum Bildschirm-
    rand reicht. Nur der Inhalt hoert darueber auf, siehe --unten-frei.
    Oben dasselbe: 95vh rechnen von der vollen Fensterhoehe, die
    Statusleiste muss abgezogen werden.
  */
  /* Omas Modal klebt unten. Ohne den Tastatur-Abzug laege es bei offener
     Tastatur komplett dahinter, hier reicht --unten-modal also nicht. */
  .oma-modal { max-height: calc(95vh - var(--oben-frei) - var(--tastatur-hoehe)); border-radius: 14px 14px 0 0; align-self: flex-end; }
  .oma-modal-overlay { align-items: flex-end; padding: 0; padding-bottom: var(--tastatur-hoehe); }
  .oma-modal .oma-modal-body { padding-bottom: calc(18px + var(--unten-frei)); }
}

/* Omas Rezept-Vorschlag (auch aus dem Chat) so gross wie das normale
   Rezept-Fenster (#modal-rezept .rz-neu): feste Hoehe statt nur so hoch wie
   der Inhalt, am Handy kein Blatt von unten, sondern mittig mit Rand. */
.oma-modal.oma-modal-rezept {
  max-width: 540px; max-height: none;
  height: calc(90vh - var(--oben-frei) - var(--unten-modal));
  height: calc(90dvh - var(--oben-frei) - var(--unten-modal));
}
@media (max-width: 640px) {
  .oma-modal-overlay.oma-overlay-rezept { align-items: center; padding: 6px; padding-bottom: calc(6px + var(--tastatur-hoehe)); }
  .oma-modal.oma-modal-rezept {
    height: calc(98vh - var(--oben-frei) - var(--unten-modal) - var(--tastatur-hoehe));
    height: calc(98dvh - var(--oben-frei) - var(--unten-modal) - var(--tastatur-hoehe));
    border-radius: 18px; align-self: auto;
  }
  .oma-modal-rezept .oma-modal-body { padding-bottom: 18px; }
}

/* Oma Pott — Wochenplan Tag-Picker */
.oma-tagpicker-overlay {
  position: fixed;
  inset: 0;
  background: rgba(0,0,0,0.45);
  z-index: 4000;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 16px;
}
.oma-tagpicker {
  background: #fff;
  border-radius: 16px;
  padding: 20px;
  width: 100%;
  max-width: 320px;
  box-shadow: 0 6px 30px rgba(0,0,0,0.2);
}
.oma-tagpicker-titel {
  font-weight: 700;
  font-size: 0.95rem;
  color: #2d4a2d;
  margin: 0 0 14px;
  text-align: center;
}
.oma-tagpicker-tage {
  display: flex;
  flex-direction: column;
  gap: 7px;
  margin-bottom: 12px;
}
.oma-tagpicker-btn {
  padding: 10px 16px;
  border-radius: 50px;
  border: 2px solid #e8e2d6;
  background: #f9f7f4;
  font-size: 0.9rem;
  font-weight: 600;
  cursor: pointer;
  transition: background 0.15s, border-color 0.15s;
  text-align: left;
}
.oma-tagpicker-btn:hover { background: #f0f7f0; border-color: #4a7c59; color: #2d4a2d; }
.oma-tagpicker-abbrechen {
  width: 100%;
  padding: 9px;
  border-radius: 50px;
  border: none;
  background: #f0ece4;
  color: #666;
  font-size: 0.88rem;
  font-weight: 600;
  cursor: pointer;
}
.oma-tagpicker-abbrechen:hover { background: #e8e2d6; }

/* Oma Pott — Portionen-Steuerung */
.oma-portionen-steuerung {
  display: flex;
  align-items: center;
  gap: 12px;
  margin-bottom: 12px;
}
/* Zutaten-Liste im Oma-Modal nutzt existierende rezept-zutat-item Klassen */
.oma-zutaten { list-style: none; padding: 0; margin: 0; }

/* Oma Pott — Rezept-Bild */
.oma-rezept-bild {
  width: 100%;
  max-height: 240px;
  object-fit: cover;
  border-radius: 10px;
  display: block;
}
.oma-bild-container {
  margin-bottom: 12px;
}
.oma-bild-container:empty {
  margin-bottom: 0;
}
.oma-bild-aktion {
  margin: 0 0 14px 0;
  text-align: center;
}
.oma-btn-bild {
  background: linear-gradient(135deg, #f8d486, #f1a93b);
  color: #5a3d10;
  border: none;
  border-radius: 8px;
  padding: 10px 16px;
  font-size: 14px;
  font-weight: 600;
  cursor: pointer;
  width: 100%;
  text-align: center;
  line-height: 1.3;
  transition: transform 0.15s ease, box-shadow 0.15s ease;
  box-shadow: 0 2px 6px rgba(241, 169, 59, 0.3);
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 10px;
}
.oma-btn-bild .pottis-cost-badge {
  background: rgba(90, 61, 16, 0.18);
  color: #3a2900;
  border-color: rgba(90, 61, 16, 0.4);
}
.oma-btn-bild:hover {
  transform: translateY(-1px);
  box-shadow: 0 3px 10px rgba(241, 169, 59, 0.4);
}
.oma-btn-bild:disabled {
  opacity: 0.6;
  cursor: default;
  transform: none;
}
.oma-bild-loading {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 10px;
  padding: 14px;
  background: #fff8eb;
  border-radius: 10px;
  color: #6e4a13;
  font-style: italic;
  font-size: 14px;
  line-height: 1.4;
}
.oma-bild-spinner {
  display: inline-block;
  width: 18px;
  height: 18px;
  border: 3px solid #f1a93b;
  border-top-color: transparent;
  border-radius: 50%;
  animation: oma-bild-spin 0.9s linear infinite;
  flex-shrink: 0;
}
@keyframes oma-bild-spin {
  to { transform: rotate(360deg); }
}
.oma-bild-fehler {
  padding: 10px 14px;
  background: #fff0f0;
  border: 1px solid #f5c6c6;
  border-radius: 8px;
  color: #8a3838;
  font-size: 13px;
  line-height: 1.4;
  margin-bottom: 8px;
  text-align: center;
}

/* ═══════════════════════════════════════════════════════════
   Kassenbuch — Fussleiste
   ═══════════════════════════════════════════════════════════ */
.kassenbuch-footer {
  display: flex;
  flex-direction: column;
  gap: 8px;
}
.kassenbuch-footer .btn { width: 100%; }

/* ═══════════════════════════════════════════════════════════
   Einkauf löschen — Lebensmittel-Rückbuchung
   ═══════════════════════════════════════════════════════════ */
.kb-loesch-text {
  font-size: 0.9rem;
  color: var(--text-mittel);
  line-height: 1.5;
  margin: 0 0 14px;
}
.kb-loesch-liste {
  display: flex;
  flex-direction: column;
  gap: 8px;
  max-height: 46vh;
  overflow-y: auto;
}
.kb-loesch-zeile {
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 11px 13px;
  border: 1px solid var(--rahmen);
  border-radius: 10px;
  cursor: pointer;
  transition: background 0.15s, border-color 0.15s;
}
.kb-loesch-zeile:hover {
  background: #f7faf7;
  border-color: var(--gruen-hell);
}
.kb-loesch-cb {
  width: 19px;
  height: 19px;
  accent-color: var(--gruen-hell);
  flex-shrink: 0;
  cursor: pointer;
}
.kb-loesch-name {
  font-size: 0.92rem;
  font-weight: 600;
  color: var(--gruen-schrift);
}
.kb-loesch-rest {
  font-weight: 500;
  font-size: 0.82rem;
  color: var(--text-mittel);
}

/* ══════════════════════════════════════════════════════════════════
   DUNKELMODUS: Flaechen, die fest auf Weiss standen
   ══════════════════════════════════════════════════════════════════

   Diese Bereiche hatten ihre Farbe direkt im Code (#fff, #f9f7f4) statt
   ueber eine Variable. Der Dunkelmodus konnte sie deshalb nicht umdrehen:
   Omas Modal war ein grellweisses Blatt auf schwarzem Grund, und seit
   Knoepfe die Schriftfarbe erben (siehe "button { color: inherit }")
   stand darauf auch noch helle Schrift.

   Die Toene sind dieselben wie bei den uebrigen Karten: #2a2a2a als
   Flaeche, #333 fuer abgesetzte Bereiche, #3a3a3a fuer Linien.
   ══════════════════════════════════════════════════════════════════ */

body.dark .oma-modal,
body.dark .oma-tagpicker,
body.dark .tutorial-tooltip { background: #2a2a2a; color: var(--text-dunkel); }

body.dark .oma-modal-kopf { background: #222; border-bottom-color: #3a3a3a; color: var(--gruen-schrift); }

body.dark .oma-auswahl-karte { background: #333; border-color: #3a3a3a; }
body.dark .oma-auswahl-karte strong { color: var(--text-dunkel); }

body.dark .oma-anleitung,
body.dark .oma-auswahl-kommentar { color: var(--text-mittel); }

body.dark .oma-tagpicker-btn { background: #333; border-color: #3a3a3a; }

body.dark .pott-chat-rezept-karte { background: #333; }

body.dark .wv-karte-fertig { background: #242424; }

/* Ausgewaehlte Eintraege: der helle Grund verschwindet sonst nicht nur,
   er macht die Zeile auch unlesbar. */
body.dark .lebensmittel-karte.ausgewaehlt,
body.dark .einkauf-item.ausgewaehlt { background: #2f3d2f; }

/* Der Tutorial-Kasten hat einen Fortschrittsbalken, dessen Spur hell ist. */
body.dark .tutorial-fortschritt-balken { background: #3a3a3a; }

/* ── Omas Rezeptkarte im Dunkelmodus ──────────────────────────────
   Diese Texte hatten ihre Farbe fest im Code. Gemessen auf der jetzt
   dunklen Modalflaeche: Rezeptname 1.21, Ueberschriften 1.93, gefordert
   sind 4.5. Sie waren also praktisch unsichtbar. */
body.dark .oma-rezept-name      { color: var(--text-dunkel); }
body.dark .oma-rezept-meta      { color: var(--text-mittel); }
body.dark .oma-abschnitt strong { color: var(--text-mittel); }
body.dark .oma-zutaten li       { color: var(--text-dunkel); }
body.dark .oma-lade-text,
body.dark .oma-sterne-label,
body.dark .oma-btn-alt,
body.dark .oma-tagpicker-abbrechen { background: #333; color: var(--text-mittel); }
/* Der Knopf hat einen fest hellen Grund. Nur die Schrift aufzuhellen war
   falsch: dann stand Hell auf Hell. Also die Flaeche mit abdunkeln. */
body.dark .oma-btn-aktion { background: #333; color: var(--text-dunkel); }
body.dark .oma-btn-alt    { border-color: #4a4a4a; }
body.dark .oma-tagpicker-titel  { color: var(--gruen-schrift); }

/* Kommentar und Warnung behalten ihre Einfaerbung, werden aber gedaempft:
   als helle Kaesten leuchteten sie im Dunkelmodus unangenehm. Die Schrift
   wird dafuer hell, sonst kippt der Kontrast ins Gegenteil. */
body.dark .oma-kommentar { background: #24312a; border-color: #35513c; color: #a9d9b4; }
body.dark .oma-warnung   { background: #332c14; border-color: #574a1e; color: #e0c878; }

/* ── Dunkelmodus: restliche fest eingetragene dunkle Schriftfarben ──
   Systematisch gesucht: Regeln mit dunkler Schriftfarbe, deren Flaeche im
   Dunkelmodus dunkel ist und die noch keine eigene Fassung hatten.

   Bewusst NICHT dabei sind Texte auf goldenen oder farbigen Flaechen
   (Pottis-Preise, Nutri-Score, Angebots-Markierungen, Omas Bild-Knopf,
   die Sprechblase): dort bleibt die Flaeche hell, dunkle Schrift ist
   dort richtig. */

/* Zutaten-Haekchen und -Kreuz im Rezept */
body.dark .zutat-ok    { color: #7dc97d; }
body.dark .zutat-fehlt { color: #ef7a7a; }

/* Haushalts-Menue */
body.dark .haushalt-mitglied,
body.dark .drawer-plz-label   { color: var(--text-mittel); }
body.dark .btn-mitglied-kick  { color: #ef7a7a; }

/* Tutorial */
body.dark .tutorial-tooltip h3 { color: var(--gruen-schrift); }
body.dark .tutorial-tooltip p  { color: var(--text-mittel); }

/* Omas Knoepfe stehen auf durchsichtigem Grund, nur der Rahmen faerbt */
body.dark .oma-btn-gut       { color: #7dc97d; }
body.dark .oma-btn-schlecht,
body.dark .oma-fehler-text   { color: #ef7a7a; }
body.dark .oma-btn-speichern { color: #5aa9e0; }

/* Preise in der Angebotsansicht */
body.dark .edeka-karte-preis { color: #ff6b6b; }

/* ── Dunkelmodus: Flaechen mit "background: white" ─────────────────
   Diese Regeln schreiben Weiss als WORT statt als Hexwert. Die erste
   Suche nach hellen Flaechen hat sie deshalb uebersehen.

   Kritisch wurden sie erst, seit die Schrift darauf ueber Variablen
   laeuft: --gruen-schrift und --text-dunkel sind im Dunkelmodus hell,
   auf weissem Grund also unlesbar. Beim Barcode-Scanner war der Knopf
   "Entnehmen" davon betroffen. */

body.dark .scan-modus-btn,
body.dark .sc-btn-manuell,
body.dark .sc-menge-btn,
body.dark .feedback-typ-btn { background: #333; border-color: #4a4a4a; }

body.dark .bon-name-input,
body.dark .bon-kat-select,
body.dark .sc-edit-input { background: #333; border-color: #4a4a4a; color: var(--text-dunkel); }

body.dark .produkt-info-bild,
body.dark .naehrwert-item { background: #2a2a2a; }

/* Die Anleitung liegt im Dunkelmodus auf dunklem Grund, ihr creme-farbener
   Kasten wuerde darin leuchten. (Die Regel fuer .pwa-install-box ist mit
   dem alten Install-Gate weggefallen.) */
body.dark .pwa-anleitung { background: #2a2a2a; }

/* Platzhalter, solange ein Rezept noch kein Bild hat. Stand frueher als
   Inline-Stil im JavaScript und liess sich deshalb im Dunkelmodus nicht
   abdunkeln: der Kasten leuchtete als helle Flaeche heraus. */
.rezept-bild-platzhalter {
  background: linear-gradient(135deg, #f5f0e8 0%, #ede8df 100%);
  border: 2px dashed #c5b89e;
  border-radius: 14px;
  padding: 24px 20px;
  text-align: center;
  margin-bottom: 14px;
}
body.dark .rezept-bild-platzhalter {
  background: linear-gradient(135deg, #2f2f2f 0%, #272727 100%);
  border-color: #4a4a4a;
}

/* ═══════════════════════════════════════════════════════════
   Wartungshinweis (zeigeWartung() in app.js)
   Liegt ueber allem, auch ueber dem Update-Hinweis: ohne Server
   laesst sich ohnehin nichts bedienen.
   ═══════════════════════════════════════════════════════════ */
#wartung-overlay {
  position: fixed;
  inset: 0;
  z-index: 10010;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: calc(var(--oben-frei) + 16px) 16px 16px;
  background: var(--creme);
  overflow-y: auto;
}
.wartung-karte {
  max-width: 420px;
  width: 100%;
  background: var(--weiss);
  border-radius: 20px;
  overflow: hidden;
  box-shadow: 0 10px 40px var(--schatten);
  text-align: center;
}
.wartung-bild {
  width: 100%;
  aspect-ratio: 4 / 3;
  object-fit: cover;
  object-position: center 20%;
  display: block;
}
.wartung-inhalt { padding: 22px 22px 26px; }
.wartung-inhalt h2 {
  font-family: var(--font-titel);
  color: var(--gruen-schrift);
  font-size: 1.5rem;
  margin: 0 0 12px;
}
.wartung-oma {
  font-style: italic;
  line-height: 1.5;
  color: var(--text-dunkel);
  margin: 0 0 12px;
}
.wartung-info {
  font-size: 0.9rem;
  line-height: 1.5;
  color: var(--text-mittel);
  margin: 0 0 20px;
}

/* ====================================================================== */
/*  "Stell dich Oma Pott vor" (ov-)                                         */
/*                                                                          */
/*  Sieht aus wie der Anmeldebildschirm: Omas Kueche als Foto, darauf die   */
/*  dunkle Kachel. Bewusst nur EIN Look, das Foto bestimmt die Stimmung,    */
/*  deshalb keine Regeln fuer body.dark noetig.                             */
/*                                                                          */
/*  ⚠️ Dunkler als beim Login (66 % statt 38 %). Hier steht viel Text,      */
/*  Raster und Kleingedrucktes, und mit 38 % war das ueber den hellen       */
/*  Stellen der Kueche schwer lesbar (Emanuel, 2026-10-08). Eingabefelder   */
/*  deshalb auch dunkel hinterlegt, nicht weiss-durchsichtig.               */
/* ====================================================================== */
.ov-overlay { position: fixed; inset: 0; z-index: 9000; display: flex; flex-direction: column;
  overflow: hidden; background: #2a2018; color: #fff; font-family: var(--font-text); }
.ov-foto { position: absolute; inset: 0; background-image: url('assets/login-oma.webp');
  background-size: cover; background-position: center top; transform-origin: 45% 22%;
  transition: transform .7s ease; }
.ov-overlay.ov-nah .ov-foto { transform: scale(1.32); }
.ov-schleier { position: absolute; inset: 0; pointer-events: none;
  background: linear-gradient(to bottom, rgba(16,28,16,.50) 0%, rgba(16,28,16,.12) 22%, rgba(16,28,16,.20) 45%, rgba(16,28,16,.70) 100%); }

.ov-kopf, .ov-inhalt, .ov-fuss { position: relative; z-index: 1; }
.ov-kopf { display: flex; align-items: center; gap: 10px;
  padding: calc(12px + var(--oben-frei, env(safe-area-inset-top, 0px))) 14px 8px; }
.ov-rund { width: 38px; height: 38px; border-radius: 50%; border: 1px solid rgba(255,255,255,.38);
  background: rgba(10,20,10,.66); color: #fff; font-size: 1.05rem; cursor: pointer; flex: none; }
.ov-rund:disabled { visibility: hidden; }
.ov-balken { flex: 1; height: 6px; border-radius: 3px; background: rgba(255,255,255,.22); overflow: hidden; }
.ov-balken span { display: block; height: 100%; width: 0; background: #a6dca6; border-radius: 3px; transition: width .35s ease; }
.ov-zaehler { font-size: .8rem; color: #fff; background: rgba(10,20,10,.6); padding: 2px 8px; border-radius: 999px;
  font-variant-numeric: tabular-nums; }
.ov-zaehler:empty { display: none; }

.ov-inhalt { flex: 1; overflow-y: auto; padding: 0 12px 8px; display: flex; flex-direction: column; }
.ov-platz { display: none; }
.ov-inhalt.ov-ganz .ov-platz { display: block; flex: 1; }
.ov-inhalt:not(.ov-ganz) .ov-tafel { flex: 1; }

.ov-tafel { background: rgba(10,20,10,.66); border: 1px solid rgba(255,255,255,.16); border-radius: 22px;
  box-shadow: 0 18px 50px rgba(0,0,0,.35); padding: 16px 14px; color: #fff;
  text-shadow: 0 1px 3px rgba(0,0,0,.8); display: flex; flex-direction: column; gap: 12px;
  animation: ov-rein .35s ease both; max-width: 560px; width: 100%; margin: 0 auto; }
.ov-inhalt.ov-ganz .ov-tafel { background: rgba(10,20,10,.52); }
.ov-tafel.ov-still { animation: none; }
@keyframes ov-rein { from { opacity: .3; transform: translateY(16px); } to { opacity: 1; transform: none; } }
.ov-wer { font-size: .76rem; font-weight: 700; letter-spacing: .12em; text-transform: uppercase; color: rgba(255,255,255,.8); }
.ov-titel { font-family: var(--font-titel); font-size: 1.45rem; line-height: 1.2; color: #fff; }
.ov-spruch { font-family: var(--font-titel); font-style: italic; font-weight: 600; font-size: 1.12rem; line-height: 1.45; }
.ov-text { color: rgba(255,255,255,.92); line-height: 1.55; }
.ov-fehler { color: #ffb4aa; font-weight: 500; }

.ov-kacheln { display: grid; gap: 8px; }
.ov-kachel { display: flex; align-items: center; gap: 12px; padding: 8px 12px; background: rgba(0,0,0,.34);
  border: 1.5px solid rgba(255,255,255,.38); border-radius: 14px; cursor: pointer; text-align: left; color: #fff;
  font: inherit; text-shadow: inherit; }
.ov-kachel .ov-bild { font-size: 1.4rem; width: 36px; height: 36px; display: grid; place-items: center;
  background: rgba(255,255,255,.12); border-radius: 50%; flex: none; text-shadow: none; }
.ov-kachel strong { display: block; font-size: .98rem; }
.ov-kachel small { color: rgba(255,255,255,.92); font-size: .82rem; }
.ov-kachel.ov-an { background: rgba(52,104,62,.95); border-color: #a6dca6; }

.ov-raster { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 6px; }
.ov-allergen { display: flex; flex-direction: column; align-items: center; gap: 2px; padding: 7px 2px 6px;
  border: 1.5px solid rgba(255,255,255,.38); border-radius: 14px; background: rgba(0,0,0,.34); cursor: pointer;
  font: inherit; font-size: .78rem; font-weight: 500; color: #fff; line-height: 1.15; text-align: center;
  text-shadow: inherit; min-width: 0; overflow-wrap: anywhere; }
.ov-allergen span { font-size: 1.25rem; text-shadow: none; }
.ov-allergen.ov-an { border-color: #ff9a8f; background: rgba(150,40,30,.92); }

.ov-chips { display: flex; flex-wrap: wrap; gap: 7px; }
.ov-chip { padding: 6px 11px; border-radius: 999px; border: 1.5px solid rgba(255,255,255,.38); background: rgba(0,0,0,.34);
  cursor: pointer; font: inherit; font-size: .85rem; color: #fff; text-shadow: inherit; }
.ov-chip.ov-an { border-color: #a6dca6; background: rgba(52,104,62,.95); }
.ov-chips.ov-nein .ov-chip.ov-an { border-color: #ff9a8f; background: rgba(150,40,30,.92); }
.ov-eigenes { display: flex; gap: 8px; }
.ov-eigenes input { flex: 1; min-width: 0; padding: 10px 12px; border-radius: 12px; border: 1.5px solid rgba(255,255,255,.38);
  background: rgba(0,0,0,.34); color: #fff; font: inherit; font-size: 16px; }
.ov-eigenes input::placeholder { color: rgba(255,255,255,.8); }
.ov-eigenes button { width: 44px; border-radius: 12px; border: 0; background: rgba(60,110,72,.92); color: #fff;
  font-size: 1.3rem; cursor: pointer; }

.ov-schaerfe { text-align: center; padding: 6px 0 2px; }
.ov-schoten { font-size: 1.9rem; letter-spacing: 3px; min-height: 2.4rem; text-shadow: none; }
.ov-schoten .ov-aus { filter: grayscale(1); opacity: .3; }
.ov-schaerfe-text { font-family: var(--font-titel); font-size: 1.35rem; margin: 4px 0 12px; }
.ov-schaerfe input { width: 100%; accent-color: #e05a47; }
.ov-skala { display: flex; justify-content: space-between; font-size: .8rem; color: rgba(255,255,255,.8); }

.ov-zusammen { border-top: 1px solid rgba(255,255,255,.18); }
.ov-zeile { display: flex; justify-content: space-between; gap: 12px; padding: 6px 0;
  border-bottom: 1px solid rgba(255,255,255,.12); font-size: .86rem; }
.ov-zeile > span:first-child { color: rgba(255,255,255,.8); flex: none; }
.ov-zeile > span:last-child { text-align: right; }
.ov-zeile button { background: none; border: 0; color: #a6dca6; font: inherit; font-size: .8rem; cursor: pointer;
  padding: 0 0 0 6px; text-decoration: underline; }
.ov-haushalt { display: flex; flex-wrap: wrap; gap: 6px 14px; font-size: .86rem; }
.ov-person { display: flex; align-items: center; gap: 8px; }
.ov-punkt { width: 26px; height: 26px; border-radius: 50%; display: grid; place-items: center; font-size: .78rem;
  font-weight: 700; background: rgba(0,0,0,.4); border: 1px solid rgba(255,255,255,.38); text-shadow: none; flex: none; }
.ov-person.ov-ja .ov-punkt { background: rgba(52,104,62,.95); }
.ov-person small { color: rgba(255,255,255,.8); }
.ov-belohnung { display: flex; align-items: center; gap: 10px; background: rgba(120,84,10,.75);
  border: 1px solid rgba(240,200,110,.6); border-radius: 14px; padding: 10px 12px; font-size: .9rem; }
.ov-belohnung strong { font-size: 1.1rem; white-space: nowrap; }

.ov-fuss { padding: 8px 14px calc(14px + var(--unten-modal, 0px)); display: grid; gap: 4px;
  background: linear-gradient(to bottom, rgba(10,18,10,.35), rgba(10,18,10,.85) 45%); }
.ov-fuss > * { max-width: 560px; width: 100%; margin: 0 auto; }
.ov-knopf { padding: 13px; border-radius: 999px; border: 1px solid rgba(255,255,255,.22); background: rgba(60,110,72,.92);
  color: #fff; font: inherit; font-weight: 700; font-size: 1rem; cursor: pointer;
  text-shadow: 0 1px 4px rgba(0,0,0,.45); box-shadow: 0 8px 22px rgba(0,0,0,.3); }
.ov-knopf:disabled { opacity: .6; cursor: default; }
.ov-leise { background: none; border: 0; color: #fff; font: inherit; font-size: .92rem; font-weight: 500;
  cursor: pointer; padding: 6px; text-shadow: 0 1px 4px rgba(0,0,0,.6); }
.ov-overlay button:focus-visible, .ov-overlay input:focus-visible { outline: 3px solid #a6dca6; outline-offset: 2px; }
@media (prefers-reduced-motion: reduce) { .ov-tafel { animation: none; } .ov-foto, .ov-balken span { transition: none; } }

/* ====================================================================== */
/*  Kuechenbilder hinter den Tabs (2026-10-08)                              */
/*                                                                          */
/*  Kuehlschrank, Einkauf, Rezepte, Wochenplan bekommen je ein Bild aus     */
/*  Omas Kueche. Dashboard und Oma-Tab bewusst nicht. app.js haengt         */
/*  hg-an und hg-<seite> an <body>, siehe tabHintergrundSetzen().           */
/*                                                                          */
/*  Werte von Emanuel an der Vorschau gewaehlt: Variante "durchgehend",     */
/*  Schleier 40 Prozent, Karten 50 Prozent. Beide als Variable unten.       */
/*                                                                          */
/*  Wie die Karten durchsichtig werden: im Hellmodus nehmen sie fast alle   */
/*  ihr Weiss aus --weiss. Das wird in den vier Tabs halb durchsichtig      */
/*  umdefiniert, damit gehen alle auf einmal mit. --weiss dient nirgends    */
/*  als Schriftfarbe (geprueft), sonst waere das gefaehrlich. Im            */
/*  Dunkelmodus stehen viele Karten mit FESTEN Farben in body.dark-Regeln,  */
/*  die muessen einzeln ueberschrieben werden (Liste unten).                */
/* ====================================================================== */
:root { --hg-schleier: .40; --hg-karten: .50; }

#tab-hintergrund { display: none; position: fixed; inset: 0; z-index: -1; pointer-events: none;
  background-size: cover; background-position: center; }
#tab-hintergrund::after { content: ""; position: absolute; inset: 0; background: rgba(245, 240, 232, var(--hg-schleier)); }
body.dark #tab-hintergrund::after { background: rgba(26, 26, 26, var(--hg-schleier)); }
body.hg-an #tab-hintergrund { display: block; }
body.hg-kuehlschrank  #tab-hintergrund { background-image: url('assets/hintergruende/kuehlschrank.webp'); }
body.hg-einkaufsliste #tab-hintergrund { background-image: url('assets/hintergruende/einkaufsliste.webp'); }
body.hg-rezepte       #tab-hintergrund { background-image: url('assets/hintergruende/rezepte.webp'); }
body.hg-wochenplan    #tab-hintergrund { background-image: url('assets/hintergruende/wochenplan.webp'); }

/* Seite selbst durchsichtig, im Dunkelmodus hat .seite sonst #1a1a1a */
body.hg-an .seite.aktiv, body.dark.hg-an .seite.aktiv { background: transparent; }

body.hg-an #seite-kuehlschrank, body.hg-an #seite-einkaufsliste, body.hg-an #seite-rezepte, body.hg-an #seite-wochenplan { --weiss: rgba(255, 255, 255, var(--hg-karten)); }
body.dark.hg-an #seite-kuehlschrank, body.dark.hg-an #seite-einkaufsliste, body.dark.hg-an #seite-rezepte, body.dark.hg-an #seite-wochenplan { --weiss: rgba(42, 42, 42, var(--hg-karten)); }
body.dark.hg-an #seite-kuehlschrank .lm-karte,
body.dark.hg-an #seite-kuehlschrank .lebensmittel-karte,
body.dark.hg-an #seite-kuehlschrank .einkauf-item,
body.dark.hg-an #seite-kuehlschrank .plan-tag-karte,
body.dark.hg-an #seite-kuehlschrank .plan-slot-karte,
body.dark.hg-an #seite-kuehlschrank #plan-kalender-streifen,
body.dark.hg-an #seite-kuehlschrank .rezept-karte,
body.dark.hg-an #seite-kuehlschrank .rezept-tab-kachel,
body.dark.hg-an #seite-kuehlschrank .plan-eintrag,
body.dark.hg-an #seite-kuehlschrank .karte,
body.dark.hg-an #seite-kuehlschrank .lm-filter-scroll,
body.dark.hg-an #seite-kuehlschrank .einkauf-kat-header,
body.dark.hg-an #seite-kuehlschrank .rezepte-tab-leiste,
body.dark.hg-an #seite-einkaufsliste .lm-karte,
body.dark.hg-an #seite-einkaufsliste .lebensmittel-karte,
body.dark.hg-an #seite-einkaufsliste .einkauf-item,
body.dark.hg-an #seite-einkaufsliste .plan-tag-karte,
body.dark.hg-an #seite-einkaufsliste .plan-slot-karte,
body.dark.hg-an #seite-einkaufsliste #plan-kalender-streifen,
body.dark.hg-an #seite-einkaufsliste .rezept-karte,
body.dark.hg-an #seite-einkaufsliste .rezept-tab-kachel,
body.dark.hg-an #seite-einkaufsliste .plan-eintrag,
body.dark.hg-an #seite-einkaufsliste .karte,
body.dark.hg-an #seite-einkaufsliste .lm-filter-scroll,
body.dark.hg-an #seite-einkaufsliste .einkauf-kat-header,
body.dark.hg-an #seite-einkaufsliste .rezepte-tab-leiste,
body.dark.hg-an #seite-rezepte .lm-karte,
body.dark.hg-an #seite-rezepte .lebensmittel-karte,
body.dark.hg-an #seite-rezepte .einkauf-item,
body.dark.hg-an #seite-rezepte .plan-tag-karte,
body.dark.hg-an #seite-rezepte .plan-slot-karte,
body.dark.hg-an #seite-rezepte #plan-kalender-streifen,
body.dark.hg-an #seite-rezepte .rezept-karte,
body.dark.hg-an #seite-rezepte .rezept-tab-kachel,
body.dark.hg-an #seite-rezepte .plan-eintrag,
body.dark.hg-an #seite-rezepte .karte,
body.dark.hg-an #seite-rezepte .lm-filter-scroll,
body.dark.hg-an #seite-rezepte .einkauf-kat-header,
body.dark.hg-an #seite-rezepte .rezepte-tab-leiste,
body.dark.hg-an #seite-wochenplan .lm-karte,
body.dark.hg-an #seite-wochenplan .lebensmittel-karte,
body.dark.hg-an #seite-wochenplan .einkauf-item,
body.dark.hg-an #seite-wochenplan .plan-tag-karte,
body.dark.hg-an #seite-wochenplan .plan-slot-karte,
body.dark.hg-an #seite-wochenplan #plan-kalender-streifen,
body.dark.hg-an #seite-wochenplan .rezept-karte,
body.dark.hg-an #seite-wochenplan .rezept-tab-kachel,
body.dark.hg-an #seite-wochenplan .plan-eintrag,
body.dark.hg-an #seite-wochenplan .karte,
body.dark.hg-an #seite-wochenplan .lm-filter-scroll,
body.dark.hg-an #seite-wochenplan .einkauf-kat-header,
body.dark.hg-an #seite-wochenplan .rezepte-tab-leiste { background: rgba(42, 42, 42, var(--hg-karten)); }

/*
  Schrift, die DIREKT auf dem Bild steht (Leer-Hinweise, Unterzeilen,
  Datumskoepfe), war mit den hellen Grautoenen kaum lesbar. In den vier
  Tabs werden die Grautoene kraeftiger, und alles bekommt einen feinen
  Lichthof in der Farbe des Schleiers. Knoepfe nicht: weisse Schrift auf
  gruenem Grund wuerde sonst verschwimmen.
*/
body.hg-an #seite-kuehlschrank, body.hg-an #seite-einkaufsliste, body.hg-an #seite-rezepte, body.hg-an #seite-wochenplan { --text-mittel: #2e3e2e; --text-hell: #46574a;
  text-shadow: 0 0 5px rgba(245, 240, 232, .95), 0 0 2px rgba(245, 240, 232, .9); }
body.dark.hg-an #seite-kuehlschrank, body.dark.hg-an #seite-einkaufsliste, body.dark.hg-an #seite-rezepte, body.dark.hg-an #seite-wochenplan { --text-mittel: #dcdcdc; --text-hell: #bdbdbd;
  text-shadow: 0 0 5px rgba(0, 0, 0, .9), 0 0 2px rgba(0, 0, 0, .85); }
body.hg-an #seite-kuehlschrank :is(button, .btn, .btn-primary), body.hg-an #seite-einkaufsliste :is(button, .btn, .btn-primary), body.hg-an #seite-rezepte :is(button, .btn, .btn-primary), body.hg-an #seite-wochenplan :is(button, .btn, .btn-primary) { text-shadow: none; }

/*
  Was der Lichthof allein nicht rettet (Emanuels Screenshots 2026-10-08):
  Datumskopf im Kuehlschrank, Monatsangabe im Wochenplan, Mahlzeit-Symbole
  (Pfanne, Teller, Mond). Sie bekommen einen fast deckenden Streifen wie die
  Kategorie-Koepfe der Einkaufsliste, die waren von Anfang an gut lesbar.
*/
body.hg-an #seite-kuehlschrank .lm-datum-header {
  background: rgba(245, 240, 232, .9); border-bottom: none; border-radius: var(--radius-klein);
  padding: 5px 10px; margin-top: 12px; }
body.hg-an #seite-wochenplan #plan-kal-woche-label {
  display: inline-flex; width: fit-content; background: rgba(245, 240, 232, .9);
  border-radius: var(--radius-klein); padding: 4px 10px; margin-bottom: 6px; }
body.hg-an #seite-wochenplan .plan-slot-icon {
  background: rgba(245, 240, 232, .9); border-radius: 50%; width: 40px; height: 40px;
  box-shadow: 0 1px 4px rgba(0, 0, 0, .12); text-shadow: none; }
body.dark.hg-an #seite-kuehlschrank .lm-datum-header,
body.dark.hg-an #seite-wochenplan #plan-kal-woche-label,
body.dark.hg-an #seite-wochenplan .plan-slot-icon { background: rgba(26, 26, 26, .88); }

/* Kosten-Plakette auf Omas dunkelgruenem Knopf im Vorstellen-Ablauf.
   Die normale ist fuer helle Knoepfe gemacht (dunkle Schrift auf
   hellem Gelb bei 22 %), hier waere sie im Gruen verschwunden. */
.ov-knopf .pottis-cost-badge { margin-left: 6px; background: rgba(255, 215, 100, .92); color: #3d3000;
  border-color: #f0c040; text-shadow: none; vertical-align: middle; }
.ov-knopf .pottis-cost-badge.nicht-genug { background: #ffd6d0; color: #8a1f14; border-color: #ff9a8f; }

/* Tageskopf im Wochenplan genau wie der Datumskopf im Kuehlschrank:
   cremefarbener Streifen, kleine gruene Grossbuchstaben (Emanuel 2026-10-08). */
body.hg-an #seite-wochenplan .plan-tag-header {
  background: rgba(245, 240, 232, .9); border-radius: var(--radius-klein); padding: 5px 10px;
  margin-top: 12px; font-size: 0.8rem; font-weight: 700; letter-spacing: 0.05em; text-transform: uppercase;
  color: var(--gruen-schrift); text-shadow: none; }
body.dark.hg-an #seite-wochenplan .plan-tag-header { background: rgba(26, 26, 26, .88); }

/* Favoriten-Herz: nicht gemerkt ist es WEISS (🤍) und verschwand auf den
   hellen Kuechenbildern. Dunkler Kreis, ein heller liess es blass (gemessen per Foto). */
body.hg-an .seite.aktiv .fav-btn {
  background: rgba(26, 46, 26, .78); border-radius: 50%; width: 34px; height: 34px;
  display: inline-flex; align-items: center; justify-content: center; padding: 0;
  box-shadow: 0 1px 4px rgba(0, 0, 0, .18); text-shadow: none; flex-shrink: 0; }
body.dark.hg-an .seite.aktiv .fav-btn { background: rgba(0, 0, 0, .7); }

/* Kleine Zusatzzeilen im Wochenplan (wer geplant hat, Kategorie) waren
   hellgruen bzw. grau und auf den Kuechenbildern zu blass. */
body.hg-an #seite-wochenplan .plan-eintrag-geplant,
body.hg-an #seite-wochenplan .plan-slot-geplant { color: var(--gruen-schrift); font-weight: 600; }
body.hg-an #seite-wochenplan .plan-eintrag-kategorie { color: var(--text-mittel); font-weight: 500; }
body.dark.hg-an #seite-wochenplan .plan-eintrag-geplant,
body.dark.hg-an #seite-wochenplan .plan-slot-geplant { color: #b9e6b9; }

/* Rezeptkarten tragen viel kleine Schrift (Autor, Bewertung, Zutaten-
   Treffer) und liegen ueber dem unruhigen Rezeptbuch-Bild. Mit 50 % war
   die Community-Ansicht zu blass (Emanuel 2026-10-08): Karten 85 %,
   helle Knoepfe fast deckend. Die grossen Kacheln oben bleiben bei 50 %. */
body.hg-an #seite-rezepte .rezept-karte { background: rgba(255, 255, 255, .85); }
body.dark.hg-an #seite-rezepte .rezept-karte { background: rgba(42, 42, 42, .88); }
body.hg-an .seite.aktiv .btn-secondary { background: rgba(255, 255, 255, .92); }
body.dark.hg-an .seite.aktiv .btn-secondary { background: rgba(51, 51, 51, .92); }

/* Wochenplan genauso wie die Rezeptkarten: Karten 85 % deckend (Emanuel
   2026-10-08). Ueber --weiss im Hellmodus, im Dunkelmodus die Klassen
   mit festen Farben einzeln (gleiche Spezifitaet wie oben, steht spaeter). */
body.hg-an #seite-wochenplan { --weiss: rgba(255, 255, 255, .85); }
body.dark.hg-an #seite-wochenplan { --weiss: rgba(42, 42, 42, .88); }
body.dark.hg-an #seite-wochenplan .plan-slot-karte,
body.dark.hg-an #seite-wochenplan .plan-tag-karte,
body.dark.hg-an #seite-wochenplan #plan-kalender-streifen,
body.dark.hg-an #seite-wochenplan .plan-eintrag,
body.dark.hg-an #seite-wochenplan .karte { background: rgba(42, 42, 42, .88); }
/* Verlaufskarten sind sonst zusaetzlich auf 75 % abgeblendet (Vergangenes
   soll aelter wirken). Auf dem Kuechenbild machte das sie zu durchsichtig,
   und im Verlauf steht ohnehin nur Vergangenes. */
body.hg-an #seite-wochenplan .plan-verlauf-eintrag { opacity: 1; }

/* Kuehlschrank wie Wochenplan und Rezepte: Karten 85 % (Emanuel 2026-10-08) */
body.hg-an #seite-kuehlschrank { --weiss: rgba(255, 255, 255, .85); }
body.dark.hg-an #seite-kuehlschrank { --weiss: rgba(42, 42, 42, .88); }
body.dark.hg-an #seite-kuehlschrank .lm-karte,
body.dark.hg-an #seite-kuehlschrank .lebensmittel-karte,
body.dark.hg-an #seite-kuehlschrank .karte { background: rgba(42, 42, 42, .88); }

/* Einkaufsliste ebenso 85 % (Emanuel 2026-10-08). Damit haben alle vier
   Tabs 85 %, nur die grossen Kacheln oben im Rezept-Tab bleiben bei 50 %. */
body.hg-an #seite-einkaufsliste { --weiss: rgba(255, 255, 255, .85); }
body.dark.hg-an #seite-einkaufsliste { --weiss: rgba(42, 42, 42, .88); }
body.dark.hg-an #seite-einkaufsliste .einkauf-item,
body.dark.hg-an #seite-einkaufsliste .einkauf-kat-header,
body.dark.hg-an #seite-einkaufsliste .karte { background: rgba(42, 42, 42, .88); }

/* Fortschritt von Omas Wochenplanung im Oma-Tab */
.oma-wochen-status {
  display: flex;
  align-items: center;
  gap: 10px;
  margin: 10px 4px 0;
  padding: 10px 14px;
  background: var(--weiss);
  border-radius: var(--radius);
  border-left: 4px solid var(--gruen-accent);
  box-shadow: 0 2px 12px var(--schatten);
  font-size: .9rem;
  color: var(--gruen-schrift);
}
.oma-wochen-status.versteckt { display: none; }
.oma-wochen-status-punkte { display: inline-flex; gap: 4px; }
.oma-wochen-status-punkte span {
  width: 7px; height: 7px; border-radius: 50%;
  background: var(--gruen-accent);
  animation: omaWochenPunkt 1.2s infinite ease-in-out;
}
.oma-wochen-status-punkte span:nth-child(2) { animation-delay: .2s; }
.oma-wochen-status-punkte span:nth-child(3) { animation-delay: .4s; }
@keyframes omaWochenPunkt { 0%, 80%, 100% { opacity: .25; } 40% { opacity: 1; } }

/* ── Modals auf dem Handy (2026-10-13) ───────────────────────────────── */

/* 1) Schliessen-Knopf: 44 px Tippflaeche statt 32. Der negative Rand haelt
      die Kopfzeile in der alten Hoehe. */
.modal-schliessen { width: 44px; height: 44px; font-size: 1rem; flex-shrink: 0; margin: -6px -6px 0 0; position: relative; z-index: 1; }

/* 2) Abstand zwischen den Schalterzeilen in den Einstellungen */
.notif-sektion .notif-zeile + .notif-zeile { margin-top: 14px; }
.einstellung-gefahr { border-bottom: none; padding-bottom: 28px; }


/* 4) Monatspfeile im Vollkalender: mindestens 44 px breit */
.vollkal-header .plan-kal-pfeil { min-width: 44px; min-height: 44px; font-size: 1.7rem; }

/* 5) Kassenbuch: Loeschen-Kreuz mit richtiger Tippflaeche und Abstand zum Betrag */
.kb-loeschen-btn { min-width: 40px; min-height: 40px; padding: 8px 10px; margin-left: 4px; color: #999; font-size: 1rem; }

/* Rezept-Modal: Platzhalter fuer ein fehlendes Bild.
   Die allgemeine Regel (fuer die kleinen Rezeptkarten) setzt display:flex und
   height:160px. Im Modal stehen darin Icon, Text und Knopf: sie landeten
   nebeneinander und der Text war auf ein schmales Band gequetscht. */
#rezept-modal-body .rezept-bild-platzhalter {
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  height: auto; min-height: 150px; font-size: 1rem; gap: 2px;
}
/* Ohne sichtbare Knoepfe (Ladefehler, "Rezept nicht mehr verfuegbar") bleibt
   sonst eine leere Fusszeile mit Trennlinie stehen. */
#modal-rezept .modal-footer:not(:has(.btn:not(.versteckt))) { display: none; }

/* Rezept-Modal: Knopf fuer ein fehlendes Bild, ohne Kasten drumherum */
.rezept-foto-aktion { margin-bottom: 14px; }
.rezept-foto-knopf {
  display: flex; gap: 8px; align-items: center; justify-content: center;
  width: 100%; font-size: 0.92rem; padding: 12px 18px;
}
.rezept-foto-kosten {
  background: rgba(255, 255, 255, 0.25); padding: 2px 8px;
  border-radius: 10px; font-size: 0.78rem; white-space: nowrap;
}

/* Rezept-Modal: Herz (Favorit) neben dem Schliessen-Kreuz */
.modal-header-aktionen { display: flex; align-items: center; gap: 2px; flex-shrink: 0; }
.rezept-modal-fav { font-size: 1.5rem; min-width: 44px; min-height: 44px; margin-top: -6px; }

/* Oma-Siegel: kennzeichnet Rezepte von Oma Pott (Community, Meine Rezepte, Modal) */
.oma-siegel {
  display: inline-flex; align-items: center; gap: 6px;
  padding: 2px 10px 2px 3px; border-radius: 999px;
  background: linear-gradient(135deg, rgba(109, 184, 109, 0.22), rgba(109, 184, 109, 0.10));
  border: 1px solid rgba(74, 124, 74, 0.45);
  color: var(--gruen-schrift); font-size: 0.78rem; font-weight: 600; line-height: 1.4;
  white-space: nowrap;
}
.oma-siegel img { width: 24px; height: 24px; border-radius: 50%; object-fit: cover; }

/* Rezept teilen (Oma-Rezepte) */
.rezept-modal-teilen {
  width: 44px; height: 44px; margin-top: -6px; border-radius: 50%; padding: 0; cursor: pointer;
  border: 2px solid var(--gruen-hell); background: #eef6ee; color: var(--gruen-mittel);
  display: flex; align-items: center; justify-content: center; flex-shrink: 0;
}
.rezept-modal-teilen.gesperrt { border: 2px dashed #c9c2b3; background: #f4f1ea; color: #a79f8e; cursor: not-allowed; }
.rezept-modal-teilen:disabled { opacity: .6; }
.rezept-teilen-hinweis {
  margin: 0 22px 6px auto; max-width: 270px; padding: 7px 12px; border-radius: 10px;
  background: #fff4e0; border: 1px solid #f0d49a; color: #6a4a10; font-size: .78rem; font-weight: 600; line-height: 1.35;
}
.rezept-teilen-hinweis.versteckt { display: none; }
body.dark .rezept-teilen-hinweis { background: #3a2f18; border-color: #6a5420; color: #f0d49a; }
/* Kennzeichnung unter KI-Fotos */
.ki-hinweis { text-align: right; font-size: .72rem; color: #7a847a; margin: -4px 2px 10px; }

/* Oma-Tab: Logo statt Emoji in der Ueberschrift */
.oma-tab-titel { display: flex; align-items: center; gap: 12px; }
.oma-tab-logo { width: 52px; height: 52px; border-radius: 50%; object-fit: cover; flex-shrink: 0; box-shadow: 0 2px 8px rgba(26, 46, 26, 0.25); }

/* Teilen-Auswahl */
.teilen-vorschau { display: flex; gap: 14px; align-items: center; padding: 12px; border-radius: 14px; background: var(--creme); }
.teilen-vorschau img { width: 84px; height: 56px; border-radius: 10px; object-fit: cover; flex-shrink: 0; background: var(--creme-dunkel); }
.teilen-vorschau-name { font-family: var(--font-titel); font-weight: 700; font-size: 1rem; line-height: 1.3; color: var(--text-dunkel); }
.teilen-vorschau-von { font-size: .8rem; color: var(--text-hell); margin-top: 2px; }
.teilen-wahl { width: 100%; min-height: 56px; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 2px; }
.teilen-wahl small { font-size: .75rem; font-weight: 500; opacity: .8; }

/* ── Rezept-Modal nach Picnic-Vorbild (2026-10-14) ─────────────────────────
   Aufbau und Klassen: _rzSeiteHtml in app.js. Das Foto geht bis an den Rand,
   die Kopfzeile schwebt darueber (runde Knoepfe). Ist der Titel weggescrollt,
   bekommt die Karte .gescrollt: der Kopf wird weiss, mit Titel und
   Umschalter. Ohne Foto (.ohne-foto) bekommt der Inhalt oben Platz fuer den
   Kopf. Einplanen und Gekocht stehen fest im Fuss. */
#modal-rezept .rz-neu {
  position: relative; overflow: hidden; max-width: 540px;
  height: calc(90vh - var(--oben-frei) - var(--unten-modal)); max-height: none;
  /* dvh = die WIRKLICH sichtbare Hoehe. vh rechnet im Handy-Browser mit
     eingeklappter Adressleiste: das Fenster war zu hoch, Einplanen und
     Gekocht lagen unter Androids Navigationsleiste. */
  height: calc(90dvh - var(--oben-frei) - var(--unten-modal));
}

/* Kopf */
#modal-rezept .rz-kopf {
  position: absolute; top: 0; left: 0; right: 0; z-index: 3; display: block;
  padding: 10px 12px; background: transparent; border-bottom: 1px solid transparent;
  transition: background .2s, box-shadow .2s;
}
body.dark #modal-rezept .rz-kopf { background: transparent; border-bottom-color: transparent; }
.rz-kopf-zeile { display: flex; align-items: center; gap: 8px; }
#modal-rezept .rz-kopf .modal-titel {
  flex: 1; min-width: 0; margin: 0; font-family: inherit; font-size: 1rem; font-weight: 700;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis; opacity: 0; transition: opacity .15s;
}
#modal-rezept .rz-kopf .modal-header-aktionen { display: flex; gap: 8px; }
#modal-rezept .rz-rund {
  width: 40px; height: 40px; min-width: 40px; min-height: 40px; margin: 0; padding: 0;
  border-radius: 50%; border: none; background: var(--weiss); color: var(--text-dunkel);
  box-shadow: 0 2px 8px rgba(0, 0, 0, .18); display: flex; align-items: center; justify-content: center;
  font-size: 1rem; cursor: pointer;
}
#modal-rezept .rezept-modal-fav.rz-rund { font-size: 1.15rem; }
#modal-rezept .rezept-modal-teilen.gesperrt { border: none; background: var(--weiss); color: #b3ac9c; }
#modal-rezept .ohne-foto .rz-rund,
#modal-rezept .gescrollt .rz-rund { box-shadow: none; }
#modal-rezept .ohne-foto .rz-rund { background: transparent; }
#modal-rezept .gescrollt .rz-kopf {
  background: var(--weiss); border-bottom-color: var(--creme-dunkel); box-shadow: 0 2px 10px rgba(0, 0, 0, .06);
}
#modal-rezept .gescrollt .rz-kopf .modal-titel { opacity: 1; }

/* Umschalter Zutaten / Zubereitung (im Inhalt und im weissen Kopf) */
.rz-tabs { display: flex; gap: 8px; }
.rz-tab {
  height: 40px; padding: 0 18px; border-radius: 20px; border: none; background: transparent;
  color: var(--text-mittel); font: inherit; font-size: .95rem; font-weight: 500; cursor: pointer;
}
.rz-tab.aktiv { background: var(--gruen-mittel); color: #fff; font-weight: 700; }
#modal-rezept .rz-tabs-kopf { display: none; padding: 8px 0 0 4px; }
#modal-rezept .gescrollt.mit-tabs .rz-tabs-kopf { display: flex; }

/* Inhalt */
#modal-rezept .rz-neu .modal-body { position: relative; display: block; padding: 0 0 16px; }
#modal-rezept .ohne-foto .modal-body { padding-top: 60px; }
.rz-hero { position: relative; }
.rz-hero-bild { display: block; width: 100%; height: 280px; object-fit: cover; }
.rz-ki {
  position: absolute; left: 14px; bottom: 12px; padding: 4px 10px; border-radius: 99px;
  background: rgba(20, 32, 20, .78); color: #f5f0e8; font-size: .7rem; font-weight: 500;
}
.rz-inhalt { padding: 16px 18px 8px; }
.rz-von { margin-bottom: 6px; font-size: .85rem; color: var(--text-mittel); }
.rz-titel { margin: 0; font-family: var(--font-titel); font-size: 1.6rem; line-height: 1.18; color: var(--text-dunkel); }

/* Ohne Foto: Oma und der Knopf, kein Kasten */
.rz-foto-aktion { display: flex; align-items: center; gap: 4px; margin: 14px 0 0; }
.rz-foto-oma { width: 84px; height: 84px; object-fit: contain; flex-shrink: 0; margin-left: -8px; }
/* .btn bricht nie um (nowrap): der lange Text schob den Knopf aus dem Fenster */
.rz-foto-aktion .rezept-foto-knopf {
  flex: 1; min-width: 0; width: auto; justify-content: space-between; text-align: left; min-height: 52px;
  white-space: normal; line-height: 1.25; padding: 10px 12px 10px 18px;
}
.rz-foto-aktion .rezept-foto-knopf > span:first-child { flex: 1; min-width: 0; }
.rz-foto-aktion .rezept-foto-kosten { flex-shrink: 0; }

/* Kennzahlen */
.rz-zahlen { display: grid; margin-top: 14px; padding: 10px 0; border-top: 1px solid var(--creme-dunkel); border-bottom: 1px solid var(--creme-dunkel); }
.rz-zahlen > div { text-align: center; display: flex; flex-direction: column; gap: 1px; }
.rz-zahlen > div + div { border-left: 1px solid var(--creme-dunkel); }
.rz-zahlen b { font-size: 1.25rem; color: var(--text-dunkel); }
.rz-zahlen b.rz-gruen { color: var(--gruen-schrift); }
.rz-zahlen span { font-size: .75rem; color: var(--text-mittel); }
.rz-inhalt > .rz-tabs { margin-top: 14px; }

/* Abschnitte */
.rz-abschnitt { margin-top: 18px; }
.rz-abschnitt-kopf { display: flex; align-items: center; justify-content: space-between; gap: 10px; flex-wrap: wrap; margin-bottom: 4px; }
.rz-abschnitt-kopf h2 { margin: 0; font-family: var(--font-titel); font-size: 1.3rem; color: var(--text-dunkel); }
#modal-rezept .rz-abschnitt .portionen-btn { width: 40px; height: 40px; border-radius: 12px; }

/* Zutaten: Name fett, Menge dahinter, rechts "da" / "fehlt" und Plus */
.rz-liste { list-style: none; margin: 0; padding: 0; }
#modal-rezept .rz-zutat { display: flex; align-items: center; gap: 8px; min-height: 48px; padding: 4px 0; border-bottom: 1px solid var(--creme-dunkel); }
.rz-zutat-text { flex: 1; min-width: 0; font-size: 1rem; line-height: 1.35; color: var(--text-dunkel); }
#modal-rezept .rz-zutat .rezept-zutat-menge { display: inline; min-width: 0; width: auto; font-weight: 400; color: var(--text-mittel); }
#modal-rezept .rz-zutat .zutat-indikator {
  width: auto; height: auto; min-width: 0; flex-shrink: 0; border-radius: 99px; font-size: .75rem; line-height: 1.2;
}
#modal-rezept .rz-da { background: none; color: var(--gruen-schrift); font-weight: 600; padding: 0; }
#modal-rezept .rz-fehlt { background: #fbe9d7; color: #8a4a0f; font-weight: 700; padding: 3px 9px; }
body.dark #modal-rezept .rz-fehlt { background: #4a3218; color: #f3c58f; }
#modal-rezept .rz-liste { background: #e4efe0; color: #2d4a2d; font-weight: 700; padding: 3px 9px; }
body.dark #modal-rezept .rz-liste { background: #24382a; color: #a9d6a9; }
#modal-rezept .rz-plus { width: 36px; height: 36px; min-width: 36px; border-radius: 50%; flex-shrink: 0; }
.rz-kaufen {
  width: 100%; margin-top: 12px; min-height: 48px; border-radius: 14px; border: none;
  background: #fbe9d7; color: #6e3a0b; font-weight: 700;
}
body.dark .rz-kaufen { background: #4a3218; color: #f3c58f; }

/* Zubereitung */
.rz-wach { display: inline-flex; align-items: center; gap: 5px; font-size: .75rem; color: var(--text-mittel); }
.rz-wach[hidden] { display: none; }
.rz-schritte { list-style: none; margin: 8px 0 0; padding: 0; display: flex; flex-direction: column; gap: 14px; }
.rz-schritte li { display: flex; gap: 12px; }
.rz-schritt-nr {
  flex-shrink: 0; width: 30px; height: 30px; border-radius: 50%; background: #e6f0e2; color: var(--gruen-schrift);
  font-weight: 700; font-size: .85rem; display: flex; align-items: center; justify-content: center;
}
body.dark .rz-schritt-nr { background: #2f4a2f; color: #cfe8c8; }
.rz-schritt-text { padding-top: 4px; font-size: 1rem; line-height: 1.55; color: var(--text-dunkel); }

/* Speichern, Bewertung, Quelle, Melden */
.rz-oma-speichern { margin-top: 20px; padding-top: 16px; border-top: 1px solid var(--creme-dunkel); display: flex; flex-direction: column; gap: 6px; }
.rz-oma-speichern .btn { width: 100%; }
.rz-klein { font-size: .78rem; color: var(--text-mittel); text-align: center; }
.rz-bewertung { margin-top: 20px; padding: 14px; border-radius: 16px; background: var(--creme); display: flex; flex-direction: column; align-items: center; gap: 2px; }
.rz-bew-titel { font-family: var(--font-titel); font-weight: 700; font-size: 1.1rem; color: var(--text-dunkel); }
.rz-sterne { display: flex; }
.rz-sterne .stern { width: 44px; height: 44px; padding: 0; border: none; background: none; font-size: 1.8rem; cursor: pointer; }
.rz-bew-schnitt { font-size: .8rem; color: var(--text-mittel); }
.rz-fuss { margin-top: 14px; display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }
.rz-link { min-height: 44px; display: inline-flex; align-items: center; color: var(--gruen-schrift); font-size: .85rem; font-weight: 600; }
.rz-melden { min-height: 44px; margin-left: auto; border: none; background: none; color: #8a8a8a; font-size: .78rem; cursor: pointer; }

/* Fuss: Einplanen und Gekocht */
#modal-rezept .rz-fussleiste {
  padding: 10px 14px 12px; border-top: 1px solid var(--creme-dunkel); background: var(--weiss);
  display: flex; flex-wrap: nowrap; gap: 10px; justify-content: stretch;
}
#modal-rezept .rz-fussleiste .btn {
  flex: 1 1 0; min-height: 50px; border-radius: 14px; display: flex; align-items: center; justify-content: center;
  gap: 8px; font-weight: 700; font-size: .95rem;
}
#modal-rezept .rz-fussleiste .versteckt { display: none; }
#modal-rezept .rz-einplanen { background: var(--weiss); border: 2px solid var(--gruen-mittel); color: var(--gruen-schrift); }

@media (max-width: 640px) {
  #modal-rezept { padding: 6px; padding-bottom: calc(6px + var(--tastatur-hoehe)); }
  #modal-rezept .rz-neu {
    height: calc(98vh - var(--oben-frei) - var(--unten-modal));
    height: calc(98dvh - var(--oben-frei) - var(--unten-modal));
    border-radius: 18px;
  }
  .rz-hero-bild { height: 240px; }
}

/* ── Saison-Karte und Themenwelt aus Omas Kuechenjournal (ladeSaisonKarte) ── */
.dash-saison {
  display: grid; grid-template-columns: minmax(0, 1fr) 118px; width: 100%; min-height: 128px;
  margin: 0 0 14px; padding: 0; border: 0; border-radius: var(--radius); overflow: hidden; cursor: pointer;
  background: var(--gruen-dunkel); color: #f5f0e8; text-align: left; font: inherit;
  box-shadow: 0 4px 16px var(--schatten); transition: transform 0.18s ease;
}
.dash-saison[hidden] { display: none; }
.dash-saison:active { transform: scale(0.985); }
.dash-saison.dunkel { background: #1d1712; color: #f3ead9; }
.dash-saison-text { padding: 16px; display: grid; gap: 4px; align-content: center; min-width: 0; }
.dash-saison-text small { font-size: 0.68rem; font-weight: 700; letter-spacing: 0.1em; text-transform: uppercase; color: #e7b552; }
.dash-saison-text b { font-family: var(--font-titel, "Playfair Display", serif); font-size: 1.15rem; line-height: 1.2; }
.dash-saison-text span { font-size: 0.8rem; opacity: 0.82; }
.dash-saison img { width: 118px; height: 100%; object-fit: cover; }

.saison-welt .oma-modal-body { padding: 0 0 18px; }
.saison-held { display: block; width: 100%; aspect-ratio: 4 / 3; object-fit: cover; }
.saison-ki { text-align: right; font-size: 0.7rem; color: var(--text-mittel); padding: 4px 14px 0; }
.saison-titel { font-family: var(--font-titel, "Playfair Display", serif); font-size: 1.5rem; line-height: 1.15; margin: 14px 18px 0; color: var(--text-dunkel); }
.saison-oma { display: grid; grid-template-columns: 58px minmax(0, 1fr); gap: 10px; align-items: start; margin: 14px 18px 0; padding: 12px; border-radius: 14px; background: var(--creme); }
.saison-oma img { width: 58px; }
.saison-oma p { margin: 0 0 6px; font-size: 0.9rem; line-height: 1.5; color: var(--text-dunkel); }
.saison-oma p:last-child { margin: 0; }
.saison-raster { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px; margin: 16px 18px 0; }
.saison-rezept { display: grid; gap: 4px; padding: 0 0 10px; border: 1px solid var(--creme-dunkel); border-radius: 14px; overflow: hidden; background: var(--weiss); text-align: left; font: inherit; cursor: pointer; color: var(--text-dunkel); }
.saison-rezept img, .saison-ohne { display: block; width: 100%; aspect-ratio: 4 / 3; object-fit: cover; background: var(--creme); }
.saison-ohne { display: grid; place-items: center; font-size: 2rem; }
.saison-rezept b { padding: 0 10px; font-size: 0.86rem; line-height: 1.25; }
.saison-rezept small { padding: 0 10px; font-size: 0.72rem; color: var(--text-mittel); }
.saison-welt.dunkel { background: #1d1712; }
.saison-welt.dunkel .oma-modal-kopf { background: #120e0b; color: #f3ead9; border-bottom-color: #3d3229; }
.saison-welt.dunkel .oma-modal-x { color: #f3ead9; }
.saison-welt.dunkel .saison-titel, .saison-welt.dunkel .saison-oma p { color: #f3ead9; }
.saison-welt.dunkel .saison-oma { background: #2a221b; }
.saison-welt.dunkel .saison-rezept { background: #2a221b; border-color: #3d3229; color: #f3ead9; }
.saison-welt.dunkel .saison-rezept small, .saison-welt.dunkel .saison-ki { color: #c9bba5; }
