/* ══════════════════════════════════════════════════════════════════════════
   SC BUSINESS HUB — DESIGN-TOKENS
   ══════════════════════════════════════════════════════════════════════════
   DIES IST DIE EINE DATEI. Farben, Abstände, Radien und Schriftgrößen werden
   AUSSCHLIESSLICH hier definiert. Wer im Hub eine Farbe braucht, nimmt eine
   Variable von hier — niemals einen neuen Hex-Wert.

   Warum: Der Hub hatte 568 verschiedene Hex-Farben (u. a. 22 Schreibweisen
   derselben Linienfarbe und 25 Warntöne). Jedes Feature hat sich seine eigenen
   Werte ausgedacht, deshalb sah nichts nach demselben Produkt aus.

   Herkunft der Werte: SC-Stylebook.md (neue Website) — der Hub ist die helle
   Schwester derselben Marke.
   ══════════════════════════════════════════════════════════════════════════ */

:root{
  /* ── Marke ────────────────────────────────────────────────────────────── */
  --sc-ink:#14171A;            /* Haupttext, dunkle Flächen */
  --sc-ink-2:#1C2024;          /* dunkle Fläche 2 */
  --sc-lime:#CAD759;           /* CI-Akzent: Flächen, aktive Zustände */
  --sc-lime-2:#D9E85C;         /* Hover */
  --sc-lime-deep:#9FB024;      /* Akzent AUF Weiß (Text/Icons) — nie --sc-lime für Text! */
  --sc-olive:#808338;

  /* ── Flächen ──────────────────────────────────────────────────────────────
     ZWEI WELTEN (Dennis 15.08.2026):
       Hub    = dunkel  → Arbeitswerkzeug, man erkennt sofort „ich bin im Hub"
       Portal = hell    → wie die Website, das sieht der Kunde
     Beide teilen Marke, Raster und Bausteine — nur die Flächen kippen.
     Der Hub setzt <html class="sc-dark"> (siehe unten). */
  --sc-paper:#FFFFFF;          /* Karten, Modals */
  --sc-bg:#F4F6F3;             /* App-Hintergrund */
  --sc-sunk:#FAFBF8;           /* eingelassene Flächen, Eingabefelder */
  --sc-mist:#E9ECE6;           /* neutrale Füllung (Pills, Platzhalter) */

  /* ── Text: 3 Stufen, mehr braucht niemand ─────────────────────────────── */
  --sc-text:#14171A;           /* Haupttext */
  --sc-muted:#5B636A;          /* Sekundärtext, Labels */
  /* --sc-faint war #8A9199 und erreichte nur 2,9:1 auf Weiss — zu blass fuer
     Zaehler, Tabellenkoepfe und Reiter, die alle darauf zeigten. Jetzt 4,6:1. */
  --sc-faint:#6B737B;          /* Hinweise, Leerzustände, deaktiviert */
  --sc-on-dark:#FFFFFF;
  --sc-on-dark-muted:rgba(255,255,255,.64);

  /* ── Linien: EINE Farbe in zwei Stärken ───────────────────────────────── */
  --sc-line:rgba(20,23,26,.10);
  --sc-line-strong:rgba(20,23,26,.16);
  --sc-line-dark:rgba(255,255,255,.13);

  /* ── Status: je Rolle genau ein Textton + eine Fläche ─────────────────── */
  --sc-ok:#2E7D32;        --sc-ok-bg:#EDF5E9;      --sc-ok-line:#CFE3C6;
  --sc-warn:#B06F00;      --sc-warn-bg:#FDF3E2;    --sc-warn-line:#EFDDBC;
  --sc-bad:#B3261D;       --sc-bad-bg:#FBECEA;     --sc-bad-line:#EFCFCB;
  --sc-info:#3F6C8C;      --sc-info-bg:#EAF1F6;    --sc-info-line:#CFDDE7;

  /* ── Semantische Rollen (Migration der Altfarben) ─────────────────────────
     Diese Werte sind BEWUSST noch die bisherigen Hub-Farben. Dadurch aendert die
     Migration nichts am Aussehen. Die Umstellung auf die Marke passiert danach
     hier — an genau einer Stelle. */
  --sc-primary:#6E7A1E;         /* Aktion/Link — CI-Oliv, kontraststark auf Weiss */
  --sc-primary-hover:#5F6229;
  --sc-primary-bg:#F4F7E4;      /* helle Aktionsflaeche (btn-icon, Hinweise) */
  --sc-primary-line:#DDE4B8;
  --sc-success:#2E7D32;         --sc-success-bg:#EDF5E9;
  --sc-attention:#B06F00;       --sc-attention-bg:#FDF3E2;
  --sc-danger:#B3261D;          --sc-danger-bg:#FBECEA;
  --sc-danger-2:#B3261D;        /* zweiter Rotton faellt mit dem ersten zusammen */
  --sc-head:#14171A;            /* Kopfleiste + Ueberschriften — CI-Anthrazit */
  --sc-app-bg:#F4F6F3;          /* App-Hintergrund mit leichtem Gruenstich */

  /* ── Abstände: 4px-Raster. Keine krummen Werte mehr. ──────────────────── */
  --sc-1:4px;  --sc-2:8px;  --sc-3:12px; --sc-4:16px;
  --sc-5:20px; --sc-6:24px; --sc-8:32px; --sc-10:40px;

  /* ── Radien: 4 Stufen ─────────────────────────────────────────────────── */
  --sc-r-sm:8px; --sc-r-md:12px; --sc-r-lg:16px; --sc-r-xl:20px; --sc-r-pill:100px;

  /* ── Schatten: 3 Stufen ───────────────────────────────────────────────── */
  --sc-sh-1:0 1px 2px rgba(20,23,26,.05);
  --sc-sh-2:0 8px 24px -12px rgba(20,23,26,.18);
  --sc-sh-3:0 24px 60px -24px rgba(20,23,26,.30);
  --sc-backdrop:rgba(20,23,26,.55);

  /* ── Typografie ───────────────────────────────────────────────────────── */
  --sc-font:-apple-system,BlinkMacSystemFont,'Segoe UI',system-ui,sans-serif;
  --sc-font-mono:ui-monospace,Menlo,Consolas,monospace;
  /* 8 Stufen statt 30 */
  --sc-t-xs:.72rem;  --sc-t-sm:.78rem;  --sc-t-base:.85rem; --sc-t-md:.92rem;
  --sc-t-lg:1.05rem; --sc-t-xl:1.25rem; --sc-t-2xl:1.5rem;  --sc-t-3xl:1.9rem;

  --sc-ease:cubic-bezier(.19,1,.22,1);
  --sc-t-fast:.14s; --sc-t-norm:.22s;

  /* ══ ÜBERGANG: Alt-Werte zeigen auf die neuen Tokens ═══════════════════
     Damit greifen die Tokens sofort überall, wo bereits Variablen benutzt
     werden — ohne dass 7.137 Inline-Styles angefasst werden müssen. Der
     Portal-Bereich nutzt dieses Muster schon erfolgreich. */
  --accent:var(--sc-lime-deep);
  --accent-soft:var(--sc-lime);
  --border:var(--sc-line);
  --text-1:var(--sc-text);
  --text-2:var(--sc-muted);
  --text-3:var(--sc-faint);
}

/* ══════════════════════════════════════════════════════════════════════════
   KOMPONENTEN — jede genau einmal. Neue UI baut NUR hierauf auf.
   Präfix sc- wie im bestehenden sc-form/sc-field (der Standard, der schon gilt).
   ══════════════════════════════════════════════════════════════════════════ */

/* ── Karte: ersetzt .table-card, .chart-card und ~461 Inline-Panels ─────── */
.sc-card{background:var(--sc-paper);border:1px solid var(--sc-line);border-radius:var(--sc-r-lg);
  padding:var(--sc-5);box-shadow:var(--sc-sh-1)}
.sc-card--flat{box-shadow:none}
.sc-card--sunk{background:var(--sc-sunk)}
.sc-card__head{display:flex;align-items:center;gap:var(--sc-3);margin-bottom:var(--sc-4)}
.sc-card__head .sc-more{margin-left:auto;font-size:var(--sc-t-sm);color:var(--sc-muted);text-decoration:none}
.sc-card__head .sc-more:hover{color:var(--sc-lime-deep)}

/* ── Abschnittsmarke (Mono-Kicker aus dem Stylebook) ────────────────────── */
/* Der Kicker traegt --sc-primary, NICHT --sc-lime-deep: Lindgruen auf Weiss
   erreicht nur 2,4:1 und ist als Text kaum lesbar (gemessen 15.08.2026).
   Der Strich davor darf hell bleiben — er traegt keine Information. */
.sc-kick{font-family:var(--sc-font-mono);font-size:var(--sc-t-xs);letter-spacing:.07em;
  color:var(--sc-primary);text-transform:uppercase;font-weight:600;
  display:inline-flex;align-items:center;gap:var(--sc-2)}
.sc-kick::before{content:"";width:16px;height:1px;background:var(--sc-lime-deep)}

/* ── Statusmarke: ersetzt .status-badge, .prio-badge und ~201 Inline-Pills ─ */
.sc-pill{display:inline-flex;align-items:center;gap:5px;font-family:var(--sc-font-mono);
  font-size:var(--sc-t-xs);font-weight:600;text-transform:uppercase;letter-spacing:.05em;
  padding:3px 9px;border-radius:var(--sc-r-pill);background:var(--sc-mist);color:var(--sc-muted);
  white-space:nowrap}
.sc-pill--ok{background:var(--sc-ok-bg);color:var(--sc-ok)}
.sc-pill--warn{background:var(--sc-warn-bg);color:var(--sc-warn)}
.sc-pill--bad{background:var(--sc-bad-bg);color:var(--sc-bad)}
.sc-pill--info{background:var(--sc-info-bg);color:var(--sc-info)}
.sc-pill--lime{background:var(--sc-lime);color:var(--sc-ink)}

/* ── Hinweisleiste: ersetzt die uneinheitlichen Warn-/Fehlerkästen ─────── */
/* flex-wrap: Die Aktionen sassen starr neben dem Text und liefen auf schmaler
   Breite aus dem Bild — beim Angebots-Sperrbanner war „Als neue Version
   duplizieren" halb abgeschnitten und damit nicht mehr tippbar. Jetzt rutschen
   sie unter den Text, sobald es eng wird. min-width:0 am Text, weil ein
   Flex-Kind sonst nicht unter seine Wortbreite schrumpft. */
.sc-note{display:flex;align-items:center;flex-wrap:wrap;gap:var(--sc-3);padding:11px var(--sc-4);
  border-radius:var(--sc-r-md);font-size:var(--sc-t-base);margin-bottom:var(--sc-4);
  background:var(--sc-info-bg);color:var(--sc-info);border:1px solid var(--sc-info-line)}
.sc-note--ok{background:var(--sc-ok-bg);color:var(--sc-ok);border-color:var(--sc-ok-line)}
.sc-note--warn{background:var(--sc-warn-bg);color:var(--sc-warn);border-color:var(--sc-warn-line)}
.sc-note--bad{background:var(--sc-bad-bg);color:var(--sc-bad);border-color:var(--sc-bad-line)}
.sc-note__txt{flex:1 1 220px;min-width:0}
.sc-note__act{margin-left:auto;display:flex;flex-wrap:wrap;gap:var(--sc-2)}

/* ── Leerzustand: ersetzt 103 Inline-Varianten in 5 Textmustern ─────────── */
.sc-empty{text-align:center;color:var(--sc-faint);font-size:var(--sc-t-base);
  padding:var(--sc-6) var(--sc-4);line-height:1.5}
.sc-empty__title{color:var(--sc-muted);font-weight:500;margin-bottom:2px}
.sc-empty--box{border:1px dashed var(--sc-line-strong);border-radius:var(--sc-r-md);background:var(--sc-sunk)}

/* ── Tab-Leiste: ersetzt 11 Klassennamen + 29 Inline-Umsetzungen ────────── */
.sc-tabs{display:flex;gap:2px;border-bottom:1px solid var(--sc-line);
  overflow-x:auto;margin-bottom:var(--sc-5)}
.sc-tab{padding:10px var(--sc-4);font-size:var(--sc-t-base);color:var(--sc-muted);
  white-space:nowrap;border:0;border-bottom:2px solid transparent;margin-bottom:-1px;
  background:none;cursor:pointer;display:inline-flex;align-items:center;gap:7px;
  transition:color var(--sc-t-fast)}
.sc-tab:hover{color:var(--sc-text)}
.sc-tab.is-active{color:var(--sc-text);font-weight:600;border-bottom-color:var(--sc-lime)}
.sc-tab__n{font-family:var(--sc-font-mono);font-size:var(--sc-t-xs);color:var(--sc-faint);
  background:var(--sc-mist);padding:1px 6px;border-radius:var(--sc-r-pill)}
.sc-tab.is-active .sc-tab__n{background:var(--sc-lime);color:var(--sc-ink)}

/* ── Kennzahl ──────────────────────────────────────────────────────────────
   Flach gesetzt (17.08.2026). Dennis: „Die schwarzen Infofelder auf fast jeder
   Seite finde ich auf Mobil auch zu gross zu wuchtig, die nehmen zu viel Platz
   ein bevor man ueberhaupt den wirklichen Inhalt sieht. Auch am Desktop kann
   das gerne schmaler."  Das Band ist ein Kennzahlen-STREIFEN, kein Block:
   Innenabstand 12 statt 16, Zahl eine Stufe kleiner (t-xl statt t-2xl),
   Erklaerzeile t-xs. Gemessen 1500 px: 138 px → 104 px Bandhoehe. */
.sc-kpi{background:var(--sc-paper);border:1px solid var(--sc-line);border-radius:var(--sc-r-md);
  padding:var(--sc-3) var(--sc-3) var(--sc-3) var(--sc-4);position:relative;overflow:hidden;
  box-shadow:var(--sc-sh-1)}
.sc-kpi::before{content:"";position:absolute;left:0;top:0;bottom:0;width:3px;background:var(--sc-lime)}
.sc-kpi--warn::before{background:var(--sc-warn)}
.sc-kpi--bad::before{background:var(--sc-bad)}
.sc-kpi__lab{font-family:var(--sc-font-mono);font-size:var(--sc-t-xs);text-transform:uppercase;
  letter-spacing:.07em;color:var(--sc-faint)}
.sc-kpi__val{font-size:var(--sc-t-xl);font-weight:700;letter-spacing:-.02em;margin-top:2px}
.sc-kpi__sub{font-size:var(--sc-t-xs);color:var(--sc-muted);margin-top:1px;line-height:1.35}

/* ── Zeilenliste: ersetzt unzählige Inline-Listen ──────────────────────── */
.sc-list{display:flex;flex-direction:column}
.sc-li{display:flex;align-items:center;gap:var(--sc-3);padding:10px 0;
  border-bottom:1px solid var(--sc-line)}
.sc-li:last-child{border-bottom:0}
.sc-li__main{min-width:0;flex:1}
.sc-li__title{font-weight:500}
.sc-li__sub{font-size:var(--sc-t-sm);color:var(--sc-muted)}

/* ── Dropzone: ersetzt 4 verschiedene Designs allein im Belege-Bereich ──── */
.sc-drop{border:2px dashed var(--sc-line-strong);border-radius:var(--sc-r-md);
  background:var(--sc-sunk);color:var(--sc-muted);padding:var(--sc-5);text-align:center;
  font-size:var(--sc-t-base);cursor:pointer;transition:border-color var(--sc-t-fast),background var(--sc-t-fast)}
.sc-drop:hover{border-color:var(--sc-lime-deep);background:#F7F9EC}
.sc-drop.is-over{border-color:var(--sc-lime-deep);background:#EEF4D8;color:var(--sc-ink)}

/* ── Tabellen: verhindert, dass lange Werte das Layout sprengen ─────────── */
.sc-table{width:100%;border-collapse:collapse;font-size:var(--sc-t-base)}
.sc-table th{text-align:left;font-family:var(--sc-font-mono);font-size:var(--sc-t-xs);
  text-transform:uppercase;letter-spacing:.06em;color:var(--sc-faint);font-weight:600;
  padding:var(--sc-2) var(--sc-3);border-bottom:1px solid var(--sc-line)}
.sc-table td{padding:10px var(--sc-3);border-bottom:1px solid var(--sc-line);vertical-align:top}
.sc-table td.num,.sc-table th.num{text-align:right;font-variant-numeric:tabular-nums}
.sc-table tr:last-child td{border-bottom:0}
.sc-table .clip{max-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

/* Zahlen immer mit gleicher Ziffernbreite — verhindert Springen in Listen */
.sc-num{font-variant-numeric:tabular-nums}


/* ── Kundendetail: Kennzahlen + Karten-Raster ───────────────────────────── */
.kd-kpis{display:grid;grid-template-columns:repeat(4,1fr);gap:var(--sc-2);margin-bottom:var(--sc-4)}
.kd-grid{display:grid;grid-template-columns:repeat(12,1fr);gap:var(--sc-4);align-items:start}
.kd-c4{grid-column:span 4} .kd-c6{grid-column:span 6} .kd-c12{grid-column:span 12}
@media(max-width:1200px){ .kd-kpis{grid-template-columns:repeat(2,1fr)}
  .kd-c4,.kd-c6{grid-column:span 12} }
/* Zeilen in den Karten */
.kd-row{display:flex;align-items:center;gap:var(--sc-3);padding:9px 0;border-bottom:1px solid var(--sc-line)}
.kd-row:last-child{border-bottom:0}
.kd-row__main{min-width:0;flex:1}
.kd-row__t{font-weight:500;font-size:var(--sc-t-base)}
.kd-row__s{font-size:var(--sc-t-sm);color:var(--sc-muted);margin-top:1px}


/* ══════════════════════════════════════════════════════════════════════════
   DUNKLE BEREICHE  ·  .sc-dark auf einem Container (NICHT auf <html>)
   ══════════════════════════════════════════════════════════════════════════
   Dennis 15.08.: Der Hub soll NICHT komplett dunkel sein — er bekommt mehr
   dunkle Bereiche als das Portal, bleibt aber grundsaetzlich hell. Genau wie
   die Website: heller Grund, darauf dunkle Karten und Abschnitte.

   Einsatz im Hub: Kopfleiste, Seitenmenue, Kennzahlen-Baender, Hervorhebungen,
   Investitions-/Ergebnisblöcke. Das Portal bleibt durchgaengig hell.
   Anwendung: <div class="sc-dark"> … </div> — alles darin kippt automatisch,
   weil nur die Token neu belegt werden. */
.sc-dark{
  --sc-paper:#1C2024;
  --sc-bg:#14171A;
  --sc-sunk:#22272C;
  --sc-mist:#2A3036;
  --sc-text:#F2F4F1;
  --sc-muted:#A6AEB4;
  --sc-faint:#79828A;
  --sc-line:rgba(255,255,255,.10);
  --sc-line-strong:rgba(255,255,255,.17);
  /* Auf Dunkel traegt das helle Lindgruen — nicht das dunkle Oliv */
  --sc-primary:#CAD759;        --sc-primary-hover:#D9E85C;
  --sc-primary-bg:rgba(202,215,89,.12);
  --sc-primary-line:rgba(202,215,89,.30);
  --sc-lime-deep:#CAD759;
  --sc-ok:#8BC98F;             --sc-ok-bg:rgba(139,201,143,.13);
  --sc-warn:#E6B45C;           --sc-warn-bg:rgba(230,180,92,.13);
  --sc-bad:#EF8A80;            --sc-bad-bg:rgba(239,138,128,.13);
  --sc-info:#8FB6CE;           --sc-info-bg:rgba(143,182,206,.13);
  --sc-success:#8BC98F;        --sc-success-bg:rgba(139,201,143,.13);
  --sc-attention:#E6B45C;      --sc-attention-bg:rgba(230,180,92,.13);
  --sc-danger:#EF8A80;         --sc-danger-bg:rgba(239,138,128,.13);
  --sc-danger-2:#EF8A80;
  --sc-sh-1:0 1px 2px rgba(0,0,0,.35);
  --sc-sh-2:0 8px 24px -12px rgba(0,0,0,.6);
  /* Der Container selbst bekommt die dunkle Flaeche */
  background:var(--sc-bg);
  color:var(--sc-text);
}
.sc-dark input,.sc-dark select,.sc-dark textarea{
  background:var(--sc-sunk);color:var(--sc-text);border-color:var(--sc-line-strong)}
.sc-dark input::placeholder,.sc-dark textarea::placeholder{color:var(--sc-faint)}
.sc-dark table th{color:var(--sc-faint)}
.sc-dark tr:hover{background:rgba(255,255,255,.03)}
/* Einzelne dunkle Karte auf hellem Grund (Website-Muster) */
/* ACHTUNG: .sc-card--dark faerbt nur Flaeche + Text, es belegt die Token NICHT neu.
   Alles darin (.sc-txt/.sc-kpi/.sc-pill/.sc-note) bliebe auf hellen Werten und
   waere unlesbar. Fuer dunkle Karten deshalb class="sc-card sc-dark" verwenden. */
.sc-card--dark{background:var(--sc-ink);color:var(--sc-on-dark);border-color:transparent}
.sc-card--dark .sc-kick{color:var(--sc-lime)}
.sc-card--dark .sc-kick::before{background:var(--sc-lime)}

/* Knoepfe in dunklen Bereichen: dort kippt --sc-primary auf das helle Lindgruen,
   weisser Text darauf ist unlesbar. */
.sc-dark .btn-primary{color:var(--sc-ink)}
.sc-dark .btn-success{color:var(--sc-ink)}
.sc-dark .btn-outline{background:transparent;border-color:var(--sc-line-strong);color:var(--sc-text)}


/* ══════════════════════════════════════════════════════════════════════════
   ERGAENZUNGEN AUS DEM DASHBOARD-UMBAU (15.08.2026)
   Bausteine, die beim Umbau von Dashboard + Insights gefehlt haben. Alles
   ausschliesslich ueber Token — kein einziger Hex-Wert.
   ══════════════════════════════════════════════════════════════════════════ */

/* ── Band: voll breiter Bereichskopf (Kennzahlen). Dunkel wird NICHT hier
      gesetzt, sondern ueber .sc-dark am selben Element. ─────────────────── */
/* Polsterung 16/20 statt 20/24 und Abstand nach unten 20 statt 24 — siehe
   Begruendung bei .sc-kpi. Das Band traegt auch Nicht-Kennzahlen (Kopfzeilen,
   Ergebnisbloecke); dort wirkt dieselbe Verschlankung. */
.sc-band{border-radius:var(--sc-r-lg);padding:var(--sc-4) var(--sc-5);margin-bottom:var(--sc-5)}
.sc-band .kd-kpis{margin-bottom:0}

/* ── Platzhalter fuer JS-gefuellte Bereiche INNERHALB eines Rasters.
      Ohne das braucht jede Render-Funktion ihr eigenes Teilraster. ──────── */
.sc-slot{display:contents}

/* ── Element ueber alle Spalten eines Rasters ───────────────────────────── */
.sc-full{grid-column:1/-1}

/* ── Vierte Spaltenbreite (12/4) neben c4/c6/c12 ────────────────────────── */
.kd-c3{grid-column:span 3}
@media(max-width:1200px){ .kd-c3{grid-column:span 6} }
@media(max-width:760px){ .kd-c3{grid-column:span 12} }

/* Auf dem Handy stehen die Kennzahlen ZU ZWEIT nebeneinander. Untereinander
   ergaben vier Kennzahlen 468 px Band — vier Bildschirmhoehen Vorlauf, bevor
   der erste Eintrag kam (gemessen 390 px, 17.08.2026). Die Feinheiten dazu
   (kleinere Zahl, Erklaerzeile weg) stehen gebuendelt im Abschnitt
   „HANDY-VERDICHTUNG" am Dateiende. */
@media(max-width:560px){ .kd-kpis{grid-template-columns:repeat(2,1fr)} }

/* ── Fliesstext in Karten: ersetzt Inline-Styles und .chart-subtitle ────── */
.sc-txt{font-size:var(--sc-t-base);color:var(--sc-muted);line-height:1.55;margin:0 0 var(--sc-3)}
.sc-txt:last-child{margin-bottom:0}
.sc-txt--pre{white-space:pre-line}

/* ── Verweis im Fliesstext (der Hub hat keine a{}-Regel) ────────────────── */
.sc-link{color:var(--sc-primary);text-decoration:none;font-weight:500}
.sc-link:hover{text-decoration:underline}

/* ── Segment-Umschalter INNERHALB einer Kopfzeile ───────────────────────── */
.sc-tabs--bare{border-bottom:0;margin:0;overflow:visible;flex:0 0 auto}
.sc-tabs:empty{display:none}

/* ── Kopfzeilen duerfen umbrechen statt zu quetschen ──────────────────────
      Ohne das laufen Statusmarken in schmalen Karten (kd-c3) ueber den Rand
      und der Umschalter in der Kopfzeile wird auf dem Handy abgeschnitten.
      Greift nur, wenn es sonst zu eng waere. */
.sc-card__head{flex-wrap:wrap}

/* ── Abschnittstrenner: derselbe Kopf, aber mit Linie darueber ──────────── */
.sc-card__head--sep{margin-top:var(--sc-8);padding-top:var(--sc-5);border-top:1px solid var(--sc-line)}

/* ── Senkrechter Rhythmus fuer gestapelte Bloecke (Dialog-Inhalt) ───────── */
.sc-stack>*+*{margin-top:var(--sc-4)}

/* ── Waagerechter Rollbereich fuer breite Tabellen ──────────────────────── */
.sc-scroll{overflow-x:auto;-webkit-overflow-scrolling:touch}

/* ── Reihe von Statusmarken, die umbrechen darf ─────────────────────────── */
.sc-pills{display:flex;flex-wrap:wrap;gap:var(--sc-2);margin-top:var(--sc-1)}

/* ── Schmales Formularfeld in einer Zeile (Jahr, Menge, Prozent) ────────── */
.sc-field--kompakt{flex:0 0 104px}
.sc-field--kompakt input{width:100%}

/* ── Dropzone-Symbol: die globale Regel svg.lucide{width:1em} macht es 13px ─ */
.sc-drop svg.lucide{width:28px;height:28px;margin-bottom:var(--sc-2);opacity:.75}

/* ── Tabellen erben sonst ein Inline-color des Elternteils (z. B. das
      blasse #belege-ist-body) und werden komplett unlesbar. ─────────────── */
.sc-table{color:var(--sc-text)}

/* ── Werkzeugleiste ──────────────────────────────────────────────────────
   Titel/Suche links, Aktionen rechts. Ersetzt ~40 gleiche Inline-Flex-Koepfe
   ueber die Bereiche hinweg.

   Sie steht HIER, weil drei Bereichsentwuerfe sie unabhaengig voneinander
   erfunden haben — mit drei verschiedenen Definitionen und zwei Namen fuer
   dasselbe (__act vs. __actions). Wer zuletzt eingebaut haette, haette die
   anderen still verschoben. Ein Baustein, eine Definition, ein Name.

   Abgrenzung zu .sc-card__head: der Kartenkopf beschriftet EINE Karte
   (Kicker + Verweis). Die Werkzeugleiste bedient eine ganze Liste
   (Suche, Filter, Aktionen) und steht ausserhalb der Karte. ───────────── */
.sc-toolbar{display:flex;align-items:flex-end;justify-content:space-between;
  gap:var(--sc-3);flex-wrap:wrap;margin-bottom:var(--sc-4)}
.sc-toolbar__head{min-width:0}
.sc-toolbar__actions{display:flex;gap:var(--sc-2);flex-wrap:wrap;
  align-items:center;margin-left:auto}
.sc-toolbar__filters{display:flex;gap:var(--sc-2);flex-wrap:wrap;
  align-items:center;flex:1;min-width:0}
.sc-toolbar--filters{align-items:center;padding:var(--sc-3) 0;
  border-top:1px solid var(--sc-line);border-bottom:1px solid var(--sc-line)}
/* Loeschen/Zuruecksetzen sichtbar abgesetzt — nicht neben "Speichern" */
.sc-toolbar__actions--gefahr{gap:var(--sc-2);padding-left:var(--sc-4);
  border-left:1px solid var(--sc-line)}
.sc-actions{display:flex;gap:var(--sc-2);flex-wrap:wrap;align-items:center}
@media (max-width:640px){
  .sc-toolbar{align-items:stretch}
  .sc-toolbar__actions{margin-left:0}
  .sc-toolbar__actions--gefahr{border-left:0;padding-left:0;width:100%;
    border-top:1px solid var(--sc-line);padding-top:var(--sc-2)}
}


/* ══════════════════════════════════════════════════════════════════════════
   EINSTELLUNGEN — Ergänzung zum Bereichsumbau
   ══════════════════════════════════════════════════════════════════════════ */

/* Der Hub setzt global th{background:…;text-align:right} und td{text-align:right}
   (index.html Z. 219–227). .sc-table erklärt für td kein text-align und für th
   keinen Hintergrund — ohne diese zwei Zeilen wäre JEDE sc-Tabelle rechtsbündig
   mit grau hinterlegtem Kopf. Betrifft alle fünf neuen Tabellen. */
.sc-table th{background:transparent}
.sc-table td{text-align:left}

/* Kartenfußzeile: Speichern rechts, Statusmeldung links. Bisher hat jeder
   Einstellungsblock dafür ein eigenes Inline-Flex gebaut (12 Fundstellen). */
.sc-card__foot{display:flex;align-items:center;gap:var(--sc-3);flex-wrap:wrap;
  justify-content:flex-end;margin-top:var(--sc-5);padding-top:var(--sc-4);
  border-top:1px solid var(--sc-line)}
.sc-card__foot>.sc-msg{margin-right:auto}

/* Statusmeldung neben einem Knopf ("Gespeichert.", "Fehler …"). Die Farbe setzt
   das Skript aus den Statusrollen; hier nur Größe und Grundton. */
.sc-msg{font-size:var(--sc-t-sm);color:var(--sc-muted)}

/* Auslastungsbalken (KBM-Request-Budget). Es gibt im Hub keinen Fortschritts-
   balken; bisher inline mit drei Hex-Ampelfarben gelöst. Wert kommt als
   --sc-bar:NN%. */
.sc-bar{height:8px;border-radius:var(--sc-r-pill);background:var(--sc-mist);
  overflow:hidden;margin:var(--sc-3) 0}
.sc-bar__fill{height:100%;width:var(--sc-bar,0%);background:var(--sc-ok)}
.sc-bar--warn .sc-bar__fill{background:var(--sc-warn)}
.sc-bar--bad  .sc-bar__fill{background:var(--sc-bad)}

/* .sc-check deckte nur Checkboxen ab — die PayPal-Modus-Wahl sind Radios. */
.sc-check input[type=radio]{width:16px;height:16px;margin:0;flex:0 0 auto}

/* Ein Knopf, der in einem .sc-field steht (Domain-Prüfung), soll nicht auf
   Feldbreite gedehnt werden. */
.sc-field>.btn{align-self:flex-start}

/* ── Rahmen des Bereichs ────────────────────────────────────────────────── */
.set-layout{display:grid;grid-template-columns:232px minmax(0,1fr);
  gap:var(--sc-6);align-items:start}
.set-main{min-width:0}
.set-nav{padding:var(--sc-3) 0;position:sticky;top:var(--sc-4)}
.set-nav__group{padding:var(--sc-4) var(--sc-4) var(--sc-2)}
.set-nav__group:first-child{padding-top:var(--sc-1)}

/* Navigationseintrag — ersetzt die Inline-Fassung aus index.html Z. 279–295,
   damit es die Navigation nicht an zwei Stellen gibt. */
.einstell-nav-btn{display:flex;align-items:center;gap:var(--sc-2);width:100%;
  text-align:left;padding:9px var(--sc-4);border:0;border-left:3px solid transparent;
  background:none;font-family:var(--sc-font);font-size:var(--sc-t-base);
  color:var(--sc-muted);cursor:pointer;
  transition:background var(--sc-t-fast),color var(--sc-t-fast)}
.einstell-nav-btn:hover{background:var(--sc-sunk);color:var(--sc-text)}
.einstell-nav-btn.active{background:var(--sc-primary-bg);color:var(--sc-primary);
  font-weight:600;border-left-color:var(--sc-lime)}
.einstell-nav-btn .esb-icon{display:inline-flex;align-items:center;justify-content:center;
  width:24px;height:24px;border-radius:var(--sc-r-sm);flex-shrink:0;font-style:normal;
  background:var(--sc-mist);color:var(--sc-muted)}
.einstell-nav-btn.active .esb-icon{background:var(--sc-lime);color:var(--sc-ink)}

/* Suchfeld und Auswahl in Kopfzeilen — im dunklen Band und in hellen Karten
   dasselbe Feld, weil .sc-dark nur die Token umbelegt. */
.set-suche{width:260px;max-width:100%;padding:7px var(--sc-3);
  border:1px solid var(--sc-line-strong);border-radius:var(--sc-r-sm);
  background:var(--sc-sunk);color:var(--sc-text);
  font-family:var(--sc-font);font-size:var(--sc-t-base)}
.set-suche::placeholder{color:var(--sc-faint)}
.set-select{padding:7px var(--sc-3);border:1px solid var(--sc-line-strong);
  border-radius:var(--sc-r-sm);background:var(--sc-paper);color:var(--sc-text);
  font-family:var(--sc-font);font-size:var(--sc-t-base)}

/* Technische Werte (Keys, Tokens, IDs, JSON) — eine Schrift statt sechs
   Inline-Deklarationen von font-family:monospace. */
.set-mono{font-family:var(--sc-font-mono)}

/* Ausgabefeld für Test- und Explorer-Antworten (KBM, IMAP, PayPal-Webhook). */
.set-out{background:var(--sc-sunk);border:1px solid var(--sc-line);
  border-radius:var(--sc-r-sm);padding:var(--sc-3) var(--sc-4);margin-top:var(--sc-3);
  font-family:var(--sc-font-mono);font-size:var(--sc-t-sm);
  white-space:pre-wrap;word-break:break-word;overflow-x:auto}
.set-out--code{max-height:420px;overflow:auto}

/* Doku-Spalte (Hilfe): volle Rasterbreite, aber begrenzte Zeilenlänge. */
.set-doc{grid-column:1/-1;min-width:0;max-width:900px}

/* Textlisten (Roadmap, Entwicklungsverlauf) — die Einträge bringen ihre
   Zeilentrenner selbst mit, hier nur die Aufzählungszeichen weg. */
.set-liste{list-style:none;padding:0;margin:0}

/* Ein Kennzahlenwert kann Text sein (E-Mail-Adresse); 1,5 rem fett sprengt
   dort die Kachel. */
.set-kpi-text{font-size:var(--sc-t-lg);word-break:break-word}
.set-kpi-von{font-size:var(--sc-t-md);font-weight:400;color:var(--sc-faint)}

/* Gruppen-Rechte: Zwischenüberschrift und eingerückte Schreibrecht-Zeile. */
.gp-gruppe td{background:var(--sc-sunk);padding-top:var(--sc-4)}
.gp-unter td{background:var(--sc-sunk);font-size:var(--sc-t-sm);color:var(--sc-muted)}
.gp-unter td:first-child{padding-left:var(--sc-8)}
#gp-table input[type=checkbox]{width:18px;height:18px;cursor:pointer;
  accent-color:var(--sc-lime-deep)}
#gp-table input[type=checkbox]:disabled{opacity:.35}

/* Zeilen mit Eingabefeldern (Abo-Kategorien, Übergabe-Fragen, Aufwandssätze,
   Staffelung). Sie stehen nicht in einem .sc-field und erbten deshalb bisher
   kein Feld-Aussehen — genau deshalb trug jede ihren eigenen Inline-Style. */
#tab-einstellungen .sc-li input[type=text],
#tab-einstellungen .sc-li input[type=email],
#tab-einstellungen .sc-li input[type=number],
#tab-einstellungen .ak-fn-row input,
#tab-einstellungen .ak-fn-row select,
#tab-einstellungen .staffel-input{
  padding:7px 10px;border:1px solid var(--sc-line-strong);border-radius:var(--sc-r-sm);
  background:var(--sc-paper);color:var(--sc-text);font-family:var(--sc-font);
  font-size:var(--sc-t-base);box-sizing:border-box}

.abokat-row__ord{display:flex;flex-direction:column;gap:2px}
.abokat-row__ord .btn-icon{width:20px;height:18px}
.abokat-row__col{width:32px;height:32px;border:0;border-radius:var(--sc-r-sm);
  padding:0;cursor:pointer;flex:0 0 auto}
.abokat-row__key{width:120px;flex:0 0 auto}
.abokat-row__lab{flex:1;min-width:0}
.fv-row>input[type=text]{flex:1;min-width:0}
.fv-row.is-inaktiv>input[type=text]{color:var(--sc-faint);text-decoration:line-through}
.ak-fn-row{display:flex;gap:var(--sc-2);align-items:center;flex-wrap:wrap;padding:var(--sc-1) 0}
.ak-fn-row .ak-code{width:120px}
.ak-fn-row .ak-label{flex:1;min-width:140px}
.ak-fn-row .ak-scope{width:112px}
.ak-fn-row .ak-h{width:64px;text-align:right}
.ak-fn-row .ak-hjs{width:76px;text-align:right}
.staffel-input{width:100%}
.stb-k-row{margin-bottom:var(--sc-2)}
.stb-k-row .sc-card__foot{margin-top:var(--sc-3);padding-top:var(--sc-3)}

/* Eine Wahl (Radio/Haken) direkt ueber einem Formular braucht Abstand — sonst
   klebt "Live — echter Zahlungsverkehr" auf dem ersten Feldnamen darunter. */
#tab-einstellungen .sc-check+.sc-form{margin-top:var(--sc-4)}

/* Eine Fusszeile ohne Karte drumherum (gemeinsames Speichern fuer zwei Karten):
   die Linie darf nicht am Rasterrand kleben. */
.sc-full>.sc-card__foot{margin-top:0}

/* Roadmap-/Verlaufszeilen (.entw-item) sind display:flex. Ohne min-width:0 kann
   die Textspalte nicht unter ihre min-content-Breite schrumpfen — eine lange URL
   im Text schiebt dann die GANZE Seite waagerecht auf. Betrifft ~110 Eintraege,
   deren Markup bewusst unangetastet bleibt. */
.entw-item{min-width:0}
.entw-item>div{min-width:0;overflow-wrap:anywhere}

/* Schmale Breite: eine Spalte. Die Pillen-Leiste selbst steht in index.html,
   weil sie dort mit !important gegen die alten Regeln antreten muss (E21). */
@media(max-width:768px){
  .set-layout{grid-template-columns:1fr}
  .set-nav{position:static}
  .set-doc{max-width:none}
}


/* ══════════════════════════════════════════════════════════════════════════
   KUNDEN — Ergaenzung zum Bereichsumbau (16.08.2026)
   ══════════════════════════════════════════════════════════════════════════
   Bewusst NICHT hier: .sc-toolbar (samt __head/__actions/__filters/--filters),
   .sc-band, .sc-stack und .sc-scroll. Die gibt es zentral bereits weiter oben —
   der Kunden-Bereich benutzt die vorhandenen Fassungen, statt sie zu doppeln.
   Kein einziger Hex-Wert, alles ueber Token. */

/* Beilaeufiger Hinweistext (Trefferzahl, Nebenangabe in Listen) */
.sc-hint{font-size:var(--sc-t-sm);color:var(--sc-faint)}

/* Senkrecht begrenzter Rollbereich fuer Auswahllisten in Modals.
   Ergaenzung zu .sc-scroll, das waagerecht rollt — die beiden loesen
   zwei verschiedene Probleme und duerfen nicht denselben Namen tragen. */
.sc-scrolly{max-height:220px;overflow-y:auto;padding:0 var(--sc-3);
  border:1px solid var(--sc-line);border-radius:var(--sc-r-sm)}

/* ── Suchfeld mit eingelegter Lupe ──────────────────────────────────────── */
.sc-search{position:relative;display:inline-flex;align-items:center;flex:0 1 320px;min-width:200px}
.sc-search--wide{flex:1 1 100%;margin:var(--sc-2) 0}
.sc-search > svg.lucide,.sc-search > i[data-lucide]{position:absolute;left:12px;
  width:15px;height:15px;color:var(--sc-faint);pointer-events:none}
.sc-search input{width:100%;box-sizing:border-box;padding:8px 14px 8px 34px;
  border:1px solid var(--sc-line-strong);border-radius:var(--sc-r-pill);
  font-family:inherit;font-size:var(--sc-t-base);background:var(--sc-paper);color:var(--sc-text)}
.sc-search input:focus{outline:none;border-color:var(--sc-lime-deep)}

/* ── Filterreiter als Chips ─────────────────────────────────────────────── */
.sc-chips{display:flex;align-items:center;gap:var(--sc-1);flex-wrap:wrap}
.sc-chip{display:inline-flex;align-items:center;gap:6px;padding:6px 12px;cursor:pointer;
  border:1px solid var(--sc-line-strong);border-radius:var(--sc-r-pill);background:var(--sc-paper);
  color:var(--sc-muted);font-family:inherit;font-size:var(--sc-t-sm);
  transition:color var(--sc-t-fast),border-color var(--sc-t-fast),background var(--sc-t-fast)}
.sc-chip:hover{color:var(--sc-text);border-color:var(--sc-lime-deep)}
.sc-chip.is-active{background:var(--sc-ink);border-color:var(--sc-ink);color:var(--sc-on-dark);font-weight:600}
.sc-chip__n{font-family:var(--sc-font-mono);font-size:var(--sc-t-xs);color:var(--sc-faint)}
.sc-chip.is-active .sc-chip__n{color:var(--sc-on-dark-muted)}

/* ── Kartenraster fuer Entitaetslisten (Kunden, spaeter Vertraege/Websites) ─ */
.sc-cards{display:grid;grid-template-columns:repeat(auto-fill,minmax(290px,1fr));
  gap:var(--sc-3);align-items:stretch}
.sc-cards__full{grid-column:1/-1}
/* Rasterkinder haben min-width:auto — eine einzige lange, unumbrechbare Zeile
   (E-Mail, URL) in EINER Karte zieht sonst die Spalte und damit die GANZE Seite
   waagerecht auf (gemessen: 825 px Spalte bei 390 px Bildschirm). Gleiche
   Ursache wie bei .entw-item weiter oben. */
.sc-cards > *{min-width:0}

/* ── Ergaenzungen zu bestehenden Bausteinen ─────────────────────────────────
   .sc-check und .btn-icon-text stehen im <style> von index.html und damit NACH
   dieser Datei. Die Modifier brauchen deshalb zwei Klassen, sonst gewinnt die
   Grundregel per Quellreihenfolge. */
.sc-pill svg.lucide{width:12px;height:12px;stroke-width:2.4}
.sc-empty__act{margin-top:var(--sc-3)}
.sc-check.sc-check--sm{font-size:var(--sc-t-sm);color:var(--sc-muted);font-weight:400}
.sc-check.sc-check--bad input[type=checkbox]{accent-color:var(--sc-bad)}
.btn-icon-text.btn-icon-text--warn{border-color:var(--sc-warn-line);
  background:var(--sc-warn-bg);color:var(--sc-warn)}
.btn-icon-text.btn-icon-text--warn:hover{border-color:var(--sc-warn);
  background:var(--sc-warn-bg);color:var(--sc-warn)}
.kd-portalcell{display:inline-flex;align-items:center;gap:var(--sc-2);flex-wrap:wrap}

/* ── Aufklappbereich mit Dreieck aus Token statt Browser-Marker ─────────── */
.sc-details > summary{cursor:pointer;list-style:none;display:flex;align-items:center;
  gap:var(--sc-2);font-size:var(--sc-t-base);color:var(--sc-muted);padding:var(--sc-1) 0}
.sc-details > summary::-webkit-details-marker{display:none}
.sc-details > summary::before{content:"";flex:0 0 auto;width:0;height:0;
  border:5px solid transparent;border-left-color:var(--sc-faint);
  transition:transform var(--sc-t-fast)}
.sc-details[open] > summary::before{transform:rotate(90deg) translateX(-1px)}
.sc-details > summary:hover{color:var(--sc-text)}

/* Die Kundenkarten (.ku-card*) sind am 16.08.2026 entfallen: die Kundenliste
   ist wieder eine Tabelle, weil man den Portal-Stand untereinander vergleichen
   koennen muss. Die neuen Regeln stehen gebuendelt am Dateiende. */

@media(max-width:560px){
  .sc-cards{grid-template-columns:1fr}
  /* Suche und Filterreiter bekommen je eine eigene volle Zeile. Ohne das teilen
     sich Suche, Chips und Trefferzahl EINE Zeile — die Chips behalten dann nur
     ~175 px und stehen einzeln untereinander (gemessen bei 390 px). */
  .sc-toolbar .sc-search{flex:1 1 100%}
  .sc-toolbar .sc-chips{flex:1 1 100%}
}


/* ══════════════════════════════════════════════════════════════════════════
   ERGAENZUNGEN AUS DEM BELEGE-UMBAU (16.08.2026)
   Bausteine, die beim Umbau des Belege-Bereichs gefehlt haben. Nur Token,
   kein Hex-Wert. Bereits vorhandene Klassen (.sc-band, .sc-chip, .sc-table,
   .sc-dark .btn-primary/.btn-outline) sind bewusst NICHT erneut definiert.
   ══════════════════════════════════════════════════════════════════════════ */

/* ── Fehlende Unterelemente vorhandener Bausteine ───────────────────────── */
    .sc-card__act { margin-left:auto; display:flex; align-items:center; gap:var(--sc-2); flex-wrap:wrap; }
    .sc-card__t { font-weight:600; font-size:var(--sc-t-md); color:var(--sc-text); margin-top:2px; }
    .sc-note__txt { flex:1; min-width:0; }
    .sc-note__t { font-weight:600; }
    .sc-note__s { font-size:var(--sc-t-sm); opacity:.85; }
    .sc-kpi--ok::before { background:var(--sc-ok); }
    .sc-kpi--info::before { background:var(--sc-info); }
    .btn-icon.is-on { background:var(--sc-lime); border-color:transparent; color:var(--sc-ink); }
    label.sc-drop { display:flex; flex-direction:column; align-items:center; justify-content:center; gap:2px; }

/* ── Knopf-Symbole in dunklen Bereichen ─────────────────────────────────── */
    .sc-dark .btn-icon:hover { background:var(--sc-mist); border-color:var(--sc-primary-line); }

/* ── Quellen-Karte: Ziel fuer genau EINEN Kontoauszug, mit Zustand ──────── */
    .sc-quelle { flex:1 1 160px; min-width:160px; background:var(--sc-sunk);
      border:1px solid var(--sc-line); border-radius:var(--sc-r-md); padding:var(--sc-3);
      cursor:pointer; transition:border-color var(--sc-t-fast), background var(--sc-t-fast); }
    .sc-quelle__lab { display:flex; align-items:center; gap:5px; margin-bottom:4px;
      font-family:var(--sc-font-mono); font-size:var(--sc-t-xs); letter-spacing:.06em;
      text-transform:uppercase; color:var(--sc-muted); }
    .sc-quelle--ok { border-color:var(--sc-ok-line); background:var(--sc-ok-bg); }
    .sc-quelle--warn { border-color:var(--sc-warn-line); background:var(--sc-warn-bg); }
    .sc-quelle.is-over { border-color:var(--sc-lime-deep); background:var(--sc-primary-bg); }

/* ── Aktionsmenue ohne JS (details/summary) ─────────────────────────────── */
    .sc-menu { position:relative; display:inline-block; }
    .sc-menu > summary { list-style:none; cursor:pointer; }
    .sc-menu > summary::-webkit-details-marker { display:none; }
    .sc-menu__pop { position:absolute; right:0; top:calc(100% + 5px); z-index:60;
      min-width:238px; padding:var(--sc-1); background:var(--sc-paper);
      border:1px solid var(--sc-line); border-radius:var(--sc-r-md); box-shadow:var(--sc-sh-2); }
    .sc-menu__item { display:flex; align-items:center; gap:9px; width:100%; padding:8px 10px;
      border:0; border-radius:var(--sc-r-sm); background:none; color:var(--sc-text);
      font-family:inherit; font-size:var(--sc-t-base); font-weight:500; text-align:left; cursor:pointer; }
    .sc-menu__item:hover { background:var(--sc-sunk); }
    .sc-menu__item svg.lucide { width:15px; height:15px; color:var(--sc-muted); }
    .sc-menu__item.is-active { background:var(--sc-primary-bg); color:var(--sc-primary); font-weight:600; }
    .sc-menu__item.is-active svg.lucide { color:var(--sc-primary); }
    .sc-menu__item--bad { color:var(--sc-bad); }
    .sc-menu__item--bad svg.lucide { color:var(--sc-bad); }
    .sc-menu__sep { height:1px; margin:var(--sc-1) 0; background:var(--sc-line); }

/* ── Aufklappbarer Abschnitt (details/summary) ──────────────────────────── */
    .sc-fold { border:1px solid var(--sc-line); border-radius:var(--sc-r-lg);
      background:var(--sc-paper); box-shadow:var(--sc-sh-1); }
    .sc-fold > summary { list-style:none; cursor:pointer; display:flex; align-items:center;
      gap:var(--sc-2); padding:13px var(--sc-5); font-size:var(--sc-t-base);
      font-weight:600; color:var(--sc-text); }
    .sc-fold > summary::-webkit-details-marker { display:none; }
    .sc-fold > summary::after { content:"+"; margin-left:auto; color:var(--sc-faint); font-weight:400; }
    .sc-fold[open] > summary::after { content:"–"; }
    .sc-fold__body { padding:0 var(--sc-5) var(--sc-5); }
    .sc-fold--flat { border:0; border-top:1px solid var(--sc-line); border-radius:0;
      box-shadow:none; background:none; margin-top:var(--sc-3); }
    .sc-fold--flat > summary { padding:9px 0; font-weight:500; color:var(--sc-muted); font-size:var(--sc-t-sm); }
    .sc-fold--flat .sc-fold__body { padding:0 0 var(--sc-2); font-size:var(--sc-t-sm);
      color:var(--sc-muted); line-height:1.5; }

/* ══════════════════════════════════════════════════════════════════════════
   WEBHOSTING — Bausteine für „Pakete & Preise", „Websites & Wartung",
   Domains, Plugins, Vertragsdokumente, Kalkulation.
   Nur wirklich fehlende Bausteine; .sc-toolbar/.sc-band/.sc-chip/.sc-card__foot/
   .sc-details/.btn-icon.is-on sind bereits weiter oben zentral definiert.
   ══════════════════════════════════════════════════════════════════════════ */

/* ── Filter-Eingaben/Selects AUSSERHALB von .sc-form ─────────────────────── */
    .sc-inp{padding:7px 11px;border:1px solid var(--sc-line-strong);border-radius:var(--sc-r-sm);
      background:var(--sc-paper);color:var(--sc-text);font-size:var(--sc-t-base);
      font-family:inherit;min-width:0}
    .sc-inp:focus{outline:none;border-color:var(--sc-lime-deep)}
    .sc-inp--wide{flex:1;min-width:180px}
    .sc-inp--sm{padding:3px 7px;font-size:var(--sc-t-sm)}

/* ── Ergänzungen zu .sc-band (Band selbst existiert bereits) ─────────────── */
    .sc-band__head{display:flex;align-items:center;gap:var(--sc-3);flex-wrap:wrap;margin-bottom:var(--sc-4)}
    .sc-band__head .sc-toolbar__actions{margin-left:auto}
    .sc-band--tight{padding:var(--sc-3) var(--sc-4);margin:var(--sc-3) 0}

/* ── Kennzahlen-Reihe mit variabler Anzahl (kd-kpis ist fest auf 4) ──────── */
    .sc-kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(190px,1fr));gap:var(--sc-2)}

/* ── Ampeln „Websites & Wartung": gefüllt = aktiviert, Ring = nicht aktiviert,
      Bedeutung als sichtbarer Text statt als title-Tooltip (Touch!) ──────── */
    .sc-lamp{width:10px;height:10px;border-radius:50%;display:inline-block;flex:0 0 auto;
      background:var(--sc-mist);box-shadow:0 0 0 1px var(--sc-line)}
    .sc-lamp--ok{background:var(--sc-ok)}
    .sc-lamp--warn{background:var(--sc-warn)}
    .sc-lamp--bad{background:var(--sc-bad)}
    .sc-lamp--off{background:transparent;box-shadow:inset 0 0 0 1.5px var(--sc-line-strong)}
    .sc-lamp--sq{border-radius:3px}
    .sc-lamps{margin-top:var(--sc-3);border-top:1px solid var(--sc-line);padding-top:var(--sc-1)}
    .sc-lamp__row{display:flex;align-items:center;gap:var(--sc-2);padding:5px 0;
      font-size:var(--sc-t-sm);cursor:pointer;border-radius:var(--sc-r-sm)}
    .sc-lamp__row:hover{background:var(--sc-sunk)}
    .sc-lamp__row .lab{color:var(--sc-text)}
    .sc-lamp__row .val{margin-left:auto;color:var(--sc-muted);font-size:var(--sc-t-xs);text-align:right}
    .sc-legend{display:flex;flex-wrap:wrap;gap:var(--sc-4);align-items:center;
      font-size:var(--sc-t-xs);color:var(--sc-faint);margin-bottom:var(--sc-4)}
    .sc-legend > span{display:inline-flex;align-items:center;gap:6px}

/* ── 12er-Raster: fehlende Spaltenbreiten ───────────────────────────────── */
    .kd-c8{grid-column:span 8}
    .kd-c9{grid-column:span 9}
    @media(max-width:1200px){.kd-c8,.kd-c9{grid-column:span 12}}

/* ── Chip zum Hinzufügen (der Chip selbst ist zentral definiert) ─────────── */
    .sc-chip--add{background:none;border:1px dashed var(--sc-line-strong);
      color:var(--sc-muted);cursor:pointer;font-family:inherit}
    .sc-chip--add:hover{border-color:var(--sc-lime-deep);color:var(--sc-lime-deep)}
    .sc-chip:not([onclick]):not(.sc-chip--add){cursor:default}

/* ── Ergänzungen zum Kartenfuß (Fuß selbst existiert bereits) ────────────── */
    .sc-card__foot .action-row{margin-left:auto;display:flex;align-items:center;
      gap:var(--sc-2);flex-wrap:wrap}
    .sc-card__foot--plain{border-top:0;padding-top:0}

/* ── Breite Tabellen scrollen in sich, nie die Seite ─────────────────────── */
    .sc-tablewrap{overflow-x:auto;-webkit-overflow-scrolling:touch}

/* ── Fester Rahmen für Chart.js-Canvas ───────────────────────────────────── */
    .sc-chartbox{height:200px;background:var(--sc-sunk);border:1px solid var(--sc-line);
      border-radius:var(--sc-r-md);padding:var(--sc-2);margin-top:var(--sc-3)}

/* ── Abschnitt im Website-Detail-Modal (_hoSection) ──────────────────────── */
    .sc-sec{background:var(--sc-sunk);border:1px solid var(--sc-line);
      border-radius:var(--sc-r-md);padding:var(--sc-4);margin-bottom:var(--sc-4)}
    .sc-sec__head{display:flex;align-items:center;gap:7px;margin-bottom:var(--sc-3);
      font-family:var(--sc-font-mono);font-size:var(--sc-t-xs);text-transform:uppercase;
      letter-spacing:.07em;font-weight:600;color:var(--sc-muted)}
    .sc-sec__head i,.sc-sec__head svg{width:14px;height:14px;flex:0 0 auto}
    .sc-sec__foot{display:flex;gap:var(--sc-2);flex-wrap:wrap;margin-top:var(--sc-3)}

/* ── Schlüssel/Wert-Aufstellung ──────────────────────────────────────────── */
    .sc-dl{display:grid;grid-template-columns:auto 1fr;gap:6px var(--sc-4);
      align-items:baseline;font-size:var(--sc-t-base)}
    .sc-dl__k{color:var(--sc-muted)}
    .sc-dl__v{font-weight:500}
    .sc-dl__v--gross{font-size:var(--sc-t-lg);font-weight:700}

/* ── Ereigniszeile Wartungs-/Security-Verlauf ────────────────────────────── */
    .sc-ev{display:flex;gap:var(--sc-3);padding:9px 0;border-bottom:1px solid var(--sc-line)}
    .sc-ev:last-child{border-bottom:0}
    .sc-ev__lamp{margin-top:5px}
    .sc-ev__main{flex:1;min-width:0}
    .sc-ev__meta{display:flex;gap:var(--sc-2);align-items:center;flex-wrap:wrap;font-size:var(--sc-t-sm)}
    .sc-ev__zeit{color:var(--sc-faint);font-variant-numeric:tabular-nums}
    .sc-ev__txt{font-size:var(--sc-t-sm);color:var(--sc-muted)}
    .sc-pre{white-space:pre-wrap;background:var(--sc-sunk);border:1px solid var(--sc-line);
      border-radius:var(--sc-r-sm);padding:var(--sc-3);font-size:var(--sc-t-xs);
      font-family:var(--sc-font-mono);margin-top:var(--sc-2);overflow-x:auto}

/* ── Hover-Popover der Ampeln ────────────────────────────────────────────── */
    .sc-pop{position:fixed;z-index:9999;background:var(--sc-paper);color:var(--sc-text);
      border:1px solid var(--sc-line-strong);border-radius:var(--sc-r-sm);
      box-shadow:var(--sc-sh-2);padding:var(--sc-2) var(--sc-3);
      font-size:var(--sc-t-sm);max-width:320px;pointer-events:none}

/* ── .sc-tab: manche Hub-Funktionen schalten .active statt .is-active ────── */
    .sc-tab.active{color:var(--sc-text);font-weight:600;border-bottom-color:var(--sc-lime)}
    .sc-tab.active .sc-tab__n{background:var(--sc-lime);color:var(--sc-ink)}

/* ── Zustandsmarken ──────────────────────────────────────────────────────── */
    .is-muted{opacity:.6}
    .sc-card.is-muted{box-shadow:none}
    .sc-note--klein{font-size:var(--sc-t-sm);padding:8px var(--sc-3)}

/* ── Websites & Wartung: die vier Filter gehören auf EINE Zeile; ist daneben
      kein Platz mehr, rutscht die Sammelaktion-Gruppe auf ihre eigene Zeile
      (sonst bricht ein einzelnes Select allein um). Nur hier, damit die
      zentrale .sc-toolbar__filters unberührt bleibt. ───────────────────────── */
    #tab-hosting .sc-toolbar--filters .sc-toolbar__filters{flex:1 1 580px}
    #tab-hosting .sc-toolbar--filters .sc-inp--wide{max-width:320px}


    /* ═══════════════════════════════════════════════════════════════════════
       ANGEBOTE — generische Ergaenzungen
       Diese vier Klassen kamen mit dem Angebote-Entwurf, sind aber nicht
       bereichsspezifisch. Sie stehen deshalb hier statt im Inline-Block.
       .sc-search / .sc-note__txt / .sc-empty__act existierten bereits und
       wurden NICHT erneut definiert.
       ═══════════════════════════════════════════════════════════════════════ */
    .sc-lead{margin:0;color:var(--sc-muted);font-size:var(--sc-t-base);line-height:1.5;max-width:64ch}
    .sc-field--num input{text-align:right;font-variant-numeric:tabular-nums}
    .sc-field--stark input{font-weight:600}
    .sc-field--intern input{background:var(--sc-warn-bg)}


/* ══════════════════════════════════════════════════════════════════════════
   FINANZEN — Ergaenzung zum Bereichsumbau
   (Forecast · Monats-Cockpit · USt-Voranmeldung · Steuer-Radar · Schuldkonten)
   Rein additiv. Bereits zentral vorhanden und deshalb NICHT erneut definiert:
   .sc-table th{background:transparent} / .sc-table td{text-align:left} (Z. 394),
   .sc-search (Z. 562), .sc-bar / .sc-bar__fill (Z. 411), .sc-inp (Z. 728),
   .sc-stack, .sc-band, .sc-card__head{flex-wrap:wrap}, label.sc-drop.
   ══════════════════════════════════════════════════════════════════════════ */

/* ── Tabellen-Zustaende, die es im Hub bisher nicht gab ─────────────────── */
    .sc-table th.sortable{cursor:pointer;user-select:none}
    .sc-table th.sortable:hover{background:var(--sc-mist)}
    .sc-table tfoot td{font-weight:700;background:var(--sc-sunk);
      border-top:1px solid var(--sc-line-strong);border-bottom:0}
/* Fett gesetzte Summen sind breiter als die Spalte darueber — ohne das bricht
   das Euro-Zeichen in die naechste Zeile um. */
    .sc-table tfoot td.num{white-space:nowrap}
    .sc-table tr.is-excluded td{opacity:.5;text-decoration:line-through}
    .sc-table tr.is-mahnung td{background:var(--sc-bad-bg)}

/* Knopf als Verweis (STB-Pack-Download in der Monatskarte) */
    a.btn{display:inline-flex;align-items:center;gap:var(--sc-1);text-decoration:none}
/* Hinweis als letztes Element einer Karte braucht keinen Abstand nach unten */
    .sc-note:last-child{margin-bottom:0}

/* ── Kopfzeile einer breiten Tabelle bleibt beim Scrollen stehen.
      --fc-th-top setzt fcUpdateStickyTops() an der Tabelle. ─────────────── */
    @media(min-width:1000px){
      .sc-scroll--sticky{overflow-x:visible}
      .sc-scroll--sticky .sc-table thead th{position:sticky;top:var(--fc-th-top,102px);
        z-index:80;background:var(--sc-paper);box-shadow:0 1px 0 var(--sc-line)}
    }

/* ── Anklickbare Karte (Monatskarte, Schuldkonto) ────────────────────────── */
    .sc-card--link{cursor:pointer;transition:box-shadow var(--sc-t-fast),border-color var(--sc-t-fast)}
    .sc-card--link:hover{box-shadow:var(--sc-sh-2);border-color:var(--sc-line-strong)}

/* ── Fortschritts-Rollen. Die Huelle .sc-bar/.sc-bar__fill steht oben;
      hier nur die drei Rollen-Varianten fuer den Fuellstand. ────────────── */
    .sc-bar__fill--ok{background:var(--sc-ok)}
    .sc-bar__fill--warn{background:var(--sc-warn)}
    .sc-bar__fill--bad{background:var(--sc-bad)}

/* ── Ergebnis-/Summenblock: Zahllast, Ruecklage, Restschuld.
      IMMER zusammen mit .sc-dark setzen — .sc-dark liefert die Token fuer
      Dunkel (sonst bleiben ok/warn/bad auf den hellen Werten und sind
      unlesbar), .sc-sum liefert die Huelle. ────────────────────────────── */
    .sc-sum{background:var(--sc-ink);color:var(--sc-on-dark);
      border-radius:var(--sc-r-lg);padding:var(--sc-5)}
    .sc-sum .sc-kick{color:var(--sc-lime)}
    .sc-sum .sc-kick::before{background:var(--sc-lime)}
    .sc-sum .sc-more{color:var(--sc-on-dark-muted)}
    .sc-sum__row{display:flex;justify-content:space-between;align-items:baseline;
      gap:var(--sc-4);padding:8px 0;border-bottom:1px solid var(--sc-line-dark);
      font-size:var(--sc-t-base)}
    .sc-sum__row:last-child{border-bottom:0;font-size:var(--sc-t-xl);font-weight:700}
    .sc-sum__lab{color:var(--sc-on-dark-muted);min-width:0}
    .sc-sum__row:last-child .sc-sum__lab{color:var(--sc-on-dark)}
    .sc-sum__val{font-variant-numeric:tabular-nums;white-space:nowrap;font-weight:600}

/* ── Terminzeile im Bescheid-Modal: zwei Felder + Loeschknopf, bricht auf
      dem Handy um statt die Felder zu quetschen. ───────────────────────── */
    .strad-faellig-row{flex-wrap:wrap}
    .strad-faellig-row .sc-inp{width:100%;box-sizing:border-box}
    .strad-faellig-row .kd-row__main{flex:1 1 150px}


/* ══════════════════════════════════════════════════════════════════════════
   ERGAENZUNGEN AUS DEM RUNDMAIL- / AGB-UMBAU (16.08.2026)
   Nur was zentral WIRKLICH gefehlt hat. Vorhandene Bausteine (.sc-toolbar,
   .sc-band, .sc-sum, .sc-scroll, .sc-scrolly, .sc-lead, .sc-hint, .sc-msg,
   .sc-pre, .sc-details, .sc-actions, .kd-c8, .sc-kpi*) werden benutzt, NICHT
   neu definiert. Kein einziger Hex-Wert.
   ══════════════════════════════════════════════════════════════════════════ */

/* ── Zeile + Verteiler. Ersetzen die style="display:flex;gap:…"-Inlines. ── */
.sc-row{display:flex;align-items:center;gap:var(--sc-3);flex-wrap:wrap}
.sc-grow{flex:1 1 12rem;min-width:0}
.sc-push{margin-left:auto}
.sc-spacer{flex:1;min-width:0}

/* Knopf ohne Knopf-Optik (traegt nur eine Pille o. ae.) */
.sc-plain{border:0;background:none;padding:0;cursor:pointer;color:inherit;
  display:inline-flex;align-items:center;font-family:inherit}

/* Zweckhelfer */
.sc-hidden{display:none !important}
.sc-mono{font-family:var(--sc-font-mono)}

/* Hoher Rollbereich (Auswahllisten in Modals). Modifier zu .sc-scrolly. */
.sc-scrolly--tall{max-height:56vh}

/* ── Beschriftung/Wert als Zeile in einer Karte ─────────────────────────── */
.sc-kv{display:flex;align-items:baseline;gap:var(--sc-3);padding:7px 0;
  border-bottom:1px solid var(--sc-line);font-size:var(--sc-t-base)}
.sc-kv:last-child{border-bottom:0}
.sc-kv__k{color:var(--sc-muted);flex:1 1 auto;min-width:0}
.sc-kv__v{flex:0 1 auto;min-width:0;text-align:right;word-break:break-word;font-weight:500}

/* ── Dokumentvorschau (gerenderter Rechtstext im Editor) ────────────────── */
.sc-doc{background:var(--sc-paper);border:1px solid var(--sc-line);
  border-radius:var(--sc-r-sm);padding:var(--sc-3) var(--sc-4);
  max-height:240px;overflow:auto;font-size:var(--sc-t-sm);line-height:1.5;
  margin-bottom:var(--sc-3)}

/* ── Eingabe ausserhalb von .sc-form (Schnellerfassung, Testadresse) ────── */
.sc-input-inline{padding:8px 11px;border:1px solid var(--sc-line-strong);
  border-radius:var(--sc-r-sm);font-size:var(--sc-t-base);font-family:inherit;
  background:var(--sc-paper);color:var(--sc-text);min-width:0}
.sc-input-inline:focus{outline:none;border-color:var(--sc-lime-deep)}
/* Grosses Textfeld (Mailtext) */
.sc-ta-lg{min-height:260px;resize:vertical;line-height:1.5}

/* ── Ergaenzungen zu .sc-check ──────────────────────────────────────────── */
.sc-check.sc-check--warn{color:var(--sc-bad)}
.sc-check svg.lucide{width:14px;height:14px}

/* ── Ergaenzungen zu .sc-list / .sc-li ──────────────────────────────────── */
.sc-li.sc-li--pick{cursor:pointer;gap:var(--sc-2)}
.sc-li.sc-li--pick input[type=checkbox]{width:16px;height:16px;margin:0;
  flex:0 0 auto;accent-color:var(--sc-lime-deep)}
/* Zwischenueberschrift innerhalb einer Liste */
.sc-kick--sub{display:flex;margin:var(--sc-4) 0 var(--sc-2)}

/* ── Aufklapp-Pfeil fuer JS-gesteuerte Zeilen ───────────────────────────── */
.sc-chev{display:inline-flex;flex:0 0 auto;color:var(--sc-faint);
  transition:transform var(--sc-t-fast)}
.sc-chev svg.lucide{width:15px;height:15px}
.sc-chev.is-open{transform:rotate(90deg)}

/* ── Ergaenzungen zu .sc-tab__n: Zaehler mit Dringlichkeit ──────────────── */
.sc-tab__n.sc-tab__n--warn{background:var(--sc-warn-bg);color:var(--sc-warn)}
.sc-tab__n.sc-tab__n--bad{background:var(--sc-bad-bg);color:var(--sc-bad)}
.sc-tab.is-active .sc-tab__n--warn,
.sc-tab.is-active .sc-tab__n--bad{background:var(--sc-lime);color:var(--sc-ink)}

/* ── Ergaenzungen zu .sc-sum: einzeiliger Ergebnisblock ─────────────────── */
.sc-sum.sc-sum--zeile{padding:var(--sc-3) var(--sc-4);font-size:var(--sc-t-base);
  border-radius:var(--sc-r-md);margin-top:var(--sc-4)}
.sc-sum b{color:var(--sc-lime)}

/* ── Mail-Vorschau: bildet die versendete Rundmail nach ─────────────────── */
.sc-mailprev{border:1px solid var(--sc-line);border-radius:var(--sc-r-md);
  overflow:auto;max-height:60vh}
.sc-mailprev__head{background:var(--sc-ink);color:var(--sc-on-dark);
  padding:var(--sc-3) var(--sc-4);font-weight:700}
.sc-mailprev__head b{color:var(--sc-lime)}
.sc-mailprev__body{background:var(--sc-paper);padding:var(--sc-5)}
.sc-mailprev__subj{margin:0 0 var(--sc-3);font-size:var(--sc-t-lg);
  border-bottom:2px solid var(--sc-lime);padding-bottom:var(--sc-2)}
.sc-mailprev__text{line-height:1.55;font-size:var(--sc-t-base);word-break:break-word}
.sc-mailprev__text img{max-width:100%;height:auto}
.sc-mailprev__foot{color:var(--sc-faint);font-size:var(--sc-t-xs);
  border-top:1px solid var(--sc-line);margin:var(--sc-5) 0 0;padding-top:var(--sc-3)}

/* ── Senkrechter Rhythmus im Rundmail-Verfasser ─────────────────────────────
      Radioleiste, Betreff-Formular und Werkzeugleiste liegen direkt in der
      Karte. Ohne diese drei Zeilen klebt die Beschriftung "Betreff" an den
      Auswahlknoepfen und die Einfuegeleiste am Eingabefeld. */
#nl-sub-verfassen .sc-row{margin-bottom:var(--sc-5)}
#nl-sub-verfassen .sc-form{margin-bottom:var(--sc-4)}
#nl-sub-verfassen .sc-toolbar{align-items:center;margin-bottom:var(--sc-3)}
#nl-sub-verfassen .sc-toolbar .sc-hint{text-align:right}

/* ── AGB & Recht auf schmalen Geraeten: Titel, Pillen und Aktionen einer
      Zeile stehen sonst nebeneinander und quetschen den Titel auf drei
      Zeichen Breite (gemessen bei 390px). ─────────────────────────────── */
@media (max-width:640px){
  #tab-agb .kd-row{flex-wrap:wrap}
  #tab-agb .kd-row__main{flex:1 1 100%}
}

/* ══════════════════════════════════════════════════════════════════════════
   ERGAENZUNGEN AUS DEM UMBAU „DRUCK & WERBUNG"
   ══════════════════════════════════════════════════════════════════════════ */

/* Raster-Kinder duerfen nie breiter werden als ihre Spur. Ohne diese Zeile
   sprengt ein langer Produktname oder Anbieter-Link die 12-Spalten-Reihe und
   die SEITE scrollt waagerecht — bei 271 Katalogzeilen der Normalfall, nicht
   die Ausnahme. (Grid-Kinder haben per Vorgabe min-width:auto.) */
.kd-grid>*{min-width:0}

/* Zahlenpaar „Beschriftung + Betrag" innerhalb einer Karte. Bisher als Inline-
   Span mit eigener Farbe gebaut — allein in renderDruck 12 verschiedene Hex.
   .sc-kpi ist die Kachel im Band, .kd-row__s der Fliesstext; fuer die
   Zahlenzeile IN der Karte gab es nichts. */
.sc-facts{display:flex;flex-wrap:wrap;gap:var(--sc-1) var(--sc-5);margin-top:var(--sc-3)}
.sc-fact{display:inline-flex;align-items:baseline;gap:var(--sc-2);white-space:nowrap}
.sc-fact__lab{font-family:var(--sc-font-mono);font-size:var(--sc-t-xs);letter-spacing:.06em;
  text-transform:uppercase;color:var(--sc-faint)}
.sc-fact b{font-variant-numeric:tabular-nums;font-weight:600}

/* Negativer Betrag — EIN Rotton fuer Karte und Tabellenzelle. Vorher standen
   dafuer #c62828 (Karte) und var(--sc-danger) (Staffel) nebeneinander. */
.sc-neg{color:var(--sc-bad)}

/* Statuskante der Katalogkarte. Bei 271 Karten muss der Zustand im Vorbei-
   scrollen erkennbar sein; die Statusmarke allein liest man erst beim Anhalten. */
/* Die Statuskante traegt seit dem Rueckbau auf Tabellen die Zeile, nicht mehr
   die Karte — Regeln dazu stehen am Dateiende unter „Druckkatalog". */

/* Fusszeile EINER Karte: Details-Schalter links, Aktionen rechts.
   Bewusst NICHT .sc-toolbar — deren eigene Abgrenzung sagt, sie bediene eine
   ganze Liste und stehe ausserhalb der Karte. */
.sc-cardfoot{display:flex;align-items:center;gap:var(--sc-3);flex-wrap:wrap;
  margin-top:var(--sc-4);padding-top:var(--sc-3);border-top:1px solid var(--sc-line)}
.sc-cardfoot .action-row{margin-left:auto}

/* Anklickbare Statusmarke (Status durchschalten). Ohne diese Zeile setzt der
   Browser Rahmen und Systemschrift auf den <button> und die Pille bricht auf. */
button.sc-pill{border:0;cursor:pointer;font-family:var(--sc-font-mono)}

/* Suchfeld in der Werkzeugleiste. .sc-field--kompakt (104 px) reicht fuer ein
   Jahr, nicht fuer einen Suchbegriff; ganz ohne Basis schrumpft das Feld im
   Flexrahmen auf Min-Content.
   Bewusst mit dem Rahmen davor: index.html erklaert weiter unten im Dokument
   .sc-field{min-width:0} — bei gleicher Spezifitaet gewinnt sonst die spaetere
   Regel und das Feld faellt wieder auf Min-Content zusammen. */
.sc-toolbar__filters .sc-field--suche{flex:1 1 220px;min-width:160px}

/* Druck & Werbung auf schmalen Geraeten: die Werkzeugleiste traegt links drei
   Filter und rechts zwei breite Knoepfe. Unter 760 px bleibt fuer die Suche
   sonst ein 81-px-Stummel (gemessen bei 390 px). Deshalb: Aktionen auf eine
   eigene Zeile, Filter ueber die volle Breite. Nur hier, damit die zentrale
   .sc-toolbar unberuehrt bleibt. */
@media (max-width:900px){
  #tab-druckplanung .sc-toolbar--filters{flex-direction:column;align-items:stretch}
  #tab-druckplanung .sc-toolbar__filters,
  #tab-druckplanung .sc-toolbar__actions{width:100%;margin-left:0}
  #tab-druckplanung .sc-toolbar__filters .sc-search{flex:1 1 100%}
  #tab-druckplanung .sc-toolbar__filters .druck-filter{flex:1 1 132px;min-width:0}
  #tab-druckplanung .sc-toolbar__actions .btn{flex:1 1 auto;justify-content:center}
}

/* Eingabefeld mit Knopf daneben (Aufschlag zuruecksetzen im Eintrag-Formular,
   Wert kopieren im Posten-Modal). .sc-field input ist width:100% — ohne diese
   zwei Zeilen faellt der Knopf in die naechste Zeile unter das Feld.
   Bewusst auf .sc-field beschraenkt: die uebrigen .sc-actions im Hub sind
   reine Knopfreihen ohne Eingabefeld. */
.sc-field .sc-actions{flex-wrap:nowrap}
.sc-field .sc-actions>input{flex:1 1 auto;width:auto;min-width:0}

/* Knoepfe mit Symbol brechen sonst zwischen Symbol und Beschriftung um
   ("x" ueber "Zuruecksetzen", gemessen bei 390 px). .btn in index.html ist
   inline-block; hier nur fuer diesen Bereich auf eine Zeile gestellt. */
#tab-druckplanung .btn{display:inline-flex;align-items:center;gap:var(--sc-2)}

/* Kunde/Anbieter als Tipp-Autocomplete statt Auswahlliste (18.08.2026): zwei
   Textfelder mit angehaengter Vorschlagsliste. Ohne Grundbreite zoege das
   Suchfeld daneben (flex:1) die beiden auf Min-Content zusammen. */
#tab-druckplanung .druck-filter{flex:0 1 172px;min-width:120px}


/* ══════════════════════════════════════════════════════════════════════════
   ERGAENZUNGEN AUS DEM BWA-UMBAU (16.08.2026)
   Bereiche: Verlauf · Kostenanalyse · Jahresvergleich · Privat & Krankenkasse.
   Bewusst NICHT erneut definiert, weil zentral vorhanden: .sc-toolbar, .sc-band,
   .sc-kpis/.sc-kpi*, .sc-card*, .sc-table*, .sc-scroll, .sc-empty, .sc-note,
   .sc-pill, .sc-chip, .sc-hint, .sc-details, .sc-sec, .sc-dl, .sc-form/.sc-field,
   .kd-grid/.kd-c*, .kd-row*. Alles ueber Token, kein Hex-Wert.
   Jede Regel ist auf ihren Bereich begrenzt — kein hubweiter Eingriff.
   ══════════════════════════════════════════════════════════════════════════ */

/* Summenzeile in einer Kennzahlen-Tabelle (Betriebseinnahmen gesamt, Netto-
   Entnahme). Vorher als Inline-Style je Zeile gesetzt; .sc-table tfoot passt
   nicht, weil die Summen MITTEN in der Tabelle stehen. */
#tab-jahresvergleich .sc-table tr.sc-tr-summe td,
#tab-privat .sc-table tr.sc-tr-summe td{font-weight:700;border-top:1px solid var(--sc-line-strong)}

/* Vergleichszeile, die nicht zum eigentlichen Thema gehoert ("Betriebsergebnis
   zum Vergleich" in der Entnahmen-Tabelle). */
#tab-privat .sc-table tr.sc-tr-neben td{color:var(--sc-muted);font-style:italic}

/* Ein .sc-sec bringt margin-bottom mit; als Rasterkind erzeugt das ungleiche
   Reihenhoehen (Rechner-Spalten, aufgeklappte KK-Zeile). */
#tab-privat .kd-grid > .sc-sec{margin-bottom:0}
#tab-privat .kk-detail .sc-sec{margin-bottom:var(--sc-3)}

/* Aufklappbare Jahreszeile der KK-Analyse */
#tab-privat .kk-zeile{cursor:pointer}
#tab-privat .kk-detail > td{background:var(--sc-sunk)}
/* Die Bemerkung erklaert die Zeile darueber und gehoert optisch an sie heran. */
#tab-privat .kk-bemerkung td{padding-top:0;border-bottom:0}

/* Kassensuche: ein Suchfeld braucht keine volle Kartenbreite. Das Aufklappmenue
   haengt an .kk-search-wrap (position:relative) — deren Aussenabstand stammt aus
   der Zeit vor .sc-field und wuerde das Feld vom Label loesen. */
#tab-privat .kk-suchfeld{max-width:480px}
#tab-privat .kk-search-wrap{margin-bottom:0}

/* Ergebnisblock steht als letztes Element in der Karte. */
#tab-privat .kk-ergebnis{margin-bottom:0}
#tab-privat #kk-hint{margin-top:var(--sc-4);margin-bottom:0}

/* Aufzaehlung der Zukunftsvorschau (kommt als <ul> aus dem Skript). */
#tab-privat #kk-zukunft-content ul{margin:var(--sc-2) 0 0;padding-left:var(--sc-5)}
#tab-privat #kk-zukunft-content li{margin-bottom:var(--sc-1)}

/* Die drei Rechner-Spalten tragen unterschiedlich viele Felder. Ohne stretch
   enden sie auf drei verschiedenen Hoehen und wirken wie ein Fehler. */
#tab-privat .kk-rechner{align-items:stretch}

/* Breite Zahlentabellen: .sc-scroll rollt zwar, aber .sc-table ist width:100 %
   und quetscht sich deshalb lieber in 390 px hinein, statt zu rollen — dann
   bricht „2026-06" mitten im Datum um. Mit einer Mindestbreite rollt die
   Tabelle wie vorgesehen; die SEITE bleibt unberuehrt. */
#tab-kosten .sc-scroll > .sc-table,
#tab-jahresvergleich .sc-scroll > .sc-table,
#tab-privat .sc-scroll > .sc-table{min-width:520px}
#tab-verlauf .sc-scroll > .sc-table{min-width:780px}
#tab-jahresvergleich #jahres-table{min-width:720px}
#tab-privat #kk-jahres-table,
#tab-privat #privat-table{min-width:640px}

/* Ein Betrag darf nie zwischen Zahl und Euro-Zeichen umbrechen. Passiert sonst
   in jeder Zahlenspalte, sobald die Tabelle schmaler wird als ihre Inhalte. */
#tab-verlauf .sc-table td.num,
#tab-kosten .sc-table td.num,
#tab-jahresvergleich .sc-table td.num,
#tab-privat .sc-table td.num{white-space:nowrap}

/* Auf dem Handy braucht eine Legende mit zehn Kostenarten fuenf Zeilen; in
   260 px Hoehe bleibt dann kaum Diagramm uebrig und die oberste Achsen-
   beschriftung liegt an der Legende. */
@media(max-width:760px){
  #tab-kosten .chart-wrapper{height:330px}
}


/* ══════════════════════════════════════════════════════════════════════════
   ERGAENZUNGEN AUS DEM UMBAU „TO-DOS · AUFTRAEGE · SHOP" (16.08.2026)
   Bereits zentral vorhanden und deshalb bewusst NICHT erneut definiert:
   .sc-toolbar(*), .sc-band, .sc-kpis/.sc-kpi*, .sc-card*, .sc-table*,
   .sc-tablewrap, .sc-tabs/.sc-tab*, .sc-chip(s), .sc-search, .sc-inp,
   .sc-empty(*), .sc-note(*), .sc-pill*, .sc-hint, .sc-lamp*, .sc-chev,
   .sc-plain, .sc-list/.sc-li*, .sc-form/.sc-field/.sc-check, .kd-grid/.kd-c*.
   Kein einziger Hex-Wert; jede Regel ist auf ihren Bereich begrenzt.
   ══════════════════════════════════════════════════════════════════════════ */

/* Aktionsknopf in „Bestaetigt/Uebernehmen"-Rolle. Es gab bisher nur die
   Warn-Variante (.btn-icon-text--warn); die gruene Fassung stand im Auftrags-
   Markup als Inline-Style. */
.btn-icon-text.btn-icon-text--ok{border-color:var(--sc-ok-line);
  background:var(--sc-ok-bg);color:var(--sc-ok)}
.btn-icon-text.btn-icon-text--ok:hover{border-color:var(--sc-ok);
  background:var(--sc-ok-bg);color:var(--sc-ok)}

/* Eingabefelder DIREKT in einer .sc-table (Zeilen, die man an Ort und Stelle
   bearbeitet — To-dos und Auftraege). Bisher kam das aus .plan-table; ohne
   Ersatz stuenden dort nackte Browser-Felder. Bewusst nur fuer diese zwei
   Bereiche, damit die uebrigen sc-Tabellen unberuehrt bleiben. */
#tab-todos .sc-table input,#tab-todos .sc-table select,#tab-todos .sc-table textarea,
#tab-auftraege .sc-table input,#tab-auftraege .sc-table select,#tab-auftraege .sc-table textarea{
  width:100%;box-sizing:border-box;padding:5px 8px;font-family:inherit;
  font-size:var(--sc-t-base);color:var(--sc-text);background:var(--sc-paper);
  border:1px solid var(--sc-line-strong);border-radius:var(--sc-r-sm)}
#tab-todos .sc-table input:focus,#tab-todos .sc-table select:focus,#tab-todos .sc-table textarea:focus,
#tab-auftraege .sc-table input:focus,#tab-auftraege .sc-table select:focus,#tab-auftraege .sc-table textarea:focus{
  outline:none;border-color:var(--sc-lime-deep)}
#tab-todos .sc-table textarea,#tab-auftraege .sc-table textarea{
  resize:none;overflow:hidden;min-height:34px;line-height:1.45}
#tab-todos .sc-table input[type=checkbox]{width:17px;height:17px;padding:0;
  accent-color:var(--sc-lime-deep);cursor:pointer}

/* ── To-dos ─────────────────────────────────────────────────────────────── */
/* Der Rahmen traegt .todo-filters nur noch, damit ihn das Druck-Stylesheet
   ausblendet — das alte Flex-Layout darf hier nicht mehr greifen. */
#tab-todos .todo-filters{display:block;gap:0;margin-bottom:0}
#tab-todos #todo-status-filter{margin-bottom:0}
#tab-todos #todo-ki-panel{margin-bottom:var(--sc-4)}
/* Die Liste ist breiter als ein Handy — sie rollt in sich, nie die Seite.
   Kategorie und Notiz stehen im aufklappbaren Detail: mit ihnen in der Zeile
   blieben fuer die Aufgabe selbst nur ~90 px, und jede Zeile wurde durch die
   mitwachsenden Textfelder ueber 200 px hoch (gemessen bei 1500 px). */
#tab-todos .td-table{min-width:940px}
#tab-todos .td-col-chev{width:32px;padding-right:0}
#tab-todos .td-col-check{width:38px;text-align:center}
#tab-todos .td-col-datum{width:142px}
#tab-todos .td-col-prio{width:112px}
#tab-todos .td-col-titel{min-width:260px}
#tab-todos .td-col-kunde{width:150px}
#tab-todos .td-col-status{width:126px}
#tab-todos .td-col-akt{width:156px;white-space:nowrap}
#tab-todos .td-mehr{margin-top:var(--sc-1);font-size:var(--sc-t-xs);color:var(--sc-faint);
  letter-spacing:.02em}
#tab-todos .td-mehr:hover{color:var(--sc-primary);text-decoration:underline;text-underline-offset:2px}
/* Faelligkeits-Ampel: der Hub setzt global eine 3-px-Kante an die Zelle
   (td.date-red o. ae.). Bei dicht stehenden Zeilen verschmelzen die Kanten zu
   EINEM durchgehenden Balken, der wie ein Spaltentrenner aussieht. Hier traegt
   deshalb das Datumsfeld selbst die Warnung — und nur dann, wenn es eine gibt.
   Das !important ist noetig, weil die globale Regel eines fuehrt. */
#tab-todos td.date-green,#tab-todos td.date-orange,
#tab-todos td.date-red,#tab-todos td.date-done{border-left:0 !important}
#tab-todos td.date-red input{border-color:var(--sc-bad);color:var(--sc-bad);font-weight:600}
#tab-todos td.date-orange input{border-color:var(--sc-warn)}
#tab-todos tr.td-detail>td{background:var(--sc-sunk);padding:var(--sc-4) var(--sc-5)}
#tab-todos .td-detail__form{gap:var(--sc-3) var(--sc-5)}
#tab-todos .td-detail textarea{min-height:64px}
/* Prioritaet ist die wichtigste Sortiergroesse — sie muss man im Vorbei-
   scrollen sehen, nicht erst beim Aufklappen des Auswahlfeldes. */
#tab-todos .td-col-prio[data-p="Hoch"] select{color:var(--sc-bad);font-weight:600}
#tab-todos .td-col-prio[data-p="Mittel"] select{color:var(--sc-warn);font-weight:600}
#tab-todos .td-col-prio[data-p="Niedrig"] select{color:var(--sc-ok);font-weight:600}
/* Erledigtes bleibt gedaempft, aber lesbar: bei opacity .5 (Hub-Vorgabe) ist
   im Reiter „Erledigt" die GANZE Liste kaum noch zu entziffern. */
#tab-todos tr.todo-done td{opacity:.68}
#tab-todos .sc-empty .btn{margin:0}

/* ── Auftraege ──────────────────────────────────────────────────────────── */
#tab-auftraege .au-table{min-width:1120px}
#tab-auftraege .au-col-chev{width:34px;padding-right:0}
#tab-auftraege .au-col-kunde{min-width:250px}
#tab-auftraege .au-col-typ{width:132px}
#tab-auftraege .au-col-datum{width:136px}
#tab-auftraege .au-col-betrag{width:132px}
#tab-auftraege .au-col-betrag input{text-align:right;font-variant-numeric:tabular-nums}
/* Der Schaetzwert stand als nackte Zahl da („0,00") — ohne Waehrung ist
   nicht zu erkennen, ob Euro, Stunden oder Stueck gemeint sind. Das
   Zeichen gehoert neben das Feld, nicht hinein: im Feld wuerde es beim
   Tippen mitgeloescht und parseDE bekaeme es zurueck. */
#tab-auftraege .au-betrag{display:flex;align-items:center;gap:5px}
#tab-auftraege .au-betrag .au-eur{flex:0 0 auto;color:var(--sc-muted);
  font-size:var(--sc-t-sm)}
#tab-auftraege .au-col-status{width:132px}
#tab-auftraege .au-col-prio{width:74px}
#tab-auftraege .au-col-prio input{text-align:center}
#tab-auftraege .au-col-akt{width:206px;white-space:nowrap}
/* Kunde steht klein ueber der Aufgabe — zusammen sind sie EIN Gegenstand. */
#tab-auftraege .au-kunde{margin-bottom:var(--sc-1);font-size:var(--sc-t-sm);color:var(--sc-muted)}
#tab-auftraege .au-titel{font-weight:500}
#tab-auftraege .au-mehr{margin-top:var(--sc-1);font-size:var(--sc-t-xs);color:var(--sc-faint)}
#tab-auftraege .au-mehr:hover{color:var(--sc-primary);text-decoration:underline;text-underline-offset:2px}
/* „Fertig bis" ist verstrichen. Die Markierung sitzt am FELD, nicht an der
   Zellkante — eine 3-px-Kante ueber die volle Zeilenhoehe liest sich in einer
   Tabelle wie ein Spaltentrenner, nicht wie eine Warnung. */
#tab-auftraege td.au-spaet input{border-color:var(--sc-bad);color:var(--sc-bad);font-weight:600}
/* Status faerbt nur den Text des Auswahlfeldes; eine ganze gefaerbte Zelle
   wuerde in einer Zeile mit acht Feldern zu laut. */
#tab-auftraege .au-col-status[data-s="Beauftragt"] select{color:var(--sc-ok);font-weight:600}
#tab-auftraege .au-col-status[data-s="Angebot"] select{color:var(--sc-primary);font-weight:600}
#tab-auftraege .au-col-status[data-s="Anfrage"] select{color:var(--sc-info);font-weight:600}
#tab-auftraege .au-col-status[data-s="Abgelehnt"] select{color:var(--sc-bad)}
#tab-auftraege .au-col-status[data-s="Abgeschlossen"] select{color:var(--sc-faint)}
/* Aufklappbares Detail: Beschreibung und Bemerkung sind die zwei laengsten
   Felder — in der Zeile machen sie die Tabelle unlesbar, darunter nicht. */
#tab-auftraege tr.au-detail>td{background:var(--sc-sunk);padding:var(--sc-4) var(--sc-5)}
#tab-auftraege .au-detail__form{gap:var(--sc-3) var(--sc-5)}
#tab-auftraege .au-detail textarea{min-height:64px}
#tab-auftraege .au-foot-ok{color:var(--sc-ok);white-space:nowrap}

/* ── Shop ───────────────────────────────────────────────────────────────── */
#tab-shop .shop-liste{padding:var(--sc-3) var(--sc-4)}
#tab-shop .shop-table--prod{min-width:780px}
#tab-shop .shop-table--best{min-width:880px}
#tab-shop .shop-col-akt{width:1%;white-space:nowrap;text-align:right}
#tab-shop .shop-col-akt .action-row{justify-content:flex-end}
#tab-shop tr.shop-best-zeile{cursor:pointer}
#tab-shop tr.shop-best-zeile:hover td{background:var(--sc-sunk)}
#tab-shop .shop-set-form{margin-top:var(--sc-5)}
/* Ein schreibgeschuetztes Feld muss als solches erkennbar sein. */
#tab-shop #shop-glaeubiger{background:var(--sc-sunk);color:var(--sc-muted)}

/* ── Schmale Geraete: Werkzeugleisten und Kopfaktionen ──────────────────── */
@media (max-width:900px){
  #tab-todos .sc-toolbar__actions .btn,
  #tab-auftraege .sc-toolbar__actions .btn,
  #tab-shop .sc-toolbar__actions .btn{flex:1 1 auto;justify-content:center}
  #tab-todos .sc-toolbar--filters .sc-search,
  #tab-auftraege .sc-toolbar--filters .sc-search{flex:1 1 100%}
  #tab-todos .sc-toolbar--filters .sc-chips,
  #tab-auftraege .sc-toolbar--filters .sc-toolbar__filters{flex:1 1 100%}
  #tab-auftraege .sc-toolbar--filters .sc-inp,
  #tab-shop .sc-toolbar--filters .sc-inp{width:auto;flex:1 1 42%;min-width:0}
  #tab-auftraege .au-detail__form,
  #tab-todos .td-detail__form{grid-template-columns:1fr}
}

/* Bewusst `> tbody > tr:only-child`: ein blosses :has(.sc-empty) traf auch
   VOLLE Tabellen, sobald irgendwo darin ein Leerzustand steckte (etwa eine
   Hinweiszeile oder ein „Wird geladen…" in einer Detailzeile) — dann verschwand
   der Spaltenkopf einer Tabelle mit Inhalt. Gemeldet 17.08.2026. */

/* Ein Leerzustand braucht keine Tabellenbreite. Ohne diese Regel steht der
   Satz „Noch keine Bestellung eingegangen" in einer 880-px-Tabelle und ist auf
   dem Handy nur nach seitlichem Rollen lesbar. */
#tab-todos .sc-table:has(> tbody > tr:only-child > td > .sc-empty),
#tab-auftraege .sc-table:has(> tbody > tr:only-child > td > .sc-empty),
#tab-shop .sc-table:has(> tbody > tr:only-child > td > .sc-empty){min-width:0}
/* Und ohne Zeilen braucht sie auch keine Spaltenkoepfe — deren Mindestbreiten
   ziehen die Tabelle sonst weiter auf als der Bildschirm breit ist. */
#tab-todos .sc-table:has(> tbody > tr:only-child > td > .sc-empty) thead,
#tab-auftraege .sc-table:has(> tbody > tr:only-child > td > .sc-empty) thead,
#tab-shop .sc-table:has(> tbody > tr:only-child > td > .sc-empty) thead{display:none}

/* ── Handy: die zwei Bearbeitungslisten stapeln statt zu rollen ────────────
   Gemessen bei 390 px: in der rollenden Fassung sieht man von einer Aufgabe
   nur Haken und leeres Datumsfeld — der Aufgabentext beginnt erst 300 px
   weiter rechts. Deshalb wird die Zeile hier zu einem Block: Aufgabe zuerst
   ueber die volle Breite, darunter die Felder mit ihrer Beschriftung
   (aus data-lab, weil ohne Tabellenkopf sonst zwei Datumsfelder ohne
   Unterscheidung nebeneinander stuenden).
   Nur diese beiden Listen — alle anderen sc-Tabellen bleiben unberuehrt. */
@media (max-width:900px){
  #tab-todos .td-table,#tab-auftraege .au-table{min-width:0}
  #tab-todos .td-table thead,#tab-auftraege .au-table thead{display:none}
  #tab-todos .td-table tr,#tab-auftraege .au-table tr{
    display:flex;flex-wrap:wrap;align-items:flex-start;gap:var(--sc-2) var(--sc-3);
    padding:var(--sc-3) 0;border-bottom:1px solid var(--sc-line)}
  #tab-todos .td-table tr:last-child,#tab-auftraege .au-table tr:last-child{border-bottom:0}
  /* display:flex aus der Regel darueber schlaegt sonst das [hidden] des
     Browsers — die zugeklappten Detailzeilen waeren auf dem Handy alle offen. */
  #tab-todos .td-table tr[hidden],#tab-auftraege .au-table tr[hidden]{display:none}
  #tab-todos .td-table td,#tab-auftraege .au-table td{border:0;padding:0;width:auto}
  #tab-todos .td-table td[colspan],#tab-auftraege .au-table td[colspan]{flex:1 1 100%}
  /* Beschriftung, solange der Tabellenkopf fehlt */
  #tab-todos .td-table td[data-lab]::before,#tab-auftraege .au-table td[data-lab]::before{
    content:attr(data-lab);display:block;margin-bottom:3px;
    font-family:var(--sc-font-mono);font-size:var(--sc-t-xs);letter-spacing:.06em;
    text-transform:uppercase;color:var(--sc-faint)}

  /* Der Pfeil entfaellt hier — die Zeile unter dem Titel („Kunden · Notiz")
     klappt dasselbe Detail auf und steht ohnehin schon da. */
  #tab-todos .td-col-chev{display:none}
  #tab-todos .td-col-check{flex:0 0 20px;order:2;margin-top:7px}
  #tab-todos .td-col-titel{flex:1 1 200px;order:3;min-width:0}
  #tab-todos .td-col-datum{flex:1 1 150px;order:4}
  #tab-todos .td-col-prio{flex:1 1 110px;order:5}
  #tab-todos .td-col-status{flex:1 1 120px;order:6}
  #tab-todos .td-col-kunde{flex:1 1 100%;order:7}
  #tab-todos .td-col-akt{flex:1 1 100%;order:8}
  #tab-todos .td-col-akt .action-row{width:100%;justify-content:flex-end}
  #tab-todos tr.td-detail{padding:0;border-bottom:0}
  #tab-todos tr.td-detail>td{flex:1 1 100%;padding:var(--sc-3) var(--sc-4);
    border-radius:var(--sc-r-sm);margin-bottom:var(--sc-3)}

  /* ── Auftraege: Lesekarte statt Eingabemaske ────────────────────────────
     Bis 17.08.2026 war dies der einzige Listenbereich, der auf dem Handy
     noch als rohes Formular herauskam: sechs beschriftete Felder unter-
     einander, EIN Auftrag fuellte mehr als einen Bildschirm. Aufbau jetzt
     wie bei To-dos und Kunden: Kopfzeile mit der Hauptangabe, darunter
     kompakte Metazeilen. Reihenfolge der Zellen im Markup ist Typ ·
     Besprechung · Fertig bis · Schaetzwert · Status · Prio — die Ordnung
     hier stellt sie um, ohne das Markup zu drehen. */
  #tab-auftraege .au-table tbody tr:not(.au-detail){align-items:center;
    row-gap:var(--sc-2)}
  /* Kopfzeile: Aufklapp-Kachel + Kunde/Aufgabe ueber die restliche Breite.
     calc statt Prozent, weil die Metafelder sonst in Zeile 1 haengen
     bleiben und auf wenige Pixel zusammenschrumpfen (gleicher Fehler wie
     bei den To-dos, dort dokumentiert). */
  #tab-auftraege .au-col-chev{flex:0 0 auto;order:0;width:auto;
    align-self:flex-start;margin-top:2px}
  #tab-auftraege .au-col-kunde{flex:1 1 calc(100% - 52px);order:1;min-width:0}
  /* Metazeile 1: Status und Art des Auftrags */
  #tab-auftraege .au-col-status{flex:1 1 44%;order:2;width:auto;min-width:0}
  #tab-auftraege .au-col-typ{flex:1 1 40%;order:3;width:auto;min-width:0}
  /* Metazeile 2: die beiden Termine (gleiche Ordnungszahl = Markup-Reihenfolge) */
  #tab-auftraege .au-col-datum{flex:1 1 42%;order:4;width:auto;min-width:0}
  /* Metazeile 3: Schaetzwert und Prioritaet */
  #tab-auftraege .au-col-betrag{flex:1 1 45%;order:5;width:auto;min-width:0}
  #tab-auftraege .au-col-prio{flex:0 0 68px;order:6;width:auto}
  #tab-auftraege .au-col-akt{flex:1 1 100%;order:7}
  /* Linksbuendig wie in allen anderen Bereichen — rechtsbuendig stand die
     Knopfreihe als einzige gegen die Kante. */
  #tab-auftraege .au-col-akt .action-row{width:100%;justify-content:flex-start}

  /* Beschriftungen nur dort, wo der Wert allein mehrdeutig waere. „Typ" und
     „Status" stehen als Wort im Feld („Sonstiges", „Anfrage"), die
     Beschriftung wiederholt sie nur. Die beiden Datumsfelder, der Betrag und
     die Zahl bei Prio behalten ihre — ohne sie stuenden zwei gleich aussehende
     Daten und zwei nackte Zahlen nebeneinander. */
  #tab-auftraege .au-table td:is(.au-col-typ,.au-col-status)::before{content:none}

  /* Die Felder legen ihr Formular-Aussehen ab: kein Rahmen, kein Kasten. Sie
     bleiben vollstaendig bedienbar — der Rahmen erscheint beim Hineintippen.
     Genau das Muster, das die To-do-Liste seit dem 17.08. benutzt. */
  #tab-auftraege .au-table td :is(input,select,textarea){
    border-color:transparent;background:transparent;padding:3px 0;min-height:0;
    border-radius:var(--sc-r-sm)}
  #tab-auftraege .au-table td :is(input,select,textarea):focus{
    border-color:var(--sc-primary-line);background:var(--sc-paper);padding:6px 8px}
  /* Aufgabe traegt die Karte, der Kunde ordnet sich darueber unter. */
  #tab-auftraege .au-table .au-titel{font-weight:600;font-size:var(--sc-t-md);
    line-height:1.35}
  #tab-auftraege .au-table :is(.au-col-typ,.au-col-status,.au-col-datum,
    .au-col-betrag,.au-col-prio) :is(input,select){
    font-size:var(--sc-t-sm);color:var(--sc-muted);width:100%;min-width:0}
  /* Ohne Spalte darueber wirkt eine rechte Zahlenkante wie ein Fehler.
     Die Breite ist fest in Ziffernbreiten gefasst (Zahlen sind tabellarisch),
     damit das Waehrungszeichen direkt hinter dem Betrag steht und nicht am
     Zellenrand strandet — mit width:100 % lag es 130 px daneben. */
  /* td im Selektor, weil die Regel fuer die Metafelder darueber width:100 %
     setzt und mit .au-table zwei Klassen traegt — mit dem kuerzeren Selektor
     verliert man hier still (mit getComputedStyle nachgemessen). */
  /* Rechtsbuendig, obwohl darueber keine Spalte steht: das Eurozeichen folgt
     unmittelbar auf die Zahl, und bei linksbuendigem Text klaffte zwischen
     "0,00" und dem Zeichen eine Luecke von 40 px - es sah aus, als gehoerte
     es nicht dazu. Zahl und Waehrung bilden EINE Angabe. */
  #tab-auftraege .au-table td.au-col-betrag input{text-align:right;flex:0 1 auto;
    width:9.5ch;min-width:0}
  #tab-auftraege .au-table td.au-col-prio input{text-align:left;width:3ch}
  #tab-auftraege .au-table td.au-spaet input{font-weight:600}
  #tab-auftraege tr.au-detail{padding:0;border-bottom:0}
  #tab-auftraege tr.au-detail>td{flex:1 1 100%;padding:var(--sc-3) var(--sc-4);
    border-radius:var(--sc-r-sm);margin-bottom:var(--sc-3)}
  #tab-auftraege .au-table tfoot tr{gap:var(--sc-2);justify-content:space-between}
  #tab-auftraege .au-table tfoot td{flex:0 1 auto}
}


/* ══════════════════════════════════════════════════════════════════════════
   ERGAENZUNGEN AUS DEM UMBAU „VORLAGEN · KALKULATION · VERTRAGSDOKUMENTE"
   (16.08.2026)
   Bereits zentral vorhanden und deshalb bewusst NICHT erneut definiert:
   .sc-toolbar(*), .sc-band, .sc-kpis/.sc-kpi*, .sc-card*, .sc-table*,
   .sc-tablewrap, .sc-tabs/.sc-tab*, .sc-search, .sc-inp, .sc-chev, .sc-sum*,
   .sc-empty(*), .sc-note(*), .sc-pill*, .sc-hint, .sc-lead, .sc-form/.sc-field,
   .sc-actions, .sc-mono, .kd-grid/.kd-c*, .kd-row__s.
   Kein einziger Hex-Wert; jede Regel ist auf ihren Bereich begrenzt.
   ══════════════════════════════════════════════════════════════════════════ */

/* ── Vorlagen ───────────────────────────────────────────────────────────── */
/* Die Liste ist breiter als ein Handy und rollt in sich, nie die Seite. Die
   Mindestbreite haengt an der Art: Konditionen tragen zwei lange Textspalten,
   Angebotsposten nur eine. */
#tab-vorlagen .vlg-table{min-width:900px}
#tab-vorlagen .vlg-table[data-typ="angebotsposten"]{min-width:720px}
#tab-vorlagen .vlg-table[data-typ="kondition"]{min-width:900px}
#tab-vorlagen .vlg-c-name{min-width:210px}
#tab-vorlagen .vlg-c-kat{width:150px}
#tab-vorlagen .vlg-c-geld{width:124px;white-space:nowrap}
#tab-vorlagen .vlg-c-proz{width:92px;white-space:nowrap}
#tab-vorlagen .vlg-c-txt{min-width:240px}
#tab-vorlagen .vlg-c-akt{width:152px;white-space:nowrap}
#tab-vorlagen .vlg-c-akt .action-row{justify-content:flex-end;flex-wrap:nowrap}
#tab-vorlagen .vlg-t{font-weight:500}
/* Die Vorschau erklaert, WAS die Vorlage sagt — sie darf die Zeile aber nicht
   in die Hoehe treiben. */
#tab-vorlagen .vlg-s{display:block;font-size:var(--sc-t-sm);color:var(--sc-muted);
  line-height:1.4;margin-top:2px;overflow:hidden;display:-webkit-box;
  -webkit-line-clamp:2;-webkit-box-orient:vertical}
/* Der KI-Knopf war bisher ein Emoji auf einer Inline-Flaeche. */
#tab-vorlagen .vlg-btn-ki{border-color:var(--sc-warn-line);background:var(--sc-warn-bg);color:var(--sc-warn)}
#tab-vorlagen .vlg-btn-ki:hover{border-color:var(--sc-warn);background:var(--sc-warn-bg)}
/* Ein Leerzustand braucht weder Tabellenbreite noch Spaltenkoepfe. */
#tab-vorlagen .sc-table:has(> tbody > tr:only-child > td > .sc-empty){min-width:0}
#tab-vorlagen .sc-table:has(> tbody > tr:only-child > td > .sc-empty) thead{display:none}
#tab-vorlagen .sc-empty .btn{margin:0}

/* Dialoge des Bereichs (KI-Anpassen, Vorlage bearbeiten). Eigenes Overlay wie
   bisher — nur die Optik kommt jetzt aus den Bausteinen. */
.vlg-ov{display:none;position:fixed;inset:0;z-index:9000;padding:var(--sc-3);
  background:var(--sc-backdrop);align-items:center;justify-content:center}
.vlg-ov__box{background:var(--sc-paper);border-radius:var(--sc-r-lg);
  padding:var(--sc-6);width:680px;max-width:95vw;max-height:min(90vh,90dvh);
  overflow-y:auto;box-shadow:var(--sc-sh-3)}
.vlg-ov__box--breit{width:820px}
.vlg-ov .sc-card__head{margin-bottom:var(--sc-5)}
/* Technischer Text (KBMpro-Markup) — eine Schrift, nicht sechs Inline-Angaben. */
.vlg-ov .vlg-code,#vlg-edit-body .vlg-code{font-family:var(--sc-font-mono);
  font-size:var(--sc-t-sm);line-height:1.5;resize:vertical}
.vlg-ov .vlg-code--neu{background:var(--sc-warn-bg)}
.vlg-ov #vlg-ki-aktuell{background:var(--sc-sunk);color:var(--sc-muted)}

/* ── Kalkulation ────────────────────────────────────────────────────────── */
#tab-kalkulation .kk-table{min-width:820px}
#tab-kalkulation .kk-kunden-table{min-width:780px}
/* Ein Betrag darf nie zwischen Zahl und Euro-Zeichen umbrechen — in der
   Kunden-Tabelle stand sonst „39,00" ueber „€" (gemessen bei 1500 px). */
#tab-kalkulation .sc-table td.num,#tab-kalkulation .sc-table th.num{white-space:nowrap}
#tab-kalkulation .kk-c-tarif{min-width:230px}
#tab-kalkulation .kk-c-kunde{min-width:180px}
#tab-kalkulation .kk-c-num{width:132px;white-space:nowrap}
#tab-kalkulation .kk-c-deck{width:168px}
#tab-kalkulation .kk-code{font-family:var(--sc-font-mono);font-weight:700;letter-spacing:.02em}
#tab-kalkulation .kk-tarifkopf{display:flex;align-items:center;gap:var(--sc-2);flex-wrap:wrap}
/* Woraus sich der Preis ergibt (links) und was dabei herauskommt (rechts) sind
   zwei verschiedene Dinge — die Trennlinie sagt das, ohne ein Wort zu brauchen. */
#tab-kalkulation .kk-grp th{padding-bottom:2px;border-bottom:0;color:var(--sc-faint)}
#tab-kalkulation .kk-grp th+th{border-left:1px solid var(--sc-line-strong)}
#tab-kalkulation .kk-c-erg{border-left:1px solid var(--sc-line)}
#tab-kalkulation .kk-c-num+.kk-c-erg,#tab-kalkulation th.kk-c-num+th.kk-c-erg{border-left:1px solid var(--sc-line-strong)}
#tab-kalkulation .kk-c-erg~.kk-c-erg{border-left:1px solid var(--sc-line)}
#tab-kalkulation .kk-c-deck .kd-row__s{margin-top:3px}
#tab-kalkulation .sc-table:has(> tbody > tr:only-child > td > .sc-empty){min-width:0}
#tab-kalkulation .sc-table:has(> tbody > tr:only-child > td > .sc-empty) thead{display:none}

/* ── Vertragsdokumente ──────────────────────────────────────────────────── */
#tab-vertragsdok .sc-toolbar--filters .sc-inp--wide{max-width:320px}
#tab-vertragsdok .vd-table{min-width:940px}
#tab-vertragsdok .vd-c-chev{width:30px;padding-right:0}
#tab-vertragsdok .vd-c-titel{min-width:230px}
#tab-vertragsdok .vd-c-kunde{min-width:170px}
#tab-vertragsdok .vd-c-typ{width:140px}
#tab-vertragsdok .vd-c-jahr{width:74px}
#tab-vertragsdok .vd-c-status{width:168px}
#tab-vertragsdok .vd-c-zeit{min-width:170px}
#tab-vertragsdok .vd-titel{font-weight:500}
#tab-vertragsdok tr.vd-zeile{cursor:pointer}
#tab-vertragsdok tr.vd-zeile:hover td{background:var(--sc-sunk)}
#tab-vertragsdok tr.vd-zeile.is-open td{background:var(--sc-primary-bg)}
/* Die Detailzeile gehoert sichtbar zu ihrer Zeile — deshalb dieselbe Flaeche
   wie in den uebrigen Bereichen mit Aufklapp-Detail. */
#tab-vertragsdok tr.vd-detailzeile>td{background:var(--sc-sunk);padding:var(--sc-5)}
#tab-vertragsdok .vd-aktionen{margin:var(--sc-4) 0}
#tab-vertragsdok .vd-pos-table{min-width:0}
#tab-vertragsdok .vd-pos-t{font-weight:500}
#tab-vertragsdok .vd-pos-einheit{width:150px;color:var(--sc-muted);white-space:nowrap}
#tab-vertragsdok .vd-sum{margin-top:var(--sc-4)}
#tab-vertragsdok .vd-bemerkung{white-space:pre-wrap}
#tab-vertragsdok .sc-table:has(> tbody > tr:only-child > td > .sc-empty){min-width:0}
#tab-vertragsdok .sc-table:has(> tbody > tr:only-child > td > .sc-empty) thead{display:none}
#tab-vertragsdok .sc-empty .btn{margin:0}
/* Der KBMpro-Haken erscheint im Bereich UND auf der Kundenseite — beide
   Fundstellen bekommen dieselbe Regel, statt zwei Fassungen zu pflegen. */
#tab-vertragsdok .vd-kbm,#kunden-page-view .vd-kbm{display:inline-flex;
  margin:var(--sc-2) 0;padding:6px 11px;border-radius:var(--sc-r-sm);
  font-size:var(--sc-t-sm);border:1px solid var(--sc-line)}
#tab-vertragsdok .vd-kbm--ok,#kunden-page-view .vd-kbm--ok{background:var(--sc-ok-bg);
  border-color:var(--sc-ok-line);color:var(--sc-ok)}
#tab-vertragsdok .vd-kbm--offen,#kunden-page-view .vd-kbm--offen{background:var(--sc-warn-bg);
  border-color:var(--sc-warn-line);color:var(--sc-warn)}

/* ── Schmale Geraete: Werkzeugleisten ───────────────────────────────────── */
@media (max-width:900px){
  #tab-vorlagen .sc-toolbar__actions .btn,
  #tab-kalkulation .sc-toolbar__actions .btn,
  #tab-vertragsdok .sc-toolbar__actions .btn{flex:1 1 auto;justify-content:center}
  #tab-vorlagen .sc-toolbar--filters .sc-search{flex:1 1 100%}
  #tab-vorlagen .sc-toolbar--filters .sc-toolbar__filters,
  #tab-vertragsdok .sc-toolbar--filters .sc-toolbar__filters{flex:1 1 100%}
  #tab-vorlagen .sc-toolbar--filters .sc-inp,
  #tab-vertragsdok .sc-toolbar--filters .sc-inp{width:auto;flex:1 1 42%;min-width:0}
  #tab-vertragsdok .sc-form,#tab-vorlagen .sc-form{grid-template-columns:1fr}
}

/* ── Handy: die drei Listen stapeln statt zu rollen ───────────────────────
   Gemessen bei 390 px: rollend sieht man von einer Vorlage nur den halben
   Namen, vom Vertrag nur den Pfeil. Deshalb wird die Zeile hier zu einem
   Block — Hauptangabe zuerst ueber die volle Breite, darunter die Felder mit
   ihrer Beschriftung aus data-lab (der Tabellenkopf fehlt dann ja).
   Nur diese drei Tabellen; alle anderen sc-Tabellen bleiben unberuehrt. */
@media (max-width:900px){
  #tab-vorlagen .vlg-table,#tab-kalkulation .kk-table,
  #tab-kalkulation .kk-kunden-table,#tab-vertragsdok .vd-table{min-width:0}
  #tab-vorlagen .vlg-table thead,#tab-kalkulation .kk-table thead,
  #tab-kalkulation .kk-kunden-table thead,#tab-vertragsdok .vd-table thead{display:none}
  #tab-vorlagen .vlg-table tr,#tab-kalkulation .kk-table tr,
  #tab-kalkulation .kk-kunden-table tr,#tab-vertragsdok .vd-table tr{
    display:flex;flex-wrap:wrap;align-items:flex-start;gap:var(--sc-2) var(--sc-3);
    padding:var(--sc-3) 0;border-bottom:1px solid var(--sc-line)}
  #tab-vorlagen .vlg-table tr:last-child,#tab-kalkulation .kk-table tr:last-child,
  #tab-kalkulation .kk-kunden-table tr:last-child,
  #tab-vertragsdok .vd-table tr:last-child{border-bottom:0}
  /* display:flex schlaegt sonst das [hidden] des Browsers — zugeklappte Zeilen
     waeren auf dem Handy alle offen. */
  #tab-vorlagen .vlg-table tr[hidden],#tab-kalkulation .kk-table tr[hidden],
  #tab-kalkulation .kk-kunden-table tr[hidden],
  #tab-vertragsdok .vd-table tr[hidden]{display:none}
  #tab-vorlagen .vlg-table td,#tab-kalkulation .kk-table td,
  #tab-kalkulation .kk-kunden-table td,#tab-vertragsdok .vd-table td{
    border:0;padding:0;width:auto}
  #tab-vorlagen .vlg-table td[colspan],#tab-kalkulation .kk-table td[colspan],
  #tab-kalkulation .kk-kunden-table td[colspan],
  #tab-vertragsdok .vd-table td[colspan]{flex:1 1 100%}
  #tab-vorlagen .vlg-table td[data-lab]::before,#tab-kalkulation .kk-table td[data-lab]::before,
  #tab-kalkulation .kk-kunden-table td[data-lab]::before,
  #tab-vertragsdok .vd-table td[data-lab]::before{
    content:attr(data-lab);display:block;margin-bottom:3px;
    font-family:var(--sc-font-mono);font-size:var(--sc-t-xs);letter-spacing:.06em;
    text-transform:uppercase;color:var(--sc-faint)}

  #tab-vorlagen .vlg-c-name{flex:1 1 100%;order:1}
  #tab-vorlagen .vlg-c-txt{flex:1 1 100%;order:2}
  /* Die Zeile ist bei 390 px nur 281 px breit — mit 140-px-Grundbreite passt nur
     EINE Spalte je Zeile und „Kategorie" stand allein da. */
  #tab-vorlagen .vlg-c-kat{flex:1 1 118px;order:3;width:auto}
  #tab-vorlagen .vlg-c-geld{flex:1 1 82px;order:4;width:auto}
  #tab-vorlagen .vlg-c-proz{flex:1 1 74px;order:5;width:auto}
  #tab-vorlagen .vlg-c-akt{flex:1 1 100%;order:6;width:auto}

  #tab-kalkulation .kk-c-tarif{flex:1 1 100%;order:1}
  #tab-kalkulation .kk-c-num{flex:1 1 128px;width:auto;order:2}
  #tab-kalkulation .kk-c-deck{flex:1 1 100%;width:auto;order:3}
  /* Die senkrechten Trenner gehoeren zur Tabellenoptik — im Block stoeren sie.
     Alle drei Fassungen zuruecknehmen, sonst gewinnt die spezifischere von oben. */
  #tab-kalkulation .kk-c-erg,
  #tab-kalkulation .kk-c-num+.kk-c-erg,
  #tab-kalkulation th.kk-c-num+th.kk-c-erg,
  #tab-kalkulation .kk-c-erg~.kk-c-erg{border-left:0}
  #tab-kalkulation .kk-c-kunde{flex:1 1 100%;order:1}

  #tab-vertragsdok .vd-c-chev{display:none}
  #tab-vertragsdok .vd-c-titel{flex:1 1 100%;order:1}
  #tab-vertragsdok .vd-c-status{flex:1 1 100%;order:2;width:auto}
  #tab-vertragsdok .vd-c-kunde{flex:1 1 100%;order:3}
  #tab-vertragsdok .vd-c-typ{flex:1 1 130px;order:4;width:auto}
  #tab-vertragsdok .vd-c-jahr{flex:0 0 70px;order:5;width:auto}
  #tab-vertragsdok .vd-c-zeit{flex:1 1 100%;order:6}
  #tab-vertragsdok tr.vd-detailzeile{padding:0;border-bottom:0}
  #tab-vertragsdok tr.vd-detailzeile>td{flex:1 1 100%;padding:var(--sc-4);
    border-radius:var(--sc-r-sm);margin-bottom:var(--sc-3)}
}


/* ══════════════════════════════════════════════════════════════════════════
   RUECKBAU AUF TABELLEN (16.08.2026)
   Bereiche: Kunden · Angebote · Websites & Wartung · Druckkatalog

   Anlass: Die vier Listen waren Kachelraster. Dennis: „da man dann erst ein
   Ueberblick hat welche Sachen welchen aktuellen Stand haben" — der Zweck
   dieser Listen ist der ZEILENVERGLEICH. Untereinander lesen, welcher Eintrag
   welchen Stand hat, geht in einem Raster nicht.

   Vorbild ist #tab-vorlagen. Deshalb hier bewusst NICHT erneut definiert:
   .sc-table(*), .sc-tablewrap, .sc-scroll, .sc-card(*), .sc-toolbar(*),
   .sc-band, .sc-kpi(s), .sc-pill(*), .sc-chips, .sc-empty(*), .sc-note(*),
   .sc-hint, .sc-lead, .sc-lamp(*), .sc-legend, .sc-num, .action-row,
   .btn-icon(*), .kd-grid/.kd-c*, .kd-row__*.
   Kein einziger Hex-Wert; jede Regel haengt an ihrem #tab-…
   ══════════════════════════════════════════════════════════════════════════ */

/* ── Gemeinsames Verhalten der vier Tabellen ────────────────────────────────
   Sortierbare Koepfe duerfen nicht umbrechen (sonst steht das Sortierzeichen
   allein auf Zeile zwei), Leerzustaende brauchen weder Mindestbreite noch
   Spaltenkopf, und die Zeile mit offenem Detail hebt sich ab. */
#tab-kunden .sortable,#tab-angebote .sortable,
#tab-hosting .sortable,#tab-druckplanung .sortable,
#tab-kontakte .sortable{white-space:nowrap}
#tab-kunden .sc-table:has(> tbody > tr:only-child > td > .sc-empty),#tab-angebote .sc-table:has(> tbody > tr:only-child > td > .sc-empty),
#tab-hosting .sc-table:has(> tbody > tr:only-child > td > .sc-empty),#tab-druckplanung .sc-table:has(> tbody > tr:only-child > td > .sc-empty),
#tab-kontakte .sc-table:has(> tbody > tr:only-child > td > .sc-empty){min-width:0}
#tab-kunden .sc-table:has(> tbody > tr:only-child > td > .sc-empty) thead,#tab-angebote .sc-table:has(> tbody > tr:only-child > td > .sc-empty) thead,
#tab-hosting .sc-table:has(> tbody > tr:only-child > td > .sc-empty) thead,#tab-druckplanung .sc-table:has(> tbody > tr:only-child > td > .sc-empty) thead,
#tab-kontakte .sc-table:has(> tbody > tr:only-child > td > .sc-empty) thead{display:none}
#tab-kunden .sc-empty .btn,#tab-angebote .sc-empty .btn,
#tab-hosting .sc-empty .btn,#tab-druckplanung .sc-empty .btn,
#tab-kontakte .sc-empty .btn{margin:0}
/* Die vier Aktionsspalten stehen rechts und brechen nie um. */
#tab-kunden .ku-c-akt .action-row,#tab-angebote .ang-c-akt .action-row,
#tab-hosting .ho-c-akt .action-row,#tab-druckplanung .dr-c-akt .action-row,
#tab-kontakte .kt-c-akt .action-row{
  justify-content:flex-end;flex-wrap:nowrap;gap:var(--sc-1)}
/* Die Chevron-Spalte traegt nur den Aufklapp-Knopf. */
#tab-kunden .ku-c-chev,#tab-angebote .ang-c-chev,
#tab-hosting .ho-c-chev,#tab-druckplanung .dr-c-chev,
#tab-kontakte .kt-c-chev{width:34px;padding-right:0}
/* Detailzeilen liegen sichtbar unter ihrer Zeile — dieselbe Flaeche wie in den
   uebrigen Bereichen mit Aufklapp-Detail (#tab-vertragsdok, #tab-auftraege). */
#tab-kunden tr.ku-detailzeile>td,#tab-angebote tr.ang-detailzeile>td,
#tab-hosting tr.ho-detailzeile>td,#tab-druckplanung tr.dr-detailzeile>td,
#tab-kontakte tr.kt-detailzeile>td{
  background:var(--sc-sunk);padding:var(--sc-4) var(--sc-5)}
#tab-kunden tr.ku-zeile.is-open td,#tab-angebote tr.ang-zeile.is-open td,
#tab-hosting tr.ho-zeile.is-open td,#tab-druckplanung tr.dr-zeile.is-open td,
#tab-kontakte tr.kt-zeile.is-open td{
  background:var(--sc-primary-bg)}
/* Schluesselwerte je Zeile etwas kraeftiger als der Rest — beim Ueberfliegen
   von 271 Zeilen sucht das Auge zuerst danach. */
#tab-kunden .ku-name,#tab-angebote .ang-t,
#tab-hosting .ho-dom,#tab-druckplanung .dr-was,
#tab-kontakte .kt-name{font-weight:500}

/* ── Kunden ────────────────────────────────────────────────────────────── */
#tab-kunden .ku-table{min-width:920px}
#tab-kunden .ku-c-nr{width:104px;white-space:nowrap}
/* Ueberschuessige Breite verteilt sich auf die drei Textspalten. Mit festem
   width an Ort und Betreuer sog allein die Namensspalte den Rest auf — bei
   1500 px klaffte zwischen Name und Ort eine handbreite Luecke. */
#tab-kunden .ku-c-name{min-width:230px}
#tab-kunden .ku-c-ort{min-width:225px}
#tab-kunden .ku-c-portal{width:158px}
#tab-kunden .ku-c-betr{min-width:175px}
#tab-kunden .ku-c-akt{width:88px;white-space:nowrap}
/* Die ganze Zeile fuehrt zum Kunden — das war schon bei der Karte so. */
#tab-kunden tr.ku-zeile{cursor:pointer}
#tab-kunden tr.ku-zeile:hover td{background:var(--sc-sunk)}
#tab-kunden .ku-itdok{border-color:var(--sc-primary-line);background:var(--sc-primary-bg);
  color:var(--sc-primary)}
/* Kontaktwege in der Detailzeile: nebeneinander, solange Platz ist. */
#tab-kunden .ku-det{display:flex;flex-wrap:wrap;gap:var(--sc-2) var(--sc-6)}
#tab-kunden .ku-det__z{display:inline-flex;align-items:center;gap:7px;min-width:0;
  font-size:var(--sc-t-sm);color:var(--sc-muted)}
#tab-kunden .ku-det__z svg.lucide{flex:0 0 auto;width:13px;height:13px;color:var(--sc-faint)}
#tab-kunden .ku-det__z a{color:var(--sc-muted);text-decoration:none;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}
#tab-kunden .ku-det__z a:hover{color:var(--sc-lime-deep);text-decoration:underline}
#tab-kunden .ku-det__z--leer{color:var(--sc-faint);font-style:italic}

/* ── Angebote ──────────────────────────────────────────────────────────── */
#tab-angebote .ang-table{min-width:1020px}
/* Die Angebotsnummer ist eine Kennung und wird nie umbrochen — ohne nowrap
   stand „AN-2026-0015" bei 1500 px auf drei Zeilen und trieb die Zeile hoch. */
#tab-angebote .ang-c-nr{width:160px;white-space:nowrap}
#tab-angebote .ang-nr{font-family:var(--sc-font-mono);font-weight:600;white-space:nowrap}
#tab-angebote .ang-c-titel{min-width:240px}
/* Der Titel darf zwei Zeilen fuellen, aber die Zeile nicht in die Hoehe treiben. */
#tab-angebote .ang-t{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;
  overflow:hidden;line-height:1.35}
#tab-angebote .ang-c-kunde{min-width:175px}
/* Der monatliche Anteil darf unter den Einmalbetrag rutschen — mit nowrap
   verlangte die Spalte 202 px und die Tabelle passte nicht mehr in die Karte. */
#tab-angebote .ang-c-betrag{width:168px}
#tab-angebote .ang-c-betrag .ang-karte__mtl{white-space:nowrap}
#tab-angebote .ang-c-status{width:136px}
#tab-angebote .ang-c-gueltig{width:126px}
#tab-angebote .ang-datum{display:block;margin-top:3px;white-space:nowrap}
#tab-angebote .ang-c-akt{width:186px;white-space:nowrap}
#tab-angebote tr.ang-zeile:hover td{background:var(--sc-sunk)}
/* Detailzeile als Beschriftung/Wert-Paare — dasselbe Muster wie im Kunden-Detail. */
#tab-angebote .ang-det{display:flex;flex-wrap:wrap;gap:var(--sc-3) var(--sc-6)}
#tab-angebote .ang-det__z{display:flex;flex-direction:column;gap:3px;min-width:0;
  font-size:var(--sc-t-sm);color:var(--sc-text)}
#tab-angebote .ang-det__lab{font-family:var(--sc-font-mono);font-size:var(--sc-t-xs);
  letter-spacing:.06em;text-transform:uppercase;color:var(--sc-faint)}

/* ── Websites & Wartung ────────────────────────────────────────────────── */
#tab-hosting .ho-table{min-width:1140px}
#tab-hosting .ho-c-dom{min-width:215px}
#tab-hosting .ho-c-kunde{min-width:155px}
#tab-hosting .ho-c-cms{width:165px}
#tab-hosting .ho-c-paket{width:200px}
#tab-hosting .ho-c-status{width:104px}
#tab-hosting .ho-c-zustand{width:126px}
#tab-hosting .ho-c-akt{width:118px;white-space:nowrap}
#tab-hosting tr.ho-zeile:hover td{background:var(--sc-sunk)}
#tab-hosting .ho-dom a{color:var(--sc-text);text-decoration:none}
#tab-hosting .ho-dom a:hover{color:var(--sc-lime-deep);text-decoration:underline}
/* Sechs Zustaende in fester Reihenfolge. Gleiche Breite je Punkt, damit die
   Spalten beim Untereinanderlesen fluchten — sonst taugt der Vergleich nichts. */
#tab-hosting .ho-reihenfolge{margin-top:calc(-1 * var(--sc-2))}
#tab-hosting .ho-dots{display:inline-flex;gap:var(--sc-1)}
#tab-hosting .ho-dot{display:inline-flex;align-items:center;justify-content:center;
  width:16px;height:16px;border-radius:var(--sc-r-sm)}
#tab-hosting .ho-dot:hover{background:var(--sc-mist)}
/* Der Klartext in der Detailzeile: zwei Spalten, solange Platz ist. */
#tab-hosting tr.ho-detailzeile .sc-lamps{margin-top:var(--sc-3);
  columns:2;column-gap:var(--sc-8)}
#tab-hosting tr.ho-detailzeile .sc-lamp__row{break-inside:avoid}
#tab-hosting tr.ho-detailzeile .sc-note{margin-bottom:var(--sc-3)}

/* ── Druckkatalog ──────────────────────────────────────────────────────── */
#tab-druckplanung .dr-table{min-width:1180px}
#tab-druckplanung .dr-c-was{min-width:260px}
#tab-druckplanung .dr-c-kunde{min-width:155px}
#tab-druckplanung .dr-c-num{width:112px;white-space:nowrap}
#tab-druckplanung .dr-c-stand{width:176px}
#tab-druckplanung .dr-c-akt{width:168px;white-space:nowrap}
#tab-druckplanung tr.dr-zeile:hover td{background:var(--sc-sunk)}
/* Statuskante der Zeile: bei 271 Eintraegen muss der Zustand schon im Vorbei-
   scrollen auffallen, nicht erst beim Anhalten an der Statusmarke. */
#tab-druckplanung tr.dr-zeile>td:first-child{border-left:3px solid var(--sc-line-strong)}
#tab-druckplanung tr.dr-zeile[data-st="angeboten"]>td:first-child{border-left-color:var(--sc-info)}
#tab-druckplanung tr.dr-zeile[data-st="bestellt"]>td:first-child{border-left-color:var(--sc-ok)}
/* Produktname hoechstens zwei Zeilen; der volle Text steht in der Detailzeile. */
#tab-druckplanung .dr-was{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;
  overflow:hidden;line-height:1.35}
/* Sicherheitsnetz: auch die kurze Angabenzeile darf die Zeile nicht in die
   Hoehe treiben — bei 271 Eintraegen zaehlt jede Zeilenhoehe doppelt. */
#tab-druckplanung .dr-spec{display:-webkit-box;-webkit-line-clamp:2;
  -webkit-box-orient:vertical;overflow:hidden;margin-top:2px;
  font-size:var(--sc-t-sm);color:var(--sc-muted);line-height:1.4}
#tab-druckplanung .dr-spec:empty{display:none}
#tab-druckplanung .dr-spec a{color:var(--sc-muted)}
/* Kundennamen duerfen umbrechen. Mit nowrap verlangte allein diese Spalte
   270 px (laengster Name: „Räderlogistik.de Franchise GmbH") und schob die
   beiden letzten Aktionsknoepfe bei 1500 px aus der Karte heraus.
   Bewusst display:inline — als inline-block haette der Sprung-Knopf dahinter
   eine eigene dritte Zeile bekommen. */
#tab-druckplanung .dr-kunde{overflow-wrap:anywhere;line-height:1.5}
#tab-druckplanung .dr-c-kunde .btn-icon{vertical-align:middle}
#tab-druckplanung .dr-datum{display:block;margin-top:var(--sc-1);
  font-size:var(--sc-t-xs);color:var(--sc-faint);white-space:nowrap}
#tab-druckplanung .dr-c-stand .sc-pills{margin-top:0}
#tab-druckplanung .dr-bem{margin-bottom:var(--sc-3);font-size:var(--sc-t-sm);
  color:var(--sc-muted);white-space:pre-wrap}
/* Die beiden Tabellen IN der Detailzeile stehen auf eigener Flaeche und
   brauchen keine Mindestbreite — sie rollen im .sc-scroll. */
#tab-druckplanung tr.dr-detailzeile .sc-table{min-width:0;background:var(--sc-paper);
  border-radius:var(--sc-r-sm)}
#tab-druckplanung tr.dr-detailzeile .dr-werte td:first-child{color:var(--sc-muted)}
#tab-druckplanung tr.dr-detailzeile .sc-card__head--sep{margin:var(--sc-4) 0 var(--sc-2)}
#tab-druckplanung tr.dr-detailzeile .sc-card__head--sep:first-child{margin-top:0}

/* ── Handy (≤760 px): die vier Listen stapeln statt zu rollen ─────────────
   Gemessen bei 390 px: rollend sieht man vom Kunden nur die Nummer und vom
   Katalog nur den Pfeil. Deshalb wird die Zeile hier zu einem Block —
   Hauptangabe zuerst ueber die volle Breite, darunter die Felder mit ihrer
   Beschriftung aus data-lab (der Tabellenkopf fehlt dann ja). Gleiches Muster
   wie in #tab-vorlagen und #tab-todos.
   ACHTUNG: display:flex schlaegt das [hidden] des Browsers — ohne die
   tr[hidden]-Regel stuenden auf dem Handy ALLE Detailzeilen offen. */
@media (max-width:900px){
  #tab-kunden .ku-table,#tab-angebote .ang-table,
  #tab-hosting .ho-table,#tab-druckplanung .dr-table,
  #tab-kontakte .kt-table,#tab-kontakte .kt-audit{min-width:0}
  #tab-kunden .ku-table thead,#tab-angebote .ang-table thead,
  #tab-hosting .ho-table thead,#tab-druckplanung .dr-table thead,
  #tab-kontakte .kt-table thead,#tab-kontakte .kt-audit thead{display:none}
  #tab-kunden .ku-table tr,#tab-angebote .ang-table tr,
  #tab-hosting .ho-table tr,#tab-druckplanung .dr-table tr,
  #tab-kontakte .kt-table tr,#tab-kontakte .kt-audit tr{
    display:flex;flex-wrap:wrap;align-items:flex-start;gap:var(--sc-2) var(--sc-3);
    padding:var(--sc-3) 0;border-bottom:1px solid var(--sc-line)}
  #tab-kunden .ku-table tr[hidden],#tab-angebote .ang-table tr[hidden],
  #tab-hosting .ho-table tr[hidden],#tab-druckplanung .dr-table tr[hidden],
  #tab-kontakte .kt-table tr[hidden]{display:none}
  #tab-kunden .ku-table tr:last-child,#tab-angebote .ang-table tr:last-child,
  #tab-hosting .ho-table tr:last-child,#tab-druckplanung .dr-table tr:last-child,
  #tab-kontakte .kt-table tr:last-child,#tab-kontakte .kt-audit tr:last-child{border-bottom:0}
  #tab-kunden .ku-table>tbody>tr>td,#tab-angebote .ang-table>tbody>tr>td,
  #tab-hosting .ho-table>tbody>tr>td,#tab-druckplanung .dr-table>tbody>tr>td,
  #tab-kontakte .kt-table>tbody>tr>td,#tab-kontakte .kt-audit>tbody>tr>td{
    border:0;padding:0;width:auto}
  #tab-kunden .ku-table td[colspan],#tab-angebote .ang-table td[colspan],
  #tab-hosting .ho-table td[colspan],#tab-druckplanung .dr-table td[colspan],
  #tab-kontakte .kt-table td[colspan],#tab-kontakte .kt-audit td[colspan]{flex:1 1 100%}
  #tab-kunden .ku-table td[data-lab]::before,#tab-angebote .ang-table td[data-lab]::before,
  #tab-hosting .ho-table td[data-lab]::before,#tab-druckplanung .dr-table td[data-lab]::before,
  #tab-kontakte .kt-table td[data-lab]::before,#tab-kontakte .kt-audit td[data-lab]::before{
    content:attr(data-lab);display:block;margin-bottom:3px;
    font-family:var(--sc-font-mono);font-size:var(--sc-t-xs);letter-spacing:.06em;
    text-transform:uppercase;color:var(--sc-faint)}
  /* Zahlen behalten ihre rechte Kante nur in der Tabelle — im Block wirkt das
     wie ein Fehler, weil keine Spalte mehr darueber steht. */
  #tab-kunden .ku-table td.num,#tab-angebote .ang-table td.num,
  #tab-hosting .ho-table td.num,#tab-druckplanung .dr-table td.num{text-align:left}
  /* Der Aufklapp-Knopf steht neben der Hauptangabe, nicht in eigener Zeile.
     Dafuer braucht die Hauptangabe min-width:0 — sonst hielt ihre Min-Breite
     (langer Produktname + Auflagen-Marke) den Knopf im Katalog auf einer
     eigenen Zeile fest (gemessen bei 390 px). */
  #tab-kunden .ku-c-chev,#tab-angebote .ang-c-chev,
  #tab-hosting .ho-c-chev,#tab-druckplanung .dr-c-chev,
  #tab-kontakte .kt-c-chev{flex:0 0 auto;order:0;width:auto}
  #tab-kunden .ku-c-name,#tab-angebote .ang-c-titel,
  #tab-hosting .ho-c-dom,#tab-druckplanung .dr-c-was,
  #tab-kontakte .kt-c-name{min-width:0}

  #tab-kunden .ku-c-name{flex:1 1 200px;order:1}
  #tab-kunden .ku-c-portal{flex:1 1 100%;order:2;width:auto}
  #tab-kunden .ku-c-nr{flex:0 0 auto;order:3;width:auto}
  #tab-kunden .ku-c-ort{flex:1 1 130px;order:4;width:auto}
  #tab-kunden .ku-c-betr{flex:1 1 110px;order:5;width:auto}
  #tab-kunden .ku-c-akt{flex:1 1 100%;order:6;width:auto}
  #tab-kunden tr.ku-detailzeile{padding:0;border-bottom:0}
  #tab-kunden tr.ku-detailzeile>td{flex:1 1 100%;padding:var(--sc-4);
    border-radius:var(--sc-r-sm);margin-bottom:var(--sc-3)}

  #tab-angebote .ang-c-titel{flex:1 1 200px;order:1}
  #tab-angebote .ang-c-status{flex:1 1 100%;order:2;width:auto}
  #tab-angebote .ang-c-nr{flex:1 1 130px;order:3;width:auto}
  #tab-angebote .ang-c-betrag{flex:1 1 130px;order:4;width:auto}
  #tab-angebote .ang-c-kunde{flex:1 1 100%;order:5}
  #tab-angebote .ang-c-gueltig{flex:1 1 100%;order:6;width:auto}
  #tab-angebote .ang-c-akt{flex:1 1 100%;order:7;width:auto}
  #tab-angebote .ang-c-akt .action-row{justify-content:flex-start}
  #tab-angebote tr.ang-detailzeile{padding:0;border-bottom:0}
  #tab-angebote tr.ang-detailzeile>td{flex:1 1 100%;padding:var(--sc-4);
    border-radius:var(--sc-r-sm);margin-bottom:var(--sc-3)}

  #tab-hosting .ho-c-dom{flex:1 1 190px;order:1}
  #tab-hosting .ho-c-zustand{flex:1 1 100%;order:2;width:auto}
  #tab-hosting .ho-c-status{flex:1 1 96px;order:3;width:auto}
  #tab-hosting .ho-c-cms{flex:1 1 130px;order:4;width:auto}
  #tab-hosting .ho-c-kunde{flex:1 1 100%;order:5}
  #tab-hosting .ho-c-paket{flex:1 1 100%;order:6;width:auto}
  #tab-hosting .ho-c-akt{flex:1 1 100%;order:7;width:auto}
  #tab-hosting .ho-c-akt .action-row{justify-content:flex-start}
  #tab-hosting tr.ho-detailzeile{padding:0;border-bottom:0}
  #tab-hosting tr.ho-detailzeile>td{flex:1 1 100%;padding:var(--sc-4);
    border-radius:var(--sc-r-sm);margin-bottom:var(--sc-3)}
  #tab-hosting tr.ho-detailzeile .sc-lamps{columns:1}

  #tab-druckplanung .dr-c-was{flex:1 1 160px;order:1}
  #tab-druckplanung .dr-c-stand{flex:1 1 100%;order:2;width:auto}
  #tab-druckplanung .dr-c-kunde{flex:1 1 100%;order:3}
  /* Die vier Zahlen bleiben zu viert nebeneinander — sie gehoeren zusammen. */
  #tab-druckplanung .dr-c-num{flex:1 1 74px;order:4;width:auto}
  #tab-druckplanung .dr-c-akt{flex:1 1 100%;order:5;width:auto}
  #tab-druckplanung .dr-c-akt .action-row{justify-content:flex-start}
  #tab-druckplanung tr.dr-zeile>td:first-child{border-left:0}
  #tab-druckplanung tr.dr-detailzeile{padding:0;border-bottom:0}
  #tab-druckplanung tr.dr-detailzeile>td{flex:1 1 100%;padding:var(--sc-4);
    border-radius:var(--sc-r-sm);margin-bottom:var(--sc-3)}
  /* Die Detailtabellen bleiben echte Tabellen — nur die Hauptzeilen stapeln. */
  #tab-druckplanung tr.dr-detailzeile .sc-table tr{display:table-row;padding:0;
    border-bottom:0;gap:0}
  #tab-druckplanung tr.dr-detailzeile .sc-table td,
  #tab-druckplanung tr.dr-detailzeile .sc-table th{display:table-cell;
    padding:7px var(--sc-2);border-bottom:1px solid var(--sc-line);width:auto}
  #tab-druckplanung tr.dr-detailzeile .sc-table td.num{text-align:right}
}

/* ── Schmale Geraete: Werkzeugleisten der vier Bereiche ─────────────────── */
@media (max-width:900px){
  #tab-kunden .sc-toolbar__actions .btn,
  #tab-angebote .ang-head__act .btn,
  #tab-hosting .sc-toolbar__actions .btn{flex:1 1 auto;justify-content:center}
  #tab-hosting .sc-toolbar--filters .sc-inp{width:auto;flex:1 1 42%;min-width:0}
}


/* ══════════════════════════════════════════════════════════════════════════
   KUNDENSEITE (Detail eines Kunden)  ·  16.08.2026
   Zwölf Unterseiten hatten zwölf Bauweisen. Sie tragen jetzt alle denselben
   Aufbau: Kartenkopf mit Kicker + Aktion → Erklärsatz → Tabelle → Leerzustand.
   Bewusst NICHT erneut definiert, weil zentral vorhanden: .sc-card(*),
   .sc-kick, .sc-more, .sc-txt, .sc-hint, .sc-note(*), .sc-empty, .sc-pill(*),
   .sc-band, .sc-dark, .sc-kpi(s), .sc-tabs/.sc-tab(*), .sc-table(*),
   .sc-tablewrap, .sc-toolbar(*), .sc-stack, .sc-row, .sc-sec(*), .sc-kv(*),
   .sc-ev(*), .sc-lamp(*), .sc-drop, .sc-details, .sc-chev, .sc-form/.sc-field,
   .kd-grid/.kd-c*, .kd-row__*. Kein einziger Hex-Wert; jede Regel hängt an
   #kunden-page-view.
   ══════════════════════════════════════════════════════════════════════════ */

/* Zwölf Reiter müssen in EINE Zeile passen (gemessen: 1500 px → 1286 px
   Inhaltsbreite). Mit der zentralen Polsterung brauchten sie 1379 px und die
   Leiste brach um — genau der Eindruck „da ist etwas verrutscht". */
#kunden-page-view .sc-tabs .sc-tab{padding:10px 12px;font-size:var(--sc-t-sm)}

/* Karten einer Reihe sind gleich hoch. Ohne stretch endet jede Karte auf ihrer
   eigenen Höhe und die Übersicht wirkt zufällig zusammengewürfelt. */
#kunden-page-view .kd-grid{align-items:stretch}
#kunden-page-view .kd-grid > .sc-card{display:flex;flex-direction:column}
#kunden-page-view .kd-grid > .sc-card > .sc-tablewrap{flex:1}

/* Felder, die DIREKT in einer Tabellenzeile bearbeitet werden (Mitarbeiter).
   Bisher trugen sie einen Inline-Stil mit eigenem Grauton. */
#kunden-page-view .sc-table input,
#kunden-page-view .sc-table select{width:100%;box-sizing:border-box;padding:6px 9px;
  font-family:inherit;font-size:var(--sc-t-base);color:var(--sc-text);
  background:var(--sc-paper);border:1px solid var(--sc-line-strong);border-radius:var(--sc-r-sm)}
#kunden-page-view .sc-table input:focus,
#kunden-page-view .sc-table select:focus{outline:none;border-color:var(--sc-lime-deep)}
#kunden-page-view .sc-table input[type=checkbox]{width:17px;height:17px;padding:0;
  accent-color:var(--sc-lime-deep);cursor:pointer}

/* Leerzustand braucht weder Mindestbreite noch Spaltenköpfe (wie #tab-vorlagen). */
#kunden-page-view .sc-table:has(> tbody > tr:only-child > td > .sc-empty){min-width:0}
#kunden-page-view .sc-table:has(> tbody > tr:only-child > td > .sc-empty) thead{display:none}

/* Spaltenrollen — gleiche Bedeutung, gleiche Behandlung in allen Reitern. */
#kunden-page-view .kd-c-akt{width:1%;white-space:nowrap;text-align:right}
#kunden-page-view .kd-c-akt .action-row{justify-content:flex-end;flex-wrap:nowrap;gap:var(--sc-1)}
#kunden-page-view .kd-c-zeit{white-space:nowrap;color:var(--sc-muted);font-variant-numeric:tabular-nums}
#kunden-page-view .kd-c-notiz{max-width:220px;overflow-wrap:anywhere}
#kunden-page-view .kd-c-mitte{text-align:center}
#kunden-page-view .sc-table td.num{white-space:nowrap}
/* Symbol vor einem Schlüsselwert (Domain, Ereignis) */
#kunden-page-view .kd-dom{display:inline-flex;align-items:center;gap:7px}
#kunden-page-view .kd-dom svg.lucide{width:14px;height:14px;color:var(--sc-faint);flex:0 0 auto}
#kunden-page-view .kd-warnwert{color:var(--sc-bad);font-weight:600}

/* Die breiten Listen rollen in sich, nie die Seite. */
#kunden-page-view .kd-dom-table{min-width:940px}
#kunden-page-view .kd-ma-table{min-width:900px}
#kunden-page-view .kd-vd-table,#kunden-page-view .kd-ueb-table,
#kunden-page-view .kd-zv-table{min-width:820px}
#kunden-page-view .kd-rd-table{min-width:980px}
#kunden-page-view .kd-kdok-table{min-width:960px}
#kunden-page-view .kd-re-table{min-width:860px}
#kunden-page-view .kd-kbmv-table{min-width:780px}
/* Die Empfänger-Matrix hat je Mail-Art eine Spalte; ohne Mindestbreite quetscht
   sie sich in die Karte und die letzte Spalte lag halb außerhalb (gemessen bei
   1500 px, 7 Kategorien). */
#kunden-page-view .kd-empf-table{min-width:930px}
#kunden-page-view .kd-empf-table td:first-child,
#kunden-page-view .kd-empf-table th:first-child{min-width:190px}
/* Der Hub setzt global th{white-space:nowrap}. Mit sieben Kategorien wie
   „Auftragsverarbeitung (AVV)" nebeneinander passt die Matrix dann nicht mehr
   in die Karte — hier dürfen die Spaltenköpfe umbrechen. */
#kunden-page-view .kd-empf-table th{white-space:normal;vertical-align:bottom}

/* Aufklappbare Zusatzzeile (Verlauf, Zugangsdaten). Solange nichts aufgeklappt
   ist, darf die Zeile keine Höhe und keine Linie haben — sonst stünde unter
   jedem Eintrag eine leere Zeile. */
#kunden-page-view tr.kd-detailzeile>td{padding:0;border-bottom:0}
#kunden-page-view .kd-detail{padding:var(--sc-3) 0}
/* Zeile mit den Zusatzaktionen einer Gruppe (Rechtsdokumente) */
#kunden-page-view tr.kd-unterzeile>td{padding-top:0;border-bottom:0}
#kunden-page-view tr.kd-altrow>td{background:var(--sc-sunk)}

/* Abstand für einen Block, der einer Tabelle folgt (Scan-Liste, beendete Verträge) */
#kunden-page-view .kd-abstand{margin-top:var(--sc-4)}

/* Ablagefläche für PDFs: die ganze Karte nimmt Dateien an. */
#kunden-page-view .kd-drop.is-over{border-color:var(--sc-lime-deep);background:var(--sc-primary-bg)}
#kunden-page-view .kd-blinkt{box-shadow:0 0 0 3px var(--sc-primary-line)}
#kunden-page-view label.sc-drop{padding:var(--sc-4)}
#kunden-page-view label.sc-drop svg.lucide{width:20px;height:20px}

/* Handy: die Reiter rollen, die Listen stapeln — gleiches Muster wie in den
   Bereichslisten (#tab-kunden, #tab-vorlagen). Ohne das sieht man von einem
   Eintrag nur die erste Spalte. */
@media (max-width:900px){
  #kunden-page-view .sc-toolbar__actions .btn{flex:1 1 auto;justify-content:center}
  #kunden-page-view .sc-table[class*="kd-"]{min-width:0}
  #kunden-page-view .sc-table[class*="kd-"] thead{display:none}
  #kunden-page-view .sc-table[class*="kd-"] > tbody > tr{display:flex;flex-wrap:wrap;
    align-items:flex-start;gap:var(--sc-2) var(--sc-3);padding:var(--sc-3) 0;
    border-bottom:1px solid var(--sc-line)}
  /* display:flex schlägt sonst das [hidden] des Browsers — die zugeklappten
     alten Fassungen stünden auf dem Handy alle offen. */
  #kunden-page-view .sc-table[class*="kd-"] > tbody > tr[hidden]{display:none}
  #kunden-page-view .sc-table[class*="kd-"] > tbody > tr > td{border:0;padding:0;width:auto;
    max-width:none;text-align:left}
  #kunden-page-view .sc-table[class*="kd-"] > tbody > tr > td[colspan]{flex:1 1 100%}
  #kunden-page-view .sc-table[class*="kd-"] td[data-lab]::before{content:attr(data-lab);
    display:block;margin-bottom:3px;font-family:var(--sc-font-mono);font-size:var(--sc-t-xs);
    letter-spacing:.06em;text-transform:uppercase;color:var(--sc-faint)}
  #kunden-page-view .sc-table[class*="kd-"] td:first-child{flex:1 1 100%}
  #kunden-page-view .kd-c-akt{flex:1 1 100%;width:auto}
  /* Im gestapelten Zustand gibt es keine Spaltenbreite mehr, an der sich eine
     Terminkette festhalten könnte — sie darf hier umbrechen. */
  #kunden-page-view .kd-c-zeit{white-space:normal}
  #kunden-page-view .kd-c-akt .action-row{justify-content:flex-start;flex-wrap:wrap}
  #kunden-page-view tr.kd-detailzeile{flex:1 1 100%}
  #kunden-page-view .sc-form{grid-template-columns:1fr}
  /* Die fünf kleinen Übersichtstabellen bleiben Tabellen (drei Spalten passen),
     dürfen dafür aber lange Werte umbrechen — sonst rollt die Karte seitlich
     und von „kein Zugang" sieht man nur „KEI" (gemessen bei 390 px). */
  #kunden-page-view .kd-grid .sc-table td,
  #kunden-page-view .kd-grid .sc-table th{overflow-wrap:anywhere;padding-left:var(--sc-1);padding-right:var(--sc-1)}
  #kunden-page-view .kd-grid .sc-pill{white-space:normal}
}


/* ══════════════════════════════════════════════════════════════════════════
   ERGAENZUNGEN AUS DEM UMBAU DER LETZTEN SIEBEN BEREICHE (17.08.2026)
   Abos & Software · Investitionsplanung · Pakete & Preise · Domainverwaltung ·
   Plugins · Hinweise · Hilfe.

   Alle vier Listen sind wieder TABELLEN. Dennis: „das müssen alles wieder
   Tabellen werden, da man dann erst ein Überblick hat welche Sachen welchen
   aktuellen Stand haben" — Vorbild ist #tab-vorlagen.

   Bewusst NICHT erneut definiert, weil zentral vorhanden: .sc-toolbar(*),
   .sc-band, .sc-kpis/.sc-kpi*, .sc-card(*), .sc-table(*), .sc-tablewrap,
   .sc-tabs/.sc-tab*, .sc-chips/.sc-chip*, .sc-search, .sc-inp*, .sc-drop,
   .sc-empty(*), .sc-note(*), .sc-pill(*), .sc-pills, .sc-hint, .sc-lead,
   .sc-dl(*), .sc-chev, .sc-link, .sc-mono, .action-row, .btn-icon(*),
   .kd-grid/.kd-c*, .kd-row__s.
   Kein einziger Hex-Wert; jede Regel hängt an ihrem #tab-… bzw. #einstell-hilfe.
   ══════════════════════════════════════════════════════════════════════════ */

/* ── Gemeinsames Verhalten der fünf neuen Tabellen ───────────────────────────
   Leerzustände brauchen weder Mindestbreite noch Spaltenköpfe, die Zeile mit
   offenem Detail hebt sich ab, und Aktionsspalten stehen rechts. */
/* Bewusst `> tbody > tr:only-child`: ein schlichtes :has(> tbody > tr:only-child > td > .sc-empty) traf auch
   den Hinweis unter der Plugin-Liste und die „Wird geladen…"-Platzhalter in den
   Detailzeilen der Pakete — und blendete den Tabellenkopf einer VOLLEN Tabelle
   aus. Der echte Leerzustand ist immer die einzige Zeile im Rumpf. */
#tab-abos .sc-table:has(> tbody > tr:only-child > td > .sc-empty),
#tab-investitionen .sc-table:has(> tbody > tr:only-child > td > .sc-empty),
#tab-vertraege .vt-table:has(> tbody > tr:only-child > td > .sc-empty),
#tab-domainverwaltung .sc-table:has(> tbody > tr:only-child > td > .sc-empty),
#tab-plugins .sc-table:has(> tbody > tr:only-child > td > .sc-empty){min-width:0}
#tab-abos .sc-table:has(> tbody > tr:only-child > td > .sc-empty) thead,
#tab-investitionen .sc-table:has(> tbody > tr:only-child > td > .sc-empty) thead,
#tab-vertraege .vt-table:has(> tbody > tr:only-child > td > .sc-empty) thead,
#tab-domainverwaltung .sc-table:has(> tbody > tr:only-child > td > .sc-empty) thead,
#tab-plugins .sc-table:has(> tbody > tr:only-child > td > .sc-empty) thead{display:none}
/* Hinweiszeile am Fuß einer vollen Liste — kein Leerzustand. */
#tab-plugins .pl-hinweis{text-align:center;padding:var(--sc-4) var(--sc-3);
  font-size:var(--sc-t-sm);color:var(--sc-faint)}
#tab-abos .sc-empty .btn,#tab-investitionen .sc-empty .btn,#tab-vertraege .sc-empty .btn,
#tab-domainverwaltung .sc-empty .btn,#tab-plugins .sc-empty .btn,#tab-insights .sc-empty .btn{margin:0}

#tab-abos tr.abo-zeile:hover td,#tab-investitionen tr.inv-zeile:hover td,
#tab-vertraege tr.vt-zeile:hover td,#tab-domainverwaltung tr.dv-zeile:hover td,
#tab-plugins tr.pl-zeile:hover td{background:var(--sc-sunk)}
#tab-abos tr.abo-zeile.is-open td,#tab-investitionen tr.inv-zeile.is-open td,
#tab-domainverwaltung tr.dv-zeile.is-open td,#tab-plugins tr.pl-zeile.is-open td{background:var(--sc-primary-bg)}
#tab-abos tr.abo-detailzeile>td,#tab-investitionen tr.inv-detailzeile>td,
#tab-vertraege tr.vt-detailzeile>td,#tab-domainverwaltung tr.dv-detailzeile>td,
#tab-plugins tr.pl-detailzeile>td{background:var(--sc-sunk);padding:var(--sc-4) var(--sc-5)}

/* Die Ablagefläche trägt hier Symbol und Text nebeneinander — als Spalte
   (Grundfassung) wäre der Streifen über der Liste unnötig hoch. */
#tab-abos label.sc-drop,#tab-investitionen label.sc-drop{
  flex-direction:row;gap:var(--sc-3);text-align:left;margin-bottom:var(--sc-5)}
#tab-abos label.sc-drop svg.lucide,#tab-investitionen label.sc-drop svg.lucide{margin-bottom:0}
#tab-investitionen .inv-drop-fehler{color:var(--sc-bad)}

/* ── Abos & Software ────────────────────────────────────────────────────── */
#tab-abos .abo-table{min-width:1020px}
#tab-abos .abo-c-chev{width:34px;padding-right:0}
#tab-abos .abo-c-name{min-width:230px}
#tab-abos .abo-c-kat{width:180px}
#tab-abos .abo-c-geld{width:158px;white-space:nowrap}
#tab-abos .abo-c-zahlung{width:142px;white-space:nowrap}
#tab-abos .abo-c-status{width:200px}
#tab-abos .abo-c-akt{width:122px;white-space:nowrap}
#tab-abos .abo-c-akt .action-row{justify-content:flex-end;flex-wrap:nowrap;gap:var(--sc-1)}
#tab-abos .abo-t{font-weight:500}
/* Rhythmus und Monatswert gehören zum Betrag, dürfen die Zeile aber nicht
   in die Breite ziehen — deshalb unter den Betrag statt daneben. */
#tab-abos .abo-rhy{display:block;font-size:var(--sc-t-xs);color:var(--sc-faint);white-space:nowrap}
/* Die Kategoriefarbe kommt aus der Datenbank und steht inline am Element;
   die Schriftfarbe rechnet scLesbar() dazu. Hier nur die Form. */
#tab-abos .abo-kat{white-space:nowrap;max-width:100%;overflow:hidden;text-overflow:ellipsis}
#tab-abos .kred-table{min-width:820px}
#tab-abos .kred-c-name{min-width:210px}
#tab-abos .kred-c-nr{width:170px}
#tab-abos .kred-c-mail{min-width:220px;overflow-wrap:anywhere}
#tab-abos .kred-c-web{width:120px}
#tab-abos .kred-c-akt{width:96px;white-space:nowrap}
#tab-abos .kred-c-akt .action-row{justify-content:flex-end;flex-wrap:nowrap}
#tab-abos .srv-table{min-width:640px}
#tab-abos .srv-c-name{min-width:220px}
#tab-abos .srv-c-notiz{min-width:220px}
#tab-abos .srv-c-geld{width:170px;white-space:nowrap}
#tab-abos .sc-card__head{margin-bottom:var(--sc-4)}

/* ── Investitionsplanung ────────────────────────────────────────────────── */
#tab-investitionen .inv-table{min-width:1060px}
#tab-investitionen .inv-c-chev{width:34px;padding-right:0}
#tab-investitionen .inv-c-titel{min-width:260px}
#tab-investitionen .inv-c-horizont{width:158px}
#tab-investitionen .inv-c-status{width:152px}
#tab-investitionen .inv-c-num{width:134px;white-space:nowrap}
#tab-investitionen .inv-c-menge{width:86px}
#tab-investitionen .inv-c-akt{width:96px;white-space:nowrap}
#tab-investitionen .inv-c-akt .action-row{justify-content:flex-end;flex-wrap:nowrap;gap:var(--sc-1)}
#tab-investitionen .inv-t{font-weight:500}
/* Die Beschreibung erklärt das Vorhaben, darf die Zeile aber nicht hochtreiben. */
#tab-investitionen .inv-s{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;
  overflow:hidden;font-size:var(--sc-t-sm);color:var(--sc-muted);line-height:1.4;margin-top:2px}
#tab-investitionen .inv-sub{display:block;font-size:var(--sc-t-xs);color:var(--sc-faint)}
#tab-investitionen .sc-table tfoot td{white-space:nowrap}

/* ── Pakete & Preise ────────────────────────────────────────────────────── */
/* Server-Basis ist jetzt eine helle Karte: das dunkle Band des Bereichs steht
   schon darüber, zwei dunkle Flächen übereinander erschlagen die Seite. */
#tab-vertraege .vt-serverkarte{margin-bottom:var(--sc-6)}
#tab-vertraege .vt-serverkarte .sc-kpis{margin-bottom:0}
#tab-vertraege .vt-table{min-width:1180px}
#tab-vertraege .vt-c-chev{width:34px;padding-right:0}
#tab-vertraege .vt-c-name{min-width:220px}
#tab-vertraege .vt-c-geld{width:140px;white-space:nowrap}
#tab-vertraege .vt-c-marge{width:96px;white-space:nowrap}
#tab-vertraege .vt-c-stand{width:200px}
#tab-vertraege .vt-c-akt{width:248px;white-space:nowrap}
#tab-vertraege .vt-c-akt .action-row{justify-content:flex-end;flex-wrap:nowrap;gap:var(--sc-1)}
#tab-vertraege .vt-name{font-weight:500}
/* Brutto und Herkunft des EK gehören zum Betrag darüber. */
#tab-vertraege .vt-brutto{display:block;font-size:var(--sc-t-xs);color:var(--sc-faint);
  font-weight:400;white-space:nowrap}
#tab-vertraege .vt-c-stand .sc-pills{margin-top:0}
#tab-vertraege tr.vt-detailzeile .sc-card__head{margin-bottom:var(--sc-3)}
#tab-vertraege tr.vt-detailzeile .sc-card__head:not(:first-child){margin-top:var(--sc-4)}

/* ── Domainverwaltung ───────────────────────────────────────────────────── */
#tab-domainverwaltung .dv-table{min-width:1120px}
#tab-domainverwaltung .dv-c-chev{width:34px;padding-right:0}
#tab-domainverwaltung .dv-c-dom{min-width:210px}
#tab-domainverwaltung .dv-c-kunde{min-width:230px}
#tab-domainverwaltung .dv-c-kunde .sc-inp{width:100%;box-sizing:border-box}
#tab-domainverwaltung .dv-c-zu{width:158px}
#tab-domainverwaltung .dv-c-stand{width:158px}
#tab-domainverwaltung .dv-c-ablauf{width:132px;white-space:nowrap}
#tab-domainverwaltung .dv-c-akt{width:104px;white-space:nowrap}
#tab-domainverwaltung .dv-c-akt .action-row{justify-content:flex-end;flex-wrap:nowrap;gap:var(--sc-1)}
#tab-domainverwaltung .dv-dom{font-weight:500;overflow-wrap:anywhere}

/* ── Plugins ────────────────────────────────────────────────────────────── */
#tab-plugins .pl-table{min-width:1100px}
#tab-plugins .pl-c-chev{width:34px;padding-right:0}
#tab-plugins .pl-c-name{min-width:230px}
#tab-plugins .pl-c-anbieter{min-width:150px}
#tab-plugins .pl-c-lizenz{width:124px}
#tab-plugins .pl-c-geld{width:158px;white-space:nowrap}
#tab-plugins .pl-c-traeger{width:142px}
#tab-plugins .pl-c-seiten{width:92px}
#tab-plugins .pl-c-akt{width:100px;white-space:nowrap}
#tab-plugins .pl-c-akt .action-row{justify-content:flex-end;flex-wrap:nowrap;gap:var(--sc-1)}
#tab-plugins .pl-t{font-weight:500}
#tab-plugins .pl-rhy{display:block;font-size:var(--sc-t-xs);color:var(--sc-faint);white-space:nowrap}

/* ── Hinweise ───────────────────────────────────────────────────────────── */
/* Die Filterreiter sind das linke Element der Leiste, die Trefferzahl das rechte. */
#tab-insights #insights-chips{flex:1;min-width:0}
#tab-insights .sc-card__head--sep{margin-bottom:var(--sc-4)}

/* ── Hilfe ──────────────────────────────────────────────────────────────── */
/* Die Abschnittsmarke ist klein gesetzt; ein Symbol in 1em wäre darin kaum
   erkennbar. Nur hier, damit die globale Symbolgröße unberührt bleibt. */
#einstell-hilfe .hilfe-section h2 svg.lucide{width:14px;height:14px}
#einstell-hilfe .hilfe-block{margin-top:var(--sc-4)}
#einstell-hilfe .hilfe-block h3{margin-top:var(--sc-3)}
#einstell-hilfe .hilfe-block h3:first-child{margin-top:0}
#einstell-hilfe .hilfe-warn--zeile{display:flex;align-items:center;
  justify-content:space-between;gap:var(--sc-3);flex-wrap:wrap}
#einstell-hilfe .hilfe-warn--zeile .btn{white-space:nowrap}
/* Lange Doku-Zeilen bleiben lesbar; .set-doc begrenzt die Spalte bereits auf
   900 px, hier nur der Fließtext innerhalb breiter Abschnitte. */
#einstell-hilfe .hilfe-section p{max-width:74ch}

/* ── Handy (≤760 px): die fünf Listen stapeln statt zu rollen ─────────────
   Gleiches Muster wie in #tab-vorlagen und #tab-kunden: Hauptangabe zuerst
   über die volle Breite, darunter die Felder mit ihrer Beschriftung aus
   data-lab (der Tabellenkopf fehlt dann ja).
   ACHTUNG: display:flex schlägt das [hidden] des Browsers — ohne die
   tr[hidden]-Regel stünden auf dem Handy ALLE Detailzeilen offen. */
@media (max-width:900px){
  #tab-abos .abo-table,#tab-abos .kred-table,#tab-abos .srv-table,
  #tab-investitionen .inv-table,#tab-vertraege .vt-table,
  #tab-domainverwaltung .dv-table,#tab-plugins .pl-table{min-width:0}
  #tab-abos .abo-table thead,#tab-abos .kred-table thead,#tab-abos .srv-table thead,
  #tab-investitionen .inv-table thead,#tab-vertraege .vt-table thead,
  #tab-domainverwaltung .dv-table thead,#tab-plugins .pl-table thead{display:none}
  #tab-abos .abo-table tr,#tab-abos .kred-table tr,#tab-abos .srv-table tr,
  #tab-investitionen .inv-table tr,#tab-vertraege .vt-table tr,
  #tab-domainverwaltung .dv-table tr,#tab-plugins .pl-table tr{
    display:flex;flex-wrap:wrap;align-items:flex-start;gap:var(--sc-2) var(--sc-3);
    padding:var(--sc-3) 0;border-bottom:1px solid var(--sc-line)}
  #tab-abos .abo-table tr[hidden],#tab-abos .kred-table tr[hidden],
  #tab-investitionen .inv-table tr[hidden],#tab-vertraege .vt-table tr[hidden],
  #tab-domainverwaltung .dv-table tr[hidden],#tab-plugins .pl-table tr[hidden]{display:none}
  #tab-abos .abo-table tr:last-child,#tab-abos .kred-table tr:last-child,
  #tab-abos .srv-table tr:last-child,#tab-investitionen .inv-table tr:last-child,
  #tab-vertraege .vt-table tr:last-child,#tab-domainverwaltung .dv-table tr:last-child,
  #tab-plugins .pl-table tr:last-child{border-bottom:0}
  #tab-abos .abo-table>tbody>tr>td,#tab-abos .kred-table>tbody>tr>td,
  #tab-abos .srv-table>tbody>tr>td,#tab-investitionen .inv-table>tbody>tr>td,
  #tab-vertraege .vt-table>tbody>tr>td,#tab-domainverwaltung .dv-table>tbody>tr>td,
  #tab-plugins .pl-table>tbody>tr>td{border:0;padding:0;width:auto}
  #tab-abos .abo-table td[colspan],#tab-abos .kred-table td[colspan],
  #tab-abos .srv-table td[colspan],#tab-investitionen .inv-table td[colspan],
  #tab-vertraege .vt-table td[colspan],#tab-domainverwaltung .dv-table td[colspan],
  #tab-plugins .pl-table td[colspan]{flex:1 1 100%}
  #tab-abos .abo-table td[data-lab]::before,#tab-abos .kred-table td[data-lab]::before,
  #tab-abos .srv-table td[data-lab]::before,#tab-investitionen .inv-table td[data-lab]::before,
  #tab-vertraege .vt-table td[data-lab]::before,#tab-domainverwaltung .dv-table td[data-lab]::before,
  #tab-plugins .pl-table td[data-lab]::before{
    content:attr(data-lab);display:block;margin-bottom:3px;
    font-family:var(--sc-font-mono);font-size:var(--sc-t-xs);letter-spacing:.06em;
    text-transform:uppercase;color:var(--sc-faint)}
  /* Zahlen behalten ihre rechte Kante nur in der Tabelle — im Block wirkt das
     wie ein Fehler, weil keine Spalte mehr darübersteht. */
  #tab-abos .abo-table td.num,#tab-investitionen .inv-table td.num,
  #tab-vertraege .vt-table td.num,#tab-domainverwaltung .dv-table td.num,
  #tab-plugins .pl-table td.num{text-align:left}
  /* Der Aufklapp-Knopf steht neben der Hauptangabe, nicht in eigener Zeile. */
  #tab-abos .abo-c-chev,#tab-investitionen .inv-c-chev,#tab-vertraege .vt-c-chev,
  #tab-domainverwaltung .dv-c-chev,#tab-plugins .pl-c-chev{flex:0 0 auto;order:0;width:auto}
  #tab-abos .abo-c-name,#tab-investitionen .inv-c-titel,#tab-vertraege .vt-c-name,
  #tab-domainverwaltung .dv-c-dom,#tab-plugins .pl-c-name{min-width:0}

  #tab-abos .abo-c-name{flex:1 1 190px;order:1}
  #tab-abos .abo-c-kat{flex:1 1 100%;order:2;width:auto}
  #tab-abos .abo-c-geld{flex:1 1 124px;order:3;width:auto}
  #tab-abos .abo-c-zahlung{flex:1 1 118px;order:4;width:auto}
  #tab-abos .abo-c-status{flex:1 1 100%;order:5;width:auto}
  #tab-abos .abo-c-akt{flex:1 1 100%;order:6;width:auto}
  #tab-abos .abo-c-akt .action-row{width:100%;justify-content:flex-start}
  #tab-abos tr.abo-detailzeile{padding:0;border-bottom:0}
  #tab-abos tr.abo-detailzeile>td{flex:1 1 100%;padding:var(--sc-4);
    border-radius:var(--sc-r-sm);margin-bottom:var(--sc-3)}
  #tab-abos .abo-table tfoot tr{gap:var(--sc-2);justify-content:space-between}
  #tab-abos .abo-table tfoot td{flex:0 1 auto}
  #tab-abos .kred-c-name{flex:1 1 100%}
  #tab-abos .kred-c-nr,#tab-abos .kred-c-web{flex:1 1 120px;width:auto}
  #tab-abos .kred-c-mail{flex:1 1 100%}
  #tab-abos .kred-c-akt{flex:1 1 100%;width:auto}
  #tab-abos .kred-c-akt .action-row{justify-content:flex-start}
  #tab-abos .srv-c-name{flex:1 1 100%}
  #tab-abos .srv-c-notiz{flex:1 1 100%}
  #tab-abos .srv-c-geld{flex:1 1 100%;width:auto}
  #tab-abos .srv-table tfoot tr{gap:var(--sc-2);justify-content:space-between}
  #tab-abos .srv-table tfoot td{flex:0 1 auto}

  #tab-investitionen .inv-c-titel{flex:1 1 190px;order:1}
  #tab-investitionen .inv-c-status{flex:1 1 100%;order:2;width:auto}
  #tab-investitionen .inv-c-horizont{flex:1 1 120px;order:3;width:auto}
  #tab-investitionen .inv-c-menge{flex:0 0 80px;order:4;width:auto}
  #tab-investitionen .inv-c-num{flex:1 1 116px;order:5;width:auto}
  #tab-investitionen .inv-c-akt{flex:1 1 100%;order:6;width:auto}
  #tab-investitionen .inv-c-akt .action-row{width:100%;justify-content:flex-start}
  #tab-investitionen tr.inv-detailzeile{padding:0;border-bottom:0}
  #tab-investitionen tr.inv-detailzeile>td{flex:1 1 100%;padding:var(--sc-4);
    border-radius:var(--sc-r-sm);margin-bottom:var(--sc-3)}
  #tab-investitionen .inv-table tfoot tr{gap:var(--sc-2);justify-content:space-between}
  #tab-investitionen .inv-table tfoot td{flex:0 1 auto}

  #tab-vertraege .vt-c-name{flex:1 1 190px;order:1}
  #tab-vertraege .vt-c-stand{flex:1 1 100%;order:2;width:auto}
  #tab-vertraege .vt-c-geld{flex:1 1 118px;order:3;width:auto}
  #tab-vertraege .vt-c-marge{flex:1 1 84px;order:4;width:auto}
  #tab-vertraege .vt-c-akt{flex:1 1 100%;order:5;width:auto}
  #tab-vertraege .vt-c-akt .action-row{width:100%;justify-content:flex-start;flex-wrap:wrap}
  #tab-vertraege tr.vt-detailzeile{padding:0;border-bottom:0}
  #tab-vertraege tr.vt-detailzeile>td{flex:1 1 100%;padding:var(--sc-4);
    border-radius:var(--sc-r-sm);margin-bottom:var(--sc-3)}

  #tab-domainverwaltung .dv-c-dom{flex:1 1 190px;order:1}
  #tab-domainverwaltung .dv-c-kunde{flex:1 1 100%;order:2}
  #tab-domainverwaltung .dv-c-zu{flex:1 1 120px;order:3;width:auto}
  #tab-domainverwaltung .dv-c-stand{flex:1 1 120px;order:4;width:auto}
  #tab-domainverwaltung .dv-c-ablauf{flex:1 1 118px;order:5;width:auto}
  #tab-domainverwaltung .dv-c-akt{flex:1 1 100%;order:6;width:auto}
  #tab-domainverwaltung .dv-c-akt .action-row{width:100%;justify-content:flex-start}
  #tab-domainverwaltung tr.dv-detailzeile{padding:0;border-bottom:0}
  #tab-domainverwaltung tr.dv-detailzeile>td{flex:1 1 100%;padding:var(--sc-4);
    border-radius:var(--sc-r-sm);margin-bottom:var(--sc-3)}

  #tab-plugins .pl-c-name{flex:1 1 190px;order:1}
  #tab-plugins .pl-c-lizenz{flex:1 1 120px;order:2;width:auto}
  #tab-plugins .pl-c-traeger{flex:1 1 130px;order:3;width:auto}
  #tab-plugins .pl-c-geld{flex:1 1 140px;order:4;width:auto}
  #tab-plugins .pl-c-seiten{flex:1 1 90px;order:5;width:auto}
  #tab-plugins .pl-c-anbieter{flex:1 1 100%;order:6}
  #tab-plugins .pl-c-akt{flex:1 1 100%;order:7;width:auto}
  #tab-plugins .pl-c-akt .action-row{width:100%;justify-content:flex-start}
  #tab-plugins tr.pl-detailzeile{padding:0;border-bottom:0}
  #tab-plugins tr.pl-detailzeile>td{flex:1 1 100%;padding:var(--sc-4);
    border-radius:var(--sc-r-sm);margin-bottom:var(--sc-3)}
}

/* ── Schmale Geräte: Werkzeugleisten der sieben Bereiche ─────────────────── */
@media (max-width:900px){
  #tab-abos .sc-toolbar__actions .btn,#tab-investitionen .sc-toolbar__actions .btn,
  #tab-vertraege .sc-toolbar__actions .btn,#tab-domainverwaltung .sc-toolbar__actions .btn,
  #tab-plugins .sc-toolbar__actions .btn,#tab-insights .sc-toolbar__actions .btn{
    flex:1 1 auto;justify-content:center}
  #tab-abos .sc-toolbar--filters .sc-search,#tab-investitionen .sc-toolbar--filters .sc-search,
  #tab-vertraege .sc-toolbar--filters .sc-search,#tab-domainverwaltung .sc-toolbar--filters .sc-search,
  #tab-plugins .sc-toolbar--filters .sc-search{flex:1 1 100%}
  #tab-abos .sc-toolbar--filters .sc-toolbar__filters,
  #tab-investitionen .sc-toolbar--filters .sc-toolbar__filters,
  #tab-vertraege .sc-toolbar--filters .sc-toolbar__filters,
  #tab-domainverwaltung .sc-toolbar--filters .sc-toolbar__filters,
  #tab-plugins .sc-toolbar--filters .sc-toolbar__filters{flex:1 1 100%}
  #tab-abos .sc-toolbar--filters .sc-inp,#tab-investitionen .sc-toolbar--filters .sc-inp,
  #tab-plugins .sc-toolbar--filters .sc-inp{width:auto;flex:1 1 42%;min-width:0}
}

/* ══════════════════════════════════════════════════════════════════════════
   Vollbildmodus (vom Startbildschirm gestartet) — Notch und Home-Balken
   ══════════════════════════════════════════════════════════════════════════
   Im Browser rechnet dessen eigene Leiste die unbenutzbaren Raender weg.
   Startet der Hub dagegen als App, gibt es diese Leiste nicht: die Kopfleiste
   liegt dann unter Uhr/Notch, die unterste Zeile unter dem Home-Balken und der
   Inhalt laeuft in die abgerundeten Ecken. Deshalb hier — und AUSSCHLIESSLICH
   hier — die Raender wieder auffuellen.

   Drei Dinge, die man wissen muss:

   1. Alles steht in @media (display-mode: standalone). Am Rechner und im
      normalen Browser trifft das nie zu, dort aendert sich nichts.
   2. env(safe-area-inset-*) ist auf Geraeten ohne Notch 0px — es entsteht
      also kein Leerraum, wo keiner noetig ist.
   3. !important ist hier noetig, nicht bequem: die Grundwerte stehen im
      <style>-Block von index.html, der NACH dieser Datei geladen wird, und
      .filter-bar traegt dort mobil selbst ein !important.
   ══════════════════════════════════════════════════════════════════════════ */
@media (display-mode: standalone) {

  /* Kopfleiste (sticky, top:0) laeuft farbig bis unter die Statusleiste durch —
     deshalb Innenabstand statt Aussenabstand, sonst blitzt oben der Seiten-
     hintergrund durch. Grundwert 12px 24px (index.html). */
  header {
    padding-top: calc(12px + env(safe-area-inset-top)) !important;
    padding-left: calc(24px + env(safe-area-inset-left)) !important;
    padding-right: calc(24px + env(safe-area-inset-right)) !important;
  }

  /* Reiterleiste klebt unter der Kopfleiste. Waechst diese um die Statusleiste,
     muss ihr Haltepunkt mitwachsen — sonst schiebt sie sich beim Scrollen
     darunter. Grundwert top:57px, padding 0 32px. */
  nav {
    top: calc(57px + env(safe-area-inset-top)) !important;
    padding-left: calc(32px + env(safe-area-inset-left)) !important;
    padding-right: calc(32px + env(safe-area-inset-right)) !important;
  }

  /* Dritte Ebene derselben Kette (Jahresfilter), Grundwert top:102px. */
  .filter-bar {
    top: calc(102px + env(safe-area-inset-top)) !important;
    padding-left: calc(32px + env(safe-area-inset-left)) !important;
    padding-right: calc(32px + env(safe-area-inset-right)) !important;
  }

  /* Inhalt: seitlich frei von der abgerundeten Ecke, unten frei vom
     Home-Balken. Grundwert padding 24px 32px. */
  main {
    padding-left: calc(32px + env(safe-area-inset-left)) !important;
    padding-right: calc(32px + env(safe-area-inset-right)) !important;
    padding-bottom: calc(24px + env(safe-area-inset-bottom)) !important;
  }

  /* Hier stand die Aussparung fuer den schwebenden Aufgaben-Knopf (er lag
     sonst auf dem Home-Balken). Seit 19.08.2026 sitzt „Neue Aufgabe" in der
     Kopfleiste (.hdr-plus) — die bekommt ihre Aussparung oben bereits ueber
     die header-Regel dieses Blocks. Am unteren Rand schwebt nichts mehr. */

  /* Schmale Geraete: dort gelten kleinere Grundwerte (index.html,
     @media max-width:768px) — die Randzugabe bleibt, nur die Basis wechselt.
     Die Reiterleiste ist mobil ausgeblendet, der Drawer tritt an ihre Stelle. */
  @media (max-width: 768px) {
    header {
      padding-top: calc(14px + env(safe-area-inset-top)) !important;
      padding-left: calc(16px + env(safe-area-inset-left)) !important;
      padding-right: calc(16px + env(safe-area-inset-right)) !important;
    }
    .filter-bar {
      top: calc(57px + env(safe-area-inset-top)) !important;
      padding-left: calc(16px + env(safe-area-inset-left)) !important;
      padding-right: calc(16px + env(safe-area-inset-right)) !important;
    }
    main {
      padding-left: calc(14px + env(safe-area-inset-left)) !important;
      padding-right: calc(14px + env(safe-area-inset-right)) !important;
      padding-bottom: calc(14px + env(safe-area-inset-bottom)) !important;
    }
  }
}


/* ══════════════════════════════════════════════════════════════════════════
   HANDY-VERDICHTUNG (17.08.2026)
   ══════════════════════════════════════════════════════════════════════════
   Anlass: Dennis benutzt den Hub seit dem 17.08. als installierte App auf dem
   iPhone. Vier woertliche Befunde:

     1. „bei diversen Menuepunkten (zb Kunden) zu viel im ersten oberen
        Bereich, bevor man erst den ersten Kunden sieht"
     2. „zu grosse Kacheln und zu viel Informationen pro Kachel"
     3. „die schwarzen Infofelder … zu gross zu wuchtig"  (dazu: Band und
        Kennzahl sind weiter oben zentral verschlankt — auch am Rechner)
     4. „wenn ich den erweitern Button anklicke, sehe ich nicht wo die aktuelle
        Zeile aufhoert, die geht sumpfig in die naechste Zeile ueber"

   Messlatte: auf einem iPhone (390 x 844) muss der ERSTE Eintrag ohne Scrollen
   sichtbar sein.

   Bewusst NICHT gemacht: keine Struktur-Umbauten. Die Listen bleiben Tabellen
   („das muessen alles wieder Tabellen werden, da man dann erst ein Ueberblick
   hat welche Sachen welchen aktuellen Stand haben"). Es geht ausschliesslich um
   Dichte und Lesbarkeit. Kein Hex-Wert, alles ueber Token. Die Trefferflaechen
   bleiben unangetastet (@media hover:none/pointer:coarse in index.html), die
   Aussparungen fuer die Kamera-Pille ebenfalls.
   ══════════════════════════════════════════════════════════════════════════ */

/* ── (4) Aufgeklappte Zeile: Zeile + Detail sind EIN Block ──────────────────
   Vorher trug die Zeile --sc-primary-bg und ihr Detail --sc-sunk: zwei
   verschiedene Toene, dazwischen eine 1-px-Linie wie zwischen zwei fremden
   Zeilen — genau das „sumpfige" Ineinanderlaufen. Jetzt: EIN Ton fuer beide,
   eine durchgehende Akzentkante links (inset-Schatten, damit die vorhandenen
   Rand-Regeln wie die Statuskante im Druckkatalog unberuehrt bleiben) und eine
   kraeftige Abschlusslinie unter dem Detail.
   #kunden-page-view ist bewusst NICHT dabei — dort ist die „Detailzeile" ein
   randloses Akkordeon innerhalb einer Karte. */
:is(#tab-kunden,#tab-angebote,#tab-hosting,#tab-druckplanung,#tab-abos,
    #tab-investitionen,#tab-vertraege,#tab-domainverwaltung,#tab-plugins,
    #tab-vertragsdok,#tab-todos,#tab-auftraege,#tab-kontakte) :is(tr.is-open>td,
    tr[class*="detailzeile"]>td,tr.td-detail>td,tr.au-detail>td){
  background:var(--sc-primary-bg)}
:is(#tab-kunden,#tab-angebote,#tab-hosting,#tab-druckplanung,#tab-abos,
    #tab-investitionen,#tab-vertraege,#tab-domainverwaltung,#tab-plugins,
    #tab-vertragsdok,#tab-todos,#tab-auftraege,#tab-kontakte) :is(tr.is-open>td:first-child,
    tr[class*="detailzeile"]>td,tr.td-detail>td,tr.au-detail>td){
  box-shadow:inset 3px 0 0 var(--sc-primary)}
/* Der untere Abschluss des Blocks. 2 px gegen 1 px der normalen Zeilentrenner —
   damit sieht man auf einen Blick, wo das Detail endet. */
:is(#tab-kunden,#tab-angebote,#tab-hosting,#tab-druckplanung,#tab-abos,
    #tab-investitionen,#tab-vertraege,#tab-domainverwaltung,#tab-plugins,
    #tab-vertragsdok,#tab-todos,#tab-auftraege,#tab-kontakte) :is(tr[class*="detailzeile"]>td,
    tr.td-detail>td,tr.au-detail>td){
  border-bottom:2px solid var(--sc-primary);padding-bottom:var(--sc-5)}
/* Die Zeile darueber darf keine eigene Trennlinie mehr tragen, sonst steht
   mitten im Block ein Strich. */
:is(#tab-kunden,#tab-angebote,#tab-hosting,#tab-druckplanung,#tab-abos,
    #tab-investitionen,#tab-vertraege,#tab-domainverwaltung,#tab-plugins,
    #tab-vertragsdok,#tab-todos,#tab-auftraege,#tab-kontakte) tr.is-open>td{border-bottom-color:transparent}

/* ── Handy: derselbe Block, nur ohne Tabellenzellen ─────────────────────────
   Unter 760 px stapeln die Listen (siehe die Bereichsabschnitte oben): die
   Zeile ist ein Flex-Block, das Detail ein Kasten darunter. Also traegt hier
   die ZEILE die Kante, nicht ihre erste Zelle. */
@media (max-width:900px){
  :is(#tab-kunden,#tab-angebote,#tab-hosting,#tab-druckplanung,#tab-abos,
      #tab-investitionen,#tab-vertraege,#tab-domainverwaltung,#tab-plugins,
      #tab-vertragsdok,#tab-todos,#tab-auftraege,#tab-kontakte) tr.is-open{
    background:var(--sc-primary-bg);box-shadow:inset 3px 0 0 var(--sc-primary);
    border-bottom:0;border-radius:var(--sc-r-sm) var(--sc-r-sm) 0 0;
    padding-left:var(--sc-3);padding-right:var(--sc-2)}
  :is(#tab-kunden,#tab-angebote,#tab-hosting,#tab-druckplanung,#tab-abos,
      #tab-investitionen,#tab-vertraege,#tab-domainverwaltung,#tab-plugins,
      #tab-vertragsdok,#tab-todos,#tab-auftraege,#tab-kontakte) :is(tr[class*="detailzeile"]>td,
      tr.td-detail>td,tr.au-detail>td){
    border-radius:0 0 var(--sc-r-sm) var(--sc-r-sm);
    margin-bottom:var(--sc-5);padding:var(--sc-3) var(--sc-4) var(--sc-4)}
}

/* ── Zurücknahme für das Kundendetail ───────────────────────────────────────
   Der Block oben nimmt #kunden-page-view ausdrücklich aus („dort ist die
   Detailzeile ein randloses Akkordeon"). Nur: #kunden-page-view LIEGT IN
   #tab-kunden — die Regel greift dort trotzdem. Folge (Dennis 02.09.2026,
   Rechtsdokumente): unter JEDER Zeile stand ein leerer, hellgrüner Balken mit
   3-px-Kante und 2-px-Abschlusslinie, auch wenn gar nichts aufgeklappt war
   („diese grünen dicken Leisten, wofür sind die? Sieht mist aus").
   Die Absicht von oben wird hier wiederhergestellt: im Kundendetail trägt die
   zugeklappte Detailzeile keine Fläche, keine Kante, keine Linie. Ist ein
   Verlauf aufgeklappt, sorgt .kd-detail (weiter oben) für den Abstand.
   Das „table." davor ist kein Zierrat: die Regel oben steht in einem :is(),
   dessen Spezifitaet vom staerksten Glied kommt (tr.is-open>td:first-child) —
   ohne den Typ-Selektor bliebe die 3-px-Kante als Schatten stehen. */
#kunden-page-view table.sc-table tr[class*="detailzeile"]>td,
#kunden-page-view table.sc-table tr.td-detail>td,
#kunden-page-view table.sc-table tr.au-detail>td{
  background:transparent;box-shadow:none;border-bottom:0;padding:0}
@media (max-width:900px){
  #kunden-page-view table.sc-table tr[class*="detailzeile"]>td,
  #kunden-page-view table.sc-table tr.td-detail>td,
  #kunden-page-view table.sc-table tr.au-detail>td{
    border-radius:0;margin-bottom:0;padding:0}
}

/* Diese drei Zusatzangaben sind reine Handy-Ergaenzungen: am Rechner tragen sie
   eigene Spalten und stuenden hier doppelt. Eingeschaltet werden sie unten im
   Handy-Block (dort mit #tab-… davor, also hoehere Spezifitaet). */
/* Bewusst mit #tab-… davor: die Grundregeln dieser Bausteine (.sc-field aus dem
   <style>-Block von index.html, #tab-kunden .ku-det__z hier in der Datei) sind
   spezifischer bzw. stehen spaeter — ohne den Id-Vorsatz stuenden die
   Handy-Ergaenzungen am Rechner doppelt in der Detailzeile. */
#tab-kunden .ku-det__z--mobil,#tab-hosting .ho-nurmobil,
#tab-todos .td-nurmobil,#tab-vertraege .vt-nurmobil{display:none}

/* „IT-Doku & Passwoerter": zwei Groessen, die frueher als Inline-Stil am
   Element standen. Inline schlaegt JEDE Regel — auf dem Handy haetten die
   Handy-Fassungen weiter unten sonst keine Chance. */
.itdok-geraet__name{flex:1}
.itdok-accbar>input{flex:1}

/* ══ Ab hier: reine Handy-Regeln (≤ 560 px). Tablets behalten mehr. ═══════ */
@media (max-width:560px){

  /* ── (3) Kennzahlenband: zwei Spalten, kleinere Zahl, keine Erklaerzeile ──
     Zwei Spalten statt waagerechtem Rollbereich: alle vier Zahlen sind
     gleichzeitig sichtbar (nichts versteckt sich hinter einer Kante, die man
     auf Touch erst suchen muss), und es kostet nur ~130 statt 468 px.
     Die Erklaerzeile faellt weg — sie wiederholt meist die Beschriftung
     („Buchungen / im gewaehlten Monat"). Am Rechner bleibt sie. */
  .sc-band{padding:var(--sc-3);margin-bottom:var(--sc-4)}
  .sc-kpis{grid-template-columns:repeat(2,1fr)}
  .sc-kpi{padding:var(--sc-2) var(--sc-2) var(--sc-2) var(--sc-3)}
  .sc-kpi__val{font-size:var(--sc-t-lg);overflow-wrap:anywhere}
  .sc-kpi__sub{display:none}

  /* ── (1) Weniger ueber dem Inhalt ─────────────────────────────────────────
     Der Erklaersatz beschreibt den Bereich, den man gerade selbst geoeffnet
     hat — auf 390 px kostet er bis zu drei Zeilen vor der ersten Zahl. */
  .sc-toolbar__head>.sc-lead,
  .sc-toolbar__head>.chart-subtitle,
  .bel-head__sub{display:none}
  .sc-toolbar{margin-bottom:var(--sc-3);gap:var(--sc-2)}
  .sc-toolbar--filters{padding:var(--sc-2) 0}
  .sc-chip{padding:5px 10px}
  .sc-search input{padding:7px 12px 7px 32px}
  /* ── Filterpillen: doch wieder umbrechen (Korrektur 19.08.2026) ─────────
     Hier stand `flex-wrap:nowrap;overflow-x:auto;scrollbar-width:none` — EINE
     rollbare Zeile statt dreien, uebernommen von den Unterreitern
     (#bel-subtabs). Bei den Kontakten (acht Pillen, zusammen 811 px in einem
     323-px-Fenster) hiess das: die Leiste endete mitten in „Gewerke", und weil
     der Rollbalken ausdruecklich ausgeblendet war, deutete NICHTS darauf hin,
     dass rechts noch „Dienstleister", „Behoerden", „Ohne Kunde 4" und
     „Ausgeschieden" stehen. Vier von acht Filtern waren praktisch nicht da.

     Warum nicht stattdessen der Rollhinweis von Z. ~3160: der ist ein
     Hintergrund, die Pillen sind deckende Kaestchen und liegen darueber —
     genau an der entscheidenden Stelle waere er verdeckt. Und eine
     Weichzeichnung ueber den Rand (mask) wuerde am Ende des Rollwegs die
     LETZTE Pille anknabbern, also Text unlesbar machen.

     Deshalb bricht die Leiste wieder um. Eine Filterpille ist kein Reiter:
     sie traegt eine Zahl („Ohne Kunde 4"), die man ueberfliegt, statt nur ein
     Ziel zum Antippen. Der Preis sind zwei zusaetzliche Zeilen und nur dort,
     wo es wirklich viele Pillen gibt — flex-wrap:wrap bricht ja erst um, wenn
     der Platz nicht reicht. Bereiche mit drei, vier Pillen bleiben einzeilig.
     Ein Filter, den man erst durch Ziehen findet, benutzt niemand. */
  .sc-toolbar--filters .sc-chips{flex-wrap:wrap;overflow-x:visible;row-gap:var(--sc-2)}
  .sc-toolbar--filters .sc-chips>.sc-chip{flex:0 0 auto}
  /* Knoepfe der Kopfleisten: schmaler gesetzt, damit zwei statt einer je Zeile
     passen — die Trefferhoehe waechst dabei (40 statt 34 px), sie schrumpft
     also NICHT. */
  .sc-toolbar__actions .btn,.sc-band__head .btn{
    font-size:var(--sc-t-sm);padding:8px 11px;min-height:40px;
    display:inline-flex;align-items:center;justify-content:center;gap:6px}

  /* Knopfreihe als ZWEISPALTIGES Raster statt als Flexzeile.
     Warum nicht einfach umbrechen lassen: die vier Kundenknoepfe sind 128 /
     189 / 205 / 146 px breit — jedes Paar liegt 4 bis 40 px ueber den
     verfuegbaren 323 px, also landete JEDER auf einer eigenen Zeile (190 px
     Knopfteppich vor dem ersten Kunden, gemessen 17.08.2026). Im Raster sind
     es zwei feste Spalten; ein zu langer Text bricht innerhalb des Knopfes um,
     statt eine ganze Zeile zu belegen. `flex:1 1 100%` ist noetig, weil die
     Leiste als Flex-Kind sonst nur so breit wird wie ihr groesster Knopf —
     dann haette das Raster wieder nur eine Spalte. */
  .tab-content .sc-toolbar__actions{
    flex:1 1 100%;width:100%;display:grid;align-items:stretch;
    grid-template-columns:repeat(auto-fit,minmax(128px,1fr))}
  .tab-content .sc-toolbar__actions>.sc-kick{grid-column:1/-1}
  .tab-content .sc-toolbar__actions .btn{white-space:normal;line-height:1.25;text-align:center}

  /* Viele Aktionen werden zur rollbaren Zeile statt zum Raster.
     „Pakete & Preise" hat acht Knoepfe — als Raster sind das drei Zeilen und
     rund 190 px, bevor ueberhaupt Inhalt kommt. Als eine Zeile sind es etwa 50.
     Die Hauptaktion (gruen) steht immer vorn und ist ohne Rollen erreichbar.
     Bewusst ueber eine Klasse am Element statt ueber :has(…nth-of-type…) —
     letzteres wurde von der Engine nicht angewandt (17.08.2026 geprueft). */
  .tab-content .sc-toolbar__actions.sc-actions--viele{
    display:flex !important;flex-wrap:nowrap !important;overflow-x:auto;
    -webkit-overflow-scrolling:touch;scrollbar-width:none;padding-bottom:2px}
  .tab-content .sc-toolbar__actions.sc-actions--viele::-webkit-scrollbar{display:none}
  .tab-content .sc-toolbar__actions.sc-actions--viele .btn{
    flex:0 0 auto;white-space:nowrap}
  .tab-content .sc-toolbar__actions.sc-actions--viele .btn-primary,
  .tab-content .sc-toolbar__actions.sc-actions--viele .btn-success{order:-1}

  /* Auswahlfelder der Filterleiste stehen zu zweit nebeneinander. Voll breit
     (Regel der 760-px-Stufe) kostet jedes eine eigene Zeile — bei „Websites &
     Wartung" sind das drei Zeilen nur fuer CMS/Paket/Status. */
  #tab-hosting .sc-toolbar--filters .sc-inp,
  .tab-content .sc-toolbar--filters .sc-inp{width:auto;flex:1 1 44%;min-width:0}
  #tab-hosting .sc-toolbar--filters .sc-inp--wide,
  .tab-content .sc-toolbar--filters .sc-inp--wide{flex:1 1 100%}

  /* Websites & Wartung: die Legende erklaert die sechs Punkte. Denselben
     Klartext zeigt das aufgeklappte Detail jeder Zeile (.sc-lamps) — auf dem
     Handy kostet die Legende 100 px vor der ersten Website, ohne etwas zu
     sagen, was man nicht eine Ebene tiefer bekaeme. */
  #tab-hosting .sc-legend{display:none}

  /* ── (2) Kacheln ausduennen ───────────────────────────────────────────────
     Pro Zeile nur, was zum Wiedererkennen und Entscheiden noetig ist. Der Rest
     steht in der Detailzeile (Pfeil links) bzw. auf der Detailseite. */

  /* Kunden: Name · Ort · Portal-Ampel. Nummer und Betreuer wandern in die
     Detailzeile (.ku-det__z--mobil), Telefon/E-Mail standen schon dort.
     Der Sprung-Pfeil entfaellt — ein Tipp auf die Zeile tut dasselbe;
     das Monitor-Symbol fuer „IT-Doku & Passwoerter" bleibt, weil das eine
     der meistgenutzten Handy-Ansichten ist. */
  #tab-kunden .ku-c-nr,#tab-kunden .ku-c-betr,#tab-kunden .ku-open{display:none}
  #tab-kunden .ku-c-name{flex:1 1 150px;order:1}
  #tab-kunden .ku-c-akt{flex:0 0 auto;order:2;width:auto}
  #tab-kunden .ku-c-ort{flex:0 1 auto;order:3}
  #tab-kunden .ku-c-portal{flex:0 1 auto;order:4}
  #tab-kunden .ku-det__z--mobil{display:inline-flex}
  /* Ohne Spaltenkopf traegt jede Zelle ihre Beschriftung (data-lab). Bei diesen
     dreien ist sie ueberfluessig — der Name steht fett, „40593 Duesseldorf" ist
     erkennbar ein Ort und „kein Zugang" beschreibt sich selbst. Drei Zeilen
     Beschriftung je Kunde = 48 px, bei 139 Kunden der halbe Bildschirm. */
  #tab-kunden .ku-table td.ku-c-name::before,#tab-kunden .ku-table td.ku-c-ort::before,
  #tab-kunden .ku-table td.ku-c-portal::before,
  #tab-hosting .ho-table td.ho-c-dom::before,
  #tab-vertraege .vt-table td.vt-c-name::before{display:none}

  /* Websites & Wartung: Domain · Zustand · Status · Kunde.
     CMS und Wartungspaket stehen als Marken im aufgeklappten Detail. */
  #tab-hosting .ho-c-cms,#tab-hosting .ho-c-paket{display:none}
  #tab-hosting .ho-c-dom{flex:1 1 100%;order:1}
  #tab-hosting .ho-c-zustand{flex:0 0 auto;order:2;width:auto}
  #tab-hosting .ho-c-status{flex:0 0 auto;order:3;width:auto}
  #tab-hosting .ho-c-kunde{flex:1 1 100%;order:4}
  #tab-hosting .ho-c-akt{flex:1 1 100%;order:5;width:auto}
  #tab-hosting .ho-nurmobil{display:inline-flex}

  /* To-dos: Haken · Aufgabe · Faellig · Prio · Status. Kunde und die zwei
     Aktionen stehen im aufgeklappten Detail (.td-nurmobil) — in der Zeile
     kosteten sie zwei volle Zeilen je Aufgabe. */
  #tab-todos .td-col-kunde,#tab-todos .td-col-akt{display:none}
  #tab-todos .td-col-datum{flex:1 1 130px;order:4}
  #tab-todos .td-col-prio{flex:1 1 100px;order:5}
  #tab-todos .td-col-status{flex:1 1 100%;order:6}
  #tab-todos .td-nurmobil{display:flex}
  #tab-todos .td-detail__mobil{display:flex;gap:var(--sc-2);flex-wrap:wrap;
    margin-top:var(--sc-3)}

  /* Pakete & Preise: Name · Preis · Marge · Stand. Vier Angaben plus Status —
     der Preis und die Marge gehoeren nebeneinander, sie beantworten zusammen
     die Frage „traegt sich das Paket?". */
  #tab-vertraege .vt-c-geld--ek,#tab-vertraege .vt-c-geld--einr{display:none}
  #tab-vertraege .vt-c-name{flex:1 1 100%;order:1}
  #tab-vertraege .vt-c-geld{flex:1 1 110px;order:2;width:auto}
  #tab-vertraege .vt-c-marge{flex:0 1 auto;order:3;width:auto}
  #tab-vertraege .vt-c-stand{flex:1 1 130px;order:4;width:auto}
  #tab-vertraege .vt-c-akt{flex:1 1 100%;order:5;width:auto}
  #tab-vertraege .vt-nurmobil{display:flex}

  /* ── „IT-Doku & Passwoerter" (Kundenpasswoerter) ──────────────────────────
     Die Ansicht ist ein Vollbild-Overlay mit eigenem, aelterem Markup — sie
     liegt NICHT in .tab-content, die Regeln oben greifen dort also nicht.
     Gemessen bei 390 px: die Geraetezeilen waren 400 px breit, das Overlay
     rollte waagerecht und der Knopf „+ Geraet" lag ausserhalb des Bildes.
     Ursache: Rasterkinder haben min-width:auto, und die Kopfzeile einer
     Geraetekarte (Symbol · Name · Typ · IP · Link · 2 Knoepfe · Pfeil) darf
     nicht umbrechen. Beides hier geradegezogen — nichts wird versteckt. */
  #it-dok-overlay{overflow-x:hidden}
  #itdok-panel-geraete,#itdok-panel-accounts{padding-left:var(--sc-3);padding-right:var(--sc-3)}
  /* Kopfleiste: 24 px Rand je Seite liessen vom Kundennamen „IT…" uebrig. */
  #it-dok-overlay>div:first-child{padding-left:var(--sc-3);padding-right:var(--sc-3);gap:var(--sc-2)}
  /* Die Netzwerkgrafik zeichnet ihre Knoten in die verfuegbare Breite. Bei
     390 px liegen die fuenf Geraetenamen uebereinander („Maler-PCLüstaufFar…") —
     330 px unlesbarer Vorlauf vor der Geraeteliste. Dieselben Geraete stehen
     direkt darunter als lesbare Zeilen, Router und NAS haben eigene Karten.
     Am Rechner bleibt die Grafik unveraendert. */
  #it-dok-svg-section{display:none !important}
  #it-dok-overlay .it-dok-grid>*{min-width:0}
  #it-dok-geraete-list,#it-acc-pool,#it-dok-netz-karte,#it-dok-nas-karte{min-width:0}
  .itdok-geraet__kopf{flex-wrap:wrap}
  .itdok-geraet__name{flex:1 1 100%;min-width:0;overflow-wrap:break-word}
  /* Suchfeld, Filter und die drei Knoepfe der Account-Liste brechen um, statt
     sich aus dem Bild zu schieben. */
  .itdok-accbar{flex-wrap:wrap}
  .itdok-accbar>input,.itdok-accbar>select{flex:1 1 100%;min-width:0;box-sizing:border-box}
  .itdok-accbar>button{flex:1 1 46%;min-width:0}
}

/* ══════════════════════════════════════════════════════════════════════════
   HANDY: Beschriftungen nur dort, wo der Wert sie braucht
   ══════════════════════════════════════════════════════════════════════════
   Beim Umbau am 17.08.2026 bekam JEDE Zelle ihre Feldbeschriftung vorangestellt
   („TITEL", „STATUS", „NUMMER", „BETRAG", „KUNDE", „GÜLTIG BIS"). Zusammen war
   das mehr Text als die Daten selbst — ein Angebot brauchte zwölf Zeilen für
   sechs Angaben. Das ist das Muster für Formulare, nicht für Listen.

   Ein Firmenname, eine Angebotsnummer, ein Euro-Betrag oder eine Statuspille
   erklären sich selbst. Beschriftet bleibt nur, was sonst mehrdeutig wäre —
   nackte Datumsangaben etwa, oder Zahlen ohne Einheit.
   ═════════════════════════════════════════════════════════════════════════ */
@media (max-width:560px){
  #tab-angebote .ang-table td.ang-c-titel::before,
  #tab-angebote .ang-table td.ang-c-status::before,
  #tab-angebote .ang-table td.ang-c-nr::before,
  #tab-angebote .ang-table td.ang-c-kunde::before,
  #tab-angebote .ang-table td.ang-c-betrag::before,
  #tab-hosting  .ho-table  td.ho-c-dom::before,
  #tab-hosting  .ho-table  td.ho-c-kunde::before,
  #tab-hosting  .ho-table  td.ho-c-status::before,
  #tab-hosting  .ho-table  td.ho-c-cms::before,
  #tab-druckplanung .dr-table td.dr-c-was::before,
  #tab-druckplanung .dr-table td.dr-c-kunde::before,
  #tab-druckplanung .dr-table td.dr-c-stand::before{content:none}

  /* Die Hauptangabe traegt die Zeile: groesser, fett, eigene Zeile. */
  #tab-angebote .ang-table td.ang-c-titel,
  #tab-hosting  .ho-table  td.ho-c-dom,
  #tab-druckplanung .dr-table td.dr-c-was{
    font-weight:600;font-size:var(--sc-t-md);flex:1 1 200px}
  /* Nebenangaben ruhiger, damit die Hauptangabe fuehrt. */
  #tab-angebote .ang-table td.ang-c-kunde,
  #tab-angebote .ang-table td.ang-c-nr,
  #tab-hosting  .ho-table  td.ho-c-kunde,
  #tab-hosting  .ho-table  td.ho-c-cms,
  #tab-druckplanung .dr-table td.dr-c-kunde{
    color:var(--sc-muted);font-size:var(--sc-t-sm)}

  /* Der Erklaersatz unter der Ueberschrift erklaert den Bereich, den man
     gerade geoeffnet hat — auf dem Handy kostet er nur Platz.
     Bewusst ueber .sc-lead im ganzen Bereich statt ueber den Kopf-Container:
     die Bereiche verwenden dafuer verschiedene Huellen (.sc-toolbar__head,
     .ang-head__txt, .sc-band__head …), eine Regel auf den Container traf
     deshalb nur einen Teil davon. */
  .tab-content .sc-lead{display:none}
}

/* ══════════════════════════════════════════════════════════════════════════
   HANDY: Detailzeilen brauchen ihren Innenabstand
   ══════════════════════════════════════════════════════════════════════════
   Die Regel, die auf schmaler Breite alle Tabellenzellen auf padding:0 setzt
   (damit aus der Zeile ein Block wird), traf auch die aufgeklappte
   Detailzelle. Deren Inhalt begann damit direkt am Rand — also GENAU unter der
   3-px-Akzentkante, die als Innenschatten darüber liegt. Im Bild sah es aus,
   als sei der Text links abgeschnitten: aus „BETRAG LAUT ANGEBOT" wurde
   „ETRAG LAUT ANGEBOT".

   Auffällig ist, dass keine Messung das gefunden hat: Die Zelle lag mit ihren
   Koordinaten sauber in der Karte. Sichtbar war es nur im Bild.
   ═════════════════════════════════════════════════════════════════════════ */
@media (max-width:560px){
  #tab-kunden .ku-table>tbody>tr.ku-detailzeile>td,
  #tab-angebote .ang-table>tbody>tr.ang-detailzeile>td,
  #tab-hosting .ho-table>tbody>tr.ho-detailzeile>td,
  #tab-druckplanung .dr-table>tbody>tr.dr-detailzeile>td,
  #tab-todos .td-table>tbody>tr.td-detailzeile>td,
  #tab-auftraege .au-table>tbody>tr.au-detailzeile>td,
  #tab-vertragsdok .vd-table>tbody>tr.vd-detailzeile>td,
  #tab-vorlagen .vlg-table>tbody>tr.vlg-detailzeile>td,
  #tab-abos .abo-table>tbody>tr.abo-detailzeile>td,
  #tab-plugins .pl-table>tbody>tr.pl-detailzeile>td,
  #tab-kontakte .kt-table>tbody>tr.kt-detailzeile>td{
    padding:var(--sc-4) var(--sc-4) var(--sc-4) var(--sc-5)}
}

/* ── Zwei Reste aus der Breitenpruefung vom 17.08.2026 ──────────────────── */

/* Abos: Die Kunden-Pille traegt bei langen Firmennamen mehr Text, als ihre
   Zelle breit ist („Malerwerkstätten Willi B…": 273 px in 241 px). Sie ragte
   deshalb seitlich heraus. Jetzt bricht der Name mit Auslassungspunkten ab —
   der volle Name steht in der aufgeklappten Zeile. */
#tab-abos .abo-t{min-width:0}
#tab-abos .abo-t .sc-pill{max-width:100%;overflow:hidden;text-overflow:ellipsis;
  white-space:nowrap;display:inline-block;vertical-align:bottom}

/* To-dos: Lange Kundennamen brauchen bis zu 244 px, die Spalte hat 172 — der
   Name war also immer angeschnitten, auch am grossen Bildschirm. Die Spalte
   noch breiter zu machen wuerde Faelligkeit und Status quetschen; stattdessen
   endet der Name sichtbar mit Auslassungspunkten. Vollstaendig steht er beim
   Hineinklicken und in der aufgeklappten Zeile. */
#tab-todos .td-col-kunde{min-width:172px}
#tab-todos .td-col-kunde input{width:100%;min-width:0;text-overflow:ellipsis}

/* ══════════════════════════════════════════════════════════════════════════
   AUFGEKLAPPTE ZEILE — Nachbesserung nach Dennis' Rückmeldung (18.08.2026)
   ══════════════════════════════════════════════════════════════════════════
   Drei Beanstandungen, alle mit derselben Wurzel:

   „am erweitern/aufklappen Button ist bei aktiviertem Klick auch ein balken
    der da nicht hingehört"
     Die Akzentkante lag als Innenschatten auf der ERSTEN Zelle — und das ist
     die Zelle mit dem Aufklapp-Knopf. Der Knopf klebte ohne Abstand daran, es
     sah aus wie ein Balken am Knopf. Die Kante bekommt jetzt Abstand.

   „der kann auch gerne so aussehen wie bei den dunklen Cards, ohne radius"
     Die Kennzahlen-Kacheln im dunklen Band tragen ihre Farbkante gerade
     durchlaufend. Der Radius kommt weg, damit beides gleich aussieht.

   „das man da auf den Kundennamen klicken muss, ist auch nicht direkt
    ersichtlich"
     Die Hauptangabe sah aus wie Text. Sie bekommt einen Zeigefinger und
     hebt sich beim Darüberfahren ab.
   ═════════════════════════════════════════════════════════════════════════ */

/* Kante gerade durchlaufend statt abgerundet — wie im dunklen Band. */
@media (max-width:900px){
  :is(#tab-kunden,#tab-angebote,#tab-hosting,#tab-druckplanung,#tab-abos,
      #tab-investitionen,#tab-vertraege,#tab-domainverwaltung,#tab-plugins,
      #tab-vertragsdok,#tab-todos,#tab-auftraege,#tab-kontakte) tr.is-open{
    border-radius:0}
  :is(#tab-kunden,#tab-angebote,#tab-hosting,#tab-druckplanung,#tab-abos,
      #tab-investitionen,#tab-vertraege,#tab-domainverwaltung,#tab-plugins,
      #tab-vertragsdok,#tab-todos,#tab-auftraege,#tab-kontakte) :is(tr[class*="detailzeile"]>td,
      tr.td-detail>td,tr.au-detail>td){
    border-radius:0}
}

/* Der Aufklapp-Knopf braucht Abstand zur Kante, sonst wirkt sie wie ein
   Balken an ihm. Gilt in beiden Breiten. */
:is(#tab-kunden,#tab-angebote,#tab-hosting,#tab-druckplanung,#tab-kontakte) tr.is-open>td:first-child{
  padding-left:var(--sc-3)}
@media (max-width:900px){
  :is(#tab-kunden,#tab-angebote,#tab-hosting,#tab-druckplanung,#tab-abos,
      #tab-investitionen,#tab-vertraege,#tab-domainverwaltung,#tab-plugins,
      #tab-vertragsdok,#tab-todos,#tab-auftraege,#tab-kontakte) tr.is-open{
    padding-left:var(--sc-4)}
}

/* Sichtbar machen, dass die Zeile sich öffnen lässt. */
:is(#tab-kunden,#tab-angebote,#tab-hosting,#tab-druckplanung,#tab-kontakte) :is(
  .ku-c-name,.ang-c-titel,.ho-c-dom,.dr-c-was,.kt-c-name){cursor:pointer}
:is(#tab-kunden,#tab-angebote,#tab-hosting,#tab-druckplanung) tr:not(.is-open):hover>td{
  background:var(--sc-sunk)}
:is(#tab-kunden,#tab-angebote,#tab-hosting,#tab-druckplanung,#tab-kontakte) :is(
  .ku-name,.ang-t,.ho-dom,.dr-was,.kt-name){text-decoration:underline;
  text-decoration-color:transparent;text-underline-offset:3px;
  transition:text-decoration-color var(--sc-t-fast)}
:is(#tab-kunden,#tab-angebote,#tab-hosting,#tab-druckplanung,#tab-kontakte) tr:hover :is(
  .ku-name,.ang-t,.ho-dom,.dr-was,.kt-name){text-decoration-color:var(--sc-primary-line)}

/* ══════════════════════════════════════════════════════════════════════════
   TO-DOS AUF DEM HANDY — „sehen übrigens noch schrecklich aus" (Dennis)
   ══════════════════════════════════════════════════════════════════════════
   Ursache: Die Aufgabenliste ist durchgehend bearbeitbar — Aufgabe, Fälligkeit,
   Priorität, Status, Kunde und Kategorie sind Eingabefelder. Am Rechner in
   einer Tabelle ist das praktisch. Auf dem Handy wird daraus ein Formular pro
   Aufgabe: sechs gerahmte Felder mit Beschriftungen, rund 600 px für EINE
   Zeile.

   Der Ausweg ist nicht, die Bearbeitung wegzunehmen — man will unterwegs eine
   Aufgabe abhaken oder umdatieren können. Die Felder legen nur ihr
   Formular-Aussehen ab: kein Rahmen, kein Kasten, keine Beschriftung, wo der
   Wert für sich spricht. Sie bleiben vollständig bedienbar, sehen aber aus wie
   Text — der Rahmen erscheint erst beim Hineintippen.
   ═════════════════════════════════════════════════════════════════════════ */
@media (max-width:900px){
  /* Beschriftungen weg, wo der Wert selbsterklärend ist. „Fällig" bleibt —
     ein nacktes Datum wäre mehrdeutig.
     Die Spalten heissen td-col-titel und td-col-datum; mein erster Anlauf
     zielte auf td-col-aufgabe und td-col-faellig, die es nicht gibt — die
     Regeln liefen ins Leere. Klassennamen immer am gerenderten Baum pruefen. */
  #tab-todos .td-table td.td-col-titel::before,
  #tab-todos .td-table td.td-col-prio::before,
  #tab-todos .td-table td.td-col-status::before,
  #tab-todos .td-table td.td-col-kunde::before{content:none}

  /* Felder sehen aus wie Text — bis man sie antippt. */
  #tab-todos .td-table input[type="text"],
  #tab-todos .td-table input[type="date"],
  #tab-todos .td-table select,
  #tab-todos .td-table textarea{
    border-color:transparent;background:transparent;
    padding:2px 0;min-height:0;border-radius:var(--sc-r-sm)}
  #tab-todos .td-table input:focus,
  #tab-todos .td-table select:focus,
  #tab-todos .td-table textarea:focus{
    border-color:var(--sc-primary-line);background:var(--sc-paper);
    padding:6px 8px}

  /* Reihenfolge: Aufklapper, Haken, dann die Aufgabe ueber die volle Breite,
     darunter die Nebenangaben in einer Zeile. Vorher standen Haken und
     Prioritaet VOR der Aufgabe, weil beide dieselbe Ordnungszahl trugen. */
  #tab-todos .td-table td.td-col-chev{order:0;flex:0 0 auto}
  #tab-todos .td-table td.td-col-check{order:1;flex:0 0 auto;padding-right:var(--sc-2)}
  #tab-todos .td-table td.td-col-titel{order:2;flex:1 1 100%;min-width:0}
  #tab-todos .td-table td.td-col-datum{order:3;flex:0 1 auto}
  #tab-todos .td-table td.td-col-prio{order:4;flex:0 1 auto}
  #tab-todos .td-table td.td-col-status{order:5;flex:0 1 auto}
  #tab-todos .td-table td.td-col-kunde{order:6;flex:1 1 100%;min-width:0}
  #tab-todos .td-table td.td-col-akt{order:7;flex:1 1 100%}

  /* Die Aufgabe traegt die Zeile, alles andere ordnet sich unter. */
  #tab-todos .td-table td.td-col-titel :is(textarea,input){
    font-weight:600;font-size:var(--sc-t-md);line-height:1.35}
  #tab-todos .td-table :is(td.td-col-datum,td.td-col-prio,td.td-col-status,
                           td.td-col-kunde) :is(input,select){
    font-size:var(--sc-t-sm);color:var(--sc-muted)}
}

/* Der Balken neben dem Aufklapp-Knopf: Auf schmaler Breite trägt die ZEILE
   bereits die durchgehende Akzentkante. Die Regel für den Rechner setzt sie
   zusätzlich auf die erste Zelle — und das ist die Zelle mit dem Knopf. Es
   erschien also ein zweiter, kurzer Strich direkt daneben. Genau der, den
   Dennis gemeldet hat. Auf schmaler Breite gilt nur die Kante der Zeile. */
@media (max-width:900px){
  :is(#tab-kunden,#tab-angebote,#tab-hosting,#tab-druckplanung,#tab-abos,
      #tab-investitionen,#tab-vertraege,#tab-domainverwaltung,#tab-plugins,
      #tab-vertragsdok,#tab-todos,#tab-auftraege,#tab-kontakte) tr.is-open>td:first-child{
    box-shadow:none}
}

/* ── To-dos auf dem Handy: Karte zum Lesen, nicht Formular zum Ausfüllen ──
   Vorher standen Titel, Fällig-Datum, Priorität und Status je in einer
   eigenen Zeile untereinander, das Datum mit Beschriftung, die Priorität
   ohne — schief und viel zu hoch. Jetzt: Kopfzeile (Haken + Titel), darunter
   EINE Metazeile mit den drei Steuerfeldern nebeneinander. Die Felder
   bleiben bedienbar, sehen aber aus wie Angaben, nicht wie Eingabemaske. */
@media (max-width:900px){
  #tab-todos .td-table tbody tr:not(.td-detail){
    align-items:center;row-gap:var(--sc-2)}

  /* Kopfzeile: Aufklappen, Haken, Titel — alles nebeneinander */
  #tab-todos .td-table td.td-col-chev{order:0;flex:0 0 auto;padding-right:0}
  #tab-todos .td-table td.td-col-check{order:1;flex:0 0 auto;padding:0 var(--sc-2) 0 0}
  /* Der Titel fuellt die Kopfzeile bis zum Rand aus (abzueglich Knopf und
     Haken). Nur so brechen die drei Metafelder verlaesslich in die naechste
     Zeile um — mit 60 % blieben sie in Zeile 1 haengen und wurden auf 10 px
     zusammengequetscht. */
  #tab-todos .td-table td.td-col-titel{order:2;flex:1 1 calc(100% - 96px);min-width:0}

  /* Metazeile: die drei Steuerfelder teilen sich eine Zeile */
  /* Die Basis entscheidet den Umbruch (nicht das Wachstum) — mit Basis 0
     blieben die drei in der Kopfzeile haengen und schrumpften auf 10 px.
     Also echte Basen, ungleich verteilt: das Datum braucht am meisten Platz,
     zusammen bleiben sie unter 100 % und damit in EINER Zeile. */
  #tab-todos .td-table :is(td.td-col-datum,td.td-col-prio,td.td-col-status){
    flex-shrink:1;min-width:0}
  #tab-todos .td-table td.td-col-datum{flex-basis:36%;flex-grow:1.4}
  #tab-todos .td-table td.td-col-prio{flex-basis:25%;flex-grow:1}
  #tab-todos .td-table td.td-col-status{flex-basis:27%;flex-grow:1.15}
  #tab-todos .td-table td.td-col-datum{order:3}
  #tab-todos .td-table td.td-col-prio{order:4}
  #tab-todos .td-table td.td-col-status{order:5}
  #tab-todos .td-table td.td-col-kunde{order:6;flex:1 1 100%;min-width:0}
  #tab-todos .td-table td.td-col-akt{order:7;flex:1 1 100%}
  #tab-todos .td-table :is(td.td-col-datum,td.td-col-prio,
                           td.td-col-status,td.td-col-kunde){
    padding-top:0;padding-bottom:0}
  #tab-todos .td-table td.td-col-datum::before{content:none}

  /* Die Felder selbst: klein, randlos, in der Höhe gleich */
  #tab-todos .td-table :is(td.td-col-datum,td.td-col-prio,td.td-col-status)
    :is(input,select){
    width:100%;min-width:0;font-size:.8rem;padding:6px var(--sc-1);
    min-height:38px;text-align:left}
  #tab-todos .td-table td.td-col-datum input[type=date]{
    padding-left:0;padding-right:0;font-size:.76rem;color:var(--sc-muted)}
  #tab-todos .td-table td.td-col-datum input[type=date]::-webkit-calendar-picker-indicator{
    margin:0;padding:0;opacity:.55}
}

/* Der Haken gehoert neben die ERSTE Zeile des Aufgabentexts, nicht in dessen
   Mitte — bei dreizeiligen Aufgaben stand er sonst frei in der Luft. */
@media (max-width:900px){
  #tab-todos .td-table td.td-col-check{align-self:flex-start;margin-top:4px}
}

/* ── Plugins auf dem Handy: gleiche Ruhe wie in den anderen Bereichen ──
   Hier standen als einziger Bereich noch alle sieben Feldbeschriftungen
   ueber ihren Werten. Sie dominierten die Karte und machten sie doppelt so
   hoch. Weg kommen die selbsterklaerenden (der Plugin-Name steht fett da,
   die Lizenz-Pille sagt "kostenlos", die Aktionssymbole sind eindeutig).
   Stehen bleiben die zwei, die man ohne Beschriftung nicht deuten kann:
   Kostentraeger und Seiten. */
@media (max-width:900px){
  #tab-plugins .pl-table td:is(.pl-c-name,.pl-c-lizenz,.pl-c-geld,
                               .pl-c-anbieter,.pl-c-akt)::before{content:none}
  #tab-plugins .pl-table td.pl-c-name{order:1;flex:1 1 calc(100% - 60px);min-width:0}
  #tab-plugins .pl-table td.pl-c-chev{order:0;flex:0 0 auto}
  #tab-plugins .pl-table td.pl-c-lizenz{order:2;flex:0 1 auto}
  #tab-plugins .pl-table td.pl-c-geld{order:3;flex:0 1 auto}
  #tab-plugins .pl-table td.pl-c-anbieter{order:4;flex:1 1 100%;min-width:0}
  #tab-plugins .pl-table td.pl-c-traeger{order:5;flex:1 1 46%;min-width:0}
  #tab-plugins .pl-table td.pl-c-seiten{order:6;flex:1 1 40%;min-width:0}
  #tab-plugins .pl-table td.pl-c-akt{order:7;flex:1 1 100%}
  /* Der Plugin-Name traegt die Zeile, so wie der Kundenname in der
     Kundenliste. */
  #tab-plugins .pl-table td.pl-c-name .pl-t{
    font-size:var(--sc-t-md);font-weight:700}
  /* Bei kostenlosen Plugins steht in Lizenz UND Kosten dieselbe Pille
     "kostenlos" - zweimal dasselbe nebeneinander. Sichtbar bleibt die
     Lizenz-Pille, die Kostenspalte wird still. Die Klasse heisst
     sc-pill--ok (nachgesehen, nicht geraten). */
  #tab-plugins .pl-table tr:has(.pl-c-lizenz .sc-pill--ok) td.pl-c-geld{display:none}
}

/* ── Trefferflaechen auf Touch-Geraeten (Nachtrag) ────────────────────────
   Fuer .btn-icon gibt es die unsichtbare 44-px-Zone laengst. Beim Nachmessen
   auf 390 px blieben aber vier Arten von Bedienelementen darunter:
     Abhak-Kaestchen 17x17 · Aufklapp-Pfeil 15x15 ·
     "Kategorie · Notiz"-Knopf 90x13 · Filterpillen 27 px hoch · Knoepfe 40 px
   Gerade das Abhaken einer Aufgabe und das Aufklappen einer Zeile sind die
   haeufigsten Griffe auf dem Handy — die duerfen nicht die kleinsten Ziele
   sein. Wie bisher wird die Zone unsichtbar vergroessert, damit die Liste
   optisch ruhig bleibt. Nur auf Geraeten ohne Mauszeiger. */
@media (hover: none) and (pointer: coarse){
  .sc-chev,.td-mehr,.sc-chip,.sc-plain,.sc-pill button,button.sc-pill{
    position:relative}
  .sc-chev::after,.td-mehr::after,.sc-chip::after,
  .sc-plain::after,button.sc-pill::after{
    content:'';position:absolute;top:50%;left:50%;
    transform:translate(-50%,-50%);
    width:max(100%,44px);height:max(100%,44px)}

  /* Das Abhak-Kaestchen ist ein <input> und kann kein ::after tragen — hier
     muss die Box selbst wachsen. 26 px ist der Kompromiss: klar groesser als
     die 17 px vorher, ohne die Zeile zu dominieren. Der Zellabstand ringsum
     sorgt fuer den Rest, damit man beim Abhaken nicht den Nachbarn trifft.
     Die Selektoren sind bewusst genauso geschrieben wie die 17-px-Regeln
     weiter oben (Zeile ~1193/1882) — mit einem kuerzeren Selektor verliert
     man hier schlicht, weil dort eine ID mitspielt. */
  #tab-todos .sc-table input[type=checkbox],
  #tab-auftraege .sc-table input[type=checkbox],
  #kunden-page-view .sc-table input[type=checkbox],
  .td-table input[type=checkbox],.pl-table input[type=checkbox]{
    width:26px;height:26px}
  .td-table td.td-col-check{padding-right:var(--sc-3)}

  /* ── Die unsichtbaren Zonen duerfen sich NICHT ueberlappen ──────────────
     Nachgemessen am 19.08.2026 in der Kontaktliste: die Aktionsspalte setzt
     gap:var(--sc-1) = 4 px zwischen „vCard" und „Loeschen". Beide Knoepfe sind
     28 px breit und tragen die 44-px-Zone von oben, ragen also je 8 px zur
     Seite. Zwei Nachbarn mit 4 px Abstand ueberlappen sich damit um 12 px —
     und in der Ueberlappung gewinnt der spaeter gezeichnete Knopf. Ein Tipp
     auf das rechte Drittel von „vCard" loeste also „Loeschen" aus.
     16 px ist der kleinste Abstand, bei dem sich die Zonen nur noch beruehren
     (2 * 8 px). Weil die bereichseigenen Regeln eine ID im Selektor tragen
     (#tab-kunden .ku-c-akt .action-row { gap:var(--sc-1) } u. a.), kommt hier
     nur !important dagegen an — die Alternative waere, jede dieser Regeln
     einzeln nachzuziehen, also genau die Sorte Regel, an die man sich erinnern
     muss. Am Rechner aendert sich nichts: die Zonen entstehen nur auf Touch. */
  .action-row{gap:var(--sc-4) !important}

  /* Standardknoepfe lagen bei 40 px — die vier fehlenden Pixel kosten nichts.
     Auch hier der genaue Selektor der Kopfleisten-Regel, sonst greift es nicht. */
  .btn{min-height:44px}
  .sc-toolbar__actions .btn,.sc-band__head .btn{min-height:44px}
  .sc-tab{min-height:44px}
}

/* Der kleine Knopf unter dem Aufgabentext ("Kategorie · Notiz") wurde durch
   das groessere Abhak-Kaestchen mitgequetscht — bei "Büro" blieben 26 von
   35 noetigen Pixeln. Er soll seine natuerliche Breite behalten und lieber
   umbrechen als abschneiden. */
@media (max-width:900px){
  #tab-todos .td-col-titel .td-mehr{
    flex:0 0 auto;min-width:max-content;white-space:nowrap;text-align:left;
    width:auto;max-width:none;overflow:visible}
}

/* ── „Neue Aufgabe" — vom schwebenden Knopf in die Kopfleiste (19.08.2026) ─
   Vorgeschichte: der Knopf schwebte fest unten rechts (position:fixed) und
   verdeckte dort Zeileninhalte. Das war schon einmal gemeldet und wurde mit
   `.tab-content{padding-bottom:96px}` beantwortet — also mit reserviertem
   Platz am ENDE des Inhalts. Nachgemessen am 19.08.2026 bei 390 px: das half
   ausschliesslich, wenn man ganz nach unten gerollt hatte. Ungerollt lag der
   Knopf auf der roten Muelltonne der dritten Kontaktzeile, weil die Zeilen
   dort vorbeirollen, wo der Knopf steht. Ein reservierter Streifen am Ende
   kann das gar nicht loesen — er loest nur den letzten Bildschirm.
   Dazu kam ein zweiter, unabhaengiger Fehler: der Knopf lag auf z-index 400,
   der Standard-Fensterhintergrund (.modal-backdrop, index.html) aber auf 300.
   Der Knopf lag also UEBER jedem gewoehnlichen Fenster und blieb dort
   anklickbar — der Kommentar an dieser Stelle nannte faelschlich 8500, das
   ist nur der Angebots-Editor.

   Deshalb schwebt hier gar nichts mehr. Die Aktion steht jetzt in der
   Kopfleiste, die ohnehin klebt (position:sticky, z-index 200) und auf jeder
   Breite sichtbar ist. Damit ist die ganze Fehlerklasse weg, und zwar ohne
   dass irgendeine Liste — heutige oder kuenftige — etwas dafuer tun muesste:
   was nicht ueber dem Inhalt liegt, kann nichts verdecken.
   Markup: index.html, zwei Knoepfe (Rechner in #header-actions, Handy neben
   dem Menuezeichen) — #header-actions ist unter 769 px ausgeblendet.
   Groesse: am Rechner 34 px wie die Nachbarknoepfe der Kopfleiste — mit 40 px
   wuchs die Leiste zwischen 769 und 900 px um 4 bis 13 px, weil sie dort
   ohnehin zweizeilig umbricht. Auf dem Handy 40 px wie das Menuezeichen
   (index.html, @media max-width:768px). */
.hdr-plus{
  display:flex;align-items:center;justify-content:center;flex-shrink:0;
  width:34px;height:34px;border-radius:8px;border:1px solid var(--sc-lime);
  background:var(--sc-lime);color:var(--sc-ink);cursor:pointer;
  transition:filter .15s}
.hdr-plus svg.lucide{width:18px;height:18px;stroke-width:2.4}
.hdr-plus:hover{filter:brightness(1.06)}
/* Die Handy-Fassung steht ausserhalb von #header-actions und wird erst dort
   sichtbar, wo dieses ausgeblendet ist (index.html, @media max-width:768px). */
.hdr-plus--mobil{display:none}


/* ══════════════════════════════════════════════════════════════════════════
   TABLETBREITE UND ROLLENDE TABELLEN (18.08.2026)
   ══════════════════════════════════════════════════════════════════════════
   Drei Befunde aus dem Augenschein bei 390 / 768 / 1500 px, die alle dieselbe
   Ursache hatten: 768 px war nie angesehen worden. Dort griff weder die
   Handy- noch die Rechner-Regel.
   ══════════════════════════════════════════════════════════════════════════ */

/* ── (1) Die Listen stapeln jetzt bis 900 statt bis 760 px ────────────────
   Nur die Zahl in den Medienabfragen oben hat sich geaendert, nicht eine
   einzige Regel. Grund: KEINE dieser Listentabellen kommt unter 900 px mit
   einer vollstaendigen Zeile aus — ihre Mindestbreiten liegen zwischen 820
   und 1180 px. Bei 768 px wurde deshalb waagerecht gerollt, ohne dass man es
   sah, und die Zahlen wurden MITTEN IN DER ZIFFERNFOLGE abgeschnitten: in den
   Angeboten las man „12,9" und wusste nicht, ob 12,90 € oder 12.900 € gemeint
   ist. Eine halbe Zahl ist schlimmer als eine umgebrochene.
   Ab 900 px bleiben es Tabellen — dort ist der Zeilenvergleich moeglich, auf
   den es Dennis ankommt („da hat man dann erst einen Ueberblick").
   Bewusst NICHT umgestellt: das Dashboard-Raster (.kd-c3) und die
   Diagrammhoehe im Kostenbereich — die haengen nicht an Tabellenbreiten. */

/* ── (2) Suche · Filter · Trefferzahl brechen auf volle Breite um ─────────
   Bei 768 px teilten sich die drei EINE Zeile: das Suchfeld nahm links seine
   320 px, die Trefferzahl rechts ihre ~150 px, und die sechs Filterpillen
   quetschten sich in die ~230 px dazwischen — sie standen als versetzte
   Treppe in der Bildmitte, alle drei Gruppen auf verschiedenen Grundlinien.
   Das sah nach geplatztem Raster aus, nicht nach Gestaltung.
   Jede Gruppe bekommt jetzt bis 1024 px ihre eigene Zeile, so wie es auf dem
   Handy laengst aussieht. Die Trefferzahl bleibt rechtsbuendig — sie gehoert
   optisch an die rechte Kante der Liste darunter.
   #tab-hosting steht ausdruecklich mit dabei: dort setzt eine Regel mit
   Id-Vorsatz (flex:1 1 580px) die Filterbreite, und eine Id schlaegt jeden
   Klassenselektor — ohne diese Zeile liefe die Regel dort ins Leere. */
@media (max-width:1024px){
  .sc-toolbar--filters .sc-search{flex:1 1 100%}
  .sc-toolbar--filters .sc-toolbar__filters,
  #tab-hosting .sc-toolbar--filters .sc-toolbar__filters{flex:1 1 100%}
  .sc-toolbar--filters > .sc-hint{flex:1 1 100%;text-align:right}
}

/* ── (3) Waagerecht rollende Tabellen zeigen ihre Kante ───────────────────
   Sieben Zahlentabellen (Plan-Einnahmen 845 px, Jahresvergleich und Verlauf
   829, Shop 780, AGB 775, Kostenanalyse 643, Pakete & Preise 618) rollen auf
   dem Handy waagerecht. Das ist in Ordnung — sie sind Zahlenraster, als
   Karten waeren sie nicht mehr vergleichbar. Nur SAH man es nicht: kein
   Schatten, kein Rollbalken, kein Hinweis. Im Jahresvergleich las man
   „POSITION | 202|", im Shop endete der Kopf bei „KATEGOR|".

   EINE Loesung fuer alle: der Rollbereich selbst traegt vier Hintergrund-
   ebenen. Zwei davon sind papierfarbene Abdeckungen, die MIT dem Inhalt
   wandern (background-attachment:local); zwei sind weiche Schatten, die am
   Rahmen kleben (scroll). Am linken Ende deckt die linke Abdeckung den linken
   Schatten zu, am rechten Ende die rechte den rechten — der Hinweis
   verschwindet also von selbst, sobald es nichts mehr zu holen gibt. Ganz
   ohne JavaScript und ohne eine einzige Sonderregel je Bereich.
   Passt der Inhalt hinein, liegen beide Abdeckungen an ihrem Platz und man
   sieht ueberhaupt nichts.

   Die Abdeckung traegt --sc-paper: nachgemessen liegen fast alle Rollbereiche
   des Hubs auf einer Karte, also auf Papierweiss (und im dunklen Modus auf
   dessen dunkler Entsprechung — deshalb Token statt Hex).

   Wichtig: der Hinweis gehoert NUR an Flaechen, die wirklich rollen. Sobald
   eine Huelle auch nur 1 px Rollweg meldet, bleibt am rechten Rand ein Rest
   des Schattens als graue Haarlinie stehen — nachgemessen: eine breitere
   Abdeckung hilft dagegen NICHT (200 px voll deckend ausprobiert, Linie
   blieb), weil die Abdeckung als `local` an der Rollflaeche haengt und der
   Schatten als `scroll` am Rahmen. Wo nichts rollt, ist der Hinweis
   abzuschalten (siehe „gestapelte Listen" weiter unten). */
.sc-scroll,.sc-tablewrap{
  background-image:
    /* Abdeckungen — wandern mit dem Inhalt (local) */
    linear-gradient(to right, var(--sc-paper) 62%, rgba(255,255,255,0)),
    linear-gradient(to left,  var(--sc-paper) 62%, rgba(255,255,255,0)),
    /* Schatten — kleben am Rahmen (scroll) */
    linear-gradient(to right, rgba(20,23,26,.20), rgba(20,23,26,0)),
    linear-gradient(to left,  rgba(20,23,26,.20), rgba(20,23,26,0));
  background-position:left center,right center,left center,right center;
  background-size:40px 100%,40px 100%,22px 100%,22px 100%;
  background-repeat:no-repeat;
  background-attachment:local,local,scroll,scroll}

/* ── Gestapelte Listen rollen nicht seitwaerts — also auch kein Hinweis ────
   Befund 19.08.2026, 390 px: durch die Kontaktliste (und ebenso durch die
   Kundenliste) lief bei ~86 % der Breite eine senkrechte graue Linie von oben
   bis unten. Es ist der rechte Rollschatten von oben, und er stand dort, weil
   die Huelle einen SCHEIN-Rollweg von genau 8 px meldete:

     Jeder .btn-icon ist 28 px gross und traegt auf Touch eine unsichtbare
     44-px-Trefferflaeche (::after in index.html). Die ragt (44-28)/2 = 8 px
     ueber den Knopf hinaus. Beim LETZTEN Knopf einer rechtsbuendigen
     Aktionsspalte liegen diese 8 px hinter der rechten Zeilenkante. Sichtbar
     ist dort nichts — die Huelle rechnet sie trotzdem als Rollflaeche.

   Deshalb wird bei gestapelten Listen waagerecht geklippt: dann gibt es keine
   Rollflaeche, Abdeckung und Schatten liegen wieder aufeinander, und die Linie
   ist weg (so nachgemessen). `clip` statt `hidden`, damit die senkrechte Achse
   sichtbar bleibt (Menues, Merkzettel in einer Zeile).

   Die Bedingung haengt an td[data-lab] — genau daran erkennt der Hub eine
   gestapelte Liste, denn die Beschriftung JEDER Zelle kommt im gestapelten
   Zustand aus data-lab (Regel oben, Z. ~1855). Damit gilt sie ohne Zutun auch
   fuer jede kuenftige Liste, die nach dem Hausmuster gebaut ist. Nachgemessen
   am 19.08.2026 ueber alle 27 Bereiche: JEDE Tabelle mit data-lab stapelt bei
   390 px (Rollweg 0), und KEINE der echten Rolltabellen (Verlauf, Kosten,
   Jahresvergleich, Privat, Forecast, Shop, AGB, Pakete) traegt data-lab — die
   behalten ihren Hinweis. */
@media (max-width:900px){
  .sc-tablewrap:has(> table > tbody > tr > td[data-lab]),
  .sc-scroll:has(> table > tbody > tr > td[data-lab]){overflow-x:clip}
}

/* Fuer die Filterpillen taugt dieser Hinweis NICHT: er ist ein Hintergrund,
   die Pillen sind aber deckende weisse Kaestchen und liegen darueber — der
   Schatten waere genau dort unsichtbar, wo er gebraucht wird. Bei den
   Tabellen geht es nur, weil die Zellen durchsichtig sind (Z. ~406, bewusst).
   Was dort stattdessen passiert, steht bei .sc-toolbar--filters .sc-chips. */

/* Kein eigener Grund fuer den Tabellenkopf: `.sc-table th{background:transparent}`
   (Z. 406) ist eine bewusste Entscheidung, und der Hinweis soll als EINE
   durchgehende Kante ueber Kopf und Zeilen laufen — mit weissem Kopf haette
   er oben ein Loch. */

/* ── Auftragszeile: zwei Reste nach dem Umbau ────────────────────────────
   1) Der Kundenname steht in einem Eingabefeld und wurde hart abgeschnitten
      ("IVS Ingenieur-Vertriebs-Büro G|"). Ein Feld rollt beim Tippen, aber
      zum LESEN muss man sehen, dass da noch mehr kommt — also drei Punkte.
      Beim Hineintippen verschwinden sie von selbst.
   2) Beim Schaetzwert stand das Euro-Zeichen quer durch die Zeile abgesetzt,
      weil das Eingabefeld die volle Breite nahm. Es gehoert direkt an die
      Zahl. */
@media (max-width:900px){
  #tab-auftraege .au-col-kunde .au-kunde{
    text-overflow:ellipsis}
  #tab-auftraege .au-betrag{justify-content:flex-start}
}

/* ── Kopfzeile einer Vollbild-Ansicht (vbk = VollBildKopf) ────────────────
   Erste Nutzung: „IT-Doku & Passwoerter" beim Kunden. Vorher lag das ganze
   Layout inline in index.html, mit drei Folgen:
     · Ohne env(safe-area-inset-top) lagen "Zurueck" und der PDF-Knopf auf
       dem iPhone unter der Kamera-Pille und waren nicht antippbar.
     · Der Titel stand in EINER Zeile mit allen Knoepfen und schrumpfte auf
       schmaler Breite zu "IT..." zusammen — voellig nutzlos.
     · Die Reiterleiste darunter klebte fest bei top:57px; sobald die
       Kopfzeile durch die Safe-Area waechst, passt das nicht mehr.
   Deshalb hier zentral, mit einer gemeinsamen Hoehen-Variablen. */
.vbk{
  --vbk-hoehe:57px;
  position:sticky;top:0;z-index:10;
  background:var(--sc-ink);border-bottom:1px solid var(--sc-line-dark,var(--sc-ink));
  padding:calc(var(--sc-3) + env(safe-area-inset-top,0px)) var(--sc-5) var(--sc-3);
  display:flex;align-items:center;gap:var(--sc-3)}
.vbk-titelblock{flex:1;min-width:0}
.vbk-titel{font-size:1rem;font-weight:700;color:var(--sc-on-dark);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.vbk-untertitel{font-size:.76rem;color:var(--sc-info)}
.vbk-zurueck,.vbk-btn{
  background:transparent;border:1px solid transparent;color:var(--sc-info);
  font-size:.85rem;font-family:inherit;cursor:pointer;
  padding:8px 14px;border-radius:var(--sc-r-sm);
  display:inline-flex;align-items:center;gap:6px;min-height:44px}
.vbk-zurueck:hover,.vbk-btn:hover{background:rgba(255,255,255,.08)}
.vbk-btn--primaer{background:var(--sc-primary);color:var(--sc-on-dark)}
.vbk-btn--primaer:hover{background:var(--sc-primary-hover,var(--sc-primary))}
.vbk-btn svg.lucide,.vbk-zurueck svg.lucide{width:15px;height:15px}
.vbk-aktionen{display:flex;gap:var(--sc-2);align-items:center;flex-shrink:0}

/* Die Reiterleiste klebt UNTER der Kopfzeile — die Hoehe kommt aus derselben
   Rechnung, damit beide zusammenbleiben, egal wie hoch die Safe-Area ist. */
.vbk-reiter{
  position:sticky;z-index:9;
  top:calc(var(--vbk-hoehe,57px) + env(safe-area-inset-top,0px));
  background:var(--sc-ink);border-bottom:1px solid var(--sc-line-dark,var(--sc-ink));
  padding:0 var(--sc-5);display:flex;gap:0;overflow-x:auto}
.vbk-reiter__btn{
  padding:12px 20px;font-size:.82rem;font-weight:600;font-family:inherit;
  border:none;border-bottom:2px solid transparent;background:transparent;
  color:var(--sc-info);cursor:pointer;white-space:nowrap;min-height:44px}
.vbk-reiter__btn.is-aktiv{color:var(--sc-on-dark);border-bottom-color:var(--sc-primary)}

/* Auf dem Handy bekommt der Titel eine eigene Zeile. In einer Zeile mit
   Zurueck-Knopf und zwei Aktionen blieb von "IT-Dokumentation & Passwoerter
   – A+A Objektausstattung GmbH" genau "IT..." uebrig. */
@media (max-width:760px){
  .vbk{flex-wrap:wrap;--vbk-hoehe:104px;padding-left:var(--sc-4);padding-right:var(--sc-4)}
  .vbk-zurueck{order:0}
  .vbk-aktionen{order:1;margin-left:auto}
  .vbk-titelblock{order:2;flex:1 1 100%}
  .vbk-titel{white-space:normal;font-size:.95rem;line-height:1.3}
  .vbk-reiter{padding-left:var(--sc-4);padding-right:var(--sc-4)}
}

/* ══════════════════════════════════════════════════════════════════════════
   KONTAKTE — Adressbuch (18.08.2026)
   ══════════════════════════════════════════════════════════════════════════
   Nur die Bausteine, die es noch nicht gibt. Aufbau, Aufklapp-Detail, Handy-
   Umbruch und Akzentkante kommen aus den gemeinsamen Listenregeln weiter oben
   (dort ist #tab-kontakte in die Selektorlisten eingetragen) — hier stehen
   ausschliesslich die Spaltenbreiten und die drei eigenen Bausteine
   (.kt-det, .kt-daten, Erfassen-Dialog).

   REIHENFOLGE IST TRAGEND: die Handy-Regeln unten stehen NACH den Breiten,
   weil beide dieselbe Spezifitaet haben (1,1,0). Stuenden sie davor, gaebe
   der Rechner-Wert am Handy den Ton an und die Spalten blieben starr.
   ══════════════════════════════════════════════════════════════════════════ */

/* ── Tabelle: acht Spalten, deshalb etwas breiter als die Kundenliste ────── */
#tab-kontakte .kt-table{min-width:1100px}
#tab-kontakte .kt-c-name{min-width:190px}
#tab-kontakte .kt-c-firma{min-width:160px}
#tab-kontakte .kt-c-art{width:150px}
#tab-kontakte .kt-c-tel{width:140px;white-space:nowrap}
#tab-kontakte .kt-c-kunde{min-width:140px}
#tab-kontakte .kt-c-akt{width:96px;white-space:nowrap}
#tab-kontakte tr.kt-zeile{cursor:pointer}
#tab-kontakte tr.kt-zeile:hover td{background:var(--sc-sunk)}
/* Lange Adressen duerfen die Spalte nicht aufreissen. Bewusst nicht ueber
   .clip: das setzt max-width:0 und waere hier mit min-width im Streit. */
/* Die E-Mail-Spalte traegt .clip (siehe .sc-table .clip): ohne sie zog eine
   lange Adresse die Tabelle ueber die Karte hinaus und die Aktionsspalte lag
   ausserhalb — gemessen bei 1500 px: 1323 px Tabelle in 1244 px Karte. */
#tab-kontakte .kt-c-mail{min-width:190px}
#tab-kontakte .kt-c-tel a,#tab-kontakte .kt-c-mail a{color:var(--sc-muted);text-decoration:none}
#tab-kontakte .kt-c-tel a:hover,#tab-kontakte .kt-c-mail a:hover{color:var(--sc-lime-deep);text-decoration:underline}
#tab-kontakte .kt-stern{width:13px;height:13px;color:var(--sc-lime-deep);vertical-align:-2px}

/* ── Aufklapp-Detail: dieselbe Bauform wie bei den Kunden ────────────────── */
#tab-kontakte .kt-det{display:flex;flex-wrap:wrap;gap:var(--sc-2) var(--sc-6)}
#tab-kontakte .kt-det__z{display:inline-flex;align-items:center;gap:7px;min-width:0;
  font-size:var(--sc-t-sm);color:var(--sc-muted)}
#tab-kontakte .kt-det__z svg.lucide{flex:0 0 auto;width:13px;height:13px;color:var(--sc-faint)}
#tab-kontakte .kt-det__z a{color:var(--sc-muted);text-decoration:none;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}
#tab-kontakte .kt-det__z a:hover{color:var(--sc-lime-deep);text-decoration:underline}
#tab-kontakte .kt-det__z--leer{color:var(--sc-faint);font-style:italic}
/* Handy-Ergaenzungen: am Rechner tragen E-Mail und Kunde eigene Spalten und
   stuenden hier doppelt. Diese Zeile MUSS nach .kt-det__z stehen — dort steht
   display:inline-flex mit derselben Spezifitaet. */
#tab-kontakte .kt-det__z--mobil{display:none}
#tab-kontakte .kt-det__z--voll{flex:1 1 100%;align-items:flex-start}

/* ── Detailseite: Angaben als Raster, damit nichts in einer Spaltenwueste
      untergeht. Beschriftung ueber dem Wert wie im Formular. ─────────────── */
#tab-kontakte .kt-daten{display:grid;gap:var(--sc-3) var(--sc-5);
  grid-template-columns:repeat(auto-fill,minmax(210px,1fr))}
#tab-kontakte .kt-daten__lab{font-family:var(--sc-font-mono);font-size:var(--sc-t-xs);
  letter-spacing:.06em;text-transform:uppercase;color:var(--sc-faint);margin-bottom:2px}
#tab-kontakte .kt-daten__val{font-size:var(--sc-t-base);color:var(--sc-text);
  overflow-wrap:anywhere}
#tab-kontakte .kt-daten__val a{color:var(--sc-primary);text-decoration:none}
#tab-kontakte .kt-daten__val a:hover{text-decoration:underline}
#tab-kontakte .kt-notiz{margin-top:var(--sc-4);padding-top:var(--sc-3);
  border-top:1px solid var(--sc-line);font-size:var(--sc-t-base);color:var(--sc-text);
  white-space:pre-line}

/* ── Verlaufstabelle (Datenauskunft) ────────────────────────────────────── */
#tab-kontakte .kt-audit{min-width:660px}
#tab-kontakte .kt-a-zeit{width:180px;white-space:nowrap}
#tab-kontakte .kt-a-was{width:180px}
#tab-kontakte .kt-a-wer{width:130px}

/* ── Erfassen-Dialog. Steht im Modal, deshalb ohne #tab-Vorsatz. ─────────── */
.kt-weg{margin-bottom:var(--sc-4)}
.kt-drops{display:grid;grid-template-columns:1fr 1fr;gap:var(--sc-4)}
.kt-dropbox{display:flex;flex-direction:column;gap:var(--sc-2);min-width:0}
.kt-dropbox .sc-drop{margin:0;min-height:112px;word-break:break-word}
/* Gewaehlte Seite: durchgezogener Rahmen statt gestrichelt — der Unterschied
   „noch leer" / „liegt an" muss ohne Lesen erkennbar sein. */
.kt-dropbox .sc-drop.is-gefuellt{border-style:solid;border-color:var(--sc-lime-deep);
  background:var(--sc-ok-bg);color:var(--sc-ink)}
.kt-kamera{align-self:center;cursor:pointer}
.kt-dubletten{display:flex;flex-direction:column;gap:var(--sc-2);margin-top:var(--sc-2)}
.kt-dublette{display:flex;align-items:center;gap:var(--sc-2);flex-wrap:wrap;min-width:0}
.kt-dublette__n{font-weight:600;color:var(--sc-text)}

/* ══ Handy/Tablet (≤900 px): aus jeder Zeile wird ein Block. Reihenfolge:
      Name zuerst, darunter die Metazeile. Der Grundumbau (thead aus, tr auf
      Flex, data-lab als Beschriftung) steht in den gemeinsamen Regeln. ═══ */
@media (max-width:900px){
  /* Mindestbreiten ausdruecklich zuruecknehmen: sie stehen frueher in der Datei,
     haben aber dieselbe Spezifitaet — ohne diese Zeile blieb die Zeile 1100 px
     breit und die Liste rollte seitlich, statt zu stapeln (gemessen bei 390 px). */
  #tab-kontakte .kt-table,#tab-kontakte .kt-audit{min-width:0}
  #tab-kontakte .kt-c-name{flex:1 1 190px;order:1;min-width:0}
  #tab-kontakte .kt-c-art{flex:0 1 auto;order:2;width:auto;min-width:0}
  #tab-kontakte .kt-c-firma{flex:1 1 170px;order:3;width:auto;min-width:0}
  #tab-kontakte .kt-c-tel{flex:0 1 auto;order:4;width:auto;min-width:0}
  #tab-kontakte .kt-c-mail{flex:1 1 210px;order:5;width:auto;min-width:0;max-width:none}
  #tab-kontakte .kt-c-kunde{flex:0 1 auto;order:6;width:auto;min-width:0}
  #tab-kontakte .kt-c-akt{flex:1 1 100%;order:7;width:auto}
  #tab-kontakte .kt-c-akt .action-row{justify-content:flex-start}
  /* Name und Art brauchen keine Beschriftung: der Name steht fett und zuerst,
     die Art ist eine farbige Marke. Zwei Beschriftungszeilen weniger je Zeile. */
  #tab-kontakte .kt-table td.kt-c-name::before,
  #tab-kontakte .kt-table td.kt-c-art::before{display:none}
  #tab-kontakte tr.kt-detailzeile{padding:0;border-bottom:0}
  #tab-kontakte tr.kt-detailzeile>td{flex:1 1 100%;padding:var(--sc-4);
    border-radius:var(--sc-r-sm);margin-bottom:var(--sc-3)}
  /* Verlauf: Zeitpunkt und Vorgang nebeneinander, Details darunter. */
  #tab-kontakte .kt-a-zeit{flex:0 0 auto;width:auto}
  #tab-kontakte .kt-a-was{flex:0 0 auto;width:auto}
  #tab-kontakte .kt-a-wer{flex:0 0 auto;width:auto}
  #tab-kontakte .kt-audit>tbody>tr>td:last-child{flex:1 1 100%;min-width:0}
}

/* ══ Handy (≤560 px): nur noch, was zum Wiedererkennen und Anrufen noetig
      ist. E-Mail und Kunde wandern in die Detailzeile — sie stehen dort als
      .kt-det__z--mobil und sind am Rechner ausgeblendet. ═════════════════ */
@media (max-width:560px){
  #tab-kontakte .kt-c-mail,#tab-kontakte .kt-c-kunde{display:none}
  /* Schmale Grundbreite: mit 150 px rutschten die beiden Knoepfe in der
     aufgeklappten Zeile (die traegt zusaetzlich Innenabstand) in die zweite
     Zeile und standen dort links neben der Art-Marke. */
  #tab-kontakte .kt-c-name{flex:1 1 100px;order:1}
  #tab-kontakte .kt-c-akt{flex:0 0 auto;order:2;width:auto}
  /* Die Art-Marke beginnt IMMER eine eigene Zeile (flex-basis 100 %), sie
     stand sonst mal neben den Knoepfen und mal darunter — je nachdem, wie lang
     der Name war. Gemessen am 19.08.2026 bei 390 px: bei „Andrea
     Musterfrau-Langenscheidt" blieben der Namenszelle 101 px, der Name brach
     auf DREI Zeilen, und rechts daneben stand die Marke „Kunde" — die Zeile
     wirkte zerrissen. Ohne den Mitbewerber auf Zeile 1 bekommt der Name die
     volle Restbreite (157 statt 101 px) und braucht zwei statt drei Zeilen.
     Die Knoepfe bleiben ausdruecklich neben dem Namen (siehe Begruendung an
     .kt-c-name daruerber) — nur die Marke rutscht eine Zeile tiefer. */
  #tab-kontakte .kt-c-art{flex:1 1 100%;order:3;width:auto}
  #tab-kontakte .kt-c-firma{flex:1 1 100%;order:4}
  #tab-kontakte .kt-c-tel{flex:0 1 auto;order:5}
  #tab-kontakte .kt-det__z--mobil{display:inline-flex}
  /* Ohne Spaltenkopf traegt jede Zelle ihre Beschriftung. Bei diesen vieren
     ist sie ueberfluessig: der Name steht fett, die Art ist eine Marke,
     die Firma steht direkt darunter und eine Rufnummer erkennt man. Vier
     Beschriftungszeilen je Kontakt waeren bei 200 Kontakten der halbe Schirm. */
  #tab-kontakte .kt-table td.kt-c-name::before,#tab-kontakte .kt-table td.kt-c-art::before,
  #tab-kontakte .kt-table td.kt-c-firma::before,#tab-kontakte .kt-table td.kt-c-tel::before{display:none}
  .kt-drops{grid-template-columns:1fr}
  #tab-kontakte .kt-daten{grid-template-columns:1fr 1fr}
}

/* Die vier Erfassungswege duerfen im Modal umbrechen statt seitwaerts zu rollen.
   „Von Hand" ist der Rueckfallweg ohne KI und darf auf dem Handy nicht hinter
   einem Roller verschwinden — gemessen bei 390 px lag er ausserhalb. */
@media (max-width:620px){
  #kt-wege{flex-wrap:wrap;overflow:visible}
  #kt-wege .sc-tab{flex:1 1 auto;justify-content:center;
    padding-left:var(--sc-3);padding-right:var(--sc-3)}
}

/* Hier stand bis 19.08.2026 `@media (max-width:900px){ .tab-content{
   padding-bottom:96px } }` — reservierter Platz am Ende jedes Bereichs, damit
   der schwebende Knopf die unterste Zeile nicht verdeckt. Die Regel ist
   entfallen, weil der Knopf nicht mehr schwebt (siehe .hdr-plus). Sie hatte
   ohnehin nur den letzten Bildschirm geschuetzt und musste bei jedem neuen
   Rollbereich von Hand nachgezogen werden. Ohne sie endet jeder Bereich
   wieder mit dem normalen Innenabstand von <main>. */


/* ══════════════════════════════════════════════════════════════════════════
   SPEICHERPLATZ-VORGAENGE  ·  Unterbereich von „IT & Hosting" (18.08.2026)
   ══════════════════════════════════════════════════════════════════════════
   Plesk meldet einen vollen Speicher taeglich; die Liste zeigt EINEN Vorgang
   je Website. Bewusst NICHT erneut definiert, weil zentral vorhanden:
   .sc-table(*), .sc-tablewrap, .sc-card(*), .sc-band, .sc-kpi(*), .sc-pill(*),
   .sc-bar(*), .sc-note(*), .sc-empty(*), .sc-sec(*), .sc-dl(*), .sc-hint,
   .sc-num, .btn(*), .btn-icon(*), .sc-form/.sc-field, .sc-check.
   Kein Hex-Wert; jede Regel haengt an #tab-hosting. ────────────────────── */

#tab-hosting .sp-table{min-width:940px}
#tab-hosting .sp-c-stufe{width:120px}
#tab-hosting .sp-c-dom{min-width:220px}
#tab-hosting .sp-c-fuell{width:210px}
#tab-hosting .sp-c-meld{width:200px}
#tab-hosting .sp-c-status{width:190px}
#tab-hosting .sp-dom{font-weight:500;overflow-wrap:anywhere}
/* Die aufgeklappte Zeile und die Detailzeile faerbt die zentrale Regel weiter
   oben (Z. 2486 ff.) — deshalb hier NUR das, was ihr fehlt: Innenabstand und
   ein Hover, das die offene Zeile in Ruhe laesst. */
#tab-hosting tr.sp-zeile:not(.is-open):hover td{background:var(--sc-sunk)}
#tab-hosting tr.sp-detailzeile>td{padding:var(--sc-4) var(--sc-5)}
#tab-hosting tr.sp-detailzeile .sc-sec:last-of-type{margin-bottom:0}

/* „Kritisch" heisst: der Mailserver nimmt keine Post mehr an. Das darf man
   nicht uebersehen — deshalb traegt die Zeile zusaetzlich zur Statusmarke eine
   rote Kante. „handeln" bekommt bewusst KEINE, sonst schreit die ganze Liste.
   Kante als border, nicht als Schatten: den Schatten belegt die zentrale Regel
   fuer „aufgeklappt" — genau wie im Druckkatalog stehen beide nebeneinander. */
@media (min-width:901px){
  #tab-hosting tr.sp-zeile>td:first-child{border-left:3px solid transparent}
  #tab-hosting tr.sp-zeile[data-stufe="kritisch"]>td:first-child{border-left-color:var(--sc-bad)}
  #tab-hosting tr.sp-zeile[data-stufe="dringend"]>td:first-child{border-left-color:var(--sc-warn)}
}

/* Fuellstand: Zahl, Balken, Menge — untereinander, damit 20 Zeilen
   vergleichbar bleiben. Der Balken bringt eigene Abstaende mit, die hier
   auf Zeilenhoehe zusammengezogen werden. */
#tab-hosting .sp-fuell__z{font-weight:600}
#tab-hosting .sp-fuell .sc-bar{margin:var(--sc-1) 0}
#tab-hosting .sp-note--eng{margin:var(--sc-3) 0 0}
#tab-hosting .sp-fuss{margin:var(--sc-3) 0 0;font-size:var(--sc-t-sm)}
#tab-hosting .sp-erg{margin-top:var(--sc-3)}

/* Der Unterreiter traegt eine Erklaerzeile ueber der Liste; auf dem Handy
   kostet sie Platz, ohne etwas zu sagen, was nicht in der Zeile steht. */
@media (max-width:900px){
  #tab-hosting #sp-erklaerung{display:none}

  /* Gleiche Behandlung wie die uebrigen Listen: die Zeile wird zum Block,
     jede Zelle traegt ihre Beschriftung aus data-lab. */
  #tab-hosting .sp-table{min-width:0}
  #tab-hosting .sp-table thead{display:none}
  #tab-hosting .sp-table tr{display:flex;flex-wrap:wrap;align-items:flex-start;
    gap:var(--sc-2) var(--sc-3);padding:var(--sc-3) 0;
    border-bottom:1px solid var(--sc-line)}
  #tab-hosting .sp-table tr[hidden]{display:none}
  #tab-hosting .sp-table tr:last-child{border-bottom:0}
  #tab-hosting .sp-table>tbody>tr>td{border:0;padding:0;width:auto}
  #tab-hosting .sp-table td[colspan]{flex:1 1 100%}
  #tab-hosting .sp-table td[data-lab]::before{content:attr(data-lab);display:block;
    margin-bottom:3px;font-family:var(--sc-font-mono);font-size:var(--sc-t-xs);
    letter-spacing:.06em;text-transform:uppercase;color:var(--sc-faint)}
  /* Website und Stufe stehen zuoberst nebeneinander — beides braucht keine
     Beschriftung, eine Domain und eine Stufenmarke erklaeren sich selbst. */
  #tab-hosting .sp-table td.sp-c-dom::before,
  #tab-hosting .sp-table td.sp-c-stufe::before{display:none}
  #tab-hosting .sp-c-chev{flex:0 0 auto;order:0;width:auto}
  #tab-hosting .sp-c-dom{flex:1 1 150px;order:1;min-width:0}
  #tab-hosting .sp-c-stufe{flex:0 0 auto;order:2;width:auto}
  #tab-hosting .sp-c-fuell{flex:1 1 100%;order:3;width:auto}
  #tab-hosting .sp-c-meld{flex:1 1 150px;order:4;width:auto}
  #tab-hosting .sp-c-status{flex:1 1 100%;order:5;width:auto}
  /* Als Block traegt die Zeile keine Zellenraender mehr — die Stufe steht dann
     ohnehin als Marke direkt neben der Domain. Aufgeklappt/Detail faerbt auch
     hier die zentrale Regel (Z. 2512 ff.), nicht dieser Abschnitt. */
  #tab-hosting tr.sp-detailzeile{padding:0;border-bottom:0}
  /* Der Nullsetzer fuer Zellen (oben) ist spezifischer als die zentrale
     Detail-Regel — deshalb steht der Innenabstand des Detailkastens hier
     noch einmal ausdruecklich, sonst klebt der Inhalt am Rand. */
  #tab-hosting .sp-table>tbody>tr.sp-detailzeile>td{
    padding:var(--sc-3) var(--sc-4) var(--sc-4)}
  /* Entscheidungsknoepfe auf dem Handy voll breit — sie sind das Ziel der
     ganzen Ansicht und muessen mit dem Daumen sicher zu treffen sein. */
  #tab-hosting .sp-detailzeile .sc-sec__foot .btn,
  #tab-hosting .sp-detailzeile .sc-sec__foot .btn-icon-text{
    flex:1 1 100%;justify-content:center;min-height:44px}
}

/* ══════════════════════════════════════════════════════════════════════════
   KLEBENDE TABELLENKOEPFE, HUBWEIT (18.08.2026)

   Dennis: „Im gesamten Hub sollen die Tabellenkopfzeilen immer oben angedockt
   bleiben, wenn man in der Tabelle ist — wie bei Vertrieb/Plan-Einnahmen."

   Der Fallstrick, an dem eine naive Fassung scheitert: `position:sticky` klebt
   am naechsten ROLLENDEN Vorfahren. Unsere Tabellenhuellen (.sc-scroll,
   .sc-tablewrap) tragen fuer breite Tabellen overflow-x:auto — und ein
   Container mit overflow-x:auto bekommt laut Spezifikation automatisch auch
   overflow-y:auto. Der Kopf klebt dann an der Huelle, die senkrecht gar nicht
   rollt: sichtbarer Effekt gleich null. Deshalb muss die Huelle fuer klebende
   Koepfe auf overflow-x:visible.

   Daraus folgt der Zielkonflikt: eine Tabelle, die BREITER ist als ihre
   Huelle, braucht das waagerechte Rollen (samt Rollhinweis, Z. 3159). Also
   entscheidet scKleberKoepfe() in index.html je Huelle nachgemessen:
   passt die Tabelle hinein → Kopf klebt; passt sie nicht → alles bleibt wie
   es war. Die Klassen hier werden ausschliesslich von dort gesetzt.

   Erst ab 1000 px: darunter sind die Listen gestapelte Karten, ihr thead ist
   ausgeblendet — ein klebender Kopf waere dort sinnlos.
   ══════════════════════════════════════════════════════════════════════════ */
/* Rueckfallwerte, damit die Regeln auch gueltig sind, bevor der Helfer das
   erste Mal gemessen hat. Zur Laufzeit setzt scKleberKoepfe() --sc-kleber-top
   an :root und --sc-kleber-th an der jeweiligen Tabelle. */
:root{--sc-kleber-top:106px}
.sc-kleber{--sc-kleber-th:var(--sc-kleber-top)}

@media (min-width:1000px){
  /* Die drei bekannten Huellen ausdruecklich mit Klasse+Klasse (0,2,0), damit
     die Regel auch .plan-table-wrap{overflow-x:auto} aus dem <style> von
     index.html schlaegt — das steht in der Quelle NACH dieser Datei. */
  .sc-scroll.sc-kleber-huelle,
  .sc-tablewrap.sc-kleber-huelle,
  .plan-table-wrap.sc-kleber-huelle,
  .sc-kleber-huelle{overflow-x:visible}

  /* --sc-kleber-th setzt scKleberKoepfe() an der TABELLE (gemessen: Kopfleiste
     + Navigation, in den BWA-Bereichen zusaetzlich der Jahresfilter).
     --sc-kleber-top ist der gemeinsame Sockel an :root. Feste Pixel nur als
     letzte Rueckfallebene. */
  table.sc-kleber > thead > tr > th{
    position:sticky;top:var(--sc-kleber-th);
    z-index:80;background:var(--sc-paper);
    box-shadow:0 1px 0 var(--sc-line)}
  /* .sc-table th steht bewusst auf background:transparent (Z. 406, wegen des
     Rollhinweises). Ein klebender Kopf MUSS decken, sonst scheinen die Zeilen
     durch — das gilt nur fuer Tabellen, die ohnehin nicht rollen. */
}

/* ── Produktbilder an Angebotsposten ──────────────────────────────────────
   Bei Druck- und Werbeartikeln entscheidet der Anblick ueber die Bestellung:
   „Edelstahlflasche, 700 ml, Tampondruck" sagt niemandem, wie das Ding
   aussieht. Die Vorschau steht deshalb direkt am Posten, nicht in einem
   getrennten Anhang. */
.angx-pos-btns{display:flex;gap:var(--sc-2);flex-wrap:wrap;align-items:center}
.angx-pos-bilder{display:flex;gap:var(--sc-2);flex-wrap:wrap;margin-top:var(--sc-2)}
.angx-bild{position:relative;width:72px;height:72px;border:1px solid var(--sc-line);
  border-radius:var(--sc-r-sm);background:var(--sc-paper);overflow:hidden}
/* contain, nicht cover: eine hochkante Flasche darf nicht oben und unten
   abgeschnitten werden — man will das ganze Produkt sehen. */
.angx-bild img{width:100%;height:100%;object-fit:contain;padding:3px;cursor:zoom-in;
  display:block}
.angx-bild__weg{position:absolute;top:2px;right:2px;width:20px;height:20px;
  border:0;border-radius:50%;background:var(--sc-bad);color:var(--sc-on-dark);
  font-size:15px;line-height:1;cursor:pointer;opacity:0;transition:opacity .12s}
.angx-bild:hover .angx-bild__weg,.angx-bild:focus-within .angx-bild__weg{opacity:1}
.angx-bild--laedt{display:flex;align-items:center;justify-content:center;
  color:var(--sc-muted)}
.angx-bild--laedt svg{animation:sc-dreh 1s linear infinite}
@keyframes sc-dreh{to{transform:rotate(360deg)}}
/* Auf Touch gibt es kein Hover — der Loeschknopf muss immer sichtbar und
   gross genug sein. */
@media (hover:none) and (pointer:coarse){
  .angx-bild__weg{opacity:1;width:26px;height:26px}
  .angx-bild{width:84px;height:84px}
}

/* Grosse Ansicht */
#ang-bild-gross{position:fixed;inset:0;z-index:9500;display:none;
  align-items:center;justify-content:center;padding:var(--sc-5);
  background:rgba(0,0,0,.86);cursor:zoom-out}
#ang-bild-gross img{max-width:92vw;max-height:88vh;object-fit:contain;
  border-radius:var(--sc-r-md);background:var(--sc-paper)}
#ang-bild-gross .ang-bild-zu{position:absolute;top:calc(14px + env(safe-area-inset-top,0px));
  right:16px;width:44px;height:44px;border:0;border-radius:50%;
  background:rgba(255,255,255,.16);color:#fff;font-size:26px;line-height:1;cursor:pointer}

/* ── Produktbilder am DRUCKPRODUKT (Druckplanung) ─────────────────────────
   Andere Ebene als .angx-bild oben: dort haengt ein Bild an EINEM Angebot,
   hier am Produkt des Katalogs. Ein Bild, das hier liegt, erscheint an jeder
   Auflagen-Zeile desselben Produkts und in jedem kuenftigen Angebot — deshalb
   eigene Klassen und ein eigener, deutlich groesserer Kachelrahmen.

   Praefixe: .dr-bild* = in der Katalogtabelle, .pbk-* = Pflege-Fenster
   („ProduktBilder-Katalog"), .pbw-* = Auswahl beim Uebernehmen („…-Wahl"). */

/* Miniatur in der Produktspalte. Sie steht VOR dem Namen, weil man beim
   Ueberfliegen der 271 Zeilen am Bild schneller erkennt, worum es geht, als
   an „AOC-Mini-Taschenschirm FARE® Profile". contain wie ueberall: ein
   hochkanter Schirm darf nicht beschnitten werden. */
.dr-thumb{width:38px;height:38px;flex:0 0 auto;border:1px solid var(--sc-line);
  border-radius:var(--sc-r-sm);background:var(--sc-paper);object-fit:contain;
  padding:2px;cursor:zoom-in;display:block}
.dr-was-zeile{display:flex;align-items:center;gap:var(--sc-2);min-width:0}
/* Mit der ID davor, weil die Zeilenbegrenzung von .dr-was (Z. ~1791) ebenfalls
   unter #tab-druckplanung steht — ohne ID verliert die Regel und der lange
   Produktname schiebt die Miniatur aus der Spalte. */
#tab-druckplanung .dr-was-zeile > .dr-was{min-width:0}

/* Kamera-Knopf mit Anzahl-Marke. Der Knopf ist ein normaler .btn-icon (28 px,
   samt unsichtbarer 44-px-Zone auf Touch) — die Marke sitzt nur obendrauf und
   faengt keine Klicks ab, sonst waere die Mitte des Knopfes tot. */
.dr-bild-btn{position:relative}
.dr-bild-btn.hat-bilder{border-color:var(--sc-ok-line);background:var(--sc-ok-bg);
  color:var(--sc-ok)}
.dr-bild-btn__n{position:absolute;top:-5px;right:-5px;min-width:15px;height:15px;
  padding:0 3px;border-radius:var(--sc-r-pill);background:var(--sc-ok);
  color:var(--sc-on-dark);font-size:.62rem;font-weight:700;line-height:15px;
  text-align:center;pointer-events:none}

/* ── Pflege-Fenster ─────────────────────────────────────────────────────── */
/* Der Hinweis, dass hier das PRODUKT bebildert wird und nicht diese eine
   Zeile. Er steht ganz oben und nicht als Fussnote: wer ihn erst nach dem
   Hochladen liest, wundert sich, warum das Bild an fuenf Zeilen haengt. */
.pbk-hinweis{display:flex;gap:var(--sc-2);align-items:flex-start;
  background:var(--sc-info-bg);border:1px solid var(--sc-info-line);
  border-radius:var(--sc-r-sm);padding:var(--sc-3) var(--sc-4);
  font-size:var(--sc-t-base);color:var(--sc-text);margin-bottom:var(--sc-4)}
.pbk-hinweis svg.lucide{width:16px;height:16px;flex:0 0 auto;margin-top:1px;
  color:var(--sc-info)}

/* Kachelbreite ist nachgerechnet, nicht geschaetzt: in die Kachel muessen vier
   Knoepfe a 28 px nebeneinander passen. Am Rechner 4*28 + 3*6 Abstand = 130 px,
   plus 2*8 px Innenabstand = 146 px. Bei 132 px rutschte der Loeschknopf in eine
   zweite Reihe und stand allein unter den anderen dreien. */
.pbk-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));
  gap:var(--sc-3);margin-top:var(--sc-4)}
/* Auf Touch wachsen die Abstaende der .action-row auf 16 px (Trefferflaechen):
   4*28 + 3*16 = 160 px Inhalt, also 176 px Kachel. Darunter waere es wieder
   eine zweite Reihe — deshalb dort breitere Kacheln statt engerer Knoepfe. */
@media (hover:none) and (pointer:coarse){
  .pbk-grid{grid-template-columns:repeat(auto-fill,minmax(190px,1fr))}
  /* Nachgemessen auf 390 px: eine Kachel wird dort 310 px breit, und mit
     aspect-ratio:1 war das Bild 310 px hoch — EIN Produktbild fuellte den
     ganzen Bildschirm, bei vier Bildern scrollte man endlos. Feste Hoehe statt
     Seitenverhaeltnis; object-fit:contain zeigt das Produkt weiterhin ganz. */
  .pbk-kachel__bild{aspect-ratio:auto;height:150px}
}
.pbk-kachel{border:1px solid var(--sc-line);border-radius:var(--sc-r-md);
  background:var(--sc-paper);padding:var(--sc-2);display:flex;
  flex-direction:column;gap:var(--sc-2);position:relative}
/* Das Hauptbild fuehrt die Tabelle und das Angebot an — das darf man sehen. */
.pbk-kachel.ist-haupt{border-color:var(--sc-lime-deep);
  box-shadow:0 0 0 1px var(--sc-lime-deep) inset}
.pbk-kachel__bild{width:100%;aspect-ratio:1;object-fit:contain;cursor:zoom-in;
  background:var(--sc-sunk);border-radius:var(--sc-r-sm);display:block}
.pbk-kachel__marke{position:absolute;top:var(--sc-2);left:var(--sc-2);
  display:inline-flex;align-items:center;gap:3px;padding:1px 7px;
  border-radius:var(--sc-r-pill);background:var(--sc-lime);color:var(--sc-ink);
  font-size:.66rem;font-weight:700}
.pbk-kachel__marke svg.lucide{width:11px;height:11px}
/* .action-row bringt den Touch-Mindestabstand von 16 px mit (sc-design.css,
   Abschnitt „Trefferflaechen"). Umbrechen erlaubt: auf 390 px ist die Kachel
   schmaler als vier Knoepfe samt diesem Abstand — lieber zwei Reihen als ein
   abgeschnittener Loeschknopf. */
.pbk-kachel .action-row{flex-wrap:wrap;justify-content:center;width:100%}
.pbk-kachel__griff{cursor:grab}
.pbk-kachel.wird-gezogen{opacity:.4}
.pbk-kachel.ziel-links{box-shadow:-3px 0 0 var(--sc-lime-deep)}
.pbk-kachel.ziel-rechts{box-shadow:3px 0 0 var(--sc-lime-deep)}

/* ── Auswahl beim Uebernehmen ins Angebot ────────────────────────────────
   Bild-Kaestchen: Kaestchen links, Bild rechts — dieselbe Leserichtung wie
   bei jeder anderen Auswahl im Hub (.sc-check). */
.pbw-liste{display:flex;gap:var(--sc-3);flex-wrap:wrap;margin-top:var(--sc-2)}
/* Im Wizard steht die Auswahl in einer .angw-liste-row (flex, wrap) — mit
   voller Basis bekommt sie eine eigene Zeile unter dem Produkt statt sich
   neben die Mengenauswahl zu quetschen. */
.pbw-huelle{flex:1 1 100%}
.pbw-huelle:empty{display:none}
.pbw-kachel{border:1px solid var(--sc-line);border-radius:var(--sc-r-sm);
  padding:var(--sc-2);gap:var(--sc-2);background:var(--sc-paper)}
.pbw-kachel img{width:52px;height:52px;object-fit:contain;display:block;
  background:var(--sc-sunk);border-radius:4px}
.pbw-kachel:has(input:checked){border-color:var(--sc-lime-deep);
  background:var(--sc-primary-bg)}

/* ── Rueckweg: Angebotsbild in den Druckkatalog ──────────────────────────
   Zweiter Knopf auf der 72-px-Kachel. Er sitzt in der GEGENUEBERLIEGENDEN
   Ecke zum Loeschknopf (unten links statt oben rechts) — die beiden 26-px-
   Flaechen auf Touch beruehren sich damit nicht einmal. */
.angx-bild__kat{position:absolute;bottom:2px;left:2px;width:20px;height:20px;
  display:inline-flex;align-items:center;justify-content:center;
  border:0;border-radius:50%;background:var(--sc-primary);color:var(--sc-on-dark);
  cursor:pointer;opacity:0;transition:opacity .12s;padding:0}
.angx-bild__kat svg.lucide{width:12px;height:12px}
.angx-bild:hover .angx-bild__kat,.angx-bild:focus-within .angx-bild__kat{opacity:1}
/* Bilder, die schon aus dem Katalog stammen, bekommen KEINEN Knopf, sondern
   eine stille Marke — sonst legt man dasselbe Bild ein zweites Mal ab. */
.angx-bild__ist{position:absolute;bottom:2px;left:2px;width:16px;height:16px;
  display:inline-flex;align-items:center;justify-content:center;
  border-radius:50%;background:var(--sc-lime);color:var(--sc-ink);
  pointer-events:none}
.angx-bild__ist svg.lucide{width:10px;height:10px}
@media (hover:none) and (pointer:coarse){
  .angx-bild__kat{opacity:1;width:26px;height:26px}
  .angx-bild__kat svg.lucide{width:14px;height:14px}
}

/* ── Angebotsposten umsortieren: Anfasser, Ziehen, Pfeilknoepfe ────────────
   Warum ein eigener Anfasser und nicht „ganze Karte ziehbar": in der Karte
   stehen Eingabefelder. Wer den Titel markieren will, darf dabei nicht aus
   Versehen den Posten verschieben. Gezogen wird deshalb NUR am Griff.

   Zur Kaskade: die uebrigen .angx-pos-Regeln stehen im <style>-Block von
   index.html, der NACH dieser Datei geladen wird. Eine Ein-Klassen-Regel
   .angx-pos--zieht wuerde dort gegen .angx-pos verlieren (gleiche
   Spezifitaet, spaeter im Dokument). Deshalb doppelt geschrieben:
   .angx-pos.angx-pos--zieht — das gewinnt unabhaengig von der Reihenfolge. */

.angx-griff{cursor:grab;color:var(--sc-muted);background:var(--sc-mist);
  border-color:var(--sc-line-strong);
  /* touch-action:none ist der Kern der Handy-Tauglichkeit: ohne das rollt
     der Browser die Seite, statt den Posten zu ziehen. Wird beim ersten
     Fingerkontakt ausgewertet, gilt also fuer die ganze Zieh-Geste. */
  touch-action:none;-webkit-user-select:none;user-select:none;
  -webkit-touch-callout:none}
.angx-griff:hover{background:var(--sc-primary-bg);color:var(--sc-primary);
  border-color:var(--sc-primary-line)}
.angx-griff:active{cursor:grabbing}
/* Der Griff ist tastaturbedienbar — der Fokus muss man sehen. */
.angx-griff:focus-visible{outline:2px solid var(--sc-primary);outline-offset:2px}

/* Die gezogene Karte: blass und gestrichelt. Sie bleibt an genau der Stelle
   liegen, an der der Posten landen wuerde — dadurch ist „was ziehe ich" (der
   Chip am Zeiger) und „wohin faellt es" (die gestrichelte Luecke) getrennt
   erkennbar, ohne dass ein zweites Platzhalter-Element noetig waere. */
.angx-pos.angx-pos--zieht{opacity:.5;border:2px dashed var(--sc-primary);
  background:var(--sc-primary-bg);box-shadow:none}
.angx-pos.angx-pos--zieht *{pointer-events:none}

/* Kurz aufleuchten, nachdem ein Posten per Tastatur oder Pfeilknopf gesprungen
   ist — sonst uebersieht man die Bewegung. */
@keyframes ang-pos-gelandet{from{background:var(--sc-primary-bg)}to{background:var(--sc-sunk)}}
.angx-pos.angx-pos--gelandet{animation:ang-pos-gelandet .9s var(--sc-ease)}

/* Das Etikett am Zeiger: zeigt, WAS gerade wandert. */
#ang-zieh-chip{position:fixed;left:0;top:0;z-index:9600;pointer-events:none;
  display:flex;align-items:center;gap:var(--sc-2);max-width:min(52vw,420px);
  padding:6px 10px;border-radius:var(--sc-r-pill);
  background:var(--sc-ink);color:var(--sc-on-dark);
  font-size:var(--sc-t-sm);font-weight:600;box-shadow:var(--sc-sh-3)}
#ang-zieh-chip .ang-zieh-chip__nr{font-family:var(--sc-font-mono);
  color:var(--sc-lime);flex:0 0 auto}
#ang-zieh-chip .ang-zieh-chip__t{overflow:hidden;text-overflow:ellipsis;
  white-space:nowrap}
body.ang-zieht{-webkit-user-select:none;user-select:none;cursor:grabbing}

/* Pfeilknoepfe: der zweite Weg. Am Schreibtisch bleiben sie weg (Griff +
   Tastatur reichen, der Kartenkopf ist ohnehin voll); auf schmalen Geraeten
   sind sie der zuverlaessigere Weg, weil man bei 29 Posten sonst mit dem
   Finger ueber eine halbe Bildschirmhoehe zielen muesste. */
.angx-pos-rueck{display:none;gap:var(--sc-1);flex:0 0 auto}
.angx-pos-rueck .btn-icon:disabled{opacity:.3;cursor:default}
@media (max-width:760px){
  .angx-pos-rueck{display:inline-flex}
}

/* Nur fuer Screenreader — die Ansage „Posten 3 von 29" darf niemanden stoeren,
   muss aber vorgelesen werden. */
.sc-nur-sr{position:absolute;width:1px;height:1px;margin:-1px;padding:0;
  overflow:hidden;clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;
  border:0}

/* Sortier-Modus: waehrend des Ziehens klappen ALLE Postenkarten auf ihren
   Kopf zusammen. Ausgeklappt ist eine Karte rund 350 px hoch — um einen
   Posten einen einzigen Platz nach unten zu schieben, muesste man sonst eine
   halbe Bildschirmhoehe weit ziehen. Zusammengeklappt passen viele Posten auf
   einen Blick, und man sortiert die Struktur statt der Details.
   display:none loescht keine Eingaben — die Felder sind nur unsichtbar. */
#ang-list-posten.ang-sortiermodus .angx-pos-grid,
#ang-list-posten.ang-sortiermodus .angx-pos-foot{display:none}
#ang-list-posten.ang-sortiermodus .angx-pos{margin-bottom:var(--sc-2)}
/* Beim Sortieren zaehlt nur Nummer + Titel + Summe. Status, Muelltonne und
   die Pfeilknoepfe verschwinden solange — auf 390 px spart das dem Kartenkopf
   eine ganze Zeile, und man kann waehrend des Ziehens ohnehin nichts davon
   treffen. */
#ang-list-posten.ang-sortiermodus .angx-pos-head [data-k="status"],
#ang-list-posten.ang-sortiermodus .angx-pos-head .btn-icon-danger,
#ang-list-posten.ang-sortiermodus .angx-pos-rueck{display:none}

/* Auf dem Touchscreen brauchen „hoch" und „runter" Abstand voneinander —
   sonst schiebt man den Posten in die falsche Richtung. Gleicher Wert wie
   bei den uebrigen Knopfreihen im Hub. */
@media (hover:none) and (pointer:coarse){
  .angx-pos-rueck{gap:10px}
}

/* ══════════════════════════════════════════════════════════════════════════
   RUNDMAIL: VORBEREITEN, EINPLANEN, VORLAGEN, KI  (18.08.2026)

   Dennis: „Rundmails vorbereiten und speichern koennen. Und dann mit der
   Option, diese zu einer bestimmten Zeit erst zu versenden."

   Die Gestaltungsfrage dahinter ist nicht „wo kommt der Knopf hin", sondern:
   wie unterscheidet man auf einen Blick JETZT SENDEN von NUR ABLEGEN von
   SPAETER SENDEN? Drei gleich aussehende Knoepfe waeren die naheliegende und
   die falsche Antwort — der Nutzer muesste die Bedeutung jedes Mal aus drei
   aehnlichen Beschriftungen neu herleiten, und der folgenreichste Knopf saehe
   aus wie die beiden harmlosen.

   Deshalb hier die Trennung nach ART der Handlung:
     · Speichern ist harmlos und JEDERZEIT moeglich  -> Umriss-Knopf, links
       bei den anderen harmlosen Dingen (Vorschau, Test).
     · Der Zeitpunkt ist eine ENTSCHEIDUNG -> gehoert in ein Feld, nicht in
       einen Knopf. Zwei Radios „Sofort" / „Zu einem Zeitpunkt".
     · Senden ist EINE folgenreiche Handlung -> genau EIN gruener Knopf,
       abgesetzt rechts. Seine Beschriftung sagt die Folge an:
       „Rundmail senden" bzw. „Fuer 24.12.2026, 09:00 einplanen".
   So gibt es nie zwei gruene Knoepfe nebeneinander, und der eine sagt vorher,
   was gleich passiert.
   ══════════════════════════════════════════════════════════════════════════ */

/* Der Zeitpunkt-Block. Eingelassen (sunk), damit er als Entscheidungsfeld
   lesbar ist und nicht als weitere Knopfreihe. */
.nl-plan{background:var(--sc-sunk);border:1px solid var(--sc-line);
  border-radius:var(--sc-r-md);padding:var(--sc-3);margin-top:var(--sc-3)}
.nl-plan__wahl{display:flex;gap:var(--sc-4);flex-wrap:wrap;align-items:center}
/* Die Datumsfelder erscheinen erst, wenn „Zu einem Zeitpunkt" gewaehlt ist —
   vorher waeren sie zwei leere Felder ohne Bedeutung. */
.nl-plan__wann{display:none;margin-top:var(--sc-3);padding-top:var(--sc-3);
  border-top:1px solid var(--sc-line)}
.nl-plan.is-geplant .nl-plan__wann{display:block}
.nl-plan__wann .sc-form{gap:var(--sc-3) var(--sc-4)}
/* Klartext-Echo unter den Feldern: „Wird am Mittwoch, 24.12.2026 um 09:00
   versendet." Ein Datumsfeld allein beantwortet nicht, ob der Termin in der
   Zukunft liegt. */
.nl-plan__echo{font-size:var(--sc-t-sm);color:var(--sc-muted);margin-top:var(--sc-2)}
.nl-plan__echo.is-bad{color:var(--sc-bad);font-weight:600}

/* Kopfzeile im Composer: welcher Entwurf gerade bearbeitet wird. Ohne das
   weiss man nach dem Oeffnen eines Entwurfs nicht, ob „Speichern" den alten
   ueberschreibt oder einen neuen anlegt. */
.nl-akt{display:flex;align-items:center;gap:var(--sc-2);flex-wrap:wrap;
  margin-bottom:var(--sc-3)}
.nl-akt__txt{font-size:var(--sc-t-sm);color:var(--sc-muted)}

/* Vorlagen-Leiste: Auswahl + Speichern in einer Zeile ueber dem Betreff. */
.nl-vorl{display:flex;align-items:center;gap:var(--sc-2);flex-wrap:wrap;
  margin-bottom:var(--sc-3)}
.nl-vorl select{padding:8px 11px;font-size:var(--sc-t-base);
  border:1px solid var(--sc-line-strong);border-radius:var(--sc-r-sm);
  background:var(--sc-paper);color:var(--sc-text);min-height:38px;max-width:100%}

/* ── KI-Ergebnis: zeigen, dann uebernehmen ────────────────────────────────
   Nie ungefragt in den Editor schreiben. Der Vorschlag steht in einem
   eigenen, abgesetzten Kasten und ist vor dem Uebernehmen nachbearbeitbar. */
.sc-ki-erg{margin-top:var(--sc-3);border:1px solid var(--sc-primary-line);
  border-radius:var(--sc-r-md);background:var(--sc-primary-bg);padding:var(--sc-3)}
.sc-ki-erg__lab{font-size:var(--sc-t-sm);font-weight:600;color:var(--sc-primary);
  margin-bottom:var(--sc-2);display:flex;align-items:center;gap:6px}
.sc-ki-erg textarea,.sc-ki-erg input{width:100%;box-sizing:border-box;
  border:1px solid var(--sc-line-strong);border-radius:var(--sc-r-sm);
  padding:9px 11px;font-size:var(--sc-t-base);background:var(--sc-paper);
  color:var(--sc-text);resize:vertical}
.sc-ki-erg textarea+.sc-ki-erg__lab{margin-top:var(--sc-3)}
/* Warnung, wenn vorhandener Text ersetzt wird — sonst ist der eigene Text
   nach dem Uebernehmen ohne Vorwarnung weg. */
.sc-ki-warn{font-size:var(--sc-t-sm);color:var(--sc-warn);margin-top:var(--sc-2);
  display:flex;align-items:flex-start;gap:6px}
.sc-ki-status{font-size:var(--sc-t-sm);color:var(--sc-faint);margin-top:var(--sc-2);
  min-height:1.2em}
/* Beispiel-Anweisungen zum Anklicken: senkt die Huerde, ueberhaupt
   anzufangen — ein leeres Textfeld beantwortet nicht, was man reinschreibt. */
.sc-ki-bsp{display:flex;flex-wrap:wrap;gap:var(--sc-2);margin-top:var(--sc-2)}
.sc-ki-bsp button{border:1px dashed var(--sc-line-strong);background:transparent;
  color:var(--sc-muted);border-radius:var(--sc-r-pill);padding:6px 12px;
  font-size:var(--sc-t-sm);cursor:pointer;font-family:inherit;min-height:32px}
.sc-ki-bsp button:hover{border-color:var(--sc-primary);color:var(--sc-primary);
  background:var(--sc-primary-bg);border-style:solid}

/* ── Aenderungs-Vorschau (KI am Angebot): alt gegen neu ───────────────────
   Die Route liefert aenderungen[] mit alt/neu. Ein blosses „12 Aenderungen"
   ist keine Abnahme — man muss sehen, WAS sich aendert, sonst hakt man
   blind ab. Alt durchgestrichen und gedaempft, neu in Volltonfarbe. */
.sc-diff{display:flex;flex-direction:column;gap:var(--sc-2);margin-top:var(--sc-2)}
.sc-diff__item{border:1px solid var(--sc-line);border-radius:var(--sc-r-sm);
  background:var(--sc-paper);padding:var(--sc-3)}
.sc-diff__kopf{display:flex;align-items:baseline;gap:var(--sc-2);flex-wrap:wrap;
  margin-bottom:var(--sc-2)}
.sc-diff__feld{font-size:var(--sc-t-sm);font-weight:600;color:var(--sc-text)}
.sc-diff__was{font-size:var(--sc-t-sm);color:var(--sc-muted)}
.sc-diff__zeile{display:flex;gap:var(--sc-2);align-items:flex-start;
  font-size:var(--sc-t-base);line-height:1.5}
.sc-diff__marke{flex:0 0 auto;font-family:var(--sc-font-mono);
  font-size:var(--sc-t-xs);width:2.4em}
.sc-diff__alt{color:var(--sc-faint);text-decoration:line-through;
  text-decoration-color:var(--sc-bad);min-width:0;overflow-wrap:anywhere}
.sc-diff__neu{color:var(--sc-text);font-weight:500;min-width:0;
  overflow-wrap:anywhere}
.sc-diff__alt-marke{color:var(--sc-bad)}
.sc-diff__neu-marke{color:var(--sc-ok)}
/* Reine Ergaenzung (kein alter Wert): die leere „alt"-Zeile faellt weg. */
.sc-diff__item--neu .sc-diff__zeile--alt{display:none}
.sc-diff__leer{color:var(--sc-faint);font-style:italic}

/* ══════════════════════════════════════════════════════════════════════════
   DIALOG UEBER DEM ANGEBOTS-VOLLBILD  (18.08.2026)

   Der Angebots-Editor ist ein Vollbild-Overlay auf z-index 8500. Das
   Haus-Modal (#modal-backdrop) liegt auf 300 und waere damit UNTER dem
   Editor unsichtbar — deshalb bringen die Editor-Dialoge ihre eigene Huelle
   auf 9000 mit (unter scConfirm 9500 und den Toasts 10000, das ist die
   richtige Reihenfolge: eine Rueckfrage muss ueber ihrem Dialog liegen).

   Bisher stand diese Huelle als cssText an drei Stellen im JavaScript. Hier
   als Klasse, damit Layout wieder aus dem Stylesheet kommt.
   ══════════════════════════════════════════════════════════════════════════ */
.angx-dlg{position:fixed;inset:0;background:var(--sc-backdrop);z-index:9000;
  display:flex;align-items:center;justify-content:center;padding:var(--sc-4)}
.angx-dlg__box{background:var(--sc-paper);color:var(--sc-text);
  border-radius:var(--sc-r-lg);box-shadow:var(--sc-sh-3);
  padding:var(--sc-5) var(--sc-6);width:720px;max-width:96vw;
  max-height:min(90vh,90dvh);overflow-y:auto}
.angx-dlg__box h3{margin:0 0 6px;font-size:var(--sc-t-lg);display:flex;
  align-items:center;gap:8px;flex-wrap:wrap}
.angx-dlg__box h3 .hint{font-weight:400;color:var(--sc-faint);
  font-size:var(--sc-t-sm)}
.angx-dlg__lead{color:var(--sc-faint);font-size:var(--sc-t-base);
  margin:0 0 var(--sc-3);line-height:1.5}
.angx-dlg__box--breit{width:820px}

/* ── Gueltigkeits-Fristen am Angebot ──────────────────────────────────────
   Kleine Schnellwahl unter „Gueltig bis". Gerechnet wird ab dem Angebots-
   datum, nicht ab heute — deshalb steht „ab Datum:" davor. */
.ang-frist{display:flex;align-items:center;gap:var(--sc-2);flex-wrap:wrap;margin-top:6px}
.ang-frist__lab{font-size:var(--sc-t-xs);color:var(--sc-faint)}
.sc-chip--klein{padding:3px 10px;font-size:var(--sc-t-xs);min-height:0}

/* ── Produktbilder im Bearbeiten-Fenster ──────────────────────────────────
   Hochladen und Ansehen direkt am Produkt; Sortieren/Hauptbild/Loeschen im
   grossen Fenster. Die flache Ablegeflaeche, damit das Formular nicht zerreisst. */
.sc-drop--flach{padding:var(--sc-3) var(--sc-4);min-height:0}
.sc-drop--flach i{width:20px;height:20px}
/* Lucide ersetzt das <i> durch ein <svg class="lucide"> — die Regel darueber
   greift danach nicht mehr, und .sc-drop svg.lucide (28 px + Abstand darunter)
   macht aus dem flachen Streifen wieder einen Kasten. Deshalb hier nochmal. */
.sc-drop--flach svg.lucide{width:20px;height:20px;margin-bottom:0;
  vertical-align:-4px;margin-right:6px}
.dm-bilder{margin-top:var(--sc-4)}
.dm-bild-strip{display:flex;flex-wrap:wrap;gap:var(--sc-2);align-items:center;margin-top:var(--sc-3)}
.dm-bild{position:relative;width:56px;height:56px;border-radius:var(--sc-r-sm);
  border:1px solid var(--sc-line);overflow:hidden;background:var(--sc-app-bg);flex:0 0 auto}
.dm-bild img{width:100%;height:100%;object-fit:cover;display:block}
.dm-bild.ist-haupt{border-color:var(--sc-lime-deep);box-shadow:0 0 0 2px var(--sc-lime)}
.dm-bild.ist-haupt i{position:absolute;right:2px;bottom:2px;width:13px;height:13px;
  color:var(--sc-lime-deep);background:var(--sc-paper);border-radius:50%;padding:1px}
.dm-bild-mehr{margin-left:auto}
@media (max-width:560px){ .dm-bild-mehr{margin-left:0;width:100%} }

/* ── Angebots-Verlauf ─────────────────────────────────────────────────────
   Senkrechte Zeitleiste, aelteste Aenderung oben. Die Linie laeuft durch die
   Punkte, endet aber am letzten Eintrag (kein ins Leere laufender Strich). */
.angv{list-style:none;margin:0;padding:0;position:relative}
.angv__z{display:flex;gap:var(--sc-3);padding:0 0 var(--sc-4);position:relative}
.angv__z::before{content:"";position:absolute;left:11px;top:24px;bottom:0;
  width:2px;background:var(--sc-line)}
.angv__z:last-child{padding-bottom:0}
.angv__z:last-child::before{display:none}
.angv__punkt{flex:0 0 24px;width:24px;height:24px;border-radius:50%;
  background:var(--sc-app-bg);border:2px solid var(--sc-line);
  display:flex;align-items:center;justify-content:center;color:var(--sc-lime-deep);
  position:relative;z-index:1}
.angv__punkt svg{width:13px;height:13px}
.angv__inhalt{min-width:0;flex:1 1 auto;padding-top:1px}
.angv__kopf{display:flex;gap:var(--sc-3);align-items:baseline;flex-wrap:wrap}
.angv__zeit{color:var(--sc-faint);font-size:var(--sc-t-sm);
  font-family:var(--sc-font-mono);white-space:nowrap}
.angv__meta{display:flex;gap:var(--sc-3);flex-wrap:wrap;
  color:var(--sc-muted);font-size:var(--sc-t-sm);margin-top:2px}
.angv__det{margin:var(--sc-2) 0 0;padding-left:var(--sc-4);
  color:var(--sc-muted);font-size:var(--sc-t-sm);line-height:1.55}
/* Rekonstruiert = nicht protokolliert, sondern aus einem Zeitstempel am Angebot
   abgeleitet. Muss unterscheidbar sein, sonst wirkt der Verlauf vollstaendiger
   als er ist — Altangebote haben ausschliesslich solche Zeilen. */
.angv__z--rek .angv__punkt{border-style:dashed;color:var(--sc-faint)}
.angv__rek{font-style:italic;color:var(--sc-faint)}
@media (max-width:560px){
  .angv__kopf{gap:2px}
  .angv__zeit{flex:1 1 100%}
}
/* Die Knopfzeile bleibt beim Rollen sichtbar — bei 12 Aenderungen scrollt
   man sonst an „Uebernehmen" vorbei und findet es nicht wieder (gleiche
   Ueberlegung wie bei den iOS-Modals). */
.angx-dlg__box .sc-modal-actions{position:sticky;bottom:0;
  background:var(--sc-paper);margin-bottom:calc(var(--sc-5) * -1);
  padding-bottom:var(--sc-4)}

@media (max-width:560px){
  .angx-dlg{padding:var(--sc-2)}
  .angx-dlg__box{padding:var(--sc-4);max-height:min(94vh,94dvh)}
  /* Trefferflaechen: im Dialog wird abgehakt und uebernommen, da darf kein
     Knopf unter 44 px liegen. */
  .angx-dlg__box .sc-modal-actions .btn{min-height:44px;flex:1 1 auto;
    justify-content:center}
  .sc-ki-bsp button{min-height:40px}
}

/* Auf schmal bekommt der folgenreiche Knopf im Composer eine eigene Zeile,
   damit er nicht neben „Test senden" gequetscht steht. */
@media (max-width:700px){
  .nl-plan__wahl{gap:var(--sc-2)}
  .nl-plan__wahl .sc-check{flex:1 1 100%;min-height:44px}
  .nl-vorl select{flex:1 1 100%}
  .nl-vorl .btn{flex:1 1 auto;justify-content:center;min-height:44px}
}

/* ══════════════════════════════════════════════════════════════════════════
   ANGEBOTS-BOT: UEBER PREISE SPRECHEN  (18.08.2026)

   Dennis: „Ich haette schon gerne, dass ich mit dem Angebots-Bot die Preise
   besprechen kann. Man kann ja sowas bauen, dass er die Preise nur nach
   wirklicher Zustimmung setzt."

   Sobald die KI auch Preise anfassen darf, ist die Vorschau nicht mehr
   Beiwerk, sondern das eigentliche Sicherheitsnetz. Drei Vorkehrungen:

   1. TRENNUNG. Preisaenderungen stehen in einem eigenen, hervorgehobenen
      Block ueber den Textaenderungen. Wer zehn Formulierungen ueberfliegt,
      uebersieht sonst die 300 EUR, die dabei dazugekommen sind.
   2. ZUSTIMMUNG EINZELN. Jede Aenderung hat ihr eigenes Kaestchen.
      Textaenderungen duerfen vorangekreuzt sein — Preisaenderungen NIE.
      Gleiche Regel wie bei den Loeschvorschlaegen im DNS-Assistenten:
      was Geld oder Bestand aendert, wird aktiv angehakt, nicht weggeklickt.
   3. WIRKUNG AUFS GANZE. Ueber den Knoepfen steht die Angebotssumme jetzt
      und nach Uebernahme der angehakten Punkte. Eine einzelne Zeile sagt
      nichts darueber, wo das Angebot am Ende landet.
   ══════════════════════════════════════════════════════════════════════════ */

/* ── Gespraechsverlauf ────────────────────────────────────────────────────
   „Besprechen" heisst mehrere Runden. Der Bot darf widersprechen, deshalb
   gehoert seine Antwort sichtbar in den Verlauf und nicht in eine Statuszeile,
   die beim naechsten Schritt ueberschrieben wird. */
.sc-chat{display:flex;flex-direction:column;gap:var(--sc-3);margin-bottom:var(--sc-3);
  max-height:34vh;overflow-y:auto;padding-right:var(--sc-1)}
.sc-chat:empty{display:none}
.sc-chat__zeile{display:flex;gap:var(--sc-2);align-items:flex-start}
.sc-chat__zeile--du{flex-direction:row-reverse}
.sc-chat__bubble{max-width:82%;padding:9px 13px;border-radius:var(--sc-r-md);
  font-size:var(--sc-t-base);line-height:1.5;white-space:pre-wrap;
  overflow-wrap:anywhere}
.sc-chat__zeile--du .sc-chat__bubble{background:var(--sc-ink);color:var(--sc-on-dark);
  border-bottom-right-radius:var(--sc-1)}
.sc-chat__zeile--bot .sc-chat__bubble{background:var(--sc-sunk);color:var(--sc-text);
  border:1px solid var(--sc-line);border-bottom-left-radius:var(--sc-1)}
.sc-chat__wer{font-size:var(--sc-t-xs);color:var(--sc-faint);margin-bottom:3px;
  text-transform:uppercase;letter-spacing:.04em}

/* ── Gruppenkoepfe in der Aenderungsliste ─────────────────────────────────── */
.sc-diff__gruppe{display:flex;align-items:center;gap:var(--sc-2);flex-wrap:wrap;
  margin:var(--sc-4) 0 var(--sc-2);font-size:var(--sc-t-sm);font-weight:600;
  color:var(--sc-text)}
.sc-diff__gruppe .btn-link{background:none;border:0;color:var(--sc-primary);
  font-size:var(--sc-t-sm);cursor:pointer;text-decoration:underline;padding:4px;
  font-family:inherit;margin-left:auto;min-height:32px}

/* Jede Aenderung mit eigenem Kaestchen. Das Kaestchen sitzt IM Label
   (sc-check-Regel), Text rechts daneben — nie ein schwebendes Kaestchen. */
.sc-diff__item{display:block}
/* Klasse+Klasse (0,2,0): .sc-check{align-items:center} steht im <style> von
   index.html und damit NACH dieser Datei — bei gleicher Spezifitaet wuerde es
   gewinnen und diese Regeln liefen wirkungslos ins Leere. */
.sc-check.sc-diff__wahl{display:flex;align-items:flex-start;gap:var(--sc-2);
  cursor:pointer;margin-bottom:var(--sc-2)}
.sc-check.sc-diff__wahl input[type=checkbox]{width:18px;height:18px;margin:1px 0 0;
  flex:0 0 auto;cursor:pointer}
/* Trefferflaeche: die ganze Kopfzeile schaltet mit, nicht nur 18 px Kaestchen. */
.sc-check.sc-diff__wahl .sc-diff__kopf{margin-bottom:0;flex:1;min-width:0}

/* Preisaenderungen: eigener Rahmen, warmer Grund, damit sie aus der Liste
   herausstechen. Unangekreuzt sind sie zusaetzlich gedaempft — der Blick
   bleibt an dem haengen, was man aktiv zugelassen hat. */
.sc-diff__item--preis{border-color:var(--sc-warn-line);background:var(--sc-warn-bg)}
.sc-diff__item--preis .sc-diff__feld{color:var(--sc-warn)}
.sc-diff__item--aus{opacity:.6}

/* Betragswechsel gross und in Zahlenschrift — das ist die Information, auf
   die es bei einer Preisaenderung ankommt. */
.sc-diff__geld{display:flex;align-items:center;gap:var(--sc-2);flex-wrap:wrap;
  font-family:var(--sc-font-mono);font-size:var(--sc-t-md);margin-top:var(--sc-2)}
.sc-diff__geld .alt{color:var(--sc-faint);text-decoration:line-through}
.sc-diff__geld .neu{font-weight:700;color:var(--sc-text)}
.sc-diff__geld .delta{font-weight:700;padding:2px 8px;border-radius:var(--sc-r-pill);
  font-size:var(--sc-t-sm)}
.sc-diff__geld .delta--hoch{background:var(--sc-bad-bg);color:var(--sc-bad)}
.sc-diff__geld .delta--runter{background:var(--sc-ok-bg);color:var(--sc-ok)}

/* Herkunft eines Preises: Katalogzeile, Stundensatz-Rechnung oder Schaetzung.
   Eine Schaetzung ist etwas grundlegend anderes als eine Katalogzeile und
   muss als solche erkennbar sein. */
.sc-herkunft{display:inline-flex;align-items:center;gap:4px;font-size:var(--sc-t-xs);
  padding:2px 8px;border-radius:var(--sc-r-pill);background:var(--sc-mist);
  color:var(--sc-muted);font-family:var(--sc-font-mono)}
.sc-herkunft--katalog{background:var(--sc-ok-bg);color:var(--sc-ok)}
.sc-herkunft--stundensatz{background:var(--sc-info-bg);color:var(--sc-info)}
.sc-herkunft--geschaetzt{background:var(--sc-bad-bg);color:var(--sc-bad);font-weight:700}
/* Bei „geschaetzt" steht die Begruendung IMMER offen — eingeklappt wuerde
   genau die Angabe verschwinden, wegen der man zweimal hinsehen soll. */
.sc-diff__grund{font-size:var(--sc-t-sm);color:var(--sc-muted);margin-top:var(--sc-2);
  padding-left:var(--sc-3);border-left:2px solid var(--sc-line-strong);line-height:1.5}
.sc-diff__grund--warn{border-left-color:var(--sc-bad);color:var(--sc-text)}

/* ── Wirkung aufs Ganze: Summe jetzt -> nachher ───────────────────────────
   Der wichtigste Anker. Klebt ueber der Knopfzeile, damit er beim Rollen
   durch eine lange Liste nicht verschwindet. */
.sc-wirkung{position:sticky;bottom:64px;z-index:2;
  background:var(--sc-ink);color:var(--sc-on-dark);border-radius:var(--sc-r-md);
  padding:var(--sc-3) var(--sc-4);margin-top:var(--sc-4);
  display:flex;align-items:center;gap:var(--sc-3);flex-wrap:wrap}
.sc-wirkung__lab{font-size:var(--sc-t-xs);text-transform:uppercase;
  letter-spacing:.04em;color:var(--sc-on-dark-muted)}
.sc-wirkung__zahl{font-family:var(--sc-font-mono);font-size:var(--sc-t-md);
  font-weight:700}
.sc-wirkung__jetzt{color:var(--sc-on-dark-muted)}
.sc-wirkung__pfeil{color:var(--sc-lime)}
.sc-wirkung__neu{color:var(--sc-lime)}
.sc-wirkung__block{display:flex;align-items:center;gap:var(--sc-2)}
.sc-wirkung__n{margin-left:auto;font-size:var(--sc-t-sm);color:var(--sc-on-dark-muted)}

@media (max-width:560px){
  .sc-chat{max-height:30vh}
  .sc-chat__bubble{max-width:92%}
  .sc-wirkung{bottom:0;flex-direction:column;align-items:stretch;gap:var(--sc-2)}
  .sc-wirkung__n{margin-left:0}
  /* Kaestchen auf Touch groesser: hier wird Geld freigegeben. */
  .sc-check.sc-diff__wahl input[type=checkbox]{width:22px;height:22px}
  .sc-check.sc-diff__wahl{padding:var(--sc-1) 0;min-height:44px}
}

/* ══════════════════════════════════════════════════════════════════════════
   SPRUNG ZWISCHEN VERKNÜPFTEN DATENSÄTZEN  (Website ↔ Kunde)
   ══════════════════════════════════════════════════════════════════════════
   Ein Sprung ist kein Knopf und kein gewöhnlicher Link: er sieht aus wie der
   Wert, den er zeigt, und verrät erst beim Zeigen, dass er woanders hinführt.
   Der kleine Pfeil steht IMMER da — sonst weiß man vorher nicht, dass es
   weitergeht (auf Touch gibt es kein Zeigen). */
/* inline, NICHT inline-flex: bei einem zweizeiligen Kundennamen zentriert flex
   den Pfeil senkrecht neben dem Textblock — er sah dann aus wie eine eigene
   Spalte. Inline lässt ihn dem letzten Wort folgen. */
.sc-sprung{display:inline;background:none;border:0;padding:0;margin:0;font:inherit;
  color:var(--sc-primary);cursor:pointer;text-align:left;border-radius:var(--sc-r-sm)}
.sc-sprung svg.lucide{width:13px;height:13px;opacity:.65;
  vertical-align:-2px;margin-left:3px}
.sc-sprung:hover{text-decoration:underline;color:var(--sc-primary-hover)}
.sc-sprung:hover svg.lucide{opacity:1}
.sc-sprung:focus-visible{outline:2px solid var(--sc-lime-deep);outline-offset:2px}
/* Nur-Lese-Wert im Website-Detail (früher ein Inline-Stil an drei Stellen). */
.ho-read{padding:6px 0;color:var(--sc-text);font-size:var(--sc-t-md)}
.ho-chronik-mehr{margin-top:var(--sc-3)}

/* Websites eines Kunden verwalten: drei Felder + Löschen je Zeile. */
.kw-liste{display:flex;flex-direction:column}
.kw-zeile{display:flex;align-items:center;gap:var(--sc-2);padding:var(--sc-2) 0;flex-wrap:wrap}
.kw-zeile .kw-label{flex:0 1 160px;min-width:120px}
.kw-zeile .kw-url{flex:1 1 200px;min-width:150px}
.kw-zeile .kw-cms,.kw-zeile select{flex:0 1 220px;min-width:170px}
.kw-zeile--neu{margin-top:var(--sc-3);padding-top:var(--sc-3);
  border-top:1px solid var(--sc-line)}
.kw-zeile--kopf{padding-bottom:0;font-family:var(--sc-font-mono);
  font-size:var(--sc-t-xs);letter-spacing:.06em;text-transform:uppercase;
  color:var(--sc-faint)}
.kw-zeile--kopf .kw-luecke{flex:0 0 28px}
@media (max-width:640px){ .kw-zeile--kopf{display:none} }
@media (max-width:640px){
  .kw-zeile{gap:var(--sc-2)}
  .kw-zeile .kw-label,.kw-zeile .kw-url{flex:1 1 100%}
  /* Systemwahl und Löschknopf bleiben in EINER Zeile — allein stehend sah der
     rote Knopf aus wie eine eigene, gefährliche Aktion. */
  .kw-zeile .kw-cms,.kw-zeile select{flex:1 1 auto;min-width:0}
  .kw-zeile{align-items:center}
}

/* ══════════════════════════════════════════════════════════════════════════
   CHRONIK  ·  Zeitstrahl der Ereignisse
   ══════════════════════════════════════════════════════════════════════════
   Gelesen wird von links nach rechts: WANN → wie schlimm → WO → WAS. Die
   Uhrzeit steht unter dem Tag, weil man im Zeitstrahl erst den Tag sucht.
   Die Tabelle bleibt schmal genug, damit der Kopf oben andocken kann
   (scKleberKoepfe schaltet ab, sobald die Hülle rollen muss). */
#tab-chronik .chr-table{min-width:720px}
#tab-chronik .chr-c-zeit{width:120px;white-space:nowrap}
#tab-chronik .chr-c-ampel{width:34px}
#tab-chronik .chr-c-site{width:190px}
#tab-chronik .chr-c-typ{width:150px}
#tab-chronik .chr-tag{display:block;font-variant-numeric:tabular-nums;font-weight:500}
#tab-chronik .chr-uhr{display:block;font-family:var(--sc-font-mono);
  font-size:var(--sc-t-xs);color:var(--sc-faint)}
#tab-chronik .chr-zeile{cursor:pointer}
#tab-chronik .chr-zeile:hover{background:var(--sc-sunk)}
#tab-chronik .chr-zeile.is-open{background:var(--sc-sunk)}
#tab-chronik .chr-zeile--stumm{cursor:default}
#tab-chronik .chr-zeile--stumm:hover{background:transparent}
#tab-chronik .chr-zeile:focus-visible{outline:2px solid var(--sc-lime-deep);outline-offset:-2px}
#tab-chronik .chr-kurz{color:var(--sc-text)}
#tab-chronik .chr-pfeil{width:14px;height:14px;color:var(--sc-faint);
  vertical-align:-2px;margin-left:var(--sc-1)}
#tab-chronik .chr-detailzeile>td{background:var(--sc-sunk);padding-top:0}
#tab-chronik .chr-quelle{margin-left:var(--sc-1)}
#tab-chronik .chr-mehr{display:flex;justify-content:center;margin-top:var(--sc-4)}
/* ACHTUNG: display:flex schlaegt das [hidden] des Browsers — ohne diese Zeile
   stand „Aeltere Einträge laden" auch dann da, wenn es nichts mehr gab. */
#tab-chronik .chr-mehr[hidden]{display:none}
.chr-server{display:inline-flex;align-items:center;gap:5px;color:var(--sc-muted)}
.chr-server svg.lucide{width:13px;height:13px}
/* „nachgetragen": später gemeldet als passiert. Muss ins Auge fallen, ohne
   wie eine Warnung auszusehen — es ist eine Herkunftsangabe, kein Problem. */
.chr-nach{background:var(--sc-info-bg);color:var(--sc-info);
  border:1px dashed var(--sc-info-line);margin-left:var(--sc-2)}
/* Nur für Vorlesegeräte (Spaltenkopf der Ampel). */
.sc-sr{position:absolute;width:1px;height:1px;padding:0;margin:-1px;
  overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}

@media (max-width:900px){
  /* Gleiches Muster wie bei den anderen Listen: die Zeile wird zum Block,
     jede Zelle trägt ihre Beschriftung aus data-lab.
     ACHTUNG: display:flex schlägt das [hidden] des Browsers — ohne die
     tr[hidden]-Regel stünden auf dem Handy ALLE Detailzeilen offen. */
  #tab-chronik .chr-table{min-width:0;display:block}
  #tab-chronik .chr-table thead{display:none}
  /* tbody als Block: bleibt es eine Tabellengruppe, zeichnet der Browser
     neben den Flex-Zeilen noch eine Spaltenkante (gemessen bei 390 px). */
  #tab-chronik .chr-table>tbody{display:block}
  #tab-chronik .chr-table tr{display:flex;flex-wrap:wrap;align-items:flex-start;
    gap:var(--sc-2) var(--sc-3);padding:var(--sc-3) 0;
    border-bottom:1px solid var(--sc-line)}
  #tab-chronik .chr-table tr[hidden]{display:none}
  #tab-chronik .chr-table tr:last-child{border-bottom:0}
  #tab-chronik .chr-table>tbody>tr>td{border:0;padding:0;width:auto}
  #tab-chronik .chr-table td[colspan]{flex:1 1 100%}
  #tab-chronik .chr-table td[data-lab]::before{content:attr(data-lab);display:block;
    margin-bottom:3px;font-family:var(--sc-font-mono);font-size:var(--sc-t-xs);
    letter-spacing:.06em;text-transform:uppercase;color:var(--sc-faint)}
  /* Ampel und Zeit gehören auf dem Handy in EINE Kopfzeile, die Kurzfassung
     darunter über die volle Breite — sonst steht der wichtigste Satz als
     dritte Spalte im Umbruch. */
  #tab-chronik .chr-c-ampel::before{display:none !important}
  #tab-chronik .chr-c-ampel{order:0;flex:0 0 auto;padding-top:16px !important}
  #tab-chronik .chr-c-zeit{order:1;flex:0 0 auto}
  #tab-chronik .chr-c-site{order:2;flex:1 1 auto;min-width:0}
  #tab-chronik .chr-c-kurz{order:3;flex:1 1 100%}
  #tab-chronik .chr-c-typ{order:4;flex:1 1 100%}
}

/* ══════════════════════════════════════════════════════════════════════════
   RUNDMAIL-EDITOR  ·  Werkzeugleiste + Schreibfläche
   ══════════════════════════════════════════════════════════════════════════ */
.sc-rt-leiste{display:flex;align-items:center;gap:var(--sc-3);flex-wrap:wrap;
  padding:var(--sc-2) var(--sc-2);margin-top:var(--sc-3);
  border:1px solid var(--sc-line-strong);border-bottom:0;
  border-radius:var(--sc-r-sm) var(--sc-r-sm) 0 0;background:var(--sc-sunk)}
.sc-rt-gruppe{display:flex;align-items:center;gap:var(--sc-1);flex-wrap:wrap}
/* Trennstrich zwischen den Gruppen statt eines eigenen Elements. */
.sc-rt-gruppe+.sc-rt-gruppe{padding-left:var(--sc-3);
  border-left:1px solid var(--sc-line-strong)}
/* Kein margin-left:auto: sobald die Leiste umbricht, klebte die Gruppe rechts
   an der neuen Zeile und wirkte wie eine zweite, fremde Leiste. */
.sc-rt-gruppe--rechts{gap:var(--sc-2)}
/* Die Schreibfläche schließt bündig an die Leiste an — beide sind EIN Feld. */
.sc-rt{min-height:260px;max-height:60vh;overflow-y:auto;
  padding:var(--sc-3) var(--sc-4);line-height:1.55;font-size:var(--sc-t-md);
  color:var(--sc-text);background:var(--sc-paper);
  border:1px solid var(--sc-line-strong);border-radius:0 0 var(--sc-r-sm) var(--sc-r-sm)}
.sc-rt:focus{outline:none;border-color:var(--sc-lime-deep)}
.sc-rt.is-leer::before{content:attr(data-platzhalter);color:var(--sc-faint);
  pointer-events:none;display:block}
.sc-rt h3{font-size:var(--sc-t-lg);font-weight:700;color:var(--sc-text);
  margin:var(--sc-4) 0 var(--sc-2)}
.sc-rt h3:first-child{margin-top:0}
.sc-rt ul,.sc-rt ol{margin:var(--sc-2) 0;padding-left:var(--sc-6)}
.sc-rt li{margin:2px 0}
.sc-rt hr{border:none;border-top:1px solid var(--sc-line-strong);margin:var(--sc-4) 0}
.sc-rt a{color:var(--sc-primary);text-decoration:underline}
.sc-rt-fuss{margin-top:var(--sc-2)}
.sc-rt-fuss code{font-family:var(--sc-font-mono);font-size:var(--sc-t-xs);
  background:var(--sc-mist);padding:1px 5px;border-radius:4px}

/* Vorschau: so sieht es beim Empfänger aus (Bausteine gesetzt). */
.nl-vorschau-btnzeile{margin:var(--sc-4) 0}
.nl-vorschau-btn{display:inline-block;padding:11px 26px;border-radius:var(--sc-r-sm);
  background:var(--sc-lime);color:var(--sc-ink);text-decoration:none;font-weight:700}
.nl-vorschau-bild{max-width:100%;height:auto;border-radius:var(--sc-r-sm);
  margin:var(--sc-3) 0;display:block}
.nl-platzhalter{color:var(--sc-primary);font-style:italic}
.sc-mailprev__text h3{font-size:var(--sc-t-lg);font-weight:700;margin:var(--sc-4) 0 var(--sc-2)}
.sc-mailprev__text ul,.sc-mailprev__text ol{margin:var(--sc-2) 0;padding-left:var(--sc-6)}
.sc-mailprev__text hr{border:none;border-top:1px solid var(--sc-line-strong);margin:var(--sc-4) 0}

@media (max-width:640px){
  .sc-rt-leiste{gap:var(--sc-2)}
  /* Umbricht die Leiste, stünde der Trennstrich am ZEILENANFANG — er sähe aus
     wie ein Strichfehler. Die neue Zeile trennt schon genug. */
  .sc-rt-gruppe+.sc-rt-gruppe{padding-left:0;border-left:0}
  /* Auf dem Handy sitzt die zweite Gruppe nicht rechts, sondern in der
     nächsten Zeile — sonst quetschen sich acht Knöpfe in eine Reihe. */
  .sc-rt-gruppe--rechts{flex:1 1 100%;padding-left:0;border-left:0;
    padding-top:var(--sc-2);border-top:1px solid var(--sc-line-strong)}
  .sc-rt{min-height:200px}
}

/* Zeitraum als EIN Bedienelement: Beschriftung, von, „bis", bis. */
#tab-chronik .chr-zeitraum{display:inline-flex;align-items:center;gap:var(--sc-2);flex-wrap:wrap}
#tab-chronik .chr-zeitraum .sc-inp{min-width:150px}
/* Der Routine-Schalter steht als eigene, ruhige Zeile unter den Filtern —
   er ändert, WAS in der Liste steht, und ist deshalb kein Filter unter vielen. */
#tab-chronik .chr-schalter{padding-top:0;border-top:0}

@media (max-width:640px){
  /* Zeitraum auf dem Handy: Beschriftung auf eigener Zeile, darunter die
     beiden Felder nebeneinander. Sonst hing das Wörtchen „bis" allein am
     rechten Rand der ersten Zeile (gemessen bei 390 px). */
  #tab-chronik .chr-zeitraum{flex:1 1 100%}
  #tab-chronik .chr-zeitraum>.sc-hint:first-child{flex:1 1 100%}
  #tab-chronik .chr-zeitraum .sc-inp{flex:1 1 120px;min-width:0}
  /* Die Ampel gehört auf Augenhöhe zum Datum, nicht darüber. */
  #tab-chronik .chr-c-ampel{padding-top:18px !important}
}

/* Werkzeugleiste auf dem Touchscreen: hier werden die Knöpfe wirklich größer,
   statt nur eine unsichtbare Trefferfläche zu bekommen. In einer Tabellenzeile
   ist das richtig (Optik bleibt ruhig), in einer Leiste aus acht Knöpfen dicht
   nebeneinander würden sich die unsichtbaren 44-px-Flächen überlappen und man
   träfe den Nachbarn. */
@media (hover:none) and (pointer:coarse){
  .sc-rt-leiste .btn-icon{width:40px;height:40px}
  .sc-rt-leiste .btn-icon svg.lucide{width:18px;height:18px}
  .sc-rt-gruppe{gap:var(--sc-2)}
}

/* Bilder im Editor und in der Vorschau: nur echte Web-Adressen kommen bis
   hierher (der Reiniger wirft file://, blob: und data: heraus — sie wären
   beim Empfänger ein leerer Kasten). */
.sc-rt img,.sc-mailprev__text img{max-width:100%;height:auto;
  border-radius:var(--sc-r-sm);margin:var(--sc-2) 0}
