:root {
  --bg: #f2f2f7;
  --card-bg: #ffffff;
  --text: #1c1c1e;
  --text-sekundaer: #8a8a8e;
  --trennlinie: #e5e5ea;
  --akzent: #007aff;
  --stufe-offen: #8a8a8e;
  --stufe-laufend: #007aff;
  --stufe-unterwegs: #5856d6;
  --stufe-kritisch: #ff9500;
  --stufe-storniert: #ff3b30;
  --gefahr: #ff3b30;
  --erfolg: #34c759;
  --radius: 12px;
}

@media (prefers-color-scheme: dark) {
  :root {
    --bg: #000000;
    --card-bg: #1c1c1e;
    --text: #f2f2f7;
    --text-sekundaer: #98989d;
    --trennlinie: #38383a;
  }
}

* { box-sizing: border-box; -webkit-tap-highlight-color: transparent; }

/* App-Shell-Layout statt position:fixed/sticky fuers Kopf-/Fussbereich:
   auf iOS blieb die Tabbar als Homescreen-App (standalone, kein Safari-
   Chrome) trotz mehrerer fixed-Workarounds nicht zuverlaessig unten
   angepinnt (Simon, 15.09.2026: "die Fussleiste ist nicht 'unten'
   angepinnt"). Stattdessen: body ist eine 100dvh hohe Flex-Spalte,
   Header/Tabbar sind darin normale (nicht positionierte) Blöcke am
   Anfang/Ende, NUR <main> scrollt intern - dadurch bleiben Header und
   Tabbar immer exakt am Bildschirmrand, unabhaengig von Standalone- oder
   Safari-Modus, unabhaengig von der Inhaltslaenge. */
html { height: 100%; background: var(--bg); }
body {
  display: flex;
  flex-direction: column;
  /* --vh wird inline im <head> per JS aus window.innerHeight gesetzt -
     100dvh/100vh allein berechneten sich im iOS-Standalone-Modus falsch
     zu niedrig, sodass unten echter Leerraum blieb (Simon, 15.09.2026,
     Screenshot). var(..., 1vh) als Fallback, falls JS mal nicht laeuft. */
  height: calc(var(--vh, 1vh) * 100);
  margin: 0;
  font-family: -apple-system, BlinkMacSystemFont, "SF Pro Text", Helvetica, Arial, sans-serif;
  background: var(--bg);
  color: var(--text);
  overflow: hidden;
  -webkit-font-smoothing: antialiased;
}

.kopf {
  flex: none;
  /* Safari 26/iOS 27 sucht am oberen Rand ein position:fixed/sticky-Element,
     um dessen Hintergrundfarbe fuer die Statusleiste zu nehmen - sonst legt
     es einen "Liquid Glass"-Blur darueber (Simon, 15.09.2026, nur iOS 27,
     nur installierte App). Layoutneutral: body scrollt nicht, nur main. */
  position: sticky;
  top: 0;
  z-index: 1;
  display: flex;
  align-items: center;
  justify-content: space-between;
  /* env(safe-area-inset-left/right) statt festem 16px - im Querformat
     wandert die Notch/Dynamic Island an die Seite und die Ecken sind dort
     staerker abgerundet; ohne den Sicherheitsabstand sassen die Icons
     fast in der Rundung (Simon, 15.09.2026: "im Quer-Modus sind die Icons
     zu weit an der Seite"). */
  padding: calc(10px + env(safe-area-inset-top)) calc(16px + env(safe-area-inset-right)) 10px calc(16px + env(safe-area-inset-left));
  background: var(--bg);
  border-bottom: 1px solid var(--trennlinie);
}
.kopf h1 { font-size: 17px; margin: 0; font-weight: 600; }
/* Ein gemeinsamer Regelblock fuer ALLE Header-Icons (Burger, Lupe, Reload,
   Einstellungen, Abmelden) statt fast identischer Einzelregeln, die
   auseinanderdriften konnten - z.B. hatten <button>- und <a>-Elemente
   unterschiedliche Browser-Standardwerte (margin/font/border), was den
   Abstand zwischen ihnen ungleichmaessig wirken liess (Simon, 15.09.2026:
   "sieht kleiner aus"/"Abstand zwischen den Icons ist unterschiedlich").
   Bewusst 28x28 mit 20x20-SVG fuer alle, egal ob <button> oder <a>. */
.burger, .suche-btn, .reload-btn, .einstellungen-link, .logout, .zurueck-link {
  box-sizing: border-box;
  margin: 0;
  padding: 0;
  border: none;
  background: none;
  color: var(--akzent);
  display: flex;
  align-items: center;
  justify-content: center;
  width: 28px;
  height: 28px;
  cursor: pointer;
  text-decoration: none;
}
.burger svg, .suche-btn svg, .reload-btn svg, .einstellungen-link svg, .logout svg, .zurueck-link svg {
  width: 20px;
  height: 20px;
}
.burger[hidden], .suche-btn[hidden] { visibility: hidden; }
.kopf-aktionen { display: flex; align-items: center; gap: 4px; }
/* Rot, weil eine destruktive/abschliessende Aktion (Simon, 15.09.2026:
   "Statt dem Wort Abmelden ein rotes Icon, dann sparen wir Platz"). */
.logout { color: var(--gefahr); }

@keyframes inflow-dreh { to { transform: rotate(360deg); } }
.reload-btn.dreht svg { animation: inflow-dreh 0.6s linear; }
@media (prefers-reduced-motion: reduce) {
  .reload-btn.dreht svg { animation: none; }
}

.filter-panel { flex: none; padding: 10px calc(16px + env(safe-area-inset-right)) 10px calc(16px + env(safe-area-inset-left)); border-bottom: 1px solid var(--trennlinie); }
.filter-panel[hidden] { display: none; }
.filter-gruppe { margin-bottom: 10px; }
.filter-gruppe:last-child { margin-bottom: 0; }
.filter-label { display: block; font-size: 11px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.03em; color: var(--text-sekundaer); margin-bottom: 6px; }
/* Umbricht statt seitlich zu scrollen - horizontales Scrollen in einer
   Filterleiste war auf dem iPhone verwirrend, weil nicht sofort
   erkennbar war, dass da noch mehr Chips ausserhalb des sichtbaren
   Bereichs liegen (Simon, 15.09.2026). */
.chips { display: flex; flex-wrap: wrap; gap: 8px; }
.chip {
  flex: none;
  padding: 6px 14px;
  border-radius: 999px;
  border: 1px solid var(--trennlinie);
  background: var(--card-bg);
  color: var(--text);
  font-size: 14px;
}
.chip.aktiv { background: var(--akzent); color: #fff; border-color: var(--akzent); }

main { flex: 1 1 auto; overflow-y: auto; -webkit-overflow-scrolling: touch; padding: 16px calc(16px + env(safe-area-inset-right)) 16px calc(16px + env(safe-area-inset-left)); }
.hinweis { color: var(--text-sekundaer); font-size: 13px; margin: 0 4px 12px; }
.leer { text-align: center; color: var(--text-sekundaer); margin-top: 48px; font-size: 15px; }

.such-leiste {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 8px 12px;
  margin-bottom: 12px;
  border-radius: 10px;
  background: var(--card-bg);
  color: var(--text-sekundaer);
}
/* Ohne das gewinnt "display: flex" oben gegen das Browser-Standard-
   Verhalten von [hidden] (gleiche CSS-Spezifitaet, Autoren-Regel schlaegt
   UA-Regel) - die Leiste blieb dadurch trotz hidden-Attribut sichtbar
   (Simon, 15.09.2026: "wird immer noch standardmaessig angezeigt"). */
.such-leiste[hidden] { display: none; }
.such-leiste svg { flex: none; width: 18px; height: 18px; }
.such-leiste input {
  flex: 1;
  min-width: 0;
  border: none;
  background: none;
  outline: none;
  font-size: 16px;
  color: var(--text);
}
.such-leiste input::placeholder { color: var(--text-sekundaer); }

.liste {
  list-style: none;
  margin: 0;
  padding: 0;
  border-radius: var(--radius);
  overflow: hidden;
  background: var(--card-bg);
}
.zeile { position: relative; overflow: hidden; border-bottom: 1px solid var(--trennlinie); }
.zeile:last-child { border-bottom: none; }

.zeile-vordergrund {
  position: relative;
  z-index: 1;
  background: var(--card-bg);
  touch-action: pan-y;
}

.zeile-inhalt { display: flex; justify-content: space-between; align-items: center; gap: 10px; padding: 14px 16px; }
.favicon { flex: none; width: 22px; height: 22px; border-radius: 5px; object-fit: contain; background: var(--bg); }
.zeile-haupt { display: flex; flex-direction: column; gap: 2px; min-width: 0; flex: 1; }
/* Artikel/Titel ist die Hauptsache ("was habe ich bestellt"), Lieferant
   nur noch Kontext darunter - Simon 14.09.2026: "Betonung auf Artikel und
   nicht wo". */
.titel { font-weight: 600; font-size: 15px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 60vw; }
/* Ohne das umbrach "Lieferant · vor X Tagen" bei wenig Platz auf zwei
   Zeilen und ueberlappte optisch die naechsten Elemente in der Zeile
   (Simon, 15.09.2026: "das Layout ist nicht so gut", iPhone-Screenshot). */
.lieferant { display: block; font-size: 13px; color: var(--text-sekundaer); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.zeile-zeit { font-size: 11px; color: var(--text-sekundaer); }

/* Hauptliste: eigenes 3-Zeilen-Layout statt einer einzigen ueberladenen
   Zeile (Simon, 15.09.2026: Icons oben zusammen, Titel/Artikel ueber
   zwei Zeilen, Lieferdatum unter den Buttons). Nur hier - "Kuerzlich
   erledigt" behaelt die einfache einzeilige Darstellung oben
   (.zeile-inhalt Basisregel). */
.liste-hauptliste .zeile-inhalt { flex-direction: column; align-items: stretch; gap: 6px; }
.zeile-symbolreihe { display: flex; align-items: center; gap: 8px; }
/* Titel bleibt zwischen Store-Icon und den Buttons (nicht darunter),
   wird aber zweizeilig statt einzeilig abgeschnitten (Simon, 15.09.2026:
   "den Text trotzdem gerne zwischen den Icons, nur eben zweizeilig"). */
.zeile-symbolreihe > .titel {
  flex: 1;
  min-width: 0;
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 2;
  overflow: hidden;
  white-space: normal;
  max-width: 100%;
}
.zeile-unterzeile { display: flex; justify-content: space-between; align-items: baseline; gap: 8px; }
.zeile-unterzeile .lieferant { flex: 1; min-width: 0; }
/* Rechnungen-Tab: Datum in die obere Ecke statt einer eigenen Zeile, damit
   mehr Platz fuer Betreff/Absender bleibt (Simon, 15.09.2026: "Datum in
   die obere Ecke, sodass mehr Platz für Betreff und Absenderadresse
   ist"). */
.zeile-datum-ecke { flex: none; font-size: 11px; color: var(--text-sekundaer); white-space: nowrap; align-self: flex-start; }
.oeffnen-btn, .aktion-btn {
  flex: none;
  width: 30px;
  height: 30px;
  display: flex;
  align-items: center;
  justify-content: center;
  border-radius: 8px;
  border: none;
  cursor: pointer;
}
.oeffnen-btn svg, .aktion-btn svg { width: 16px; height: 16px; }
.oeffnen-btn {
  color: var(--akzent);
  background: color-mix(in srgb, var(--akzent) 12%, transparent);
}
/* "Gleicher Stiel" wie der Oeffnen-Button (gleiche Form/Groesse), aber
   gruen eingefaerbt, damit "abschliessen" optisch von "oeffnen"
   unterscheidbar bleibt. */
.aktion-btn {
  color: var(--erfolg);
  background: color-mix(in srgb, var(--erfolg) 12%, transparent);
}
/* Klick-Bestaetigung erscheint direkt an der Stelle des Hakens selbst -
   gleiche Groesse/Optik wie der Aktions-Button, keine grosse eigene Box
   (Simon, 15.09.2026: "der Slide-over direkt neben dem Haken, Höhe und
   Style gleich dem Haken, nicht als extra Box"). Ersetzt fuer den
   Maus-/Klick-Pfad das fruehere "ganze Zeile aufschieben" - der
   Touch-Swipe (siehe .swipe-aktionen) bleibt unveraendert. */
.aktion-inline { flex: none; display: flex; align-items: center; }
.aktion-inline-bestaetigung { display: flex; gap: 6px; }
.aktion-inline-bestaetigung[hidden] { display: none; }
.x-btn-klein {
  flex: none;
  width: 30px;
  height: 30px;
  display: flex;
  align-items: center;
  justify-content: center;
  border-radius: 8px;
  border: none;
  cursor: pointer;
  color: #fff;
  background: var(--text-sekundaer);
}
.x-btn-klein svg { width: 16px; height: 16px; }
/* Zeigt den tatsaechlichen Aktionstext (z.B. "Erhalten") statt eines
   zweiten Hakens - klarer, was genau bestaetigt wird (Simon, 15.09.2026:
   "statt einem weiteren Haken sollte der Aktionstext in dem Feld
   erscheinen"). Gleiche Hoehe wie die Icon-Buttons daneben. */
.ja-btn-klein {
  /* min-height statt fest 30px + Umbruch erlaubt, damit laengere Labels
     wie "Zur Kenntnis genommen" nicht aus der Box laufen (Simon,
     15.09.2026, iPhone-Screenshot). */
  flex: none;
  min-height: 30px;
  max-width: 130px;
  padding: 4px 10px;
  border-radius: 8px;
  border: none;
  cursor: pointer;
  color: #fff;
  background: var(--erfolg);
  font-size: 12px;
  font-weight: 600;
  line-height: 1.2;
  white-space: normal;
  text-align: center;
}
.zeile-status {
  font-size: 12px;
  font-weight: 600;
  padding: 4px 10px;
  border-radius: 999px;
  color: #fff;
  background: var(--stufe-offen);
  /* Einheitliche Breite, sonst springt die rechte Spalte je nach
     Status-Text unterschiedlich weit rein und das Grid wirkt kaputt
     (Simon, 14.09.2026: "flags alle gleich machen in der Breite"). */
  display: inline-block;
  min-width: 96px;
  text-align: center;
}
.zeile-status--ruhig { background: none; color: var(--text-sekundaer); font-weight: 400; }
.zeile-lieferung { flex: none; font-size: 11px; color: var(--text-sekundaer); white-space: nowrap; }

/* Status als kompaktes Icon statt Text-Pille - Simon, 15.09.2026:
   "können wir uns ein paar Icons für die Zustände überlegen? Bestellt
   Einkaufswagen, Versendet Paket, Zugestellt Briefkasten, Storniert X im
   Kreis" - spart auf dem iPhone dringend noetigen Platz in der Zeile
   gegenueber der vorherigen ~96px breiten Text-Pille. Bewusst nach dem
   generischen status_stufe eingefaerbt/ausgewaehlt (offen/laufend/
   kritisch/storniert), nicht nach dem kategorie-spezifischen Text -
   inflow bleibt so weiterhin ohne Bestellungen/Tracking-Sonderwissen.
   Der volle Text bleibt als title/aria-label und in den Details. */
.zeile-status-icon {
  flex: none;
  width: 30px;
  height: 30px;
  border-radius: 8px;
  display: flex;
  align-items: center;
  justify-content: center;
}
.zeile-status-icon svg { width: 17px; height: 17px; }
.stufe-offen .zeile-status-icon { color: var(--stufe-offen); background: color-mix(in srgb, var(--stufe-offen) 15%, transparent); }
.stufe-laufend .zeile-status-icon { color: var(--stufe-laufend); background: color-mix(in srgb, var(--stufe-laufend) 15%, transparent); }
.stufe-unterwegs .zeile-status-icon { color: var(--stufe-unterwegs); background: color-mix(in srgb, var(--stufe-unterwegs) 15%, transparent); }
.stufe-kritisch .zeile-status-icon { color: var(--stufe-kritisch); background: color-mix(in srgb, var(--stufe-kritisch) 15%, transparent); }
.stufe-storniert .zeile-status-icon { color: var(--stufe-storniert); background: color-mix(in srgb, var(--stufe-storniert) 15%, transparent); }

/* Auf Touch-Geraeten gibt es schon die Swipe-Geste zum Abschliessen - der
   zusaetzliche Haken war dort nur redundante Flaeche (Simon, 15.09.2026,
   iPhone-Screenshot: "der Haken sollte ja nicht angezeigt werden, da wir
   ja die Swipe-Geste haben"). Bleibt auf Maus-Geraeten (kein Touch)
   sichtbar, wo es die einzige Moeglichkeit zum Abschliessen ist. */
@media (pointer: coarse) {
  .aktion-inline { display: none; }
}

.stufe-offen .zeile-status { background: var(--stufe-offen); }
.stufe-laufend .zeile-status { background: var(--stufe-laufend); }
.stufe-kritisch .zeile-status { background: var(--stufe-kritisch); }
.stufe-storniert .zeile-status { background: var(--stufe-storniert); }

.details { padding: 0 16px 14px; font-size: 14px; color: var(--text-sekundaer); }
.details[hidden] { display: none; }
.detail-liste { list-style: none; margin: 0; padding: 0; }
.detail-liste li { padding: 3px 0; border-bottom: 1px dashed var(--trennlinie); }
.detail-liste li:last-child { border-bottom: none; }
.detail-liste strong { color: var(--text); font-weight: 600; }
.detail-unterliste { list-style: disc; margin: 4px 0 0; padding: 0 0 0 18px; }
.detail-unterliste li { padding: 2px 0; border-bottom: none; }

.swipe-aktionen {
  position: absolute;
  top: 0; bottom: 0; right: 0;
  display: flex;
  align-items: stretch;
}
.abschliessen-btn {
  /* Umbruch statt Ueberlaufen bei langen Labels wie "Zur Kenntnis
     genommen" (Simon, 15.09.2026, iPhone-Screenshot). */
  display: flex;
  align-items: center;
  justify-content: center;
  text-align: center;
  white-space: normal;
  border: none;
  color: #fff;
  font-size: 13px;
  font-weight: 600;
  line-height: 1.2;
  padding: 0 12px;
  cursor: pointer;
  background: var(--erfolg);
}

.tabbar {
  /* Kein position:fixed mehr noetig - als letzter Block der Body-Flex-
     Spalte (siehe body-Regel oben) sitzt sie immer exakt am Bildschirmrand,
     auch im Standalone-Modus, und muss beim Scrollen nirgends "mithalten"
     (main scrollt separat). */
  flex: none;
  display: flex;
  background: var(--card-bg);
  border-top: 1px solid var(--trennlinie);
  padding-bottom: env(safe-area-inset-bottom);
  padding-left: env(safe-area-inset-left);
  padding-right: env(safe-area-inset-right);
}
.tabbar a {
  flex: 1;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 2px;
  text-align: center;
  padding: 8px 4px 6px;
  font-size: 11px;
  color: var(--text-sekundaer);
  text-decoration: none;
}
.tab-icon { width: 24px; height: 24px; display: block; }
.tab-icon svg { width: 100%; height: 100%; }
.tabbar a.aktiv { color: var(--akzent); font-weight: 600; }

.kuerzlich-erledigt { margin-top: 16px; font-size: 13px; color: var(--text-sekundaer); }
.kuerzlich-erledigt summary { cursor: pointer; padding: 6px 4px; font-weight: 600; }
.kuerzlich-erledigt .liste { margin-top: 8px; opacity: 0.75; }
.rueckgaengig-btn {
  flex: none;
  border: 1px solid var(--trennlinie);
  background: var(--card-bg);
  color: var(--akzent);
  border-radius: 8px;
  padding: 5px 10px;
  font-size: 12px;
  font-weight: 600;
}

.login-body {
  display: flex;
  flex-direction: row;
  align-items: center;
  justify-content: center;
  height: 100vh;
  margin: 0;
  overflow: auto;
  background: var(--bg);
  font-family: -apple-system, BlinkMacSystemFont, sans-serif;
  color: var(--text);
}
.login-form { display: flex; flex-direction: column; gap: 12px; width: 100%; max-width: 320px; padding: 24px; }
.login-icon { width: 88px; height: 88px; border-radius: 20px; margin: 0 auto 4px; display: block; box-shadow: 0 6px 20px rgba(0, 90, 200, 0.35); }
.login-form h1 { text-align: center; margin: 0 0 12px; }
.login-form input {
  padding: 12px 14px;
  border-radius: 10px;
  border: 1px solid var(--trennlinie);
  background: var(--card-bg);
  color: var(--text);
  font-size: 16px;
}
.login-form button {
  padding: 12px;
  border-radius: 10px;
  border: none;
  background: var(--akzent);
  color: #fff;
  font-size: 16px;
  font-weight: 600;
}
.fehler { color: var(--gefahr); text-align: center; margin: 0; font-size: 14px; }
.versionsnummer { color: var(--text-sekundaer); text-align: center; margin: 4px 0 0; font-size: 11px; }
.erfolg-hinweis { color: var(--erfolg); text-align: center; margin: 0; font-size: 14px; }

.einstellungen-form {
  display: flex;
  flex-direction: column;
  gap: 12px;
  max-width: 360px;
  margin: 24px auto;
  padding: 0 16px;
}
.einstellungen-form h2 { margin: 0 0 4px; font-size: 17px; }
.einstellungen-form input {
  padding: 12px 14px;
  border-radius: 10px;
  border: 1px solid var(--trennlinie);
  background: var(--card-bg);
  color: var(--text);
  font-size: 16px;
}
.einstellungen-form button {
  padding: 12px;
  border-radius: 10px;
  border: none;
  background: var(--akzent);
  color: #fff;
  font-size: 16px;
  font-weight: 600;
}
