/* ============================================================================
   Konzeptberater — Komponenten. Lesen NUR Tokens aus tokens.css.
   Keine Hex-Farben, keine px-Abstände hier hart — alles über var(--…).
   Fehlt eine Komponente: hier + Token in tokens.css ergänzen, dann nutzen.
   ========================================================================== */

*, *::before, *::after { box-sizing: border-box; }
html { -webkit-text-size-adjust: 100%; }
body {
  margin: 0;
  background: var(--c-bg);
  color: var(--c-text);
  font-family: var(--font-sans);
  font-size: var(--fs-body);
  line-height: var(--lh);
}
h1 { font-size: var(--fs-h1); font-weight: var(--fw-bold); margin: 0 0 var(--sp-4); }
h2 { font-size: var(--fs-h2); font-weight: var(--fw-semibold); margin: 0 0 var(--sp-3); }
h3 { font-size: var(--fs-h3); font-weight: var(--fw-semibold); margin: 0 0 var(--sp-2); }
a  { color: var(--c-accent); text-decoration: none; }
a:hover { text-decoration: underline; }
.muted { color: var(--c-text-muted); }
.num { font-variant-numeric: tabular-nums; text-align: right; }
.lead { font-size: var(--fs-h3); color: var(--c-text-muted); margin: 0 0 var(--sp-4); }
code { background: var(--c-surface-muted); padding: var(--sp-1) var(--sp-2); border-radius: var(--r-sm); font-size: var(--fs-sm); }

/* Das hidden-Attribut gewinnt IMMER: Komponenten-Regeln wie .btn setzen display
   und übersteuern sonst das Browser-Default [hidden]{display:none} — der
   versteckte „Nein"-Submit des Bestätigungs-Dialogs war dadurch in jedem
   Lösch-Dialog sichtbar und löschte trotzdem (Karte 159). */
[hidden] { display: none !important; }

/* Buttons */
.btn {
  display: inline-flex; align-items: center; gap: var(--sp-2);
  /* bold = Teil der Kontrast-Abstimmung zum hellen Lila (D-ButtonStandard) */
  font: inherit; font-weight: var(--fw-bold);
  padding: var(--btn-pad-y) var(--btn-pad-x);
  border: 1px solid transparent; border-radius: var(--btn-radius);
  cursor: pointer; transition: background var(--t-fast), box-shadow var(--t-fast);
}
.btn-primary   { background: var(--btn-primary-bg); color: var(--btn-primary-fg); }
.btn-primary:hover { background: var(--btn-primary-bg-hover); }
.btn-secondary { background: var(--btn-secondary-bg); color: var(--btn-secondary-fg); border-color: var(--btn-secondary-bd); }
.btn-secondary:hover { background: var(--btn-secondary-bg-hover); }
.btn-ghost     { background: transparent; color: var(--c-text-muted); }
.btn-danger    { background: var(--c-error-bg); color: var(--c-error); border-color: var(--c-error); }
.btn:disabled, .btn.is-disabled { opacity: .5; pointer-events: none; }
.btn-sm { padding: 6px 12px; font-size: var(--fs-sm); }
.btn-lg { padding: 14px 24px; }

/* Karte */
.card  { background: var(--card-bg); border: 1px solid var(--card-bd); border-radius: var(--card-radius); box-shadow: var(--card-shadow); padding: var(--card-pad); }
.card-h { font-size: var(--fs-h2); font-weight: var(--fw-semibold); margin: 0 0 var(--sp-4); }
/* Klapp-Container (Owner 10.09., Tarif-Detail „ewig lange Seite"): eine Karte als
   natives <details>, Kopf = <summary class="card-h"> + Pfeil-Konvention Karte 186
   (.vk-vorteil__pfeil dreht bei [open]). Zugeklappt traegt der Kopf keinen
   Unterabstand; den Zustand merkt app.js je data-klapp (localStorage). */
.card--klapp > summary { list-style: none; cursor: pointer; display: flex; align-items: center; gap: var(--sp-3); transition: color var(--t-fast); }
.card--klapp > summary::-webkit-details-marker { display: none; }
.card--klapp > summary:hover { color: var(--c-primary); }
.card--klapp > summary .vk-vorteil__pfeil { margin-left: auto; }
.card--klapp:not([open]) > summary { margin-bottom: 0; }
.card--klapp[open] > summary .vk-vorteil__pfeil { transform: rotate(180deg); }

/* Formularfeld */
.field { display: flex; flex-direction: column; gap: var(--sp-2); margin-bottom: var(--sp-4); }
.label { font-size: var(--fs-sm); font-weight: var(--fw-medium); color: var(--c-text-muted); }
.input, .select {
  height: var(--field-h); background: var(--field-bg); border: 1px solid var(--field-bd);
  border-radius: var(--field-radius); padding: 0 var(--sp-3); color: var(--c-text); font: inherit;
}
.input:focus, .select:focus, .textarea:focus { outline: none; border-color: var(--field-focus); box-shadow: 0 0 0 3px var(--c-focus-ring); }
.input--sm { height: 36px; width: 6rem; padding: 0 var(--sp-2); }
.textarea { background: var(--field-bg); border: 1px solid var(--field-bd); border-radius: var(--field-radius); padding: var(--sp-2) var(--sp-3); color: var(--c-text); font: inherit; line-height: var(--lh); min-height: 104px; resize: vertical; }

/* Antrags-Pflichtfeld ohne Angabe (Owner 2026-08-10): Platzhalter „fehlt" wird rot
   + leise rote Tönung. Rein CSS — Text-Feld greift über :placeholder-shown, Select
   solange die Leer-Option gewählt ist; Tippen/Wählen nimmt das Rot sofort weg. */
.input--pflicht:placeholder-shown,
select.input--pflicht:has(option:checked[value=""]),
.select--pflicht:has(option:checked[value=""]) { border-color: var(--field-fehlt-bd); background: var(--field-fehlt-bg); }
.input--pflicht:placeholder-shown::placeholder { color: var(--field-fehlt-fg); opacity: 1; }
select.input--pflicht:has(option:checked[value=""]),
.select--pflicht:has(option:checked[value=""]) { color: var(--field-fehlt-fg); }
/* Aufgeklappte Optionsliste bleibt normal lesbar (erbt sonst das Rot). */
select.input--pflicht option, .select--pflicht option { color: var(--c-text); }

/* Badge */
.badge { display: inline-flex; align-items: center; gap: 6px; padding: 3px 10px; border-radius: var(--badge-radius); font-size: var(--fs-caption); font-weight: var(--fw-medium); }
.badge--success { background: var(--c-success-bg); color: var(--c-success); }
.badge--warning { background: var(--c-warning-bg); color: var(--c-warning-text); }
.badge--error   { background: var(--c-error-bg);   color: var(--c-error); }
.badge--info    { background: var(--c-info-bg);     color: var(--c-info); }
.badge--neutral { background: var(--c-surface-muted); color: var(--c-text-muted); }
.badge--spart   { background: var(--c-spart-bg);    color: var(--c-spart); }  /* Erfolg/Abschluss (grün wie Ersparnis) */
/* M&M-Ampel je Tarif (Owner-GO 2026-09-10): grün = synchronisiert + freigegeben, amber = Handlungsbedarf, grau = kein Mapping */
.badge--mm-gruen { background: var(--mm-ok-bg);    color: var(--mm-ok-fg);    border: 1px solid var(--mm-ok-bd); }
.badge--mm-gelb  { background: var(--mm-offen-bg); color: var(--mm-offen-fg); border: 1px solid var(--mm-offen-bd); }
.badge--mm-grau  { background: var(--mm-kein-bg);  color: var(--mm-kein-fg);  border: 1px solid var(--mm-kein-bd); }

/* ── Infopill + Hover-Popup (Design-Library T13/T16, Ole 2026-08-11) ─────────
   Infopill: kompakter Fakten-Chip statt Textblock (z. B. „Leistungskürzung zum
   01.01.2027 beschlossen"). Die Kurz-Erklärung (1–3 Sätze, keine Interaktion)
   liegt im Hover-Popup — CSS-only über :hover/:focus, der Trigger-Wrapper
   braucht dafür tabindex="0" (Tastatur + Touch). Inhalte mit Interaktion
   gehören NICHT hierhin, sondern ins normale Popup (.modal / <dialog>).
   Präzisiert Karte #83 (Owner 2026-08-17): eine reine ANZEIGE-Liste (Posten-
   Aufschlüsselung, .hoverpop-posten unten) ist im Hover erlaubt — nur
   interaktive/scrollende Inhalte bleiben tabu.
   Im Druck erscheint das Popup inline unter der Pill (Kundenblatt vollständig). */
.infopill { display: inline-flex; align-items: center; gap: 6px; padding: 3px 11px; border: 1px solid var(--infopill-bd); border-radius: var(--r-full); background: var(--infopill-bg); color: var(--infopill-fg); font-size: var(--fs-caption); font-weight: var(--fw-semibold); white-space: nowrap; }
.infopill--warnung { border-color: var(--infopill-warn-bd); background: var(--infopill-warn-bg); color: var(--infopill-warn-fg); }
/* Privatarzt-Toggle (Ole-Entscheidung 1, 2026-08-12): positiver Zustand
   „abgedeckt" in den leisen Ersparnis-Tönen. */
.infopill--ok { border-color: var(--infopill-ok-bd); background: var(--infopill-ok-bg); color: var(--infopill-ok-fg); }
/* #56-Fix (Owner-Screenshot 12.08.): Pills in Kachel-/Kartenbreite dürfen
   umbrechen — das Basis-nowrap ließ die Familien-Police-Pill rechts aus der
   AUF-REISEN-Kachel ragen. Icon bleibt an der ersten Zeile ausgerichtet. */
.infopill--mehrzeilig { white-space: normal; min-width: 0; max-width: 100%; align-items: flex-start; text-align: left; }
.infopill__icon { flex: none; display: inline-flex; align-items: center; justify-content: center; width: 15px; height: 15px; border-radius: var(--r-full); background: currentColor; font-size: 10px; font-weight: var(--fw-bold); }
.infopill__icon::before { content: attr(data-glyph); color: var(--c-text-on-accent); }
.hover-info { position: relative; display: inline-flex; max-width: 100%; cursor: help; outline: none; }
.hover-info:focus-visible { border-radius: var(--r-full); box-shadow: 0 0 0 3px var(--c-focus-ring); }
.hover-info__pop { position: absolute; bottom: calc(100% + var(--sp-2)); left: 0; z-index: 40; width: max-content; max-width: var(--hoverpop-w); padding: var(--sp-3) var(--sp-4); border: 1px solid var(--hoverpop-bd); border-radius: var(--r-md); background: var(--hoverpop-bg); box-shadow: var(--hoverpop-shadow); color: var(--c-text); font-size: var(--fs-sm); font-weight: var(--fw-medium); line-height: var(--lh); white-space: normal; display: none; }
.hover-info:hover .hover-info__pop,
.hover-info:focus .hover-info__pop,
.hover-info:focus-within .hover-info__pop { display: block; }
/* Owner 02.09.: Hover an rechtsbündigen Zahlen-Zellen (Baustein-Tabelle) —
   das Pop hängt an der rechten Kante, sonst ragt es aus dem Container. */
.hover-info--rechts .hover-info__pop { left: auto; right: 0; }
/* Hover-Posten-Liste (Karte #83, design-system §Hover-Posten-Liste): mehrteilige
   Beträge im Popup als Zeilen-Liste statt Fließtext — je Posten Label + Betrag,
   Summe abgesetzt (Trenner + fett). Labels sind DATEN-Texte → dürfen umbrechen;
   nowrap nur am selbst formatierten €-Wert (Lehre kr-deckung 2026-08-13). */
.hoverpop-posten { display: grid; gap: var(--sp-1); min-width: var(--hoverpop-posten-minw); }
.hoverpop-posten__zeile, .hoverpop-posten__summe { display: flex; justify-content: space-between; align-items: baseline; gap: var(--sp-4); min-width: 0; }
.hoverpop-posten__label { min-width: 0; text-align: left; }
.hoverpop-posten__wert { white-space: nowrap; font-variant-numeric: tabular-nums; }
.hoverpop-posten__summe { margin-top: var(--sp-1); padding-top: var(--sp-2); border-top: 1px solid var(--c-border-soft); font-weight: var(--fw-bold); }
/* Trello Karte 212: Rechnungs-Zeilen einer Person UNTER ihrer Personen-Zeile —
   eingerückt + leiser, damit Person und Herleitung unterscheidbar bleiben. */
.hoverpop-posten__zeile--sub { padding-left: var(--sp-4); }
.hoverpop-posten__zeile--sub .hoverpop-posten__label, .hoverpop-posten__zeile--sub .hoverpop-posten__wert { font-size: 0.92em; color: var(--c-text-muted); }
@media print {
  /* Kundenblatt bleibt vollständig: Erklärtext druckt inline unter der Pill. */
  .hover-info { display: inline-block; }
  .hover-info__pop { display: block; position: static; width: auto; max-width: none; margin-top: var(--sp-1); border: 0; padding: 0; box-shadow: none; }
}

/* Tabelle */
.table { width: 100%; border-collapse: collapse; font-size: var(--fs-body); }
.table th { text-align: left; font-size: var(--fs-caption); text-transform: uppercase; letter-spacing: .04em; color: var(--c-text-muted); font-weight: var(--fw-semibold); padding: var(--sp-2) var(--sp-3); border-bottom: 1px solid var(--c-border); }
.table td { padding: var(--sp-3); border-bottom: 1px solid var(--c-border-soft); }
.table tbody tr:hover { background: var(--c-surface-muted); }

/* Facetten-Filterleiste (Backoffice-Tabellen; GET-Formular, ohne JS nutzbar) */
.facet-bar { display: flex; flex-wrap: wrap; align-items: flex-end; gap: var(--sp-3); }
.facet-bar__search { flex: 1 1 220px; min-width: 0; }
.facet-filter { display: flex; flex-direction: column; gap: var(--sp-1); }
.facet-filter__label { font-size: var(--fs-caption); font-weight: var(--fw-semibold); color: var(--c-text-muted); text-transform: uppercase; letter-spacing: .04em; }
.facet-filter__select { height: var(--field-h); }

/* Sortierbarer Tabellenkopf (Sortier-Link + Pfeil-Indikator ⇅ ▲ ▼) */
.sortable-th { padding: 0; }
.sortable-th a { display: inline-flex; align-items: center; gap: var(--sp-1); min-height: var(--field-h); padding: var(--sp-2) var(--sp-3); color: inherit; font: inherit; text-transform: uppercase; letter-spacing: .04em; font-size: var(--fs-caption); font-weight: var(--fw-semibold); }
.sortable-th a:hover { color: var(--c-primary); text-decoration: none; }
.sortable-th a:focus-visible { outline: none; box-shadow: inset 0 0 0 2px var(--c-focus); border-radius: var(--r-sm); }
.sortable-th.is-sorted a { color: var(--c-primary); }
.sortable-th__arrow { font-size: 10px; color: var(--c-text-soft); }
.sortable-th.is-sorted .sortable-th__arrow { color: var(--c-primary); }

/* Leer-Zustand (Tabellen/Listen ohne Treffer) */
.empty-state { display: flex; flex-direction: column; align-items: center; gap: var(--sp-3); padding: var(--sp-8); color: var(--c-text-muted); text-align: center; }

/* Layout-Hüllen */
.container { max-width: var(--content-max); margin: 0 auto; padding: var(--sp-8) var(--sp-10); }
.topbar { display: flex; align-items: center; justify-content: space-between; gap: var(--sp-3); padding: var(--sp-4) var(--sp-6); background: var(--c-surface-raised); border-bottom: 1px solid var(--c-border-soft); }
.brand { font-weight: var(--fw-bold); color: var(--c-primary); }

/* Kunden-Konzept „Ruhiges Konzept": schmale, ruhige Spalte + Key-Value-Zeile */
/* Kundenname im Konzept-Kopf: groß, fett, farbig — der Kunde soll sich sofort wiederfinden.
   Bewusst nur hier so prominent (Owner-Entscheidung 2026-07-16). */
.konzept-kunde { font-size: var(--konzept-kunde-fs); font-weight: var(--fw-bold); color: var(--konzept-kunde-fg); line-height: 1.15; margin: var(--sp-1) 0 var(--sp-4); }

/* ── Versorgungs-Konzept: Lebenslagen-Kacheln (Design-Handoff 2026-07-16) ─────────
   Löst Balken/Prozente ab. Jede Aussage ist ein Euro-Betrag oder ein Satz.
   Zustand trägt immer AUCH ohne Farbe: Wort + Glyph-Form + Rahmen (Druck, Rot-Grün-Schwäche). */
.vk { max-width: var(--content-max); margin: 0 auto; }

.vk-kopf { display: flex; align-items: flex-start; justify-content: space-between; gap: var(--sp-6); padding-bottom: var(--sp-6); border-bottom: 1px solid var(--c-border-soft); flex-wrap: wrap; }
.vk-kopf__id { display: flex; align-items: center; gap: var(--sp-4); min-width: 0; }
.vk-name { margin: 0; font-size: var(--vk-name-fs); font-weight: var(--fw-bold); color: var(--vk-name-fg); line-height: 1.05; letter-spacing: -.015em; }
.vk-meta { display: flex; align-items: center; gap: var(--sp-2); margin: var(--sp-2) 0 0; font-size: var(--fs-sm); color: var(--c-text-muted); flex-wrap: wrap; }
.vk-meta__sep { color: var(--c-text-soft); }
.vk-erstellt { margin: var(--sp-1) 0 0; font-size: var(--fs-caption); color: var(--c-text-soft); }
/* Personen-Beschriftung über einer Kachel-Gruppe: klare Luft nach oben (neue Person
   beginnt), fester Abstand zum Grid darunter (Owner 2026-07-20: Spacing war zu eng). */
.vk-person { margin: var(--sp-8) 0 var(--sp-3); }
.vk-person:first-of-type { margin-top: var(--sp-6); }

/* Umschalter Heute / Mit Konzept — Segment-Pille, etwas größer als die Standard-Tabs */
.tabs--switch .tabs__btn { height: 38px; font-size: var(--fs-body); padding: 0 var(--sp-5); }

/* 3 Spalten; minmax(0,1fr) ist nötig, sonst quetschen lange Wörter die letzte Spalte */
.vk-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--sp-4); margin-top: var(--sp-6); }

.vk-karte { display: flex; flex-direction: column; gap: var(--sp-3); padding: var(--sp-5); border-radius: var(--vk-karte-radius); background: var(--vk-karte-bg); border: 1.5px solid var(--c-border); position: relative; }
/* Offenes Edit-Panel: volle Deckkraft + über Nachbarn/Bilanz heben. Nötig, weil das
   opacity-Dimmen der „Geprüft"-Kacheln einen Stacking-Kontext erzeugt, der das
   Tarif-Dropdown sonst gefangen hält (durchscheinend, von der Bilanzkarte überlagert). */
.vk-karte:has(.vk-edit[open]) { opacity: 1; z-index: 30; }
.vk-karte__kopf { display: flex; align-items: flex-start; justify-content: space-between; gap: var(--sp-2); }
.vk-karte__icon { display: inline-flex; align-items: center; justify-content: center; width: 44px; height: 44px; flex: none; border-radius: var(--r-md); background: var(--vk-icon-kachel-bg); }
.vk-karte__icon img { width: 26px; height: 26px; display: block; }
.vk-karte__name { font-size: var(--fs-h3); font-weight: var(--fw-bold); }
.vk-karte__haupt { font-size: var(--fs-body); font-weight: var(--fw-semibold); line-height: 1.35; text-wrap: pretty; }
/* Die Euro-Zahl trägt die Kachel-Aussage: groß, fett, Zustandsfarbe; Altwert leise durchgestrichen. */
.vk-karte__betrag { font-size: var(--fs-h2); font-weight: var(--fw-bold); font-variant-numeric: tabular-nums; line-height: 1.25; text-wrap: pretty; }
.vk-karte__betrag-alt { color: var(--c-text-soft); font-weight: var(--fw-medium); font-size: var(--fs-body); }
.vk-karte__betrag-pfeil { color: var(--c-text-soft); font-weight: var(--fw-regular); }
.vk-karte__betrag-sub { font-size: var(--fs-sm); font-weight: var(--fw-medium); color: var(--c-text-muted); margin-top: 2px; }
.vk-karte[data-zustand="selbst"]     .vk-karte__betrag { color: var(--vk-selbst-fg); }
.vk-karte[data-zustand="gedeckt"]    .vk-karte__betrag { color: var(--vk-gedeckt-fg); }
.vk-karte[data-zustand="teilweise"]  .vk-karte__betrag { color: var(--vk-teil-fg); }
.vk-karte__begr { margin-top: var(--sp-1); font-size: var(--fs-caption); color: var(--c-text-soft); line-height: 1.4; text-wrap: pretty; }
.vk-karte__fuss { margin-top: auto; padding-top: var(--sp-1); font-size: var(--fs-caption); color: var(--c-text-soft); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

/* Zustands-Pille: Glyph + Wort. Farbe ist nur Verstärkung. */
.vk-pill { display: inline-flex; align-items: center; gap: 6px; flex: none; padding: 4px 11px 4px 8px; border-radius: var(--r-full); font-size: var(--fs-caption); font-weight: var(--fw-bold); border: 1px solid transparent; }
.vk-pill__glyph { width: 14px; height: 14px; flex: none; }

.vk-karte[data-zustand="selbst"]     .vk-karte__haupt { color: var(--vk-selbst-fg); }
.vk-pill[data-zustand="selbst"]      { background: var(--vk-selbst-bg); color: var(--vk-selbst-fg); border-color: var(--vk-selbst-bd); }
.vk-karte[data-zustand="teilweise"]  { border-color: var(--vk-teil-bd); }
.vk-pill[data-zustand="teilweise"]   { background: var(--vk-teil-bg); color: var(--vk-teil-fg); border-color: var(--vk-teil-bd); }
.vk-karte[data-zustand="gedeckt"]    { border-color: var(--vk-gedeckt-bd); }
.vk-karte[data-zustand="gedeckt"]    .vk-karte__haupt { color: var(--vk-gedeckt-fg); }
.vk-pill[data-zustand="gedeckt"]     { background: var(--vk-gedeckt-bg); color: var(--vk-gedeckt-fg); border-color: var(--vk-gedeckt-bd); }
/* offen: gestrichelt + ruhig — sichtbar anders als „nicht abgedeckt" */
.vk-karte[data-zustand="offen"]      { border-style: dashed; border-color: var(--vk-offen-dash); background: var(--vk-karte-bg-leise); }
.vk-karte[data-zustand="offen"]      .vk-karte__haupt { color: var(--vk-offen-fg); }
.vk-karte[data-zustand="offen"]      .vk-karte__icon img { opacity: .7; }
.vk-pill[data-zustand="offen"]       { background: var(--vk-offen-bg); color: var(--vk-offen-fg); border-color: var(--vk-offen-bd); }
/* kein Bedarf: stark zurückgenommen, kein Mangel-Eindruck */
.vk-karte[data-zustand="keinbedarf"] { border-width: 1px; border-color: var(--c-border-soft); background: var(--vk-karte-bg-leise); opacity: var(--vk-kein-op); }
.vk-karte[data-zustand="keinbedarf"] .vk-karte__haupt { color: var(--vk-kein-fg); }
.vk-karte[data-zustand="keinbedarf"] .vk-karte__icon img { opacity: .45; }
.vk-pill[data-zustand="keinbedarf"]  { background: var(--vk-kein-bg); color: var(--vk-kein-fg); border-color: var(--vk-kein-bd); }

/* Kosten-Bilanz: echte Beiträge (GKV + Bausteine) als Kopfzahl, darunter die Punkteliste
   „Risiken & Lücken heute" bzw. „Das löst dein Konzept" — Problem zeigen, Lösung verkaufen. */
/* Bilanz-Hero (Owner 2026-07-22): zweispaltig — Kopfzahl links, Punkte rechts
   (volle Breite, flache Box). Weißer Hintergrund mit farbiger Umrandung +
   Schrift statt Farbe-auf-Farbe (Lesbarkeit). */
.vk-bilanzkarte { margin-top: var(--sp-6); padding: var(--sp-6); border-radius: var(--r-lg); display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1.3fr); gap: var(--sp-3) var(--sp-8); align-items: start; background: var(--c-surface); }
.vk-bilanzkarte[data-ansicht="heute"]   { color: var(--vk-selbst-fg); border: 2px solid var(--vk-selbst-fg); }
.vk-bilanzkarte[data-ansicht="konzept"] { color: var(--vk-gedeckt-fg); border: 2px solid var(--vk-gedeckt-fg); }
.vk-bilanzkarte__links, .vk-bilanzkarte__rechts { min-width: 0; }
.vk-bilanzkarte__rechts .vk-punkte__titel { margin-top: 0; }
@media (max-width: 760px) { .vk-bilanzkarte { grid-template-columns: minmax(0, 1fr); } }
.vk-bilanzkarte__kopf { display: flex; flex-direction: column; gap: 2px; }
.vk-bilanzkarte__titel { font-weight: var(--fw-semibold); }
/* Herkunfts-Hinweis: die Zahl kommt aus den eigenen Angaben des Kunden (Commitment). */
.vk-bilanzkarte__sub { font-size: var(--fs-caption); font-weight: var(--fw-medium); opacity: .75; }
.vk-bilanzkarte__zahl { margin-top: var(--sp-3); font-size: var(--vk-bilanz-num); font-weight: var(--fw-bold); font-variant-numeric: tabular-nums; line-height: 1.1; }
.vk-bilanzkarte__einheit { font-size: var(--fs-h3); font-weight: var(--fw-semibold); }
.vk-bilanzkarte__monat { margin-top: 2px; font-size: var(--fs-sm); font-weight: var(--fw-medium); opacity: .8; font-variant-numeric: tabular-nums; }
.vk-bilanzkarte__delta { margin-top: var(--sp-2); font-size: var(--fs-sm); font-weight: var(--fw-semibold); font-variant-numeric: tabular-nums; }

.vk-punkte__titel { margin: var(--sp-4) 0 var(--sp-2); font-size: var(--fs-caption); font-weight: var(--fw-bold); letter-spacing: .04em; text-transform: uppercase; opacity: .85; }
.vk-punkte { margin: 0; padding: 0; list-style: none; display: flex; flex-direction: column; gap: var(--sp-2); }
.vk-punkte__punkt { display: flex; align-items: flex-start; gap: var(--sp-2); font-size: var(--fs-sm); font-weight: var(--fw-medium); line-height: 1.4; text-wrap: pretty; }
/* Ton nur als Verstärkung — das Wort trägt. „offen" bleibt ruhig, kein Alarm. */
.vk-punkte__punkt[data-ton="offen"] { opacity: .8; }
.vk-punkte__mark { flex: none; width: 15px; height: 15px; margin-top: 2px; }
.vk-punkte__mark svg { width: 100%; height: 100%; display: block; }

.vk-fussnote { margin: var(--sp-2) 0 0; font-size: var(--fs-sm); color: var(--c-text-soft); text-align: right; }

/* Risiko-Zeile auf der Kachel: heute Warnung (Dunkelrot-Rolle), im Konzept gelöst (Grün-Rolle). */
.vk-karte__risiko { display: flex; align-items: flex-start; gap: var(--sp-2); padding: var(--sp-2) var(--sp-3); border-radius: var(--r-md); font-size: var(--fs-caption); font-weight: var(--fw-semibold); line-height: 1.35; text-wrap: pretty; border: 1px solid transparent; }
.vk-karte__risiko[data-ton="neg"] { background: var(--vk-selbst-bg); color: var(--vk-selbst-fg); border-color: var(--vk-selbst-bd); }
.vk-karte__risiko[data-ton="pos"] { background: var(--vk-gedeckt-bg); color: var(--vk-gedeckt-fg); border-color: var(--vk-gedeckt-bd); }
.vk-karte__risiko-glyph { flex: none; width: 15px; height: 15px; margin-top: 1px; }
.vk-karte__risiko-glyph svg { width: 100%; height: 100%; display: block; }

@media (max-width: 1199px) { .vk-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 767px) {
  .vk-grid { grid-template-columns: 1fr; }
  .vk-name { font-size: var(--fs-h1); }
}
/* Kassen-Vorteile auf der Konzept-Seite (Kundensicht, lazy geladen) —
   kompakt je Kategorie, Einzelleistungen klappen per <details> auf. */
.vk-kassekarte { margin-top: var(--sp-4); padding: var(--sp-6); border-radius: var(--r-lg); background: var(--c-surface); border: 1px solid var(--c-border); }
.vk-kassekarte__kopf { display: flex; align-items: center; gap: var(--sp-3); margin-bottom: var(--sp-2); }
.vk-kassekarte__name { margin: 0; font-size: var(--fs-h2); font-weight: var(--fw-bold); }
.vk-kassekarte__quelle { margin: var(--sp-3) 0 0; font-size: var(--fs-sm); color: var(--c-text-soft); }
.vk-vorteil { border-top: 1px solid var(--c-border); }
.vk-vorteil__kopf { display: flex; align-items: center; gap: var(--sp-3); padding: var(--sp-3) 0; cursor: pointer; list-style: none; }
.vk-vorteil__kopf::-webkit-details-marker { display: none; }
.vk-vorteil__titel { font-weight: var(--fw-medium); }
.vk-vorteil__label { margin-left: auto; color: var(--c-text-muted); font-size: var(--fs-sm); }
/* Karte 186: Klapp-Pfeil zentral 3x groesser (--klapp-pfeil); line-height haelt
   die Zeilenhoehe — der Glyph waechst, die Box nicht (kein Layout-Sprung). */
.vk-vorteil__pfeil { display: inline-flex; align-items: center; justify-content: center; font-size: var(--klapp-pfeil); line-height: .45; color: var(--c-text-muted); transition: transform var(--t-fast); }
/* Bewusste Ausnahme: in den Topbar-Menue-Buttons bleibt der Pfeil buttongross. */
.pv-menu__knopf .vk-vorteil__pfeil { font-size: 1em; line-height: inherit; }
.vk-vorteil[open] .vk-vorteil__pfeil { transform: rotate(180deg); }
.vk-vorteil__liste { margin: 0 0 var(--sp-3); padding: 0; list-style: none; display: flex; flex-direction: column; gap: var(--sp-1); }
.vk-vorteil__liste li { display: flex; justify-content: space-between; gap: var(--sp-3); font-size: var(--fs-sm); }
.vk-vorteil__liste li span:last-child { color: var(--c-text-muted); text-align: right; }

/* Kassen-Gegenüberstellung alt vs. neu (Konsole aufklappbar, Konzept ausgestellt) —
   gleiche Leistungspunkte in einer Zeile: Titel | alte Kasse | neue Kasse.
   Nutzt die vk-vorteil-Kopfzeile für die Kategorien; Zeilen als 3-Spalten-Grid. */
.kv-duell__kopf { display: flex; align-items: center; flex-wrap: wrap; gap: var(--sp-4); margin-bottom: var(--sp-2); }
.kv-duell__seite { display: flex; align-items: center; gap: var(--sp-3); }
.kv-duell__vs { color: var(--c-text-muted); font-size: var(--fs-h2); }
.kv-duell__zeilen { padding-bottom: var(--sp-3); }
.kv-duell__zeile { display: grid; grid-template-columns: minmax(0, 1.4fr) minmax(0, 1fr) minmax(0, 1fr); gap: var(--sp-2); padding: var(--sp-1) 0; font-size: var(--fs-sm); align-items: baseline; }
.kv-duell__zeile--kopf { color: var(--c-text-muted); font-size: var(--fs-caption); text-transform: uppercase; letter-spacing: .04em; font-weight: var(--fw-semibold); border-bottom: 1px solid var(--c-border); padding-bottom: var(--sp-2); }
.kv-duell__zeile--bedarf .kv-duell__titel { font-weight: var(--fw-semibold); }
.kv-duell__wert { color: var(--c-text-muted); }
.kv-duell__wert--neu { color: var(--c-text); display: inline-flex; flex-wrap: wrap; align-items: baseline; gap: var(--sp-2); }
/* Bessere Kondition laut API: grüne Box + dunkelgrüne Schrift (Berater-Sicht) */
.kv-duell__wert--besser { color: var(--c-spart); font-weight: var(--fw-semibold); background: var(--c-spart-bg); border: 1px solid var(--c-spart); border-radius: var(--r-sm); padding: 2px var(--sp-2); width: fit-content; }
.kv-duell__leer { color: var(--c-text-soft); }
.kv-duell__minus { color: var(--c-text-soft); font-size: var(--fs-caption); }
.kv-duell__kat { border-top: 1px solid var(--c-border); }
.kv-duell__kat[open] .vk-vorteil__pfeil { transform: rotate(180deg); }
/* Aktions-Zeile im GKV-Block: Duell-Toggle + GKV-Vergleich als Buttons nebeneinander.
   Die Knöpfe behalten beim Aufklappen ihre Position (Owner-Befund 2026-08-04, ersetzt
   den order:-1-Ansatz vom 2026-07-30): das <details> löst sich per display:contents
   auf — Knopf und Panel sind eigenständige Flex-Kinder. Die Knopf-Reihe bleibt
   unverändert stehen, das Panel bricht als volle Zeile DARUNTER um (order hinter
   alle Knöpfe). */
.gkv-aktionen { display: flex; flex-wrap: wrap; gap: var(--sp-2); align-items: flex-start; margin-top: var(--sp-3); }
.kv-duell-details { display: contents; }
.kv-duell-details > [data-kasseninfo] { flex: 1 1 100%; order: 10; min-width: 0; }
.kv-duell-details__knopf { cursor: pointer; list-style: none; display: inline-flex; align-items: center; gap: var(--sp-2); }
.kv-duell-details__knopf::-webkit-details-marker { display: none; }
.kv-duell-details[open] > summary .vk-vorteil__pfeil { transform: rotate(180deg); }
.kv-duell-details > .kv-duell, .kv-duell-details > [data-kasseninfo] { margin-top: var(--sp-3); }
/* Berater-Ausblenden je Kategorie (Call 2026-07-24): Toggle im Kategorie-Kopf;
   ausgeblendete Kategorie in der Konsole gedämpft (erscheint nicht im Konzept). */
.kv-duell__aus { display: inline-flex; margin-left: auto; }
.kv-duell__aus + .vk-vorteil__pfeil { margin-left: var(--sp-2); }
.kv-duell__kat--aus > summary { opacity: .55; }
.kv-duell__kat--aus > summary .badge--neutral { opacity: 1; }
/* Einzeln ausgeblendete Bedarfs-Felder (Call 2026-07-24 #4): Konsole zeigt sie gedimmt,
   der Zeilen-Toggle sitzt rechts im Titel (gleiche Sprache wie das Kategorie-Ausblenden). */
.kv-duell__zeile--aus { opacity: .55; }
.kv-duell__titel--aktionen { display: inline-flex; align-items: center; gap: var(--sp-1); }
.kv-duell__titel--aktionen .kv-duell__aus { margin-left: 0; }
/* Berater-Duell im kvk-Modal (Owner 2026-08-05): dieselbe Steuerung in der
   Präsentations-Optik — Ausgeblendetes gedimmt, das Auge sitzt im Kopf/Titel. */
.kvk-kategorie--aus > .kvk-kategorie__kopf { opacity: .55; }
.kvk-kategorie--aus > .kvk-kategorie__kopf .badge--neutral { opacity: 1; }
.kvk-zeile--aus { opacity: .55; }
.kvk-zeile__titel .kv-duell__aus { margin-left: var(--sp-1); vertical-align: middle; }
.kvk-kategorie__links .kv-duell__aus { margin-left: var(--sp-1); }

/* Bilanz: Gesamtkosten-Details fix/variabel (Ole/Alex 2026-07-27). */
.vk-bilanzkarte__details { margin-top: var(--sp-2); font-size: var(--fs-sm); }
.vk-bilanzkarte__details > summary { cursor: pointer; color: var(--c-accent); font-weight: var(--fw-medium); list-style: none; }
.vk-bilanzkarte__details > summary::-webkit-details-marker { display: none; }
.vk-bilanzkarte__aufschluesselung { list-style: none; margin: var(--sp-2) 0 0; padding: 0; display: grid; gap: var(--sp-1); }
.vk-bilanzkarte__aufschluesselung li { display: flex; justify-content: space-between; gap: var(--sp-3); }
.vk-bilanzkarte__aufschluesselung li span:last-child { font-variant-numeric: tabular-nums; white-space: nowrap; }
.vk-bilanzkarte__aufschluesselung-sub { color: var(--c-text-muted); font-size: var(--fs-caption); padding-left: var(--sp-3); }

/* ── Konzept-Präsentation, zwei Schritte (ks-*, v9 D FINAL, 2026-07-29) ─────────
   Owner-Prototyp „Gesundheitskonzept v9 D" (handoff-v9d). Schritt 1 =
   Ein-Zeilen-Scanliste mit Schweregraden, Schritt 2 = Vergleichstabelle
   Kategorie | Aktuell | Pfeil | Empfehlung. EINE Zeile = EIN <details>;
   `name`-Attribut = natives Akkordeon (immer nur eine Zeile offen).
   Spec: wissen/design-system.md §Konzept-Präsentation. */
.ks { margin-top: var(--sp-6); zoom: var(--ks-zoom); }

/* Schweregrad-Farbe als Custom Property je Zeile — Balken, Punkt und Kernbetrag
   lesen sie gemeinsam. */
[data-grad="hoch"] { --ks-grad: var(--ks-grad-hoch); }
[data-grad="mittel"] { --ks-grad: var(--ks-grad-mittel); }
[data-grad="gering"] { --ks-grad: var(--ks-grad-gering); }
/* Schon abgesichert (Bestandstarif) ist KEIN Risiko → grün statt Schweregrad-Farbe
   (Owner 2026-07-30): der Schweregrad bleibt intern, darf aber nicht mehr alarmieren. */
.ks-scan__zeile[data-status="vorhanden"] { --ks-grad: var(--kk-green); }

/* ── Schritt 1: Scanliste ── */
.ks-scan__liste { display: grid; gap: var(--sp-2); max-width: var(--ks-scan-w); }
.ks-scan__zeile { border-radius: var(--r-md); background: var(--c-surface); border: 1px solid var(--c-border); border-left: var(--ks-balken) solid var(--ks-grad, var(--c-border)); overflow: hidden; }
.ks-scan__kopf { display: flex; align-items: center; gap: var(--sp-3); padding: var(--sp-3) var(--sp-4); cursor: pointer; list-style: none; }
.ks-scan__kopf::-webkit-details-marker { display: none; }
.ks-scan__kopf:hover { background: var(--c-surface-muted); }
.ks-scan__icon { width: var(--ks-scan-icon); height: var(--ks-scan-icon); flex: none; display: inline-flex; align-items: center; justify-content: center; }
.ks-scan__icon img { width: var(--ks-icon-bild); height: var(--ks-icon-bild); object-fit: contain; }
.ks-scan__titel { flex: 1; min-width: 0; font-size: var(--fs-body); font-weight: var(--fw-bold); text-wrap: pretty; }
.ks-scan__wert { font-size: var(--fs-body); font-weight: var(--fw-bold); color: var(--ks-grad); white-space: nowrap; font-variant-numeric: tabular-nums; }
.ks-scan__punkt { width: var(--ks-punkt); height: var(--ks-punkt); flex: none; border-radius: var(--r-full); background: var(--ks-grad); }
.ks-scan__pill { display: inline-flex; align-items: center; flex: none; padding: var(--sp-1) var(--sp-3); border-radius: var(--r-full); border: 1px solid var(--c-border); color: var(--c-text-soft); font-size: var(--fs-caption); font-weight: var(--fw-semibold); white-space: nowrap; }
.ks-scan__pill-auf, .ks-scan__zeile[open] .ks-scan__pill-zu { display: none; }
.ks-scan__zeile[open] .ks-scan__pill-auf { display: inline; }
.ks-scan__auf { padding: 0 var(--sp-4) var(--sp-4) calc(var(--ks-scan-icon) + var(--sp-3) * 2); }
.ks-scan__kopfzeile { margin: 0 0 var(--sp-1); font-size: var(--fs-sm); font-weight: var(--fw-bold); color: var(--c-text); text-wrap: pretty; }
.ks-scan__risiko { margin: 0 0 var(--sp-2); font-size: var(--fs-sm); font-weight: var(--fw-semibold); color: var(--ks-grad); text-wrap: pretty; }

/* ── GKV-Hero (Schritt 1, Design-Handoff 2026-07-30) ──────────────────────────
   Die Krankenkasse ist der wichtigste Beratungsbestandteil → dominanter Container
   ganz oben, immer offen, Logo der aktuellen Kasse sichtbar. Statusfarbe via
   --ks-grad (data-grad + data-status wie die Scanzeilen; vorhanden = grün). */
.ks-gkv-hero { display: flex; flex-wrap: wrap; align-items: stretch; gap: var(--sp-6); max-width: var(--ks-scan-w); margin: 0 0 var(--sp-4); padding: 24px 28px; border-radius: 18px; background: var(--c-surface); border: 1.5px solid var(--ks-hero-bd); border-left: 6px solid var(--ks-grad, var(--c-border)); box-shadow: var(--ks-hero-shadow); }
.ks-gkv-hero[data-status="vorhanden"] { --ks-grad: var(--kk-green); }
.ks-gkv-hero__logo { flex: 0 0 168px; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: var(--sp-3); padding: 16px 14px; background: var(--ks-hero-tile-bg); border: 1px solid var(--ks-hero-tile-bd); border-radius: var(--r-md); }
.ks-gkv-hero__logo-img { max-width: 120px; max-height: 44px; object-fit: contain; }
.ks-gkv-hero__mono { width: 72px; height: 44px; display: inline-flex; align-items: center; justify-content: center; border-radius: var(--r-sm); background: var(--c-surface); color: var(--c-primary); font-size: 18px; font-weight: var(--fw-bold); }
.ks-gkv-hero__logo-label { font-size: 11px; font-weight: var(--fw-bold); letter-spacing: .05em; text-transform: uppercase; color: var(--c-text-soft); text-align: center; }
.ks-gkv-hero__text { flex: 1 1 260px; min-width: 0; display: flex; flex-direction: column; }
.ks-gkv-hero__eyebrow { margin: 0 0 2px; font-size: 11.5px; font-weight: var(--fw-bold); letter-spacing: .06em; text-transform: uppercase; color: var(--c-text-muted); }
.ks-gkv-hero__headline { margin: 0 0 var(--sp-1); font-size: 19px; font-weight: var(--fw-bold); color: var(--c-text); line-height: 1.25; text-wrap: pretty; }
.ks-gkv-hero__status { margin: 0 0 10px; font-size: 14px; font-weight: var(--fw-bold); color: var(--ks-grad); text-wrap: pretty; }
.ks-gkv-hero__punkte { margin: 0; padding: 0; list-style: none; display: grid; gap: var(--sp-1); }
.ks-gkv-hero__punkte li { display: flex; gap: 7px; font-size: 13px; font-weight: var(--fw-medium); color: var(--c-text-muted); line-height: 1.5; text-wrap: pretty; }
.ks-gkv-hero__punkte li::before { content: "–"; color: var(--ks-grad); flex: none; }
.ks-gkv-hero__betrag { flex: 0 0 auto; margin-left: auto; display: flex; flex-direction: column; align-items: flex-end; justify-content: flex-start; gap: 2px; }
.ks-gkv-hero__wert { display: flex; align-items: center; gap: var(--sp-2); font-size: 26px; font-weight: var(--fw-bold); color: var(--ks-grad); white-space: nowrap; font-variant-numeric: tabular-nums; }
.ks-gkv-hero__dot { width: 11px; height: 11px; flex: none; border-radius: var(--r-full); background: var(--ks-grad); }
.ks-gkv-hero__betrag-sub { font-size: 12px; font-weight: var(--fw-semibold); color: var(--c-text-soft); white-space: nowrap; }
.ks-gkv-hero__aktuell { margin-top: 6px; font-size: 12.5px; font-weight: var(--fw-semibold); color: var(--c-text-muted); white-space: nowrap; }
@media (max-width: 640px) { .ks-gkv-hero__betrag { margin-left: 0; align-items: flex-start; } }

.ks-legende { display: flex; align-items: center; gap: var(--sp-4); margin: var(--sp-2) 0 0; padding: 0 var(--sp-2); }
.ks-legende__eintrag { display: inline-flex; align-items: center; gap: var(--sp-1); font-size: var(--fs-caption); font-weight: var(--fw-semibold); color: var(--c-text-soft); }
.ks-legende__punkt { width: var(--ks-punkt); height: var(--ks-punkt); border-radius: var(--r-full); background: var(--ks-grad); }

/* Grid + Gap (Owner-Polish 2026-08-05): Fazit-Karte und Posten-Tabelle klebten
   aneinander — fester Abstand zwischen allen Fazit-Kindern (Schritt 1 UND 2). */
.ks-fazit { display: grid; gap: var(--sp-4); margin-top: var(--sp-5); padding-top: var(--sp-5); border-top: 2px solid var(--c-border); }
.ks-fazit .ks-posten { margin-bottom: 0; }
.ks-fazit__karte { display: flex; align-items: center; gap: var(--sp-4); padding: var(--sp-4) var(--sp-5); border-radius: var(--ks-zeile-radius); background: var(--c-surface); border: 1px solid var(--kk-violet-bd); flex-wrap: wrap; }
.ks-fazit__icon { width: 52px; height: 52px; flex: none; display: inline-flex; align-items: center; justify-content: center; }
.ks-fazit__icon img { width: 34px; height: 34px; object-fit: contain; }
.ks-fazit__text { flex: 1; min-width: 220px; display: flex; flex-direction: column; gap: var(--sp-1); }
.ks-fazit__label { font-size: var(--fs-caption); font-weight: var(--fw-bold); letter-spacing: .06em; text-transform: uppercase; color: var(--c-text-soft); }
.ks-fazit__wert { font-size: var(--ks-fazit-fs); font-weight: var(--fw-bold); color: var(--c-text); line-height: 1.1; font-variant-numeric: tabular-nums; }
.ks-fazit__hinweis { font-size: var(--fs-caption); font-weight: var(--fw-semibold); color: var(--c-text-soft); text-wrap: pretty; }

/* ── Schritt 2: Vergleichstabelle ── */
.ks-kopfzeile { display: grid; grid-template-columns: var(--ks-spalte-kat) minmax(0, 1fr) var(--ks-spalte-delta) minmax(0, 1fr); gap: var(--sp-2); }
.ks-kopfzeile__spalte { padding: var(--sp-2) var(--sp-4); font-size: var(--fs-sm); font-weight: var(--fw-bold); letter-spacing: .06em; text-transform: uppercase; color: var(--c-text-soft); }
.ks-kopfzeile__spalte--aktuell { color: var(--kg-heute-fg); text-align: center; }
.ks-kopfzeile__spalte--empf { color: var(--kg-konzept-fg); text-align: center; }
.ks-liste { display: grid; gap: var(--sp-2); }

.ks-zeile { border-radius: var(--ks-zeile-radius); }
.ks-zeile__kopf { display: grid; grid-template-columns: var(--ks-spalte-kat) minmax(0, 1fr) var(--ks-spalte-delta) minmax(0, 1fr); gap: var(--sp-2); align-items: stretch; cursor: pointer; list-style: none; }
.ks-zeile__kopf::-webkit-details-marker { display: none; }

/* Kategorie-Spalte OHNE Kasten: nur Icon + Label. */
.ks-kategorie { display: flex; align-items: center; gap: var(--sp-3); padding: var(--sp-2) var(--sp-1); }
.ks-kategorie__icon { width: var(--ks-icon); height: var(--ks-icon); flex: none; display: inline-flex; align-items: center; justify-content: center; }
.ks-kategorie__icon img { width: var(--ks-icon-bild); height: var(--ks-icon-bild); object-fit: contain; }
.ks-kategorie__label { flex: 1; min-width: 0; font-size: var(--fs-sm); font-weight: var(--fw-bold); text-wrap: pretty; overflow-wrap: break-word; }

/* Zellen: weiß mit 4-px-Seitenbalken; Inhalt zugeklappt vertikal zentriert,
   aufgeklappt oben bündig (beide Zellen klappen als EIN <details> gemeinsam). */
/* flex-wrap: die zugeklappte Tarif-Vorschau (.ks-tarifmini, flex-basis 100%) rutscht
   in eine EIGENE Zeile unter Kopftext + ✎ + Caret — sonst quetscht ein langer
   Tarifname den Pinsel/Caret über den Text (Owner-Befund 2026-07-30). */
.ks-zelle { display: flex; flex-wrap: wrap; align-items: center; gap: var(--sp-3); padding: var(--sp-3) var(--sp-3) var(--sp-3) var(--sp-4); border-radius: var(--ks-zeile-radius); background: var(--c-surface); border: 1px solid var(--c-border); }
.ks-zelle--aktuell { border-left: var(--ks-balken) solid var(--kg-heute-fg); }
.ks-zelle--empf { border-left: var(--ks-balken) solid var(--kg-konzept-fg); }
.ks-zeile[open] .ks-zelle { align-items: flex-start; }
.ks-zelle__inhalt { flex: 1; min-width: 0; display: flex; align-items: center; gap: var(--sp-3); }
.ks-zelle__kopftext { min-width: 0; font-size: var(--fs-sm); font-weight: var(--fw-bold); color: var(--c-text); line-height: 1.3; text-wrap: pretty; font-variant-numeric: tabular-nums; }
.ks-tag { flex: none; padding: 2px var(--sp-2); border-radius: var(--r-full); font-size: var(--fs-caption); font-weight: var(--fw-bold); letter-spacing: .05em; text-transform: uppercase; white-space: nowrap; }
.ks-tag--aktuell { background: var(--kk-error-soft); color: var(--kg-heute-fg); }
.ks-tag--empf { background: var(--kk-green-soft); color: var(--kg-konzept-fg); }
.ks-pfeil { display: inline-flex; align-items: center; justify-content: center; width: 24px; height: 24px; flex: none; border-radius: var(--r-full); border: 1px solid var(--c-border); color: var(--c-text-soft); font-size: var(--fs-caption); }
.ks-zeile[open] .ks-pfeil { transform: rotate(180deg); }
.ks-zelle--empf .ks-pfeil { visibility: visible; }

/* Pfeil-Spalte: graues → mittig, darunter das Delta. */
.ks-delta { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 2px; min-width: 0; }
.ks-delta__pfeil { color: var(--kk-ink-soft); font-size: var(--fs-body); }
/* Deltas verstärkt (Design-Handoff Schritt 2, 2026-07-30): 12,5 px statt caption,
   Gewicht 700/800; Summe 15 px/800. Farbe bleibt Token. */
.ks-delta__text { font-size: 12.5px; font-weight: var(--fw-bold); text-align: center; line-height: 1.3; font-variant-numeric: tabular-nums; text-wrap: balance; }
.ks-delta--laufend .ks-delta__text { color: var(--ks-delta-laufend); font-weight: 800; }
.ks-delta--risiko .ks-delta__text { color: var(--ks-delta-risiko); font-weight: var(--fw-bold); }
.ks-delta--leise .ks-delta__text { color: var(--ks-delta-leise); font-weight: var(--fw-semibold); }
.ks-zeile--summe .ks-delta__text { font-size: 15px; font-weight: 800; }

/* Zurückgenommene Zustände: „offen" bleibt ruhig (Owner-Regel), „aus" trägt den
   Warnton nur im Chip — nie als Fläche. */
.ks-zeile[data-status="offen"] .ks-tag--empf { background: var(--c-surface-muted); color: var(--c-text-muted); }
/* Schon abgesichert = grün (kein Risiko), nicht grau/rot (Owner 2026-07-30): der
   „Aktuell"-Tag + linke Kante der Zeile werden grün, weil hier schon Schutz besteht. */
.ks-zeile[data-status="vorhanden"] .ks-tag--aktuell { background: var(--kk-green-soft); color: var(--kg-konzept-fg); }
.ks-zeile[data-status="vorhanden"] .ks-zelle--aktuell { border-left-color: var(--kg-konzept-fg); }
.ks-zeile[data-status="aus"] .ks-tag--empf { background: var(--kk-error-soft); color: var(--kg-heute-fg); }

/* Summenzeile: 12-%-Tönung, Chip ÜBER dem Betrag gestapelt (nie umbrechen). */
.ks-zeile--summe .ks-zelle--aktuell { background: var(--ks-tint-a-bg); border-color: var(--ks-tint-a-bd); border-left-color: var(--kg-heute-fg); }
.ks-zeile--summe .ks-zelle--empf { background: var(--ks-tint-e-bg); border-color: var(--ks-tint-e-bd); border-left-color: var(--kg-konzept-fg); }
.ks-zeile--summe .ks-zelle__inhalt { flex-direction: column; align-items: flex-start; gap: var(--sp-1); }
.ks-zeile--summe .ks-zelle__kopftext { font-size: var(--ks-summe-fs); white-space: nowrap; }
.ks-zeile--summe .ks-zelle--aktuell .ks-zelle__kopftext { color: var(--kg-heute-fg); }
.ks-zeile--summe .ks-zelle--empf .ks-zelle__kopftext { color: var(--kg-konzept-fg); }

/* Aufgeklappt: Inhalt unter den Zellen im selben Raster. */
.ks-zeile__auf { display: grid; grid-template-columns: var(--ks-spalte-kat) minmax(0, 1fr) var(--ks-spalte-delta) minmax(0, 1fr); gap: var(--sp-2); padding-top: var(--sp-2); }
.ks-auf { min-width: 0; padding: var(--sp-3) var(--sp-4); border-radius: var(--ks-zeile-radius); background: var(--c-surface); border: 1px solid var(--c-border); }
.ks-auf--aktuell { grid-column: 2; }
.ks-auf--empf { grid-column: 4; }
.ks-auf__hinweis { margin: 0 0 var(--sp-2); font-size: var(--fs-sm); font-weight: var(--fw-semibold); text-wrap: pretty; }
.ks-auf__hinweis--aktuell { color: var(--kg-heute-fg); }
.ks-auf__hinweis--empf { color: var(--kg-konzept-fg); }
.ks-punkte { display: grid; gap: var(--sp-1); margin: 0; padding: 0; list-style: none; }
.ks-punkte__punkt { display: flex; align-items: baseline; gap: var(--sp-2); font-size: var(--fs-caption); font-weight: var(--fw-semibold); color: var(--c-text-muted); text-wrap: pretty; }
.ks-punkte--aktuell .ks-punkte__punkt::before { content: "–"; color: var(--kg-heute-fg); font-weight: var(--fw-bold); flex: none; }
.ks-punkte--empf .ks-punkte__punkt::before { content: "–"; color: var(--kg-konzept-fg); font-weight: var(--fw-bold); flex: none; }

/* Posten-Box der Summenzeile: Label fest, Annahme schrumpft mit Ellipsis —
   lange Tarifnamen dürfen die Grid-Spalte nie sprengen (Prototyp-Fix). */
.ks-posten { display: grid; gap: var(--sp-1); margin: 0 0 var(--sp-3); padding: var(--sp-2) var(--sp-3); border-radius: var(--r-md); background: var(--c-surface); border: 1px solid var(--c-border); overflow: hidden; }
.ks-posten__zeile { display: flex; align-items: baseline; gap: var(--sp-2); min-width: 0; }
.ks-posten__label { flex: none; max-width: 45%; overflow: hidden; text-overflow: ellipsis; font-size: var(--fs-caption); font-weight: var(--fw-semibold); color: var(--c-text); white-space: nowrap; }
.ks-posten__annahme { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; font-size: var(--fs-caption); color: var(--kk-ink-soft); text-align: right; white-space: nowrap; }
.ks-posten__wert { flex: none; text-align: right; font-size: var(--fs-caption); font-weight: var(--fw-bold); font-variant-numeric: tabular-nums; white-space: nowrap; }
.ks-posten__gesamt { display: flex; align-items: baseline; justify-content: space-between; gap: var(--sp-2); margin-top: 2px; padding-top: var(--sp-1); border-top: 1px solid var(--c-border); font-size: var(--fs-caption); font-weight: var(--fw-bold); }
.ks-posten__gesamt--aktuell { color: var(--kg-heute-fg); border-top-color: var(--ks-tint-a-bd); }
.ks-posten__gesamt--empf { color: var(--kg-konzept-fg); border-top-color: var(--ks-tint-e-bd); }
/* Vergleichs-Variante (Owner 2026-08-05, Schritt 2): je Posten Heute · Mit
   Konzept · Ersparnis — festes Spaltenraster, damit die Zahlen fluchten.
   Ersparnis grün (dokumentierte Konzept-Ausnahme), Mehrbetrag lila, nie rot. */
.ks-posten--vergleich .ks-posten__zeile,
.ks-posten__gesamt--vergleich { display: grid; grid-template-columns: minmax(0, 1fr) 92px 92px 112px; gap: var(--sp-1) var(--sp-3); align-items: baseline; }
.ks-posten--vergleich .ks-posten__label { max-width: none; }
.ks-posten--vergleich .ks-posten__wert, .ks-posten__gesamt--vergleich span { text-align: right; }
.ks-posten__gesamt--vergleich span:first-child { text-align: left; }
.ks-posten__spalte { font-size: 10px; font-weight: var(--fw-semibold); letter-spacing: .04em; text-transform: uppercase; color: var(--c-text-muted); text-align: right; white-space: nowrap; }
/* Zeilen-Icon (Owner 2026-08-05): dieselben Kategorie-Icons wie Kapitel/Karten */
.ks-posten__icon { width: 18px; height: 18px; object-fit: contain; vertical-align: -4px; margin-right: 6px; }
.ks-posten__spart { text-align: right; font-size: var(--fs-caption); font-weight: var(--fw-bold); color: var(--c-spart); font-variant-numeric: tabular-nums; white-space: nowrap; }
.ks-posten__mehr { text-align: right; font-size: var(--fs-caption); font-weight: var(--fw-bold); color: var(--c-primary); font-variant-numeric: tabular-nums; white-space: nowrap; }
.ks-posten__gleich { text-align: right; font-size: var(--fs-caption); color: var(--c-text-soft); }
/* Heute-Gesamtsumme = ersetzter Stand (Owner 2026-08-05): durchgestrichen, rosé */
.ks-posten__alt { text-decoration: line-through; color: var(--kr-rose); }
/* Hover-Erklärbox (Owner 2026-08-05): woraus setzt sich die Zahl zusammen?
   Reines CSS (content: attr) — kein JS, per Tastatur via :focus erreichbar.
   Die Vergleichs-Box darf dafür nicht clippen (Owner-Befund: Popup rutschte
   unters Layer) — overflow auf, gehobene Ebene beim Hover. */
.ks-posten--vergleich { overflow: visible; }
.ks-tip { position: relative; cursor: help; text-decoration: underline dotted var(--c-border); text-underline-offset: 3px; }
.ks-tip:hover,
.ks-tip:focus { z-index: 41; }
.ks-tip:hover::after,
.ks-tip:focus::after { content: attr(data-tip); position: absolute; right: 0; bottom: calc(100% + 6px); z-index: 30; width: max-content; max-width: 340px; background: var(--kr-akzent); color: var(--c-text-on-accent); border-radius: var(--kr-radius-innen); padding: 8px 12px; font-size: var(--fs-caption); font-weight: var(--fw-medium); line-height: 1.4; white-space: normal; text-align: left; }
@media (max-width: 640px) { .ks-posten--vergleich .ks-posten__zeile, .ks-posten__gesamt--vergleich { grid-template-columns: minmax(0, 1fr) 64px 64px 84px; } }

/* Tarif-Chip im Empfehlungs-Expand (weiße Karte mit grünem Rahmen). */
.ks-tarif { display: flex; flex-wrap: wrap; align-items: center; gap: var(--sp-2) var(--sp-3); margin-bottom: var(--sp-2); padding: var(--sp-2) var(--sp-3); border-radius: var(--r-md); background: var(--c-surface); border: 1px solid var(--kg-konzept-bd); }
.ks-tarif__logo { max-height: 16px; max-width: 44px; flex: none; object-fit: contain; }
.ks-tarif__name { flex: 1; min-width: 0; font-size: var(--fs-caption); font-weight: var(--fw-bold); color: var(--kg-konzept-fg); }
.ks-tarif__preis { font-size: var(--fs-caption); font-weight: var(--fw-bold); color: var(--kg-konzept-fg); white-space: nowrap; font-variant-numeric: tabular-nums; }
.ks-tarif__vergleich { flex: 1 1 100%; justify-content: center; text-align: center; margin-top: var(--sp-1); border: 0; border-radius: var(--r-full); background: var(--kg-konzept-fg); color: var(--c-surface); font-size: var(--fs-caption); font-weight: var(--fw-bold); }
/* Pinsel im Kartenkopf (Design-Handoff Edit-Modal 2026-07-30): 24px runder Violett-
   Chip, links vom Caret. Sitzt im <summary>; app.js unterbindet das Karten-Toggle. */
.ks-edit { display: inline-flex; align-items: center; justify-content: center; width: 24px; height: 24px; flex: none; padding: 0; border: 0; border-radius: var(--r-full); background: var(--ks-edit-bg); color: var(--ks-edit-fg); font: inherit; font-size: 11px; line-height: 1; cursor: pointer; }
.ks-edit:hover { background: var(--ks-edit-bg-hover); }

/* Erspar-Banner: 12-%-Grün-Tönung, Text dunkelgrün; Mehrkosten neutral violett. */
.ks-banner { margin: var(--sp-4) 0 0; padding: var(--sp-4) var(--sp-5); border-radius: var(--ks-zeile-radius); background: var(--ks-banner-bg); border: 1px solid var(--ks-banner-bd); color: var(--ks-banner-fg); font-size: var(--fs-h3); font-weight: var(--fw-bold); text-align: center; text-wrap: pretty; }
.ks-banner--mehr { background: var(--ks-banner-mehr-bg); border-color: var(--ks-banner-mehr-bd); color: var(--ks-banner-mehr-fg); }

/* ── Kassen-Hero über der Vergleichstabelle (Schritt 2, Design-Handoff 2026-07-30):
   Kasse aus der Liste heraus, Aktuell (rosé) → Delta → Empfehlung (grün). Nur Tokens. */
.ks-hero2 { display: flex; align-items: center; gap: var(--sp-4); flex-wrap: wrap; margin-bottom: var(--sp-5); padding: var(--sp-5) var(--sp-6); border-radius: var(--r-lg); background: var(--c-surface); border: 1px solid var(--c-border); box-shadow: var(--sh-card); }
.ks-hero2__label { flex: 0 0 150px; min-width: 0; }
.ks-hero2__eyebrow { margin: 0 0 2px; font-size: var(--fs-caption); font-weight: 800; letter-spacing: .06em; text-transform: uppercase; color: var(--c-text-muted); }
.ks-hero2__sub { margin: 0; font-size: var(--fs-sm); font-weight: var(--fw-semibold); color: var(--c-text-soft); text-wrap: pretty; }
.ks-hero2__box { flex: 1 1 200px; min-width: 0; padding: var(--sp-3) var(--sp-4); border-radius: var(--r-md); border: 1px solid var(--c-border); border-left: var(--ks-balken) solid var(--c-border); }
.ks-hero2__box--alt { background: var(--ks-tint-a-bg); border-color: var(--ks-tint-a-bd); border-left-color: var(--kg-heute-fg); }
.ks-hero2__box--neu { background: var(--ks-tint-e-bg); border-color: var(--ks-tint-e-bd); border-left-color: var(--kg-konzept-fg); }
.ks-hero2__tag { margin: 0 0 5px; font-size: 10.5px; font-weight: 800; letter-spacing: .05em; text-transform: uppercase; }
.ks-hero2__tag--alt { color: var(--kg-heute-fg); }
.ks-hero2__tag--neu { color: var(--kg-konzept-fg); }
.ks-hero2__zeile { display: flex; align-items: center; gap: var(--sp-3); }
.ks-hero2__logo { max-height: 20px; max-width: 60px; flex: none; object-fit: contain; }
.ks-hero2__preis { font-size: 17px; font-weight: 800; color: var(--c-text); white-space: nowrap; font-variant-numeric: tabular-nums; }
.ks-hero2__preis--neu { color: var(--kg-konzept-fg); }
.ks-hero2__meta { margin: 4px 0 0; font-size: 11.5px; font-weight: var(--fw-semibold); color: var(--c-text-muted); }
.ks-hero2__fuss { display: flex; align-items: center; justify-content: space-between; gap: var(--sp-3); margin-top: 4px; flex-wrap: wrap; }
.ks-hero2__vergleich { padding: 4px 11px; border: 0; border-radius: var(--r-full); background: var(--kg-konzept-fg); color: var(--c-surface); font: inherit; font-size: 11px; font-weight: 800; cursor: pointer; white-space: nowrap; }
.ks-hero2__pfeil { flex: 0 0 auto; display: flex; flex-direction: column; align-items: center; gap: 2px; }
.ks-hero2__pfeil-ico { color: var(--c-text-soft); font-size: var(--fs-body); }
.ks-hero2__delta { font-size: var(--fs-body); font-weight: 800; color: var(--kg-konzept-fg); white-space: nowrap; font-variant-numeric: tabular-nums; }

/* Zugeklappte Tarif-Vorschau in der Empfehlungszelle — beim Aufklappen ausgeblendet. */
.ks-tarifmini { flex: 1 1 100%; display: flex; align-items: flex-start; gap: var(--sp-2); margin-top: var(--sp-1); }
.ks-zeile[open] .ks-tarifmini { display: none; }
.ks-tarifmini__logo { width: 30px; height: 13px; flex: none; margin-top: 2px; object-fit: contain; object-position: left center; }
.ks-tarifmini__txt { flex: 1; min-width: 0; }
.ks-tarifmini__name { display: block; font-size: 11.5px; font-weight: var(--fw-semibold); color: var(--c-text-muted); line-height: 1.4; text-wrap: pretty; }
.ks-tarifmini__preis { display: block; font-size: 11px; font-weight: var(--fw-bold); color: var(--c-text-soft); white-space: nowrap; font-variant-numeric: tabular-nums; }

/* ── Vertrags-Überblick „Das schließt du konkret ab" (Schritt 2, Design-Handoff). */
.ks-vertrag { margin-top: var(--sp-6); }
.ks-vertrag__kopf { display: flex; align-items: baseline; justify-content: space-between; gap: var(--sp-3); flex-wrap: wrap; margin-bottom: var(--sp-3); padding: 0 var(--sp-1); }
.ks-vertrag__titel { font-size: var(--fs-h3); font-weight: 800; letter-spacing: .04em; text-transform: uppercase; color: var(--c-text-muted); }
.ks-vertrag__zaehler { font-size: var(--fs-sm); font-weight: var(--fw-semibold); color: var(--c-text-soft); }
.ks-vertrag__liste { display: grid; gap: var(--sp-2); }
.ks-vertrag__karte { display: flex; align-items: center; gap: var(--sp-4); padding: var(--sp-3) var(--sp-5); border-radius: var(--r-md); background: var(--c-surface); border: 1px solid var(--c-border-soft); box-shadow: var(--sh-sm); flex-wrap: wrap; }
.ks-vertrag__logo { width: 56px; height: 22px; flex: none; object-fit: contain; object-position: left center; }
.ks-vertrag__logo--leer { background: var(--c-surface-muted); border-radius: var(--r-sm); }
.ks-vertrag__mitte { flex: 1 1 240px; min-width: 0; display: flex; flex-direction: column; gap: 1px; }
.ks-vertrag__name { font-size: var(--fs-sm); font-weight: 800; color: var(--c-text); text-wrap: pretty; }
.ks-vertrag__deckt { font-size: var(--fs-caption); font-weight: var(--fw-semibold); color: var(--c-text-soft); }
.ks-vertrag__rechts { flex: 0 0 auto; margin-left: auto; display: flex; flex-direction: column; align-items: flex-end; gap: 1px; }
.ks-vertrag__preis { font-size: var(--fs-sm); font-weight: 800; color: var(--c-text); white-space: nowrap; font-variant-numeric: tabular-nums; }
.ks-vertrag__typ { font-size: 10.5px; font-weight: var(--fw-bold); letter-spacing: .04em; text-transform: uppercase; color: var(--c-text-soft); white-space: nowrap; }
.ks-vertrag__summe { display: flex; align-items: center; justify-content: space-between; gap: var(--sp-3); padding: var(--sp-3) var(--sp-5); border-radius: var(--r-md); background: var(--kk-violet-50); border: 1px solid var(--kk-violet-bd); }
.ks-vertrag__summe-label { font-size: var(--fs-sm); font-weight: 800; color: var(--kk-violet-800); }
.ks-vertrag__summe-wert { font-size: var(--fs-h3); font-weight: 800; color: var(--kk-violet-800); white-space: nowrap; font-variant-numeric: tabular-nums; }

.ks-fuss { display: flex; align-items: center; justify-content: space-between; gap: var(--sp-4); margin-top: var(--sp-5); flex-wrap: wrap; }
/* margin-left:auto hält die rechte Gruppe auch dann rechts, wenn der linke
   Zurück-Button fehlt (Alles-auf-einen-Blick, Owner 2026-08-12). */
.ks-fuss__rechts { display: flex; align-items: center; gap: var(--sp-3); margin-left: auto; }
/* Bekannt-aus-Siegel (Karte OgihqGV6, Owner 21.08.): Vertrauens-Anker der
   Konzept-Präsentation, bleibt bewusst auch im Druck (Kundenblatt). */
.bekannt-aus { display: flex; justify-content: center; margin-top: var(--sp-8); padding-top: var(--sp-5); border-top: 1px solid var(--c-border-soft); break-inside: avoid; }
.bekannt-aus__logo { height: var(--siegel-h); width: auto; }
/* Kopf-Variante (Owner-Order 21.08., löst die Fuß-Platzierung ab): oben rechts
   im vk-kopf. Karte 148 (Owner: 70 % kleiner): FESTE Höhe --siegel-h-kopf
   statt stretch — der stretch begrenzte das Bild nicht (height:100% auf
   auto-hoher Flex-Zelle = Asset-Größe 320px, „viel zu groß"). */
.bekannt-aus--kopf { margin: 0; padding: 0; border: 0; margin-left: auto; align-self: center; }
.bekannt-aus--kopf .bekannt-aus__logo { height: var(--siegel-h-kopf); }

/* Grüner Primär-Knopf („Konzept aktivieren") — Marken-Grün statt Violett. */
.btn--gruen { background: var(--kk-green); border-color: var(--kk-green); color: var(--c-surface); }
.btn--gruen:hover { filter: brightness(.94); color: var(--c-surface); }

/* ── Regie-Präsentation v11 B (kr-*, Owner-Paket handoff-v11b, 2026-07-31) ───────
   Schritt 1: Kapitel-Chips + Szenario-Karten (Risiko baut sich auf, Rosé);
   Schritt 2: Vorher/Nachher-Hero + Ist→Optimiert-Kapitel (Risiko → 0, Grün) +
   „Alles auf einen Blick". Zustand lebt in Query-Params — alles sind Links. */
@keyframes kr-drop-in { from { opacity: 0; transform: translateY(-4px); } to { opacity: 1; transform: none; } }

/* Chip-Leiste (Kapitel) + Badge + Risiko-Filter */
.kr-leiste { display: flex; align-items: center; gap: var(--sp-2); margin-bottom: var(--sp-4); flex-wrap: wrap; }
.kr-chip { display: inline-flex; align-items: center; gap: var(--sp-2); padding: 5px 13px 5px 9px; border: 1px solid var(--kr-karte-bd); border-radius: var(--r-full); background: var(--c-surface); color: var(--kr-pill-gering); text-decoration: none; white-space: nowrap; }
.kr-chip:hover { text-decoration: none; border-color: var(--kr-chip-besucht-bd); color: var(--kr-akzent); }
.kr-chip__icon { width: 24px; height: 24px; flex: none; display: inline-flex; }
.kr-chip__icon img { width: 100%; height: 100%; object-fit: contain; }
.kr-chip__text { display: flex; flex-direction: column; align-items: flex-start; line-height: 1.25; }
.kr-chip__label { font-size: 11.5px; font-weight: var(--fw-bold); }
.kr-chip__wert { font-size: 10.5px; font-weight: 800; font-variant-numeric: tabular-nums; }
.kr-chip--aktiv, .kr-chip--aktiv:hover { background: var(--kr-akzent); border-color: var(--kr-akzent); color: var(--c-text-on-accent); }
.kr-chip--durch { background: var(--kr-chip-durch-bg); border-color: var(--kr-rose-bd-stark); color: var(--kr-rose); }
.kr-chip--durch.kr-chip--s2 { background: var(--kr-chip-durch2-bg); border-color: var(--kr-gruen-bd); color: var(--kr-gruen); }
.kr-chip--offenrest { background: var(--kr-chip-durch-bg); border-color: var(--kr-rose-bd-stark); color: var(--kr-rose); }
.kr-chip--besucht { border-color: var(--kr-chip-besucht-bd); color: var(--kr-akzent); }
.kr-badge { margin-left: auto; display: inline-flex; align-items: center; padding: 6px 13px; border-radius: var(--r-full); font-size: 11.5px; font-weight: 800; white-space: nowrap; font-variant-numeric: tabular-nums; }
.kr-badge--rose { background: var(--kr-rose-bg-stark); border: 1px solid var(--kr-rose-bd-stark); color: var(--kr-rose); }
.kr-badge--gruen { background: var(--kr-gruen-bg); border: 1px solid var(--kr-gruen-bd); color: var(--kr-gruen); }

/* Kapitelkarte */
.kr-karte { display: flex; flex-direction: column; gap: var(--sp-4); border: 1px solid var(--kr-karte-bd); border-radius: var(--kr-radius-gross); background: var(--c-surface); padding: 22px 26px; min-height: 340px; }
.kr-karte__kopf { display: flex; align-items: baseline; gap: var(--sp-3); padding-bottom: var(--sp-3); border-bottom: 2px solid var(--kr-akzent); }
.kr-karte__titel { margin: 0; font-size: var(--fs-h3); font-weight: 800; letter-spacing: .06em; text-transform: uppercase; color: var(--c-text); }
.kr-karte__eyebrow { margin-left: auto; font-size: 10px; font-weight: 800; letter-spacing: .09em; text-transform: uppercase; color: var(--c-primary); }
.kr-karte__intro { margin: 0; font-size: var(--fs-sm); font-weight: var(--fw-medium); color: var(--kr-pill-gering); text-wrap: pretty; }

/* GKV-Reform-Hinweis (Karten 124/153): grauer Gesetzes-Fakt-Kasten in der
   Kapitelkarte — rendert NUR bei gefülltem T17-Slot konzept.reform.<key>.
   Seit Karte 153: mehrere Slot-Zeilen = Stichpunkt-Liste (das Symbol steht im
   Text, deshalb keine CSS-Marker); optionaler „?"-Beleg (hover-info-Konvention)
   rechts oben — bei offenem Popup hebt sich der Kasten über die Nachbarn
   (gleiche Mechanik wie kr-szenario). */
.kr-reform { margin: var(--sp-2) 0 0; padding: var(--sp-3) var(--sp-4); border-radius: var(--kr-radius-box); background: var(--kr-reform-bg); border: 1px solid var(--kr-reform-bd); font-size: var(--fs-sm); color: var(--kr-reform-fg); text-wrap: pretty; }
.kr-reform__liste { margin: 0; padding: 0; list-style: none; display: grid; gap: var(--sp-2); }
.kr-reform__beleg { float: right; margin-left: var(--sp-2); color: var(--kr-reform-fg); }
.kr-reform__beleg .hover-info__pop { left: auto; right: 0; }
.kr-reform:has(.hover-info:hover), .kr-reform:has(.hover-info:focus-within) { position: relative; z-index: 30; overflow: visible; }
/* Karte 193: Aufklapper-Umbau — Kopf = Warn-Dreieck (Verkehrsschild-Asset) +
   Titel, Default ZU, Klick expandiert die Stichpunkte (Bestands-details). */
/* Owner 08.09.: auch im Alt-Flow ein KNOPF zum Presse-Popup — ~~summary/
   Warn-Dreieck/Stichpunkt-Liste~~ widerrufen (s. _kr_reform.html). */
.kr-reform--knopf { display: flex; align-items: center; gap: var(--sp-2); width: 100%; font: inherit; color: inherit; text-align: left; cursor: pointer; }
.kr-reform--knopf:hover { border-color: var(--c-accent); }
.kr-reform--knopf:focus-visible { outline: 2px solid var(--c-focus); outline-offset: 2px; }
.kr-reform__chip { flex: none; padding: 3px 10px; border-radius: 6px; background: var(--k2-rh-chip-bg); color: var(--k2-rot); font-size: 10px; font-weight: var(--fw-bold); letter-spacing: .04em; text-transform: uppercase; }
.kr-reform__titel { font-weight: var(--fw-bold); }
.kr-reform--knopf .vk-vorteil__pfeil { margin-left: auto; font-size: 18px; line-height: 1; color: var(--c-primary); }
.kr-reform__flaeche { display: block; margin-top: var(--sp-2); }

/* Basisschutz-Band (dunkel-lila, Kassen-Logo, OHNE Zusatzbeitrag) */
.kr-basis { display: flex; align-items: center; gap: var(--sp-4); border-radius: var(--kr-radius); background: var(--kr-akzent); padding: 14px 20px; }
.kr-basis__logo { display: inline-flex; align-items: center; justify-content: center; width: var(--kr-basis-logo-w); height: var(--kr-basis-logo-h); border-radius: var(--kr-radius-innen); background: var(--c-surface); flex: none; }
.kr-basis__logo img { max-width: 66px; max-height: 33px; object-fit: contain; }
.kr-basis__mono { font-weight: 800; color: var(--kr-akzent); }
.kr-basis__name { flex: 1; min-width: 0; font-size: var(--fs-body); font-weight: var(--fw-bold); color: var(--c-text-on-accent); }
.kr-basis__wert { font-size: var(--fs-h3); font-weight: 800; color: var(--c-text-on-accent); white-space: nowrap; font-variant-numeric: tabular-nums; }
.kr-basis__text { margin: 0; font-size: var(--fs-sm); font-weight: var(--fw-medium); color: var(--kk-warning); text-wrap: pretty; }

/* Immer offene Kundenfragen im Schritt-1-Kapitel (Owner 2026-08-05):
   Ja/Nein-Chips + Ausgaben-Zeilen der Konsole, dauerhaft in der Kapitelkarte. */
.kr-fragen { display: grid; gap: var(--sp-2); border-top: 1px solid var(--c-border-soft); padding-top: var(--sp-4); }
/* Zeilen-Layout + Ergebnis-Optik kommen aus den globalen
   .baustein__bedarf-*-Regeln (festes 5-Spalten-Grid, s. dort). */

/* GKV-Preis-Skala (Owner 2026-08-05): Einordnung der Kasse im Markt.
   Links teuer (rot) → rechts günstig (grün); Marker = aktuelle Kasse,
   Enden = teuerste/günstigste Kasse (anonym, nur die Spanne). Kein JS. */
.kr-skala { margin-top: var(--sp-5); }
.kr-skala__titel { margin: 0 0 var(--sp-6); font-size: var(--fs-sm); font-weight: var(--fw-medium); color: var(--c-text-muted); }
.kr-skala__band { position: relative; height: 10px; border-radius: 999px; background: linear-gradient(90deg, var(--kk-error), var(--kk-amber), var(--kk-green)); margin: 84px var(--sp-4) 6px; }
.kr-skala__marker { position: absolute; bottom: -4px; transform: translateX(-50%); display: flex; flex-direction: column; align-items: center; }
.kr-skala__nadel { width: 18px; height: 18px; border-radius: 50%; background: var(--c-surface); border: 5px solid var(--kr-akzent); }
.kr-skala__blase { position: absolute; bottom: 22px; display: flex; align-items: center; gap: var(--sp-2); white-space: nowrap; background: var(--kr-akzent); color: var(--c-text-on-accent); border-radius: var(--kr-radius-innen); padding: 4px 12px; }
/* Kassen-Logo in der Preis-Blase (Owner 2026-08-06): kleines Logo auf weißem
   Chip, damit Farb-Logos auf dem dunklen/grünen Akzent lesbar bleiben. */
.kr-skala__blase-logo { display: inline-flex; align-items: center; justify-content: center; background: var(--c-surface); border-radius: 8px; padding: 3px 6px; flex: none; }
.kr-skala__blase-logo img { max-height: 16px; max-width: 56px; object-fit: contain; display: block; }
.kr-skala__blase-text { display: flex; flex-direction: column; align-items: center; }
/* Rand-Klemmung: Marker am Skalenende → Blase bleibt im Kartenrahmen
   (Nadel behält die exakte Position, nur die Blase rückt ein). */
.kr-skala__blase--kante-links { left: -6px; }
.kr-skala__blase--kante-rechts { right: -6px; }
.kr-skala__blase-name { font-size: var(--fs-caption); font-weight: var(--fw-bold); }
.kr-skala__blase-wert { font-size: var(--fs-sm); font-weight: 800; font-variant-numeric: tabular-nums; }
.kr-skala__enden { display: flex; justify-content: space-between; margin: 0 var(--sp-4); }
.kr-skala__ende { display: flex; flex-direction: column; }
.kr-skala__ende--rechts { text-align: right; }
.kr-skala__ende-label { font-size: var(--fs-caption); font-weight: var(--fw-medium); color: var(--c-text-soft); }
.kr-skala__ende-wert { font-size: var(--fs-sm); font-weight: var(--fw-bold); color: var(--c-text-muted); font-variant-numeric: tabular-nums; }

/* Wechsel-Variante (Schritt 2): zweiter Marker (Konzept-Kasse, grün) + Differenz
   als Doppelpfeil zwischen beiden Punkten unter der Leiste. */
.kr-skala--wechsel { margin-top: var(--sp-4); border-top: 1px solid var(--c-border-soft); padding-top: var(--sp-4); }
.kr-skala__nadel--neu { border-color: var(--kk-green); }
.kr-skala__blase--neu { background: var(--kk-green); }
/* Karte 152 (Owner 21.08.): bei nahen Beiträgen überlappten die beiden
   Preis-Blasen. Zwei feste Etagen — die grüne Empfehlung OBEN, die aktuelle
   Kasse darunter; das Band rückt tiefer, damit beide Blasen und der
   Differenz-Pfeil frei lesbar bleiben. */
.kr-skala--wechsel .kr-skala__band { margin-top: 132px; }
.kr-skala--wechsel .kr-skala__blase { bottom: 22px; }
.kr-skala--wechsel .kr-skala__blase--neu { bottom: 70px; }
/* Karte 166 (Owner 24.08., verfeinert Karte 152): liegen die Blasen weit genug
   auseinander (Regie-Flag eine_etage), stehen beide auf EINER Höhe — die
   Versetzung bleibt nur als Berührungs-Schutz bei nahen Positionen. */
.kr-skala--eine-etage .kr-skala__band { margin-top: 84px; }
.kr-skala--eine-etage .kr-skala__blase--neu { bottom: 22px; }
.kr-skala__spanne { position: absolute; top: 30px; height: 0; border-top: 2px solid var(--kk-grau-bd); }
.kr-skala__spanne::before,
.kr-skala__spanne::after { content: ""; position: absolute; top: -6px; border: 5px solid transparent; }
.kr-skala__spanne::before { left: -2px; border-right-color: var(--kk-grau-bd); border-left-width: 0; }
.kr-skala__spanne::after { right: -2px; border-left-color: var(--kk-grau-bd); border-right-width: 0; }
.kr-skala__spanne-label { position: absolute; left: 50%; top: -1px; transform: translate(-50%, -50%); background: var(--c-surface); padding: 0 10px; font-size: var(--fs-sm); font-weight: var(--fw-bold); color: var(--c-text); white-space: nowrap; font-variant-numeric: tabular-nums; }
.kr-skala--wechsel .kr-skala__enden { margin-top: 48px; }

/* ~~Haus der Gesundheit `.hg*` (Alt-Flow konzept.html, Owner-Auftrag 07.08.)~~ —
   vom Owner am 08.09. ERSATZLOS entfernt, in beiden Konzept-Flows. Die
   Regeln (Dach per clip-path, Säulen-Raster, Fundament-Band) stehen in der
   Git-Historie vor diesem Commit; die hg-Tokens sind in tokens.css als
   widerrufen markiert. */

/* Szenario-Karten (einzeln aufgedeckt) */
.kr-szenarien { display: grid; gap: var(--sp-2); }
.kr-szenario { display: flex; border-radius: var(--kr-radius); border: 1px solid var(--kr-karte-bd); background: var(--c-surface); overflow: hidden; animation: kr-drop-in .2s cubic-bezier(.33, 1, .68, 1); }
.kr-szenario__icon { flex: none; display: flex; align-items: center; justify-content: center; width: var(--kr-icon-spalte); border-right: 1px solid var(--kr-karte-trenner); background: var(--kr-kopf-bg); }
.kr-szenario__icon img { width: var(--kr-icon); height: var(--kr-icon); object-fit: contain; }
.kr-szenario__inhalt { flex: 1; min-width: 0; }
.kr-szenario__kopf { display: flex; align-items: center; gap: var(--sp-4); padding: 12px 16px; background: var(--kr-kopf-bg); border-bottom: 1px solid var(--kr-karte-trenner); }
.kr-szenario__frage { flex: 1; min-width: 0; font-size: var(--fs-body); font-weight: var(--fw-bold); color: var(--c-text); text-wrap: pretty; }
.kr-szenario__wert { font-size: 14.5px; font-weight: 800; color: var(--c-text); white-space: nowrap; font-variant-numeric: tabular-nums; }
.kr-szenario__detail { padding: 10px 18px 14px 16px; }
/* Karte #87 (Owner 2026-08-17): verdeckte Szenarien stehen GEBLURRT in voller
   Fassung da (Neugier-Dramaturgie) — der Overlay-Link deckt per Klick auf.
   Der geblurrte Inhalt ist nicht bedienbar (pointer-events) und nicht
   kopierbar (user-select); im Druck ist alles aufgedeckt (Kundenblatt
   vollständig — Overlay raus, Blur raus). */
.kr-szenario--verdeckt { position: relative; }
.kr-szenario--verdeckt .kr-szenario__icon,
.kr-szenario--verdeckt .kr-szenario__inhalt { filter: blur(7px); pointer-events: none; user-select: none; }
.kr-szenario__aufdecken { position: absolute; inset: 0; z-index: 3; display: flex; align-items: center; justify-content: center; font-size: var(--fs-body); font-weight: var(--fw-bold); color: var(--c-primary); text-decoration: none; }
@media print {
  .kr-szenario--verdeckt .kr-szenario__icon,
  .kr-szenario--verdeckt .kr-szenario__inhalt { filter: none; }
  .kr-szenario__aufdecken { display: none; }
}
/* T13-Stacking-Fix (Owner-Befund 2026-08-11): overflow:hidden der Karten
   clippte das Hover-Popup an der Kartenkante („rutscht unter die Folge-
   Karte"). Bei OFFENEM Popup gibt die Karte den Clip frei und hebt sich über
   die Nachbarn (gleiche Lehre wie das vk-edit-Stacking 2026-07-16); die
   inneren Flächen tragen währenddessen selbst die Eck-Radien. Druck bleibt
   unberührt (Popup rendert inline, kein Hover-Zustand). */
.kr-szenario:has(.hover-info:hover), .kr-szenario:has(.hover-info:focus-within),
.kr-vgl:has(.hover-info:hover), .kr-vgl:has(.hover-info:focus-within) { position: relative; z-index: 30; overflow: visible; }
.kr-szenario:has(.hover-info:hover) .kr-szenario__icon,
.kr-szenario:has(.hover-info:focus-within) .kr-szenario__icon { border-radius: var(--kr-radius) 0 0 var(--kr-radius); }
.kr-szenario:has(.hover-info:hover) .kr-szenario__kopf,
.kr-szenario:has(.hover-info:focus-within) .kr-szenario__kopf { border-top-right-radius: var(--kr-radius); }
.kr-szenario__heute { margin: 0 0 6px; font-size: var(--fs-sm); font-weight: var(--fw-bold); color: var(--kk-warning); text-wrap: pretty; }
/* Gesetzliches Vorsorge-Pflichtprogramm im Regie-Kapitel (Owner 2026-08-03):
   Katalog mit Zielgruppe/Intervall, aktive Zeilen der Person mit Haken. */
.kr-programm { margin: 0 0 var(--sp-4); padding: var(--sp-4); border: 1px solid var(--c-border-soft); border-radius: var(--kr-radius-box); background: var(--c-surface); }
.kr-programm__titel { margin: 0 0 var(--sp-3); font-weight: var(--fw-semibold); font-size: var(--fs-sm); }
.kr-programm__liste { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: var(--sp-1); }
.kr-programm__zeile { display: flex; align-items: baseline; gap: var(--sp-2); font-size: var(--fs-sm); color: var(--c-text-muted); }
.kr-programm__zeile--aktiv { color: var(--c-text); }
.kr-programm__check { flex: none; width: 18px; text-align: center; color: var(--c-text-muted); }
.kr-programm__zeile--aktiv .kr-programm__check { color: var(--c-spart); font-weight: var(--fw-bold); }
.kr-programm__name { font-weight: var(--fw-medium); }
.kr-programm__zeile--aktiv .kr-programm__name { font-weight: var(--fw-semibold); }
.kr-programm__meta { margin-left: auto; font-size: var(--fs-caption); color: var(--c-text-muted); text-align: right; }
.kr-programm__hinweis { margin: var(--sp-3) 0 0; font-size: var(--fs-caption); color: var(--c-text-soft); }
/* Lücken-Block (Owner 2026-08-03): relevante, aber noch nicht bezahlte Vorsorgen. */
.kr-programm__titel--luecke { margin-top: var(--sp-4); padding-top: var(--sp-3); border-top: 1px solid var(--c-border-soft); color: var(--kr-rose); }
/* Karte 228 (Owner 28.08.): kein einsamer Trennstrich am Container-Anfang —
   steht der Titel als ERSTES Element (z. B. nur IGeL-Liste, keine Lücken),
   entfallen Strich + Oben-Abstand; der Trenner ZWISCHEN zwei Listen bleibt. */
.kr-programm__titel--luecke:first-child { margin-top: 0; padding-top: 0; border-top: 0; }
.kr-programm__zeile--luecke { color: var(--c-text); }
.kr-programm__zeile--luecke .kr-programm__check { color: var(--kr-rose); font-weight: var(--fw-bold); }
.kr-programm__zeile--luecke .kr-programm__name { font-weight: var(--fw-semibold); }

/* Übersichtskarten „Alles auf einen Blick" — v13 B Kompakt (Handoff 2026-08-03):
   2-Spalten-Grid, Karten einer Reihe gleich hoch (kein align-items:start),
   Vorher/Jetzt als Label-Spalte, Baustein EINMAL im Karten-Fuß. */
/* align-items:start (Owner-Screenshot 2026-08-07): Karten enden nach ihrem
   Inhalt statt auf Zeilenhöhe gestreckt — keine leeren Container mehr neben
   hohen Nachbarn. */
/* Owner-Review Fall 25 (2026-08-11): Kacheln einer Reihe IMMER gleich hoch
   („Auf Reisen so groß wie im Krankenhaus") — stretch statt start; der
   Karten-Fuß (ku-karte__fuss, margin-top:auto) sitzt dabei unten. */
.ku-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 14px; align-items: stretch; }
@media (max-width: 760px) { .ku-grid { grid-template-columns: 1fr; } }
.ku-karte { border: 1px solid var(--ku-karte-bd); border-radius: 14px; background: var(--c-surface); display: flex; flex-direction: column; }
.ku-karte__kopf { display: flex; align-items: center; gap: 10px; padding: 14px 18px 10px; flex-wrap: wrap; }
.ku-karte__icon { width: 28px; height: 28px; flex: none; }
.ku-karte__icon img { width: 100%; height: 100%; object-fit: contain; display: block; }
.ku-karte__titel { margin: 0; font-size: 13px; font-weight: 800; letter-spacing: .07em; text-transform: uppercase; color: var(--c-text); }
.ku-karte__risiko { margin-left: auto; display: inline-flex; align-items: baseline; gap: 7px; }
.ku-karte__alt { font-size: 12px; font-weight: 700; color: var(--kr-rose); text-decoration: line-through; white-space: nowrap; font-variant-numeric: tabular-nums; }
/* Kassen-Karte positiv (Owner 2026-08-05): „Du sparst" neutral vor dem grünen Betrag */
.ku-karte__spartwort { font-size: 12px; font-weight: 700; color: var(--c-text-muted); white-space: nowrap; }
.ku-karte__pfeil { color: var(--c-text-muted); font-size: 11px; }
.ku-karte__null { font-size: 13px; font-weight: 800; color: var(--kr-gruen); white-space: nowrap; }
.ku-karte__rest { font-size: 12px; font-weight: 700; color: var(--kr-rose); white-space: nowrap; }
.ku-karte__eintraege { padding: 0 18px; }
/* Kassen-Karte über die volle Grid-Breite (Owner-Screenshot-Runde 2026-08-07):
   Duell + Hauptvorteile machen sie hoch — daneben wirkte die Nachbar-Karte leer. */
.ku-karte--kasse { grid-column: 1 / -1; }
/* 3 Vorteil-Bullets sichtbar je Baustein-Karte (Owner: „kurz und knackig";
   Schriftgröße = Fließtext-Niveau, nicht Kleingedrucktes — Owner 2026-08-07). */
.ku-punkte { margin: 0; padding: 6px 18px 12px 36px; font-size: var(--fs-body); font-weight: var(--fw-medium); color: var(--c-text); }
.ku-punkte li { margin: 5px 0; line-height: 1.5; }
.ku-punkte li::marker { color: var(--kr-gruen); }
/* Privatarzt-Toggle in der Vorsorge-Kachel (Ole-Entscheidung 1, 2026-08-12). */
.ku-karte__toggle { margin: 0; padding: 0 18px 12px; }
/* Karte #55 (Ole/Owner 2026-08-12): Bullets in Risiko-Sprache — gelöstes
   Vorher durchgestrichen (kr-rose, Muster ku-karte__alt), Nachher in
   Ersparnis-Grün („Kein Risiko"/„0 €"). */
.ku-punkte__alt { text-decoration: line-through; color: var(--kr-rose); font-weight: var(--fw-semibold); }
.ku-punkte__neu { color: var(--kr-gruen); font-weight: 700; white-space: nowrap; }
/* Progressive Disclosure der Übersichtskarten (Vertriebler-Meeting 2026-08-07):
   die Vorher/Jetzt-Zeilen liegen hinter „Details anzeigen" (kr-mehr, Default zu) —
   sichtbar bleiben Ersparnis-Kopf, Kassen-Duell und Baustein-Fuß. Der Knopf
   sitzt in der 18px-Padding-Flucht der Karte; beforeprint öffnet (app.js). */
.kr-mehr--ku { margin: 0; padding: 8px 18px 10px; }
.kr-mehr--ku .ku-karte__eintraege { padding: 0; }
.kr-mehr--ku .ku-eintrag:first-child { margin-top: 6px; }
/* Kassen-Duell-Band der Übersichtskarte: Logo alt → Logo neu (Owner 2026-08-03) */
.ku-duell { display: flex; align-items: center; gap: var(--sp-3); padding: 12px 18px; border-top: 1px solid var(--ku-linie); }
.ku-duell__seite { flex: 1; min-width: 0; display: flex; flex-direction: column; align-items: center; gap: 4px; text-align: center; }
.ku-duell__logo { height: 30px; display: inline-flex; align-items: center; justify-content: center; }
.ku-duell__logo img { max-height: 30px; max-width: 110px; object-fit: contain; }
.ku-duell__mono { display: inline-flex; align-items: center; justify-content: center; width: 44px; height: 28px; border-radius: 6px; background: var(--c-surface-muted); color: var(--c-text-muted); font-size: 11px; font-weight: 800; }
.ku-duell__name { font-size: 12px; font-weight: 700; color: var(--c-text); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 100%; }
.ku-duell__preis { font-size: 12px; font-weight: 700; color: var(--kr-rose); font-variant-numeric: tabular-nums; }
.ku-duell__seite--neu .ku-duell__preis { color: var(--kr-gruen); }
.ku-duell__pfeil { flex: none; color: var(--c-text-muted); font-size: 15px; }
/* Hauptvorteile der neuen Kasse (lazy geladenes vk-vorteil-Fragment) */
.ku-vorteile { padding: 2px 18px 10px; }
.ku-vorteile__titel { margin: 8px 0 6px; font-size: 11px; font-weight: 800; letter-spacing: .06em; text-transform: uppercase; color: var(--c-text-soft); }
/* Hauptvorteile kompakt (Owner 2026-08-04): je Punkt EINE grüne Wert-Box (gleiche
   Sprache wie „Berechnung der Ersparnis", kvk-box--besser) — Titel-Spalte breiter
   als beim Modal-Boxpaar, weil rechts nur eine Box steht. */
.ku-vorteile .kvk-zeile { grid-template-columns: minmax(0, 1.6fr) minmax(0, 1fr); }
/* Karte #93 (Owner 2026-08-17, Übersicht-Screenshot): die aufgeklappten
   Vorher/Jetzt-Einträge waren nackte Linien-Zeilen — optischer Bruch zu den
   Karten-Flächen darüber. Jetzt dieselbe Flächen-Bildsprache wie die oberen
   Boxen: je Eintrag eine leise Fläche (Radius + Border-soft), Liste mit
   Abstand statt Trennlinien. */
.ku-karte__eintraege { display: grid; gap: var(--sp-2); padding-bottom: 10px; }
.ku-eintrag { padding: 10px 12px; border: 1px solid var(--c-border-soft); border-radius: var(--r-md); background: var(--c-bg); }
.ku-eintrag__anlass { margin: 0 0 6px; font-size: 12.5px; font-weight: 800; color: var(--c-text); }
.ku-vj { display: grid; grid-template-columns: 56px minmax(0, 1fr); gap: 3px 12px; align-items: baseline; }
.ku-vj__label { font-size: 10px; font-weight: 800; letter-spacing: .07em; text-transform: uppercase; }
.ku-vj__label--vorher { color: var(--ku-vorher-label); }
.ku-vj__label--jetzt { color: var(--kr-gruen); }
.ku-vj__wert--vorher { font-size: 12px; font-weight: 500; color: var(--kr-rose); line-height: 1.5; }
.ku-vj__wert--jetzt { font-size: 12px; font-weight: 700; color: var(--kr-gruen); line-height: 1.5; }
.ku-vj__herleitung { display: block; font-size: 11px; font-weight: 500; color: var(--c-text-soft); line-height: 1.45; }
.ku-karte__fuss { margin-top: auto; display: flex; align-items: center; gap: 9px; padding: 11px 18px 14px; border-top: 1px solid var(--ku-linie); flex-wrap: wrap; }
.ku-karte__logo { width: 34px; height: 14px; object-fit: contain; flex: none; }
.ku-karte__tarif { font-size: 12px; font-weight: 700; color: var(--c-text); }
.ku-karte__preis { font-size: 11px; font-weight: 700; color: var(--c-text-muted); font-variant-numeric: tabular-nums; }
.ku-vergleichen { padding: 4px 11px; border: 0; border-radius: var(--r-full); background: var(--btn-primary-bg); color: var(--btn-primary-fg); font: inherit; font-size: 11px; font-weight: 700; cursor: pointer; white-space: nowrap; }
.ku-vergleichen:hover { background: var(--btn-primary-bg-hover); }

/* Tarif-Duell im Modal (Owner 2026-08-03): Vergleichs-Auswahl als Knopf-Liste;
   der i-Knopf sitzt rechts in der Picker-Zeile (Basis: .kr-mini-edit). */
/* Owner-Nachbesserung 17.08. (#82): festes 2er-Raster statt flex-wrap — alle
   Karten gleich breit/hoch (Grid streckt je Zeile), Badge + Preis stehen dank
   wachsender Text-Spalte rechtsbündig in einer Linie. */
.tarifduell-wahl { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--sp-2); }
/* T29 (Ole 2026-08-11): klickbare Vergleichs-Karten — Platz/Erstattung sofort
   sichtbar (Kopfwert-Badge + Alterspreis), Bildsprache wie die Tarif-Picker. */
.tarifduell-wahl__karte { display: inline-flex; align-items: center; gap: var(--sp-2); padding: 6px 12px; border: 1px solid var(--c-border); border-radius: var(--r-sm); background: var(--c-surface); font: inherit; text-align: left; cursor: pointer; }
.tarifduell-wahl__karte:hover { border-color: var(--baustein-active-bd); background: var(--kk-violet-50); }
/* #82-Multivergleich: aktiv = bereits im Vergleich (Klick entfernt wieder);
   voll = 4 Spalten erreicht, weitere Karten deaktiviert. */
.tarifduell-wahl__karte--aktiv, .tarifduell-wahl__karte--aktiv:hover { border-color: var(--baustein-active-bd); background: var(--kk-violet-50); }
.tarifduell-wahl__karte[disabled] { opacity: .5; cursor: not-allowed; }
.tarifduell-wahl__text { display: grid; flex: 1 1 auto; min-width: 0; }
.tarifduell-wahl__name { font-size: var(--fs-sm); font-weight: var(--fw-semibold); color: var(--c-text); }
.tarifduell-wahl__sub { font-size: var(--fs-caption); color: var(--c-text-muted); }
.tarifduell-wahl__badge { flex: none; padding: 2px 8px; border-radius: var(--r-full); background: var(--kk-violet-100); color: var(--kk-violet-800); font-size: var(--fs-caption); font-weight: var(--fw-bold); white-space: nowrap; }
.tarifduell-wahl__preis { flex: none; font-size: var(--fs-sm); font-weight: var(--fw-bold); color: var(--c-text); font-variant-numeric: tabular-nums; }
.tarifopt__info { flex: none; margin-left: var(--sp-2); }

/* Minimal-Standard der Szenario-Karten (Owner 2026-08-03): nur Heute-Zeile +
   ggf. Warnung; die Punkte liegen hinter „Details anzeigen" (<details>, kein JS). */
.kr-mehr { margin-top: var(--sp-2); }
.kr-mehr > summary { list-style: none; cursor: pointer; display: inline-flex; align-items: center; gap: var(--sp-1); font-size: var(--fs-sm); font-weight: var(--fw-semibold); color: var(--c-primary); }
.kr-mehr > summary::-webkit-details-marker { display: none; }
.kr-mehr[open] > summary .vk-vorteil__pfeil { transform: rotate(180deg); }
/* Karte 186: Affordance-Konvention fuer Text-Toggles — klickbare Aufklapp-Texte
   tragen sichtbar Pfeil (+ optional Stift wo Editieren dahintersteckt), Hover +
   cursor:pointer. Wiederverwendbar fuer alle Tracks (B: Fall-Seite/Konsole-
   Kontaktblock, D: 198-Zone) — Markup: <summary class="klapp-link">Text
   <span class="klapp-link__stift">✎</span> <span class="vk-vorteil__pfeil">▾</span></summary> */
.klapp-link { display: inline-flex; align-items: center; gap: var(--sp-2); cursor: pointer; color: var(--c-primary); font-weight: var(--fw-semibold); transition: color var(--t-fast); }
.klapp-link:hover { color: var(--c-accent); }
.klapp-link .vk-vorteil__pfeil { color: currentColor; }
summary.klapp-link { list-style: none; }
summary.klapp-link::-webkit-details-marker { display: none; }
[open] > summary.klapp-link .vk-vorteil__pfeil, .klapp-link[aria-expanded="true"] .vk-vorteil__pfeil { transform: rotate(180deg); }
.klapp-link__stift { font-size: .85em; opacity: .75; }
.kr-mehr__weniger { display: none; }
.kr-mehr[open] .kr-mehr__weniger { display: inline; }
.kr-mehr[open] .kr-mehr__mehr { display: none; }
/* Karte #90: einklappbarer Kategorien-Block der Gegenüberstellung („Weitere
   Kategorien anzeigen") — eigener Absatz-Abstand, Knopf in Fließtextgröße. */
.kr-mehr--kategorien { margin: var(--sp-4) 0 0; }
.kr-mehr--kategorien > summary { font-size: var(--fs-body); }
.kr-mehr--kategorien .kr-vgl-block { margin-top: var(--sp-3); }

/* Rote Gesetzes-Warnung am Szenario (Owner 2026-08-03, z. B. BStabG: Zahnersatz-Festzuschuss sinkt ab 2027). */
/* Gesetzes-Warnung ist seit T13 (2026-08-11) eine Infopill mit Hover-Popup —
   die alten .kr-szenario__warnung-Textzeilen sind entfernt. */
.kr-szenario__pillzeile { margin-top: var(--sp-2); }

/* Risiko-Pills: weißer Grund, farbiger Rand (hoch/mittel/kaum) */
.kr-pill { display: inline-flex; align-items: center; padding: 3px 11px; flex: none; border-radius: var(--r-full); border: 1px solid var(--kr-pill-gering-bd); background: var(--c-surface); color: var(--kr-pill-gering); font-size: 10px; font-weight: 800; letter-spacing: .05em; text-transform: uppercase; white-space: nowrap; }
.kr-pill--hoch { border-color: var(--kr-pill-hoch-bd); color: var(--kr-pill-hoch); }
.kr-pill--mittel { border-color: var(--kr-pill-mittel-bd); color: var(--kr-pill-mittel); }

/* Spiegelstrich-Listen (Marker per Modifier: neutral / rosé / grün) */
.kr-punkte { margin: 0; padding: 0; list-style: none; display: grid; gap: 4px; }
.kr-punkte li { display: flex; gap: 7px; font-size: 12.5px; font-weight: var(--fw-medium); color: var(--c-text-muted); line-height: 1.5; text-wrap: pretty; }
.kr-punkte li::before { content: "–"; color: var(--c-primary); flex: none; }
.kr-punkte--rose li::before { color: var(--kr-rose); }
.kr-punkte--gruen li::before { color: var(--kr-gruen); }

/* Kategorie-Banner (Schritt 1 rosé aufgebaut, Schritt 2 grün abgebaut) */
.kr-banner { display: flex; align-items: center; gap: var(--sp-3); padding: 13px 18px; border-radius: var(--kr-radius); animation: kr-drop-in .2s cubic-bezier(.33, 1, .68, 1); }
.kr-banner--rose { background: var(--kr-rose-bg); border: 1px solid var(--kr-rose-bd-stark); }
.kr-banner--rose .kr-banner__label { color: var(--kr-rose); }
.kr-banner--gruen { background: var(--kr-gruen-bg); border: 1px solid var(--kr-gruen-bd); }
.kr-banner__label { flex: 1; min-width: 0; font-size: 13.5px; font-weight: var(--fw-bold); color: var(--c-text); }
.kr-banner__wert { font-size: 19px; font-weight: 800; color: var(--kr-rose); white-space: nowrap; font-variant-numeric: tabular-nums; }
.kr-banner__alt { font-size: var(--fs-body); font-weight: var(--fw-bold); color: var(--kr-rose); text-decoration: line-through; white-space: nowrap; font-variant-numeric: tabular-nums; }
.kr-banner__pfeil { color: var(--c-text-soft); }
.kr-banner__null { font-size: 19px; font-weight: 800; color: var(--kr-gruen); white-space: nowrap; font-variant-numeric: tabular-nums; }
.kr-banner__rest { font-size: var(--fs-body); font-weight: var(--fw-bold); color: var(--kr-rose); white-space: nowrap; font-variant-numeric: tabular-nums; }

/* Karten-Navigation + Regie-Buttons */
.kr-nav { margin-top: auto; display: flex; align-items: center; gap: var(--sp-3); padding-top: var(--sp-3); }
.kr-nav__rechts { margin-left: auto; display: flex; gap: var(--sp-3); flex-wrap: wrap; }
/* Karte 187: Navigations-Konvention — vorwaerts = lila Primary-Button,
   zurueck = Text-Link mit Pfeil (kein Rahmen, keine Flaeche). Gilt im ganzen
   Berater; B/D/F haengen ihre Strecken per .nav-zurueck ein. */
.nav-zurueck { display: inline-flex; align-items: center; gap: var(--sp-1); border: 0; background: transparent; padding: 9px 0; color: var(--c-text-muted); font-size: var(--fs-sm); font-weight: var(--fw-semibold); text-decoration: none; cursor: pointer; transition: color var(--t-fast); }
.nav-zurueck:hover { color: var(--c-primary); text-decoration: none; }
.kr-btn { display: inline-flex; align-items: center; padding: 9px 18px; border-radius: var(--kr-radius-box); font-size: var(--fs-sm); font-weight: var(--fw-bold); text-decoration: none; white-space: nowrap; }
.kr-btn:hover { text-decoration: none; }
/* Button-Hierarchie (Ole 2026-08-11, T16): die Regie-Buttons lesen dieselben
   Tokens wie .btn — --voll = Primary (helles Lila), --outline = Secondary
   (derselbe Farbton abgestuft). Das dunkle --kr-akzent-Füllen ist raus
   („dunkler Button wirkt wie der Weiter-Button"). */
.kr-btn--outline { border: 1px solid var(--btn-secondary-bd); background: var(--btn-secondary-bg); color: var(--btn-secondary-fg); }
.kr-btn--outline:hover { background: var(--btn-secondary-bg-hover); color: var(--btn-secondary-fg); }
.kr-btn--voll { border: 0; background: var(--btn-primary-bg); color: var(--btn-primary-fg); }
.kr-btn--voll:hover { background: var(--btn-primary-bg-hover); color: var(--btn-primary-fg); }

/* Vorher/Nachher-Hero (Schritt 2, rechnet live über die Engine-Summen) */
/* Spar-Headline (Owner-Order 13.08.): DIE Kern-Message der Schritt-2-Seite —
   groß über den Hero-Boxen (mind. Hero-Betrag-Größe 32px), Betrag in
   Ersparnis-Grün mit Unterstreichungs-Akzent; erscheint NUR bei positiver
   Ersparnis (Regie/Template-Gate, keine Negativ-Botschaft). */
.kr-spar-headline { margin: 0 0 var(--sp-4); text-align: center; font-size: 36px; font-weight: 800; color: var(--c-text); line-height: 1.15; }
.kr-spar-headline__betrag { color: var(--kr-gruen); font-variant-numeric: tabular-nums; text-decoration: underline; text-decoration-color: var(--kr-gruen); text-decoration-thickness: 3px; text-underline-offset: 6px; }
@media (max-width: 640px) { .kr-spar-headline { font-size: 27px; } }

.kr-vn { display: flex; align-items: stretch; gap: var(--sp-4); margin-bottom: var(--sp-5); flex-wrap: wrap; }
.kr-vn__box { flex: 1 1 240px; min-width: 0; border-radius: var(--kr-radius-gross); padding: 16px 22px; }
/* Posten-Zeilen beider Boxen auf einer Linie (Owner 2026-08-10, „rechts
   hochgerutscht"): geteilte Grid-Zeilen [Kopf | Posten] via Subgrid — der
   höhere Kopf gibt die Startlinie vor, identische Listen liegen Zeile für
   Zeile nebeneinander. Schmale Screens behalten das Flex-Stapeln von oben. */
@media (min-width: 720px) {
  .kr-vn { display: grid; grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr); grid-template-rows: auto 1fr; gap: 0 var(--sp-4); }
  .kr-vn__box { grid-row: 1 / 3; display: grid; grid-template-rows: subgrid; align-content: start; }
  .kr-vn__box .kr-vn__posten { align-self: start; }
  .kr-vn__pfeil { grid-row: 1 / 3; }
}
.kr-vn__box--vorher { background: var(--kr-rose-bg); border: 1px solid var(--kr-rose-bd-stark); border-left: 5px solid var(--kr-rose); }
.kr-vn__box--nachher { background: var(--kr-gruen-bg); border: 1px solid var(--kr-gruen-bd); border-left: 5px solid var(--kr-gruen); }
.kr-vn__tag { margin: 0 0 4px; font-size: 11px; font-weight: 800; letter-spacing: .07em; text-transform: uppercase; color: var(--kr-rose); }
.kr-vn__tag--gruen { color: var(--kr-gruen); }
.kr-vn__wert { margin: 0 0 3px; font-size: 32px; font-weight: 800; color: var(--kr-rose); line-height: 1.1; font-variant-numeric: tabular-nums; }
.kr-vn__wert--gruen { color: var(--kr-gruen); }
.kr-vn__sub { margin: 0; font-size: 12.5px; font-weight: var(--fw-semibold); color: var(--c-text-muted); text-wrap: pretty; }
.kr-vn__pfeil { flex: 0 0 auto; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 3px; padding: 0 4px; }
.kr-vn__pfeil-ico { font-size: 22px; color: var(--c-text-soft); }
.kr-vn__diff { font-size: var(--fs-caption); font-weight: 800; color: var(--kr-gruen); white-space: nowrap; font-variant-numeric: tabular-nums; }
.kr-vn__diff--mehr { color: var(--kk-violet-800); }
/* Die „Spargeschichte" (kr-vn__split, 07.08.) ist seit T26 (Ole-Entscheidung 10,
   2026-08-11) entfernt — keine isolierte Kassenwechsel-Ersparnis mehr. */
/* Zusammensetzung direkt am Hero-Betrag (Owner-Meeting + Screenshot-Runde
   2026-08-07): dieselben posten wie das Fazit unten, kompakt als Zeilen. */
.kr-vn__posten { margin-top: var(--sp-2); display: grid; gap: 2px; }
/* Gruppen-Label der Hero-Posten (T25/T26, Ole-Entscheidung 10): beidseitig
   wortgleich — Beiträge vs. laufende Ausgaben, Vokabular wie kr-box__tag. */
.kr-vn__posten-titel { margin-top: var(--sp-2); font-size: 10px; font-weight: 800; letter-spacing: .07em; text-transform: uppercase; color: var(--c-text-muted); }
.kr-vn__posten-titel:first-child { margin-top: 0; }
/* Die kr-vn__variabel-Zeile der zweiten T25-Iteration ist mit der dritten
   Owner-Ansage (Skizzen-Layout, 2026-08-11 abends) wieder entfernt. */
.kr-vn__posten-zeile { display: flex; align-items: center; justify-content: space-between; gap: var(--sp-3); font-size: var(--fs-caption); color: var(--c-text-muted); }
/* Kleines Symbol je Posten (Owner 2026-08-10) — dieselben Icons wie die
   Fazit-Tabelle; das Label schiebt den Betrag an den rechten Rand. */
.kr-vn__posten-icon { width: 16px; height: 16px; object-fit: contain; flex: 0 0 auto; }
.kr-vn__posten-label { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.kr-vn__posten-wert { font-weight: var(--fw-semibold); font-variant-numeric: tabular-nums; white-space: nowrap; }

/* Ist → Optimiert (geführter Modus) */
.kr-vgl-liste { display: grid; gap: var(--sp-3); }
/* #58 (Owner-Karte XA1dYAsH, 2026-08-12): Zwei-Block-Gliederung der
   Gegenüberstellung — Kosten-Block und Risiken-Block mit eigenem Titel. */
.kr-vgl-block + .kr-vgl-block { margin-top: var(--sp-5); }
.kr-vgl-block__titel { margin: 0 0 var(--sp-2); font-size: var(--fs-caption); font-weight: 800; text-transform: uppercase; letter-spacing: .04em; color: var(--c-text-muted); }
.kr-vgl { border-radius: var(--kr-radius); border: 1px solid var(--kr-karte-bd); background: var(--c-surface); overflow: hidden; }
.kr-vgl__kopf { display: flex; align-items: center; gap: var(--sp-3); padding: 10px 16px; background: var(--kr-kopf-bg); border-bottom: 1px solid var(--kr-karte-trenner); }
.kr-vgl__icon { width: 28px; height: 28px; flex: none; display: inline-flex; }
.kr-vgl__icon img { width: 100%; height: 100%; object-fit: contain; }
.kr-vgl__kategorie { flex: 1; min-width: 0; font-size: 14px; font-weight: 800; color: var(--c-text); }
.kr-vgl__spalten { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--sp-3); padding: 12px 16px 14px; }
.kr-box { border-radius: var(--kr-radius-box); padding: 12px 14px; }
.kr-box--aktuell { background: var(--kr-rose-bg); border: 1px solid var(--kr-rose-bd); border-left: 4px solid var(--kr-rose); }
.kr-box--opt { background: var(--kr-gruen-bg); border: 1px solid var(--kr-gruen-bd); border-left: 4px solid var(--kr-gruen); }
.kr-box__tag { margin: 0 0 4px; font-size: 10px; font-weight: 800; letter-spacing: .07em; text-transform: uppercase; color: var(--kr-rose); }
.kr-box__tag--gruen { margin: 0; color: var(--kr-gruen); }
/* Kein Tarif gewählt (Owner 2026-08-05): „Noch offen" statt „Optimiert" — neutral */
.kr-box__tag--offen { margin: 0; color: var(--c-text-muted); }
.kr-box__kopfzeile { display: flex; align-items: center; gap: var(--sp-2); margin: 0 0 4px; }
.kr-box__wert { margin: 0 0 6px; font-size: 14px; font-weight: var(--fw-bold); color: var(--kk-ink); text-wrap: pretty; }
.kr-box__wert--gruen { color: var(--kr-gruen); }
/* T27 (Ole 2026-08-11): Rabatt-Optik — alte Situation durchgestrichen ÜBER dem
   neuen Stand (gleiches Vokabular wie kr-banner__alt/ku-karte__alt). */
.kr-box__alt { margin: 0 0 2px; font-size: var(--fs-caption); font-weight: var(--fw-bold); color: var(--kr-rose); text-decoration: line-through; text-wrap: pretty; font-variant-numeric: tabular-nums; }
/* T27-Nacharbeit (Owner 2026-08-11): Deckungs-Aufdröselung der Optimiert-Box —
   Tarif-Übernahme (Matrix) · konkrete Erstattung · Rest · Ersparnis. */
.kr-deckung { margin: 0 0 6px; display: grid; gap: 2px; padding: var(--sp-2) var(--sp-3); border-radius: var(--kr-radius-innen); background: var(--c-surface); }
/* Kein nowrap am Wert: As deck_cap_text („… — gemeinsames Budget mehrerer
   Leistungen") ist lang und muss in der Kachel umbrechen — sonst spannt die
   breiteste Zeile den Grid-Track auf und alle Beträge ragen über den
   Kachelrand (Owner-Bug 13.08., Fall 25). min-width: 0 hält Zeile und Wert
   unter Grid/Flex schrumpfbar. */
.kr-deckung__zeile { display: flex; justify-content: space-between; gap: var(--sp-3); min-width: 0; font-size: var(--fs-caption); color: var(--c-text-muted); }
.kr-deckung__wert { font-weight: var(--fw-bold); color: var(--c-text); font-variant-numeric: tabular-nums; min-width: 0; text-align: right; text-wrap: pretty; }
.kr-deckung__zeile--spart { border-top: 1px solid var(--kr-karte-trenner); padding-top: 3px; margin-top: 2px; }
.kr-deckung__zeile--spart .kr-deckung__label { color: var(--kr-gruen); font-weight: var(--fw-semibold); }
.kr-deckung__zeile--spart .kr-deckung__wert { color: var(--kr-gruen); }
.kr-box__risiko { margin: 0 0 6px; font-size: var(--fs-caption); font-weight: var(--fw-semibold); color: var(--kr-rose); text-wrap: pretty; }
/* Herleitung „warum dieser Restbetrag" (Owner 2026-08-05) — dunkel, klar als Rechnung */
.kr-box__rechnung { margin: 0 0 6px; font-size: var(--fs-caption); font-weight: var(--fw-semibold); color: var(--c-text); text-wrap: pretty; font-variant-numeric: tabular-nums; }
/* .kr-tauschen ist seit T28/Entscheidung 7 (2026-08-11) entfernt — kein Edit
   auf der Präsentationsseite. (.kr-mini-edit bleibt: ℹ-Knopf der Tarif-Picker.) */
/* Ole-Karte #53 (2026-08-12): Vergleichen-Pills lila — Grün ist keine Aktionsfarbe,
   Grün bleibt Status-/Ersparnis-Semantik. Pills lesen die Primary-Button-Tokens. */
.kr-vergleichen { margin-left: auto; display: inline-flex; align-items: center; gap: 5px; padding: 3px 10px; border: 0; border-radius: var(--r-full); background: var(--btn-primary-bg); color: var(--btn-primary-fg); font: inherit; font-size: 10.5px; font-weight: var(--fw-bold); cursor: pointer; white-space: nowrap; }
.kr-vergleichen:hover { background: var(--btn-primary-bg-hover); }
/* T29 (Ole 2026-08-11): der EINE „Bausteine vergleichen"-Einstieg je Kapitel —
   deutlich präsenter (Button-Hierarchie-Primary), mit Bestand plus Erklärzeile. */
.kr-duell-cta { display: flex; align-items: center; gap: var(--sp-3); flex-wrap: wrap; margin: var(--sp-2) 0 var(--sp-3); }
.kr-duell-cta__hint { font-size: var(--fs-caption); font-weight: var(--fw-medium); color: var(--c-text-muted); }
.kr-vergleichen--cta { margin-left: 0; padding: 9px 18px; border-radius: var(--btn-radius); font-size: var(--fs-sm); }
.kr-tarifzeile { display: flex; align-items: center; gap: var(--sp-2); margin: 0 0 6px; }
.kr-tarifzeile__logo { width: 36px; height: 14px; flex: none; object-fit: contain; object-position: left center; }
.kr-tarifzeile__name { flex: 1; min-width: 0; font-size: 11.5px; font-weight: var(--fw-semibold); color: var(--c-text-muted); }
.kr-tarifzeile__preis { font-size: 11.5px; font-weight: var(--fw-bold); color: var(--c-text-muted); white-space: nowrap; font-variant-numeric: tabular-nums; }

/* „Alles auf einen Blick" */
.kr-toggle { display: flex; justify-content: flex-end; margin-bottom: var(--sp-3); }
.kr-toggle__btn { padding: 7px 14px; border: 1px solid var(--kr-karte-bd); border-radius: var(--r-full); background: var(--c-surface); color: var(--c-primary); font-size: var(--fs-caption); font-weight: var(--fw-bold); text-decoration: none; white-space: nowrap; }
.kr-toggle__btn:hover { text-decoration: none; border-color: var(--kr-chip-besucht-bd); }
.kr-sektionen { display: grid; gap: 22px; }
.kr-sek__kopf { display: flex; align-items: center; gap: var(--sp-3); margin: 0 0 9px; padding: 0 2px 8px; border-bottom: 2px solid var(--kr-akzent); }
.kr-sek__icon { width: 26px; height: 26px; flex: none; display: inline-flex; }
.kr-sek__icon img { width: 100%; height: 100%; object-fit: contain; }
.kr-sek__titel { margin: 0; font-size: 14px; font-weight: 800; letter-spacing: .08em; text-transform: uppercase; color: var(--c-text); }
.kr-sek__risiko { margin-left: auto; display: inline-flex; align-items: baseline; gap: var(--sp-2); }
.kr-sek__alt { font-size: 12.5px; font-weight: var(--fw-bold); color: var(--kr-rose); text-decoration: line-through; white-space: nowrap; font-variant-numeric: tabular-nums; }
.kr-sek__pfeil { color: var(--c-text-soft); font-size: var(--fs-caption); }
.kr-sek__null { font-size: 14px; font-weight: 800; color: var(--kr-gruen); white-space: nowrap; font-variant-numeric: tabular-nums; }
.kr-sek__rest { font-size: 12.5px; font-weight: var(--fw-bold); color: var(--kr-rose); white-space: nowrap; font-variant-numeric: tabular-nums; }
.kr-blick-liste { display: grid; gap: var(--sp-2); }
.kr-blick { display: grid; grid-template-columns: 170px minmax(0, 1fr) minmax(0, 1fr) 250px; gap: var(--sp-3); align-items: center; padding: 11px 16px; border-radius: var(--kr-radius); border: 1px solid var(--kr-karte-bd); background: var(--c-surface); }
.kr-blick__kat { min-width: 0; font-size: 13.5px; font-weight: 800; color: var(--c-text); text-wrap: pretty; }
.kr-blick__aktuell { min-width: 0; padding: 8px 12px; border-radius: var(--kr-radius-innen); background: var(--kr-rose-bg); border-left: 3px solid var(--kr-rose); font-size: var(--fs-caption); font-weight: var(--fw-semibold); color: var(--kr-rose); text-wrap: pretty; }
.kr-blick__opt { min-width: 0; padding: 8px 12px; border-radius: var(--kr-radius-innen); background: var(--kr-gruen-bg); border-left: 3px solid var(--kr-gruen); font-size: var(--fs-caption); font-weight: var(--fw-bold); color: var(--kr-gruen); text-wrap: pretty; }
.kr-blick__tarif { display: flex; align-items: center; gap: var(--sp-3); justify-content: flex-end; }
.kr-blick__logo { width: 36px; height: 14px; flex: none; object-fit: contain; object-position: right center; }
.kr-blick__tarif-text { min-width: 0; display: flex; flex-direction: column; align-items: flex-end; }
.kr-blick__tarif-name { font-size: var(--fs-caption); font-weight: var(--fw-bold); color: var(--c-text); text-align: right; text-wrap: pretty; }
.kr-blick__tarif-preis { font-size: 11px; font-weight: var(--fw-bold); color: var(--c-text-soft); white-space: nowrap; font-variant-numeric: tabular-nums; }
.kr-mini-edit { display: inline-flex; align-items: center; justify-content: center; width: 26px; height: 26px; flex: none; border: 0; border-radius: var(--r-full); background: var(--ks-edit-bg); color: var(--ks-edit-fg); font: inherit; font-size: var(--fs-caption); cursor: pointer; }
.kr-mini-edit:hover { background: var(--ks-edit-bg-hover); }

/* Abschluss-Seite „Das schließt du konkret ab" (v11 B rev. 2) */
/* Fuß-Buttons in EINER Zeile (Owner 2026-08-12): Zurück-Outline links,
   Weiter-Primary rechts, mittig ausgerichtet — gleiche Höhe über --gross. */
.kr-weiter { display: flex; justify-content: space-between; align-items: center; gap: var(--sp-3); flex-wrap: wrap; margin-top: 18px; }
.kr-btn--gross { padding: 11px 22px; font-size: 14px; }
.kr-abschluss__kopf { display: flex; align-items: baseline; gap: var(--sp-3); margin: 0 0 4px; padding: 0 2px 8px; border-bottom: 2px solid var(--kr-akzent); }
.kr-abschluss__titel { margin: 0; font-size: var(--fs-h3); font-weight: 800; letter-spacing: .06em; text-transform: uppercase; color: var(--c-text); }
.kr-abschluss__eyebrow { margin-left: auto; flex: none; font-size: 10px; font-weight: 800; letter-spacing: .09em; text-transform: uppercase; color: var(--c-primary); white-space: nowrap; }
.kr-abschluss__sub { margin: 0 2px 14px; font-size: var(--fs-sm); font-weight: var(--fw-medium); color: var(--kr-pill-gering); text-wrap: pretty; }
.ks-vertrag__kopf--zaehler { justify-content: flex-end; }
.ks-vertrag__aktionen { flex: 0 0 auto; display: flex; align-items: center; gap: 6px; }
.ks-vertrag__aktionen form { display: inline-flex; }
/* .kr-mini-raus (✕ der Vertragsliste) ist seit T28/Entscheidung 7 (2026-08-11)
   entfernt — rausnehmen macht der Berater in der Konsole. */
.kr-vergleichen--gross { padding: 5px 12px; font-size: 11px; }

@media (max-width: 900px) {
  .kr-vgl__spalten { grid-template-columns: minmax(0, 1fr); }
  .kr-blick { grid-template-columns: minmax(0, 1fr); }
  .kr-blick__tarif { justify-content: flex-start; }
  .kr-szenario__icon { width: 84px; }
  .kr-szenario__icon img { width: 68px; height: 68px; }
}

/* Berater-Steuerung im Aufklapper — optisch abgesetzt, im Druck weg. */
.kg-steuerung { margin-top: var(--sp-3); padding-top: var(--sp-3); border-top: 1px solid var(--c-border-soft); }
/* Hero-Variante (Kasse-wechseln-Modal): ohne Trennlinie — MUSS nach der Basis
   stehen, gleiche Spezifität (stand vorher davor und verlor die Kaskade,
   Owner-Befund 2026-08-06: „zwei Linien unter dem Titel"). */
.kg-steuerung--hero { margin: 0 0 var(--sp-5); padding-top: 0; border-top: 0; }

/* Kassen-Vergleich im Overlay (natives <dialog>, s. .modal).
   Der Breit-Modifier steht bewusst UNTEN bei den .modal-Regeln — hier stünde er
   vor `.modal__box` und würde von dessen Breite überschrieben (gleiche Spezifität). */
.kg-modal__kopf { display: flex; align-items: center; gap: var(--sp-3); padding-bottom: var(--sp-3); border-bottom: 1px solid var(--c-border-soft); }
/* Schlichter Kopf (Kasse-wechseln-Modal, Owner 2026-08-06): keine Trennlinie
   unter dem Titel — die Duell-Overlays behalten ihre. */
.kg-modal__kopf--schlicht { border-bottom: 0; padding-bottom: 0; }
.kg-modal__icon { width: var(--kg-icon); height: var(--kg-icon); flex: none; display: inline-flex; align-items: center; justify-content: center; border-radius: var(--r-md); background: var(--vk-icon-kachel-bg); }
.kg-modal__icon img { width: 22px; height: 22px; object-fit: contain; }
.kg-modal__titel { flex: 1; font-size: var(--fs-h3); font-weight: var(--fw-bold); color: var(--c-primary); }

@media (max-width: 900px) {
  .kg-boxen { grid-template-columns: minmax(0, 1fr); }
}

/* Duell-Filterleiste: Bulk „nur bessere Kategorien" (Ole 2026-07-27). */
.kv-duell__filterleiste { display: flex; align-items: center; gap: var(--sp-2); padding: var(--sp-2) 0 var(--sp-3); border-bottom: 1px solid var(--c-border-soft); flex-wrap: wrap; }

/* Tarif-Zeile der Baustein-Karte: Combo + ✕ zum Entfernen (Owner 2026-07-27). */
.baustein__tarifzeile { display: flex; align-items: center; gap: var(--sp-1); }
.baustein__tarifzeile .combo { flex: 1; min-width: 0; }
.baustein__tarifzeile .icon-btn { flex: none; }

/* Bedarfs-Fragen in der Baustein-Karte (Ole/Alex 2026-07-27): Frequenz je Konto. */
.baustein__bedarf { margin-top: var(--sp-3); padding-top: var(--sp-3); border-top: 1px solid var(--c-border-soft); display: grid; gap: var(--sp-2); }
.baustein__bedarf-titel { margin: 0; font-size: var(--fs-caption); font-weight: var(--fw-semibold); color: var(--c-text-muted); text-transform: uppercase; letter-spacing: .04em; }
.baustein__frage { display: flex; align-items: center; justify-content: space-between; gap: var(--sp-2); flex-wrap: wrap; }
/* Folgefrage einer Ja/Nein-Frage (Owner 2026-09-03, Zahn: „Wie viele Zähne
   fehlen?"): nur sichtbar, solange in DERSELBEN Bedarfsgruppe „Ja" gewählt ist.
   Reine CSS-Sichtbarkeit wie die Antragsstrecken-Folgefelder (.af-folge) —
   ohne JS; der Server ignoriert die Zahl ohnehin, wenn „Ja" fehlt. */
.baustein__bedarf:not(:has(input[name="fehlende_zaehne"][value="ja"]:checked)) .baustein__frage--folge { display: none; }
/* Einstiegsfrage („Schon zusatzversichert?"): länger als die Ja/Nein-Fragen —
   Text auf voller Breite, die drei Antwort-Chips in eigener Zeile darunter. */
.baustein__gate { display: flex; flex-direction: column; align-items: flex-start; gap: var(--sp-2); }
.baustein__gate-text { font-size: var(--fs-sm); font-weight: var(--fw-semibold); text-wrap: pretty; }
.baustein__frage-text { flex: 1; min-width: 0; font-size: var(--fs-sm); font-weight: var(--fw-semibold); }
/* Festes 5-Spalten-Grid (Owner 2026-08-05): Label · ×/Jahr · × · € je · Ergebnis.
   Die Ergebnis-Spalte ist IMMER reserviert — nichts verschiebt sich beim Tippen;
   gilt überall (Konsole-Karte, Edit-Modal, Kundenfragen der Präsentation). */
.baustein__bedarf-zeile { display: grid; grid-template-columns: 1fr 6rem 14px 6rem 7.5rem; align-items: center; gap: var(--sp-2); }
.baustein__bedarf-label { min-width: 0; font-size: var(--fs-sm); }
.baustein__bedarf-zeile .input--sm { width: 100%; }
.baustein__bedarf-zeile .konto-frequenz__mal { text-align: center; }
.baustein__bedarf-summe { grid-column: 5; font-size: var(--fs-sm); font-weight: var(--fw-bold); color: var(--c-text); font-variant-numeric: tabular-nums; white-space: nowrap; }
/* T05 (Ole 2026-08-11, Screenshot „Schrift geht aus Containern raus"): in den
   READ-ONLY-Zeilen (nur Label + Summe, z. B. „Bereits erfasste Ausgaben") ist
   die Summe das ZWEITE Kind — sie darf dann über die Input-Spalten laufen und
   umbrechen, statt aus der 7.5rem-Spalte (und der Karte) zu ragen. */
.baustein__bedarf-zeile > .baustein__bedarf-summe:nth-child(2) { grid-column: 2 / -1; text-align: right; white-space: normal; overflow-wrap: anywhere; }

/* Ausgaben-Erfassung mit Frequenz (Ole/Alex 2026-07-27): Anzahl × Betrag oder €/Jahr. */
.konto-frequenz { display: flex; align-items: center; gap: var(--sp-1); }
.konto-frequenz .input--sm { width: 5rem; }
.konto-frequenz__mal { color: var(--c-text-muted); flex: none; }
.konto-frequenz__oder { color: var(--c-text-soft); font-size: var(--fs-caption); flex: none; }
.konto-frequenz__hinweis { margin: var(--sp-1) 0 0; font-size: var(--fs-caption); color: var(--c-text-muted); }

/* ── Antragsstrecke (A3-Redesign 2026-07-28) ─────────────────────────────────────
   Zwei Zonen je Antrag: „aus der Beratung übernommen" als Chips (Zone 1) und
   „das brauchen wir noch" als große Touch-Widgets (Zone 2). Ausgelöste Felder
   erscheinen als violette Unterkarte. Spec: wissen/design-system.md §Antragsstrecke. */
.af-antrag { max-width: var(--antrag-max); margin: 0 auto; overflow: hidden; }
.card--flush { padding: 0; }

/* Owner 04.09. (Karte 285): Der Antragskopf ist jetzt das <summary> eines
   Aufklappers — eingeklappt bleibt genau er stehen, bis zur grauen Kante.
   Das Standard-Dreieck des Browsers muss weg (beide Schreibweisen nötig:
   list-style für die meisten, ::-webkit-details-marker für ältere WebKits),
   sonst steht es zusätzlich zu unserem Pfeil im Kopf. */
.af-klapp > summary { list-style: none; cursor: pointer; }
.af-klapp > summary::-webkit-details-marker { display: none; }
/* Eingeklappt trägt der Kopf die untere Kante der Karte — ohne das
   säße ein grauer Strich unter dem letzten sichtbaren Element ins Leere. */
.af-klapp:not([open]) > .af-kopf { border-bottom: 0; }
.af-klapp__pfeil { flex: none; margin-left: var(--sp-2); color: var(--c-text-soft); font-size: 13px; line-height: 1; transition: transform var(--dur-base) var(--ease-out); }
.af-klapp[open] > summary .af-klapp__pfeil { transform: rotate(180deg); }
.af-kopf { display: flex; align-items: center; gap: var(--sp-3); padding: var(--sp-5) var(--sp-6); border-bottom: 1px solid var(--c-border-soft); }
/* Logo-Box wächst mit breiten Kassen-Logos mit (Owner 2026-08-03: „BKK firmus
   abgeschnitten") — feste 46px beschnitten alles über Wort-Bild-Marken-Breite. */
.af-kopf__logo { display: inline-flex; align-items: center; justify-content: center; min-width: 56px; height: 56px; padding: 0 var(--sp-2); flex: none; border-radius: var(--r-md); background: var(--c-bg); border: 1px solid var(--c-border-soft); }
.af-kopf__logo .logo-img--md { max-height: 36px; max-width: 120px; }
.af-kopf__text { flex: 1; min-width: 0; }
/* `margin: 0` gehoert zur Klasse, nicht zum Element: `.af-kopf__titel` steht
   viermal auf einem <div> und einmal auf einem <h1> (Funnel-Startseite, damit
   die oeffentliche Strecke ueberhaupt eine Ueberschrift hat). Das globale
   `h1 { margin: 0 0 var(--sp-4) }` riss dort 16 px zwischen Titel und
   Unterzeile, waehrend dieselbe Klasse sonst auf 0 stand (Owner 03.09.:
   unnoetiger Space, soll aussehen wie auf der Vergleichsseite). */
.af-kopf__titel { font-size: 17px; font-weight: var(--fw-bold); margin: 0; }
.af-kopf__meta { font-size: var(--fs-caption); color: var(--c-text-soft); }
.badge--ok-antrag { background: var(--antrag-ok-bg); color: var(--antrag-ok-fg); border: 1px solid var(--antrag-ok-bd); font-weight: var(--fw-bold); }
.badge--offen-antrag { background: var(--antrag-offen-bg); color: var(--antrag-offen-fg); border: 1px solid var(--antrag-offen-bd); font-weight: var(--fw-bold); }

.af-zone { padding: var(--sp-5) var(--sp-6); }
.af-zone + .af-zone { padding-top: 0; }
.af-eyebrow { margin: 0 0 var(--sp-3); font-size: 11px; font-weight: var(--fw-bold); letter-spacing: .07em; text-transform: uppercase; }
.af-eyebrow--ok { color: var(--antrag-ok-fg); }
.af-eyebrow--offen { color: var(--antrag-offen-fg); }

/* Kompakt-Modus (2026-08-04): Zone 1 als Ganzes einklappbar — sichtbar ist nur die
   Kopfzeile, die Chips kommen erst per Klick. Schalter-Text wechselt über [open]. */
.af-uebernommen > summary { display: flex; align-items: center; gap: var(--sp-3); cursor: pointer; list-style: none; }
.af-uebernommen > summary::-webkit-details-marker { display: none; }
.af-uebernommen > summary .af-eyebrow { margin: 0; }
.af-uebernommen[open] > summary { margin-bottom: var(--sp-3); }
.af-uebernommen__schalter { font-size: var(--fs-sm); font-weight: var(--fw-semibold); color: var(--c-primary); }
.af-uebernommen__auf { display: none; }
.af-uebernommen[open] .af-uebernommen__zu { display: none; }
.af-uebernommen[open] .af-uebernommen__auf { display: inline; }

/* Kompakt-Modus Zone 2: schon Ausgefülltes verstecken (display:none sendet weiter mit
   und zählt im Fortschritt weiter); app.js setzt die Klasse nur bei echtem Inhalt. */
.af-zone__kopf { display: flex; align-items: center; justify-content: space-between; gap: var(--sp-3); margin-bottom: var(--sp-3); }
.af-zone__kopf .af-eyebrow { margin: 0; }
.af-zone--nur-offen .field--ok, .af-zone--nur-offen .af-frage--ok { display: none; }
/* Überschrift, unter der nur Verstecktes steht, wäre eine Frage ohne Antwort —
   app.js markiert sie (af-headline--leer), versteckt wird nur im Kompakt-Modus. */
.af-zone--nur-offen .af-headline--leer { display: none; }
/* Owner-Bug 03.09.: Dieselbe Falle eine Ebene höher — die violette Hülle eines
   bedingten Blocks (.af-unter) blieb als LEERE Box stehen, wenn alle ihre Felder
   beantwortet und damit versteckt waren (sichtbar an „Wie viele Zähne fehlen
   genau?", nachdem die Konsole-Antwort einläuft). Die Hülle verschwindet jetzt
   mit, sobald sie KEIN sichtbares Kind mehr hat. Bewusst per :has() statt per
   JS-Marker wie bei den Überschriften: der Zustand stimmt dadurch auch in
   Blöcken, die app.js erst beim Setzen des Triggers einklont — ein Marker
   müsste dort nachgezogen werden und wäre eine zweite Wahrheit. */
.af-zone--nur-offen .af-unter:not(:has(> :not(.field--ok):not(.af-frage--ok))) { display: none; }

/* Zone 1 — Zusammenfassungs-Chip je fertiger Gruppe, aufklappbar und editierbar. */
.af-chips { display: grid; gap: var(--sp-2); }
.af-chip { border: 1px solid var(--c-border-soft); border-radius: var(--r-md); background: var(--c-surface); }
.af-chip[open] { background: var(--antrag-unter-bg); }
.af-chip > summary { display: flex; align-items: center; gap: var(--sp-3); padding: var(--sp-3) var(--sp-4); cursor: pointer; list-style: none; }
.af-chip > summary::-webkit-details-marker { display: none; }
.af-chip__haken { display: inline-flex; align-items: center; justify-content: center; width: 22px; height: 22px; flex: none; border-radius: var(--r-full); background: var(--antrag-ok-bg); color: var(--antrag-ok-fg); font-size: var(--fs-caption); font-weight: var(--fw-bold); }
.af-chip__titel { flex: none; font-size: var(--fs-sm); font-weight: var(--fw-bold); }
.af-chip__werte { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: var(--fs-sm); color: var(--c-text-muted); }
.af-chip__aendern { flex: none; font-size: var(--fs-sm); font-weight: var(--fw-semibold); color: var(--c-primary); }
.af-chip[open] .af-chip__aendern { color: var(--c-text-soft); }
.af-chip > .felder-grid { padding: 0 var(--sp-4) var(--sp-4); margin-bottom: 0; animation: kk-drop-in var(--dur-fast) var(--ease-out); }
/* Doppelte Klasse: sticht die Basis-.felder-grid weiter unten in dieser Datei aus. */
.felder-grid.felder-grid--breit { grid-template-columns: repeat(auto-fill, minmax(var(--antrag-feld-min), 1fr)); }

/* Zone 2 — offene Gruppen: alles sichtbar, Übernommenes mit grüner Kante. */
.af-gruppe-offen { display: grid; gap: var(--sp-4); }
.af-gruppe-offen + .af-gruppe-offen { margin-top: var(--sp-5); }
.af-gruppe-offen__titel { margin: 0; font-size: 11px; font-weight: var(--fw-bold); letter-spacing: .07em; text-transform: uppercase; color: var(--antrag-offen-fg); }
.af-gruppe-offen .field { margin-bottom: 0; }
.field--ok .input, .field--ok .af-seg__btn, .af-frage--ok .input { border-color: var(--antrag-ok-bd); }

/* Segment-Knöpfe (ja_nein/toggle + Auswahl bis 3 Optionen) — Radios, ohne JS nutzbar. */
.af-seg { position: relative; display: flex; gap: 6px; }
.af-seg__input { position: absolute; width: 1px; height: 1px; opacity: 0; pointer-events: none; }
.af-seg__btn { flex: 1; display: inline-flex; align-items: center; justify-content: center; min-width: 0; height: var(--antrag-seg-h); padding: 0 var(--sp-3); border: var(--antrag-seg-bd) solid var(--c-border); border-radius: var(--r-sm); background: var(--c-surface); color: var(--c-text-muted); font-weight: var(--fw-semibold); text-align: center; cursor: pointer; }
.af-seg__btn:hover { border-color: var(--c-accent); }
.af-seg__input:checked + .af-seg__btn { background: var(--c-primary); border-color: var(--c-primary); color: var(--c-text-on-accent); }
.af-seg__input:focus-visible + .af-seg__btn { box-shadow: 0 0 0 3px var(--c-focus-ring); }
/* Folgefragen CSS-only (Track-F-Ticket 01.09., Funnel laedt bewusst kein JS):
   .af-folge ist ein SPAETERES GESCHWISTER der ausloesenden .af-frage im selben
   Container und bleibt zu, bis deren markiertes Radio (.af-seg__input--folge-an,
   i. d. R. der Ja-Knopf) gewaehlt ist. display:contents laesst die enthaltenen
   Felder als normale Kinder des umgebenden Rasters mitlaufen (zwei Folgefragen
   fuellen so die zwei Spalten des zweispaltig-Modifiers). */
.af-folge { display: none; }
.af-frage:has(.af-seg__input--folge-an:checked) ~ .af-folge { display: contents; }

/* Frage-Zeile: langes Label links, Widget rechts in fester Breite. */
.af-frage { display: flex; align-items: center; gap: var(--sp-4); flex-wrap: wrap; }
.af-frage__text { flex: 1; min-width: 280px; font-weight: var(--fw-semibold); text-wrap: pretty; }
.af-frage__widget { width: var(--antrag-widget-w); flex: none; }
.af-frage__widget .input { width: 100%; }

/* Länder-Combobox der Antragsstrecke (A5 „Länder-Dropdowns", Owner 2026-08-05):
   Textfeld + Vorschlagsliste mit self-gehosteten SVG-Flaggen (static/img/flaggen/).
   Ohne JS bleibt nur das Textfeld — Liste + Flagge baut app.js dazu. */
.kb-land { position: relative; }
.kb-land .input { width: 100%; }
.kb-land--flagge .input { padding-left: 44px; }
.kb-land__flagge { position: absolute; left: 12px; top: 50%; transform: translateY(-50%); width: 24px; height: 18px; border-radius: 3px; box-shadow: 0 0 0 1px var(--c-border); pointer-events: none; }
.kb-land__liste { position: absolute; top: calc(100% + 6px); left: 0; right: 0; z-index: 40; max-height: 320px; overflow-y: auto; background: var(--c-surface); border: 1px solid var(--c-border); border-radius: var(--r-md); box-shadow: var(--combo-panel-shadow); padding: 4px; display: flex; flex-direction: column; }
/* Karten 114/115 (Root-Cause des Dropdown-Pakets, 18.08.): display:flex oben
   ÜBERSTIMMT die Browser-Regel [hidden]{display:none} — jeder JS-Schließweg
   (Auswahl, blur, Outside-Click, Escape) setzte hidden=true, die Liste blieb
   trotzdem sichtbar stehen und überlagerte die Folgezeilen (Karte 112).
   Explizite [hidden]-Regel stellt das Schließen wieder her. */
.kb-land__liste[hidden] { display: none; }
.kb-land__item { display: flex; align-items: center; gap: 10px; padding: 8px 10px; border: 0; border-radius: 8px; background: none; font: inherit; color: inherit; text-align: left; cursor: pointer; }
.kb-land__item:hover, .kb-land__item.is-active { background: var(--combo-option-hover); }
.kb-land__item-flagge { width: 24px; height: 18px; border-radius: 3px; box-shadow: 0 0 0 1px var(--c-border); flex: none; }
.kb-land__item-wort { font-weight: var(--fw-medium); overflow-wrap: anywhere; }
.kb-land__item-neben { margin-left: auto; padding-left: var(--sp-3); font-size: 12px; color: var(--c-text-soft); flex: none; }

/* Karten-Checkbox mit „mehr anzeigen" — Volltext bleibt IMMER im DOM (rechtlich). */
.af-erk { display: flex; align-items: flex-start; gap: var(--sp-3); padding: var(--sp-3) var(--sp-4); border: var(--antrag-seg-bd) solid var(--c-border); border-radius: var(--r-sm); background: var(--c-surface); }
.af-erk + .af-erk { margin-top: var(--sp-2); }
.af-erk--an, .af-erk:has(.af-erk__box:checked) { border-color: var(--antrag-ok-bd); background: var(--antrag-ok-leise); }
.af-erk__box { position: absolute; width: 1px; height: 1px; opacity: 0; pointer-events: none; }
.af-erk__haken { display: inline-flex; align-items: center; justify-content: center; width: 24px; height: 24px; flex: none; margin-top: 1px; border: var(--antrag-seg-bd) solid var(--c-border); border-radius: 7px; background: var(--c-surface); cursor: pointer; }
.af-erk__haken::after { content: "✓"; color: var(--c-text-on-accent); font-weight: var(--fw-bold); opacity: 0; }
.af-erk__box:checked + .af-erk__haken { background: var(--antrag-ok-fg); border-color: var(--antrag-ok-fg); }
.af-erk__box:checked + .af-erk__haken::after { opacity: 1; }
.af-erk__box:focus-visible + .af-erk__haken { box-shadow: 0 0 0 3px var(--c-focus-ring); }
.af-erk__text { flex: 1; min-width: 0; font-size: var(--fs-sm); text-wrap: pretty; }
.af-erk__text label { cursor: pointer; }
.af-mehr > summary { list-style: none; cursor: pointer; }
.af-mehr > summary::-webkit-details-marker { display: none; }
.af-mehr__link { margin-left: var(--sp-1); color: var(--c-primary); font-weight: var(--fw-semibold); }
.af-mehr__link--zu, .af-mehr[open] .af-mehr__kurz, .af-mehr[open] .af-mehr__link--auf { display: none; }
.af-mehr[open] .af-mehr__link--zu { display: inline; }
.af-mehr__voll { display: none; }
.af-mehr[open] .af-mehr__voll { display: inline; }

/* Ausgelöste Felder — eingerückte violette Unterkarte direkt unter der Frage. */
.af-unter { display: grid; grid-template-columns: repeat(auto-fill, minmax(var(--antrag-feld-min), 1fr)); gap: var(--sp-3); grid-column: 1 / -1; padding: var(--sp-4); border: 1px solid var(--antrag-unter-bd); border-radius: var(--r-md); background: var(--antrag-unter-bg); animation: kk-drop-in var(--dur-base) var(--ease-out); }
.af-unter .field { margin-bottom: 0; }
.af-unter .af-frage { grid-column: 1 / -1; }
@keyframes kk-drop-in { from { opacity: 0; transform: translateY(-4px); } to { opacity: 1; transform: none; } }

.af-headline { grid-column: 1 / -1; font-weight: var(--fw-semibold); margin-top: var(--sp-2); }
.af-fest { margin: 0; color: var(--c-text-muted); }
.af-hinweis { margin: var(--sp-1) 0 0; font-size: var(--fs-caption); color: var(--c-text-soft); }
.af-fehler { margin: var(--sp-1) 0 0; font-size: var(--fs-caption); color: var(--c-error); }
.af-fussnote { max-width: var(--antrag-max); margin: var(--sp-4) auto 0; font-size: var(--fs-sm); color: var(--c-text-soft); text-wrap: pretty; }
/* --links: linksbuendig statt zentriert — fuer Umgebungen, die selbst NICHT
   auf --antrag-max zentriert sind (Funnel: .container/.af-zone laufen voll
   breit). Die Basisklasse bleibt zentriert: in der Konsole steht die Fussnote
   unter den .af-antrag-Karten (860, zentriert) und fluchtet nur dadurch. */
.af-fussnote--links { margin-inline: 0 auto; }

/* Sticky Footer: Fortschritt über ALLE Anträge + Speichern/Übergeben.
   Karte 174: Optik an die KKB-Antragsstrecke angeglichen — schwebendes,
   gerundetes Panel mit Luft statt flacher Vollbreiten-Leiste mit hartem
   Trennstrich (reine Optik, Elemente/Verhalten unverändert). */
.af-footer { position: sticky; bottom: var(--sp-3); z-index: 20; display: flex; justify-content: center; margin-top: var(--sp-5); padding: 0 var(--sp-4); background: transparent; }
.af-footer__inner { display: flex; align-items: center; gap: var(--sp-4); width: var(--antrag-max); max-width: 100%; padding: var(--sp-4) var(--sp-5); background: var(--antrag-footer-bg); backdrop-filter: var(--antrag-footer-blur); border: 1px solid var(--c-border-soft); border-radius: var(--r-lg); box-shadow: var(--sh-lg); }
.af-footer__label { font-size: var(--fs-sm); font-weight: var(--fw-semibold); color: var(--c-text-muted); white-space: nowrap; }
.af-balken { flex: 1; height: var(--antrag-balken-h); border-radius: var(--r-full); background: var(--c-surface-muted); overflow: hidden; }
.af-balken__fuell { display: block; height: 100%; border-radius: var(--r-full); background: var(--antrag-ok-fg); transition: width var(--t-slow); }
.btn-uebergeben { background: var(--antrag-ok-fg); color: var(--c-text-on-accent); }
.btn-uebergeben:hover { background: var(--antrag-ok-fg); filter: brightness(.94); }

/* Kassen-Vergleich, KUNDEN-Layout (Konzept; Vorbild bonusrechner_vergleich2):
   Ersparnis-Aufmacher, „Details zum Vergleichen"-Toggle, Box-Paare je Leistung —
   die laut API bessere Kasse grün, die andere grau; Zeilen expandieren zu Texten. */
.kvk-hero { display: flex; align-items: baseline; justify-content: space-between; gap: var(--sp-3); flex-wrap: wrap; }
.kvk-hero__label { font-size: var(--fs-h3); font-weight: var(--fw-semibold); color: var(--c-text-soft); }
.kvk-hero__wert { font-size: 2rem; font-weight: var(--fw-bold); color: var(--c-spart); }
.kvk-hero__wert--minus { color: var(--c-text); }
.kvk-kurz { margin: var(--sp-3) 0 var(--sp-4); display: flex; flex-direction: column; gap: var(--sp-2); }
.kvk-kurz__zeile { display: flex; align-items: center; justify-content: space-between; gap: var(--sp-3); font-size: var(--fs-sm); color: var(--c-text-soft); }
.kvk-minus { color: var(--c-text-soft); font-size: var(--fs-caption); }
.kvk-details__knopf { display: inline-flex; align-items: center; gap: var(--sp-2); cursor: pointer; list-style: none; }
.kvk-details__knopf::-webkit-details-marker { display: none; }
.kvk-details[open] > .kvk-details__knopf .vk-vorteil__pfeil { transform: rotate(180deg); }
.kvk-abschnitt { margin: var(--sp-6) 0 var(--sp-2); font-size: var(--fs-h2); }
.kvk-spalten { display: grid; grid-template-columns: minmax(0, 1.2fr) minmax(0, 1fr) minmax(0, 1fr); gap: var(--sp-2); font-size: var(--fs-caption); text-transform: uppercase; letter-spacing: .04em; color: var(--c-text-muted); font-weight: var(--fw-semibold); padding-bottom: var(--sp-2); border-bottom: 1px solid var(--c-border); }
.kvk-logos { display: grid; grid-template-columns: minmax(0, 1.2fr) minmax(0, 2fr); gap: var(--sp-2); padding-bottom: var(--sp-3); border-bottom: 1px solid var(--c-border-soft); margin-bottom: var(--sp-1); }
.kvk-logos__paar { display: grid; grid-template-columns: 1fr 1fr; gap: var(--sp-2); }
.kvk-logos__zelle { display: flex; flex-direction: column; align-items: center; gap: var(--sp-1); font-size: var(--fs-caption); color: var(--c-text-muted); text-align: center; }
/* Karte 107: Aktions-Zeile am Zellen-Fuss — Formulare brauchen Block-Kontext
   (form in span ist invalides HTML), Aktionen aller Spalten fluchten unten. */
.kvk-logos__aktionen { display: flex; align-items: center; justify-content: center; gap: var(--sp-2); margin-top: auto; }
.kvk-logos__aktionen form { margin: 0; display: contents; }
.kvk-zeile { display: grid; grid-template-columns: minmax(0, 1.2fr) minmax(0, 2fr); gap: var(--sp-2); align-items: center; padding: var(--sp-2) 0; }
/* Einrückung nur am Titel — läge sie auf der Zeile, verschöben sich die
   Box-Spalten gegenüber Logo-Kopf + Monatsbeitrag (Owner 2026-08-03: „nicht aligned"). */
.kvk-zeile--sub .kvk-zeile__titel { padding-left: var(--sp-4); }
.kvk-zeile__titel { font-size: var(--fs-sm); font-weight: var(--fw-medium); overflow-wrap: anywhere; }
.kvk-boxpaar { display: grid; grid-template-columns: 1fr 1fr; gap: var(--sp-2); }
/* #82-Multivergleich (Owner 2026-08-17): bis zu 4 Spalten im Tarif-Duell —
   dieselben Paar-Raster, nur mit 3er-/4er-Spaltenzahl (Template setzt --nN). */
.kvk-boxpaar--n3, .kvk-logos__paar--n3 { grid-template-columns: repeat(3, 1fr); }
.kvk-boxpaar--n4, .kvk-logos__paar--n4 { grid-template-columns: repeat(4, 1fr); }
.kvk-box { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 4px; padding: var(--sp-2) var(--sp-3); border-radius: var(--r-md); border: 1px solid var(--c-border); background: var(--c-surface-muted); color: var(--c-text-soft); font-size: var(--fs-sm); text-align: center; }
.kvk-box--besser { background: var(--c-spart-bg); border-color: var(--c-spart); color: var(--c-text); }
/* Karte 54, Farb-Mapping V3 (Owner-Entscheid 12.08., ersetzt das Mockup-V2-
   Grau+Rot): im Vergleich gibt es KEIN Rot mehr — nur noch drei Optiken:
   Vollgrün (stufe gut) · „Grüngrau" (JEDE andere echte Deckung, mittel UND
   schwach: grüner 4-px-Balken auf grauer Box — „50 % ist trotzdem eine
   Deckung") · komplett Grau („nicht enthalten", ✗ grau). Einstufung
   gut/mittel/schwach kommt als DATEN aus dem A-Helper (`be.stufe`);
   das 2-Optiken-Mapping ist reine Anzeige. „keine Angabe" bleibt abgeschafft. */
/* #93-Nachbesserung (Owner 2026-08-18, ERSETZT die V3-Semantik vom 12.08.):
   vier Farbstufen OHNE Akzent-Balken — sehr positiv (gut) = grün auf grün wie
   der Monatsbeitrag-Spar-Badge · positiv (mittel) = graue Box mit grüner
   Schrift · neutral (schwach) = grau-grau (Basisbox) · negativ (nicht
   enthalten) = graue Box mit ROTER Schrift. */
.kvk-box--stufe-gut { border-color: var(--c-spart); background: var(--c-spart-bg); color: var(--c-spart); font-weight: var(--fw-semibold); }
.kvk-box--stufe-mittel { color: var(--c-spart); font-weight: var(--fw-semibold); }
.kvk-box--stufe-schwach { color: var(--c-text-soft); }
.kvk-box--fehlt { color: var(--c-error); }
.kvk-box--fehlt .kvk-box__ikon { color: var(--c-error); font-weight: var(--fw-bold); }
/* Tarif-Vorstellung (Karte #97): offizieller Auftritt des Tarifs im
   Detail-Modal — Kopfzeile (Logo + Name + Website-Button rechts),
   Dokumente-Links, belegte Beitragsentwicklung mit Quelle. */
.tarif-vorstellung { margin-top: var(--sp-5); padding-top: var(--sp-4); border-top: 1px solid var(--c-border-soft); }
.tarif-vorstellung__kopf { display: flex; align-items: center; gap: var(--sp-3); flex-wrap: wrap; }
.tarif-vorstellung__name { font-weight: var(--fw-semibold); min-width: 0; }
.tarif-vorstellung__kopf .btn { margin-left: auto; }
.tarif-vorstellung__doks { margin: var(--sp-3) 0 0; padding: 0; list-style: none; display: grid; gap: var(--sp-1); font-size: var(--fs-sm); }
.tarif-vorstellung__quelle { margin-top: var(--sp-1); font-size: var(--fs-caption); color: var(--c-text-muted); }
.kvk-summe { border-top: 1px solid var(--c-border); margin-top: var(--sp-3); }
.kvk-summe__rechnung { display: flex; flex-direction: column; align-items: flex-end; gap: 2px; font-size: var(--fs-sm); color: var(--c-text-soft); }
.kvk-summe__gesamt { font-size: var(--fs-h2); font-weight: var(--fw-bold); color: var(--c-spart); }
.kvk-kategorie { border-top: 1px solid var(--c-border); padding: var(--sp-2) 0; }
/* Kopf im Zeilen-Grid. #79-Abnahme (Owner 17.08.): das Bewertungs-Label-Paar
   („sehr gut → sehr gut") ist aus dem Template entfernt; der Kopf ist jetzt ein
   GRAUER BALKEN, damit die Oberkategorie im Duell sofort ins Auge springt
   (Flächen-Token, kein neuer Farbwert). */
.kvk-kategorie__kopf { display: grid; grid-template-columns: minmax(0, 1.2fr) minmax(0, 2fr); gap: var(--sp-2); align-items: center; padding: var(--sp-2) var(--sp-3); background: var(--c-surface-muted); border-radius: var(--r-md); }
.kvk-kategorie__links { display: flex; align-items: center; gap: var(--sp-3); flex-wrap: wrap; }
.kvk-kategorie__kopf .vk-vorteil__label { margin-left: 0; text-align: center; }
.kvk-kategorie__titel { font-weight: var(--fw-semibold); }
/* Zarte Trenner zwischen den Leistungszeilen — die Box-Paare „schwimmen" sonst. */
.kvk-kategorie .kvk-zeile { border-top: 1px solid var(--c-border-soft); }
.kvk-leistung > summary { cursor: pointer; list-style: none; }
.kvk-leistung > summary::-webkit-details-marker { display: none; }
.kvk-leistung[open] .vk-vorteil__pfeil { transform: rotate(180deg); }
/* Vergleichs-Zeile: Der Ausklapp-Pfeil sitzt IM Wertkasten, nicht am Titel, die
   GANZE Kachel schaltet, und es ist immer nur EIN Text offen (Owner 01.09.,
   Entwurf design_handout_vergleichsseite/). Vorher klappte ein Klick irgendwo in
   der Zeile BEIDE Texte auf — der Kunde bekam die Auskunft der anderen Kasse,
   nach der er nicht gefragt hatte.

   ~~Radios (exklusiv, nicht abwaehlbar)~~ ~~Checkboxen (abwaehlbar, nicht
   exklusiv)~~ → **`<details name>`**: Gleichnamige `details` bilden eine Gruppe,
   in der sich immer nur EINES oeffnet, und ein zweiter Klick schliesst es.
   Exklusiv UND abwaehlbar, ohne eine Zeile Skript — die Strecke laedt keines.

   Der Text liegt AUSSERHALB des `details` und wird ueber `:has([open])`
   sichtbar: Im `details` stuende er in der halben Kachel statt ueber beiden.
   Aeltere Browser ohne `details name` verlieren nur die Exklusivitaet. */
/* EINE Regel fuer das summary, nicht zwei. Vorher setzte `.kvk-box__klapp`
   danach nochmal `display:flex` OHNE Richtung — dadurch fiel die Spalte auf
   `row` zurueck, und der Pfeil stand zwischen Wert und Spar-Abzeichen statt
   unter beidem (Owner-Meldung 01.09.). Zwei Regeln auf demselben Element sind
   genau die Sorte Fehler, die man im Diff nicht sieht. */
.f-strecke .kvk-box--klappbar > summary.kvk-box__klapp { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 4px; cursor: pointer; list-style: none; }
.f-strecke .kvk-box--klappbar > summary::-webkit-details-marker { display: none; }
/* Der Pfeil steht IMMER ganz unten in der Kachel, der Inhalt darueber MITTIG
   (Owner, zweite Fassung 02.09.).

   Erst muss das `summary` die Kachel ausfuellen (`flex:1`) — sonst ist es nur
   so hoch wie sein Inhalt, und „unten" hat gar keine Bedeutung. Dass die
   Kacheln untereinander gleich hoch sind, liefert `.kvk-boxpaar` ohnehin: ein
   Raster streckt seine Zellen.

   Die freie Hoehe verteilt `margin-block: auto` am Inhalts-Behaelter: In einem
   Flex-Container schlucken automatische Raender den Rest, und zwei gleiche
   teilen ihn zu gleichen Teilen — Luft oben, Luft unten, Pfeil ganz unten.
   ~~`margin-top:auto` am Pfeil~~ (erste Fassung) schob zwar den Pfeil nach
   unten, warf aber ALLE Luft nach oben: Der Inhalt klebte am oberen Rand, und
   bei zwei Kacheln mit unterschiedlich vielen Zeilen sah eine davon aus, als
   fehlte etwas.

   Warum ein eigener Behaelter noetig ist: Der Wert ist ein blosser Textknoten
   (`wert()` liefert „Keine Leistung" oder „100,00 €"), und an einem anonymen
   Flex-Element greift kein `margin`. */
.f-strecke .kvk-box--klappbar > summary.kvk-box__klapp { flex: 1 1 auto; width: 100%; }
.f-strecke .kvk-box__inhalt { display: flex; flex-direction: column; align-items: center; gap: 4px; margin-block: auto; }
.f-strecke .kvk-box--klappbar > summary:focus-visible { border-radius: var(--r-md); box-shadow: 0 0 0 3px var(--c-focus-ring); }
.f-strecke .kvk-box--klappbar[open] .vk-vorteil__pfeil { transform: rotate(180deg); }
/* Das Wechseldatum-Feld wird ZURUECKGEHALTEN, solange die Bindungsfrage nicht
   fertig beantwortet ist (Owner 2026-09-02, zweite Fassung).

   Ohne Skript kann die Seite ihre eigene Auswahlliste nicht nachrechnen: Wer
   „nein, noch keine 12 Monate" klickt, saehe darunter weiter Termine, die genau
   diese Antwort verbietet. Also zeigt die Seite das Feld erst, wenn die Angabe
   VOLLSTAENDIG ist — Monat UND Jahr. Danach ist es sichtbar; den Termin selbst
   rueckt der Server beim Absenden nach (funnel/routes.py).

   ~~Ein Platzhalter-Satz an der Stelle der Liste~~ (erste Fassung) ist raus
   (Owner): Verborgen wird das GANZE Feld samt Beschriftung — eine Ueberschrift
   ohne Inhalt darunter sieht kaputt aus, und ein erklaerender Satz war nicht
   gewollt.

   „Noch nichts gewaehlt" ist am `<option value="">Bitte waehlen</option>`
   erkennbar, solange es ausgewaehlt ist. Ein `:has()` trifft, wenn IRGENDEINES
   der beiden Auswahlfelder noch leer ist — genau das gewuenschte ODER, in einer
   Regel. ⚠ Verschwindet diese leere Option je aus dem Markup, greift die Regel
   lautlos nicht mehr; ein Waechter besteht deshalb auf ihr.

   Die Regel greift NUR, solange der Server die Antwort nicht kennt
   (`--bindung-offen`, gesetzt in routes `_systemfragen`). Ohne diesen Zusatz
   bliebe das Feld nach dem Absenden fuer immer verborgen — das „nein" bleibt ja
   angeklickt.

   Aeltere Browser ohne `:has()` (vor Chrome 105 / Safari 15.4 / Firefox 121)
   zeigen das Feld durchgehend: Der Termin wird dann beim Absenden nachgerueckt.
   Nichts bricht, nichts kommt durch. */
.f-strecke .form-grid--bindung-offen:has(.af-frage--bindung .af-seg__input--folge-an:checked):has(.af-folge__wahl option[value=""]:checked) .field--wechseldatum { display: none; }
.f-strecke .kvk-leistung__text { display: none; }
.f-strecke .kvk-leistung:has(.kvk-box--alt[open]) .kvk-leistung__text--alt,
.f-strecke .kvk-leistung:has(.kvk-box--neu[open]) .kvk-leistung__text--neu { display: block; }
/* Der aufgeklappte Text steht in einem eigenen Kasten (Owner-Entwurf), nicht
   nackt unter der Zeile — sonst laeuft er optisch in die naechste Leistung.

   Und er liegt GENAU unter den beiden Wertkaesten, nicht unter dem
   Kategorienamen (Owner 01.09.): Die Zeile bekommt dafuer dasselbe 1.2fr/2fr-
   Raster wie `.kvk-zeile`, die Zeile selbst spannt beide Spalten, der Text
   sitzt in der zweiten. Dieselben Werte wie `.kvk-zeile` — dadurch fluchtet er
   von selbst und ohne eine zweite Breitenangabe, die beim naechsten
   Raster-Umbau danebenliegt. */
.f-strecke .kvk-leistung { display: grid; grid-template-columns: minmax(0, 1.2fr) minmax(0, 2fr); gap: var(--sp-2); }
.f-strecke .kvk-leistung > .kvk-zeile { grid-column: 1 / -1; }

.kvk-leistung__texte { padding: var(--sp-2) 0 var(--sp-3); font-size: var(--fs-sm); color: var(--c-text-soft); display: flex; flex-direction: column; gap: var(--sp-2); }
.kvk-leistung__texte p { margin: 0; }
/* EIN „Weitere Details laden"-Umschalter (CSS-Checkbox, kein JS): Standard zeigt
   nur Zeilen mit Vorteil der neuen Kasse; :checked blendet die .kvk-rest-Blöcke
   in Ersparnis-Rechnung UND Leistungen & Bonus ein. */
.kvk-alle { display: none; }
.kvk-rest { display: none; }

/* ── Funnel-Geltungsbereich `.f-strecke` (2026-09-01) ──────────────────────
   Bewusste Abweichungen der OEFFENTLICHEN Kundenstrecke von den Konsolen-
   Voreinstellungen. Alles hier haengt an der Klasse am <body> der Strecke —
   das Backoffice bleibt unberuehrt, ohne dass je Stelle ein Modifier noetig
   waere.

   Kontrast: `--c-text-soft` erreicht auf der Creme-Karte 2,68:1 und
   in der Vergleichs-Box auf `--c-surface-muted` 2,51:1 — WCAG AA verlangt
   4,5:1 fuer Fliesstext. Betroffen war ausgerechnet der Beitrag der HEUTIGEN
   Kasse, also die Zahl, gegen die verglichen wird, und die Quellen-Fussnote.
   `--c-text-muted` liegt bei 5,06:1. Im Backoffice sitzt derselbe Ton vor
   anderen Flaechen und vor einem Publikum, das die Seite taeglich sieht —
   deshalb hier korrigiert und dort als Befund gemeldet, statt das Token
   global zu drehen. */
.f-strecke .kvk-box { color: var(--c-text-muted); }
/* Wegfall-Marke bleibt in EINER Zeile: „Faellt 2027 weg" ist kurz genug, ein
   Umbruch mitten im Hinweis liest sich wie zwei Fehler statt einem. */
.badge--einzeilig { white-space: nowrap; }
/* Ersparnis-Zeile der Abschluss-Seite: gleiche Flucht wie die Beitragszeile.
   Der Wert steht in der Boxpaar-Spalte, damit er GENAU ueber dem Beitrag liegt;
   zentriert wie die Box darunter, nur ohne Rahmen — es ist keine Vergleichs-
   zelle, sondern die Zahl, wegen der jemand hier steht. */
/* Auf dem Handy faellt die Zeile auf eine Spalte, das Boxpaar bleibt aber
   zweispaltig — die grosse Zahl bekam eine halbe Zeile und brach dreimal um.
   Der Beitrag darunter ist eine kleine Pille und darf halb bleiben. */
@media (max-width: 640px) {
}
/* Kurzes Label + Segment-Knoepfe stehen NEBENEINANDER statt an den Enden einer
   vollen Zeile („Anrede" links, Knoepfe 700 px weiter rechts). Die Knopfbreite
   bleibt die der langen Fragen — gleiche Groesse ueberall war der Owner-Auftrag
   vom Vormittag. */
.f-strecke .af-frage--kompakt { gap: var(--sp-4); }
.f-strecke .af-frage--kompakt .af-frage__text { flex: none; min-width: 0; }
/* Abschluss-Block der Strecke: dieselbe rechte Kante wie die Einwilligungs-
   Karten darunter (Owner 01.09., ausdrueckliches GO fuer den Eingriff in
   components.css — F1 baut hier normalerweise nicht).

   Vorher liefen Ersparnis und Beitrag ueber die VOLLE Zeile, die Karten aber
   auf `--strecke-erk-max`. Drei Bloecke, zwei rechte Kanten — auf dem letzten
   Schritt vor dem Absenden, wo der Blick genau diese Zahlen abgleicht.

   Die zweite Regel ist noetig, WEIL `.kvk-boxpaar` fuer den Vergleich zweier
   Kassen gebaut ist (zwei Spalten). Auf der Abschluss-Seite steht dort nur EIN
   Wert — er endete dadurch mitten in der Zeile statt an der Kante. Hier ist
   nichts zu vergleichen, also eine Spalte. */
/* Der Abschluss-Block ist eine KARTE mit zwei Zeilen (Owner-Entwurf „5 neu",
   zweite Fassung 02.09.). Vorher waren es zwei lose Vergleichs-Zeilen, und drei
   Dinge gingen daneben: Der Beitrag sass in einem gruenen Kasten und stritt mit
   der gruenen Ersparnis · beide Betraege standen MITTIG ueber der rechten Spalte
   statt an der Kante, an der die Einwilligungen darunter enden · und die Karte
   fehlte, sodass die Zahlen im Nichts standen.

   Die Breite bleibt `--strecke-erk-max` — dieselbe wie bei den Einwilligungen.
   Das ist der Grund, warum die rechte Kante ueberhaupt eine gemeinsame ist. */
/* Zwei Nutzer, eine Karte (02.09.): die Schluss-Seite und der Ersparnis-Block
   der Ergebnisseite. Deshalb heisst sie `strecke-summe` und nicht mehr
   `strecke-abschluss` — auf der Ergebnisseite wird nichts abgeschlossen.

   Die Breite ist NICHT gemeinsam, deshalb der Modifikator `--eng`: Auf der
   Schluss-Seite bindet `--strecke-erk-max` die Karte an die Einwilligungen
   darunter (eine rechte Kante), auf der Ergebnisseite laeuft sie ueber die
   volle Zone wie die Vergleichszeilen darunter. Gemeinsam ist die FORM, nicht
   das Mass — und die Seite sagt das selbst an, statt es aus der
   Verschachtelung abzuleiten. */
.f-strecke .strecke-summe { padding: var(--sp-4); border-radius: var(--r-lg); background: var(--c-surface-muted); }
/* Mittig, nicht linksbuendig (Owner 2026-09-02): Sobald die Karte schmaler ist
   als die Lesebreite, sass der Block sonst links und die Luft rechts. */
.f-strecke .strecke-summe--eng { max-width: var(--strecke-erk-max); margin-inline: auto; }
.f-strecke .strecke-summe__zeile { display: flex; align-items: center; justify-content: space-between; gap: var(--sp-3); }
.f-strecke .strecke-summe__zeile + .strecke-summe__zeile { margin-top: var(--sp-3); padding-top: var(--sp-3); border-top: 1px solid var(--c-border); }
.f-strecke .strecke-summe__kasse { min-width: 0; font-weight: var(--fw-semibold); }
/* Rechtsbuendig, und die Einheit gehoert UNTER den Betrag, nicht daneben:
   „186,43 € monatlich" in einer Zeile macht aus der Zahl einen Satz. */
.f-strecke .strecke-summe__wert { text-align: right; }
.f-strecke .strecke-summe__betrag { display: block; font-size: var(--fs-h1); font-weight: var(--fw-bold); color: var(--c-text); }
/* `--c-text-muted`, nicht `--c-text-soft`: Der weichere der beiden Grautoene
   ist auf der hellen Karte bei 13 px zu kontrastarm — das ist ein
   Lesbarkeitsproblem, nicht nur Optik. (Kein Hex-Wert im Kommentar: Der
   Design-Lint prueft die Datei zeilenweise und kann Beispiel nicht von
   Regel unterscheiden — zu Recht.) */
.f-strecke .strecke-summe__einheit { display: block; font-size: var(--fs-sm); color: var(--c-text-muted); }
.f-strecke .strecke-summe__label { color: var(--c-text-muted); }
/* Das einzige Gruen auf der Seite — deshalb traegt es die Aussage. */
.f-strecke .strecke-summe__wert--spart { font-size: var(--fs-h2); font-weight: var(--fw-bold); color: var(--c-spart); }
/* Auf der Ergebnisseite steht die Ersparnis ALLEIN in ihrer Karte — sie ist
   die Zahl, wegen der jemand die Strecke ueberhaupt geht, und bleibt deshalb
   die groesste. Auf der Schluss-Seite ist sie die zweite Angabe unter dem
   Beitrag und ordnet sich ihm unter; deshalb ein Modifikator und keine Regel,
   die aus der Verschachtelung raet. */
/* Der aufgeklappte Leistungstext steht in Spalte 2 — also UNTER seinen Kaesten,
   nicht unter dem Kategorietitel. Dasselbe 1.2fr/2fr-Raster wie `.kvk-zeile`;
   damit fluchtet er von selbst mit, eine eigene `max-width` laege beim naechsten
   Raster-Umbau daneben.

   ⚠ Diese Regel ist am 2026-09-15 versehentlich mit den toten
   `.kvk-wertspalte`-Regeln geloescht worden (PR 855) und am selben Tag
   wiederhergestellt: Der Text rutschte links unter den Titel. Sie sieht neben
   der Wert-Spalte aus wie zu ihr gehoerig — ist sie aber nicht. */
.f-strecke .kvk-leistung__text { grid-column: 2; margin: 0 0 var(--sp-3); padding: var(--sp-3) var(--sp-4); border: 1px solid var(--c-border); border-radius: var(--r-md); background: var(--c-surface); }
/* Mobil faellt `.kvk-zeile` auf EINE Spalte (Responsive-Sweep 12.08.) — dann
   gibt es keine zweite Spalte mehr, in die der Text koennte. */
@media (max-width: 640px) {
  .f-strecke .kvk-leistung { grid-template-columns: minmax(0, 1fr); }
  .f-strecke .kvk-leistung__text { grid-column: 1; }
}

/* ~~Gestapelte Geldkarte der Ergebnisseite (`--hero`)~~ ENTFALLEN 2026-09-15:
   Die Ersparnis steht dort jetzt in der Spar-Karte des Beitrags-Duells. Ihre
   Regeln hatten nur diesen einen Konsumenten und sind mit ihm gegangen —
   dasselbe Vorgehen wie bei den vier toten `.kvk-zeile--ersparnis`-Regeln am
   02.09. Die Schluss-Seite (`--eng`) ist unberuehrt; sie stellt zwei Zeilen
   gegenueber und braucht die gestapelte Form nicht.
   Ebenfalls entfallen: `--gross`, `--minus` und die Wert-Spalte
   `.kvk-wertspalte`, alle drei nur von der alten Karte benutzt. */
/* Teurer statt guenstiger: dieselbe Karte, aber KEIN rot eingefaerbter Betrag,
   der wie ein Rechenfehler aussieht (Owner) — der Wechsel kostet hier schlicht
   mehr, und das sagt schon das Label daneben. */
/* ── Vergleichsseite v2: Fazit, Nutzen, Ablauf, Haltegriff ────────────────
   (Owner 2026-09-15: „designtechnisch muss der Vergleich noch viel besser
   werden, hier muss die Verstaendlichkeit gegeben sein, auch damit die
   Conversion maximiert ist.")
   Spec + Entwurf: wissen/entwuerfe/funnel-vergleich-v2.html,
   design-system §Vergleichsseite der Kundenstrecke. */

/* Fazit — die Aussage der Seite in einem Satz, mit dem Weg dorthin daneben. */
.f-strecke .f-fazit { display: flex; flex-direction: column; gap: var(--sp-3); padding: var(--sp-5) var(--sp-6); border-radius: var(--k2-radius-karte); background: var(--k2-gruen-bg-leise); border: 1px solid var(--k2-gruen-bd-leise); }
.f-strecke .f-fazit__satz { margin: 0; font-size: var(--fs-h2); font-weight: var(--fw-semibold); color: var(--c-text); line-height: 1.35; }
.f-strecke .f-fazit__satz b { color: var(--k2-gruen); font-weight: var(--fw-bold); }
.f-strecke .f-fazit__aktion { display: flex; flex-wrap: wrap; align-items: center; gap: var(--sp-3); }
/* Die drei Zusagen: Haken statt Aufzaehlungspunkten — sie sagen „erledigt",
   nicht „Liste". */
.f-strecke .f-vertrauen { display: flex; flex-wrap: wrap; gap: var(--sp-3); margin: 0; padding: 0; list-style: none; font-size: var(--fs-sm); color: var(--c-text-muted); }
.f-strecke .f-vertrauen li { display: inline-flex; align-items: center; gap: 6px; }
.f-strecke .f-vertrauen li::before { content: "✓"; color: var(--k2-gruen); font-weight: var(--fw-bold); }

/* ~~Zwei Nutzen-Kacheln (`.f-nutzen`)~~ ENTFALLEN am selben Tag: Die
   Beitrags-Ersparnis sitzt auf Owner-Wunsch als dritte Karte IN der Duell-Zeile
   („rechts neben den monatsbeitrag, buendig rechts"), der zweite Nutzen als
   Zeile darunter (`.f-dazu`). Regeln ohne Konsument gehen mit — wie die
   `--hero`-Karte eine Stunde vorher.

   Die Trennung der beiden Nutzen-ARTEN bleibt: Die sichere Zahl steht als
   gruene Karte, die Obergrenze als Fliesstext mit „bis zu". Nur ihre Form ist
   nicht mehr dieselbe — das war ja der Punkt. */
/* Die Ersparnis-Karte in der vierten Spalte: Sie traegt den Betrag gross, aber
   nicht so gross wie die Beitraege daneben — 190 px Spaltenbreite tragen
   `--strecke-spar-num` nicht, und eine umbrechende Zahl sieht aus wie ein
   Fehler. Nachgemessen statt geraten. */
.f-strecke .f-spar-karte__wert { font-size: var(--fs-h2); }
/* Zweiter Nutzen als Zeile: bewusst KEINE Karte — er ist eine Obergrenze,
   keine Zusage, und darf nicht wie die Ersparnis aussehen. */
.f-strecke .f-dazu { margin: var(--sp-3) 0 0; font-size: var(--fs-sm); color: var(--c-text-muted); line-height: 1.45; }
.f-strecke .f-dazu b { color: var(--c-text); font-weight: var(--fw-semibold); }

/* Ablauf — drei Schritte gegen die Frage „muss ich selbst kuendigen?" */
.f-strecke .f-ablauf { display: grid; grid-template-columns: repeat(3, 1fr); gap: var(--sp-3); }
.f-strecke .f-ablauf__schritt { display: flex; flex-direction: column; gap: 4px; padding: var(--sp-4); border-radius: var(--k2-radius-box); background: var(--c-surface-muted); }
.f-strecke .f-ablauf__nr { display: inline-flex; align-items: center; justify-content: center; width: 24px; height: 24px; border-radius: 50%; background: var(--c-primary); color: var(--c-text-on-accent); font-size: var(--fs-sm); font-weight: var(--fw-bold); }
.f-strecke .f-ablauf__titel { font-weight: var(--fw-semibold); color: var(--c-text); }
.f-strecke .f-ablauf__text { font-size: var(--fs-sm); color: var(--c-text-muted); line-height: 1.4; }

/* Haltegriff — nur auf dem Handy, reines `sticky`, kein Skript.
   Die negativen Raender heben die Polsterung der Karte auf, damit die Leiste
   ueber die volle Breite klebt; `env(safe-area-inset-bottom)` haelt sie auf
   Geraeten mit Gestenleiste ueber dem Rand. */
.f-strecke .f-haltegriff { display: none; }

@media (max-width: 640px) {
  .f-strecke .f-nutzen, .f-strecke .f-ablauf { grid-template-columns: 1fr; }
  .f-strecke .f-fazit { padding: var(--sp-4); }
  .f-strecke .f-haltegriff { position: sticky; bottom: 0; z-index: 20; display: flex; align-items: center; justify-content: space-between; gap: var(--sp-3); margin: 0 calc(-1 * var(--card-pad)) calc(-1 * var(--card-pad)); padding: var(--sp-3) var(--sp-4) calc(var(--sp-3) + env(safe-area-inset-bottom, 0px)); background: var(--c-surface); border-top: 1px solid var(--c-border); }
  .f-strecke .f-haltegriff__zahl { font-size: var(--fs-sm); color: var(--c-text-muted); line-height: 1.25; }
  .f-strecke .f-haltegriff__zahl b { display: block; font-size: 1rem; color: var(--k2-gruen); }
}

/* ── Beitrags-Duell `.f-beitrag-duell` (Owner 2026-09-15, Track F) ─────────
   Die Vergleichsseite zeigt Beitrag + Ersparnis im Duell-Bauteil des Konzepts
   (`.k2-dk`) statt in den grauen Kaesten der Leistungszeilen. Kein neues
   Bauteil — nur die Masse, die das Konsolen-Bauteil fuer die Strecke mitbringt,
   werden hier zurechtgerueckt. Spec: design-system §Beitrags-Duell der
   Kundenstrecke; Entwurf: wissen/entwuerfe/funnel-beitragsblock.html.

   Was zurechtgerueckt wird und warum:
   · Polsterung `0 30px 22px` — die kommt aus dem Konzept, wo das Duell direkt
     auf der Seite sitzt. Hier steht es in einer Karte, die ihre Polsterung
     schon hat; ohne die Null-Setzung stuende es eingerueckt neben allem anderen.
   · Die feste vierte Spalte (190px) des Grundrasters bleibt fuer die
     Spar-Karte ungenutzt — sie laeuft ueber `--breit` durch alle Spalten. */
/* `minmax(0, 1fr)` statt `1fr`: Die Beitragskarten tragen Logo und einen
   1,875-rem-Betrag, ihre Mindestbreite lag bei 237 px — mit blossem `1fr`
   schiebt der Inhalt die Spalten auf und die dritte Karte ragte 7 px ueber die
   rechte Kante hinaus (im Browser gemessen). `minmax(0, …)` erlaubt das
   Schrumpfen, damit die Zeile buendig mit den Leistungszeilen darunter endet. */
.f-strecke .f-beitrag-duell { padding: 0; gap: var(--sp-3); grid-template-columns: minmax(0, 1fr) 28px minmax(0, 1fr) 230px; }
/* Ohne dritte Karte (kein Vergleichswert) faellt die vierte Spalte weg. */
.f-strecke .f-beitrag-duell--zwei { grid-template-columns: minmax(0, 1fr) 28px minmax(0, 1fr); }
.f-strecke .f-beitrag-duell + .f-beitrag-duell { margin-top: var(--sp-3); }
/* Ersparnis-Karte: mittig, weil sie eine AUSSAGE ist und keine Gegenueber-
   stellung — die beiden Beitragskarten darueber sind linksbuendig, weil sie
   paarweise gelesen werden. Die Zahl traegt dieselbe Groesse wie zuvor die
   Geldkarte (`--strecke-spar-num`), damit der Umbau die Zahl nicht kleiner
   macht als der Owner sie am 02.09. gesetzt hat. */
/* `position: relative` ausdruecklich hier: Die Beitrags-Blase haengt an dieser
   Karte. `.k2-dk__karte` bringt es zwar mit — eine geerbte Eigenschaft, auf die
   sich ein fremdes Bauteil still verlaesst, faellt beim naechsten Umbau des
   Konzepts ohne Vorwarnung weg. */
.f-strecke .f-spar-karte { position: relative; align-items: center; text-align: center; }
/* Owner 2026-09-15 (abends): „dass der Monatsbeitrag so groß und linksbündig
   ist gefällt mir noch nicht." Die beiden Beitrags-Karten stehen damit wie die
   Spar-Karte — mittig — und die Zahl kommt von 1.875rem auf
   `--strecke-beitrag-num`. Damit trägt die Zeile EINE Ausrichtung statt zweier,
   und der Beitrag tritt hinter die Ersparnis zurück, die die Aussage der Seite
   ist. Die frühere Begründung („linksbündig, weil paarweise gelesen") ist damit
   widerrufen: Paarweise gelesen werden die Karten auch mittig — sie stehen
   ohnehin nebeneinander, und der Pfeil dazwischen führt das Auge.
   NUR im Funnel-Geltungsbereich: `.k2-dk` ist das Duell-Bauteil des Konzepts
   und bleibt dort unverändert. */
.f-strecke .f-beitrag-duell .k2-dk__karte--alt,
.f-strecke .f-beitrag-duell .k2-dk__karte--neu { align-items: center; text-align: center; }
.f-strecke .f-beitrag-duell .k2-dk__karte--alt .k2-dk__wert,
.f-strecke .f-beitrag-duell .k2-dk__karte--neu .k2-dk__wert { font-size: var(--strecke-beitrag-num); }
/* `.k2-dk__sub` traegt im Konzept die ROTE Unterzeile der teuren Kasse
   (`--k2-rot-sub`) — auf der gruenen Spar-Karte sah die Monatszeile dadurch
   blass-rotstichig aus (Sichtprobe). Sie folgt hier der Karte. */
.f-strecke .f-spar-karte__sub { color: currentColor; opacity: .8; }

@media (max-width: 640px) {
  /* Auf dem Handy stapeln statt schrumpfen: zwei Karten nebeneinander lassen
     von den Betraegen nichts uebrig. Der Pfeil zeigt dann nach unten — er
     traegt die Aussage „von hier nach dort" und waere quer sinnlos. */
  .f-strecke .f-beitrag-duell { grid-template-columns: 1fr; }
  .f-strecke .f-beitrag-duell .k2-dk__pfeil { transform: rotate(90deg); }
}

/* ── Beitrags-Blase `.f-erk` (Owner 2026-09-15, Track F) ───────────────────
   Das Fragezeichen an der Geldkarte: angetippt zeigt es, wie sich die
   Jahreszahl aus den beiden Monatsbeitraegen ergibt. Spec: design-system
   §Beitrags-Blase der Kundenstrecke.

   Warum `details` und nicht der Konsolen-Ausloeser `.k2-hover`: Der oeffnet auf
   `:hover`/`:focus-within`, und sein Ausloeser ist ein `span` — auf dem Handy
   bekommt der weder Hover noch Fokus, die Herleitung waere dort unerreichbar.
   Die halbe Strecke laeuft auf dem Handy, also entscheidet das Handy die Form.

   Die BLASE selbst bleibt das Bestands-Tooltip `.k2-tip` (keine zweite
   Panel-Konvention, design-system §Hover-Panel) — hier wird nur umgeschaltet,
   wer sie zeigt, und ihre Breite auf schmalen Geraeten gebaendigt. */
/* `text-align: center`, weil die Beschriftung jetzt umbrechen KANN: Das
   Fragezeichen nimmt der Zeile rund 28 px, und „Der Wechsel waere fuer dich
   teurer" passt auf dem Handy nicht mehr in eine Zeile (Sichtprobe 390 px).
   Einzeilig war die Zentrierung der Karte unsichtbar am Werk — zweizeilig muss
   sie ausgesprochen werden, sonst steht die zweite Zeile links und die Karte
   sieht schief aus. */
.f-strecke .f-erk-zeile { display: inline-flex; align-items: center; gap: var(--sp-2); text-align: center; }
.f-strecke .f-erk { display: inline-flex; }
/* Die Blase haengt an der ZEILE, nicht am Fragezeichen: Am Icon aufgehaengt und
   mittig gesetzt lief sie auf dem Handy 47 px ueber den rechten Rand (gemessen
   390 px, Blase bis 437) — das Icon steht rechts neben der Beschriftung, nicht
   in der Mitte der Karte. Ueber die Kartenbreite gespannt und nach innen
   begrenzt passt sie in beiden Breiten. */
.f-strecke .f-erk__knopf { display: inline-flex; align-items: center; justify-content: center; width: 20px; height: 20px; border: 1px solid var(--c-border); border-radius: 50%; background: var(--c-surface); color: var(--c-text-muted); font-size: var(--fs-sm); font-weight: var(--fw-bold); line-height: 1; cursor: pointer; list-style: none; }
.f-strecke .f-erk__knopf::-webkit-details-marker { display: none; }
.f-strecke .f-erk__knopf:hover, .f-strecke .f-erk[open] .f-erk__knopf { border-color: var(--c-primary); color: var(--c-primary); }
.f-strecke .f-erk__knopf:focus-visible { box-shadow: 0 0 0 3px var(--c-focus-ring); }
/* `.k2-tip` bringt `display: flex` mit und wird in der Konsole per `.k2-hover`
   versteckt — hier uebernimmt das der Aufklapp-Zustand. */
.f-strecke .f-erk__tafel { display: none; }
.f-strecke .f-erk[open] .f-erk__tafel { display: flex; }
/* Nach UNTEN, nicht nach oben: Die Richtung dreht im Konzept app.js nach dem
   freien Platz (PR 688) — ohne JS kann die Strecke nicht messen. Unter der Karte
   ist immer Platz (es folgt der Leistungsteil), darueber stehen die beiden
   Beitragskacheln, die die Blase sonst verdeckt.
   Ueber die Zeile gespannt statt `right: 0`: An der rechten Kante ausgerichtet
   haengt die Blase schief unter der zentrierten Zahl; nach innen begrenzt fuellt
   sie auf dem Handy die Karte und bleibt auf dem Desktop ein Panel. */
.f-strecke .f-erk__tafel { top: calc(100% + 8px); bottom: auto; left: 0; right: 0; width: auto; max-width: 320px; margin-inline: auto; text-align: left; }

/* Der Abschnittstitel steht hier dicht ueber seinem Hinweis, nicht mit dem
   grossen Abstand der Ergebnisseite: darueber liegt schon die Karte. */
.f-strecke .kvk-abschnitt--eng { margin-bottom: 0; }
/* FAQ-Liste der Vergleichsseite (Owner 2026-09-15 abends). KEIN neues Bauteil:
   Klappzeile `.vk-vorteil` (Bestand, wie in der Kassen-Vorteile-Karte) +
   Antworttext `.kvk-leistung__texte` (Bestand, wie in den Leistungszeilen
   dieser Seite). Einzige Ergänzung ist der Pfeil am rechten Rand — in der
   Kassen-Vorteile-Karte schiebt ihn die Label-Spalte dorthin, die es hier
   nicht gibt. */
.f-strecke .f-faq .vk-vorteil__pfeil { margin-left: auto; }

/* Einwilligungs-Karten: Lesebreite statt voller Zeile. Ein Rechtstext, der ueber
   1000 px laeuft, wirkt auseinandergezogen und liest sich schlechter — die
   Zeilenlaenge ist hier Teil der informierten Einwilligung. */
.f-strecke .af-erk { max-width: var(--strecke-erk-max); margin-inline: auto; }
/* Wortmarke ueber der Karte — dieselbe Datei und Groesse wie auf den
   Rechtsseiten. Bewusst schlicht und ohne Balken: Die Strecke ist eine
   Formularseite, kein Portal; ein voller Header wuerde Platz nehmen, den auf
   dem Handy der Inhalt braucht. */
.f-marke { margin-bottom: var(--sp-4); }
/* Stufen-Anzeige der Antragsstrecke: EIN Balken je Seite, gefuellt bis zur
   aktuellen. Bewusst Segmente statt eines Fortschrittsbalkens mit Prozentwert —
   die Strecke hat gezaehlte Seiten, keine kontinuierliche Fuellung, und
   Segmente kommen ohne Inline-Breite aus (Design-Lint). */
.f-stufen { display: flex; gap: var(--sp-1); margin-top: var(--sp-2); }
.f-stufen__stufe { flex: 1; height: var(--strecke-stufe-h); border-radius: var(--r-full); background: var(--c-border); }
.f-stufen__stufe.is-erreicht { background: var(--c-primary); }
.f-marke__bild { height: var(--strecke-marke-h); display: block; }
/* Lesebreite fuer Seiten mit wenigen Feldern (Schritt 1). Die Ergebnisseite
   bleibt breit — sie stellt zwei Spalten nebeneinander. Gesetzt wird die Klasse
   am Inhaltsblock, damit Marke, Karte und Fussleiste zusammen ruecken. */
.f-inhalt.f-schmal { max-width: var(--antrag-max); margin-left: auto; margin-right: auto; }
/* Zweispaltige Seiten brauchen eine EIGENE Breite (Owner 2026-09-02): Das
   Antragsformular lief ungebremst auf 1120 px, die Felder wurden dadurch 503 px
   breit — doppelt so breit wie dieselben Felder auf Schritt 1.
   `.f-schmal` ist auf DREI Spalten kalibriert und deshalb hier falsch.

   Nachgerechnet mit den gemessenen Werten, nicht geschaetzt:

     Raster = Karte − 2×24 (--card-pad) − 2×1 (Rahmen) − 2×24 (.af-zone) = Karte − 98
     Feld   = (Raster − Gap) / Spalten,  Gap = 16 px (--sp-4)

   Schritt 1 (860 px, drei Spalten) ergibt damit 243 px je Feld. Rueckwaerts
   fuer ZWEI Spalten bei gleicher Feldbreite:

     Karte = 2 × 243 + 16 + 98 = 600 px

   ⚠ Nicht mit den 40 px des CONTAINER-Polsters rechnen — das liegt ausserhalb
   der Karte.

   **Der Token steht trotzdem auf 720 px, nicht auf 600** (Owner 02.09., nach
   der Sichtprobe: „etwas eng, bitte um 20 % breiter"). Die 600 sind die
   Herleitung, nicht das Ziel: Sie beantworten „welche Breite ergibt DIESELBE
   Feldbreite wie Schritt 1" — 720 gibt dem Formular bewusst mehr Luft
   (Felder ~303 px statt 243). Die Rechnung bleibt hier stehen, weil sie den
   Bezugspunkt liefert, sobald jemand die Zahl wieder anfasst. */
.f-inhalt.f-schmal-2col { max-width: var(--antrag-max-2col); margin-left: auto; margin-right: auto; }
/* Luft ueber den Spaltenkoepfen: In der Konsole stehen sie ganz oben im
   Modal, in der Strecke direkt unter der Ersparnis-Zeile — ohne Abstand
   klebt die grosse Zahl auf den Logos. */
.f-strecke .kvk-logos { margin-top: var(--sp-4); }
/* Kategorie-Icons der Kundenstrecke etwas groesser als die Schrift.
   Die harte 1em-Regel (§kv-Zeilen-Icon) stammt von den Bilanz-Zeilen der
   Konsole, wo das Icon eine Zeile MARKIERT. Hier traegt es die Kategorie
   fuer einen Laien, der die Seite einmal sieht — bei 14px sind die
   Motive nicht mehr erkennbar. Gilt nur in der Strecke; die .kv-Zeilen
   des Backoffice bleiben unberuehrt. */
.f-strecke .kvk-zeile__titel { display: inline-flex; align-items: center; gap: var(--sp-3); }
/* Der Ausklapp-Pfeil der Strecke ist ein SVG, kein Glyph: eine echte Flaeche
   statt eines Zeichens, das seine Zeilenbox nur zum Teil fuellt. Die
   Bestands-Regeln fuers Drehen bei [open] greifen ueber die Klasse weiter;
   `font-size`/`line-height` der Glyph-Fassung laufen bei einem SVG ins Leere,
   Groesse steht deshalb hier. */
.f-strecke .vk-vorteil__pfeil { width: var(--strecke-pfeil); height: var(--strecke-pfeil); flex: none; }
/* Aufklappbare Zeilen sehen jetzt aus wie aufklappbar (Konvention Klapp-Pfeile, Trello 186): Der
   Titel traegt `.klapp-link`, das Icon-Chip bleibt neutral — es ist kein Text
   und soll nicht mitfaerben. */
.f-strecke .kvk-zeile__titel.klapp-link { font-weight: var(--fw-semibold); }
.f-strecke .kvk-zeile__titel .kv__icon {
  box-sizing: content-box; flex: none; margin: 0;
  height: var(--strecke-ikon-bild); width: var(--strecke-ikon-bild);
  padding: calc((var(--strecke-ikon-flaeche) - var(--strecke-ikon-bild)) / 2);
  border-radius: var(--r-sm); background: var(--strecke-ikon-bg);
}
.f-strecke .af-fussnote,
.f-strecke .af-hinweis,
.f-strecke .af-kopf__meta { color: var(--c-text-muted); }
.kvk-alle:checked ~ .kvk-rest, .kvk-alle:checked ~ * .kvk-rest { display: block; }
/* Vollbreiter Umschalt-Knopf statt frei schwebend in der Mitte (Owner 2026-08-03):
   spannt die Inhaltsbreite und trennt zugleich die beiden Abschnitte sichtbar. */
.kvk-alle__block { display: flex; flex-direction: column; align-items: stretch; gap: var(--sp-1); margin: var(--sp-5) 0; }
/* --kompakt: Der Ausklapp-Knopf ist ein Nebenweg, kein Hauptknopf — er
   schrumpft auf seinen Text statt ueber die ganze Spalte zu laufen. NICHT
   in der Basisklasse: derselbe Block steht in _kassen_duell_kunde.html und
   _tarif_duell.html der Konsole, deren Optik hier niemand beauftragt hat. */
.kvk-alle__block--kompakt { align-items: flex-start; }
.kvk-alle__block > label { cursor: pointer; display: inline-flex; align-items: center; justify-content: center; gap: var(--sp-2); }
.kvk-alle__hinweis { font-size: var(--fs-caption); color: var(--c-text-muted); }
.kvk-alle__weniger { display: none; }
.kvk-alle:checked ~ * .kvk-alle__weniger { display: inline; }
.kvk-alle:checked ~ * .kvk-alle__mehr { display: none; }
.kvk-alle:checked ~ * .kvk-alle__block .vk-vorteil__pfeil, .kvk-alle:checked ~ .kvk-alle__block .vk-vorteil__pfeil { transform: rotate(180deg); }
@media print { .kvk-details { break-inside: auto; } .kvk-kategorie { break-inside: avoid; } }

/* ── Tarif-Duell Bestand → Empfehlung (kvd-*, Handoff Zahn-Modal §2) ──────────
   Schwester der kvk-Familie: Optik folgt dem Bestand-Picker (bestand-treffer-
   Karten), Grün-Mechanik dem Kassen-Duell. Grün NUR am Empfehlungs-Boxpaar bei
   belegtem Vorteil; die Bestand-Seite bleibt neutral (--kk-muted), nie rot. */
/* (.modal__box--duell steht bei den anderen Modal-Varianten NACH der Basis —
   gleiche Spezifität, Reihenfolge entscheidet.) */
.kvd { display: flex; flex-direction: column; gap: var(--sp-4); padding: 0 var(--sp-6); }
.kvd .kg-modal__kopf { margin: 0 calc(-1 * var(--sp-6)) 0; padding: var(--sp-4) var(--sp-6); border-bottom: 1px solid var(--c-border-soft); position: sticky; top: 0; background: var(--c-surface); z-index: 2; }
.kvd-koepfe { display: grid; grid-template-columns: minmax(0, 1fr) var(--kvd-pfeil-w) minmax(0, 1fr); gap: var(--sp-3); align-items: stretch; }
.kvd-koepfe__karte { display: flex; flex-direction: column; gap: var(--sp-2); padding: var(--sp-3); border: 1px solid var(--c-border); border-radius: var(--r-md); background: var(--c-surface); }
.kvd-koepfe__karte--empf { border: 2px solid var(--c-primary); background: var(--kk-violet-50); }
.kvd-koepfe__pfeil { align-self: center; text-align: center; color: var(--c-text-soft); font-size: 18px; }
/* Vergleichspartner-Reihe: feste Kartenbreite, scrollt horizontal (nie zentrieren
   in overflow-x — sonst sind linke Karten unerreichbar) */
.kvd-wahl { display: flex; gap: var(--sp-3); overflow-x: auto; justify-content: flex-start; padding-bottom: var(--sp-1); }
.kvd-wahl__karte { flex: none; width: 300px; display: flex; flex-direction: column; align-items: flex-start; gap: 3px; padding: var(--sp-3); border: 1px solid var(--c-border); border-radius: var(--r-md); background: var(--c-surface); cursor: pointer; text-align: left; }
.kvd-wahl__karte:hover { border-color: var(--c-accent-2); }
.kvd-wahl__karte.is-aktiv { border: 2px solid var(--c-primary); background: var(--kk-violet-50); }
.kvd-wahl__rolle { font-size: 10.5px; font-weight: var(--fw-semibold); color: var(--c-text-muted); text-transform: uppercase; letter-spacing: .04em; }
.kvd-wahl__name { font-size: 13.5px; font-weight: var(--fw-semibold); }
.kvd-wahl__preis { font-size: 13px; font-variant-numeric: tabular-nums; }
.kvd-wahl__delta { color: var(--c-text-muted); }
.kvd-wahl__badge { font-size: 10.5px; font-weight: var(--fw-bold); padding: 2px 8px; border-radius: var(--r-full); background: var(--kk-violet-100); color: var(--c-primary); }
.kvd-wahl__chip { font-size: 10.5px; font-weight: var(--fw-bold); padding: 2px 8px; border-radius: var(--r-full); background: var(--c-spart-bg); color: var(--c-spart); }
/* Hero: 4 ehrliche Zustände über data-fall */
.kvd-hero { display: flex; align-items: baseline; gap: var(--sp-3); flex-wrap: wrap; padding: var(--sp-4) var(--sp-5); border-radius: var(--r-md); }
.kvd-hero[data-fall="spart"], .kvd-hero[data-fall="besser"] { background: var(--c-spart-bg); }
.kvd-hero[data-fall="spart"] .kvd-hero__zahl, .kvd-hero[data-fall="besser"] .kvd-hero__zahl { color: var(--c-spart); }
.kvd-hero[data-fall="mehrwert"] { background: var(--kk-violet-50); }
.kvd-hero[data-fall="mehrwert"] .kvd-hero__zahl { color: var(--c-primary); }
.kvd-hero[data-fall="gleich"] { background: var(--kk-muted); }
.kvd-hero__zahl { font-size: 30px; font-weight: var(--fw-bold); font-variant-numeric: tabular-nums; }
.kvd-hero__titel { font-size: 15px; font-weight: var(--fw-semibold); }
.kvd-hero__sub { width: 100%; font-size: var(--fs-caption); color: var(--c-text-muted); }
/* Duell-Zeilen: Label | Bestand | Pfeil | Empfehlung */
.kvd-zeilen { display: flex; flex-direction: column; gap: var(--sp-1); }
.kvd-zeile { display: grid; grid-template-columns: var(--kvd-label-w) minmax(0, 1fr) var(--kvd-pfeil-w) minmax(0, 1fr); gap: var(--sp-2); align-items: stretch; break-inside: avoid; }
.kvd-zeile--kopf .kvd-zeile__spaltenkopf { font-size: var(--fs-caption); font-weight: var(--fw-semibold); color: var(--c-text-muted); text-transform: uppercase; letter-spacing: .04em; }
.kvd-zeile__label { align-self: center; font-size: var(--fs-caption); color: var(--c-text-muted); }
.kvd-zeile__pfeil { align-self: center; text-align: center; color: var(--c-text-soft); }
.kvd-zeile__box { display: flex; flex-direction: column; justify-content: center; gap: 1px; padding: 8px 12px; border: 1px solid var(--c-border); border-radius: var(--r-sm); background: var(--kk-muted); font-size: 13.5px; font-weight: var(--fw-semibold); font-variant-numeric: tabular-nums; }
.kvd-zeile__box--besser { background: var(--c-spart-bg); border-color: var(--kk-green-bd); }
.kvd-zeile__box.is-leer { color: var(--c-text-soft); font-weight: var(--fw-regular); }
.kvd-zeile__delta { font-size: var(--fs-caption); font-weight: var(--fw-regular); color: var(--c-spart); }
.kvd-zeile__marke { font-size: var(--fs-caption); font-weight: var(--fw-regular); color: var(--c-text-muted); }
/* Alle-Details-Umschalter + Fußzeile */
.kvd-details > summary { list-style: none; cursor: pointer; }
.kvd-details > summary::-webkit-details-marker { display: none; }
.kvd-details__knopf { display: inline-flex; padding: 8px 14px; border: 1px solid var(--c-border); border-radius: var(--r-full); font-size: 13px; font-weight: var(--fw-semibold); color: var(--c-primary); }
.kvd-details[open] .kvd-details__knopf { background: var(--kk-violet-50); }
.kvd-details .bestand-raster__kat { margin-top: var(--sp-3); }
.kvd-details .kvd-zeile { margin-top: var(--sp-1); }
.kvd-fuss { display: flex; align-items: center; justify-content: space-between; gap: var(--sp-3); flex-wrap: wrap; border-top: 1px solid var(--c-border-soft); padding-top: var(--sp-3); }
.kvd-fuss__hinweis { margin: 0; font-size: var(--fs-caption); color: var(--c-text-muted); }
.kvd-fuss__aktionen { display: flex; gap: var(--sp-2); }
@media (max-width: 1120px) { .kvd-koepfe { grid-template-columns: 1fr; } .kvd-koepfe__pfeil { transform: rotate(90deg); } .kvd-zeile { grid-template-columns: 1fr; } .kvd-zeile__pfeil { display: none; } .kvd-zeile--kopf { display: none; } }
@media print { .kvd-wahl, .kvd-fuss__aktionen { display: none; } .kvd-details > summary { display: none; } .kvd { padding: 0; } }

/* Präsentationen: Kachel-Übersicht (Quick-Access) + Vollbild-Viewer (kein Download). */
.pv-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: var(--sp-4); }
/* Karte 158: Abschnitts-Titel ueber den Kachel-Gruppen (Team oben, eigene
   darunter) — Zaehler-Badge inline neben dem Titel. */
.pv-gruppe { display: flex; align-items: center; gap: var(--sp-2); font-size: var(--fs-h3); margin: 0 0 var(--sp-3); }
.pv-tile { display: flex; flex-direction: column; gap: var(--sp-2); text-decoration: none; }
.pv-tile:hover { border-color: var(--c-primary); }
.pv-tile__typ { font-size: var(--fs-h1); line-height: 1; }
.pv-tile__titel { font-weight: var(--fw-semibold); }
.pv-tile__meta { display: flex; flex-wrap: wrap; gap: var(--sp-2); margin-top: auto; }
/* Konzept-Varianten-Umschalter (Topbar-Mitte Konsole/Konzept).
   Karte 154 (Owner 21.08.): die 4 Varianten sind EINE klar abgegrenzte
   Gruppe (Segment-Hülle) — vorher schwammen die Chips frei zwischen Titel
   und Aktions-Buttons („viel zu überladen"). Inaktive Segmente flach,
   nur die aktive Variante trägt die Primary-Füllung. */
.konzept-umschalter { display: flex; align-items: center; gap: 2px; flex-wrap: wrap; background: var(--c-surface-muted); border: 1px solid var(--c-border-soft); border-radius: var(--r-full); padding: 3px; }
.konzept-umschalter .btn { border-color: transparent; background: transparent; color: var(--c-text-muted); border-radius: var(--r-full); }
.konzept-umschalter .btn:hover { background: var(--c-surface); }
.konzept-umschalter .konzept-umschalter__aktiv { background: var(--btn-primary-bg); color: var(--btn-primary-fg); }
.konzept-umschalter__aktiv { cursor: default; }

/* Präsentationen-Dropdown (Topbar Konsole/Konzept) + Overlay-Dialog */
.pv-menu { position: relative; }
.pv-menu__knopf { cursor: pointer; list-style: none; display: inline-flex; align-items: center; gap: var(--sp-2); }
.pv-menu__knopf::-webkit-details-marker { display: none; }
.pv-menu[open] > .pv-menu__knopf .vk-vorteil__pfeil { transform: rotate(180deg); }
.pv-menu__liste { position: absolute; right: 0; top: calc(100% + 6px); z-index: 30; min-width: 300px; display: flex; flex-direction: column; padding: var(--sp-2); background: var(--card-bg); border: 1px solid var(--card-bd); border-radius: var(--r-md); box-shadow: var(--card-shadow); }
.pv-menu__item { display: flex; align-items: baseline; gap: var(--sp-2); padding: var(--sp-2) var(--sp-3); border-radius: var(--r-sm); color: var(--c-text); text-decoration: none; font-size: var(--fs-sm); }
.pv-menu__item:hover { background: var(--c-surface-muted); }
/* Sende-Formular im Dropdown (Karte 134): E-Mail-Feld und Senden-Button gleich
   hoch (beide --field-h) und mittig in EINER Zeile — der Button brach vorher
   zweizeilig um und war kleiner als die E-Mail-Box (baseline-Ausrichtung). */
.pv-menu__item--form { align-items: center; flex-wrap: nowrap; }
.pv-menu__item--form:hover { background: transparent; }
.pv-menu__item--form .input { flex: 1 1 auto; min-width: 0; }
.pv-menu__item--form .btn { height: var(--field-h); white-space: nowrap; flex: 0 0 auto; }
/* Vollbild UNTERHALB der Topbar (Owner 2026-07-22: „Fullscreen, aber die Leiste
   bleibt stehen") — nicht-modaler Dialog (show statt showModal): die Topbar
   bleibt sichtbar UND bedienbar (z.B. nächste Präsentation, Abschluss). app.js
   setzt `top` auf die gemessene Topbar-Unterkante. */
.pv-modal { position: fixed; left: 0; right: 0; bottom: 0; top: 0; width: 100%; height: auto; max-width: none; max-height: none; margin: 0; padding: 0; border: 0; border-top: 1px solid var(--c-border); background: var(--c-surface); display: flex; flex-direction: column; z-index: 40; }
.pv-modal:not([open]) { display: none; }
.pv-modal__kopf { flex: none; display: flex; align-items: center; justify-content: space-between; gap: var(--sp-3); padding: var(--sp-3) var(--sp-4); border-bottom: 1px solid var(--c-border); }
.pv-modal__titel { font-weight: var(--fw-semibold); }
.pv-modal__frame { flex: 1; width: 100%; border: 0; }

.pv-viewer { display: flex; flex-direction: column; height: 100vh; }
.pv-viewer__kopf { flex: none; }
.pv-viewer__frame { flex: 1; width: 100%; border: 0; }
.pv-viewer__buehne { flex: 1; overflow: auto; display: flex; align-items: flex-start; justify-content: center; padding: var(--sp-6); background: var(--c-surface-muted); }
.pv-viewer__bild { max-width: 100%; height: auto; border-radius: var(--r-lg); box-shadow: var(--card-shadow); }

@media print { .vk-karte { break-inside: avoid; } .vk-bilanzkarte { break-inside: avoid; } .vk-kassekarte { break-inside: avoid; } .vk-edit { display: none; } .kv-duell__kat { break-inside: avoid; } }

.concept { max-width: var(--concept-max); margin: 0 auto; }
.concept > * + * { margin-top: var(--sp-6); }
.concept .card + .card { margin-top: var(--sp-4); }   /* Schutz-Bausteine nicht aneinanderkleben */

/* „Deine Situation heute" — was fehlt und aus eigener Tasche geht */
.luecke { display: flex; align-items: flex-start; gap: var(--sp-3); padding: var(--sp-3) 0; border-bottom: 1px solid var(--c-border-soft); }
.luecke:last-child { border-bottom: 0; }
.luecke__mark { flex: none; width: 18px; font-weight: var(--fw-bold); color: var(--luecke-mark-fg); line-height: 1.5; }
.luecke.is-abgesichert .luecke__mark { color: var(--luecke-ok-fg); }
.luecke__text { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
.luecke__name { font-weight: var(--fw-semibold); }
.luecke__sub { font-size: var(--fs-sm); color: var(--c-text-soft); }
.luecke__loesung { font-size: var(--fs-sm); font-weight: var(--fw-semibold); color: var(--luecke-loesung-fg); margin-top: 2px; }
.luecke__wert { flex: none; display: flex; flex-direction: column; align-items: flex-end; gap: 2px; text-align: right; }
.luecke__betrag { font-weight: var(--fw-bold); color: var(--luecke-betrag-fg); font-variant-numeric: tabular-nums; white-space: nowrap; }
.luecke__wert-sub { font-size: var(--fs-caption); color: var(--c-text-soft); }
.luecke.is-abgesichert .luecke__wert-sub { color: var(--luecke-ok-fg); }

/* Modal: Bestätigungs-Dialog im eigenen Design (statt des nativen confirm()).
   Basis ist das <dialog>-Element — bringt Fokus-Falle, Esc und Backdrop von Haus aus mit. */
.modal { border: 0; padding: 0; background: transparent; max-width: 92vw; }
.modal::backdrop { background: var(--modal-backdrop); }
.modal__box { width: var(--modal-box-w); max-width: 100%; margin: 0; display: flex; flex-direction: column; gap: var(--sp-3); padding: var(--sp-6); background: var(--c-surface); border: 1px solid var(--c-border-soft); border-radius: var(--r-lg); box-shadow: var(--sh-lg); }
/* Breite Variante (Kassen-Vergleich v6) — muss NACH .modal__box stehen. */
.modal__box--breit { width: var(--modal-box-w-breit); max-height: 86vh; overflow-y: auto; }
.modal__titel { font-size: var(--fs-h2); font-weight: var(--fw-bold); }
.modal__text { color: var(--c-text-muted); }
.modal__actions { display: flex; justify-content: flex-end; gap: var(--sp-3); margin-top: var(--sp-2); }
.modal[open] { animation: modal-in var(--dur-fast) var(--ease-out); }
@media (prefers-reduced-motion: reduce) { .modal[open] { animation: none; } }
@keyframes modal-in { from { opacity: 0; transform: translateY(6px); } to { opacity: 1; transform: none; } }

/* Ladebalken: dünne Fortschrittsleiste am oberen Rand während einer AJAX-Neuberechnung.
   Zeigt dem Berater sofort, dass sein Klick angekommen ist — der Server braucht ~0,5 s,
   ohne Feedback klickt man sonst nochmal. `is-active` schaltet JS beim Fetch. */
.ladebalken { position: fixed; top: 0; left: 0; right: 0; height: var(--ladebalken-h); z-index: 2000; overflow: hidden; opacity: 0; transition: opacity var(--t-fast); pointer-events: none; }
.ladebalken.is-active { opacity: 1; }
.ladebalken__inner { position: absolute; top: 0; height: 100%; width: 40%; border-radius: var(--r-full); background: var(--ladebalken-fg); animation: ladebalken-sweep var(--ladebalken-dur) var(--ease-out) infinite; }
@keyframes ladebalken-sweep { 0% { left: -40%; } 100% { left: 100%; } }
/* Während eine Anfrage läuft: Progress-Cursor überall — auch über Buttons (höhere Spezifität). */
html.is-pending, html.is-pending * { cursor: progress; }
@media (prefers-reduced-motion: reduce) { .ladebalken__inner { animation-duration: 1.8s; } }
@media print { .ladebalken { display: none; } }

/* Konzept-Tabs: teilen die Präsentation in heute → Konzept → Bilanz.
   Ohne JS bleiben alle Panels sichtbar (die Leiste blendet sich dann aus) — die Seite
   ist dann lang, aber vollständig. Erst `html.js` schaltet auf echte Tabs um. */
.tabs { display: none; }
.js .tabs { display: inline-flex; gap: 4px; padding: 4px; margin-bottom: var(--sp-5); background: var(--tabs-bg); border-radius: var(--r-full); }
/* Varianten-Wechsel-Formulare in der Tab-Leiste (Konzept): Buttons fluchten wie Tabs */
.tabs form { display: contents; }
.tabs__btn { display: inline-flex; align-items: center; gap: var(--sp-2); padding: var(--sp-2) var(--sp-4); border: 0; border-radius: var(--r-full); background: transparent; color: var(--tabs-btn-fg); font: inherit; font-size: var(--fs-sm); font-weight: var(--fw-semibold); cursor: pointer; transition: background var(--t-fast), color var(--t-fast); }
.tabs__btn:hover { color: var(--tabs-btn-active-fg); }
.tabs__btn.is-active { background: var(--tabs-btn-active-bg); color: var(--tabs-btn-active-fg); box-shadow: var(--sh-sm); }
.tabs__btn:focus-visible { outline: 2px solid var(--c-focus); outline-offset: 2px; }
/* Panel-Überschrift trägt nur den Druck — auf dem Schirm sagt das der aktive Tab. */
.tab-panel__titel { display: none; }
@media print {
  .tabs { display: none; }
  /* Das PDF muss vollständig sein: alle drei Ansichten drucken, mit Überschrift. */
  .tab-panel[hidden] { display: block !important; }
  .tab-panel { break-before: page; }
  .tab-panel:first-of-type { break-before: auto; }
  .tab-panel__titel { display: block; margin-bottom: var(--sp-4); font-size: var(--fs-h1); }
}


/* Kachel-Edit: Stift auf der Kachel klappt das Baustein-Formular GENAU dieser Kachel auf.
   <details> — funktioniert ohne JS; ersetzt den früheren globalen Bearbeiten-Modus. */
.vk-edit { margin-top: var(--sp-2); border-top: 1px dashed var(--c-border-soft); padding-top: var(--sp-2); }
.vk-edit__stift { display: inline-flex; align-items: center; gap: 6px; list-style: none; cursor: pointer; font-size: var(--fs-caption); font-weight: var(--fw-semibold); color: var(--c-text-soft); border-radius: var(--r-sm); padding: 2px 6px; transition: color var(--t-fast), background var(--t-fast); }
.vk-edit__stift::-webkit-details-marker { display: none; }
.vk-edit__stift:hover { color: var(--c-primary); background: var(--kk-violet-50); }
.vk-edit__stift:focus-visible { outline: 2px solid var(--c-focus); outline-offset: 2px; }
.vk-edit__stift svg { width: 13px; height: 13px; flex: none; }
.vk-edit[open] .vk-edit__stift { color: var(--c-primary); }
.vk-edit__panel { margin-top: var(--sp-3); }
/* Das eingebettete Baustein-Formular kommt aus der Konsole — in der schmalen Kachel
   ohne eigene Karten-Optik (die Kachel IST die Karte). */
.vk-edit__panel .baustein { border: 0; box-shadow: none; padding: 0; background: transparent; }
.vk-edit__hinweis { margin: 0 0 var(--sp-2); font-size: var(--fs-caption); color: var(--c-text-soft); }
.eyebrow { font-size: var(--fs-caption); text-transform: uppercase; letter-spacing: .04em; color: var(--c-text-muted); font-weight: var(--fw-semibold); margin: 0 0 var(--sp-2); }
.kv { display: flex; align-items: baseline; justify-content: space-between; gap: var(--sp-4); padding: var(--sp-2) 0; border-bottom: 1px solid var(--c-border-soft); }
.kv:last-child { border-bottom: 0; }
.kv__label { color: var(--c-text-muted); }
.kv__value { font-variant-numeric: tabular-nums; font-weight: var(--fw-semibold); white-space: nowrap; }
/* Karte 147: kleines Icon/Logo in einer kv-Zeile (Bilanz-Posten) — Owner-Regel
   HART: nie höher als die Schrift (1em-Cap via Token); Breite atmet für
   liegende Kassen-Logos, Ausrichtung an der Textlinie. */
.kv__icon { height: var(--kv-icon-h); width: auto; max-width: var(--kv-icon-max-b); object-fit: contain; vertical-align: -0.125em; margin-right: var(--sp-2); }

/* Konzept-Kopf: KassenKompass-Marke als Briefkopf */
.concept-head { display: flex; align-items: center; gap: var(--sp-4); }
.concept-head h1 { margin: 0; }
.concept-brand { height: 30px; width: auto; display: block; }

/* Kasse inline: Logo + Name (einheitlich in Konzept, Backoffice, Konsole) */
.kasse-inline { display: inline-flex; align-items: center; gap: var(--sp-2); }
.kasse-inline > span { font-weight: var(--fw-semibold); }

/* Empfehlungs-Kopf: Sparten-Icon + Tarifname */
.empfehlung-head { display: flex; align-items: center; gap: var(--sp-2); margin: 0 0 var(--sp-2); }

/* Sparten-Tags: Icon-Chips (ambulant, zahn, …) */
.sparten-tags { display: flex; flex-wrap: wrap; gap: var(--sp-2); }
.sparte-tag { display: inline-flex; align-items: center; gap: var(--sp-2); padding: 6px 12px 6px 8px; border: 1px solid var(--c-border); border-radius: var(--r-full); background: var(--c-surface); font-size: var(--fs-sm); font-weight: var(--fw-medium); transition: border-color var(--t-fast), box-shadow var(--t-fast); }
.sparte-tag:hover { border-color: var(--c-accent-2); box-shadow: var(--sh-sm); }
.sparte-tag__icon { width: 22px; height: 22px; object-fit: contain; flex: none; }

/* Empfehlungs-Box: dünne Lila-Umrandung wie die aktive Baustein-Karte in der Konsole */
.card--empfehlung { border-color: var(--konzept-empfehlung-bd); }

/* Ergebnis-Hero: große, farblich hervorgehobene Kernzahl (Ersparnis grün / Mehrbeitrag lila) */
.konzept-hero { border-radius: var(--card-radius); padding: var(--sp-6) var(--sp-4); text-align: center; background: var(--konzept-hero-mehr-bg); box-shadow: var(--konzept-hero-shadow); }
.konzept-hero.is-spart { background: var(--konzept-hero-spart-bg); }
.konzept-hero__num { font-size: var(--konzept-hero-num); font-weight: var(--fw-bold); color: var(--c-primary); font-variant-numeric: tabular-nums; line-height: 1.05; }
.konzept-hero.is-spart .konzept-hero__num { color: var(--c-spart); }
.konzept-hero__label { font-size: var(--fs-h3); font-weight: var(--fw-semibold); color: var(--c-primary); margin-top: var(--sp-1); }
.konzept-hero.is-spart .konzept-hero__label { color: var(--c-spart); }
.konzept-hero__sub { font-size: var(--fs-sm); color: var(--c-text-muted); margin-top: var(--sp-2); font-variant-numeric: tabular-nums; }

/* ---- Backoffice-Shell (Sidebar + Inhalt) ---- */
.admin { display: grid; grid-template-columns: var(--sidebar-w) minmax(0, 1fr); min-height: 100vh; }
.sidebar { background: var(--sidebar-bg); color: var(--sidebar-fg); padding: var(--sp-5) var(--sp-4); border-right: 1px solid var(--kk-shell-bd); }
.sidebar__brand { font-weight: var(--fw-bold); font-size: var(--fs-h3); color: var(--c-primary); margin-bottom: var(--sp-1); }
.sidebar__logo { height: 24px; width: auto; display: block; }
.sidebar__tag { display: block; font-size: var(--fs-caption); font-weight: var(--fw-medium); color: var(--sidebar-fg-muted); margin-bottom: var(--sp-6); }
.nav { display: flex; flex-direction: column; gap: var(--sp-1); }
.nav__item { color: var(--sidebar-fg-muted); padding: var(--sp-2) var(--sp-3); border-radius: var(--r-sm); font-weight: var(--fw-medium); }
.nav__item:hover { color: var(--sidebar-fg); background: var(--nav-hover-bg); text-decoration: none; }
.nav__item.is-active { color: var(--nav-active-fg); background: var(--nav-active-bg); font-weight: var(--fw-semibold); }
/* Gruppen-Überschrift in der Sidebar (z.B. „Aktueller Fall", „Verwaltung"). */
.nav__gruppe { margin: var(--sp-3) var(--sp-3) 2px; font-size: var(--fs-caption); font-weight: var(--fw-semibold); letter-spacing: .04em; text-transform: uppercase; color: var(--c-text-soft); }
.admin-main { padding: var(--sp-8) var(--sp-10); background: var(--c-bg); min-width: 0; }

/* ── Accordion-Navigation (Design-Handoff „handoff-navigation", 2026-07-30) ───────
   Eine stabile Leiste für ALLE Bereiche: alles sichtbar, Hierarchie als Dropdown,
   aktiver Pfad markiert (Icon-Chip + Text + Führungslinie), Zuklapp-Punkt bei
   eingeklappter Gruppe mit aktiver Seite. Auf-/Zu in app.js (localStorage).
   Spec: wissen/design-system.md §Navigation. */
.nav2 { display: flex; flex-direction: column; gap: 2px; flex: 1; min-height: 0; overflow-y: auto; }
.nav2-group { display: flex; flex-direction: column; }

/* Ebene-1-Zeile (Gruppen-Header ODER Top-Blatt). */
.nav2-item { display: flex; align-items: center; gap: 9px; width: 100%; padding: 8px 10px; border: 0; border-radius: var(--r-sm); background: transparent; color: var(--nav2-fg); font: inherit; font-size: 13.5px; font-weight: var(--fw-medium); cursor: pointer; text-align: left; }
.nav2-item:hover { background: var(--nav-hover-bg); text-decoration: none; }
.nav2-icon { width: 20px; height: 20px; flex: none; display: inline-flex; align-items: center; justify-content: center; border-radius: 6px; background: var(--nav2-chip-bg); color: var(--nav2-icon); }
.nav2-icon svg { width: 14px; height: 14px; display: block; }
.nav2-label { flex: 1; min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.nav2-caret { flex: none; font-size: 10px; color: var(--c-text-soft); transform: rotate(-90deg); transition: transform var(--t-fast); }
.nav2-group.is-open > .nav2-item .nav2-caret,
.nav2-group.is-open > .nav2-child--group .nav2-caret { transform: rotate(0deg); }

/* Aktiver Pfad (Gruppe enthält aktive Seite) + aktives Top-Blatt. */
.nav2-group.in-path > .nav2-item { color: var(--nav2-active-fg); font-weight: var(--fw-bold); }
.nav2-group.in-path > .nav2-item .nav2-icon,
.nav2-item.is-active .nav2-icon { background: var(--nav2-chip-bg-active); color: var(--nav2-icon-active); }
.nav2-item.is-active { background: var(--nav2-active-bg); color: var(--nav2-active-fg); font-weight: var(--fw-bold); }

/* Zuklapp-Punkt: nur wenn Gruppe zu ist UND die aktive Seite enthält (reines CSS). */
.nav2-dot { display: none; flex: none; width: 6px; height: 6px; border-radius: var(--r-full); background: var(--nav2-dot); }
.nav2-group[data-has-active]:not(.is-open) > .nav2-item .nav2-dot,
.nav2-group[data-has-active]:not(.is-open) > .nav2-child--group .nav2-dot { display: block; }

/* Kinder-Container — eingeklappt weg (Accordion). */
.nav2-sub { display: flex; flex-direction: column; gap: 1px; margin: 2px 0 4px; padding-left: 19px; }
.nav2-group:not(.is-open) > .nav2-sub { display: none; }
.nav2-group--sub > .nav2-sub { padding-left: 14px; margin: 1px 0 2px; }

.nav2-trenner { padding: 8px 10px 3px; font-size: 10px; font-weight: var(--fw-bold); letter-spacing: .07em; text-transform: uppercase; color: var(--nav2-trenner); }

/* Kind-Zeile (Blatt oder Untergruppen-Header) — 2px-Führungslinie zeigt den Pfad. */
.nav2-child { display: flex; align-items: center; gap: 8px; width: 100%; padding: 6px 10px; border: 0; border-left: 2px solid var(--nav2-line-none); border-radius: 8px; background: transparent; color: var(--nav2-child-fg); font: inherit; font-size: 13px; font-weight: var(--fw-medium); cursor: pointer; text-align: left; }
.nav2-child:hover { background: var(--nav-hover-bg); text-decoration: none; }
.nav2-child--group { color: var(--c-text); font-weight: var(--fw-bold); }
.nav2-child[data-line="active"] { border-left-color: var(--nav2-line-active); }
.nav2-child[data-line="path"] { border-left-color: var(--nav2-line-path); }
.nav2-child.is-active { background: var(--nav2-active-bg); color: var(--nav2-active-fg); font-weight: var(--fw-bold); }

.nav2-avatar { flex: none; width: 20px; height: 20px; border-radius: var(--r-full); background: var(--kk-violet-100); color: var(--c-primary); display: inline-flex; align-items: center; justify-content: center; font-size: 9.5px; font-weight: var(--fw-bold); }
.nav2-badge { flex: none; font-size: 10px; font-weight: var(--fw-bold); color: var(--c-text-soft); white-space: nowrap; }

/* Breadcrumb im Content-Header (Pfad zum aktiven Knoten). */
.breadcrumb { display: flex; align-items: center; gap: var(--sp-2); padding: 14px var(--sp-8); background: var(--topbar-bg); border-bottom: 1px solid var(--kk-shell-bd); font-size: 13px; color: var(--c-text-soft); flex-wrap: wrap; }
.breadcrumb__sep { color: var(--kk-shell-bd); }
.breadcrumb__glied--last { color: var(--c-text); font-weight: var(--fw-bold); }
/* Karte 221: klickbare Glieder — Link-Affordance über Hover, Farbe erbt die Leiste. */
a.breadcrumb__glied { color: inherit; text-decoration: none; }
a.breadcrumb__glied:hover { color: var(--c-text); text-decoration: underline; }

/* App-Shell: gleiche feste Sidebar wie das Backoffice, für die Berater-Seiten (Beratungen,
   Fall-Seite, Konsole). Kunden-Konzept nutzt sie bewusst nicht. */
.app-shell { display: grid; grid-template-columns: var(--sidebar-w) minmax(0, 1fr); min-height: 100vh; }
.app-main { min-width: 0; background: var(--c-bg); }

.stack > * + * { margin-top: var(--sp-6); }   /* gleichmäßiger Vertikal-Rhythmus */

/* Tabellen-Hülle: breite Tabellen scrollen in sich, nie der Body */
.table-wrap { overflow-x: auto; }

/* Backoffice + App-Shell mobil: Sidebar oben, Nav horizontal, Inhalt einspaltig */
@media (max-width: 767px) {
  .admin, .app-shell { grid-template-columns: 1fr; }
  .sidebar { border-right: 0; border-bottom: 1px solid var(--c-border); }
  .sidebar__tag { margin-bottom: var(--sp-3); }
  .nav { flex-direction: row; flex-wrap: wrap; gap: var(--sp-1) var(--sp-2); }
  .nav__gruppe { width: 100%; margin: var(--sp-2) var(--sp-1) 0; }
  .admin-main { padding: var(--sp-5) var(--sp-4); }
}

/* Seitenkopf */
.page-head { display: flex; align-items: center; justify-content: space-between; gap: var(--sp-4); margin-bottom: var(--sp-6); }
.page-head h1 { margin: 0; }

/* Stat-Karten */
.stats { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: var(--sp-4); }
.stat { background: var(--c-surface-raised); border: 1px solid var(--c-border-soft); border-radius: var(--card-radius); padding: var(--sp-5); }
.stat__num { font-size: var(--fs-h1); font-weight: var(--fw-bold); color: var(--c-primary); font-variant-numeric: tabular-nums; }
.stat__label { color: var(--c-text-muted); font-size: var(--fs-sm); }

/* Formular-Raster + Flash */
.form-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: var(--sp-4); }
/* Endkunden-Raster (Track-F-Ticket 01.09., Owner-Entwurf Antragsstrecke):
   hoechstens ZWEI Felder nebeneinander, auf Handy-Breite eins — Modifier wie
   actions--stapeln-mobil, Backoffice-Formulare bleiben unberuehrt. minmax(0,…)
   verhindert Zellen-Ueberlauf langer Werte. Breakpoint 640px = Bestand. */
.form-grid--zweispaltig { grid-template-columns: repeat(2, minmax(0, 1fr)); }
@media (max-width: 640px) {
  .form-grid--zweispaltig { grid-template-columns: minmax(0, 1fr); }
}
/* Vollbreites Feld INNERHALB des Rasters (Staatsangehoerigkeit, Adresszeile) —
   generisches Raster-Element; die Trello-245-Regel ist k2-bd-gebunden und
   deshalb hier nicht wiederverwendbar. */
.form-grid__voll { grid-column: 1 / -1; }
.actions { display: flex; gap: var(--sp-3); align-items: center; margin-top: var(--sp-5); }
/* In der Kundenstrecke steht mehr Luft zwischen dem letzten Feld und der
   Knopfzeile (Owner 02.09.): 20 px reichen im Backoffice, wo dicht gearbeitet
   wird — hier klebte „Weiter" am Formular, und der Abschluss-Knopf ist die
   folgenreichste Schaltflaeche der ganzen Strecke. Nur `.f-strecke`, die
   Konsole bleibt unberuehrt. */
.f-strecke .actions { margin-top: var(--sp-8); }
/* Track-F-Ticket 27.08. (Funnel 390px): Endkunden-Flächen stapeln die Aktions-
   Knöpfe auf Handy-Breite — Modifier, damit Backoffice-Formulare unberührt
   bleiben. Breakpoint 640px = Bestands-Konvention (ks-gkv-hero, kr-spar). */
@media (max-width: 640px) {
  .actions--stapeln-mobil { flex-direction: column; align-items: stretch; }
  .actions--stapeln-mobil .btn { width: 100%; }
}
.flash { padding: var(--sp-3) var(--sp-4); border-radius: var(--r-sm); margin-bottom: var(--sp-5); background: var(--c-success-bg); color: var(--c-success); }
/* Globaler Flash-Stapel (base.html): eine Instanz für ALLE Seiten — schwebt oben
   zentriert über jedem Layout (auch Konsole/Konzept/Admin mit eigenem Chrome). */
.flash-stapel { position: fixed; top: var(--sp-4); left: 50%; transform: translateX(-50%); z-index: 1000; display: flex; flex-direction: column; gap: var(--sp-2); max-width: min(90vw, 560px); }
.flash-stapel .flash { margin: 0; box-shadow: var(--sh-lg); }
/* Owner 02.09.: Auto-Ausblenden nach 5 s (app.js setzt --weg) — weich statt hart weg. */
.flash-stapel { transition: opacity var(--t-slow), transform var(--t-slow); }
.flash-stapel--weg { opacity: 0; transform: translate(-50%, -8px); pointer-events: none; }

/* Datei-Upload (Dropzone) */
.dropzone { display: flex; flex-direction: column; align-items: center; gap: var(--sp-2); padding: var(--sp-8); border: 2px dashed var(--c-border); border-radius: var(--card-radius); background: var(--c-surface); color: var(--c-text-muted); text-align: center; }

/* Inline-Reihe (Buttons/Badges nebeneinander) */
.row { display: flex; flex-wrap: wrap; gap: var(--sp-3); align-items: center; }
.row__name { flex: 0 0 13rem; font-weight: var(--fw-medium); }   /* Label-Spalte in einer Inline-Reihe */

/* Farb-Kachel (Styleguide) — zeigt einen Token; Farbe kommt aus dem Modifier */
.swatch-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); gap: var(--sp-3); }
.swatch { border: 1px solid var(--c-border-soft); border-radius: var(--r-md); overflow: hidden; }
.swatch__chip { height: 56px; }
.swatch__label { padding: var(--sp-2); font-size: var(--fs-caption); color: var(--c-text-muted); }
.swatch--primary .swatch__chip { background: var(--c-primary); }
.swatch--primary-hover .swatch__chip { background: var(--c-primary-hover); }
.swatch--accent .swatch__chip { background: var(--c-accent); }
.swatch--accent-2 .swatch__chip { background: var(--c-accent-2); }
.swatch--bg .swatch__chip { background: var(--c-bg); }
.swatch--surface .swatch__chip { background: var(--c-surface); }
.swatch--muted .swatch__chip { background: var(--c-surface-muted); }
.swatch--ink .swatch__chip { background: var(--c-text); }
.swatch--border .swatch__chip { background: var(--c-border); }
.swatch--success .swatch__chip { background: var(--c-success); }
.swatch--warning .swatch__chip { background: var(--c-warning); }
.swatch--error .swatch__chip { background: var(--c-error); }
.swatch--info .swatch__chip { background: var(--c-info); }

/* Startseite: Hero + Einstiegs-Kacheln */
.home-hero { text-align: center; max-width: 640px; margin: 0 auto; padding: var(--sp-10) 0 var(--sp-2); }
.home-hero .actions { justify-content: center; }
.tiles { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: var(--sp-4); }
a.card { color: inherit; }
a.card:hover { box-shadow: var(--sh-lg); border-color: var(--c-accent); text-decoration: none; }

/* ============================================================================
   Berater-Konsole (Design-Handoff 2026-07-14) — privat-banner, konsole-layout,
   monogramm, gkv-block, baustein-Karte, chip-radio, combo, bilanz(+bar).
   ========================================================================== */

/* „nicht teilen"-Kennung */
.privat-banner { display: flex; align-items: center; justify-content: center; gap: var(--sp-3); padding: var(--sp-2) var(--sp-6); background: var(--banner-bg); border-bottom: 1px dashed var(--banner-bd); }
.privat-banner__chip { display: inline-flex; align-items: center; padding: 2px 9px; border-radius: var(--r-full); background: var(--c-primary); color: var(--c-text-on-accent); font-size: 10.5px; font-weight: var(--fw-bold); letter-spacing: .08em; }
.privat-banner__text { font-size: 12.5px; font-weight: var(--fw-semibold); color: var(--banner-fg); }

/* Konsolen-Chrome */
.app-topbar { display: flex; align-items: center; justify-content: space-between; gap: var(--sp-4); padding: 14px var(--sp-8); background: var(--topbar-bg); border-bottom: 1px solid var(--kk-shell-bd); }
.app-topbar__group { display: flex; align-items: center; gap: 14px; min-width: 0; }
.app-topbar__logo { height: 22px; display: block; }
.app-topbar__sep { width: 1px; height: 20px; background: var(--c-border); }
.app-topbar__titel { font-size: 14px; font-weight: var(--fw-semibold); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
/* Einklappbare Berater-Leiste (Owner 2026-09-03, Konzept-Praesentation):
   die Leiste liegt ZU, ein mittiger Griff holt sie per Hover/Fokus zurueck —
   so beginnt das Konzept ganz oben. Reines CSS, kein JS; --offen (Kunden-Modus)
   haelt sie dauerhaft offen. Markup: _konzept_topbar.html. */
/* Owner 2026-09-04: Die Leiste sprang beim leisesten Streifen SOFORT auf.
   Ursache war die Mechanik selbst: ~~display none/flex~~ ist ein harter
   Schalter, den keine transition weich machen kann. Jetzt fährt die Hülle als
   Grid auf — `grid-template-rows: 0fr → 1fr` animiert die Höhe MIT dem Platz,
   den die Leiste im Layout einnimmt (ohne feste Pixel-Höhe raten zu müssen).
   Zeile 1 = Leiste, Zeile 2 = Griff (der bleibt immer sichtbar, deshalb auto).

   Die drei Zeiten stehen als Tokens in tokens.css:
   · beim ÖFFNEN eine kurze Absichts-Schwelle — wer nur vorbeifährt, löst
     nichts aus (das war die eigentliche Beschwerde);
   · beim ZUklappen die Halte-Zeit (3 s), damit ein kurzes Abrutschen der Maus
     die Leiste nicht sofort wegzieht.
   Die Verzögerung sitzt jeweils in dem Zustand, in den hinein animiert wird:
   die Basis-Regel gilt beim Schließen, die :hover-Regel beim Öffnen. */
.topbar-huelle {
  position: relative;
  display: grid;
  grid-template-rows: 0fr auto;
  transition: grid-template-rows var(--topbar-klapp-dauer) var(--ease-out);
  transition-delay: var(--topbar-klapp-halten);
}
/* Fix 04.09. (Verursacher PR 681): Das Zusammenfahren sitzt auf einem NEUTRALEN
   Schacht, nicht auf der Leiste selbst. Grund: `.app-topbar` trägt Innenabstand
   und einen 1-px-Rahmen, und bei global `box-sizing: border-box` kann eine
   Höhe von 0 die nicht unterschreiten — eingeklappt blieben gemessene 21 px
   als beiger Streifen stehen. Der Schacht hat bewusst KEINEN eigenen Kasten,
   also fährt er wirklich auf 0. Die Leiste behält darin ihre Abstände je
   Bildschirmbreite (14/12/10/8 px) — die wären sonst vierfach zu wiederholen. */
.topbar-huelle__schacht {
  /* min-height: 0 + overflow: hidden — ohne beides ignoriert das Grid-Kind die
     0fr-Zeile und die Leiste bliebe in voller Höhe stehen. */
  min-height: 0;
  overflow: hidden;
  opacity: 0;
  transition: opacity var(--topbar-klapp-dauer) var(--ease-out);
  transition-delay: var(--topbar-klapp-halten);
}
.topbar-huelle:hover,
.topbar-huelle:focus-within,
.topbar-huelle--offen {
  grid-template-rows: 1fr auto;
  transition-delay: var(--topbar-klapp-oeffnen);
}
.topbar-huelle:hover > .topbar-huelle__schacht,
.topbar-huelle:focus-within > .topbar-huelle__schacht,
.topbar-huelle--offen > .topbar-huelle__schacht {
  opacity: 1;
  transition-delay: var(--topbar-klapp-oeffnen);
}
/* Kunden-Modus: dauerhaft offen, ohne jede Verzögerung — dort gibt es nichts
   zum Ein- und Ausklappen. */
.topbar-huelle--offen { transition: none; }
.topbar-huelle--offen > .topbar-huelle__schacht { transition: none; }
@media (prefers-reduced-motion: reduce) {
  /* Keine Bewegung — die HALTE-Zeit bleibt aber: sie ist Bedienkomfort,
     keine Animation. */
  .topbar-huelle, .topbar-huelle__schacht { transition-duration: 0s; }
}
.topbar-huelle__griff { display: flex; align-items: center; justify-content: center; width: 76px; height: 16px; margin: 0 auto; padding: 0; background: var(--topbar-bg); color: var(--c-text-soft); border: 1px solid var(--kk-shell-bd); border-top: 0; border-radius: 0 0 var(--r-full) var(--r-full); font-size: 11px; line-height: 1; cursor: pointer; }
.topbar-huelle__griff:hover { color: var(--c-text); }
.topbar-huelle__pfeil { display: block; transition: transform var(--topbar-klapp-dauer) var(--ease-out); transition-delay: var(--topbar-klapp-halten); }
.topbar-huelle:hover .topbar-huelle__pfeil,
.topbar-huelle:focus-within .topbar-huelle__pfeil { transform: rotate(180deg); transition-delay: var(--topbar-klapp-oeffnen); }
.topbar-huelle--offen .topbar-huelle__griff { display: none; }
/* Topbar-Benutzer (Karte 133): angemeldeter Benutzer — runder Initialen-Avatar
   + Name/Rolle (Rollen-Wahrheit rollen.py). Rendert nur eingeloggt. */
.tb-benutzer { display: flex; align-items: center; gap: var(--sp-2); min-width: 0; }
.tb-benutzer__avatar { display: inline-flex; align-items: center; justify-content: center; width: var(--tb-avatar-groesse); height: var(--tb-avatar-groesse); border-radius: 50%; background: var(--tb-avatar-bg); border: 1px solid var(--tb-avatar-bd); color: var(--tb-avatar-fg); font-size: 12px; font-weight: 800; letter-spacing: .02em; flex: none; }
.tb-benutzer__text { display: flex; flex-direction: column; min-width: 0; line-height: 1.2; }
.tb-benutzer__name { font-size: 12.5px; font-weight: var(--fw-semibold); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.tb-benutzer__rolle { font-size: 10px; font-weight: 800; letter-spacing: .07em; text-transform: uppercase; color: var(--c-text-soft); }
.konsole-wrap { display: grid; grid-template-columns: minmax(0, 1fr) 352px; gap: var(--sp-6); padding: 28px var(--sp-8) var(--sp-10); align-items: start; max-width: var(--content-max); margin: 0 auto; }
/* Mehr Luft zwischen den Personen + Akzentkante, damit man die Blöcke sofort trennt. */
/* ── Konsole-Stepper (kst-*, Design handoff-konsole, 2026-07-29) ───────────────
   Drei Spalten: frei anspringbare Schritt-Navigation | EINE Schritt-Karte |
   Bilanz (bestehende .bilanz-spalte). Kein Zwangs-Wizard (Ole-Leitplanke).
   Spec: wissen/design-system.md §Konsole-Stepper. */
.konsole-wrap--stepper { grid-template-columns: var(--kst-nav-w) minmax(0, 1fr) var(--kst-bilanz-w); max-width: var(--kst-max); padding-left: clamp(var(--sp-5), 2.5vw, var(--sp-10)); padding-right: clamp(var(--sp-5), 2.5vw, var(--sp-10)); }
/* Mittlere Breiten (MacBook 13–15″ mit App-Sidebar): Navigation und Bilanz
   geben Platz an die Schritt-Karte ab. */
@media (max-width: 1499px) {
  .konsole-wrap--stepper { --kst-nav-w: 204px; --kst-bilanz-w: 312px; }
  .konsole-wrap--stepper .kst-karte { padding: var(--sp-5) var(--sp-6); }
}
/* Ab ~1500px wachsen Navigation und Bilanz mit — die Schritt-Karte bekommt den Rest. */
@media (min-width: 1500px) {
  .konsole-wrap--stepper { --kst-nav-w: 268px; --kst-bilanz-w: 400px; gap: var(--sp-8); }
  .konsole-wrap--stepper .kst-karte { padding: var(--sp-8) var(--sp-10); }
  .konsole-wrap--stepper .kst-stats { grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); }
}

.kst-nav { position: sticky; top: var(--sp-6); display: flex; flex-direction: column; gap: var(--sp-4); min-width: 0; }
.kst-nav__personen { display: flex; gap: var(--sp-1); flex-wrap: wrap; }
.kst-person { display: inline-flex; align-items: center; justify-content: center; flex: 1; padding: var(--sp-2) var(--sp-3); border-radius: var(--r-sm); background: var(--c-surface); border: 1px solid var(--c-border); color: var(--c-text-muted); font-size: var(--fs-caption); font-weight: var(--fw-bold); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.kst-person--haupt { background: var(--kk-violet-100); border-color: var(--kk-violet-100); color: var(--c-primary); }
.kst-person--add { flex: none; border-style: dashed; color: var(--c-primary); text-decoration: none; }
.kst-nav__schritte { display: flex; flex-direction: column; gap: var(--sp-1); }
.kst-schritt { display: flex; align-items: center; gap: var(--sp-2); padding: var(--sp-2) var(--sp-3); border-radius: var(--r-sm); color: var(--c-text); text-decoration: none; }
.kst-schritt:hover { background: var(--c-surface-muted); text-decoration: none; }
.kst-schritt.is-aktiv { background: var(--kk-violet-100); color: var(--c-primary); font-weight: var(--fw-bold); }
.kst-schritt__punkt { display: inline-flex; align-items: center; justify-content: center; width: var(--kst-punkt); height: var(--kst-punkt); flex: none; border-radius: var(--r-full); background: var(--c-surface-muted); color: var(--c-text-muted); font-size: var(--fs-caption); font-weight: var(--fw-bold); }
.kst-schritt.is-aktiv .kst-schritt__punkt { background: var(--c-primary); color: var(--c-text-on-accent); }
.kst-schritt__punkt[data-zustand="beantwortet"] { background: var(--kst-punkt-fertig); color: var(--c-text-on-accent); }
/* Stepper-Icon (Owner 2026-08-13): Themen-Icon zwischen Zustands-Punkt und
   Label — dieselbe Bildsprache/Dateien wie .baustein__icon (img/icons/).
   Der Punkt trägt weiter den ZUSTAND (✓/Nummer), das Icon nur das Thema. */
.kst-schritt__icon { width: 18px; height: 18px; flex: none; object-fit: contain; }
.kst-schritt__label { flex: 1; min-width: 0; font-size: var(--fs-sm); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.kst-schritt__status { flex: none; font-size: var(--fs-caption); font-weight: var(--fw-bold); color: var(--c-text-soft); }
.kst-nav__hinweis { margin: 0; padding: 0 var(--sp-3); font-size: var(--fs-caption); color: var(--c-text-soft); text-wrap: pretty; }

/* Karte-122-Folge · Stepper-Submenü (Owner-Präzisierung 19.08.): „Ambulant" bleibt
   als sichtbare GRUPPE über den zwei Unterschritten Vorsorge/Heilpraktiker —
   reine Überschrift (kein Link, kein dritter Top-Level-Weg), die
   Unterschritte rücken ein. Konvention: design-system §Stepper-Submenü. */
.kst-gruppe__label { margin: var(--sp-1) 0 0; padding: 0 var(--sp-3); font-size: var(--fs-caption); font-weight: var(--fw-bold); text-transform: uppercase; letter-spacing: .04em; color: var(--c-text-soft); }
.kst-schritt--sub { margin-left: var(--sp-4); }

.kst-haupt { min-width: 0; }
.kst-karte { border-radius: var(--kst-karte-radius); padding: var(--sp-6) var(--sp-8); }
.kst-karte__titel { margin: 0 0 var(--sp-5); font-size: var(--fs-h1); font-weight: var(--fw-bold); color: var(--c-primary); letter-spacing: -.01em; }
.kst-person-label { margin: var(--sp-5) 0 var(--sp-2); font-size: var(--fs-caption); font-weight: var(--fw-bold); letter-spacing: .05em; text-transform: uppercase; color: var(--c-text-soft); }
.kst-personen-block + .kst-personen-block { margin-top: var(--sp-6); padding-top: var(--sp-5); border-top: 1px solid var(--c-border-soft); }

.kst-stats { display: grid; grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)); gap: var(--sp-3); }
.kst-stat { padding: var(--sp-3) var(--sp-4); border-radius: var(--r-sm); background: var(--kst-stat-bg); }
.kst-stat__label { margin: 0; font-size: var(--fs-caption); font-weight: var(--fw-bold); text-transform: uppercase; letter-spacing: .04em; color: var(--c-text-soft); }
.kst-stat__wert { margin: 2px 0 0; font-size: var(--fs-body); font-weight: var(--fw-bold); }
.kst-warnung { display: flex; align-items: center; gap: var(--sp-2); margin: var(--sp-3) 0 0; padding: var(--sp-2) var(--sp-3); border-radius: var(--r-sm); background: var(--kk-error-leise); border: 1px solid var(--kk-error-bd); font-size: var(--fs-sm); font-weight: var(--fw-semibold); color: var(--kk-error); }

.kst-fazit { display: grid; gap: var(--sp-2); }
.kst-fazit__zeile { display: flex; align-items: baseline; gap: var(--sp-3); padding: var(--sp-3) var(--sp-4); border-radius: var(--r-sm); background: var(--kst-stat-bg); min-width: 0; }
.kst-fazit__label { flex: none; min-width: 110px; font-size: var(--fs-sm); font-weight: var(--fw-bold); }
.kst-fazit__wert { flex: 1; min-width: 0; font-size: var(--fs-sm); color: var(--c-text-muted); text-wrap: pretty; }
.kst-fazit__betrag { flex: none; font-size: var(--fs-sm); font-weight: var(--fw-bold); white-space: nowrap; font-variant-numeric: tabular-nums; }
.kst-fazit__betrag--spart { color: var(--kk-green); }
.kst-fazit__betrag--offen { color: var(--c-primary); }
.kst-fazit__zeile--ergebnis { background: var(--kk-violet-50); border: 1px solid var(--kk-violet-bd); }
.kst-cta { margin-top: var(--sp-5); }

.kst-fuss { display: flex; align-items: center; justify-content: space-between; gap: var(--sp-3); margin-top: var(--sp-6); padding-top: var(--sp-4); border-top: 1px solid var(--c-border-soft); }

/* Unter ~1400px (13″-MacBook + App-Sidebar) reicht der Platz nicht für drei
   Spalten — einspaltig, Schritte horizontal; die fixe Bilanz-Bar unten hält
   das Live-Feedback sichtbar. */
@media (max-width: 1399px) {
  .konsole-wrap--stepper { grid-template-columns: minmax(0, 1fr); }
  .kst-nav { position: static; }
  .kst-nav__schritte { flex-direction: row; flex-wrap: wrap; }
  .kst-schritt__status { display: none; }
  /* Horizontale Schritt-Reihe: Gruppen-Label und Einzug ergeben ohne
     Untereinander-Stapel keinen Sinn — Submenü nur in der vertikalen Nav. */
  .kst-gruppe__label { display: none; }
  .kst-schritt--sub { margin-left: 0; }
}

.konsole-personen { display: flex; flex-direction: column; gap: var(--sp-8); min-width: 0; }
.konsole-personen > .card { border-top: 3px solid var(--person-accent-bd); }

/* Monogramm — Logo-Fallback ohne Bild */
.monogramm { display: inline-flex; align-items: center; justify-content: center; width: 24px; height: 24px; border-radius: 7px; background: var(--kk-violet-100); color: var(--c-primary); font-size: 10px; font-weight: var(--fw-bold); flex: none; }
.monogramm--person { width: 36px; height: 36px; border-radius: var(--r-full); font-size: 14px; }
.logo-slot { display: inline-flex; align-items: center; justify-content: center; width: 40px; flex: none; }
.logo-slot img, .logo-img { max-height: 18px; max-width: 40px; object-fit: contain; display: block; }
.logo-img--md { max-height: 20px; max-width: 72px; }
/* Kassen-Logo im Konzept-Kopf (Owner 2026-07-29: „etwas größer, ersetzt den Namen") */
.logo-img--lg { max-height: 28px; max-width: 110px; }

/* Personen-Kopf */
.person-head { display: flex; align-items: center; justify-content: space-between; gap: var(--sp-3); margin-bottom: var(--sp-4); padding-bottom: var(--sp-3); border-bottom: 1px solid var(--c-border-soft); flex-wrap: wrap; }
.person-head__id { display: flex; align-items: center; gap: var(--sp-3); min-width: 0; }
.person-head__name { font-size: 17px; font-weight: var(--fw-bold); }
.person-head__bilanz { font-size: 13px; color: var(--c-text-soft); font-variant-numeric: tabular-nums; }
.person-head__rechts { display: flex; align-items: center; gap: var(--sp-3); }
.icon-btn { display: inline-flex; align-items: center; justify-content: center; width: 28px; height: 28px; border: 1px solid var(--c-border); border-radius: var(--r-full); background: var(--c-surface); color: var(--c-text-soft); cursor: pointer; font-size: 13px; line-height: 1; transition: border-color var(--t-fast), color var(--t-fast), background var(--t-fast); }
.icon-btn:hover { border-color: var(--c-border); color: var(--c-text); }
.icon-btn--danger:hover { border-color: var(--c-error); color: var(--c-error); background: var(--c-error-bg); }

/* Basisträger-GKV-Block */
.gkv-block { background: var(--gkv-block-bg); border: 1px solid var(--gkv-block-bd); border-radius: var(--r-md); padding: var(--sp-4) 18px; margin-bottom: 14px; }
.gkv-block .eyebrow { color: var(--c-accent); letter-spacing: .06em; }
.gkv-block__zeile { display: flex; align-items: center; gap: 14px; flex-wrap: wrap; }
.gkv-block__aktuell { display: flex; align-items: center; gap: var(--sp-3); min-width: 220px; }
/* Familienmitglied: Kasse fest (wie Hauptperson) — keine Auswahl. */
.gkv-block__fest { display: flex; align-items: center; gap: var(--sp-3); flex: 1; min-width: 220px; }
.gkv-block__kasse { display: flex; flex-direction: column; min-width: 0; }
.gkv-block__kasse-name { font-size: 13.5px; font-weight: var(--fw-semibold); }
.gkv-block__kasse-sub { font-size: 12px; color: var(--c-text-soft); font-variant-numeric: tabular-nums; }
.gkv-block__pfeil { color: var(--kk-violet-300); font-size: 18px; font-weight: var(--fw-bold); }
.gkv-block__neu { font-size: 15px; font-weight: var(--fw-bold); color: var(--c-primary); font-variant-numeric: tabular-nums; white-space: nowrap; }

/* Baustein-Karten */
.baustein-grid { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: var(--sp-3); }
.baustein { display: flex; flex-direction: column; gap: 10px; background: var(--c-surface); border: 1px solid var(--c-border); border-radius: var(--r-md); padding: 14px var(--sp-4); }
.baustein.is-aktiv { border-color: var(--baustein-active-bd); }
.baustein.is-off { background: var(--baustein-off-bg); }
/* Kopf ist der Auf-/Zuklapp-Schalter des Bausteins (button-Reset). */
.baustein__kopf { display: flex; align-items: center; gap: var(--sp-3); width: 100%; padding: 0; background: none; border: 0; border-radius: var(--r-sm); font: inherit; color: inherit; text-align: left; cursor: pointer; }
.baustein__kopf:focus-visible { outline: none; box-shadow: 0 0 0 3px var(--c-focus-ring); }
.baustein__icon { width: 30px; height: 30px; object-fit: contain; flex: none; }
/* Abgewählt: Icon komplett grau. */
.baustein.is-off .baustein__icon { filter: grayscale(1); opacity: .45; }
/* Kleines Angehörigkeits-Symbol (Owner 2026-08-04): läuft inline vor dem Namen/Label
   mit (Stepper-Chip + Personen-Kopfzeile), skaliert mit der Textgröße. Nur Layout —
   die Farben liegen im SVG-Asset (img/icons/beziehung-*.svg). */
.beziehung-icon { width: 1.5em; height: 1.5em; flex: none; vertical-align: -0.35em; margin-right: var(--sp-1); }
.baustein__titel { flex: 1; min-width: 0; display: flex; flex-direction: column; }
.baustein__name { font-size: 14px; font-weight: var(--fw-bold); }
.baustein__sub { font-size: 11.5px; color: var(--c-text-soft); }
.baustein__caret { flex: none; color: var(--c-text-soft); font-size: 11px; transition: transform var(--t-fast); }
.baustein:not(.is-collapsed) .baustein__caret { transform: rotate(180deg); }
.baustein__body { display: flex; flex-direction: column; gap: 10px; }
.baustein.is-collapsed .baustein__body { display: none; }
.baustein__preis { font-size: 14px; font-weight: var(--fw-bold); color: var(--c-primary); font-variant-numeric: tabular-nums; white-space: nowrap; }
.baustein__hinweis { font-size: 12px; color: var(--c-text-soft); margin: 0; }
.baustein__inputs { display: flex; flex-wrap: wrap; gap: var(--sp-2); align-items: center; }
.baustein__inputs .input { height: 36px; }
.baustein__inputs .input--betrag { width: 84px; text-align: right; flex: none; }
.baustein__inputs .combo--versicherer { min-width: 160px; }
.baustein__frei { width: 100%; margin-top: var(--sp-2); }

/* Bestandsvertrag-Vorfilter rev. 2 (Handoff Zahn-Modal §1.1(3)): beschriftetes
   3-Spalten-Grid Versicherer · Beitrag · Vertragsjahr/Bereich. */
/* Owner-Bug 02.09. (Konsole, "Beitrag rutscht unter den Versicherer"): das
   3-Spalten-Grid hielt die Versicherer-Spalte auf minmax(0,1fr), die Combo
   darin aber auf min-width 260px - bei mittleren Fensterbreiten lief der
   Trigger ueber die Beitrag-Spalte. Jetzt flex-wrap: Versicherer waechst
   (Basis 220px), Beitrag/Jahr halten ihre Breite und brechen bei Platzmangel
   in die naechste Zeile um - nie mehr uebereinander, bei JEDER Breite. */
.bestand-filter { display: flex; flex-wrap: wrap; gap: var(--sp-2) var(--sp-3); align-items: flex-end; }
.bestand-filter__feld { flex: 1 1 220px; }
.bestand-filter__feld:has(> .input--betrag) { flex: 0 0 132px; }
.bestand-filter__feld:has(> .input--jahr) { flex: 0 0 172px; }
.bestand-filter .combo { min-width: 0; width: 100%; flex: none; }
/* T01-Fix (Owner-Screenshot „Beitrag-Label versetzt"): der JS-Combo-Trigger
   war höher als die 36px-Inputs — mit align-items:end rutschten die kürzeren
   Felder samt Label nach unten. Trigger im Filter auf Input-Höhe klemmen →
   alle Labels sitzen auf einer Linie. */
.bestand-filter .combo__trigger { height: 36px; min-height: 36px; padding-top: 0; padding-bottom: 0; }
.bestand-filter__feld { display: flex; flex-direction: column; gap: 3px; min-width: 0; }
.bestand-filter__label { font-size: 10.5px; color: var(--c-text-muted); }
.bestand-filter .input { height: 36px; }
.bestand-filter .input--betrag { text-align: right; font-variant-numeric: tabular-nums; }
@media (max-width: 640px) { .bestand-filter__feld, .bestand-filter__feld:has(> .input--betrag), .bestand-filter__feld:has(> .input--jahr) { flex: 1 1 100%; } }
.baustein__hinweis--klein { font-size: var(--fs-caption); color: var(--c-text-muted); margin: 0; }

/* Aufklappbare Personen-Formulare (hinzufügen / Basisdaten bearbeiten) */
.felder-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)); gap: var(--sp-3); margin-bottom: var(--sp-4); }
.felder-grid .field { margin-bottom: 0; }
/* Karte 157: nackte Buttons als Grid-Item streckten sich auf Zellhoehe UND
   -breite (Riesen-„Hochladen" neben Label+Input in den Upload-Formularen) —
   Buttons sitzen in natuerlicher Groesse auf der Input-Grundlinie. */
.felder-grid > .btn { align-self: end; justify-self: start; }
.person-add, .person-edit, .fall-ausgaben { margin-top: var(--sp-4); }
.person-add > summary, .person-edit > summary, .fall-ausgaben > summary { display: inline-flex; align-items: center; list-style: none; cursor: pointer; }
.person-add > summary::-webkit-details-marker, .person-edit > summary::-webkit-details-marker, .fall-ausgaben > summary::-webkit-details-marker { display: none; }
/* Aufklapp-Knopf sichtbar klickbar (Owner 2026-08-30): lila Schrift statt des
   gedaempften Ghost-Graus + Dreieck nach unten, das sich beim Oeffnen dreht.
   BEWUSST nur die Ghost-Summaries (person-edit, fall-ausgaben) — `.person-add`
   ist ein gefuellter Secondary-Button und braeuchte sonst seinen eigenen
   Vordergrund ueberschrieben. */
.person-edit > summary, .fall-ausgaben > summary { color: var(--c-primary); }
.person-edit > summary::after, .fall-ausgaben > summary::after { content: "▾"; font-size: 1.1em; line-height: 1; transition: transform .15s ease; }
.person-edit[open] > summary::after, .fall-ausgaben[open] > summary::after { transform: rotate(180deg); }
/* Ausgaben-Block der Fall-Seite hinter einem Klick (Owner 2026-08-30): gleiche
   summary-Behandlung wie person-edit, der Container darunter bleibt unveraendert.
   Abstand nur im offenen Zustand — zugeklappt soll der Knopf keine Luft ziehen. */
.fall-ausgaben[open] > summary { margin-bottom: var(--sp-3); }
.person-add__form, .person-edit__form { margin-top: var(--sp-4); padding: var(--sp-4); background: var(--c-surface-raised); border: 1px solid var(--c-border-soft); border-radius: var(--card-radius); }
/* Basisdaten sitzen direkt unter dem Personen-Kopf, nicht am Blockende. */
.person-edit { margin-top: 0; margin-bottom: var(--sp-4); }
.person-edit__hinweis { font-size: var(--fs-caption); margin: 0 0 var(--sp-3); }
/* Abschnitts-Überschrift im Basisdaten-Formular (z.B. „Kontakt & Adresse") */
.person-edit__gruppe { margin: var(--sp-4) 0 var(--sp-3); padding-top: var(--sp-3); border-top: 1px solid var(--c-border-soft); }
.hinweis-chip { display: inline-flex; align-items: center; padding: 3px 10px; border-radius: var(--r-full); background: var(--c-warning-bg); color: var(--c-warning-text); font-size: 11.5px; font-weight: var(--fw-semibold); }

/* Empfehlungszeile (auto + Bedarf) */
.empfehlung { display: flex; align-items: center; gap: 10px; background: var(--kk-violet-50); border-radius: var(--r-sm); padding: 10px 12px; }
.empfehlung__text { flex: 1; min-width: 0; display: flex; flex-direction: column; }
.empfehlung__name { font-size: 12.5px; font-weight: var(--fw-semibold); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.empfehlung__sub { font-size: 11px; font-weight: var(--fw-semibold); color: var(--c-accent); }
.empfehlung__preis { font-size: 13px; font-weight: var(--fw-bold); color: var(--c-primary); font-variant-numeric: tabular-nums; }

/* Gewählte Bausteine + Leistungen (Bullet-Points; Bilanz-Spalte & Konzept) */
.leistung-block { padding: var(--sp-3) 0; border-bottom: 1px solid var(--c-border-soft); }
.leistung-block:last-child { border-bottom: 0; padding-bottom: 0; }
.leistung-block__kopf { display: flex; align-items: center; gap: var(--sp-2); }
.leistung-block__icon { width: 26px; height: 26px; object-fit: contain; flex: none; }
.leistung-block__titel { flex: 1; min-width: 0; display: flex; flex-direction: column; }
.leistung-block__name { font-size: 13px; font-weight: var(--fw-bold); }
.leistung-block__sub { font-size: 11px; color: var(--c-text-soft); }
.leistung-block__preis { font-size: 13px; font-weight: var(--fw-bold); color: var(--c-primary); font-variant-numeric: tabular-nums; flex: none; }
.leistung-liste { list-style: none; margin: var(--sp-2) 0 0; padding: 0 0 0 34px; display: flex; flex-direction: column; gap: 4px; }
.leistung-liste li { position: relative; display: flex; align-items: baseline; justify-content: space-between; gap: var(--sp-2); font-size: 12px; }
.leistung-liste li::before { content: "✓"; position: absolute; left: -16px; color: var(--c-primary); font-weight: var(--fw-bold); font-size: 11px; }
.leistung-liste__label { color: var(--c-text-muted); }
.leistung-liste__wert { font-weight: var(--fw-semibold); font-variant-numeric: tabular-nums; white-space: nowrap; }

/* Status-Chips (Radio-basiert — funktioniert ohne JS mit Speichern-Button) */
.chips { display: flex; flex-wrap: wrap; gap: var(--sp-1); }
.chip-radio { position: relative; }
.chip-radio input { position: absolute; opacity: 0; width: 100%; height: 100%; inset: 0; margin: 0; cursor: pointer; }
.chip-radio span { display: inline-flex; align-items: center; padding: 4px 10px; border-radius: var(--r-full); border: 1px solid var(--c-border); background: var(--c-surface); color: var(--c-text-muted); font-size: 11.5px; font-weight: var(--fw-semibold); transition: background var(--t-fast), border-color var(--t-fast), color var(--t-fast); }
.chip-radio:hover span { border-color: var(--c-accent-2); }
.chip-radio input:checked + span { background: var(--c-primary); border-color: var(--c-primary); color: var(--c-text-on-accent); }
.chip-radio input:focus-visible + span { border-color: var(--c-focus); box-shadow: 0 0 0 3px var(--c-focus-ring); }

/* Kombi-Schnellauswahl im GKV-Vergleich: ein Button toggelt mehrere Themen-Chips
   (JS-Enhancement, kommt hidden aus dem Server-Markup). Optik = chip-radio,
   aktiv = alle hinterlegten Themen gewählt. */
.chip-kombi { display: inline-flex; align-items: center; gap: 4px; padding: 4px 10px; border-radius: var(--r-full); border: 1px dashed var(--c-accent-2); background: var(--c-surface); color: var(--c-text); font: inherit; font-size: 11.5px; font-weight: var(--fw-semibold); cursor: pointer; transition: background var(--t-fast), border-color var(--t-fast), color var(--t-fast); }
/* display:inline-flex würde das hidden-Attribut aushebeln — ohne JS blieben sonst
   tote Buttons sichtbar (Review-Befund 2026-07-20). */
.chip-kombi[hidden] { display: none; }
.chip-kombi:hover { border-color: var(--c-primary); }
.chip-kombi.is-active { background: var(--c-primary); border-color: var(--c-primary); border-style: solid; color: var(--c-text-on-accent); }
.chip-kombi.is-active .chip-kombi__sub { color: var(--c-text-on-accent); }
.chip-kombi:focus-visible { outline: none; border-color: var(--c-focus); box-shadow: 0 0 0 3px var(--c-focus-ring); }
/* Pille steht im Aufbau, trägt aber noch keine Kategorien (Owner 31.08.) —
   gleiche Konvention wie .btn:disabled und .k2-cmp__chip:disabled. */
.chip-kombi:disabled { opacity: .5; cursor: default; }
.chip-kombi:disabled:hover { border-color: var(--c-accent-2); }
.chip-kombi__sub { font-weight: var(--fw-regular); color: var(--c-text-muted); }

/* Combo — Custom-Select mit Logo + Suche (progressive enhancement über natives <select>) */
.combo { position: relative; flex: 1; min-width: 260px; }
/* In Formular-Grids (Basisdaten) darf die Combo ihre Spalte nicht sprengen — sonst
   schiebt sie sich über das Nachbarfeld (Bundesland). Breite kommt aus der Grid-Spalte. */
.form-grid .combo, .felder-grid .combo { min-width: 0; }
/* In Column-Flex-Karten (Baustein) nicht vertikal strecken — sonst rutscht das Panel zu tief. */
.combo--tarife { flex: none; width: 100%; }
.combo__trigger { display: flex; align-items: center; gap: 10px; width: 100%; height: var(--field-h); padding: 0 14px; background: var(--field-bg); border: 1px solid var(--field-bd); border-radius: var(--field-radius); cursor: pointer; font: inherit; text-align: left; transition: border-color var(--t-fast), box-shadow var(--t-fast); }
.combo__trigger:focus-visible, .combo.is-open .combo__trigger { outline: none; border-color: var(--c-focus); box-shadow: 0 0 0 3px var(--c-focus-ring); }
.combo__name { flex: 1; min-width: 0; font-size: 13.5px; font-weight: var(--fw-semibold); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.combo__badge { display: inline-flex; padding: 2px 8px; border-radius: var(--r-full); background: var(--kk-violet-100); color: var(--c-primary); font-size: 10.5px; font-weight: var(--fw-bold); flex: none; }
.combo__wert { font-size: 13px; font-weight: var(--fw-semibold); color: var(--c-primary); font-variant-numeric: tabular-nums; flex: none; }
.combo__caret { color: var(--c-text-soft); font-size: 11px; flex: none; }
.combo__panel { position: absolute; top: calc(100% + 6px); left: 0; right: 0; z-index: 40; background: var(--c-surface); border: 1px solid var(--c-border); border-radius: var(--r-md); box-shadow: var(--combo-panel-shadow); overflow: hidden; animation: kk-drop-in var(--dur-fast) var(--ease-out); }
/* Karte 128: fehlt unter dem Trigger der Platz (kleine Displays), klappt das Panel nach oben. */
.combo__panel--oben { top: auto; bottom: calc(100% + 6px); }
.combo--kassen .combo__panel { min-width: 300px; }
.combo__search { padding: 10px 10px 8px; border-bottom: 1px solid var(--c-border-soft); }
.combo__search input { width: 100%; height: 36px; padding: 0 12px; border: 1px solid var(--field-bd); border-radius: 8px; font: inherit; font-size: 13px; color: var(--c-text); background: var(--c-bg); }
.combo__search input:focus { outline: none; border-color: var(--c-focus); box-shadow: 0 0 0 3px var(--c-focus-ring); background: var(--c-surface); }
.combo__list { max-height: 264px; overflow-y: auto; overflow-x: hidden; padding: 6px; margin: 0; list-style: none; }
.combo__option { border-radius: 8px; }
.combo__option-row { display: flex; align-items: flex-start; gap: 10px; padding: 8px 10px; border-radius: 8px; cursor: pointer; }
.combo__option-row:hover, .combo__option.is-active > .combo__option-row { background: var(--combo-option-hover); }
.combo__option-body { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 5px; }
.combo__option-meta { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }
.combo__option-name { font-size: 13px; font-weight: var(--fw-medium); overflow-wrap: anywhere; display: flex; flex-direction: column; }
.combo__option-sub { font-size: 11px; color: var(--c-text-soft); }
.combo__option-wert { font-size: 12.5px; font-weight: var(--fw-semibold); color: var(--c-text-muted); font-variant-numeric: tabular-nums; flex: none; }

/* Leistungs-Filter im Tarif-Combo (Facetten-Chips + Wert-Badge je Option) */
.combo__facets { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; padding: 10px 10px 8px; border-bottom: 1px solid var(--c-border-soft); }
.combo__facets-label { font-size: var(--fs-caption); font-weight: var(--fw-semibold); color: var(--c-text-muted); text-transform: uppercase; letter-spacing: .04em; margin-right: var(--sp-1); }
.combo__facet-chip { display: inline-flex; align-items: center; padding: 5px 12px; border-radius: var(--r-full); border: 1px solid var(--c-border); background: var(--c-surface); color: var(--c-text-muted); font: inherit; font-size: 11.5px; font-weight: var(--fw-semibold); cursor: pointer; transition: background var(--t-fast), border-color var(--t-fast), color var(--t-fast); }
.combo__facet-chip:hover { border-color: var(--c-accent-2); }
.combo__facet-chip.is-active { background: var(--c-primary); border-color: var(--c-primary); color: var(--c-text-on-accent); }
.combo__facet-chip:focus-visible { outline: none; box-shadow: 0 0 0 3px var(--c-focus-ring); }
.combo__option-facet { display: inline-flex; padding: 2px 8px; border-radius: var(--r-full); background: var(--c-surface-muted); color: var(--c-text-muted); font-size: 10.5px; font-weight: var(--fw-bold); flex: none; }
.combo__leer { padding: 12px; text-align: center; color: var(--c-text-soft); font-size: 13px; list-style: none; }
/* Trenner-Zeile (Karte 167): disabled-Options rendert die Combo als reine
   Beschriftung — nie klickbar, kein Hover, optisch vom Block darüber getrennt. */
.combo__trenner { padding: 10px 10px 4px; margin-top: 4px; border-top: 1px solid var(--c-border-soft); font-size: 11px; font-weight: var(--fw-semibold); color: var(--c-text-soft); text-align: center; cursor: default; user-select: none; list-style: none; }

/* Sortierung + aufklappbare Vorteile je Tarif-Option */
.combo__sort { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; padding: 8px 10px; border-bottom: 1px solid var(--c-border-soft); }
.combo__option-expand { display: inline-flex; align-items: center; gap: 4px; padding: 3px 8px; border: 1px solid var(--c-border); border-radius: var(--r-full); background: var(--c-surface); color: var(--c-text-muted); font: inherit; font-size: 11px; font-weight: var(--fw-semibold); cursor: pointer; flex: none; }
.combo__option-expand:hover { border-color: var(--c-accent-2); color: var(--c-primary); }
.combo__option-expand:focus-visible { outline: none; box-shadow: 0 0 0 3px var(--c-focus-ring); }
.combo__option-expand-arrow { font-size: 9px; transition: transform var(--t-fast); }
.combo__option.is-expanded .combo__option-expand-arrow { transform: rotate(90deg); }
.combo__option-benefits { list-style: none; margin: 0; padding: 2px 10px 10px 44px; display: none; flex-direction: column; gap: 3px; }
.combo__option.is-expanded .combo__option-benefits { display: flex; }
.combo__option-benefits li { position: relative; display: flex; align-items: baseline; justify-content: space-between; gap: var(--sp-2); font-size: 12px; }
.combo__option-benefits li::before { content: "✓"; position: absolute; left: -16px; color: var(--c-primary); font-weight: var(--fw-bold); font-size: 10px; }
.combo__benefit-label { color: var(--c-text-muted); }
.combo__benefit-wert { font-weight: var(--fw-semibold); font-variant-numeric: tabular-nums; white-space: nowrap; }
/* Drei Zustände des Max-Kategorien-Rasters (B-Anfrage 2026-08-11): ✗ nur bei
   belegtem Nein (leise Fehler-Töne), „keine Angabe" gedämpft. */
.combo__benefit--fehlt, .combo__benefit--fehlt .combo__benefit-label, .combo__benefit--fehlt .combo__benefit-wert { color: var(--c-error); }
.combo__benefit--offen, .combo__benefit--offen .combo__benefit-label { color: var(--c-text-soft); }
.combo__benefit--offen .combo__benefit-wert { color: var(--c-text-soft); font-weight: var(--fw-regular); }
.combo select.combo__native { width: 100%; }
.combo.is-enhanced select.combo__native { position: absolute; opacity: 0; pointer-events: none; height: 0; }

/* Bilanz-Modul (Desktop sticky) */
.bilanz-spalte { position: sticky; top: var(--sp-6); display: flex; flex-direction: column; gap: var(--sp-4); }
.bilanz__held { border-radius: var(--r-md); padding: 18px var(--sp-4); text-align: center; background: var(--bilanz-pos-bg); margin: var(--sp-3) 0; }
.bilanz__held.is-spart { background: var(--konzept-hero-spart-bg); }
.bilanz__held.is-neg { background: var(--bilanz-neg-bg); }
.bilanz__num { font-size: var(--bilanz-num-size); font-weight: var(--fw-bold); color: var(--c-primary); font-variant-numeric: tabular-nums; line-height: 1.1; }
.bilanz__held.is-spart .bilanz__num { color: var(--bilanz-spart-fg); }
.bilanz__held.is-neg .bilanz__num { color: var(--bilanz-neg-fg); }
.bilanz__text { font-size: 12.5px; font-weight: var(--fw-semibold); color: var(--c-primary); margin-top: 2px; }
.bilanz__held.is-spart .bilanz__text { color: var(--bilanz-spart-fg); }
.bilanz__held.is-neg .bilanz__text { color: var(--bilanz-neg-fg); }
.bilanz__hint { font-size: 11.5px; color: var(--c-text-muted); margin-top: 4px; }
.bilanz__held.is-pulsing { animation: kk-pulse .5s var(--ease-out); }

/* Bilanz-Blöcke (Konsole): die Aufstellung gruppiert Krankenkasse / Bausteine / Gesamt
   als abgesetzte Boxen — eine flache kv-Liste war nicht scanbar (Owner 2026-07-17).
   GKV-Block trägt die violette GKV-Tint (Wiedererkennung zum Basisträger-Block links). */
/* ── Saldenliste (Design-Handoff 07.09.2026, design_handoff_bilanz_saldenliste/BRIEF.md,
   PR 3). Konvention in wissen/design-system.md. Bereich = <details> mit Kopfzeile
   (Titel + Ergebnis-Pille), Unterzeile mit Einzug + Strich, Toggle-Pillen, Kontrolle
   für die Technik mit Grund-Tags. Nur Tokens — keine Rohfarben. ── */
.sl { display: flex; flex-direction: column; gap: 2px; }
.sl__kopf { display: flex; flex-wrap: wrap; justify-content: space-between; align-items: center; gap: var(--sp-1) var(--sp-2); margin-bottom: var(--sp-1); }
.sl__kopf .eyebrow { margin: 0; }
.sl-toggle { display: inline-flex; flex: 0 0 auto; margin-left: auto; gap: 2px; padding: 2px; border-radius: var(--r-full); background: var(--sl-pille-bg); }
.sl-toggle__b { white-space: nowrap; border: 0; background: transparent; border-radius: var(--r-full); padding: 3px 10px; font: inherit; font-size: var(--fs-caption); font-weight: var(--fw-bold); color: var(--c-primary); cursor: pointer; text-decoration: none; }
.sl-toggle__b.is-an { background: var(--c-primary); color: var(--c-text-on-accent); cursor: default; }
.sl-bereich { border-top: 1px solid var(--gkv-block-bd); margin-top: var(--sp-2); }
.sl-bereich__kopf { display: flex; justify-content: space-between; align-items: baseline; gap: var(--sp-2); padding: var(--sp-2) 0 var(--sp-1); cursor: pointer; list-style: none; }
.sl-bereich__kopf::-webkit-details-marker { display: none; }
.sl-bereich__titel { flex: 1 1 auto; min-width: 0; font-size: 10.5px; font-weight: var(--fw-bold); letter-spacing: .08em; text-transform: uppercase; color: var(--c-primary); }
.sl-bereich__titel::before { content: "▸ "; color: var(--c-text-muted); }
.sl-bereich[open] .sl-bereich__titel::before { content: "▾ "; }
.sl-bereich__inhalt { padding: 0 0 var(--sp-2) 4px; }
.sl-pille { display: inline-flex; flex: 0 0 auto; white-space: nowrap; gap: var(--sp-2); align-items: baseline; padding: 3px 10px; border-radius: var(--r-md); background: var(--sl-pille-bg); font-weight: var(--fw-bold); color: var(--c-text); }
.sl-pille__l { font-size: var(--fs-caption); font-weight: var(--fw-semibold); }
.sl-pille--gut { background: var(--sl-pille-gut-bg); color: var(--sl-pille-gut-fg); }
.sl-abschnitt { font-size: var(--fs-caption); font-weight: var(--fw-bold); color: var(--c-text-muted); margin: var(--sp-2) 0 0; }
.sl-zeile { display: flex; align-items: baseline; gap: 10px; padding: 3px 0; line-height: 1.3; }
.sl-label { flex: 1 1 auto; min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; color: var(--c-text); }
.sl-label i { font-style: normal; color: var(--c-text-muted); font-size: var(--fs-caption); }
.sl-wert { flex: 0 0 auto; font-variant-numeric: tabular-nums; font-weight: var(--fw-semibold); white-space: nowrap; }
.sl-zeile--sub { padding-left: 16px; padding-top: 1px; padding-bottom: 1px; }
.sl-zeile--sub .sl-label { font-size: 12.5px; }
.sl-zeile--sub .sl-label::before { content: "└ "; color: var(--sl-sub-strich); }
.sl-zeile--plus .sl-label, .sl-zeile--plus .sl-wert { color: var(--sl-plus-fg); }
.sl-zeile--minus .sl-wert { color: var(--sl-minus-fg); }
.sl-zeile--mut .sl-label, .sl-zeile--mut .sl-wert { color: var(--c-text-muted); font-weight: var(--fw-medium); }
.sl-zeile--bestand .sl-label { color: var(--c-primary); }
.sl-zeile--summe { border-top: 1px solid var(--c-border-soft); margin-top: 2px; }
.sl-zeile--summe .sl-label, .sl-zeile--summe .sl-wert { font-weight: var(--fw-bold); }
.sl-zeile--gesamt .sl-label { font-weight: var(--fw-semibold); }
.sl-zeile--gesamt .sl-wert { font-size: var(--fs-h3); font-weight: var(--fw-bold); }
.sl-kontrolle { margin-top: var(--sp-3); border: 1px dashed var(--sl-kontrolle-bd); border-radius: var(--r-md); padding: var(--sp-2) 10px; background: var(--c-bg); }
.sl-kontrolle > summary { display: flex; justify-content: space-between; flex-wrap: wrap; gap: 4px 8px; cursor: pointer; list-style: none; font-size: 10.5px; font-weight: var(--fw-bold); letter-spacing: .08em; text-transform: uppercase; color: var(--c-text-muted); }
.sl-kontrolle > summary::-webkit-details-marker { display: none; }
.sl-kontrolle__sum { text-transform: none; letter-spacing: 0; font-weight: var(--fw-semibold); }
.sl-kontrolle__person { margin: var(--sp-2) 0 var(--sp-1); font-size: var(--fs-caption); font-weight: var(--fw-bold); color: var(--c-primary); }
.sl-kontrolle__posten { margin: var(--sp-2) 0 1px; font-size: 12px; font-weight: var(--fw-bold); color: var(--c-text); }
.sl-kontrolle__zeile { display: grid; grid-template-columns: 1fr auto; column-gap: 8px; align-items: baseline; padding: 1px 0 2px 12px; font-size: 12px; line-height: 1.35; }
.sl-kontrolle__zeile .sl-label { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.sl-kontrolle__zeile.is-plus .sl-label, .sl-kontrolle__zeile.is-plus .sl-wert { color: var(--sl-plus-fg); }
.sl-kontrolle__zeile.is-mut .sl-label, .sl-kontrolle__zeile.is-mut .sl-wert { color: var(--c-text-muted); font-weight: var(--fw-medium); }
.sl-kontrolle__zeile.is-summe { border-top: 1px solid var(--c-border-soft); margin-top: 1px; }
.sl-kontrolle__zeile.is-summe .sl-label, .sl-kontrolle__zeile.is-summe .sl-wert { font-weight: var(--fw-bold); }
.sl-kontrolle__zeile.is-ok .sl-label, .sl-kontrolle__zeile.is-ok .sl-wert { color: var(--sl-plus-fg); font-weight: var(--fw-bold); }
.sl-kontrolle__zeile.is-rot .sl-label, .sl-kontrolle__zeile.is-rot .sl-wert { color: var(--sl-minus-fg); font-weight: var(--fw-bold); }
.sl-tag { grid-column: 1 / -1; justify-self: end; max-width: 100%; font-size: 10.5px; color: var(--sl-tag-fg); background: var(--sl-tag-bg); border-radius: var(--r-sm); padding: 1px 6px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.sl-tag--deckel { color: var(--sl-tag-deckel-fg); background: var(--sl-tag-deckel-bg); }
.sl-tag--ok { color: var(--sl-tag-ok-fg); background: var(--sl-tag-ok-bg); }
.sl-tag--rot { color: var(--sl-minus-fg); background: var(--sl-tag-deckel-bg); }

/* Die Block-Spalte (.bilanz-block, .kv--spart/--summe/--gesamt/--konzept/
   --bestand/--bonus/--effektiv) ist seit 07.09.2026 durch die Saldenliste (.sl-*)
   ersetzt — Regeln entfernt, .kv/.kv__icon bleiben (Admin-Detailseiten, Icons). */

/* Sidebar-Fuß: angemeldeter Benutzer + Abmelden */
.sidebar__benutzer { margin-top: auto; padding: var(--sp-3) var(--sp-3) var(--sp-2); border-top: 1px solid var(--c-border-soft); display: flex; align-items: center; justify-content: space-between; gap: var(--sp-2); }
.sidebar__benutzer-name { font-size: 12.5px; font-weight: var(--fw-semibold); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
/* Karte xx91LVbw (Owner 21.08.): Benutzer GLOBAL sichtbar. Desktop-Sidebar klebt
   am Viewport (flex-Spalte, damit margin-top:auto den Fuß wirklich unten hält —
   im Block-Layout war das ein No-Op und der Fuß scrollte mit langem Inhalt weg).
   Mobil (≤900px) überschreibt die bestehende Off-Canvas-Regel (position:fixed). */
.sidebar--nav { position: sticky; top: 0; max-height: 100vh; display: flex; flex-direction: column; }
/* Karte 144 (Owner-Screenshot /admin/): overflow-y auf der ASIDE clippte das
   absolut positionierte Benutzer-Panel an der Sidebar-Kante — scrollen darf
   nur der Nav-Baum, das Panel ragt frei über den Inhalt (alle Layouts). */
.sidebar--nav .nav2 { flex: 1 1 auto; min-height: 0; overflow-y: auto; }
/* Klick auf den Avatar öffnet ein Panel (Owner-Präzisierung Karte xx91LVbw):
   pv-menu-Wiederverwendung, Modifier öffnet NACH OBEN (der Fuß sitzt am
   Viewport-Boden). Track C baut nur die Hülle — die Health-Inhalte (CRM/KKB)
   liefert Track B (fjI9Byds) in .pv-menu__liste. */
.pv-menu--hoch > .pv-menu__liste { top: auto; bottom: calc(100% + 6px); left: 0; right: auto; }
.sidebar__benutzer .pv-menu__knopf { border: 0; background: transparent; padding: 0; text-align: left; }
/* Karte 144: Health-Zeilen im Panel (Daten Karte 136) — Punkt-Optik über
   Tokens: grün = verbunden, rot = nicht angeschlossen/Code fehlt, grau
   (Default) = ehrlich unbestätigt. */
.pv-menu__item--status { align-items: center; }
.pv-menu__status-punkt { width: 8px; height: 8px; border-radius: 50%; background: var(--c-text-soft); flex: none; }
.pv-menu__status-punkt--ok { background: var(--kk-green); }
.pv-menu__status-punkt--rot, .pv-menu__status-punkt--fehlt { background: var(--c-error); }
/* Der Fuß bricht in zwei Zeilen: Avatar-Zeile oben, Impressum/Abmelden darunter —
   sonst quetscht die breitere Avatar-Anzeige die Buttons aus der Sidebar. */
.sidebar__benutzer { flex-wrap: wrap; }
.sidebar__benutzer .pv-menu { flex: 1 1 100%; }

/* Login (Stufe 1): zentrierte Karte, ohne Sidebar/Topbar — ruhiger Einstieg. */
.login { min-height: 100vh; display: flex; align-items: center; justify-content: center; padding: var(--sp-5); background: var(--c-bg); }
.login__karte { width: 100%; max-width: 380px; background: var(--card-bg); border: 1px solid var(--card-bd); border-radius: var(--r-lg); box-shadow: var(--sh-card); padding: var(--sp-6) var(--sp-5); text-align: center; }
.login__logo { height: 34px; margin-bottom: var(--sp-3); }
.login__titel { font-size: 1.3rem; margin: 0; }
.login__sub { color: var(--c-text-muted); font-size: 13px; margin: 4px 0 var(--sp-4); }
.login__karte form { text-align: left; display: flex; flex-direction: column; gap: var(--sp-3); }
.login__knopf { width: 100%; }
.login__hinweis { color: var(--c-text-soft); font-size: 12px; margin-top: var(--sp-4); }

/* Rechtsseite (Impressum & Co.): öffentliche Rechtstexte ohne Login/Sidebar-Chrome —
   zentrierte Lese-Spalte auf Karten-Fläche. Konvention: design-system §2026-08-14. */
.rechtsseite { min-height: 100vh; padding: var(--sp-8) var(--sp-5); background: var(--c-bg); }
.rechtsseite__karte { max-width: 720px; margin: 0 auto; background: var(--card-bg); border: 1px solid var(--card-bd); border-radius: var(--r-lg); box-shadow: var(--sh-card); padding: var(--sp-8); }
.rechtsseite__logo { height: 34px; margin-bottom: var(--sp-5); }
.rechtsseite__titel { font-size: var(--fs-h1); margin: 0 0 var(--sp-5); }
.rechtsseite__karte h2 { font-size: var(--fs-h2); margin: var(--sp-6) 0 var(--sp-2); }
.rechtsseite__karte h3 { font-size: var(--fs-h3); margin: var(--sp-5) 0 var(--sp-2); }
.rechtsseite__karte h4 { font-size: var(--fs-body); font-weight: var(--fw-semibold); margin: var(--sp-4) 0 var(--sp-2); }
.rechtsseite__karte p { margin: 0 0 var(--sp-3); line-height: var(--lh); }
.rechtsseite__zurueck { margin-top: var(--sp-6); }

/* Tabellen-Aktionen: Knopf-Gruppe rechtsbündig in einer Zelle (z.B. Öffnen + Löschen) */
.table__aktionen { display: flex; align-items: center; justify-content: flex-end; gap: var(--sp-2); }

/* Aufklapp-Block (2026-09-09, M&M-Freigabe): Nebensächliches eingeklappt unter einer
   Tabelle — <details class="aufklapp"><summary class="aufklapp__kopf">. Nur Tokens. */
.aufklapp { margin-top: var(--sp-4); border-top: 1px solid var(--c-border-soft); padding-top: var(--sp-3); }
.aufklapp__kopf { cursor: pointer; list-style: none; color: var(--c-text-muted); font-weight: var(--fw-medium); }
.aufklapp__kopf::-webkit-details-marker { display: none; }
.aufklapp__kopf::before { content: "▸ "; }
.aufklapp[open] > .aufklapp__kopf::before { content: "▾ "; }
.aufklapp[open] > .aufklapp__kopf { margin-bottom: var(--sp-3); }

/* API-Doku (/docs): fangate-Stil — Anker-Sidebar links, Inhalt rechts, Endpunkt-Blöcke
   mit Methoden- und Status-Badges. Berater-/Entwickler-Werkzeug, kein Kunden-Screen. */
.docs { display: flex; gap: var(--sp-6); max-width: 1180px; margin: 0 auto; padding: var(--sp-5) var(--sp-4); align-items: flex-start; }
.docs__nav { position: sticky; top: var(--sp-5); flex: 0 0 232px; display: flex; flex-direction: column; gap: 2px; font-size: 13px; }
.docs__nav a { color: var(--c-text-muted); text-decoration: none; padding: 3px var(--sp-2); border-radius: var(--r-sm); }
.docs__nav a:hover { color: var(--c-primary); background: var(--c-surface-muted); }
.docs__nav-titel { font-size: 10.5px; font-weight: var(--fw-bold); letter-spacing: .08em; text-transform: uppercase; color: var(--c-text-soft); margin: var(--sp-3) 0 2px var(--sp-2); }
.docs__nav-titel:first-child { margin-top: 0; }
.docs__inhalt { flex: 1; min-width: 0; max-width: 860px; }
.docs__inhalt section { margin-bottom: var(--sp-6); }
.docs__inhalt h1 { font-size: 1.7rem; margin: 0 0 var(--sp-2); }
.docs__inhalt h2 { font-size: 1.2rem; margin: var(--sp-5) 0 var(--sp-2); }
.docs__inhalt h3 { font-size: .95rem; margin: var(--sp-3) 0 var(--sp-1); color: var(--c-text-muted); }
.docs-lead { font-size: 15px; color: var(--c-text-muted); }
.docs-stand { font-size: 12px; color: var(--c-text-muted); }
.docs-endpoint { border-top: 1px solid var(--c-border-soft); padding-top: var(--sp-3); }
.docs-endpoint h2 { display: flex; flex-wrap: wrap; align-items: center; gap: var(--sp-2); font-family: var(--font-mono, monospace); font-size: 1.02rem; }
.docs-methode { font-size: 11px; font-weight: var(--fw-bold); letter-spacing: .05em; padding: 2px 8px; border-radius: var(--r-full); }
.docs-methode--get { background: var(--c-spart-bg); color: var(--c-spart); }
.docs-methode--post { background: var(--c-success-bg); color: var(--c-primary); }
.docs-methode--wh { background: var(--c-info-bg); color: var(--c-info); }
.docs-badge { font-size: 10.5px; font-weight: var(--fw-semibold); padding: 2px 8px; border-radius: var(--r-full); vertical-align: middle; }
.docs-badge--entwurf { background: var(--c-warning-bg); color: var(--c-warning-text); }
.docs-badge--live { background: var(--c-spart-bg); color: var(--c-spart); }
.docs-code { background: var(--c-surface-muted); border: 1px solid var(--c-border-soft); border-radius: var(--r-md); padding: var(--sp-3); font-size: 12.5px; line-height: 1.55; overflow-x: auto; white-space: pre; }
.docs-hinweis { background: var(--c-info-bg); border-radius: var(--r-md); padding: var(--sp-2) var(--sp-3); font-size: 13px; margin: var(--sp-2) 0; }
.docs-hinweis--warn { background: var(--c-warning-bg); }
.docs code { background: var(--c-surface-muted); border-radius: var(--r-sm); padding: 1px 5px; font-size: .92em; }
.docs .docs-code code, .docs pre code { background: none; padding: 0; }
@media (max-width: 900px) {
  .docs { flex-direction: column; }
  .docs__nav { position: static; flex-basis: auto; flex-direction: row; flex-wrap: wrap; }
}

/* GKV-Vergleich (Konsole): optionales Panel im Basisträger-Block (?vergleich=1).
   Weiße Karte in der violetten GKV-Tint; Ranking scrollt, die Konsole bleibt ruhig.
   Reiner Absprung — kein Frage-Flow (Owner-Leitplanke, s. sv-integration). */
.gkv-vergleich { background: var(--card-bg); border: 1px solid var(--gkv-block-bd); border-radius: var(--r-md); padding: var(--sp-2) var(--sp-3); margin-top: var(--sp-3); }
.gkv-vergleich__kopf { display: flex; align-items: center; justify-content: space-between; gap: var(--sp-3); }
.gkv-vergleich__titel { font-size: 10.5px; font-weight: var(--fw-bold); letter-spacing: .08em; text-transform: uppercase; color: var(--c-primary); }
.gkv-vergleich__hinweis { color: var(--c-text-muted); font-size: 13px; margin: var(--sp-2) 0; }
.gkv-vergleich__sortierhinweis { font-size: 12px; color: var(--c-text-muted); margin: var(--sp-2) 0 0; }
/* Ranking-Höhe (Owner 2026-08-10): mindestens doppelt so tief wie die alten 340px —
   viewport-relativ, damit große Berater-Screens mehr Kassen ohne Scrollen zeigen. */
.gkv-vergleich__liste { list-style: none; margin: var(--sp-2) 0 0; padding: 0; max-height: min(75vh, 800px); overflow-y: auto; }
.gkv-vergleich__zeile { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: var(--sp-2) var(--sp-3); padding: var(--sp-2) 0; border-bottom: 1px solid var(--c-border-soft); }
.gkv-vergleich__zeile:last-child { border-bottom: 0; }
/* Platz 1 = klare Empfehlung: grün hinterlegt (Ersparnis-Farbe), Rang-Kreis je Zeile. */
.gkv-vergleich__zeile--top { background: var(--c-spart-bg); border-radius: var(--r-md); padding-left: var(--sp-2); padding-right: var(--sp-2); border-bottom-color: transparent; }
/* Gewählte Kasse: steht ganz oben, grau hinterlegt (Owner 2026-07-22) */
.gkv-vergleich__zeile--gewaehlt { background: var(--c-surface-muted); border-radius: var(--r-md); padding-left: var(--sp-2); padding-right: var(--sp-2); border-bottom-color: transparent; }
.gkv-vergleich__rang { flex: 0 0 auto; width: 22px; height: 22px; display: inline-flex; align-items: center; justify-content: center; border-radius: 50%; background: var(--c-border-soft); color: var(--c-text-muted); font-size: 11px; font-weight: var(--fw-bold); font-variant-numeric: tabular-nums; }
.gkv-vergleich__rang--top { background: var(--c-spart); color: var(--card-bg); }
.gkv-vergleich__ersparnis-box { display: flex; flex-direction: column; align-items: flex-end; gap: 2px; }
.gkv-vergleich__kasse { display: flex; align-items: center; gap: var(--sp-2); min-width: 0; }
.gkv-vergleich__name { font-weight: var(--fw-semibold); }
.gkv-vergleich__name .badge { margin-left: var(--sp-1); }
.gkv-vergleich__sub { font-size: 12px; color: var(--c-text-muted); font-variant-numeric: tabular-nums; }
.gkv-vergleich__rechts { display: flex; align-items: center; gap: var(--sp-3); margin-left: auto; }
.gkv-vergleich__ersparnis { color: var(--c-spart); font-weight: var(--fw-semibold); font-variant-numeric: tabular-nums; white-space: nowrap; }
.gkv-vergleich__mehr { flex-basis: 100%; }
.gkv-vergleich__mehr summary { cursor: pointer; font-size: 12px; color: var(--c-text-muted); }
.gkv-vergleich__ocats { list-style: none; margin: var(--sp-1) 0 0; padding: 0; }
.gkv-vergleich__ocats li { display: flex; justify-content: space-between; gap: var(--sp-3); font-size: 12.5px; padding: 2px 0; }
.gkv-vergleich__ocats li span:last-child { font-variant-numeric: tabular-nums; white-space: nowrap; }
/* Gewählte Kasse: Leistungs-Spot unterm Ranking (Owner 2026-08-10) — Kurzliste
   sofort sichtbar, volle Details lazy wie in den Ranking-Zeilen. */
.gkv-vergleich__wahl { display: flex; flex-direction: column; gap: var(--sp-2); margin-top: var(--sp-3); padding: var(--sp-2) var(--sp-3); background: var(--c-surface-muted); border-radius: var(--r-md); }
/* Bedarfs-Vorauswahl: Themen-Chips je Kategorie (nutzt .chips/.chip-radio der Bausteine) */
.gkv-vergleich__fragen { margin: var(--sp-2) 0; border: 1px solid var(--c-border-soft); border-radius: var(--r-md); padding: var(--sp-2) var(--sp-3); }
.gkv-vergleich__fragen summary { cursor: pointer; font-size: 12.5px; font-weight: var(--fw-semibold); color: var(--c-primary); }
.gkv-vergleich__frage { margin-top: var(--sp-2); }
.gkv-vergleich__frage-label { display: block; font-size: 11px; font-weight: var(--fw-semibold); letter-spacing: .05em; text-transform: uppercase; color: var(--c-text-muted); margin-bottom: 4px; }
.gkv-vergleich__frage-aktionen { display: flex; gap: var(--sp-2); margin-top: var(--sp-3); }
/* Druck: der Vergleich ist Berater-Werkzeug, nicht Teil des Konzepts */
/* `.gkv-vergleich__oeffnen` entfiel mit dem Knopf „GKV-Vergleich öffnen" (31.08.). */
@media print { .gkv-vergleich { display: none; } }

/* Bilanz-Bar (fixiert unten). Karte 151/Runde 1: Styles leben in der BASIS,
   die Media-Zonen schalten nur noch display — die Bar gilt seit dem Sweep
   auch im Stepper-Einspalter 768–1399 (B1), nicht mehr nur ≤767. */
.bilanz-bar { display: none; align-items: center; gap: var(--sp-3); position: fixed; left: 0; right: 0; bottom: 0; z-index: 50; background: var(--c-surface); border-top: 1px solid var(--c-border-soft); box-shadow: var(--bilanzbar-shadow); padding: 14px var(--sp-4) 20px; }
.bilanz-bar__links { flex: 1; min-width: 0; }
.bilanz-bar__label { font-size: 11px; color: var(--c-text-soft); }
.bilanz-bar__werte { font-size: 11.5px; font-variant-numeric: tabular-nums; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.bilanz-bar__rechts { flex: none; text-align: right; }
.bilanz-bar__diff { font-size: 22px; font-weight: var(--fw-bold); color: var(--c-primary); font-variant-numeric: tabular-nums; line-height: 1.1; }
.bilanz-bar__diff.is-neg { color: var(--bilanz-neg-fg); }
.bilanz-bar__status { font-size: 10.5px; font-weight: var(--fw-semibold); color: var(--c-primary); }
.bilanz-bar__status.is-neg { color: var(--bilanz-neg-fg); }

@keyframes kk-drop-in { from { opacity: 0; transform: translateY(-4px); } to { opacity: 1; transform: translateY(0); } }
@keyframes kk-pulse { 0% { transform: scale(1); } 35% { transform: scale(1.06); } 100% { transform: scale(1); } }

/* JS-Enhancement-Helfer: sichtbare Fallback-Buttons verschwinden, sobald JS übernimmt */
.js .js-auto .btn[type="submit"] { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }

/* Responsive: Tablet — eine Spalte, Bilanz zuerst */
@media (max-width: 1199px) {
  .konsole-wrap { grid-template-columns: minmax(0, 1fr); padding: var(--sp-5) var(--sp-5) var(--sp-10); }
  .bilanz-spalte { position: static; order: -1; }
}

/* Responsive: Mobile */
@media (max-width: 767px) {
  .app-topbar { padding: 12px var(--sp-4); flex-wrap: wrap; row-gap: var(--sp-2); }
  .app-topbar__logo { height: 18px; }
  .app-topbar__titel { font-size: 13px; }
  .privat-banner { padding: var(--sp-2) var(--sp-4); }
  .konsole-wrap { padding: var(--sp-4) var(--sp-4) 120px; }
  .baustein-grid { grid-template-columns: minmax(0, 1fr); }
  .chip-radio span { padding: 7px 12px; }   /* Touch: Chip-Höhe ≥ 30px */
  .chip-kombi { padding: 7px 12px; }        /* gleiche Touch-Höhe wie chip-radio */
  .card { padding: var(--sp-4); }
  .gkv-block__zeile .combo { min-width: 100%; }
  .bilanz-spalte { display: none; }
  /* Styles der Bar leben seit Karte 151/Runde 1 in der Basis — hier nur AN. */
  .bilanz-bar { display: flex; }
}

@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after { animation: none !important; transition: none !important; }
}

/* Print: Kunden-Konzept als sauberes weißes PDF */
@media print {
  body { background: var(--kk-white); }
  .card { box-shadow: none; border-color: var(--c-border-soft); }
  .topbar { display: none; }
  /* Konsolen-Topbar dient als Briefkopf — Logo bleibt, interaktive Buttons raus */
  .app-topbar { border-bottom: 1px solid var(--c-border-soft); padding-left: 0; padding-right: 0; }
  .app-topbar .btn { display: none; }
  .konzept-hero { box-shadow: none; border: 1px solid var(--c-border-soft); }
  /* A4: Blöcke nicht über Seitenumbrüche zerreißen */
  .concept section, .card, .konzept-hero, .leistung-block { break-inside: avoid; }
  .concept > p:last-child { display: none; }   /* „Drucken"-Button raus */
  /* Berater-Steuerung gehört nie aufs Kundenblatt */
  .vk-edit { display: none !important; }   /* Kachel-Edit ist Berater-Werkzeug, kein Druckinhalt */
}

/* Konzept mobil: lange Kassen-Zeilen dürfen umbrechen (kein Body-Überlauf) */
@media (max-width: 767px) {
  .concept .kv { flex-wrap: wrap; }
  .concept .kv__value { white-space: normal; }
  .kasse-inline { min-width: 0; }
}

/* ============================================================================
   Varianten-Umschalter (Konzept 1 | 2 | ＋) — Pillen-Optik, funktioniert ohne JS.
   Rest des v3-Matrix-Blocks entfernt mit dem v6-Umbau (2026-07-28): Hero, Matrix,
   Pillen, Panels und Kassen-Panel sind durch `kg-*` ersetzt.
   ========================================================================== */
.km-varianten { display: inline-flex; align-items: center; gap: 4px; padding: 4px; background: var(--tabs-bg); border-radius: var(--r-full); }
.km-varianten form { display: contents; }
.km-varianten__btn { display: inline-flex; align-items: center; height: 38px; padding: 0 var(--sp-5); border: 0; border-radius: var(--r-full); background: transparent; color: var(--tabs-btn-fg); font: inherit; font-size: var(--fs-body); font-weight: var(--fw-semibold); cursor: pointer; white-space: nowrap; }
.km-varianten__btn.is-active { background: var(--tabs-btn-active-bg); color: var(--tabs-btn-active-fg); box-shadow: var(--sh-sm); cursor: default; }
.km-varianten__btn:hover:not(.is-active) { color: var(--tabs-btn-active-fg); }

@media print { .km-varianten { display: none !important; } }

/* ============================================================================
   Fall-Seite: Ausgaben-Redesign (Bonusrechner-Look, Alex 2026-07-30)
   Kennzahl-Kacheln + zeilenbasierte Ausgaben-Liste je Konto (löst das gequetschte
   4-Spalten-Grid ab). Live-Rechnung in app.js (reine Anzeige). Nur Tokens.
   Spec: wissen/design-system.md §Fall-Seite.
   ========================================================================== */

/* Section-/Personen-Überschrift in Dunkellila (18px/700). */
.fall-titel { margin: 0 0 var(--sp-4); font-size: var(--fs-h2); font-weight: var(--fw-bold); color: var(--fall-titel-fg); }

/* Kennzahl-Kacheln (Haushalts-Ergebnis) — 4er-Grid weißer Kacheln auf der Creme-Karte. */
.fall-kennzahlen { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: var(--sp-3); }
.fall-kennzahl { background: var(--fall-kennzahl-bg); border: 1px solid var(--fall-kennzahl-bd); border-radius: var(--r-md); padding: 14px 18px; }
.fall-kennzahl__label { font-size: 12.5px; color: var(--c-text-muted); margin-bottom: var(--sp-1); }
.fall-kennzahl__wert { font-size: 19px; font-weight: var(--fw-bold); color: var(--c-text); font-variant-numeric: tabular-nums; }
.fall-kennzahl__einheit { font-size: 12.5px; font-weight: var(--fw-medium); color: var(--c-text-muted); }
/* Ersparnis-Kachel — Grün-Ausnahme (wie im Konzept). */
.fall-kennzahl--spar { background: var(--c-spart-bg); border-color: var(--c-spart); }
.fall-kennzahl--spar .fall-kennzahl__label,
.fall-kennzahl--spar .fall-kennzahl__wert,
.fall-kennzahl--spar .fall-kennzahl__einheit { color: var(--c-spart); }
@media (max-width: 720px) { .fall-kennzahlen { grid-template-columns: repeat(2, minmax(0, 1fr)); } }

/* Kopfzeile der Ausgaben-Sektion: Eyebrow links, Hinweis rechts. */
.fall-ausgaben-kopf { display: flex; align-items: baseline; justify-content: space-between; gap: var(--sp-4); margin: var(--sp-6) 0 var(--sp-2); flex-wrap: wrap; }
.fall-ausgaben-kopf .eyebrow { margin: 0; }
.fall-ausgaben-hint { font-size: var(--fs-sm); color: var(--c-text-muted); }
.fall-ausgaben-hint__oder { color: var(--kk-ink-faint); }

/* Weiße Liste, EINE Zeile pro Konto (kein Nebeneinander-Grid mehr). */
.konto-liste { display: flex; flex-direction: column; background: var(--c-surface); border: 1px solid var(--konto-liste-bd); border-radius: var(--r-md); overflow: hidden; }
.konto-row { display: flex; flex-wrap: wrap; align-items: center; gap: var(--sp-2) var(--sp-3); padding: 13px var(--sp-5); border-bottom: 1px solid var(--konto-trenner); }
.konto-row__info { flex: 1 1 240px; min-width: 240px; display: flex; align-items: flex-start; gap: var(--sp-3); }
.konto-row__icon { width: 34px; height: 34px; flex: none; display: inline-flex; align-items: center; justify-content: center; border-radius: var(--r-sm); background: var(--fall-icon-bg); color: var(--fall-icon-fg); }
.konto-row__icon svg { width: 19px; height: 19px; display: block; }
.konto-row__name { font-size: 14.5px; font-weight: var(--fw-semibold); color: var(--c-text); }
.konto-row__hint { margin-top: 2px; font-size: 12.5px; color: var(--c-text-muted); max-width: 340px; }
.konto-row__summary { margin-top: 2px; font-size: 12.5px; color: var(--fall-summary-fg); }
.konto-row__summary:empty { display: none; }

/* Eingabe-Cluster rechts — bricht als Ganzes um (nicht innerhalb). */
.konto-row__cluster { display: flex; align-items: center; gap: var(--sp-2); flex: 0 1 auto; flex-wrap: wrap; }
.konto-input { width: 50px; background: var(--konto-input-bg); border: 1px solid var(--c-border); border-radius: var(--r-sm); padding: 10px 0; font: inherit; font-size: 14.5px; color: var(--c-text); text-align: center; font-variant-numeric: tabular-nums; }
.konto-input--betrag { width: 62px; }
.konto-input--direkt { width: 70px; }
.konto-input:focus { outline: none; border-color: var(--field-focus); box-shadow: 0 0 0 3px var(--c-focus-ring); }
.konto-row__unit { font-size: 12.5px; color: var(--c-text-muted); white-space: nowrap; }
.konto-row__faint { color: var(--kk-ink-faint); }
.konto-row__oder { font-size: var(--fs-caption); font-weight: var(--fw-semibold); color: var(--kk-ink-faint); text-transform: uppercase; margin: 0 var(--sp-1); }
.konto-row__result { min-width: 64px; margin-left: var(--sp-1); text-align: right; font-size: 14.5px; font-weight: var(--fw-bold); color: var(--c-text); font-variant-numeric: tabular-nums; }
.konto-row__result[data-leer="1"] { color: var(--kk-ink-faint); }

/* Summenzeile — violett getönt, volle Breite unten. */
.konto-summe { display: flex; align-items: center; justify-content: space-between; gap: var(--sp-4); padding: 14px var(--sp-5); background: var(--konto-summe-bg); }
.konto-summe__label { font-size: 14px; font-weight: var(--fw-semibold); color: var(--konto-summe-fg); }
.konto-summe__wert { font-size: 16px; font-weight: var(--fw-bold); color: var(--konto-summe-fg); font-variant-numeric: tabular-nums; }

/* Speichern-Zeile: Button + Ergebnis-Hinweis rechts. */
.fall-speichern { display: flex; align-items: center; justify-content: space-between; gap: var(--sp-4); margin-top: var(--sp-6); flex-wrap: wrap; }

/* „Person hinzufügen"-Karte: Titel links, Ghost-Button rechts. */
.fall-add { display: flex; align-items: center; justify-content: space-between; gap: var(--sp-4); flex-wrap: wrap; }
.fall-add__titel { margin: 0 0 2px; font-size: var(--fs-h3); font-weight: var(--fw-bold); color: var(--fall-titel-fg); }
.fall-add__sub { font-size: var(--fs-sm); color: var(--c-text-muted); }

/* Unter ~760px: der Eingabe-Cluster rutscht als Block unter den Konto-Namen. */
@media (max-width: 760px) {
  .konto-row__info { flex-basis: 100%; }
  .konto-row__cluster { flex-basis: 100%; padding-left: calc(34px + var(--sp-3)); }
  .konto-row__result { margin-left: auto; }
}

/* ============================================================================
   Konzept-Edit-Modal (Design-Handoff „Edit-Modal", 2026-07-30)
   720px, Flex-Spalte: Kopf fix, Inhalt scrollt intern. Die Tarif-/Versicherer-
   Auswahl ist eine Inline-Suchliste (kein schwebendes Dropdown → nichts wird
   mehr aus dem Modal geclippt). Spec: wissen/design-system.md §Edit-Modal.
   ========================================================================== */
.modal__box--edit { width: var(--modal-box-w-edit); max-width: calc(100vw - 48px); max-height: 90vh; display: flex; flex-direction: column; overflow: hidden; gap: 0; padding: 0; }
.modal__box--edit .kg-modal__kopf { flex: none; padding: var(--sp-5) var(--sp-6); margin: 0; border-bottom: 1px solid var(--c-border-soft); }
/* Tarif-Duell (kvd): MUSS nach der .modal__box-Basis stehen — gleiche Spezifität,
   die spätere Regel gewinnt (sonst greift die 420px-Basisbreite). */
.modal__box--duell { width: var(--modal-box-w-duell); max-width: calc(100vw - 48px); max-height: 92vh; overflow-y: auto; padding: 0 0 var(--sp-5); }
/* Baustein-Vergleich k2 (Prototyp: 1060px) — Öffner setzt data-tarif-modal-breite. */
.modal__box--k2-cmp { width: var(--k2-modal-w-cmp); max-width: calc(100vw - 48px); max-height: 86vh; overflow-y: auto; }
/* Broschüren-Overlay (Owner 31.08.): breite, hohe Box — der eingebettete
   PDF-Viewer braucht Fläche; gleiche Breiten-Basis wie das Vergleichs-Modal. */
.modal__box--broschuere { width: var(--k2-modal-w-cmp); max-width: calc(100vw - 48px); max-height: 92vh; overflow-y: auto; display: flex; flex-direction: column; }
.modal__box--edit .baustein--modal { flex: 1; min-height: 0; display: flex; flex-direction: column; }
/* overflow-x hidden: das Modal scrollt NUR vertikal (Owner 2026-08-05) —
   Inhalte müssen sich der Breite fügen (Ellipsis/Umbruch), nie die Nutzerin
   horizontal suchen lassen. */
.modal__box--edit .baustein__body { flex: 1; min-height: 0; overflow-y: auto; overflow-x: hidden; padding: var(--sp-5) var(--sp-6) var(--sp-6); display: flex; flex-direction: column; gap: var(--sp-4); }

/* Inline-Auswahlliste: Suchfeld (fix) + scrollende Radio-Karten. */
.tarifliste { display: flex; flex-direction: column; gap: var(--sp-2); min-height: 0; }
.tarifliste__suche { width: 100%; box-sizing: border-box; height: var(--field-h); padding: 0 14px; border: 1px solid var(--field-bd); border-radius: var(--r-md); background: var(--c-bg); color: var(--c-text); font: inherit; font-size: var(--fs-sm); }
.tarifliste__suche:focus { outline: none; border-color: var(--c-focus); box-shadow: 0 0 0 3px var(--c-focus-ring); background: var(--c-surface); }
/* Spur hart auf Containerbreite geklemmt (minmax(0,1fr)): EIN überbreites
   Element (z. B. langer Quelltext im ℹ-Raster) würde sonst den geteilten
   Grid-Track und damit ALLE Trefferkarten aufspannen → Horizontal-Scroll im
   Modal (Owner-Befund 2026-08-05: „nur nach unten scrollen"). */
.tarifliste__scroll { display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--sp-1); max-height: 42vh; overflow-y: auto; padding: 2px; margin: 0; }
/* Im Edit-Modal KEIN Scroll-im-Scroll (Owner 2026-08-10: „viel zu eng, kaum
   navigierbar" — nur ~2 Zeilen sichtbar): die Trefferliste fließt frei in voller
   Länge, die EINE Scrollfläche nach unten ist .baustein__body — gleiche Regel
   wie die Bestand-Suche ([data-bestand-suche], Owner-Befund 04.08.). */
.modal__box--edit .tarifliste { flex: none; min-height: auto; }
.modal__box--edit .tarifliste__scroll { max-height: none; overflow: visible; }
/* Gesperrter Tarif (Owner 2026-09-03): der Versicherer nimmt die erfasste Zahl
   fehlender Zaehne nicht mehr an. Bewusst SICHTBAR statt versteckt — gedaempft
   und nicht klickbar, Konvention wie .btn:disabled / .tarifduell-wahl__karte. */
.tarifopt.is-gesperrt { opacity: .5; cursor: not-allowed; }
.tarifopt.is-gesperrt input[disabled] { pointer-events: none; }
.tarifopt { position: relative; display: flex; align-items: center; gap: var(--sp-3); padding: 10px 12px; border: 1px solid var(--c-border); border-radius: var(--r-md); background: var(--c-surface); cursor: pointer; }
.tarifopt:hover { border-color: var(--c-accent-2); }
.tarifopt.is-sel { border-color: var(--c-primary); background: var(--kk-violet-50); box-shadow: inset 0 0 0 1px var(--c-primary); }
.tarifopt input { position: absolute; opacity: 0; width: 1px; height: 1px; pointer-events: none; }
.tarifopt__logo { width: 32px; height: 20px; flex: none; object-fit: contain; }
.tarifopt__mono { width: 32px; height: 20px; flex: none; display: inline-flex; align-items: center; justify-content: center; border-radius: 6px; background: var(--c-surface-muted); color: var(--c-text-muted); font-size: 10px; font-weight: var(--fw-bold); }
.tarifopt__text { flex: 1; min-width: 0; display: flex; flex-direction: column; }
.tarifopt__name { font-size: 13.5px; font-weight: var(--fw-semibold); color: var(--c-text); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.tarifopt__sub { font-size: var(--fs-caption); color: var(--c-text-muted); }
.tarifopt__badge { flex: none; padding: 2px 8px; border-radius: var(--r-full); background: var(--kk-violet-100); color: var(--c-primary); font-size: 10.5px; font-weight: var(--fw-bold); white-space: nowrap; }
.tarifopt__preis { flex: none; min-width: 72px; text-align: right; font-size: 13.5px; font-weight: var(--fw-bold); font-variant-numeric: tabular-nums; white-space: nowrap; }
/* „★ Empfohlen" — profil-optimaler Tarif (Design-Handoff 2026-07-30). Ersparnis-Grün
   signalisiert „bestes Preis-Leistungs-Verhältnis fürs Nutzungsprofil". */
.tarifopt__empf { flex: none; padding: 2px 8px; border-radius: var(--r-full); background: var(--c-spart-bg); color: var(--c-spart); font-size: 10.5px; font-weight: var(--fw-bold); white-space: nowrap; }
.tarifopt.is-sel .tarifopt__empf { background: var(--c-surface); }
.tarifopt[hidden] { display: none; }

/* Bestandsvertrag: ℹ-Aufklapper je Treffer + Eckdaten-Panel (Owner 2026-08-04) */
.tarifopt-wrap { display: flex; flex-direction: column; }
.tarifopt__aufklapp { width: 26px; height: 26px; flex: none; display: inline-flex; align-items: center; justify-content: center; border: 1px solid var(--c-border); border-radius: var(--r-full); background: var(--c-surface); color: var(--c-primary); font-weight: var(--fw-bold); cursor: pointer; }

.tarifopt__aufklapp:hover { border-color: var(--c-primary); background: var(--kk-violet-50); }
.tarifopt__detail { margin: var(--sp-1) 0 var(--sp-2); padding: var(--sp-3); border: 1px solid var(--c-border-soft); border-radius: var(--r-md); background: var(--c-surface-muted); }
.tarifopt__detail[hidden] { display: none; }
.bestand-detail__preis { margin: 0 0 var(--sp-2); font-size: 13.5px; }
.bestand-detail__preishinweis { color: var(--c-text-muted); font-size: var(--fs-caption); font-weight: var(--fw-regular); }
/* ── Bestandsvertrag-Picker rev. 2 (Handoff „Klickbarer Prototyp Zahn-Modal") ──
   Trefferkarte = Kopfzeile + verdichtete 6-Kopfwerte; Auswahl via :has(:checked);
   Stufe 2 (ℹ) = .bestand-raster „Was übernimmt dieser Vertrag?". */
/* Treffer fließen FREI — kein inneres Mini-Scrollfenster: die hohen Kopfwerte-
   Karten wären sonst angeschnitten (Name/Preis weggescrollt, Owner-Befund 04.08.);
   Edit-Modal bzw. Seite scrollen selbst. Attribut-Selektor schlägt die
   .tarifliste__scroll-Basis über Spezifität (reihenfolge-unabhängig). */
[data-bestand-suche] .tarifliste__scroll { max-height: none; overflow: visible; gap: var(--sp-2); }
/* …und der Suchblock darf im Modal-Flex NICHT schrumpfen (min-height:0 + shrink
   quetschten ihn zusammen — die Karten malten über Freitext/Chip, Owner-Befund):
   volle Inhaltshöhe behalten, scrollen tut der .baustein__body. */
[data-bestand-suche] { flex: none; min-height: auto; }
.bestand-gruppe { margin: var(--sp-2) 0 0; display: flex; align-items: baseline; justify-content: space-between; gap: var(--sp-3); font-size: var(--fs-caption); font-weight: var(--fw-semibold); color: var(--c-text-muted); text-transform: uppercase; letter-spacing: .04em; }
.bestand-gruppe__zusatz { text-transform: none; letter-spacing: 0; font-weight: var(--fw-regular); }
.bestand-treffer { display: flex; flex-direction: column; border: 1px solid var(--c-border); border-radius: var(--r-md); background: var(--c-surface); }
.bestand-treffer:hover { border-color: var(--c-accent-2); }
.bestand-treffer:has(input:checked) { border-color: var(--c-primary); background: var(--kk-violet-50); box-shadow: inset 0 0 0 1px var(--c-primary); }
.bestand-treffer__klick { position: relative; display: flex; flex-direction: column; gap: var(--sp-2); padding: 10px 12px; cursor: pointer; }
.bestand-treffer__klick input { position: absolute; opacity: 0; width: 1px; height: 1px; pointer-events: none; }
.bestand-treffer__kopf { display: flex; align-items: center; gap: var(--sp-3); }
.bestand-treffer__preishinweis { flex: none; font-size: var(--fs-caption); color: var(--c-text-soft); white-space: nowrap; }
.bestand-treffer__kernwerte { display: grid; grid-template-columns: repeat(var(--bestand-kern-cols), minmax(0, 1fr)); gap: var(--sp-2) var(--sp-3); }
.bestand-treffer__paar { display: flex; flex-direction: column; min-width: 0; }
.bestand-treffer__label { font-size: 10.5px; color: var(--c-text-muted); }
.bestand-treffer__wert { font-size: 12.5px; font-weight: var(--fw-bold); font-variant-numeric: tabular-nums; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.bestand-treffer__wert.is-leer { color: var(--c-text-soft); font-weight: var(--fw-regular); }
.bestand-treffer .tarifopt__detail { margin: 0 12px 10px; }

/* Vollraster (Stufe 2) — feste Zeilen, Gruppen mit Lila-Trennlinie */
.bestand-raster { background: var(--bestand-raster-bg); border-radius: var(--r-sm); padding: var(--sp-2) var(--sp-3); }
.bestand-raster__titel { margin: 0 0 var(--sp-2); display: flex; align-items: baseline; justify-content: space-between; gap: var(--sp-3); font-size: 13px; font-weight: var(--fw-semibold); }
.bestand-raster__hinweis { font-size: var(--fs-caption); font-weight: var(--fw-regular); color: var(--c-text-muted); white-space: nowrap; }
.bestand-raster__gruppe { margin-top: var(--sp-3); }
.bestand-raster__kat { margin: 0 0 var(--sp-1); padding-bottom: 2px; border-bottom: 1px solid var(--c-accent-2); font-size: var(--fs-caption); font-weight: var(--fw-semibold); color: var(--c-text-muted); text-transform: uppercase; letter-spacing: .04em; }
.bestand-raster__zeile { display: flex; gap: var(--sp-3); align-items: baseline; justify-content: space-between; padding: 1px 0; }
.bestand-raster__label { flex: none; width: var(--bestand-label-w); max-width: 60%; font-size: var(--fs-caption); color: var(--c-text-muted); }
.bestand-raster__wert { font-size: 13px; font-weight: var(--fw-semibold); text-align: right; font-variant-numeric: tabular-nums; min-width: 0; overflow-wrap: anywhere; }
.bestand-raster__wert.is-leer { color: var(--c-text-soft); font-weight: var(--fw-regular); }
.bestand-raster__fuss { margin: var(--sp-3) 0 0; font-size: var(--fs-caption); color: var(--c-text-muted); }

/* Zugeordneter Bestandsvertrag: flache Karte + Kopfwerte (Handoff §1.1(2)) */
.bestand-zugeordnet { display: flex; flex-direction: column; gap: var(--sp-2); padding: 10px 12px; border: 1px solid var(--c-primary); border-radius: var(--r-md); background: var(--kk-violet-50); }
.bestand-zugeordnet .tarifopt__sub { white-space: normal; }
.bestand-filter .input--jahr { min-width: 132px; }

/* ============================================================================
   Backoffice-Vorschau (bo-*) — Stammdaten-Editor mit adaptiver Live-Vorschau +
   Wirkungs-Legende (Design-Handoff „Backoffice Stammdaten Vorschau", 2026-07-30).
   Client-seitig gerendert von js/admin_vorschau.js. Nur Tokens, keine Rohfarben.
   ========================================================================== */
@keyframes bo-puls { 0% { opacity: 0; transform: translateY(-2px); } 15% { opacity: 1; transform: none; } 80% { opacity: 1; } 100% { opacity: 0; } }

.bo-noscript { padding: var(--sp-4) var(--sp-5); background: var(--c-warning-bg); color: var(--c-warning-text); border-radius: var(--r-md); }

/* Kategorie-Tabs (welche Stammdaten-Art wird vorgeschaut) */
.bo-tabs { display: flex; flex-wrap: wrap; gap: var(--sp-2); margin-bottom: var(--sp-5); }
.bo-tab { padding: 7px 15px; border-radius: var(--r-full); border: 1px solid var(--c-border); background: var(--c-surface); color: var(--c-text-muted); font: inherit; font-size: var(--fs-sm); font-weight: var(--fw-semibold); cursor: pointer; }
.bo-tab:hover { border-color: var(--kk-violet-300); color: var(--c-primary); }
.bo-tab.is-active { background: var(--c-primary); border-color: var(--c-primary); color: var(--c-text-on-accent); }

/* Modus-Umschalter (Auto / Andocken / Groß) */
.bo-modus { display: flex; align-items: center; gap: var(--sp-2); margin-bottom: var(--sp-4); }
.bo-modus__lbl { font-size: var(--fs-caption); color: var(--c-text-soft); }
.bo-chip { padding: 5px 13px; border-radius: var(--r-full); border: 1px solid var(--c-border); background: var(--c-surface); color: var(--c-text-muted); font: inherit; font-size: var(--fs-caption); font-weight: var(--fw-semibold); cursor: pointer; }
.bo-chip.is-active { background: var(--c-primary); border-color: var(--c-primary); color: var(--c-text-on-accent); }

/* Bühne: Editor + Vorschau nebeneinander, unter ~1000px untereinander */
.bo-stage { display: flex; flex-wrap: wrap; gap: var(--sp-6); align-items: flex-start; }
.bo-col-editor { flex: 1 1 0; min-width: 340px; }
.bo-col-preview { flex: 0 0 340px; min-width: 300px; max-width: 100%; position: sticky; top: var(--sp-6); }
.bo-col-preview.is-split { flex: 1 1 58%; }

/* Listen */
.bo-listhead { display: flex; align-items: center; justify-content: space-between; gap: var(--sp-3); margin-bottom: var(--sp-4); }
.bo-listtitle { margin: 0; font-size: var(--fs-h2); font-weight: var(--fw-bold); color: var(--c-text); }
.bo-list { display: grid; gap: var(--sp-2); }
.bo-row { display: flex; align-items: center; gap: var(--sp-3); padding: var(--sp-3) var(--sp-4); background: var(--c-surface); border: 1px solid var(--kk-violet-tile-bd); border-radius: var(--r-md); cursor: pointer; text-align: left; font: inherit; width: 100%; }
.bo-row:hover { border-color: var(--kk-violet-300); background: var(--kk-bo-row-hover); }
.bo-row__main { flex: 1; min-width: 0; }
.bo-row__name { font-size: var(--fs-body); font-weight: var(--fw-bold); color: var(--c-text); }
.bo-row__sub { font-size: var(--fs-caption); color: var(--c-text-soft); }
.bo-row__go { flex: none; font-size: var(--fs-sm); font-weight: var(--fw-semibold); color: var(--c-primary); white-space: nowrap; }
.bo-listnote { margin-top: var(--sp-3); font-size: var(--fs-caption); color: var(--c-text-soft); }

/* Editor-Kopf */
.bo-edithead { display: flex; align-items: center; justify-content: space-between; gap: var(--sp-3); margin-bottom: var(--sp-4); }
.bo-edithead__l { display: flex; align-items: center; gap: var(--sp-3); min-width: 0; }
.bo-back { flex: none; padding: 5px 12px; border: 1px solid var(--kk-violet-tile-bd); border-radius: var(--r-full); background: var(--c-surface); color: var(--c-text-muted); font: inherit; font-size: var(--fs-caption); font-weight: var(--fw-semibold); cursor: pointer; white-space: nowrap; }
.bo-edittitle { margin: 0; font-size: var(--fs-h2); font-weight: var(--fw-bold); color: var(--c-text); }
.bo-draft { flex: none; font-size: var(--fs-caption); font-weight: var(--fw-semibold); color: var(--c-text-soft); background: var(--c-bg); border-radius: var(--r-full); padding: 3px 10px; white-space: nowrap; }

/* Erklär-Box (Neu-Modus) */
.bo-erk { display: flex; gap: var(--sp-3); align-items: flex-start; padding: 11px 14px; margin-bottom: var(--sp-4); background: var(--kk-violet-50); border: 1px solid var(--kk-violet-bd); border-radius: var(--r-sm); }
.bo-erk__q { flex: none; width: 20px; height: 20px; border-radius: var(--r-full); background: var(--kk-violet-100); color: var(--c-primary); display: inline-flex; align-items: center; justify-content: center; font-size: var(--fs-caption); font-weight: var(--fw-bold); }
.bo-erk__t { margin: 0; font-size: var(--fs-sm); color: var(--kk-bo-ink-2); line-height: 1.55; }

/* Formular-Gitter (nutzt sonst .field/.label/.input/.select) */
.bo-grid2 { display: grid; grid-template-columns: 1fr 1fr; gap: var(--sp-3); }
.bo-span2 { grid-column: 1 / -1; }
.bo-hint { grid-column: 1 / -1; font-size: var(--fs-caption); color: var(--c-text-soft); }

/* Alterspreis-Box */
.bo-preisbox { margin-top: var(--sp-4); padding: var(--sp-3) var(--sp-4); background: var(--c-surface); border: 1px solid var(--kk-violet-tile-bd); border-radius: var(--r-sm); }
.bo-preisbox__head { display: flex; align-items: center; justify-content: space-between; gap: var(--sp-3); margin-bottom: var(--sp-2); }
.bo-preisbox__lbl { font-size: var(--fs-caption); font-weight: var(--fw-bold); color: var(--c-text-muted); letter-spacing: .04em; }
.bo-subbtn { padding: 5px 12px; border-radius: var(--r-full); border: 1px solid var(--kk-violet-bd); background: var(--kk-violet-50); color: var(--c-primary); font: inherit; font-size: var(--fs-caption); font-weight: var(--fw-semibold); cursor: pointer; }
.bo-preisrow { display: flex; align-items: center; justify-content: space-between; gap: var(--sp-3); padding: 7px 10px; background: var(--kk-bo-chrome); border-radius: var(--r-sm); font-size: var(--fs-body); }
.bo-preisrow__preis { font-weight: var(--fw-bold); font-variant-numeric: tabular-nums; }

/* Warn-/Lücke-Box (Editor + Vorschau) */
.bo-warn { display: flex; align-items: center; gap: var(--sp-2); padding: 9px 11px; background: var(--c-error-bg); border: 1px solid var(--kk-error-bd); border-radius: var(--r-sm); font-size: var(--fs-sm); font-weight: var(--fw-semibold); color: var(--c-error); }
.bo-warn--dash { border-style: dashed; border-radius: var(--r-md); }

/* Wirkungs-Legende */
.bo-legend { margin-top: var(--sp-4); padding: var(--sp-3) var(--sp-4); background: var(--kk-violet-50); border: 1px solid var(--kk-violet-100); border-radius: var(--r-sm); }
.bo-legend__h { font-size: var(--fs-caption); font-weight: var(--fw-bold); color: var(--c-primary); margin-bottom: var(--sp-2); }
.bo-legend__tags { display: flex; flex-wrap: wrap; gap: var(--sp-2); }
.bo-legend__intern { font-size: var(--fs-sm); color: var(--c-text-soft); }
.bo-tag { display: inline-flex; align-items: center; gap: var(--sp-2); padding: 4px 10px 4px 4px; border-radius: var(--r-full); background: var(--c-surface); border: 1px solid var(--kk-violet-100); font-size: var(--fs-caption); color: var(--c-text-muted); }
.bo-tag__reg { width: 18px; height: 18px; border-radius: var(--r-full); display: inline-flex; align-items: center; justify-content: center; font-size: 10.5px; font-weight: var(--fw-bold); }
.bo-tag__reg--k { background: var(--kk-violet-100); color: var(--c-primary); }
.bo-tag__reg--z { background: var(--c-success-bg); color: var(--c-success); }

.bo-actions { display: flex; gap: var(--sp-3); margin-top: var(--sp-4); }

/* ---- Vorschau-Bereich ---- */
.bo-persona { display: flex; align-items: center; gap: var(--sp-2); padding: 9px 13px; background: var(--kk-shell); border: 1px solid var(--kk-shell-bd); border-radius: var(--r-md) var(--r-md) 0 0; border-bottom: 0; }
.bo-persona__av { width: 26px; height: 26px; flex: none; border-radius: var(--r-full); background: var(--kk-violet-100); color: var(--c-primary); display: inline-flex; align-items: center; justify-content: center; font-size: 11px; font-weight: var(--fw-bold); }
.bo-persona__txt { flex: 1; min-width: 0; font-size: var(--fs-caption); color: var(--c-text); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.bo-persona__tag { flex: none; font-size: 10.5px; color: var(--c-text-soft); white-space: nowrap; }

.bo-frame { background: var(--c-surface); border: 1px solid var(--kk-shell-bd); border-radius: 0 0 var(--r-md) var(--r-md); overflow: hidden; }
.bo-frame__bar { display: flex; align-items: center; gap: var(--sp-2); padding: 7px 13px; background: var(--kk-bo-chrome); border-bottom: 1px solid var(--kk-bo-chrome-bd); }
.bo-dots { display: inline-flex; gap: 4px; }
.bo-dots span { width: 7px; height: 7px; border-radius: 50%; background: var(--kk-bo-dot); }
.bo-frame__reg { font-size: 11px; font-weight: var(--fw-bold); letter-spacing: .05em; text-transform: uppercase; color: var(--c-primary); }
.bo-frame__spacer { flex: 1; }
.bo-frame__puls { font-size: 10.5px; font-weight: var(--fw-bold); color: var(--c-success); animation: bo-puls 1s ease forwards; }
.bo-frame__draft { font-size: 10.5px; color: var(--c-text-soft); }
.bo-frag { padding: var(--sp-4); background: var(--kk-bo-fragment); display: grid; gap: var(--sp-4); }
.bo-fraglabel { font-size: 10.5px; font-weight: var(--fw-bold); letter-spacing: .05em; color: var(--c-text-soft); margin-bottom: var(--sp-2); }

/* Bearbeitungs-Ring (auf dem gerade geänderten Vorschau-Element) */
.is-editing { box-shadow: 0 0 0 2px var(--c-accent); border-radius: var(--r-sm); }
.bo-editbadge { font-size: 9.5px; font-weight: var(--fw-bold); color: var(--c-primary); background: var(--kk-violet-100); border-radius: var(--r-full); padding: 2px 7px; white-space: nowrap; }

/* Fragment: Lebenslagen-Kachel (Konten) */
.bo-kachel { background: var(--c-surface); border: 1px solid var(--kk-violet-tile-bd); border-radius: var(--r-md); padding: var(--sp-4); box-shadow: var(--sh-card); }
.bo-kachel__head { display: flex; align-items: center; gap: var(--sp-2); margin-bottom: var(--sp-2); }
.bo-kachel__ico { width: 34px; height: 34px; flex: none; border-radius: var(--r-sm); background: var(--kk-violet-chip); display: inline-flex; align-items: center; justify-content: center; }
.bo-kachel__ico img { width: 20px; height: 20px; object-fit: contain; }
.bo-kachel__title { font-size: 15.5px; font-weight: var(--fw-bold); }
.bo-luecke { display: flex; align-items: center; gap: var(--sp-2); padding: 9px 11px; background: var(--c-error-bg); border: 1px solid var(--kk-error-bd); border-radius: var(--r-sm); }
.bo-luecke__tag { flex: none; padding: 2px 8px; border-radius: var(--r-full); background: var(--c-surface); color: var(--c-error); font-size: 10px; font-weight: var(--fw-bold); letter-spacing: .05em; }
.bo-luecke__txt { flex: 1; min-width: 0; font-size: var(--fs-sm); font-weight: var(--fw-semibold); color: var(--c-error); }
.bo-luecke__betrag { flex: none; font-size: var(--fs-body); font-weight: var(--fw-bold); color: var(--c-error); font-variant-numeric: tabular-nums; }

/* Fragment: Baustein-Karte (Tarife/Gesellschaften) */
.bo-bcard { display: flex; align-items: center; gap: var(--sp-2); padding: 11px 13px; background: var(--c-surface); border: 1px solid var(--kk-violet-tile-bd); border-radius: var(--r-md); box-shadow: var(--sh-card); }
.bo-bcard__logo { width: 38px; height: 16px; flex: none; object-fit: contain; }
.bo-bcard__name { flex: 1; min-width: 0; font-size: var(--fs-body); font-weight: var(--fw-bold); }
.bo-bcard__badge { flex: none; padding: 2px 8px; border-radius: var(--r-full); background: var(--kk-violet-100); color: var(--c-primary); font-size: 10.5px; font-weight: var(--fw-bold); }
.bo-bcard__preis { flex: none; font-size: var(--fs-body); font-weight: var(--fw-bold); font-variant-numeric: tabular-nums; white-space: nowrap; }
.bo-bcard__vorteile { flex: none; font-size: var(--fs-caption); color: var(--c-text-muted); white-space: nowrap; }
.bo-bullets { background: var(--c-surface); border: 1px solid var(--kk-violet-tile-bd); border-radius: var(--r-md); padding: var(--sp-3) var(--sp-4); }
.bo-bullets ul { margin: 0; padding: 0; list-style: none; display: grid; gap: var(--sp-1); font-size: var(--fs-sm); color: var(--c-text); }
.bo-bullets li { display: flex; gap: 7px; }
.bo-bullets li span[data-b] { color: var(--c-success); }

/* Fragment: GKV-Ranking + Duell */
.bo-rankrow { display: flex; align-items: center; gap: var(--sp-2); padding: 9px 12px; background: var(--c-surface); border: 1px solid var(--kk-violet-tile-bd); border-radius: var(--r-md); }
.bo-rankrow.is-me { border-color: var(--c-accent); }
.bo-rankrow__platz { flex: none; width: 18px; font-size: var(--fs-body); font-weight: var(--fw-bold); color: var(--c-text-soft); }
.bo-rankrow__name { flex: 1; min-width: 0; font-size: var(--fs-body); font-weight: var(--fw-bold); }
.bo-rankrow__zusatz { flex: none; padding: 2px 8px; border-radius: var(--r-full); background: var(--kk-violet-50); color: var(--c-primary); font-size: 10.5px; font-weight: var(--fw-semibold); font-variant-numeric: tabular-nums; }
.bo-rankrow__beitrag { flex: none; font-size: var(--fs-body); font-weight: var(--fw-bold); font-variant-numeric: tabular-nums; }
.bo-duell { display: grid; grid-template-columns: 1fr 1fr; gap: var(--sp-2); }
.bo-duell__box { border-radius: var(--r-md); padding: 10px 12px; text-align: center; }
.bo-duell__box--alt { background: var(--c-surface-muted); }
.bo-duell__box--neu { background: var(--c-success-bg); border: 1px solid var(--kk-green-bd); }
.bo-duell__lbl { font-size: var(--fs-caption); margin-bottom: 2px; }
.bo-duell__box--alt .bo-duell__lbl { color: var(--c-text-soft); }
.bo-duell__box--neu .bo-duell__lbl { color: var(--c-success); }
.bo-duell__name { font-size: var(--fs-body); font-weight: var(--fw-bold); }
.bo-duell__box--alt .bo-duell__name, .bo-duell__box--alt .bo-duell__val { color: var(--c-text-muted); }
.bo-duell__box--neu .bo-duell__name, .bo-duell__box--neu .bo-duell__val { color: var(--c-success); }
.bo-duell__val { font-size: var(--fs-h3); font-weight: var(--fw-bold); font-variant-numeric: tabular-nums; }

/* Fragment: Gesellschaft (Dropdown-Eintrag + Duell-Spaltenkopf) */
.bo-gesdrop { display: flex; align-items: center; gap: var(--sp-2); padding: 10px 12px; background: var(--c-surface); border: 1px solid var(--kk-violet-tile-bd); border-radius: var(--r-md); }
.bo-geskopf { display: flex; flex-direction: column; align-items: center; gap: var(--sp-1); padding: 10px; background: var(--c-surface); border: 1px solid var(--kk-violet-tile-bd); border-radius: var(--r-md); width: 140px; }
.bo-geskopf img { width: 56px; height: 18px; object-fit: contain; }
.bo-geskopf__name, .bo-gesdrop__name { font-size: var(--fs-sm); color: var(--c-text-muted); }
.bo-gesdrop__name { font-weight: var(--fw-bold); color: var(--c-text); }

/* Status-Toggle (GKV aktiv/inaktiv) */
.bo-statusbtn { align-self: flex-start; padding: 8px 16px; border-radius: var(--r-full); border: 1px solid transparent; font: inherit; font-size: var(--fs-body); font-weight: var(--fw-bold); cursor: pointer; }
.bo-statusbtn.is-on { background: var(--c-success-bg); color: var(--c-success); border-color: var(--kk-green-bd); }
.bo-statusbtn.is-off { background: var(--c-error-bg); color: var(--c-error); border-color: var(--kk-error-bd); }

.bo-basisnote { margin-top: var(--sp-3); font-size: 11px; color: var(--c-text-soft); line-height: 1.6; }

/* ══ Snapshot-Feedback (Snip, Karte kPDcHn7Y — Leons CRM-Muster, vibe 28501) ══
   FAB unten-LINKS (CRM-T30-Lehre: rechts ist die volle Ecke), Ruhezustand
   gedimmt, volles 44px-Target. Overlay/Rahmen/Modal werden von
   snipping-tool.js per createElement gebaut — Styles NUR hier (Design-Regel:
   kein JS-injiziertes <style>). Buttons im Modal = .btn-Klassen der Library.
   Spec: wissen/design-system.md §Snapshot-Feedback. */
.snip-fab { position: fixed; left: 24px; bottom: 24px; z-index: 900; width: 44px; height: 44px; border-radius: var(--r-full); border: none; cursor: pointer; display: flex; align-items: center; justify-content: center; color: var(--c-text-on-accent); background: var(--btn-primary-bg); box-shadow: var(--sh-card); opacity: .58; transition: opacity .15s ease-out, transform .12s ease-out; }
/* Karte 155 (Owner-Screenshot): mit App-Sidebar rueckt der FAB RECHTS neben sie —
   er ueberdeckte den Impressum-Link im Sidebar-Fuss. Die Links-Konvention
   (CRM-T30: unten-rechts ist die ueberfuellte FAB-Ecke) bleibt; der Toast
   (bottom 80px) zieht mit, sonst laege er ueber der Avatar-Zeile. Ab 900px
   (Off-Canvas-Sidebar) gilt wieder die Basis-Position. */
@media (min-width: 901px) {
  body:has(.sidebar--nav) .snip-fab,
  body:has(.sidebar--nav) .snip-toast { left: calc(var(--sidebar-w) + 24px); }
}
.snip-fab:hover, .snip-fab:focus-visible { opacity: 1; transform: translateY(-2px); background: var(--btn-primary-bg-hover); }
.snip-fab svg { width: 20px; height: 20px; }
.snip-overlay { position: fixed; inset: 0; z-index: 990; cursor: crosshair; background: var(--modal-backdrop); }
.snip-rect { position: fixed; z-index: 991; border: 2px solid var(--c-accent); background: var(--c-focus-ring); box-shadow: 0 0 0 9999px var(--modal-backdrop); pointer-events: none; }
.snip-hint { position: fixed; top: 20px; left: 50%; transform: translateX(-50%); z-index: 992; background: var(--c-text); color: var(--c-text-on-accent); font-weight: var(--fw-bold); font-size: var(--fs-body); line-height: 1.35; padding: 13px 24px; border-radius: var(--r-md); box-shadow: var(--pop-shadow); border: 2px solid var(--c-accent); max-width: min(620px, 92vw); text-align: center; pointer-events: none; }
.snip-modal-bg { position: fixed; inset: 0; z-index: 995; display: flex; align-items: center; justify-content: center; background: var(--modal-backdrop); }
.snip-modal { background: var(--c-surface); border-radius: var(--r-lg); box-shadow: var(--pop-shadow); width: min(560px, 94vw); max-height: 92vh; overflow: auto; padding: 18px 20px; color: var(--c-text); }
.snip-modal h3 { margin: 0 0 4px; font-size: var(--fs-h3); }
.snip-modal p.snip-sub { margin: 0 0 12px; color: var(--c-text-muted); font-size: var(--fs-sm); }
.snip-preview { width: 100%; max-height: 300px; object-fit: contain; border: 1px solid var(--c-border); border-radius: var(--r-md); background: var(--c-surface-muted); margin-bottom: 12px; }
.snip-modal label { display: block; font-weight: var(--fw-bold); font-size: var(--fs-sm); margin: 8px 0 3px; }
.snip-text { width: 100%; box-sizing: border-box; min-height: 92px; resize: vertical; border: 1px solid var(--c-border); border-radius: var(--r-md); padding: 10px 12px; font: inherit; color: var(--c-text); background: var(--c-surface); }
.snip-text:focus { outline: none; border-color: var(--c-focus); box-shadow: 0 0 0 3px var(--c-focus-ring); }
.snip-actions { display: flex; justify-content: flex-end; gap: var(--sp-2); margin-top: 14px; }
.snip-err { margin: 8px 0 0; color: var(--c-error); background: var(--c-error-bg); border: 1px solid var(--kk-error-bd); padding: 8px 10px; border-radius: var(--r-md); font-size: var(--fs-sm); }
.snip-toast { position: fixed; bottom: 80px; left: 24px; z-index: 999; max-width: 320px; padding: 11px 16px; border-radius: var(--r-md); font-weight: var(--fw-bold); font-size: var(--fs-sm); color: var(--c-text-on-accent); box-shadow: var(--pop-shadow); }
.snip-toast--ok { background: var(--c-success); }
.snip-toast--err { background: var(--c-error); }

/* ══ Mobile-Pass (Owner 2026-08-06: „kompletten Konzeptberater mobil optimieren") ══
   Konvention: EINE Sektion für die geräteweiten Regeln — Seiten-Spezifisches bleibt
   bei seiner Komponente. Breakpoints: 900px (App-Schale/Off-Canvas) · 767px
   (Karten/Chips/Tabellen) · 640px (Feinlayout Zeilen/Modals).
   Spec: wissen/design-system.md §Mobile.
   2026-08-12 (Responsive-Sweep): Sektion ans DATEIENDE zurückverschoben — nach ihr
   waren Komponenten-Sektionen (Bestands-Picker, Backoffice-Vorschau) angewachsen.
   Die Konvention „EINE Mobile-Sektion am Ende" gilt unverändert: neue Mobile-Regeln
   kommen HIER dazu, neue Komponenten-Sektionen DAVOR. */

/* App-Schale: Burger-Kopf + Off-Canvas-Sidebar (Markup in _sidebar.html). */
.mobil-kopf { display: none; }
.sidebar-schleier { display: none; }
@media (max-width: 900px) {
  .app-shell { display: block; }
  .mobil-kopf { position: sticky; top: 0; z-index: 70; display: flex; align-items: center; gap: var(--sp-3); padding: 10px var(--sp-4); background: var(--c-surface); border-bottom: 1px solid var(--kk-shell-bd); }
  .mobil-kopf__logo { height: 22px; width: auto; display: block; }
  .mobil-kopf__tag { font-size: var(--fs-caption); color: var(--c-text-soft); }
  .sidebar--nav { position: fixed; top: 0; bottom: 0; left: 0; width: min(320px, 86vw); z-index: 90; transform: translateX(-105%); transition: transform var(--dur-fast) var(--ease-out); overflow-y: auto; }
  .sidebar--nav.is-offen { transform: none; box-shadow: var(--sh-lg); }
  .sidebar-schleier { display: block; position: fixed; inset: 0; z-index: 80; background: var(--modal-backdrop); }
  .sidebar-schleier[hidden] { display: none; }

  /* Grund-Layout: weniger Rand, Topbars dürfen umbrechen. */
  .container { padding: var(--sp-5) var(--sp-4); }
  .app-topbar { flex-wrap: wrap; padding: 10px var(--sp-4); row-gap: var(--sp-2); }
  .app-topbar__group { flex-wrap: wrap; row-gap: var(--sp-2); }
  .privat-banner { padding: var(--sp-1) var(--sp-3); }
  .privat-banner__text { font-size: var(--fs-caption); }

  /* Konsole: Karte und Wrap kompakter; Fußzeilen-Knöpfe umbrechen. */
  .konsole-wrap { grid-template-columns: minmax(0, 1fr); padding: var(--sp-4); }
  .konsole-wrap--stepper { padding-left: var(--sp-4); padding-right: var(--sp-4); }
  .konsole-wrap--stepper .kst-karte { padding: var(--sp-4); }
  .kst-fuss { flex-wrap: wrap; }
  .kst-karte__titel { font-size: var(--fs-h2); }
}
@media (prefers-reduced-motion: reduce) { .sidebar--nav { transition: none; } }

@media (max-width: 767px) {
  /* Konzept-Präsentation: Kapitel-Chips als wischbare Reihe statt hohem Block. */
  .kr-leiste { flex-wrap: nowrap; overflow-x: auto; -webkit-overflow-scrolling: touch; padding-bottom: var(--sp-1); }
  .kr-leiste .kr-chip { flex: none; }
  .kr-leiste .kr-badge { flex: none; white-space: nowrap; }
  .km-varianten { flex-wrap: wrap; border-radius: var(--r-lg); }
  .vk-kopf { gap: var(--sp-3); padding-bottom: var(--sp-4); }
  /* Preis-Skala: Blasen kompakter, damit zwei nebeneinander passen. */
  .kr-skala__blase { padding: 3px 8px; gap: var(--sp-1); }
  .kr-skala__blase-wert { font-size: var(--fs-caption); }
  .kr-skala__blase-logo img { max-height: 12px; max-width: 40px; }
  /* Karte 166: auf dem schmalen Band beanspruchen die Blasen anteilig mehr
     Breite — die Etagen-Versetzung bleibt mobil IMMER als Berührungs-Schutz. */
  .kr-skala--eine-etage .kr-skala__band { margin-top: 132px; }
  .kr-skala--eine-etage .kr-skala__blase--neu { bottom: 70px; }
  /* Tabellen (Fälle-Liste, Backoffice): horizontal wischen statt quetschen. */
  .table-wrap { overflow-x: auto; -webkit-overflow-scrolling: touch; }
  .card .table, .admin-main .table { display: block; overflow-x: auto; }
}

@media (max-width: 640px) {
  /* Bedarfs-Zeilen (Konsole-Karte + Kundenfragen): Label über volle Breite,
     darunter ×/Jahr × € je = Summe — statt fünf gequetschter Spalten. */
  .baustein__bedarf-zeile { grid-template-columns: 6rem 14px 6rem minmax(0, 1fr); row-gap: var(--sp-1); }
  .baustein__bedarf-label { grid-column: 1 / -1; }
  .baustein__bedarf-summe { text-align: right; }
  .kst-stats { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  /* Modals füllen den Schirm fast ganz — Ränder kosten nur Platz. */
  .modal__box { width: calc(100vw - 16px); max-height: 94vh; overflow-y: auto; padding: var(--sp-4); }
  .modal__box--breit { width: calc(100vw - 16px); max-height: 94vh; }
  .gkv-aktionen { gap: var(--sp-2); }
  /* Fall-Seite: Konto-Zeile bricht sauber um, Eingaben bleiben tippbar groß. */
  .konto-row { padding: 12px var(--sp-3); }
  /* Kassen-/Tarif-Vergleich (Responsive-Sweep 12.08., Defekt 2): das
     1.2fr/2fr-Zeilenraster quetschte Titel + Box-Paar bei 375 px auf ~90-px-Boxen.
     Mobil: Titel über vollbreitem Box-Paar — das Duell (zwei Boxen nebeneinander)
     bleibt als Vergleichsbild erhalten. Leere Spacer-Zelle im Logo-Kopf raus,
     sonst entsteht eine Geister-Gap-Zeile. */
  .kvk-zeile, .kvk-kategorie__kopf, .kvk-logos { grid-template-columns: minmax(0, 1fr); }
  .kvk-logos > :empty { display: none; }
  /* Konsole-Combo (Responsive-Sweep 12.08., Defekt 3): das Kassen-Panel lief mit
     min-width:300px unter 320-px-Viewports rechts aus dem Schirm — mobil ist das
     Panel so breit wie sein Trigger. Liste anteilig statt fix 264 px tief, damit
     mehr als ~4 Treffer sichtbar sind; die Desktop-Tiefe (Owner-P2) bleibt
     C-Aufgabe, Desktop-Regeln unangetastet. */
  .combo--kassen .combo__panel { min-width: 0; }
  .combo__list { max-height: 60vh; }
  /* Backoffice-Vorschau-Bühne (Responsive-Sweep 12.08., Defekt 4): die
     Mindestbreiten 340/300 px liefen unter 320-px-Viewports aus dem Schirm —
     mobil stapeln Editor + Vorschau vollbreit. min-width schlägt max-width,
     deshalb reicht das max-width:100% der Vorschau allein nicht. Gestapelt
     klebte die Vorschau sonst sticky überm eigenen Scrollweg. */
  .bo-col-editor, .bo-col-preview { flex: 1 1 100%; min-width: 0; }
  .bo-col-preview { position: static; }
  /* App-/Konzept-Kopf kompakt (Owner-Screenshot iPhone 12.08.): Trenner + 14px-
     Gaps + nowrap-Titel ließen JEDES Topbar-Element einzeln umbrechen — ~5 Zeilen
     Chrome vor dem Inhalt. Mobil: Trenner raus, Knöpfe/Gaps kompakt, der Titel
     nimmt den Restplatz seiner Zeile (Ellipsis aus der Basisregel), der Status-
     Badge rückt per order ans Ende als eigene volle Zeile — so stehen
     „Präsentationen" und „Anträge vorbereiten" nebeneinander. Ziel: 3 kompakte
     Zeilen. */
  .app-topbar { padding: 8px var(--sp-4); row-gap: var(--sp-1); }
  .app-topbar__group { gap: var(--sp-2); }
  .app-topbar__sep { display: none; }
  .app-topbar__logo { height: 18px; }
  .app-topbar__titel { flex: 1; min-width: 0; font-size: 13px; }
  .app-topbar .btn { padding: 5px 10px; font-size: var(--fs-caption); }
  .app-topbar .badge { order: 9; flex: 1 1 100%; }
  /* Das Präsentationen-Menü ankert rechts am Knopf — links im Kopf liefe das
     300px-Panel damit aus dem Schirm; mobil links ankern. */
  .pv-menu__liste { left: 0; right: auto; }
}

/* ── Karte 151 · Runde 1 (Konsole-Sweep 21.08., Befunde B1+B2) ─────────────────
   Konvention NEU: Der Stepper-Einspalter-Breakpoint 1399px (bisher nur in
   §Konsole-Stepper) ist jetzt benannte Zonen-Grenze — design-system
   §Responsive-Zonen. Nur additive Regeln, Desktop ≥1500 unangetastet. */
/* B1 (768–1399): Der Einspalter erbte die Vor-Stepper-Regel „Bilanz zuerst"
   (≤1199, order:-1) — die VOLLE Bilanz verdrängte Stepper + Schritt-Karte
   (Owner-Screenshot /beratung/39). Jetzt: Arbeitsbereich zuerst, volle Bilanz
   als Detail ans Ende, das Live-Feedback übernimmt die fixe Bilanz-Bar. */
@media (min-width: 768px) and (max-width: 1399px) {
  .konsole-wrap--stepper .bilanz-spalte { order: 9; position: static; }
  .konsole-wrap--stepper .bilanz-bar { display: flex; }
  .konsole-wrap--stepper { padding-bottom: 120px; }
}
/* B2 (Drei-Spalten-Layout ab 1400): kv-Zeilen sprengten die 312px-Bilanz
   horizontal (Karte-147-Icons + nowrap-Wert → Seite scrollte 22px) — das
   Label darf brechen, die Zeile notfalls umbrechen. */
@media (min-width: 1400px) {
  .bilanz-spalte .kv { flex-wrap: wrap; }
  .bilanz-spalte .kv__label { min-width: 0; overflow-wrap: anywhere; }
  /* Umgebrochene Werte bleiben rechtsbuendig (Zahlenbild). */
  .bilanz-spalte .kv__value { margin-left: auto; }
}

/* ── Karte 151 · Runde 2 (Befunde B3+B5): Konsole-Topbar kompakt ──────────────
   B3 (≤640, Owner-Anhang 2): die 12.08.-Kompaktregel (fürs Konzept gebaut)
   machte in der Konsole aus JEDEM Badge eine volle Zeile (auch „1 Person")
   und die Varianten-Chips stapelten (~180px Kopf). Neutrale Badges bleiben
   inline in der Titelzeile, NUR der Status-Badge (--spart) behält die eigene
   Schlusszeile; die Varianten-Chips werden EINE wischbare Zeile (Muster
   kr-leiste, Karte 122). */
@media (max-width: 640px) {
  .app-topbar .badge--neutral { order: 0; flex: 0 0 auto; }
  .app-topbar__group:has(.konzept-umschalter) { flex: 1 1 100%; min-width: 0; }
  .app-topbar .konzept-umschalter { flex-wrap: nowrap; overflow-x: auto; -webkit-overflow-scrolling: touch; max-width: 100%; padding-bottom: 2px; }
  .app-topbar .konzept-umschalter .btn,
  .app-topbar .konzept-umschalter form { flex: none; white-space: nowrap; }
}
/* B5 (768–1399, Owner-Anhang 3): die Topbar durfte nur ≤767 umbrechen — mit
   den Varianten-Chips quetschte sich der Kopf einzeilig (53px-Seiten-Overflow
   bei 1024). Die Einspalter-Zone (§Responsive-Zonen) darf geordnet umbrechen. */
@media (min-width: 768px) and (max-width: 1399px) {
  .app-topbar { flex-wrap: wrap; row-gap: var(--sp-2); }
}

/* ── Karte 154 (Owner 21.08.): horizontale Schritt-Reihe als PILLEN ──────────
   In der Einspalter-Zone (§Responsive-Zonen) standen die Schritte als frei
   fließende Textlinks nebeneinander — „unstrukturiert, nicht aligned".
   Jetzt: einheitliche Pillen-Container, gleiche Höhe, saubere Reihen-Gaps;
   die vertikale Nav (≥1400) bleibt unverändert. */
@media (max-width: 1399px) {
  .konsole-wrap--stepper .kst-nav__schritte { gap: var(--sp-2); align-items: center; }
  .konsole-wrap--stepper .kst-schritt { border: 1px solid var(--c-border-soft); border-radius: var(--r-full); background: var(--c-surface); padding: var(--sp-1) var(--sp-3); }
  .konsole-wrap--stepper .kst-schritt.is-aktiv { border-color: var(--kk-violet-bd); }
}

/* ════════════════════════════════════════════════════════════════════════════
   Konzept in zwei Schritten (k2-*) — Design-Handoff 2026-08-24 (Großprojekt).
   Neuer Konzept-Flow: Schritt 1 Ist-Situation · Schritt 2 Konzept · Abschluss.
   Dieser Block liefert die RAHMEN-Bausteine (Kopf/Stepper, Vorher/Nachher,
   Board/Rail/Fundament-Box, Detailrahmen, dunkles Band,
   Preisstrahl, Herleitungs-Tooltip, Footer) — Schritt-Detailflächen folgen mit
   den Ausbau-PRs. Konvention: wissen/design-system.md §Konzept in zwei Schritten.
   Beträge tragen IMMER .k2-wert (nowrap + tabular-nums, README-Pflicht).
   ════════════════════════════════════════════════════════════════════════════ */

/* Seiten-Rahmen (README: Hintergrund = --k2-bg, kuehler als der App-Grund) */
.k2-hintergrund { background: var(--k2-bg); min-height: 100vh; }
.k2-seite { position: relative; display: flex; flex-direction: column; gap: 14px; max-width: var(--k2-max); margin: 0 auto; padding: 22px 40px 48px; } /* Owner 2026-09-03: kompakter Kopf-Bereich */

/* Kopf: Kicker / Titel / Untertitel + Schritt-Punkte rechts */
.k2-kopf { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 10px; }
.k2-kopf__spalte { display: flex; flex-direction: column; gap: 2px; }
/* KassenKompass-Wortmarke oben links (Owner 2026-09-07). Sitzt ABSOLUT neben
   dem Container, nicht in der Kopfspalte: im Fluss haette sie Kicker, Titel und
   das ganze Konzept nach unten geschoben. Der Platz links neben k2-seite ist
   bei breitem Fenster ohnehin leer. */
.k2-marke { position: absolute; right: 100%; top: 26px; margin-right: 18px; height: var(--marke-h-kopf); width: auto; }
/* Schmales Fenster: kein Platz mehr daneben — dann zurueck in den Fluss,
   statt aus dem Bild zu laufen. */
@media (max-width: 1420px) {
  .k2-marke { position: static; margin: 0 0 12px; }
}
/* Siegel im k2-Kopf (Owner 2026-08-25): rechts neben dem Titel, vor dem Stepper —
   hebt das margin-left:auto der Kopf-Variante auf, der Stepper bleibt außen. */
.bekannt-aus--k2 { margin-left: auto; margin-right: 4px; }
.k2-kopf__kicker { font-size: 11px; font-weight: var(--fw-bold); color: var(--c-text-soft); text-transform: uppercase; letter-spacing: .07em; }
.k2-kopf__titel { font-size: var(--fs-h1); font-weight: var(--fw-bold); letter-spacing: -.015em; }
.k2-kopf__sub { font-size: 13px; color: var(--c-text-muted); }
.k2-stepper { display: flex; align-items: center; gap: 10px; }
.k2-stepper__punkte { display: flex; align-items: center; gap: 6px; }
.k2-stepper__punkt { width: 26px; height: 26px; display: inline-flex; align-items: center; justify-content: center; border-radius: var(--r-full); background: var(--k2-punkt-inaktiv); color: var(--c-text-muted); font-size: 12px; font-weight: var(--fw-bold); cursor: pointer; border: 0; }
.k2-stepper__punkt--aktiv { background: var(--k2-akzent); color: var(--c-text-on-accent); }
/* gedimmt, solange nicht alle Themen besucht sind (geführter Flow) */
.k2-stepper__punkt--dim { background: var(--k2-bg); color: var(--k2-dash-neutral); cursor: default; }
.k2-stepper__linie { width: 34px; height: 2px; background: var(--k2-stepper-linie); }
.k2-stepper__label { font-size: 12px; color: var(--c-text-soft); }

/* Betrag/Hover-Bausteine: jeder herleitbare Wert ist gestrichelt unterstrichen */
.k2-wert { white-space: nowrap; font-variant-numeric: tabular-nums; }
.k2-hover { position: relative; flex: none; }
.k2-hover--rechts { margin-left: auto; }
.k2-help { border-bottom: 1px dashed var(--k2-dash-neutral); cursor: help; }
.k2-help--rot { border-bottom-color: var(--k2-dash-rot); }
.k2-help--gruen { border-bottom-color: var(--k2-gruen-bd); }
.k2-help--dunkel { border-bottom-color: var(--k2-dash-dunkel); }

/* Herleitungs-Tooltip (dunkles Panel über dem Wert, rechtsbündig) */
.k2-tip { position: absolute; bottom: calc(100% + 8px); right: 0; z-index: 60; display: flex; flex-direction: column; gap: 5px; width: 280px; padding: 13px 15px; border-radius: var(--k2-radius-box); background: var(--k2-tip-bg); color: var(--c-text-on-accent); font-size: 12px; line-height: 1.45; text-align: left; white-space: normal; box-shadow: var(--k2-tip-shadow); pointer-events: none; font-weight: var(--fw-regular); }
.k2-tip__titel { font-size: 10.5px; font-weight: var(--fw-bold); color: var(--kk-violet-300); text-transform: uppercase; letter-spacing: .07em; }
.k2-tip__zeile { display: flex; justify-content: space-between; align-items: baseline; gap: 18px; }
.k2-tip__zeile-label { color: var(--k2-tip-label); }
/* Optionaler Erklaersatz unter der Summe (Owner-Design 03.09.) — greift nur,
   wenn die Herleitung ein `hinweis`-Feld traegt. */
.k2-tip__hinweis { margin-top: 4px; font-size: 11.5px; line-height: 1.45; color: var(--k2-tip-label); }
.k2-tip__summe { display: flex; justify-content: space-between; align-items: baseline; gap: 18px; margin-top: 3px; padding-top: 7px; border-top: 1px solid var(--k2-tip-trenner); font-weight: var(--fw-bold); }
/* Karte 262 (Owner-Screenshots 01.09.): Der Tooltip-Text lief RECHTS AUS dem
   280px-Panel heraus, statt umzubrechen — „Bonus der BKK GILDEMEISTER
   SEIDENSTICKER", „Behandlungskosten trägt künftig dein Baustein".
   URSACHE ist NICHT der Tooltip selbst, sondern sein Ort: Er hängt im Markup
   INNERHALB des Wertes, den er erklärt (`<span class="… k2-wert">…{{ tip() }}`),
   und `.k2-wert` setzt `white-space: nowrap`. Das vererbt sich auf den
   kompletten Panel-Inhalt — kein Wort darf umbrechen, also wächst jede Zeile
   über den Rand. Isoliert (ohne k2-wert-Elternteil) rendert dasselbe Panel
   korrekt; deshalb fiel es beim Bau nicht auf. Muster wie `.k2-tab__alt`
   (s. u.): Der Tooltip stellt den Umbruch für seinen Inhalt selbst wieder her,
   unabhängig davon, worin er hängt. Dazu `min-width: 0` gegen den
   Flexbox-Default `min-width: auto` (ein Flex-Item schrumpft sonst nie unter
   seine Inhaltsbreite) und `anywhere` für das einzelne überlange Wort. Der
   Betrag rechts bleibt bewusst einzeilig — nie „133,79 €" zerreißen. */
.k2-tip__zeile > *, .k2-tip__summe > * { min-width: 0; overflow-wrap: anywhere; }
.k2-tip .k2-wert { flex: none; white-space: nowrap; }
.k2-tip__titel { overflow-wrap: anywhere; }

/* ══ Vorher/Nachher — EINE Rechnung je Seite (Owner-Freigabe 2026-09-07) ══
   Drei Ebenen: Beitrags-Summe · Ausgaben-Container · Gesamt am Fuss.
   Der Unterschied steht als Satz darunter (k2-vn__band), nicht mehr als
   Delta-Zahl in einer Mittelspalte — daher zwei gleich breite Spalten.
   Entwurf + Begruendung: wissen/entwuerfe/ausgabenfeld/final.html. */
.k2-vn { position: relative; display: grid; grid-template-columns: 1fr 1fr; align-items: stretch; gap: 16px; }

/* ══ Gefuehrte Enthuellung (Owner-Freigabe 2026-09-07) ═══════════════════════
   PROGRESSIVE ENHANCEMENT: Ohne JavaScript steht hier nichts davon — die
   Seite zeigt dann sofort alles, wie bisher. Erst app.js setzt `k2-fuehrung`
   auf .k2-seite und damit die vier Ansichten:
     1  Konzept-Seite verdeckt (Blur + gestrichelte Linie + Aufforderung)
     2  Ergebnis gross auf der noch unscharfen Flaeche
     3  Zahl wandert ins Band, DANN erst werden die Zahlen scharf
     4  Block faehrt zusammen, das Board erscheint
   Der Zustand haengt an .k2-seite und nicht an .k2-vn, weil Band und Board
   GESCHWISTER des Blocks sind — von .k2-vn aus sind sie unerreichbar.
   Ein Blur, der ohne JS nie weggeht, waere der schlimmste Fehler dieses
   Umbaus — deshalb haengt jede Regel hier an der von JS gesetzten Klasse. */
.k2-fuehrung .k2-vn__karte--nachher > * { transition: filter .8s ease, opacity .8s ease; }
.k2-fuehrung[data-vn-ansicht="1"] .k2-vn__karte--nachher,
.k2-fuehrung[data-vn-ansicht="2"] .k2-vn__karte--nachher {
  border-style: dashed; border-width: 2px; border-color: var(--kk-violet-300);
  background: var(--k2-flaeche-aktiv); cursor: pointer;
}
.k2-fuehrung[data-vn-ansicht="1"] .k2-vn__karte--nachher > *,
.k2-fuehrung[data-vn-ansicht="2"] .k2-vn__karte--nachher > * {
  filter: blur(13px) saturate(.45); opacity: .45; pointer-events: none; user-select: none;
}
/* Der Ruf liegt ueber der unscharfen Flaeche und bleibt selbst scharf. */
.k2-vn__ruf { position: absolute; inset: 0; z-index: 3; display: flex; flex-direction: column;
              align-items: center; justify-content: center; gap: 10px; text-align: center;
              padding: 24px; transition: opacity .35s ease; }
.k2-fuehrung .k2-vn__karte--nachher > .k2-vn__ruf { filter: none; opacity: 1; }
/* Mindestens so spezifisch wie die Regel darueber, sonst gewinnt dort
   `opacity: 1` und der Ruf steht noch ueber der Ersparnis (im Browser
   gesehen, 07.09.) — Kind-Kombinator + dieselbe Klassenzahl. */
.k2-fuehrung[data-vn-ansicht="2"] .k2-vn__karte--nachher > .k2-vn__ruf,
.k2-fuehrung[data-vn-ansicht="3"] .k2-vn__karte--nachher > .k2-vn__ruf,
.k2-fuehrung[data-vn-ansicht="4"] .k2-vn__karte--nachher > .k2-vn__ruf { opacity: 0; pointer-events: none; }
.k2-vn__ruf-pfeil { font-size: 3.4rem; line-height: 1; color: var(--kk-violet-300); }
.k2-vn__ruf-titel { font-size: 1.24rem; font-weight: var(--fw-extrabold); color: var(--c-primary); }
.k2-vn__ruf-sub { font-size: 13.5px; color: var(--k2-text-2); max-width: 26ch; line-height: 1.5; }

/* Der Glanz laeuft einmal ueber die Flaeche, wenn sie sich oeffnet. */
.k2-vn__glanz { position: absolute; inset: 0; z-index: 5; pointer-events: none; opacity: 0;
                background: linear-gradient(105deg, transparent 38%, var(--c-surface) 50%, transparent 62%); }
.k2-fuehrung[data-vn-ansicht="2"] .k2-vn__glanz { animation: k2-vn-glanz 1.15s ease-out 1; }
@keyframes k2-vn-glanz {
  0%   { opacity: 0; transform: translateX(-115%); }
  18%  { opacity: .92; }
  100% { opacity: 0; transform: translateX(115%); }
}

/* Bis zum ersten Klick steht im Band noch nichts — die Zahl gehoert dort erst
   hin, nachdem sie gross auf der Flaeche stand (Owner 08.09.: sie stand vorher
   schon da, weil der Zustand auf .k2-vn lag und das Band dessen GESCHWISTER
   ist — die Regel griff nie). */
.k2-fuehrung[data-vn-ansicht="1"] .k2-vn__band,
.k2-fuehrung[data-vn-ansicht="2"] .k2-vn__band { visibility: hidden; }

/* ZWISCHENSEITE (Owner 08.09.): Bis zum letzten Klick zeigt die Seite NUR den
   Vergleich. Das Board erscheint erst, wenn der Block hochgefahren ist —
   vorher konnte man daran vorbeiscrollen und das Soll-Konzept schon sehen,
   bevor es vorgestellt war. (~~Haus der Gesundheit~~ hing bis zum 08.09. mit
   an diesen beiden Regeln und ist mit dem Haus selbst entfallen.) */
.k2-fuehrung:not([data-vn-ansicht="4"]) .k2-board { display: none; }
.k2-fuehrung[data-vn-ansicht="4"] .k2-board { animation: k2-vn-auftritt .55s ease .25s both; }
@keyframes k2-vn-auftritt {
  from { opacity: 0; transform: translateY(22px); }
  to   { opacity: 1; transform: none; }
}
@media (prefers-reduced-motion: reduce) {
  .k2-fuehrung[data-vn-ansicht="4"] .k2-board { animation: none; }
}

@media (prefers-reduced-motion: reduce) {
  .k2-fuehrung[data-vn-ansicht="2"] .k2-vn__glanz { animation: none; }
  .k2-fuehrung .k2-vn__karte--nachher > * { transition: none; }
}

/* ══ Ansicht 4 — verdichtet, waehrend der Kunde ins Konzept geht ═══════════
   WICHTIG: Hier wird NICHT alles weggeworfen. Die Gliederung bleibt stehen —
   sie ist ja gerade die Sprache, auf die wir umgestellt haben. Weg fallen nur
   die EINZELPOSITIONEN: die stehen ab hier unten in den Bausteinen, doppelt
   braucht sie niemand.
   Kein FLIP: es verschwindet echter Inhalt; max-height/opacity lassen alles
   darunter ehrlich mitwandern. */
.k2-vn__posten, .k2-vn__vers-sub, .k2-vn__ausgaben-titel {
  transition: max-height .6s cubic-bezier(.4,0,.2,1), opacity .3s ease,
              padding .6s cubic-bezier(.4,0,.2,1), margin .6s cubic-bezier(.4,0,.2,1),
              border-color .3s ease;
}
/* ⚠ BEWUSST OHNE `overflow: hidden` — in den Posten liegen Hover-Tooltips,
   und ein klippender Behaelter schneidet sie ab (Lehre 04.09., Waechter
   test_kein_neuer_behaelter_klippt_ueber_einem_tooltip; er hat genau diesen
   Fehler hier gefangen). Zum Einklappen genuegen max-height + opacity: die
   Zeile nimmt keinen Platz mehr ein und ist unsichtbar — geklippt werden muss
   dafuer nichts. pointer-events: none haelt sie ausserdem unklickbar. */
.k2-vn__posten { max-height: 200px; }
.k2-vn__vers-sub, .k2-vn__ausgaben-titel { max-height: 60px; }
.k2-vn__karte, .k2-vn__vers, .k2-vn__ausgaben, .k2-vn__gesamt {
  transition: padding .6s cubic-bezier(.4,0,.2,1), margin .6s cubic-bezier(.4,0,.2,1),
              border-color .4s ease;
}
.k2-vn__gesamt-wert, .k2-vn__vers-wert { transition: font-size .6s cubic-bezier(.4,0,.2,1); }

.k2-fuehrung[data-vn-ansicht="4"] { --k2-vn-kx: 15px; margin-top: 26px; }
.k2-fuehrung[data-vn-ansicht="4"] .k2-vn__posten {
  max-height: 0; opacity: 0; padding-top: 0; padding-bottom: 0;
  border-top-color: transparent; pointer-events: none;
}
.k2-fuehrung[data-vn-ansicht="4"] .k2-vn__vers-sub,
.k2-fuehrung[data-vn-ansicht="4"] .k2-vn__ausgaben-titel {
  max-height: 0; opacity: 0; margin: 0; padding-bottom: 0; border-bottom-color: transparent;
}
/* Der Kicker wandert UEBER die Box — das spart die ganze erste Zeile. */
.k2-fuehrung[data-vn-ansicht="4"] .k2-vn__karte { overflow: visible; padding: 14px 18px 12px; }
.k2-fuehrung[data-vn-ansicht="4"] .k2-vn__label {
  position: absolute; top: -1.55em; left: 6px; margin: 0;
}
/* EINE gemeinsame Textkante fuer alle drei Zeilen. Vorher hatte jede ihren
   eigenen Ursprung (Icon + Abstand, Container-Polster, nackte Kartenkante) —
   daher die Treppe. Icons sind hier raus: sie erzeugten genau den Versatz. */
.k2-fuehrung[data-vn-ansicht="4"] .k2-vn__vers-icon { display: none; }
.k2-fuehrung[data-vn-ansicht="4"] .k2-vn__vers {
  padding: 10px var(--k2-vn-kx); margin-bottom: 7px; gap: 10px;
}
/* Der Container zentriert seinen Inhalt SELBST, statt sich auf die Hoehe der
   eingeklappten Geschwister zu verlassen: Titel und Posten stehen dort auf
   max-height 0, aber Rest-Hoehen (Rahmen, Zeilenkasten) summierten sich und
   drueckten die Summe nach unten (Owner-Screenshot 08.09.). Mit
   flex-column + justify-content: center sitzt sie mittig, egal was daneben
   noch an Pixeln uebrig bleibt. */
.k2-fuehrung[data-vn-ansicht="4"] .k2-vn__ausgaben {
  display: flex; flex-direction: column; justify-content: center;
  min-height: 2.9em; padding: 10px var(--k2-vn-kx); margin-bottom: 7px; cursor: pointer;
}
/* Eingeklappte Zeilen nehmen keinen Platz UND keinen Rahmen mehr mit. */
.k2-fuehrung[data-vn-ansicht="4"]:not(.k2-vn--offen) .k2-vn__ausgaben-titel,
.k2-fuehrung[data-vn-ansicht="4"]:not(.k2-vn--offen) .k2-vn__posten { border-width: 0; }
/* Der Versicherungs-Block bekommt dieselbe Mindesthoehe, damit die beiden
   Zeilen als Paar wirken statt als zwei verschieden hohe Kaesten. */
.k2-fuehrung[data-vn-ansicht="4"] .k2-vn__vers { min-height: 2.9em; }
.k2-fuehrung[data-vn-ansicht="4"] .k2-vn__ausgaben:hover {
  box-shadow: inset 0 0 0 1px var(--kk-violet-300);
}
.k2-fuehrung[data-vn-ansicht="4"] .k2-vn__gesamt { padding: 9px var(--k2-vn-kx) 0; }
.k2-fuehrung[data-vn-ansicht="4"] .k2-vn__vers-name,
.k2-fuehrung[data-vn-ansicht="4"] .k2-vn__ausgaben-summe-label,
.k2-fuehrung[data-vn-ansicht="4"] .k2-vn__gesamt-label {
  font-size: 15px; font-weight: var(--fw-semibold); color: var(--c-text);
  text-transform: none; letter-spacing: 0; line-height: 1.25;
}
.k2-fuehrung[data-vn-ansicht="4"] .k2-vn__vers-wert,
.k2-fuehrung[data-vn-ansicht="4"] .k2-vn__ausgaben-summe-wert { font-size: 1.2rem; }
.k2-fuehrung[data-vn-ansicht="4"] .k2-vn__gesamt-wert { font-size: 1.7rem; }
/* Senkrecht mittig: `baseline` richtet an der Schriftlinie aus — der groessere
   Betrag laesst dabei oben mehr Luft als unten. `center` misst die Boxen. */
.k2-fuehrung[data-vn-ansicht="4"] .k2-vn__ausgaben-summe {
  align-items: center; margin: 0; padding: 0; border-top-color: transparent;
}
/* Das Plus macht die Rechnung sichtbar: Beitraege + Ausgaben = Gesamt. Nur an
   der Ausgaben-Zeile — die Kasse ist der Ausgangswert, kein Summand. */
.k2-fuehrung[data-vn-ansicht="4"] .k2-vn__ausgaben-summe-wert::before { content: "+\00A0"; }
.k2-vn__ausgaben-summe-lang { display: none; }
.k2-fuehrung[data-vn-ansicht="4"] .k2-vn__ausgaben-summe-kurz { display: none; }
.k2-fuehrung[data-vn-ansicht="4"] .k2-vn__ausgaben-summe-lang { display: inline; }
.k2-vn__ausgaben-pfeil { display: none; margin-left: 7px; font-size: .8em; transition: transform .35s ease; }
.k2-fuehrung[data-vn-ansicht="4"] .k2-vn__ausgaben-pfeil { display: inline-block; }
.k2-fuehrung[data-vn-ansicht="4"].k2-vn--offen .k2-vn__ausgaben-pfeil { transform: rotate(180deg); }

/* Aufgeklappt: dieselben Zeilen kommen zurueck — ein Klick auf den
   Ausgaben-Container, beide Seiten gemeinsam. */
.k2-fuehrung[data-vn-ansicht="4"].k2-vn--offen .k2-vn__posten {
  max-height: 200px; opacity: 1; padding-top: 9px; padding-bottom: 9px; pointer-events: auto;
}
.k2-fuehrung[data-vn-ansicht="4"].k2-vn--offen .k2-vn__karte--vorher .k2-vn__posten + .k2-vn__posten { border-top-color: var(--k2-rot-bd-leise); }
.k2-fuehrung[data-vn-ansicht="4"].k2-vn--offen .k2-vn__karte--nachher .k2-vn__posten + .k2-vn__posten { border-top-color: var(--k2-gruen-bd-leise); }
.k2-vn__karte { position: relative; display: flex; flex-direction: column; padding: 22px 24px 18px; border-radius: 18px; }
.k2-vn__karte--vorher { background: var(--k2-rot-bg); border: 1px solid var(--k2-rot-bd); }
.k2-vn__karte--nachher { background: var(--k2-gruen-bg-leise); border: 1px solid var(--k2-gruen-bd); }
.k2-vn__label { font-size: 13.5px; font-weight: var(--fw-bold); text-transform: uppercase; letter-spacing: .09em; margin-bottom: 16px; }
.k2-vn__karte--vorher .k2-vn__label { color: var(--k2-rot-label); }
.k2-vn__karte--nachher .k2-vn__label { color: var(--k2-gruen-label); }

/* Ebene 1 — die Summe, die fest im Monat laeuft. Bewusst EINE Zeile ohne
   Aufschluesselung: welche Vertraege dahinterstehen, geht der Berater
   danach gemeinsam mit dem Kunden durch (Owner 07.09.). */
.k2-vn__vers { display: flex; align-items: center; gap: 14px; padding: 17px 20px; margin-bottom: 16px; border-radius: 13px; background: var(--c-surface); }
.k2-vn__vers-icon { width: 39px; height: 39px; object-fit: contain; flex: none; }
.k2-vn__vers-name { flex: 1; min-width: 0; font-size: 17.5px; font-weight: var(--fw-semibold); line-height: 1.3; color: var(--c-text); }
.k2-vn__vers-sub { display: block; margin-top: 2px; font-size: 14px; font-weight: var(--fw-regular); color: var(--k2-text-2); }
.k2-vn__vers-wert { flex: none; font-size: 1.55rem; font-weight: var(--fw-extrabold); white-space: nowrap; font-variant-numeric: tabular-nums; }
.k2-vn__karte--vorher .k2-vn__vers-wert { color: var(--k2-rot); }
.k2-vn__karte--nachher .k2-vn__vers-wert { color: var(--k2-gruen); }

/* Erstjahres-Pille + unsichtbarer Hoehen-Platzhalter der Gegenseite, damit
   die Ausgaben-Container beidseitig auf einer Linie beginnen. */
.k2-vn__pille { display: block; margin-bottom: 12px; }
.k2-vn__pille--platzhalter { visibility: hidden; }

/* Ebene 2 — die Behandlungen, in eigener Flaeche. Trennlinie UNTER der
   Ueberschrift (sie gehoert zum Block darunter, nicht zwischen die Bloecke). */
.k2-vn__ausgaben { padding: 16px 20px; margin-bottom: 9px; border-radius: 13px; background: var(--c-surface); }
.k2-vn__karte--vorher .k2-vn__ausgaben { box-shadow: inset 0 0 0 1px var(--k2-rot-bd-leise); }
.k2-vn__karte--nachher .k2-vn__ausgaben { box-shadow: inset 0 0 0 1px var(--k2-gruen-bd-leise); }
.k2-vn__ausgaben-titel { display: block; font-size: 15.5px; font-weight: var(--fw-bold); padding-bottom: 9px; margin-bottom: 2px; border-bottom: 1px solid var(--k2-rot-bd-leise); }
.k2-vn__karte--vorher .k2-vn__ausgaben-titel { color: var(--k2-rot); }
.k2-vn__karte--nachher .k2-vn__ausgaben-titel { color: var(--k2-gruen); border-bottom-color: var(--k2-gruen-bd-leise); }

.k2-vn__posten { display: flex; align-items: center; gap: 13px; padding: 9px 0; }
.k2-vn__posten + .k2-vn__posten { border-top: 1px solid var(--k2-rot-bd-leise); }
.k2-vn__karte--nachher .k2-vn__posten + .k2-vn__posten { border-top-color: var(--k2-gruen-bd-leise); }
.k2-vn__posten-icon { width: 30px; height: 30px; object-fit: contain; flex: none; }
/* Kuratiertes Motiv statt Icon: deutlich groesser (die Zeile hat rechts von
   der Beschriftung ohnehin Luft) und quadratisch beschnitten — die Quellbilder
   sind gemischt (136px webp aus dem Repo, freie Formate aus instance/). */
.k2-vn__posten-bild { width: 60px; height: 60px; border-radius: 10px; object-fit: cover; flex: none; }
.k2-vn__posten-label { flex: 1; min-width: 0; font-size: 17px; font-weight: var(--fw-medium); line-height: 1.3; color: var(--c-text); }
.k2-vn__posten-sub { display: block; margin-top: 2px; font-size: 14px; font-weight: var(--fw-regular); color: var(--k2-text-2); }
.k2-vn__karte--vorher .k2-vn__posten-sub { color: var(--k2-rot-sub); }
.k2-vn__posten-wert { flex: none; font-size: 17.5px; font-weight: var(--fw-bold); white-space: nowrap; font-variant-numeric: tabular-nums; }
.k2-vn__karte--vorher .k2-vn__posten-wert { color: var(--k2-rot); }
.k2-vn__karte--nachher .k2-vn__posten-wert { color: var(--k2-gruen); }

.k2-vn__ausgaben-summe { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-top: 6px; padding-top: 9px; border-top: 2px solid var(--k2-rot-bd); }
.k2-vn__karte--nachher .k2-vn__ausgaben-summe { border-top-color: var(--k2-gruen-bd); }
.k2-vn__ausgaben-summe-label { font-size: 17px; font-weight: var(--fw-bold); color: var(--k2-text-2); }
.k2-vn__ausgaben-summe-wert { font-size: 1.4rem; font-weight: var(--fw-extrabold); font-variant-numeric: tabular-nums; }
.k2-vn__karte--vorher .k2-vn__ausgaben-summe-wert { color: var(--k2-rot); }
.k2-vn__karte--nachher .k2-vn__ausgaben-summe-wert { color: var(--k2-gruen); }

/* Ebene 3 — die Kopfzahl UNTEN: so liest ein Mensch eine Rechnung (Posten,
   dann Ergebnis). `margin-top: auto` haelt sie am Kartenfuss, auch wenn die
   Gegenseite mehr Zeilen hat. */
.k2-vn__gesamt { margin-top: auto; padding-top: 17px; border-top: 3px solid var(--k2-rot-bd); display: flex; align-items: center; justify-content: space-between; gap: 14px; }
.k2-vn__karte--nachher .k2-vn__gesamt { border-top-color: var(--k2-gruen-bd); }
.k2-vn__gesamt-label { font-size: 15.5px; font-weight: var(--fw-bold); color: var(--k2-text-2); text-transform: uppercase; letter-spacing: .05em; }
.k2-vn__gesamt-wert { font-size: 3rem; font-weight: var(--fw-extrabold); letter-spacing: -.035em; line-height: 1; white-space: nowrap; font-variant-numeric: tabular-nums; }
.k2-vn__karte--vorher .k2-vn__gesamt-wert { color: var(--k2-rot); }
.k2-vn__karte--nachher .k2-vn__gesamt-wert { color: var(--k2-gruen); }

/* „Geld zurueck": LILA statt gruen — Rueckfluesse der Kasse, keine gesenkten
   Ausgaben. Die abweichende Farbe IST die Aussage. */
.k2-vn__zurueck { margin-bottom: 9px; padding-top: 10px; border-top: 1px solid var(--k2-rahmen-bd); }
.k2-vn__zurueck-titel { display: block; margin-bottom: 2px; font-size: 13px; font-weight: var(--fw-bold); text-transform: uppercase; letter-spacing: .06em; color: var(--c-primary); }
.k2-vn__posten--zurueck .k2-vn__posten-label,
.k2-vn__karte--nachher .k2-vn__posten--zurueck .k2-vn__posten-wert { color: var(--c-primary); }
.k2-vn__posten--zurueck + .k2-vn__posten--zurueck { border-top-color: var(--k2-rahmen-bd); }

/* Das Band unter den Karten — EINE zentrierte Zeile mit dem Ergebnis.
   Ersparnis aufs Jahr, Mehrkosten auf den Monat (Owner-Regel 07.09.);
   die Einheit steht immer daneben, sonst waere die Asymmetrie unehrlich. */
.k2-vn__band { margin-top: 18px; padding: 15px 26px; border-radius: 18px; background: var(--k2-gruen-bg); border: 1px solid var(--k2-gruen-bd); display: flex; align-items: center; justify-content: center; }
.k2-vn__band-zeile { display: flex; align-items: baseline; gap: 15px; }
.k2-vn__band-lab, .k2-vn__band-sub { font-size: 1.1rem; font-weight: var(--fw-bold); color: var(--k2-gruen-label); }
.k2-vn__band-wert { font-size: 2.1rem; font-weight: var(--fw-extrabold); color: var(--k2-gruen); letter-spacing: -.03em; line-height: 1; font-variant-numeric: tabular-nums; }
.k2-vn__band:has(.k2-vn__band-zeile--mehr:not([hidden])) { background: var(--k2-flaeche-aktiv); border-color: var(--kk-violet-300); }
.k2-vn__band-zeile--mehr .k2-vn__band-lab, .k2-vn__band-zeile--mehr .k2-vn__band-sub { color: var(--k2-aktion); }
.k2-vn__band-zeile--mehr .k2-vn__band-wert { color: var(--c-primary); }

/* Ansicht 2: die Ersparnis-Zeile steht gross und gestapelt ueber der rechten
   Karte. Es ist DASSELBE Element wie im Band — es zieht spaeter dorthin um,
   statt zweimal zu existieren. */
.k2-vn__band-zeile--buehne { position: absolute; top: 0; bottom: 0; left: 50%; right: 0;
                             z-index: 8; flex-direction: column; align-items: center;
                             justify-content: center; gap: 4px; pointer-events: none; }
.k2-vn__band-zeile--buehne .k2-vn__band-wert { font-size: 4.2rem; }
.k2-vn__band-zeile--buehne .k2-vn__band-lab,
.k2-vn__band-zeile--buehne .k2-vn__band-sub { font-size: 1.05rem; }
/* ⚠ Diese Regeln MUESSEN nach `.k2-vn__band-zeile` stehen: gleiche
   Spezifitaet, es gewinnt die spaetere. Vorher stand die Buehne weiter oben
   und `align-items: baseline` der Basisregel hat sie linksbuendig gelassen
   (im Browser gesehen, 07.09.). */

/* ~~Haus der Gesundheit `.k2-haus*` (Trapez-Dach, Säulen-Kacheln,
   Fundament-Band; Owner-Auftrag 07.08.)~~ — vom Owner am 08.09. ERSATZLOS
   entfernt, samt `.k2-logo-chip--fundament` und `.k2-haus__icon` (beide hatten
   nur hier Konsumenten). Eine Übersicht „alles auf einen Blick" wird später neu
   entworfen; die alten Regeln stehen in der Git-Historie vor diesem Commit. */

/* weißer Logo-Chip auf dunklen Flächen (Kassen-Band) */
.k2-logo-chip { display: inline-flex; align-items: center; justify-content: center; border-radius: var(--kr-radius-innen); background: var(--c-surface); padding: 6px; flex: none; }
.k2-logo-chip--band { width: 86px; height: 44px; }
.k2-logo-chip img { max-width: 100%; max-height: 100%; object-fit: contain; }

/* Board: Rail „Deine Themen" (300px) + Detailfläche */
.k2-board { display: grid; grid-template-columns: var(--k2-rail-w) 1fr; background: var(--c-surface); border: 1px solid var(--k2-rahmen-bd); border-radius: var(--k2-radius); overflow: visible; }
.k2-rail { display: flex; flex-direction: column; border-right: 1px solid var(--k2-trenner); background: var(--k2-rail-bg); border-radius: var(--k2-radius) 0 0 var(--k2-radius); }
.k2-rail__titel { padding: 18px 22px 12px; font-size: 10.5px; font-weight: var(--fw-bold); color: var(--c-text-soft); text-transform: uppercase; letter-spacing: .06em; }
.k2-rail__eintrag { display: flex; align-items: center; gap: 12px; padding: 14px 22px; border-top: 1px solid var(--k2-rail-trenner); cursor: pointer; }
.k2-rail__eintrag--aktiv { background: var(--k2-flaeche-aktiv); box-shadow: inset 3px 0 0 var(--k2-aktion); }
.k2-rail__spalte { display: flex; flex-direction: column; min-width: 0; }
/* Sparten-Icons in der Rail (Schritt 2 ungedeckt = grau). */
.k2-rail__icon { width: 26px; height: 26px; flex: none; object-fit: contain; }
.k2-icon--grau { filter: grayscale(1); opacity: .5; }
.k2-rail__name { font-size: 13.5px; font-weight: var(--fw-semibold); color: var(--c-text); }
.k2-rail__zeile { font-size: 11.5px; color: var(--c-text-muted); font-variant-numeric: tabular-nums; }
/* Schritt-2-Rail „neu statt alt" (Owner 25.08.): Ersparnis sichtbar machen —
   neuer Wert grün, „statt" neutral, alter Wert rot. */
.k2-rail__neu { color: var(--k2-gruen); font-weight: var(--fw-semibold); }
.k2-rail__statt { color: var(--c-text); }
.k2-rail__alt { color: var(--k2-rot); }
/* noch nicht besuchte Themen: grau zurückgenommen */
.k2-rail__eintrag--offen .k2-rail__name { color: var(--c-text-soft); }
.k2-rail__eintrag--offen .k2-rail__zeile { color: var(--k2-text-soft2); }

/* Fundament-Box unten in der Rail (läuft mit dem besucht-Set mit) */
.k2-fundbox { display: flex; flex-direction: column; gap: 2px; margin-top: auto; padding: 16px 22px; border-top: 1px solid var(--k2-trenner); background: var(--k2-akzent); color: var(--c-text-on-accent); border-radius: 0 0 0 var(--k2-radius); }
.k2-fundbox__label { font-size: 10.5px; color: var(--k2-text-auf-dunkel); text-transform: uppercase; letter-spacing: .06em; }
.k2-fundbox__name { font-size: 1.0625rem; font-weight: var(--fw-bold); font-variant-numeric: tabular-nums; }
.k2-fundbox__zeile { font-size: 11.5px; color: var(--k2-text-auf-dunkel); font-variant-numeric: tabular-nums; }
.k2-fundbox__risiko { margin-top: 4px; padding-top: 6px; border-top: 1px solid var(--k2-fund-trenner); font-size: 11.5px; font-weight: var(--fw-semibold); color: var(--k2-fund-risiko); font-variant-numeric: tabular-nums; }
/* .k2-weg (Entfernte-Themen-Zeile, Ss418asT) entfernt 01.09. — Owner-Entscheid:
   ein entferntes Thema wird im Konzept nicht wieder aufgenommen. */

/* Detailfläche: feste Mindesthöhen gegen Höhensprünge beim Themenwechsel */
.k2-detail { display: flex; flex-direction: column; min-height: var(--k2-detail-minh); }
.k2-detail__kopf { display: flex; flex-direction: column; gap: 6px; padding: 26px 30px 18px; }
.k2-detail__name { font-size: 1.375rem; font-weight: var(--fw-bold); }
.k2-detail__erklaerung { font-size: 13.5px; color: var(--k2-text-2); max-width: 640px; text-wrap: pretty; min-height: var(--k2-erklaerung-minh); }

/* Kassen-Band (Schritt 1: „Stand heute" mit Logo + Beitrag).
   Owner 31.08.: helle Reform-Fläche statt Akzent-Dunkel — gleiche Optik wie das
   Reform-Panel. Außenmaße bleiben unverändert: das Padding trägt die 1px-Kante
   ab (17/21 + 1px = 18/22 wie vorher). */
.k2-band { display: flex; align-items: center; gap: 16px; margin: 0 30px 22px; padding: 17px 21px; border-radius: var(--k2-radius-karte); background: var(--k2-reform-bg); border: 1px solid var(--k2-reform-bd); color: var(--k2-akzent); }
.k2-band__spalte { display: flex; flex-direction: column; }
.k2-band__label { font-size: 11px; color: var(--c-text-muted); text-transform: uppercase; letter-spacing: .06em; font-weight: var(--fw-bold); }
.k2-band__name { font-size: 15px; font-weight: var(--fw-bold); }
.k2-band__preis { font-size: 1.375rem; font-weight: var(--fw-bold); }

/* GKV-Leistungs-Einordnung unter der Kassen-Fläche (Owner-Ticket 31.08.):
   reine Information, NICHT klickbar. Helle Reform-Fläche wie `.k2-band`, darin
   Zeilen mit Icon + Titel + Erklärsatz, durch graue Linien getrennt. */
.k2-gkvinfo { display: flex; flex-direction: column; margin: 0 30px 22px; border-radius: var(--k2-radius-karte); background: var(--k2-reform-bg); border: 1px solid var(--k2-reform-bd); }
.k2-gkvinfo__zeile { display: flex; align-items: center; gap: 14px; padding: 14px 20px; }
.k2-gkvinfo__zeile + .k2-gkvinfo__zeile { border-top: 1px solid var(--k2-rahmen-bd); }
.k2-gkvinfo__icon { width: 44px; height: 44px; flex: none; object-fit: contain; }
.k2-gkvinfo__spalte { display: flex; flex-direction: column; gap: 3px; min-width: 0; }
.k2-gkvinfo__titel { font-size: 14px; font-weight: var(--fw-bold); color: var(--k2-akzent); }
.k2-gkvinfo__text { font-size: 12.5px; color: var(--k2-text-2); text-wrap: pretty; max-width: 640px; }

/* Die Kurz-Zeilen-Variante `.k2-gleich` vom 31.08. hat der Owner noch am
   selben Tag verworfen — Schritt 2 nutzt dieselbe `.k2-gkvinfo`-Fläche wie
   das Ist-Konzept, nur mit anderem Erklärsatz (Makro `gkv_niveau`). */

/* Kassen-EIGENER Bonus auf der Kassen-Fläche (Owner 01.09., zuerst DAK):
   Punkte-Herleitung + einmaliger Betrag. Bewusst eine EIGENE Komponente
   neben `.k2-bonus` (Gildemeister): dort geht es um ein laufendes Budget für
   Zusatzbausteine, hier um ein zweckgebundenes Startguthaben — gleiche
   Bildsprache (grün, gerahmt), andere Aussage. Gilt für jede Kasse mit
   eigener Bonus-Rechnung, nicht nur die DAK. */
.k2-kbonus { display: flex; flex-direction: column; margin: 0 30px 22px; padding: 4px 20px 14px; border-radius: var(--k2-radius-karte); background: var(--k2-gruen-bg-leise); border: 1px solid var(--k2-gruen-bd-leise); }
.k2-kbonus__kopf { display: flex; align-items: center; gap: 12px; padding: 14px 0 12px; }
.k2-kbonus__badge { flex: none; padding: 4px 10px; border-radius: var(--r-full); background: var(--k2-gruen); color: var(--c-text-on-accent); font-size: 10.5px; font-weight: var(--fw-bold); text-transform: uppercase; letter-spacing: .06em; }
.k2-kbonus__spalte { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.k2-kbonus__titel { font-size: 14px; font-weight: var(--fw-bold); color: var(--k2-akzent); }
.k2-kbonus__sub { font-size: 12px; color: var(--k2-text-2); }
/* Umschalter Fitness-Tracker / Sportsachen — rechts außen, wie in der
   Gildemeister-Box (dort `.k2-bonus__kopf .k2-seg`). */
.k2-kbonus__seg { margin-left: auto; }
.k2-kbonus__zeile { display: grid; grid-template-columns: 1fr auto; gap: 14px; align-items: baseline; padding: 10px 0; border-top: 1px solid var(--k2-gruen-bd-leise); }
.k2-kbonus__label { font-size: 13px; color: var(--k2-text-2); min-width: 0; }
.k2-kbonus__punkte { font-size: 13px; font-weight: var(--fw-semibold); color: var(--k2-gruen); text-align: right; }
.k2-kbonus__zeile--wahl .k2-kbonus__punkte { white-space: normal; }
/* Zwei Summen-Stufen (Owner 01.09.): Der Kopf trägt KEINEN Betrag mehr — die
   Zahlen stehen nur noch hier, und zwar aufsteigend. Die Erstattung ist
   „etwas größer", die Gesamt-Rückerstattung die größte Zahl des Blocks
   (sie hat die Größe, die vorher der Kopf-Betrag hatte). */
.k2-kbonus__zeile--summe, .k2-kbonus__zeile--gesamt { border-top-color: var(--k2-gruen-bd); }
.k2-kbonus__zeile--summe .k2-kbonus__label, .k2-kbonus__zeile--gesamt .k2-kbonus__label { font-weight: var(--fw-bold); color: var(--k2-akzent); }
.k2-kbonus__zeile--summe .k2-kbonus__label { font-size: 14.5px; }
.k2-kbonus__zeile--summe .k2-kbonus__punkte { font-size: 1rem; font-weight: var(--fw-bold); }
.k2-kbonus__zeile--gesamt { margin-top: 6px; }
.k2-kbonus__zeile--gesamt .k2-kbonus__label { font-size: 15.5px; }
.k2-kbonus__zeile--gesamt .k2-kbonus__punkte { font-size: 1.125rem; font-weight: var(--fw-bold); }
/* Abschnitts-Überschrift („Zusätzliches jährliches Guthaben") mit Luft davor. */
.k2-kbonus__abschnitt { margin-top: 18px; padding: 12px 0 2px; font-size: 10.5px; font-weight: var(--fw-bold); color: var(--c-text-soft); text-transform: uppercase; letter-spacing: .06em; }
/* Wahltarif-Aufklapper: Zeile wie die anderen, Bedingungen dahinter. */
.k2-kbonus__mehr { border-top: 1px solid var(--k2-gruen-bd-leise); }
.k2-kbonus__mehr-kopf { display: grid; grid-template-columns: 1fr auto; gap: 14px; align-items: baseline; padding: 10px 0; cursor: pointer; list-style: none; }
.k2-kbonus__mehr-kopf::-webkit-details-marker { display: none; }
.k2-kbonus__mehr[open] .k2-brx__pfeil { display: inline-block; transform: rotate(180deg); }
.k2-kbonus__erklaer { display: flex; flex-direction: column; gap: 7px; padding: 4px 0 12px; }
.k2-kbonus__erklaer-zeile { display: flex; gap: 8px; font-size: 12.5px; color: var(--k2-text-2); text-wrap: pretty; }
/* Feste Breite in PX (nicht em), damit „1." / „2." und das größere
   Ausrufezeichen dieselbe Textkante ergeben — bei em skaliert die Box mit der
   Schriftgröße und Punkt 3 rutscht sichtbar ein. */
.k2-kbonus__nr { flex: none; min-width: 16px; font-weight: var(--fw-bold); color: var(--k2-gruen); }
.k2-kbonus__nr--achtung { font-size: 15px; line-height: 1.05; }

/* Preisstrahl: Gradient rot (teuer) → grün (günstig), Marker mit Label-Pill */
/* Verbinder Box → Punkt (Owner 04.09., Trello 269). Liegt als Overlay AM
   Strahl (`bottom: 100%`) und reicht 56px nach oben — genau bis an die
   Unterkante der Karten. So endet die Linie unten exakt auf der Nadel, ohne
   dass die Fläche höher wird oder irgendwo eine Pixel-Höhe geraten werden muss. */
.k2-verbinder { position: absolute; left: 0; right: 0; bottom: 100%; height: 56px; pointer-events: none; }
.k2-verbinder__linien { display: block; width: 100%; height: 100%; overflow: visible; }
.k2-verbinder__linie { stroke-width: 2; stroke-linecap: round; stroke-dasharray: 3 4; opacity: .8; }
/* Die Linie trägt die Farbe der KARTE, nicht die des Punktes: Sie soll die
   Box zuordnen, und der „bisher"-Punkt ist bewusst neutral grau (er markiert
   eine Position, keine Wertung). Ein grauer Verbinder hätte die Zuordnung zur
   rosé Karte gerade nicht hergestellt. */
.k2-verbinder__linie--alt { stroke: var(--k2-rot); }
.k2-verbinder__linie--neu { stroke: var(--k2-gruen); }
/* Pfeilspitze als CSS-Dreieck: sitzt exakt auf dem Prozent-Punkt und zeigt auf
   die Nadel darunter. Als SVG-Marker würde sie von preserveAspectRatio="none"
   verzerrt — deshalb bewusst außerhalb der Grafik. */
/* Spitze endet KNAPP ÜBER der Nadel (bottom: 6px) statt auf ihr — sie soll auf
   den Punkt zeigen, nicht ihn verdecken. Die Nadel ragt 3px über die Linie. */
.k2-verbinder__spitze { position: absolute; bottom: 6px; transform: translateX(-50%); width: 0; height: 0; border-left: 4px solid transparent; border-right: 4px solid transparent; }
.k2-verbinder__spitze--alt { border-top: 5px solid var(--k2-rot); }
.k2-verbinder__spitze--neu { border-top: 5px solid var(--k2-gruen); }
.k2-strahl { position: relative; margin-top: 34px; }
.k2-strahl__linie { display: block; height: 8px; border-radius: var(--r-full); background: var(--k2-strahl); }
/* Owner-Ticket 31.08.: Ist-Pill hell wie das Kassen-Band (--k2-reform-bg +
   Kante), Beschriftung dunkel — sie stand als einziges Element der Zone noch
   auf Akzent-Dunkel. Die --neu-Pill (Schritt 2) bleibt grün und setzt ihre
   helle Schrift deshalb ausdrücklich wieder. */
.k2-strahl__pill { position: absolute; bottom: 14px; transform: translateX(-50%); display: inline-flex; align-items: center; gap: 8px; padding: 5px 11px; border-radius: 9px; background: var(--k2-reform-bg); border: 1px solid var(--k2-reform-bd); color: var(--k2-akzent); font-size: 12px; font-weight: var(--fw-bold); white-space: nowrap; }
.k2-strahl__nadel { position: absolute; top: -3px; transform: translateX(-50%); width: 14px; height: 14px; border-radius: var(--r-full); background: var(--c-surface); border: 4px solid var(--k2-akzent); }
.k2-strahl__enden { display: flex; justify-content: space-between; }
.k2-strahl__ende { display: flex; flex-direction: column; }
.k2-strahl__ende--rechts { align-items: flex-end; }
.k2-strahl__ende-label { font-size: 11.5px; color: var(--c-text-soft); }
.k2-strahl__ende-wert { font-size: 13px; font-weight: var(--fw-bold); font-variant-numeric: tabular-nums; }
.k2-strahl__ende-wert--teuer { color: var(--k2-rot); }
.k2-strahl__ende-wert--guenstig { color: var(--k2-gruen); }
.k2-strahl__hinweis { font-size: 12.5px; color: var(--k2-text-2); max-width: 620px; text-wrap: pretty; }

/* Footer des geführten Flows: Hinweis links + Weiter-Pill rechts */
.k2-fuss { display: flex; align-items: center; justify-content: space-between; gap: 16px; margin: 0 30px 26px; padding-top: 18px; border-top: 1px solid var(--k2-trenner); }
/* ~~.k2-fuss__hinweis~~ entfernt 02.09.: einziger Konsument war der Abschluss-
   Zurück-Link, der jetzt als .k2-fuss__zurueck in der Aktions-Zeile steht. */
/* Feedback-Ticket 27.08.: ohne linke Hinweis-Zeile bleibt der Weiter-/CTA-Button
   rechts verankert (space-between wirkt sonst nur mit zwei Kindern). */
.k2-fuss > .k2-btn-weiter:only-child, .k2-fuss > .k2-btn-aktion:only-child { margin-left: auto; }
/* Owner 02.09.: rechte Button-Gruppe der Fußzeile — Outline-Knopf (Kassen
   vergleichen) links neben dem dunklen Weiter; rechts verankert. */
.k2-fuss__rechts { display: flex; align-items: center; gap: 10px; margin-left: auto; }
.k2-btn-weiter { display: inline-flex; align-items: center; gap: 8px; padding: 12px 22px; border-radius: var(--btn-radius); background: var(--k2-akzent); color: var(--c-text-on-accent); font-size: 13.5px; font-weight: var(--fw-bold); cursor: pointer; flex: none; border: 0; text-decoration: none; }
.k2-btn-weiter:hover { background: var(--k2-aktion); color: var(--c-text-on-accent); text-decoration: none; }

/* ── k2 Schritt 1 (PR 3): Hover-Mechanik, Themen-Doppelkarten, Beispielrechnung,
   Strahl-Zone. Daten kommen ausschließlich aus dem A-Vertrag (konzept_v2). ── */
/* Herleitungs-Tooltip nur bei Hover/Fokus — CSS-only, kein JS; Druck zeigt
   den Wert ohne Popup (Herleitung ist Gesprächs-, kein Blatt-Inhalt). */
/* Fix 04.09. (Owner-Foto, Folge der eingeklappten Berater-Leiste): Das
   Hover-Feld oeffnet nach OBEN (bottom: calc(100% + 8px)). Seit die Leiste zu
   ist, steht die Spar-Ueberschrift ganz oben am Fensterrand — dort ist kein
   Platz mehr, das Feld lief oben aus dem Bild. `k2-hover--unten` dreht die
   Richtung; WANN gedreht wird, entscheidet app.js (nur JS kann den freien
   Platz messen). Ohne JS bleibt alles wie bisher — die Richtung ist eine
   Verbesserung, keine Voraussetzung. */
.k2-hover--unten > .k2-tip { top: calc(100% + 8px); bottom: auto; }
.k2-hover .k2-tip { display: none; }
.k2-hover:hover .k2-tip, .k2-hover:focus-within .k2-tip { display: flex; }
@media print { .k2-hover .k2-tip { display: none !important; } }

/* Themen-Doppelkarten: gleiche Mindesthöhe gegen Höhensprünge (README) */
/* Karte 196/197: Aufschlüsselungs-Box über der Ist-Karte — jede aggregierte
   Ist-Zahl trägt ihre Posten-Herleitung (Person × Posten × Häufigkeit × Betrag
   aus dem A-Vertrag). Leise Fläche, Zeilen wie hoverpop-posten, nur sichtbar. */
.k2-posten { display: flex; flex-direction: column; gap: 6px; margin: 0 30px 14px; padding: 14px 18px; border-radius: var(--k2-radius-karte); background: var(--k2-chip-bg); border: 1px solid var(--k2-trenner); }
.k2-posten__titel { font-size: 11px; font-weight: var(--fw-bold); color: var(--c-text-muted); text-transform: uppercase; letter-spacing: .05em; }
.k2-posten__zeile { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; }
.k2-posten__label { font-size: 12.5px; color: var(--k2-text-2); }
.k2-posten__wert { font-size: 12.5px; font-weight: var(--fw-semibold); color: var(--c-text); white-space: nowrap; }
/* A-Zuschuss-Umbau 27.08.: Kassen-Zuschuss (Minus-Zeile, Datenflag zuschuss)
   grün abgesetzt — in der Posten-Box UND im k2-tip-Hover. */
.k2-posten__zeile--zuschuss .k2-posten__label, .k2-posten__zeile--zuschuss .k2-posten__wert { color: var(--k2-gruen); }
.k2-tip__zeile--zuschuss .k2-tip__zeile-label, .k2-tip__zeile--zuschuss .k2-wert { color: var(--k2-gruen); }
.k2-tk { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; padding: 0 30px 22px; }
/* 0-€-Ticket 26.08.: Risiko-Box der Themen ohne Kosten-Erfassung — allein
   in der Zeile, volle Breite (statt der entfallenen Ist-Karte). */
.k2-tk__karte--solo { grid-column: 1 / -1; min-height: 0; }
.k2-tk__karte { position: relative; display: flex; flex-direction: column; gap: 4px; padding: 20px 22px; border-radius: var(--k2-radius-karte); min-height: 172px; }
.k2-tk__karte--ist { background: var(--k2-rot-bg); border: 1px solid var(--k2-rot-bd-leise); }
.k2-tk__karte--risiko { background: var(--kr-kopf-bg); border: 1px solid var(--k2-rahmen-bd); }
.k2-tk__label { font-size: 10.5px; font-weight: var(--fw-bold); text-transform: uppercase; letter-spacing: .07em; }
.k2-tk__wert { align-self: flex-start; font-size: 2.25rem; font-weight: var(--fw-bold); letter-spacing: -.02em; }
.k2-tk__karte--ist .k2-tk__label, .k2-tk__karte--ist .k2-tk__wert { color: var(--k2-rot); }
.k2-tk__karte--risiko .k2-tk__label { color: var(--c-text-muted); }
.k2-tk__karte--risiko .k2-tk__wert { color: var(--k2-text-2); }
.k2-tk__sub { font-size: 12.5px; }
.k2-tk__karte--ist .k2-tk__sub { color: var(--k2-rot-sub); }
.k2-tk__karte--risiko .k2-tk__sub { color: var(--c-text-muted); }
.k2-tk__hinweis { margin-top: 6px; font-size: 11.5px; color: var(--c-text-soft); text-wrap: pretty; }

/* Beispielrechnung Schritt 1 (1 Wert-Spalte; Werte sind JAHRES-Beträge) */
.k2-br { display: flex; flex-direction: column; padding: 0 30px; }
.k2-br__kopf { display: grid; grid-template-columns: 1fr 170px; gap: 14px; padding: 12px 0 10px; border-top: 1px solid var(--k2-trenner); }
.k2-br__kopf-label { font-size: 10.5px; font-weight: var(--fw-bold); color: var(--c-text-soft); text-transform: uppercase; letter-spacing: .06em; }
.k2-br__kopf-label--rechts { text-align: right; }
.k2-br__zeile { display: grid; grid-template-columns: 1fr 170px; gap: 14px; align-items: baseline; padding: 13px 0; border-top: 1px solid var(--k2-trenner-leise); }
.k2-br__was { font-size: 13.5px; font-weight: var(--fw-semibold); }
.k2-br__hinweis { display: block; font-size: 11.5px; color: var(--c-text-soft); }
/* Quellen-Stempel der Beispielzeile (PM 09.09.): nur wenn die Matrix-Zeile einen M&M-Abruf trägt. */
.k2-br__quelle { display: block; font-size: var(--k2-br-quelle-fs); color: var(--k2-br-quelle-fg); }
.k2-br__wert { text-align: right; font-size: 13.5px; font-weight: var(--fw-semibold); color: var(--k2-rot); }

/* Strahl-Zone: Intro + Strahl + Enden innerhalb der Detailfläche */
.k2-strahl-zone { display: flex; flex-direction: column; gap: 10px; margin: 0 30px 26px; }
/* Rand-Klemmung (Muster kr-skala): Pill bleibt am Skalenende im Rahmen,
   die Nadel behält die exakte Position. */
.k2-strahl__pill--kante-links { transform: none; }
.k2-strahl__pill--kante-rechts { transform: translateX(-100%); }

/* ── Historische Beitragsentwicklung `.k2-vl-*` (Owner-Design-Runde 08.09.) ──
   Aufklappbares Verlaufs-Chart UNTER dem Preisstrahl, nur beim Wechsel in eine
   günstigere Kasse. Vollständige Spezifikation samt Herkunft jeder Entscheidung:
   wissen/design-system.md §Konvention: Beitragsverlauf.
   Gezeichnet wird in app.js (§Beitragsverlauf) — das SVG entsteht auf der
   ECHTEN Pixelbreite, damit die Höhe fest bleibt (Owner: sonst „langgezogen"). */
.k2-vl { align-self: stretch; }   /* Breite = Strahl-Zone, deckungsgleich mit .k2-gkvinfo */
.k2-vl__schalter { display: inline-flex; align-items: center; gap: 7px; padding: 6px 2px; font-size: 13px; font-weight: var(--fw-bold); color: var(--k2-akzent); cursor: pointer; list-style: none; }
.k2-vl__schalter::-webkit-details-marker { display: none; }
.k2-vl__schalter:hover { color: var(--k2-aktion); }
.k2-vl__pfeil { font-size: 9px; line-height: 1; transition: transform .18s ease; }
.k2-vl[open] .k2-vl__pfeil { transform: rotate(180deg); }
.k2-vl__box { margin-top: 8px; padding: 14px 16px 10px; border: 1px solid var(--k2-rahmen-bd); border-radius: var(--k2-radius-karte); background: var(--k2-rh-bg); }
.k2-vl__legende { display: flex; gap: 18px; flex-wrap: wrap; margin-bottom: 6px; }
.k2-vl__leg { display: inline-flex; align-items: center; gap: 7px; font-size: 12px; color: var(--k2-text-2); }
.k2-vl__punkt { width: 10px; height: 10px; border-radius: 3px; flex: none; }
.k2-vl__punkt--neu { background: var(--k2-vl-neu); }
.k2-vl__punkt--alt { background: var(--k2-vl-alt); }
.k2-vl__feld { position: relative; overflow: hidden; border-radius: var(--k2-radius-box); }
.k2-vl__feld svg { display: block; width: 100%; height: auto; }
.k2-vl__achse { font-size: 10.5px; fill: var(--k2-text-soft2); font-weight: var(--fw-semibold); }
.k2-vl__gitter { stroke: var(--k2-trenner-leise); stroke-width: 1; }
.k2-vl__gitter--basis { stroke: var(--k2-rahmen-bd); }
/* Aufbau von links nach rechts beim Aufklappen (Owner: „von links auffüllen"). */
.k2-vl[open] .k2-vl__zeichnung { animation: k2-vl-aufbau 1.05s cubic-bezier(.32,.72,.3,1) both; }
@keyframes k2-vl-aufbau { from { clip-path: inset(0 100% 0 0); } to { clip-path: inset(0 0 0 0); } }
/* Glanz alle 7 s — Geometrie wie .k2-bd__metall-glanz (breiter/heller wirkt billig). */
.k2-vl__glanz { position: absolute; top: -10%; bottom: -10%; left: 0; width: 18%; pointer-events: none; filter: blur(2px); opacity: 0; background: linear-gradient(90deg, transparent, var(--k2-vl-glanz), transparent); }
.k2-vl[open] .k2-vl__glanz { animation: k2-vl-glanz 7s cubic-bezier(.4,0,.2,1) infinite 1.1s; }
@keyframes k2-vl-glanz {
  0%   { transform: translateX(-140%) skewX(-18deg); opacity: 0; }
  2%   { opacity: .9; }
  14%  { transform: translateX(620%) skewX(-18deg); opacity: 0; }
  100% { transform: translateX(620%) skewX(-18deg); opacity: 0; }
}
/* Der Hover bleibt IM Feld: app.js klemmt ihn an beiden Achsen, `--unten`
   fängt den Fall, dass über dem Punkt kein Platz mehr ist (Owner-Befund 08.09.). */
.k2-vl__tip { position: absolute; z-index: 3; pointer-events: none; opacity: 0; transform: translate(-50%, -100%); background: var(--k2-tip-bg); color: var(--c-surface); border-radius: var(--k2-radius-box); box-shadow: var(--k2-tip-shadow); padding: 9px 12px; min-width: 178px; font-size: 12px; line-height: 1.45; transition: opacity .12s ease; }
.k2-vl__tip--unten { transform: translate(-50%, 0); }
.k2-vl__tip[data-an="1"] { opacity: 1; }
.k2-vl__tip-datum { color: var(--k2-tip-label); font-size: 10.5px; letter-spacing: .04em; text-transform: uppercase; font-weight: var(--fw-bold); margin-bottom: 5px; }
.k2-vl__tip-zeile { display: flex; align-items: baseline; gap: 8px; margin-top: 3px; }
.k2-vl__tip-name { color: var(--k2-tip-label); flex: 1; white-space: nowrap; }
.k2-vl__tip-wert { font-weight: var(--fw-bold); font-variant-numeric: tabular-nums; font-size: 12.5px; }
.k2-vl__tip-diff { margin-top: 6px; padding-top: 5px; border-top: 1px solid var(--k2-tip-trenner); color: var(--k2-tip-label); font-size: 11.5px; }
.k2-vl__tip-diff b { color: var(--c-surface); font-variant-numeric: tabular-nums; }
@media (prefers-reduced-motion: reduce) {
  .k2-vl[open] .k2-vl__zeichnung, .k2-vl[open] .k2-vl__glanz { animation: none; }
}

/* ── k2 Schritt-2-Detailflächen (Großprojekt PR 4, 2026-08-25) ──────────────
   Drei-Kacheln-Grid (Kasse alt→neu + Themen Ohne/Mit/Spar), Hauptvorteile-
   Liste (kasse_teurer), Vergleichs-Tabelle, Reform-Panel, Baustein-Leiste.
   V2-Delta 6 gilt hier per Konstruktion: Kacheln starten OBEN (kein
   justify-content: center) — die Hover-Linie sitzt direkt unterm Betrag. */
.k2-dk { display: grid; grid-template-columns: 1fr 36px 1fr 190px; align-items: stretch; gap: 12px; padding: 0 30px 22px; }
.k2-dk__karte { position: relative; display: flex; flex-direction: column; align-items: flex-start; gap: 4px; padding: 18px 20px; border-radius: var(--k2-radius-karte); }
/* 0-€-Ticket 26.08.: Absicherungs-Kachel (Themen ohne Kosten-Erfassung) —
   eine Kachel über die ganze Reihe statt Ohne/Mit/Du-sparst. */
.k2-dk__karte--breit { grid-column: 1 / -1; }
/* Ohne dritte Kachel (Owner-Ticket 31.08.: „DU SPARST" entfällt, die Zahl
   steht am Spannen-Pfeil): breiteres Mittelfeld statt breiterer Kacheln —
   die zwei Kassen rücken sichtbar auseinander, wachsen selbst aber nur
   moderat mit. */
.k2-dk--zwei { grid-template-columns: 1fr 96px 1fr; }
.k2-dk__karte--alt { background: var(--k2-rot-bg); border: 1px solid var(--k2-rot-bd-leise); }
.k2-dk__karte--neu { background: var(--k2-gruen-bg-leise); border: 1px solid var(--k2-gruen-bd-leise); }
.k2-dk__karte--spar { background: var(--k2-gruen-bg); }
.k2-dk__pfeil { display: flex; align-items: center; justify-content: center; font-size: 1.25rem; color: var(--kk-violet-300); }
.k2-dk__label { font-size: 10.5px; font-weight: var(--fw-bold); text-transform: uppercase; letter-spacing: .07em; }
.k2-dk__wert { font-size: 1.875rem; font-weight: var(--fw-bold); letter-spacing: -.02em; }
.k2-dk__wert--klein { font-size: 1.125rem; letter-spacing: 0; }
.k2-dk__karte--alt .k2-dk__label, .k2-dk__karte--alt .k2-dk__wert { color: var(--k2-rot); }
.k2-dk__karte--neu .k2-dk__label, .k2-dk__karte--neu .k2-dk__wert,
.k2-dk__karte--spar .k2-dk__label, .k2-dk__karte--spar .k2-dk__wert { color: var(--k2-gruen); }
/* Offenes Thema: „Mit Konzept" ohne Baustein + „Bleibt bei dir" in Grau. */
.k2-dk__karte--neu-offen, .k2-dk__karte--spar-offen { background: var(--k2-chip-bg); border-color: var(--k2-rahmen-bd); }
.k2-dk__karte--neu-offen .k2-dk__label, .k2-dk__karte--neu-offen .k2-dk__wert,
.k2-dk__karte--spar-offen .k2-dk__label, .k2-dk__karte--spar-offen .k2-dk__wert { color: var(--c-text-muted); }
.k2-dk__sub { font-size: 12px; color: var(--k2-rot-sub); }
.k2-dk__logo { max-height: 24px; max-width: 110px; object-fit: contain; align-self: flex-start; }
.k2-dk__logo--alt { filter: grayscale(1); opacity: .7; }

/* Extra-Budget-Banner (Rundum-sicher-Paket, Owner 2026-08-25): das
   Verkaufsargument der Ziel-Kasse — bewusst laut (violett wie k2-aktivieren). */
.k2-xb { display: flex; margin: 0 30px 18px; padding: 16px 20px; border-radius: var(--k2-radius-karte); background: var(--k2-aktion); color: var(--c-text-on-accent); }
.k2-xb__spalte { display: flex; flex-direction: column; gap: 3px; min-width: 0; }
.k2-xb__label { font-size: 10.5px; font-weight: var(--fw-bold); text-transform: uppercase; letter-spacing: .07em; color: var(--kk-violet-300); }
.k2-xb__wert { font-size: 1.5rem; font-weight: var(--fw-bold); letter-spacing: -.01em; }
.k2-xb__sub { font-size: 12.5px; color: var(--kk-violet-300); }
.k2-xb__hinweis { font-size: 11.5px; color: var(--kk-violet-300); text-wrap: pretty; max-width: 640px; }

/* Sonderfall teurere Kasse: Hauptvorteile-Zeilen mit grüner Wert-Pill. */
.k2-vorteile { display: flex; flex-direction: column; margin: 0 30px 6px; }
.k2-vorteile__titel { padding: 8px 0 6px; font-size: 10.5px; font-weight: var(--fw-bold); color: var(--c-text-soft); text-transform: uppercase; letter-spacing: .06em; }
.k2-vorteile__zeile { display: flex; align-items: center; gap: 16px; padding: 12px 0; border-top: 1px solid var(--k2-trenner-leise); }
.k2-vorteile__name { font-size: 13.5px; font-weight: var(--fw-semibold); min-width: 0; }
.k2-vorteile__pill { margin-left: auto; display: flex; flex-direction: column; align-items: center; gap: 1px; padding: 8px 16px; border-radius: 10px; background: var(--k2-gruen-bg); border: 1px solid var(--k2-gruen-bd-leise); }
.k2-vorteile__wert { font-size: 12.5px; font-weight: var(--fw-bold); color: var(--k2-gruen); }
.k2-vorteile__jahr { font-size: 11px; color: var(--k2-gruen-label); }

/* Strahl Schritt 2: Neu-Pill, grauer „bisher"-Punkt neben der Nadel.
   Owner-Ticket 31.08.: die Pill liegt NICHT mehr auf Voll-Grün mit heller
   Schrift, sondern auf derselben leisen Grün-Fläche wie die Nachher-Kachel
   (.k2-dk__karte--neu) — gleiche Tokens, Schrift in Dunkelgrün. */
.k2-strahl__pill--neu { background: var(--k2-gruen-bg-leise); border-color: var(--k2-gruen-bd-leise); color: var(--k2-gruen); }
.k2-strahl__nadel--alt { top: -2px; width: 12px; height: 12px; border-width: 3px; border-color: var(--k2-strahl-marker-alt); }
.k2-strahl__nadel--neu { top: -4px; border-color: var(--k2-gruen); }

/* Spannen-Pfeil zwischen bisherigem und neuem Punkt (Owner-Ticket 31.08.,
   Wiederaufnahme von .kr-skala__spanne aus dem Alt-Flow): dünne graue Linie
   mit Pfeilspitzen an beiden Enden, in der Mitte die Monats-Differenz auf
   Flächenfarbe freigestellt. Sitzt UNTER der Skalenlinie — oben steht die
   Neu-Pill.

   Der Platz kommt aus einem MARGIN, nie aus padding: `.k2-strahl__pill` ist
   mit `bottom` an der Unterkante des Strahls verankert: ein padding-bottom
   vergrößert die Box und zieht die Pill auf die Linie herunter (Owner-Befund
   31.08.). Margin lässt die Box — und damit den Pill-Anker — unverändert und
   schiebt nur die Enden-Beschriftung nach unten. Wer hier später Platz
   ändert, ändert den Margin. */
.k2-strahl--spanne { margin-bottom: 30px; }
.k2-strahl__spanne { position: absolute; top: 26px; height: 0; border-top: 1px solid var(--k2-strahl-marker-alt); }
.k2-strahl__spanne::before,
.k2-strahl__spanne::after { content: ""; position: absolute; top: -5px; border: 5px solid transparent; }
.k2-strahl__spanne::before { left: -1px; border-right-color: var(--k2-strahl-marker-alt); border-left-width: 0; }
.k2-strahl__spanne::after { right: -1px; border-left-color: var(--k2-strahl-marker-alt); border-right-width: 0; }
.k2-strahl__spanne-label { position: absolute; left: 50%; top: -1px; transform: translate(-50%, -50%); padding: 0 8px; background: var(--c-surface); font-size: 12px; font-weight: var(--fw-bold); color: var(--c-text-muted); white-space: nowrap; }
/* Die Herleitung öffnet nach OBEN — unter dem Pfeil steht die Enden-Zeile. */
.k2-strahl__spanne-label .k2-tip { bottom: calc(100% + 10px); }

/* „Was sich für dich ändert" — Kompakt-Tabelle aus As Hauptvorteilen.
   SEIT 31.08. OHNE MARKUP: Der Owner hat die aus dem Compass-Duell
   abgeleitete Tabelle abgeschafft (Punkteplan je Kasse stattdessen). Die
   Klassen bleiben vorerst stehen, weil der Punkteplan sie für eine
   Gegenüberstellung wiederverwenden könnte; wird er ohne sie gebaut,
   fliegen sie im selben PR raus. Nicht neu verwenden, ohne das zu klären. */
.k2-tab { display: flex; flex-direction: column; padding: 0 30px; }
/* Flexible Wert-Spalten (Owner-Befund 2026-08-25): Zellen tragen auch TEXT
   („Bis zu 200 € je Schwangerschaft") — nowrap aus .k2-wert wird hier
   aufgehoben, sonst läuft die Alt-Spalte in die Neu-Spalte. */
.k2-tab__kopf, .k2-tab__zeile { display: grid; grid-template-columns: 1fr minmax(120px, .6fr) minmax(120px, .6fr); gap: 14px; align-items: baseline; }
.k2-tab__kopf { padding: 12px 0 10px; border-top: 1px solid var(--k2-trenner); }
.k2-tab__kopf-label { font-size: 10.5px; font-weight: var(--fw-bold); color: var(--c-text-soft); text-transform: uppercase; letter-spacing: .06em; }
.k2-tab__kopf-label--rechts { text-align: right; }
.k2-tab__zeile { padding: 13px 0; border-top: 1px solid var(--k2-trenner-leise); }
.k2-tab__was { font-size: 13.5px; font-weight: var(--fw-semibold); min-width: 0; }
.k2-tab__alt { font-size: 13.5px; color: var(--k2-rot); text-align: right; }
.k2-tab__neu { font-size: 13.5px; font-weight: var(--fw-bold); color: var(--k2-gruen); text-align: right; }
.k2-tab__alt.k2-wert, .k2-tab__neu.k2-wert { white-space: normal; overflow-wrap: break-word; min-width: 0; }

/* GKV-Reform-Panel (T17-Slots Karte 153) — violette k2-Fassung. */
/* Owner 02.09. (Design 3a, Export „gkv-reform-hinweis"): einheitlicher
   Reform-Hinweis für alle Kategorien — heller Container (--k2-rh-bg, Rand
   --k2-rahmen-bd, Radius 14), Kopfzeile mit rosé Chip „Reform 2027", Label,
   Kennzahl rechts (rosé, tabellarisch, 2px gestrichelt = Hover-Herleitung im
   dunklen k2-tip) und Pfeil; aufgeklappt je Punkt ein Raster 124px | 1fr mit
   Marke (uppercase, soft) und Text. ~~Warn-Dreieck/Badge/„?"-Beleg-Icon~~ raus;
   der Beleg ist die letzte, leisere Rasterzeile. Spec: wissen/design-system.md
   §Reform-Hinweis 3a. */
.k2-reform { display: flex; flex-direction: column; margin: 0 30px 22px; border-radius: var(--k2-radius-karte); background: var(--k2-rh-bg); border: 1px solid var(--k2-rahmen-bd); }
.k2-reform__kopf { display: flex; align-items: center; gap: 12px; padding: 13px 18px; cursor: pointer; list-style: none; }
.k2-reform__kopf::-webkit-details-marker { display: none; }
.k2-reform__chip { display: inline-flex; align-items: center; flex: none; padding: 3px 10px; border-radius: 6px; background: var(--k2-rh-chip-bg); color: var(--k2-rot); font-size: 10px; font-weight: var(--fw-bold); letter-spacing: .04em; text-transform: uppercase; }
.k2-reform__label { font-size: 13px; font-weight: var(--fw-semibold); color: var(--kk-ink); min-width: 0; text-wrap: pretty; }

/* ── Presse-Popup „Das berichten die Medien" (Owner 08.09.) ──────────────────
   Das Overlay hinter dem Reform-Knopf: sechs Artikel als 3x2-Raster, im
   Kartenkopf links das Vorschaubild und rechts die Wortmarke des Mediums.
   Spec + Herleitung der Masse: wissen/design-system.md §Presse-Popup Reform.

   ⚠ Die Kartenhoehe haengt an --presse-kopf-h und ist gegen ein 13"-MacBook
   MIT Lesezeichenleiste (1440x740) gemessen — dort bleiben 26 px Reserve.
   Wer sie erhoeht, misst gegen genau diesen Fall nach.

   ⚠ Die Kopfhoehe gehoert an die GRID-ZEILE, nicht als `height` an den
   Container: `height:100%` am Bild bezoege sich sonst auf eine auto-Zeile
   (Zirkelbezug) und der Browser nimmt die Bild-Eigengroesse — im Entwurf
   rendete das Bild dadurch 216 statt 132 px und schob sich ueber den Text.
   `min-height:0` am Kind ist Pflicht, sonst drueckt dessen Mindestgroesse
   die Zeile wieder auf. */
/* ⚠ Der <dialog> selbst deckelt auf `max-width: 92vw` — eine breitere Box
   laeuft rechts heraus (gemessen: 12 px, die dritte Spalte war angeschnitten).
   Fuer das Presse-Popup wird der Deckel deshalb mit angehoben; `:has()` trifft
   den Dialog ueber seinen Inhalt, weil app.js die Breiten-Klasse an die BOX
   haengt, nicht an den Dialog. */
.modal:has(.modal__box--presse) { max-width: 100vw; }
.modal__box--presse { width: calc(100vw - 3.2vw); max-width: none; height: calc(100vh - 2.4vh); max-height: none; padding: 0; gap: 0; overflow: hidden; }
/* ⚠ Der Kopf ist bewusst flacher als der generische .k2-modal__kopf: Am 13"-
   Schirm entscheiden seine Zeilen darueber, ob die zweite Kartenreihe noch
   passt. Gemessen: mit dem Standard-Kopf (84 px) lief der Koerper bei 1440x740
   um 12 px ueber. */
/* ⚠ Doppelklasse statt `.k2-presse__kopf` allein: `.k2-modal__kopf` steht in
   dieser Datei WEITER UNTEN und gewaenne bei gleicher Spezifitaet die
   Reihenfolge — mit 11 px notiert, gemessen weiterhin 87 px hoch. Die
   Doppelklasse (0,2,0) haengt nicht an der Position im Stylesheet. */
.k2-modal__kopf.k2-presse__kopf { flex: none; align-items: center; padding: 10px 20px; gap: 12px; }
.k2-presse__kopf .k2-modal__titel { font-size: 17px; }
.k2-presse__kopf .k2-modal__sub { font-size: 12.5px; }
/* Owner 08.09. (16"-Schirm): Die sechs Karten fuellen die Flaeche IMMER —
   auf kleinen wie auf grossen Bildschirmen. ~~grid-auto-rows: min-content~~
   liess die Zeilen nur so hoch werden wie ihr Inhalt; auf einem 16"-MacBook
   blieb darunter ein Drittel der Flaeche leer.
   `minmax(min-content, 1fr)` ist der Kern: mindestens so hoch wie der Inhalt
   (auf dem 13"-Schirm aendert sich dadurch NICHTS), aber sie strecken sich,
   sobald Platz da ist. Ein blosses `1fr` waere falsch — es duerfte auch
   SCHRUMPFEN und wuerde den Text auf engen Schirmen abschneiden. */
.k2-presse { flex: 1; display: grid; grid-template-columns: repeat(var(--presse-spalten), 1fr); grid-auto-rows: 1fr; gap: var(--presse-gap); padding: 16px 20px; overflow-y: auto; }
.k2-presse__karte { display: flex; flex-direction: column; height: 100%; min-height: 0; border: 1px solid var(--k2-rahmen-bd); border-radius: var(--k2-radius-karte); overflow: hidden; background: var(--c-surface); text-decoration: none; color: inherit; transition: box-shadow var(--t-fast), transform var(--t-fast), border-color var(--t-fast); }
.k2-presse__karte:hover { box-shadow: var(--sh-lg); transform: translateY(-2px); border-color: var(--kk-violet-300); text-decoration: none; }
.k2-presse__karte:focus-visible { outline: 2px solid var(--c-focus); outline-offset: 2px; }
/* Der Zuwachs geht ins BILD, nicht in Weissraum: die Kopfzeile nimmt den
   freien Platz der Karte (`flex: 1`), ihre Zeile waechst von der Mindesthoehe
   aus mit (`minmax(--presse-kopf-h, 1fr)`). Der Textblock darunter bleibt
   inhaltsbestimmt — er soll nicht auseinandergezogen werden. */
.k2-presse__kopfzeile { flex: 1; min-height: var(--presse-kopf-h); display: grid; grid-template-columns: 2fr 1fr; grid-template-rows: 1fr; align-items: stretch; overflow: hidden; }
.k2-presse__kopfzeile > * { min-height: 0; min-width: 0; }
.k2-presse__bild { width: 100%; height: 100%; object-fit: cover; display: block; background: var(--c-surface-muted); }
.k2-presse__marke { display: flex; align-items: center; justify-content: center; padding: 12px 14px; background: var(--kk-violet-50); border-left: 1px solid var(--kk-violet-100); }
.k2-presse__marke img { max-width: 100%; max-height: var(--presse-logo-h); width: auto; height: auto; }
.k2-presse__text { display: flex; flex-direction: column; flex: none; padding: 12px 15px 13px; }
.k2-presse__titel { font-size: 16.5px; font-weight: var(--fw-bold); line-height: 1.3; color: var(--c-text); margin-bottom: 7px; text-wrap: pretty; }
.k2-presse__anriss { font-size: 14px; line-height: 1.42; color: var(--c-text-muted); text-wrap: pretty; }
.k2-presse__fuss { display: flex; align-items: center; justify-content: space-between; gap: 10px; margin-top: auto; padding-top: 10px; }
.k2-presse__datum { font-size: 12px; color: var(--c-text-soft); font-variant-numeric: tabular-nums; }
.k2-presse__mehr { font-size: 12.5px; font-weight: var(--fw-bold); color: var(--c-primary); }
/* Unter ~1080 px reichen drei Spalten nicht mehr — dann zwei, darunter eine.
   ⚠ Die Grenze lag zuerst bei 1500 px; dadurch bekam ein 13"-MacBook zwei
   Spalten und drei Reihen, und die untere Reihe war abgeschnitten. */
@media (max-width: 1080px) { .k2-presse { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 720px) { .k2-presse { grid-template-columns: 1fr; } }
/* ~~Kennzahl + Hover-Herleitung (.k2-reform__zahl/__kennzahl)~~ und
   ~~die aufklappbare Flaeche (.k2-reform__flaeche/__punkt/__beleg)~~ — vom
   Owner am 08.09. aus der Anzeige genommen; der Klick oeffnet jetzt das
   Presse-Popup. Regeln entfernt, weil ohne Markup tot; die Slots bleiben
   gefuellt (konzept_regie), ein Rueckbau braucht nur das Markup zurueck. */
/* Owner 08.09.: Der Reform-Hinweis ist ein KNOPF. Als <button> braucht er die
   Browser-Voreinstellungen zurueckgesetzt (Rahmen, Polster, Textausrichtung,
   Schriftart erben nicht automatisch) — sonst steht er als graue Systemflaeche
   in der Konzeptseite. */
.k2-reform--knopf { width: calc(100% - 60px); padding: 0; font: inherit; color: inherit; text-align: left; cursor: pointer; }
.k2-reform--knopf:hover { border-color: var(--kk-violet-300); background: var(--k2-flaeche-aktiv); }
.k2-reform--knopf:focus-visible { outline: 2px solid var(--c-focus); outline-offset: 2px; }
.k2-reform__pfeil { flex: none; margin-left: auto; font-size: 18px; line-height: 1; color: var(--k2-aktion); }


/* Personen FINAL („gildemeister pluskind", 26.08.): Mehrpersonen-Haushalt.
   Titel-Chip „N Personen", Personen-Silhouetten (Inline-SVG, 13px,
   currentColor über --k2-pers) und der abgesetzte helle Kind-Container
   (eigene Beispielrechnung + Baustein-Zeile je mitversicherter Person). */
.k2-pers-chip { display: inline-flex; align-items: center; gap: 5px; margin-left: 8px; padding: 3px 10px; border-radius: var(--r-full); background: var(--k2-flaeche-aktiv); color: var(--k2-aktion); font-size: 11px; font-weight: var(--fw-bold); vertical-align: middle; }
.k2-pers-icon { flex: none; color: var(--k2-pers); }
.k2-kind { display: flex; flex-direction: column; gap: 10px; margin: 0 30px 22px; padding: 16px 18px; background: var(--k2-rail-bg); border: 1px solid var(--kk-grau-bd-leise); border-radius: var(--k2-radius-karte); }
.k2-kind__kopf { display: flex; align-items: baseline; gap: 8px; }
.k2-kind__kopf .k2-pers-icon { align-self: center; }
.k2-kind__name { font-size: 13.5px; font-weight: var(--fw-bold); }
.k2-kind__wert { margin-left: auto; font-size: 13px; font-weight: var(--fw-semibold); }
.k2-kind__statt { color: var(--c-text-soft); font-weight: var(--fw-medium); }
.k2-kind .k2-br { padding: 0; }
.k2-kind__bau { display: flex; flex-wrap: wrap; align-items: center; gap: 12px; padding-top: 10px; border-top: 1px solid var(--kk-grau-bd-leise); }
.k2-kind__bau-label { font-size: 10.5px; font-weight: var(--fw-bold); color: var(--c-text-soft); text-transform: uppercase; letter-spacing: .06em; }
.k2-kind__bau-name { font-size: 13px; font-weight: var(--fw-semibold); }
.k2-kind__bau .k2-btn-plus { margin-left: auto; }
/* Owner 02.09. (3. Runde): Kind-Container mit Baustein trägt DENSELBEN
   Körper wie die Hauptperson (_k2_bd_koerper.html: Kopf-Aufklapper,
   Tabelle, Hero, Fußzeile) — dieselben k2-bd__*-Klassen, nur der Abstand
   zwischen den Blöcken folgt dem Haupt-Kasten (16px statt 10px). */
.k2-kind:has(> .k2-bd__police) { gap: 16px; }
.k2-kind:has(> .k2-bd__police) > .k2-kind__kopf { padding-bottom: 6px; border-bottom: 1px solid var(--kk-grau-bd-leise); }

/* Gildemeister-Bonus-Box (Owner-Design-Handoff 26.08.): grüne Karte in der
   Schritt-2-Kassen-Fläche unter dem Kassenvergleich — Personen-Zeilen,
   Summenzeile mit Herleitungs-Hover, Hinweistext je Jahres-Zustand. */
.k2-bonus { display: flex; flex-direction: column; gap: 10px; margin: 0 30px 26px; padding: 16px 18px; background: var(--k2-gruen-bg-leise); border: 1px solid var(--k2-gruen-bd-leise); border-radius: var(--k2-radius-karte); }
.k2-bonus__kopf { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.k2-bonus__badge { display: inline-flex; align-items: center; padding: 3px 10px; border-radius: var(--r-full); background: var(--k2-gruen); color: var(--c-text-on-accent); font-size: 10.5px; font-weight: var(--fw-bold); text-transform: uppercase; letter-spacing: .06em; }

/* Schwangerschafts-Container (Owner 2026-09-01) — unter dem Preisstrahl, über
   der Bonus-Box. Gleiche Bauform wie .k2-bonus, nur zwei Farbwelten:
   --ist = aktuelle Situation (lila, Tokens der Reform-Fläche)
   --neu = vorgeschlagene Situation (grün, dieselben Tokens wie .k2-bonus).
   Keine eigenen Farbwerte — beide Sätze existieren bereits. */
.k2-ss { display: flex; flex-direction: column; gap: 10px; margin: 0 30px 26px; padding: 16px 18px; border-radius: var(--k2-radius-karte); }
.k2-ss--neu { background: var(--k2-gruen-bg-leise); border: 1px solid var(--k2-gruen-bd-leise); }
.k2-ss--ist { background: var(--k2-reform-bg); border: 1px solid var(--k2-reform-bd); }
/* Pille oben, Überschrift DARUNTER (Owner 01.09.): nebeneinander drängten sie
   die Logo-Zeile zusammen. Die Fett-Schrift trennt die beiden weiterhin
   deutlich genug, es braucht keine zweite Farbe. */
.k2-ss__kopf { display: flex; flex-direction: column; align-items: flex-start; gap: 6px; }
.k2-ss__badge { display: inline-flex; align-items: center; padding: 3px 10px; border-radius: var(--r-full); color: var(--c-text-on-accent); font-size: 10.5px; font-weight: var(--fw-bold); text-transform: uppercase; letter-spacing: .06em; }
.k2-ss--neu .k2-ss__badge { background: var(--k2-gruen); }
.k2-ss--ist .k2-ss__badge { background: var(--c-primary); }
.k2-ss__titel { font-size: 14px; font-weight: var(--fw-semibold); color: var(--c-text); }
.k2-ss__liste { display: flex; flex-direction: column; gap: 4px; }
/* Grid statt space-between: In der Vergleichs-Variante stehen zwei Wert-Spalten
   nebeneinander und müssen untereinander fluchten.
   Spaltenzahl EXPLIZIT je Variante — `repeat(auto-fit, …)` warf die Beträge in
   eine zweite Zeile (ohne definite Breite kollabiert auto-fit auf eine Spur). */
.k2-ss__zeile { display: grid; gap: 12px; align-items: baseline; font-size: 13px; }
/* Owner 02.09.: die Staffel-Zeile („3 × 40 €") erklärt den Betrag darüber —
   leiser gesetzt, damit sie die Zahlen nicht überstimmt. */
.k2-ss__zeile--fein { font-size: 11.5px; color: var(--c-text-muted); }
.k2-ss__zeile--fein .k2-ss__wert { font-weight: var(--fw-regular); color: var(--c-text-muted); }
.k2-ss--ist .k2-ss__zeile { grid-template-columns: 1fr max-content; }
.k2-ss--neu .k2-ss__zeile { grid-template-columns: 1fr 84px 84px; }
.k2-ss__zeile--kopf { font-size: 11px; color: var(--c-text-muted); text-transform: uppercase; letter-spacing: .05em; }
.k2-ss__name { color: var(--c-text); }
.k2-ss__wert { font-weight: var(--fw-semibold); font-variant-numeric: tabular-nums; white-space: nowrap; text-align: right; }
/* Der Alt-Wert ist der Bezugspunkt, nicht die Aussage — zurückgenommen. */
.k2-ss__wert--alt { font-weight: var(--fw-regular); color: var(--c-text-muted); }
.k2-ss__zeile.is-besser .k2-ss__wert:last-child { color: var(--k2-gruen); }
/* Summenzeile: Label und Betrag GLEICH GROSS (Owner 01.09.) — abgesetzt durch
   eine Linie, nicht durch kleinere Schrift. */
.k2-ss__summe { display: grid; gap: 12px; align-items: baseline; margin-top: 6px; padding-top: 8px; border-top: 1px solid var(--k2-rahmen-bd); font-size: 15px; font-weight: var(--fw-bold); }
.k2-ss--ist .k2-ss__summe { grid-template-columns: 1fr max-content; }
.k2-ss--neu .k2-ss__summe { grid-template-columns: 1fr 84px 84px; }
.k2-ss__summe-label { color: var(--c-text); }
/* Etwas kleiner als das Label (Owner 01.09.): die Summe ist die Einordnung,
   die AUSSAGE steht in der Unterschieds-Zeile darunter. */
.k2-ss__summe-wert { font-size: 13.5px; font-variant-numeric: tabular-nums; white-space: nowrap; text-align: right; }
.k2-ss--ist .k2-ss__summe-wert { color: var(--c-primary); }
.k2-ss--neu .k2-ss__summe-wert:last-child { color: var(--k2-gruen); }
.k2-ss--neu .k2-ss__summe-wert.is-schlechter { color: var(--k2-rot); }
.k2-ss__summe-wert--alt { font-weight: var(--fw-semibold); color: var(--c-text-muted); }
/* Logo-Köpfe über den Wert-Spalten. Ohne Logo greift der Kassenname als Text. */
/* Logo auf die KOMMA-Achse zentrieren (Owner 01.09.), nicht auf die Spalten-
   mitte: Die Beträge sind rechtsbündig, das Auge nimmt aber die Komma-Spalte
   als Symmetrieachse wahr. Weil die Nachkommastellen immer „00 €" sind und die
   Zahlen tabellarische Ziffern nutzen, liegt das Komma bei jeder Zeile im
   gleichen Abstand vom rechten Rand — dieser Abstand ist `--ss-komma-versatz`.
   `font-size` gleich der Wert-Spalte, damit `ch` dieselbe Ziffernbreite meint. */
/* Die Komma-Achse liegt bei jeder Zeile im GLEICHEN Abstand vom rechten Rand
   („00 €" ist immer gleich breit, die Zahlen nutzen tabellarische Ziffern) —
   das ist `--ss-komma-versatz`. Das Logo wird darauf verankert: `right` setzt
   seine rechte Kante aufs Komma, `translateX(50%)` schiebt es um die halbe
   EIGENE Breite zurück, sodass seine Mitte genau auf der Achse liegt.
   (Ein blosses `padding-right` + `center` zentriert nur in der verkleinerten
   Box — die Mitte landet dann auf der halben Strecke, nicht auf dem Komma.) */
/* ~~Komma-Achse~~ WIDERRUFEN (Owner-Screenshot 02.09., Bertelsmann BKK vs.
   BKK Gildemeister): ein breites Logo, auf dem Komma zentriert, ragt um die
   halbe eigene Breite in die Nachbarspalte und ueberlappt das zweite Logo.
   Jetzt: rechte Logo-Kante auf der Euro-Kante der Spalte (wie die Betraege
   rechtsbuendig), Breite auf die Spalte begrenzt — zwei Logos koennen sich
   nie mehr beruehren, und jedes steht ueber SEINEN Zahlen. */
.k2-ss__logo { position: relative; display: block; min-height: 26px; font-size: 13px; color: var(--c-text-muted); }
.k2-ss__logo img,
.k2-ss__logo-text { position: absolute; right: 0; top: 50%; transform: translateY(-50%); max-width: 100%; max-height: 22px; object-fit: contain; object-position: right center; }
.k2-ss__logo-text { font-size: 10px; text-align: center; white-space: nowrap; }
/* Unterschieds-Zeile: die eigentliche Aussage der Fläche. */
.k2-ss__diff { display: flex; justify-content: space-between; align-items: baseline; gap: 12px; margin-top: 8px; padding-top: 8px; border-top: 1px solid var(--k2-rahmen-bd); }
.k2-ss__diff-label { font-size: 14px; font-weight: var(--fw-semibold); color: var(--c-text); }
.k2-ss__diff-wert { font-size: 18px; font-weight: var(--fw-bold); font-variant-numeric: tabular-nums; white-space: nowrap; color: var(--k2-gruen); }
.k2-ss__diff-wert.is-schlechter { color: var(--k2-rot); }
.k2-ss__hinweis { font-size: 11.5px; color: var(--c-text-muted); }
/* Owner 01.09.: eine Stufe größer (13 → 15px) — der Kopf der Bonus-Box trägt
   das Thema und war gegen die Headline darunter zu leise. */
.k2-bonus__titel { font-size: 15px; font-weight: var(--fw-bold); }
.k2-bonus__kopf .k2-seg { margin-left: auto; }
/* Owner-Umbau 31.08. (Runde 2): Die Box führt mit der ZAHL — große Headline
   „bis zu X € Budget für Extrabausteine" (schaltet mit dem Jahres-
   Umschalter), darunter die 1-2-3-Schritte und die „Wichtig"-Zeile. */
.k2-bonus__flaeche { display: flex; flex-direction: column; gap: 14px; padding-top: 12px; border-top: 1px solid var(--k2-gruen-bd-leise); }
.k2-bonus__pot-zustand { display: flex; flex-direction: column; gap: 2px; }
.k2-bonus__headline { font-size: 1.5rem; font-weight: var(--fw-bold); letter-spacing: -.01em; color: var(--k2-gruen); text-wrap: pretty; }
.k2-bonus__pot-sub { font-size: 12px; color: var(--k2-gruen-label); }
.k2-bonus__schritte { display: flex; flex-direction: column; gap: 8px; }
.k2-bonus__schritt { display: flex; align-items: flex-start; gap: 10px; }
/* Nummer als Kreis — gleiche Bildsprache wie die grünen Haken der GKV-Zeilen */
.k2-bonus__nr { display: inline-flex; align-items: center; justify-content: center; width: 22px; height: 22px; flex: none; border-radius: var(--r-full); background: var(--k2-gruen); color: var(--c-text-on-accent); font-size: 12px; font-weight: var(--fw-bold); }
.k2-bonus__schritt-text { font-size: 13px; color: var(--k2-text-2); text-wrap: pretty; max-width: 620px; padding-top: 2px; }
.k2-bonus__wichtig { font-size: 12.5px; color: var(--k2-text-2); text-wrap: pretty; max-width: 640px; padding-top: 10px; border-top: 1px solid var(--k2-gruen-bd-leise); }
.k2-bonus__wichtig-label { font-weight: var(--fw-bold); color: var(--k2-gruen); }
.k2-bonus__zustand { display: flex; flex-direction: column; gap: 2px; }
.k2-bonus__zeile { display: flex; align-items: center; gap: 12px; padding: 9px 0; border-top: 1px solid var(--k2-gruen-bd-leise); }
.k2-bonus__spalte { display: flex; flex-direction: column; min-width: 0; }
.k2-bonus__name { font-size: 13px; font-weight: var(--fw-semibold); }
.k2-bonus__sub { font-size: 11.5px; color: var(--c-text-soft); }
/* Nachtrag Karte 203: Baustein-Zeilen je Person — die begründenden Tarife
   (Gesellschafts-Logo + Tarifname + Monatsbeitrag) unter der Personen-Zeile. */
.k2-bonus__bs { display: inline-flex; align-items: center; gap: 6px; margin-top: 4px; }
.k2-bonus__bs-logo { display: inline-flex; align-items: center; justify-content: center; width: 36px; height: 18px; padding: 2px; border-radius: var(--kr-radius-innen); background: var(--c-surface); flex: none; }
.k2-bonus__bs-logo img { max-width: 100%; max-height: 100%; object-fit: contain; }
.k2-bonus__bs-text { font-size: 11.5px; color: var(--c-text-soft); }
.k2-bonus__betrag { margin-left: auto; font-size: 13.5px; font-weight: var(--fw-semibold); color: var(--k2-gruen); }
.k2-bonus__summe { display: flex; align-items: baseline; gap: 12px; padding-top: 10px; border-top: 1px solid var(--k2-gruen-bd); }
.k2-bonus__summe-label { font-size: 12.5px; font-weight: var(--fw-bold); }
.k2-bonus__summe .k2-hover { margin-left: auto; }
.k2-bonus__abzug { font-size: 15px; font-weight: var(--fw-bold); color: var(--k2-gruen); }
.k2-bonus__hinweis { font-size: 11.5px; color: var(--c-text-soft); text-wrap: pretty; }
/* Karte 203 (Track D, Owner-Entscheid ~14:55): Rechnungs-Zeilen-Design der
   Bonus-Box — je Person eine Plus-Zeile, Summenzeile „zahlt dir zurück",
   Monats-Erklärsatz; Quelle/Detail im details-Aufklapper (.k2-bonus__mehr)
   statt in der Fläche. (Die unterlegene auszahlungs-zentrierte
   Vergleichs-Variante ist samt ?bonus_design-Param entfernt.) */
.k2-bonus__monat { font-size: 12px; color: var(--c-text-soft); }
.k2-bonus__mehr { margin-top: 2px; }
.k2-bonus__mehr-knopf { list-style: none; cursor: pointer; font-size: 11.5px; font-weight: var(--fw-semibold); color: var(--k2-gruen); }
.k2-bonus__mehr-knopf::-webkit-details-marker { display: none; }
.k2-bonus__mehr[open] .k2-brx__pfeil { display: inline-block; transform: rotate(180deg); }

/* Segmented-Umschalter .k2-seg (Konvention 26.08., geteilt mit Track B —
   Bonus-Jahr 1/2; aktives Segment gefüllt, JS toggelt data-bonus-zustand). */
.k2-seg { display: inline-flex; gap: 2px; padding: 3px; border-radius: var(--r-full); background: var(--k2-seg-bg); }
.k2-seg__btn { border: 0; background: transparent; padding: 4px 12px; border-radius: var(--r-full); font-size: 11.5px; font-weight: var(--fw-semibold); color: var(--c-text-muted); cursor: pointer; }
.k2-seg__btn:hover { color: var(--c-text); }
.k2-seg__btn--aktiv, .k2-seg__btn--aktiv:hover { background: var(--k2-gruen); color: var(--c-text-on-accent); cursor: default; }
/* B5 (Owner 03.09.): Umfang-Umschalter „Für dich relevant / Alle Leistungen" —
   dieselbe k2-seg-Pille, unter der „Deckt:"-Zeile der Police bzw. unter dem
   Kopf der Konsolen-Kachel. Zustände vorgerechnet, app.js §Umfang blendet um. */
.k2-pol__umfang { margin-top: var(--sp-2); align-self: flex-start; }
.leistung-block__umfang { margin: var(--sp-2) 0 0; }

/* Bonus-Chip am gewählten Baustein-Kasten (Gildemeister-Handoff 26.08., Track B —
   Konvention geteilt mit C: grüne Pill mit gestricheltem Rand, hängt sich als
   data-bonus-zustand-Paar in den k2-seg-Umschalter der Bonus-Box ein). */
.k2-bonus-chip { display: inline-flex; align-items: center; margin-top: 4px; padding: 3px 10px; width: fit-content; border-radius: var(--r-full); background: var(--k2-gruen-bg); border: 1px dashed var(--k2-gruen-bd); color: var(--k2-gruen); font-size: 11px; font-weight: var(--fw-semibold); }

/* Beispielrechnung Schritt 2: 4 Spalten (Ohne / Mit / Ersparnis). */
.k2-br__kopf--s2, .k2-br__zeile--s2 { grid-template-columns: 1fr 120px 120px 120px; }
.k2-br__wert--mit { color: var(--c-text); }
.k2-br__wert--spar { font-weight: var(--fw-bold); color: var(--k2-gruen); }
/* Herleitungs-Hover der Wert-Zellen rechts verankern (Muster kr-reform__beleg):
   links verankert liefe der 320px-Pop am rechten Board-Rand aus dem Viewport. */
.k2-br__wert .hover-info__pop { left: auto; right: 0; }

/* Aufklappbare Behandlungszeile (README §Interaktionen): erscheint NUR bei
   kuratiertem Beispielfoto des Kontos; runder 68px-Slot (2-Euro-Größe),
   CSS-only über natives details/summary — kein JS. */
.k2-brx { display: flex; flex-direction: column; }
.k2-brx__kopf { list-style: none; cursor: pointer; }
.k2-brx__kopf::-webkit-details-marker { display: none; }
.k2-brx__pfeil { font-size: 10px; color: var(--k2-text-soft2); }
.k2-brx[open] .k2-brx__pfeil { display: inline-block; transform: rotate(180deg); }
.k2-brx__body { display: flex; align-items: flex-start; gap: 14px; padding: 0 0 14px 14px; }
.k2-brx__foto { width: 68px; height: 68px; border-radius: var(--r-full); object-fit: cover; border: 1px solid var(--k2-rahmen-bd); }
/* Stichpunkte + Platzhalter-Slot (Owner 2026-08-25): Bullets aus dem
   Konto-Backoffice; ohne Foto zeigt der Slot einen neutralen Platzhalter,
   bis der Owner Bilder hochlädt. */
.k2-brx__foto--leer { display: inline-flex; align-items: center; justify-content: center; flex: none; font-size: 22px; background: var(--k2-chip-bg); border-style: dashed; }
.k2-brx__punkte { display: flex; flex-direction: column; gap: 6px; min-width: 0; }
.k2-brx__punkt { display: flex; align-items: baseline; gap: 9px; font-size: 12.5px; color: var(--k2-text-2); text-wrap: pretty; }
.k2-brx__punkt-dot { width: 5px; height: 5px; flex: none; border-radius: var(--r-full); background: var(--kk-violet-300); transform: translateY(-2px); }

/* ── k2 Szenario-Frage-Karten (Owner 2026-08-25, Runde 3): Prod-Karten des
   alten Flows im v2-Look — Frage + Heute-Zeile + Warnpille + Wert/Stufe
   rechts, Punkte klappen per nativem details auf, Bild-Slot links. */
/* UI-Ticket 26.08.: gleicher 30px-Einzug wie k2-br/k2-programm — die Karten
   liefen breiter als die übrigen Boxen der Fläche (Owner-Screenshot). */
.k2-sz { display: flex; flex-direction: column; gap: 10px; margin: 0 30px 20px; }
/* Karte 198 (Track D, Monopol-Ausnahme): EIN Container um die Szenario-Karten
   je Thema mit Regie-Headline („Warum ein Zusatzbaustein X wichtig ist") —
   heller Kasten wie .k2-kind; der Container übernimmt den 30px-Einzug,
   der innere .k2-sz-Block verliert ihn (additiv, Karten-Markup unverändert). */
.k2-szc { display: flex; flex-direction: column; gap: 12px; margin: 0 30px 20px; padding: 16px 18px; background: var(--k2-rail-bg); border: 1px solid var(--kk-grau-bd-leise); border-radius: var(--k2-radius-karte); }
.k2-szc__titel { font-size: 14.5px; font-weight: var(--fw-bold); }
.k2-szc .k2-sz { margin: 0; }
/* Karte 200 (Track D): Klapp-Pfeil — toggelt die vorgerenderten
   Kategorien-Blöcke (data-k2-brk-inhalt, app.js). ~~an der
   Beispielrechnungs-Posten-Zeile~~ seit Karte 225 (Owner 28.08.) am
   eigenen Öffner des Programm-Blocks. */
.k2-brk__pfeil { flex: none; border: 0; background: none; padding: 0 2px; cursor: pointer; font-size: 12px; color: var(--k2-text-soft2); line-height: 1; }
/* Karte 225/200 (Owner 28.08.): Kategorien-Öffner direkt am Programm-Block
   (Rest-Beispielrechnung entfiel ersatzlos) — Spiegel-Optik zum
   kr-mehr-Öffner „Was zahlt die Kasse bereits?" (zentriert, caption). */
.kr-programm__oeffner { display: flex; justify-content: center; align-items: center; gap: var(--sp-1); margin: 0; font-size: var(--fs-caption); font-weight: var(--fw-semibold); color: var(--c-primary); }
/* Karte 201 (Track D): ✗-Bullets in der Risiko-Box (statt intro-Satz) —
   rotes ✕ wie die Lücken-Zeilen der Beispielrechnung (--kr-rose). */
.k2-tk__bullets { display: flex; flex-direction: column; gap: 6px; margin-top: 4px; }
.k2-tk__bullet { display: flex; gap: 8px; align-items: baseline; font-size: 13px; color: var(--k2-text-2); text-align: left; }
.k2-tk__bullet-x { flex: none; color: var(--kr-rose); font-weight: var(--fw-bold); }
/* Trello 227: neutrale Punkt-Variante fuer Aufzaehlungen OHNE
   "fehlt dir"-Semantik (Kosten-Stichpunkte der Risiko-Karte) —
   Punkt statt Kreuz, gleiche Bullet-Zeile. */
.k2-tk__bullet-dot { width: 5px; height: 5px; flex: none; border-radius: var(--r-full); background: var(--kr-rose); transform: translateY(-2px); }
.k2-sz__karte { background: var(--c-surface); border: 1px solid var(--k2-rahmen-bd); border-radius: var(--k2-radius-karte); }
.k2-sz__kopf { list-style: none; display: flex; align-items: flex-start; gap: 14px; padding: 14px 16px; cursor: pointer; }
.k2-sz__kopf::-webkit-details-marker { display: none; }
.k2-sz__foto { flex: none; }
.k2-sz__spalte { display: flex; flex-direction: column; gap: 4px; min-width: 0; }
.k2-sz__frage { font-size: 14.5px; font-weight: var(--fw-bold); }
.k2-sz__heute { font-size: 12.5px; color: var(--c-text-muted); text-wrap: pretty; }
.k2-sz__pille { align-self: flex-start; display: inline-flex; align-items: center; gap: 5px; padding: 3px 10px; border-radius: var(--r-full); background: var(--k2-rot-bg); border: 1px solid var(--k2-rot-bd-leise); color: var(--k2-rot); font-size: 11px; font-weight: var(--fw-bold); cursor: help; }
.k2-sz__mehr { font-size: 12px; font-weight: var(--fw-semibold); color: var(--k2-aktion); }
.k2-sz__karte[open] .k2-brx__pfeil { display: inline-block; transform: rotate(180deg); }

/* ── Zahn-Karten: fest statt aufklappbar (Owner 08.09.) ──────────────────────
   Owner: „das Ausklappbare kann verwirren" — die Karte zeigt alles auf einen
   Blick. Kein `<details>`, also auch kein Zeigefinger-Cursor und keine
   Klick-Affordanz; das Bild wird groesser und steht MITTIG in seiner Spalte,
   statt oben zu kleben. Spec: wissen/design-system.md §Zahn-Ist-Situation. */
.k2-sz__karte--fest .k2-sz__kopf { cursor: default; align-items: center; gap: 18px; padding: 16px 18px; }
.k2-sz__karte--fest .k2-sz__foto { width: var(--sz-fest-foto); height: var(--sz-fest-foto); border-radius: var(--r-md); object-fit: cover; align-self: center; }
.k2-sz__karte--fest .k2-sz__spalte { gap: 6px; }
.k2-sz__karte--fest .k2-sz__frage { font-size: 16px; }
.k2-sz__karte--fest .k2-sz__heute { font-size: 13.5px; }
/* Die Rechnung steht als eigene Zeile unter dem Heute-Satz — Zahlen mit
   tabellarischen Ziffern, damit die Betraege untereinander fluchten. */
.k2-sz__rechnung { display: flex; flex-wrap: wrap; gap: 4px 14px; font-size: 13.5px; font-variant-numeric: tabular-nums; color: var(--c-text); }
.k2-sz__rechnung-teil { white-space: nowrap; }
.k2-sz__rechnung-teil--eigen { font-weight: var(--fw-bold); color: var(--k2-rot); }
/* „Übernommen" — die eine Zahn-Karte, die zeigt, was die Kasse ZAHLT. */
.k2-sz__gedeckt { display: inline-flex; align-items: center; gap: 6px; padding: 5px 12px; border-radius: var(--r-full); background: var(--k2-gruen-bg); border: 1px solid var(--k2-gruen-bd); color: var(--k2-gruen); font-size: 12.5px; font-weight: var(--fw-bold); white-space: nowrap; }
.k2-sz__gedeckt-haken { font-size: 13px; }
.k2-sz__karte--fest.k2-sz__karte--gedeckt { border-color: var(--k2-gruen-bd-leise); background: var(--k2-gruen-bg-leise); }
.k2-sz__rechts { margin-left: auto; display: flex; flex-direction: column; align-items: flex-end; gap: 6px; flex: none; }
.k2-sz__wert { font-size: 14px; font-weight: var(--fw-bold); }
.k2-sz__stufe { display: inline-flex; align-items: center; padding: 3px 10px; border-radius: var(--r-full); border: 1px solid var(--k2-trenner); color: var(--c-text-soft); font-size: 10px; font-weight: var(--fw-bold); text-transform: uppercase; letter-spacing: .06em; white-space: nowrap; }
.k2-sz__stufe--hoch, .k2-sz__stufe--mittel { border-color: var(--k2-rot-bd-leise); color: var(--k2-rot); }
.k2-sz__punkte { display: flex; flex-direction: column; gap: 6px; padding: 0 16px 14px 98px; }
/* UI-Ticket 26.08. (Dopplung): zugeordnete Beispielrechnungs-Zeilen leben IN
   der Karte (gleicher Einzug wie die Punkte); Zeilen-Optik = k2-br. */
.k2-sz__beispiele { display: flex; flex-direction: column; padding: 0 16px 14px 98px; }
.k2-sz__beispiele-kopf { border-top: 1px solid var(--k2-trenner); }

/* Baustein-Leiste mit dem B-Popup-Öffner. */
.k2-bau { display: flex; flex-wrap: wrap; align-items: center; gap: 14px; margin: 22px 30px 26px; padding: 16px 20px; border-radius: var(--k2-radius-karte); background: var(--k2-rail-bg); border: 1px solid var(--k2-rahmen-bd); }
.k2-bau__logo { display: inline-flex; align-items: center; justify-content: center; padding: 6px 12px; border-radius: 8px; background: var(--c-surface); border: 1px solid var(--k2-trenner); }
.k2-bau__logo img { max-height: 26px; max-width: 110px; object-fit: contain; }
.k2-bau__logo--leer { width: 64px; height: 38px; padding: 0; border: 1px dashed var(--kk-grau-bd-dash); color: var(--k2-text-soft2); font-size: 14px; font-weight: var(--fw-bold); }
.k2-bau__spalte { display: flex; flex-direction: column; }
/* Owner 02.09. (bereits versichert): Monogramm-Fallback des Bestandsanbieters
   (solider Rahmen statt gestricheltem Plus) + grünes Kicker-Label. */
.k2-bau__logo--bestand { border-style: solid; color: var(--c-text-soft); }
.k2-bau__label--bestand { color: var(--kk-green); }
.k2-bau__label { font-size: 10.5px; font-weight: var(--fw-bold); color: var(--c-text-soft); text-transform: uppercase; letter-spacing: .06em; }
/* Begründende Zeile am Baustein (Owner 03.09., Zahn: „Es fehlen 2 Zähne ·
   Zuschlag 21,80 €/Monat") — gedämpft unter Name und Beitrag. */
.k2-bau__hinweis { color: var(--c-text-soft); }
.k2-bau__name { font-size: 14px; font-weight: var(--fw-bold); }
.k2-bau__beitrag { font-size: 12px; color: var(--c-text-muted); }
.k2-bau__btn { margin-left: auto; }

/* Violette Aktions-Pill (Popup-Öffner Kassen/Baustein). */
.k2-btn-aktion { display: inline-flex; align-items: center; padding: 10px 18px; border-radius: var(--btn-radius); background: var(--k2-aktion); color: var(--c-text-on-accent); font-size: 12.5px; font-weight: var(--fw-bold); cursor: pointer; border: 0; flex: none; }
.k2-btn-aktion:hover { background: var(--k2-akzent); color: var(--c-text-on-accent); }
/* Trello 283/284 (Owner 04.09.): „Baustein hinzufügen" ist ÜBERALL nur noch ein
   runder Plus-Button — kein Text-Button mehr. Der Text lebt im aria-label/title. */
/* Owner-Karte 280 (04.09.): „Baustein vergleichen" ist im Baustein-Detail
   DERSELBE Kreis wie der Plus-Knopf, nur als Kontur mit „⇄". Darum teilen
   .k2-btn-plus und .k2-btn-kreis EINE Geometrie (ein Mass, eine Quelle); der
   Text lebt in beiden Faellen im aria-label/title, nie als Beschriftung. */
.k2-btn-plus, .k2-btn-kreis { display: inline-flex; align-items: center; justify-content: center; width: var(--k2-btn-plus-groesse); height: var(--k2-btn-plus-groesse); border-radius: 50%; font-weight: var(--fw-bold); line-height: 1; cursor: pointer; padding: 0; flex: none; }
.k2-btn-plus { background: var(--k2-aktion); color: var(--c-text-on-accent); font-size: 22px; border: 0; }
.k2-btn-kreis { background: var(--c-surface); border: 1px solid var(--kk-bf-flieder-bd); color: var(--kk-violet-700); font-family: inherit; font-size: 16px; }
.k2-btn-kreis:hover { background: var(--kk-violet-50); color: var(--kk-violet-700); }
/* Karte 280: der Kreis sitzt in der Tarif-Kopfzeile neben dem Tarifnamen und
   traegt dort den Freiraum-Anker — sonst bleibt er bei der Kopf-Spalte. */
.k2-bd__vgl { margin-right: auto; }
.k2-bd__kopfzeile:has(> .k2-bd__vgl) > .k2-bd__kopf-spalte { margin-right: 0; }
.k2-btn-plus:hover { background: var(--k2-akzent); color: var(--c-text-on-accent); }
.k2-kind__bau--leer { justify-content: flex-end; }

/* Baustein-Detail „Mehrwert statt Minus" (Owner-Design-Handoff 28.08.,
   Prototyp Sektion drei-a + Zustand B): Hero-Zeile = Leistungs-Hero (grün,
   großer Erstattungssatz) + Preis-Karte (lila, Szenario-Copy mehrkosten/
   neu/ersparnis — NIE rote Minus-Zahl) · Beispiel-Tabelle KOSTET / DU
   ZAHLST NUR / BAUSTEIN ÜBERNIMMT (tabular-nums) · Baustein-Karte mit
   Outline- und Navy-CTA-Button. Rendert NUR aus dem A-Vertragsfeld
   themen[].mehrwert; Spec: wissen/design-system.md §Baustein-Detail. */
/* Großprojekt „Baustein-Fokus" (Design-Handoff 3108, Owner 31.08.): der
   Container wird BEIGE (--kk-bf-*), Aufbau Kopfzeile → Leistungsfeld →
   Hero → Reiter → Fußzeile. Der Baustein wird verkauft, nicht der Preis
   verglichen. */
.k2-bd { display: flex; flex-direction: column; gap: 16px; background: var(--kk-bf-bg); border: 1px solid var(--kk-bf-bd); border-radius: 18px; padding: 24px; margin: 0 30px 22px; }
/* §2 Tarif-Kopfzeile: Logo-Box weiß + Name/Unterzeile + Broschüre rechts. */
.k2-bd__kopfzeile { display: flex; align-items: center; gap: 14px; }
/* Owner 02.09. (Design): Kopfzeile + Reiter-Leiste sind EIN Aufklapper
   (details, Muster .k2-reform) — zu zeigt nur Logo/Name/Unterzeile + den
   großen Pfeil rechts (derselbe .vk-vorteil__pfeil wie „Krankenkassenreform
   2027"), auf zeigt die Reiter-Leiste. Der Pfeil dreht per [open]. */
.k2-bd__police { display: flex; flex-direction: column; gap: 14px; }
/* Owner 02.09.: der Aufklapper geht sichtbar NACH UNTEN auf. Ohne das
   verankerte der Browser beim Öffnen den Scroll an einem Element UNTER
   dem Aufklapper und sprang ans Ende des neuen Inhalts (Screenshot).
   app.js rollt den Kopf zusätzlich an die Oberkante. */
.k2-detail__panel { overflow-anchor: none; }
.k2-bd__police > summary { cursor: pointer; list-style: none; }
.k2-bd__police > summary::-webkit-details-marker { display: none; }
.k2-bd__kopf-pfeil { flex: none; margin-left: 4px; }
.k2-bd__police[open] > summary .vk-vorteil__pfeil { transform: rotate(180deg); }
/* Owner 04.09.: Die Reiter-Leiste liegt nicht mehr IM details, sondern als
   Geschwister HINTER der immer sichtbaren Vorteils-Bühne (.vb) — der
   Aufklapper hält nur noch die Kopfzeile. Sichtbar wird die Leiste am
   open-Zustand des Aufklappers (Geschwister-Selektor), mit demselben
   Drop-in wie die Tab-Panels. */
.k2-bd__police-inhalt { display: none; }
.k2-bd__police[open] ~ .k2-bd__police-inhalt { display: block; transform-origin: top center; animation: k2-bd-auf var(--dur-base) var(--ease-out); }
.k2-bd__logo { display: inline-flex; align-items: center; justify-content: center; background: var(--c-surface); border: 1px solid var(--kk-bf-innen-bd); border-radius: 10px; padding: 8px 12px; flex: none; }
.k2-bd__logo img { max-height: 26px; max-width: 96px; object-fit: contain; }
.k2-bd__kopf-spalte { display: flex; flex-direction: column; gap: 2px; margin-right: auto; min-width: 0; }
.k2-bd__tarifname { font-size: 1.0625rem; font-weight: var(--fw-bold); }
.k2-bd__kopf-sub { font-size: 12px; color: var(--kk-bf-sand); }
/* Karte 262 (Owner): „Wenn dieser Baustein Geld spart, dann wuerde ich das oben
   rechts neben ZahnPRIVAT 90 positionieren." Rechtsbuendiger Zweizeiler im
   freien Platz der Kopfzeile (die Kopf-Spalte schiebt ihn per margin-right:auto
   nach rechts); steht vor dem Broschuere-Button und funktioniert mit wie ohne
   ihn. Betrag bewusst KLEINER als der Hero-Betrag war (1.375rem statt 1.75rem)
   und OHNE den gruenen Unterstrich: in der Kopfzeile konkurriert er sonst mit
   dem Tarifnamen (1.0625rem) — das war Karte 259 (a)/(c). */
.k2-bd__kopf-spart { display: flex; flex-direction: column; align-items: flex-end; gap: 1px; flex: none; text-align: right; }
.k2-bd__kopf-spart-betrag { font-size: 1.375rem; font-weight: var(--fw-bold); color: var(--kk-green); line-height: 1.15; white-space: nowrap; font-variant-numeric: tabular-nums; }
.k2-bd__kopf-spart-text { font-size: 11.5px; font-weight: var(--fw-semibold); color: var(--kk-green); white-space: nowrap; }
/* Owner-Ticket 31.08.: „Broschüre öffnen" auf der hellen Reform-Fläche statt
   dunkel — dieselben Tokens wie `.k2-band`/`.k2-reform`, Beschriftung dunkel.
   Größe unverändert: die 1px-Kante ist im Padding abgetragen (8/15 + Rahmen
   = die alten 9/16). */
.k2-bd__broschuere { display: inline-flex; align-items: center; gap: 7px; background: var(--k2-reform-bg); color: var(--k2-akzent); border: 1px solid var(--k2-reform-bd); border-radius: 10px; padding: 8px 15px; font-family: inherit; font-size: 13px; font-weight: var(--fw-semibold); text-decoration: none; cursor: pointer; flex: none; }
.k2-bd__broschuere:hover { background: var(--k2-chip-bg); color: var(--k2-akzent); text-decoration: none; }
/* Teil 2 (Owner 31.08.): dieselbe Kopfzeile auf der Kassen-Fläche — die
   liegt nicht im Beige-Container, darum eigener Außenabstand. */
.k2-bd__kopfzeile--kasse { padding: 0 30px 14px; }
/* §3 grünes Leistungsfeld: ~~zweispaltiges Raster~~ (der alte Text meinte
   Label/Wert je Zeile), kein Erklärsatz. */
/* Karte 260 (Owner): „Platz sparen an dieser Tabelle. Bitte so bauen wie bei
   Eckdaten aus der Police." Das Feld ist jetzt DASSELBE zweispaltige Raster
   wie .k2-bd__eckdaten — zehn Leistungszeilen belegen fünf Rasterzeilen statt
   zehn. Übernommen ist die GEOMETRIE des Eckdaten-Rasters (zwei Spalten,
   gap 4/24, Zeilen-Padding 6px); Farbe und Schriftgrade bleiben die des
   Leistungsfelds: es ist die Verkaufsfläche, seine fetten grünen Werte sind
   gewollte Hierarchie (design-system §Baustein-Fokus), und die 0,5 px
   Label-Differenz zu den Eckdaten spart keine messbare Höhe. */
.k2-bd__leistungsfeld { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 4px 24px; background: var(--kk-bf-gruenfeld-bg); border: 1px solid var(--kk-bf-gruenfeld-bd); border-radius: 16px; padding: 16px 20px; }
/* Die Überschrift ist kein Rasterfeld: ohne die Vollbreite rutschte die erste
   Leistungszeile neben sie in Spalte 2. */
.k2-bd__lf-titel { grid-column: 1 / -1; font-size: 14.5px; font-weight: var(--fw-bold); color: var(--kk-bf-gruen-tief); padding-bottom: 8px; }
.k2-bd__lf-zeile { display: flex; align-items: baseline; justify-content: space-between; gap: 14px; padding: 6px 0; border-top: 1px solid var(--kk-bf-gruen-trenner); }
.k2-bd__lf-label { font-size: 12.5px; color: var(--kk-bf-gruen-zeile); min-width: 0; text-wrap: pretty; }
.k2-bd__lf-wert { font-size: 12.5px; font-weight: var(--fw-bold); color: var(--kk-green); white-space: nowrap; font-variant-numeric: tabular-nums; }
/* Lang-Werte (Trello 243, z. B. Leistungsstaffel): volle Breite — Label
   oben, Wert mehrzeilig darunter; nowrap-Falle bewusst aufgehoben (Lehre
   kr-deckung 13.08.: Daten-Texte variabler Länge nie nowrap).
   Karte 260: im Raster heißt „volle Breite" jetzt grid-column: 1 / -1 —
   dieselbe Mechanik wie .k2-bd__eck-zeile--lang, damit ein langer Wert nicht
   in eine halbe Spalte gequetscht wird. */
.k2-bd__lf-zeile--lang { grid-column: 1 / -1; flex-direction: column; align-items: flex-start; gap: 2px; }
.k2-bd__lf-wert--lang { white-space: normal; text-wrap: pretty; text-align: left; min-width: 0; }
/* Leistungsstaffel als Tabelle (Owner 02.09., Karte „Staffel-Tabelle"): oben die
   Jahre, darunter immer die Summe — EINE Komponente für Reiter, Abschluss-
   Eckdaten, Baustein-Popup und Tarif-Duell (Makro _staffel_tabelle.html).
   Spalten gleich breit (flex 1 1 0), auf Handybreite scrollt die Tabelle IN
   ihrem Container (overflow-x), nie die Seite. Farben erbt die Wertzeile vom
   Kontext (grün im Leistungsfeld, Ink im Abschluss). */
/* Owner-Screenshot 02.09. (3, Vergleichs-Popup): ~~flex-Zeilen + nowrap-Köpfe +
   overflow-x~~ widerrufen — in schmalen Zellen überlappten die Spalten und ein
   Scrollbalken erschien. Jetzt ein echtes Raster (grid; die Zeilen sind
   display:contents, data-spalten liefert die Spaltenzahl): Spalten gleich breit
   (minmax(0,1fr)), Köpfe UND Werte dürfen umbrechen, nichts läuft in die
   Nachbarzelle. In schmalen Kontexten (data-liste: Baustein-Popup, Tarif-Duell)
   kippt dasselbe Markup per grid-auto-flow: column in eine Liste
   „Jahr | Summe" je Zeile. */
.k2-staffel { display: grid; grid-template-columns: repeat(var(--staffel-n, 5), minmax(0, 1fr)); gap: 2px var(--sp-2); width: 100%; max-width: 100%; font-variant-numeric: tabular-nums; }
.k2-staffel[data-spalten="1"] { --staffel-n: 1; }
.k2-staffel[data-spalten="2"] { --staffel-n: 2; }
.k2-staffel[data-spalten="3"] { --staffel-n: 3; }
.k2-staffel[data-spalten="4"] { --staffel-n: 4; }
.k2-staffel[data-spalten="5"] { --staffel-n: 5; }
.k2-staffel[data-spalten="6"] { --staffel-n: 6; }
.k2-staffel[data-spalten="7"] { --staffel-n: 7; }
.k2-staffel[data-spalten="8"] { --staffel-n: 8; }
.k2-staffel__zeile { display: contents; }
.k2-staffel__jahr, .k2-staffel__wert { min-width: 0; text-align: left; overflow-wrap: anywhere; }
.k2-staffel__jahr { font-size: var(--fs-caption); font-weight: var(--fw-semibold); color: var(--staffel-jahr-fg); border-bottom: 1px solid var(--staffel-trenner); padding-bottom: 2px; }
.k2-staffel__wert { padding-top: 2px; white-space: normal; text-wrap: pretty; }
.k2-staffel[data-liste] { grid-template-columns: auto minmax(0, 1fr); grid-template-rows: repeat(var(--staffel-n, 5), auto); grid-auto-flow: column; gap: 3px 10px; align-items: baseline; }
.k2-staffel[data-liste] .k2-staffel__jahr { border-bottom: 0; padding-bottom: 0; white-space: nowrap; }
.k2-staffel[data-liste] .k2-staffel__wert { padding-top: 0; }
/* Der Wert-Container der Lang-Zeile ist flex-start-ausgerichtet (Textbreite) —
   die Staffel braucht die volle Zeilenbreite. */
.k2-bd__lf-wert--staffel { align-self: stretch; width: 100%; }
.k2-pol__eck-zeile--staffel { flex-direction: column; align-items: stretch; gap: 2px; }
.k2-pol__eck-zeile--staffel .k2-pol__eck-wert { text-align: left; }
.k2-cmp__zelle--staffel { text-align: left; }
/* §5 Reiter: CSS-only (radio + :has), aktiver Tab weiß mit Sand-Rand. */
.k2-bd__tabs { display: flex; flex-direction: column; gap: 14px; }
.k2-bd__tabradio { position: absolute; opacity: 0; pointer-events: none; }
/* Karte 256 (Owner): der Container liegt DAUERHAFT um die Reiter-Gruppe (nicht
   nur um den aktiven Tab) — eine umrandete Segment-Leiste (Track). Die Reiter
   teilen sich EINE Reihe gleicher Höhe (flex:1 gleichmäßig; align-items:stretch
   des Flex-Rows egalisiert die Höhe), der vierte Tab bricht nicht mehr verwaist
   um. Auf sehr schmaler Breite bricht der Text INNERHALB der Segmente statt der
   Reihe (kein nowrap) — die Leiste bleibt eine Reihe. */
.k2-bd__reiter { display: flex; gap: 4px; padding: 4px; background: var(--kk-bf-reiter-bg); border: 1px solid var(--kk-bf-tab-bd); border-radius: 12px; }
.k2-bd__reiter-tab { flex: 1 1 0; min-width: 0; display: inline-flex; align-items: center; justify-content: center; text-align: center; padding: 7px 10px; border-radius: 8px; border: 1px solid transparent; font-size: 12.5px; font-weight: var(--fw-semibold); color: var(--kk-ink); text-wrap: pretty; cursor: pointer; }
/* Owner 04.09. (Trello 289): ~~color: var(--kk-bf-sand)~~ — der Sandton (Hex A79A80)
   las sich auf der hellen Leiste als „komisches Gelb“ und war schlecht lesbar.
   Jetzt --kk-ink wie der AKTIVE Reiter; unterschieden wird weiter über Fläche,
   Rahmen und das gedrehte Caret — das trug die Unterscheidung ohnehin. */
/* Trello 250: ~~faelle-Tab~~ — „So wirkt das konkret" ist feste Sektion;
   das grüne Leistungsfeld ist der erste Tab (--leistung). */
/* Karte 263 (Owner 01.09.): ~~[for$="-eckdaten"]~~ — der Eckdaten-Reiter ist
   entfallen, seine Formalia stehen im Leistungs-Tab. Regel hier entfernt,
   weil ein Selektor ohne Element nichts schützt (tote CSS-Regel). */
/* Owner 02.09.: Die Leiste steht ÜBER „So wirkt das konkret", alle Reiter
   starten ZU (kein Radio checked → kein Panel sichtbar; app.js schließt einen
   offenen Reiter beim zweiten Klick). Der Broschüre-Button sitzt als letztes
   Segment rechts in der Leiste — flex:none, damit die Reiter den Rest teilen. */
.k2-bd__reiter .k2-bd__reiter-broschuere { flex: none; padding: 6px 12px; border-radius: 8px; font-size: 12.5px; }
.k2-bd__tabs:has(.k2-bd__tabradio--leistung:checked) [for$="-leistung"],
.k2-bd__tabs:has(.k2-bd__tabradio--beitrag:checked) [for$="-beitrag"],
.k2-bd__tabs:has(.k2-bd__tabradio--kasse:checked) [for$="-kasse"] { background: var(--c-surface); border-color: var(--kk-bf-tab-bd); color: var(--kk-ink); }
/* Owner 02.09. (Feedback beim Aufklappen — „es expandiert einfach, keine
   Orientierung"): (1) der Reiter wechselt seine Optik weich (Motion-Tokens),
   (2) das Caret am Reiter dreht sich beim offenen Reiter (Zustand sichtbar am
   Knopf), (3) das Panel klappt kurz nach unten auf (kk-Drop-in-Muster, ab der
   Oberkante). prefers-reduced-motion schaltet global alles ab. */
.k2-bd__reiter-tab { transition: background var(--t-fast), border-color var(--t-fast), color var(--t-fast); }
.k2-bd__reiter-caret { flex: none; margin-left: 6px; font-size: 11px; line-height: 1; transition: transform var(--t); }
.k2-bd__tabs:has(.k2-bd__tabradio--leistung:checked) [for$="-leistung"] .k2-bd__reiter-caret,
.k2-bd__tabs:has(.k2-bd__tabradio--beitrag:checked) [for$="-beitrag"] .k2-bd__reiter-caret,
.k2-bd__tabs:has(.k2-bd__tabradio--kasse:checked) [for$="-kasse"] .k2-bd__reiter-caret { transform: rotate(180deg); }
@keyframes k2-bd-auf { from { opacity: 0; transform: translateY(-8px) scaleY(.97); } to { opacity: 1; transform: none; } }
/* Karte 263: der erste Reiter traegt jetzt zwei Bloecke (Leistungsfeld +
   Police-Formalia) — ohne gap kleben die beiden Karten aufeinander. */
.k2-bd__tabpanel { display: none; flex-direction: column; gap: 12px; transform-origin: top center; animation: k2-bd-auf var(--dur-base) var(--ease-out); }
.k2-bd__tabs:has(.k2-bd__tabradio--leistung:checked) [data-k2bdtab="leistung"],
.k2-bd__tabs:has(.k2-bd__tabradio--beitrag:checked) [data-k2bdtab="beitrag"],
.k2-bd__tabs:has(.k2-bd__tabradio--kasse:checked) [data-k2bdtab="kasse"] { display: flex; }
/* Eckdaten-Tab: zweispaltiges Raster in weißer Box, nur echte Policendaten. */
.k2-bd__eckdaten { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 4px 24px; background: var(--c-surface); border: 1px solid var(--kk-bf-innen-bd); border-radius: 12px; padding: 14px 18px; }
/* Karte 263: Ueberschrift der Formalia-Karte im zusammengefuehrten Reiter —
   wie .k2-bd__lf-titel kein Rasterfeld (sonst rutscht die erste Zeile daneben),
   aber gedaempft: die Verkaufsflaeche bleibt das gruene Feld darueber. */
.k2-bd__eck-titel { grid-column: 1 / -1; font-size: 12.5px; font-weight: var(--fw-bold); color: var(--kk-ink-muted); padding-bottom: 4px; }
.k2-bd__eck-zeile { display: flex; align-items: baseline; justify-content: space-between; gap: 14px; padding: 6px 0; border-bottom: 1px solid var(--kk-bf-sand-trenner); }
.k2-bd__eck-label { font-size: 12px; color: var(--kk-ink-muted); }
.k2-bd__eck-wert { font-size: 12.5px; font-weight: var(--fw-semibold); text-align: right; font-variant-numeric: tabular-nums; }
/* Lang-Werte (Trello 245, §Lang-Werte-Konvention wie im Leistungsfeld):
   Vollbreiten-Zeile über BEIDE Raster-Spalten — sonst läuft z. B. die
   Leistungsstaffel in die Nachbarzelle („keine Wartezeit"-Kollision).
   Generisch für jeden langen Wert (auch künftige D-Eckdaten-Felder). */
.k2-bd__eck-zeile--lang { grid-column: 1 / -1; flex-direction: column; align-items: flex-start; gap: 2px; }
.k2-bd__eck-wert--lang { text-align: left; white-space: normal; text-wrap: pretty; min-width: 0; }
/* Beitragsentwicklungs-Tab (§a): 150px-Chart, Prozenthöhen brauchen
   height:100 % auf den Spalten — sonst lösen sie in flex-end zu 0 auf. */
/* Trello 244: bei wenigen Altersbändern KEIN auto-stretch über die volle
   Breite — Spalten zentriert mit fester Maximalbreite und konstantem
   Abstand (zwei Balken standen sonst einsam an den Rändern). */
.k2-bd__chart { display: flex; align-items: stretch; justify-content: center; gap: 14px; height: 150px; padding: 8px 4px 0; }
.k2-bd__chart-spalte { flex: 0 1 120px; height: 100%; display: flex; flex-direction: column; justify-content: flex-end; align-items: center; gap: 4px; min-width: 0; }
.k2-bd__chart-wert { font-size: 11px; font-weight: var(--fw-semibold); white-space: nowrap; font-variant-numeric: tabular-nums; }
.k2-bd__chart-balken { width: 100%; max-width: 64px; background: var(--c-primary); border-radius: 6px 6px 0 0; }
.k2-bd__chart-balken--prognose { background: var(--kk-bf-balken-prognose); }
.k2-bd__chart-alter { font-size: 11px; color: var(--kk-bf-sand); }
.k2-bd__chart-fussnote { margin-top: 10px; font-size: 11.5px; color: var(--kk-ink-muted); text-wrap: pretty; }
/* Kassen-Tab: belegte GKV-Aussagen (k2-cmp-Zellen-Bildsprache). */
.k2-bd__kasse { display: flex; flex-direction: column; gap: 6px; }
.k2-bd__kasse-titel { font-size: 12.5px; font-weight: var(--fw-bold); }
.k2-bd__kasse-zeile { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1.4fr); gap: 8px; align-items: center; }
.k2-bd__kasse-label { font-size: 12.5px; font-weight: var(--fw-semibold); min-width: 0; text-wrap: pretty; }
/* §6 Fußzeile: Buttons rechts. */
/* ~~.k2-bd__fuss~~ (Owner-Karte 280): die Fußzeile trug nur „Baustein
   vergleichen" — der Knopf sitzt jetzt als runder Kreis in der Kopfzeile.
   Regel bleibt für Alt-Stände/Druck folgenlos stehen. */
.k2-bd__fuss { display: flex; justify-content: flex-end; gap: 10px; }
/* §4 Absicherungs-Hero (PR B): lila Fläche, Absicherung statt Aufpreis;
   --spart = grüne Variante „X € im Monat gespart" (§f). Die frühere
   Hero-/Preis-Karten-Zeile (k2-bd__hero- und k2-bd__preis-Klassen) ist raus.
   Owner-Bug 02.09.: ein Stern-plus-Schraegstrich im Wortlaut („hero-Stern-
   Schraegstrich") schloss diesen Kommentar vorzeitig; der Browser verschluckte
   die ganze .k2-bd__held-Regel (kein Abstand, keine Flaeche, Unterstrich klebte
   an den Kacheln). Nie ein Kommentar-Ende-Zeichenpaar im Wortlaut schreiben. */
.k2-bd__held { display: flex; flex-direction: column; gap: 18px; background: var(--kk-bf-hero-bg); border: 1px solid var(--kk-bf-hero-bd); border-radius: 16px; padding: 18px 20px; }
/* Karte 262 (Owner): „diese komische gruene Box, die da im Hintergrund noch
   ist, die wuerde ich entfernen." Nachdem der Betrag in die Kopfzeile gezogen
   ist, haelt der spart-Slot nur noch die beiden Kacheln — eine gruene Flaeche
   um zwei weisse Kacheln ist genau die Box, die der Owner meint. Der Slot
   bleibt (er traegt die Kacheln), verliert aber Flaeche, Rand und Innenabstand;
   die Kacheln stehen damit direkt auf der Detailflaeche wie die Eckdaten-Box.
   Der LILA sichert_ab-Hero behaelt seine Flaeche BEWUSST: er traegt weiter
   eigenen Inhalt (Label + Summe + Satz), den die Flaeche gruppiert — ihn
   mitzuentfernen waere ein Umbau eines Falls, den der Owner hier gar nicht
   sieht (er erscheint nur, wenn der Baustein NICHT spart).
   Spec: wissen/design-system.md §Karte 262. */
.k2-bd__held--spart { background: none; border: 0; border-radius: 0; padding: 0; }
.k2-bd__held-label { font-size: 10.5px; font-weight: var(--fw-bold); letter-spacing: .07em; text-transform: uppercase; color: var(--kk-bf-hero-label); }
.k2-bd__held-zeile { display: flex; align-items: baseline; gap: 16px; flex-wrap: wrap; }
.k2-bd__held-betrag { font-size: 1.75rem; font-weight: var(--fw-bold); color: var(--c-primary); line-height: 1.15; padding-bottom: 3px; white-space: nowrap; font-variant-numeric: tabular-nums; border-bottom: 2px solid var(--c-primary); }
/* ~~.k2-bd__held-betrag--spart~~ entfaellt mit Karte 262 — der spart-Betrag
   steht jetzt als .k2-bd__kopf-spart-betrag in der Kopfzeile. */
.k2-bd__held-text { font-size: 15px; font-weight: var(--fw-semibold); min-width: 0; text-wrap: pretty; }
/* Owner 02.09. Hebel-Schlagzeile (Zahn): EINE vollbreite Kachel ÜBER den
   Spar-Kacheln (2. Runde) — der Faktor trägt die Hero-
   Geste (groß, grün, unterstrichen) und den Hover mit der Herleitung
   (k2-help--gruen). Spec: design-system §Hebel-Schlagzeile. Kein Rechenweg
   im Template — alles kommt fertig aus mehrwert.hebel. */
/* ==========================================================================
   Metall-Schlagzeile (Owner-Design 2026-09-03, „banner gold zahn" Variante 2a)
   ==========================================================================
   Der Hebel-Satz stand bis 03.09. als graue Box IM Absicherungs-Hero
   (~~.k2-bd__hebel~~, ersetzt). Jetzt ist er ein goldener Balken ÜBER dem
   ganzen Baustein-Container — direkt unter der Seitenüberschrift, über der
   Tarif-Kopfzeile, gleiche Breite. Nur EIN Satz sichtbar; die Rechnung
   dahinter kommt aus dem BESTEHENDEN Herleitungs-Tooltip (.k2-tip) —
   keine zweite Panel-Konvention. Zahlen unverändert aus dem Vertrag
   (mehrwert.hebel); das Template rechnet nichts. */
/* ⚠ Zwei Ebenen, und das ist kein Schnörkel: Der Balken MUSS `overflow:
   hidden` tragen, damit der Glanzstreifen an seinen Kanten endet — dieselbe
   Regel würde aber das Hover-Panel abschneiden, das UNTER dem Balken
   aufklappt. Die Hülle ist deshalb der Positionierungs-Anker (relative, NICHT
   geklippt), der Balken darin das geklippte Feld. Wer beides zusammenlegt,
   macht das Panel unsichtbar. */
.k2-bd__metall-huelle { position: relative; display: block; margin-bottom: 12px; }
.k2-bd__metall { position: relative; overflow: hidden; display: flex; align-items: baseline; flex-wrap: wrap; gap: 12px; width: 100%; box-sizing: border-box; padding: 14px 26px; border: 0; border-radius: var(--k2-radius-karte); font-family: inherit; text-align: left; cursor: help; }
/* Drei Stufen, EINE Bauart — nur Fläche und Schatten wechseln. Die Stufe kommt
   aus der Erstattungshöhe (app/services/metall_stufe.py), nicht aus dem
   Template. Gold ist seit 03.09. ein Modifier von dreien (~~Basis-Gold~~,
   ~~vier Stufen mit Diamant~~ — Diamant ist am selben Tag wieder raus). */
.k2-bd__metall--bronze { background: var(--k2-bronze-flaeche); box-shadow: var(--k2-bronze-schatten); }
.k2-bd__metall--silber { background: var(--k2-silber-flaeche); box-shadow: var(--k2-silber-schatten); }
.k2-bd__metall--gold { background: var(--k2-gold-flaeche); box-shadow: var(--k2-gold-schatten); }
/* ~~Diamant (Facetten-Layer, zweiter Funkelstreifen, blaue Textschatten)~~ —
   am 03.09. per Owner-Entscheid wieder entfernt: „Diamant wird zu Gold".
   Werte + Markup liegen im Design-Export „banner gold zahn diamant" (Turn 3c)
   und in PR 648, falls die Stufe zurückkommt. */
/* Die Spans liegen über dem Glanzstreifen (position: relative). */
.k2-bd__metall-wort { position: relative; font-size: 20px; font-weight: var(--fw-semibold); color: var(--c-text-on-accent); text-shadow: var(--k2-metall-text-schatten); }
.k2-bd__metall-zahl { position: relative; font-size: 2.125rem; font-weight: var(--fw-bold); line-height: 1; letter-spacing: -.02em; color: var(--c-text-on-accent); border-bottom: 3px solid var(--k2-metall-unterstrich); text-shadow: var(--k2-metall-zahl-schatten); white-space: nowrap; }
/* Wandernder Glanz — bewusst schmal (18 %) und schwach (35 % Weiß):
   breiter oder heller wirkt es billig (Design-Vorgabe). */
.k2-bd__metall-glanz { position: absolute; top: -20%; bottom: -20%; left: 0; width: 18%; pointer-events: none; filter: blur(2px); background: var(--k2-metall-glanz); animation: goldShine 4.2s cubic-bezier(.4, 0, .2, 1) infinite; }
@keyframes goldShine {
  0% { transform: translateX(-120%) skewX(-18deg); }
  100% { transform: translateX(680%) skewX(-18deg); }
}
/* Das Tooltip öffnet UNTER dem Balken (der steht ganz oben — nach oben wäre
   kein Platz): Modifier auf der Bestands-Komponente, keine neue Klasse. */
.k2-bd__metall-huelle .k2-tip { display: none; top: calc(100% + 8px); bottom: auto; left: 26px; right: auto; width: 320px; }
.k2-bd__metall-huelle:hover .k2-tip, .k2-bd__metall-huelle:focus-within .k2-tip { display: flex; }
@media print { .k2-bd__metall-huelle .k2-tip { display: none !important; } }
@media (prefers-reduced-motion: reduce) {
  .k2-bd__metall-glanz { display: none; animation: none; }
}
/* Info-i (Owner 02.09.): kleiner Kreis mit „i" als Hover-Öffner für Erklärungen,
   die nicht dauerhaft im Text stehen sollen („zu viel Text"). Generisch —
   Pop-over über .hover-info/.hover-info__pop. Spec: design-system §Info-i. */
.k2-info-i { display: inline-flex; align-items: center; justify-content: center; width: 16px; height: 16px; border-radius: var(--r-full); border: 1px solid var(--kk-ink-soft); color: var(--kk-ink-soft); font-size: 10px; font-weight: var(--fw-bold); font-style: normal; line-height: 1; cursor: help; }
.hover-info:hover .k2-info-i, .hover-info:focus .k2-info-i { border-color: var(--k2-aktion); color: var(--k2-aktion); }
.k2-bd__held-kacheln { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 10px; }
.k2-bd__held-kachel { display: flex; flex-direction: column; gap: 5px; background: var(--c-surface); border: 1px solid var(--kk-bf-innen-bd); border-radius: 12px; padding: 13px 16px; min-width: 0; }
.k2-bd__held-kachel-label { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; font-size: 10px; font-weight: var(--fw-bold); letter-spacing: .05em; text-transform: uppercase; color: var(--kk-ink-soft); }
.k2-bd__held-kachel-wert { font-size: 1.125rem; font-weight: var(--fw-bold); white-space: nowrap; font-variant-numeric: tabular-nums; }
.k2-bd__held-kachel-wert--gruen { color: var(--kk-green); }
.k2-bd__held-kachel-sub { font-size: 11px; color: var(--kk-ink-muted); }
/* §b „deine Angabe"-Chip: erfasste Kundenwerte, keine Katalog-Beispiele. */
.k2-bd__chip-angabe { display: inline-flex; align-items: center; padding: 2px 8px; border-radius: var(--r-full); background: var(--kk-bf-hero-bg); color: var(--c-primary); font-size: 10px; font-weight: var(--fw-bold); letter-spacing: 0; text-transform: none; }
/* Trello 275 (Owner 04.09., Design 1c „Zwei Pillen"): jede Zeile trägt eine
   Pille — lila „deine Angabe" (oben) oder graue „Beispiel". Die Pille steht
   UNTER dem Titel (Stapel), Beispielzeilen sind gedämpft, zwischen den
   Gruppen ein dicker Trenner. Gilt für „So wirkt das konkret" (Schritt 2,
   Haupt + Kind) und die Beispielrechnung der Schritt-1-Karten. */
.k2-chip-beispiel { display: inline-flex; align-items: center; padding: 2px 8px; border-radius: var(--r-full); background: var(--k2-chip-beispiel-bg); color: var(--k2-chip-beispiel-fg); font-size: 10px; font-weight: var(--fw-bold); letter-spacing: 0; text-transform: none; }
.k2-bd__tab-name { display: flex; flex-direction: column; align-items: flex-start; gap: 4px; }
.k2-bd__tab-zeile--beispiel .k2-bd__tab-name { font-weight: var(--fw-medium); color: var(--k2-text-2); }
.k2-bd__tab-zeile--beispiel .k2-bd__tab-kostet { font-weight: var(--fw-regular); color: var(--k2-rot-gedaempft); }
.k2-bd__tab-zeile--beispiel .k2-bd__tab-zahlst { font-weight: var(--fw-regular); color: var(--k2-text-2); }
.k2-bd__tab-zeile--beispiel .k2-bd__tab-uebernimmt { font-weight: var(--fw-semibold); color: var(--k2-gruen-gedaempft); }
.k2-bd__tab-zeile--trenner { border-top: 2px solid var(--k2-trenner-dick); }
.k2-br__was { display: flex; flex-direction: column; align-items: flex-start; gap: 4px; }
.k2-br__zeile--beispiel .k2-br__was { font-weight: var(--fw-medium); color: var(--k2-text-2); }
.k2-br__zeile--beispiel .k2-br__wert { font-weight: var(--fw-regular); color: var(--k2-rot-gedaempft); }
.k2-br__zeile--trenner { border-top: 2px solid var(--k2-trenner-dick); }
/* Hover-Herleitung: Titelzeile nennt die Quelle (Trello 275 §5). */
.hover-info__quelle { display: block; margin-bottom: 4px; font-size: 10.5px; font-weight: var(--fw-bold); letter-spacing: .07em; text-transform: uppercase; color: var(--c-primary); }
.k2-bd__tab { display: flex; flex-direction: column; }
/* Trello 274 (Owner 04.09.): Spalten Aktuell · Zuschuss · Neuer Eigenanteil —
   die breitere Zuschuss-Spalte (+ 200,00 €) sitzt jetzt in der Mitte. */
.k2-bd__tab-kopf, .k2-bd__tab-zeile { display: grid; grid-template-columns: 1fr 150px 190px 150px; gap: 0 12px; }
.k2-bd__tab-kopf { padding: 8px 4px; border-bottom: 1px solid var(--kk-cream-bd); font-size: 10.5px; font-weight: var(--fw-bold); letter-spacing: .06em; text-transform: uppercase; color: var(--kk-ink-soft); }
.k2-bd__tab-rechts { text-align: right; }
/* Owner 02.09.: Tabelle schlanker — ohne die Unterzeile „Dein Baustein
   erstattet X %" (Service liefert kein sub mehr) reicht 7px Zeilenabstand;
   Spalte „Ohne Konzept" in Rosé-Rot wie die Vorher-Karte (--k2-rot),
   „Mit Konzept" bleibt Ink. ~~.k2-bd__tab-sub~~ ohne Element → entfernt. */
.k2-bd__tab-zeile { align-items: center; padding: 7px 4px; border-bottom: 1px solid var(--kk-violet-trenner); }
.k2-bd__tab-name { font-size: 14px; font-weight: var(--fw-semibold); }
.k2-bd__tab-kostet { text-align: right; font-size: 13.5px; font-weight: var(--fw-semibold); color: var(--k2-rot); font-variant-numeric: tabular-nums; }
.k2-bd__tab-zahlst { text-align: right; font-size: 13.5px; font-weight: var(--fw-semibold); font-variant-numeric: tabular-nums; }
.k2-bd__tab-uebernimmt { text-align: right; font-size: 14px; font-weight: var(--fw-bold); color: var(--kk-green); font-variant-numeric: tabular-nums; }
/* Baustein-Fokus: die frühere „Dein Baustein"-Fußkarte (.k2-bd__bau*) ist
   in Kopfzeile + Fußzeile aufgegangen (Handoff §2/§6). */
.k2-bd__btn-outline { display: inline-flex; align-items: center; gap: 6px; background: var(--c-surface); color: var(--kk-violet-700); border: 1px solid var(--kk-bf-flieder-bd); border-radius: 10px; padding: 9px 16px; font-family: inherit; font-size: 13px; font-weight: var(--fw-semibold); cursor: pointer; flex: none; }
.k2-bd__btn-outline:hover { background: var(--kk-violet-50); color: var(--kk-violet-700); }
.k2-bd__btn-cta { display: inline-flex; align-items: center; background: var(--kk-navy-cta); color: var(--c-text-on-accent); border: 0; border-radius: 10px; padding: 10px 18px; font-size: 13px; font-weight: var(--fw-bold); cursor: pointer; text-decoration: none; flex: none; }
.k2-bd__btn-cta:hover { background: var(--kk-violet-800); color: var(--c-text-on-accent); text-decoration: none; }
/* .k2-gbv (heute Vormittag, Trello 168) ist im Baustein-Fokus-Umbau in den
   Kassen-Tab (.k2-bd__kasse) aufgegangen — Klassen entfernt, design-system
   §GKV-Basisvergleich datiert nachgeführt. */

/* V2-Delta 7: Schritt-2-Fußzeile bündig mit der Baustein-Box (20px innen);
   die Box darüber trägt die Trennung — kein doppelter Strich. */
.k2-fuss--s2 { padding: 0 20px; border-top: 0; }
.k2-fuss__zurueck { font-size: 12.5px; font-weight: var(--fw-semibold); color: var(--k2-aktion); text-decoration: none; }
.k2-fuss__zurueck:hover { color: var(--k2-akzent); text-decoration: none; }
.k2-detail__hinweis { margin: 0 30px 22px; font-size: 12.5px; color: var(--c-text-muted); max-width: 620px; text-wrap: pretty; }
/* Pflichtprogramm/IGeL-Block in den Schritt-1-Flächen (Owner-Queue ④):
   bestehende kr-programm-Komponente, nur der k2-Seitenrand kommt dazu.
   UI-Ticket 26.08.: Block sitzt jetzt ANS ENDE der Fläche, kompakter,
   „Was zahlt die Kasse bereits?"-Öffner zentriert (Owner-Screenshot). */
.k2-programm { margin: 0 30px 22px; padding: var(--sp-3) var(--sp-4); }
.k2-programm .kr-mehr > summary { display: flex; justify-content: center; text-align: center; font-size: var(--fs-caption); }
/* Instant-Themenwechsel (Owner-Infra 25.08.): alle Panels vorgerendert,
   nur das aktive sichtbar — [hidden] muss die Flex-Regel schlagen. */
.k2-detail__panel { display: flex; flex-direction: column; flex: 1; }
.k2-detail__panel[hidden] { display: none; }

/* ── k2 Popups (Track B, Markup PR 238) + Abschluss (Track D) — C-CSS-GO
   2026-08-24. Klassen EXAKT nach dem in KOORDINATION angemeldeten Schnitt;
   Mechanik ist die bestehende data-tarif-modal-Lazy-Fragment-Logik. ── */
/* Modal-Kopf (Fragment-Kopfzeile) */
.k2-modal__kopf { display: flex; align-items: flex-start; justify-content: space-between; gap: 16px; padding: 20px 26px; border-bottom: 1px solid var(--k2-trenner); }
.k2-modal__titelblock { display: flex; flex-direction: column; gap: 2px; }
/* Aktionsgruppe der Modal-Kopfzeile (Owner 2026-09-03): alles, was rechts neben
   dem Titel steht, sitzt ZUSAMMEN am rechten Rand. Ohne die Gruppe verteilt das
   space-between der Kopfzeile drei Kinder gleichmaessig — der „‹ Auswahl"-Knopf
   des Broschueren-Overlays stand dadurch mitten in der Zeile statt neben dem ✕.
   align-items: center richtet die Knoepfe aneinander aus, auch wenn der Titel
   zweizeilig wird (die Kopfzeile selbst steht bewusst auf flex-start). */
.k2-modal__aktionen { display: flex; align-items: center; gap: 10px; flex: none; }
.k2-modal__titel { font-size: 15px; font-weight: var(--fw-bold); }
.k2-modal__sub { font-size: 12.5px; color: var(--c-text-muted); }
.k2-modal__x { width: 32px; height: 32px; flex: none; display: inline-flex; align-items: center; justify-content: center; border: 0; border-radius: var(--r-full); background: var(--k2-chip-bg); color: var(--c-text-muted); cursor: pointer; }
.k2-modal__x:hover { background: var(--k2-flaeche-aktiv); color: var(--k2-aktion); }
/* Broschüren-Overlay (Owner 31.08.): eingebetteter Viewer + Auswahl-Liste —
   der Berater bleibt im Screenshare-Fenster (kein neuer Tab). */
.k2-brosch__frame { width: 100%; height: min(78vh, 980px); border: 0; flex: 1 1 auto; }
.k2-brosch__buehne { display: flex; justify-content: center; padding: 18px 26px 22px; overflow: auto; }
.k2-brosch__bild { max-width: 100%; height: auto; border-radius: var(--r-md); }
.k2-brosch__liste { display: flex; flex-direction: column; gap: 8px; padding: 18px 26px 22px; }
.k2-brosch__eintrag { display: flex; align-items: center; gap: 10px; padding: 13px 16px; background: var(--c-surface); border: 1px solid var(--k2-rahmen-bd); border-radius: var(--r-md); font-family: inherit; font-size: 13.5px; font-weight: var(--fw-semibold); color: var(--kk-ink); text-align: left; cursor: pointer; }
.k2-brosch__eintrag:hover { border-color: var(--kk-violet-500); color: var(--kk-violet-700); }
.k2-brosch__eintrag-titel { min-width: 0; text-wrap: pretty; margin-right: auto; }
.k2-brosch__eintrag-pfeil { color: var(--k2-text-soft2); }
.k2-brosch__zurueck { flex: none; border: 1px solid var(--kk-bf-flieder-bd); background: var(--c-surface); border-radius: 10px; padding: 6px 12px; font-family: inherit; font-size: 12px; font-weight: var(--fw-semibold); color: var(--kk-violet-700); cursor: pointer; }

/* Baustein-Vergleich .k2-cmp — Spalten-Kopf und Zeilen teilen dieselbe
   Grid-Geometrie (Label-Spalte + 1fr je Tarif), damit die Zellen fluchten. */
.k2-cmp { display: flex; flex-direction: column; gap: 10px; width: min(100%, var(--k2-modal-w-cmp)); padding: 18px 26px 22px; }
.k2-cmp__spalten, .k2-cmp__zeile { display: grid; grid-template-columns: var(--k2-cmp-label-w); grid-auto-flow: column; grid-auto-columns: minmax(0, 1fr); gap: 10px; }
.k2-cmp__labelspalte { min-width: 0; }
.k2-cmp__spalte { display: flex; flex-direction: column; align-items: flex-start; gap: 6px; padding: 14px 16px; border-radius: var(--k2-radius-box); background: var(--c-surface); border: 1px solid var(--k2-rahmen-bd); }
.k2-cmp__spalte--gkv { background: var(--k2-rail-bg); border-color: var(--k2-trenner); }
.k2-cmp__spalte--mein { background: var(--k2-gruen-bg-leise); border-color: var(--k2-gruen-bd); }
.k2-cmp__spalte--leer { background: transparent; border: 1px dashed var(--kk-grau-bd-dash); color: var(--c-text-soft); }
.k2-cmp__spalte .logo-img { max-height: 20px; max-width: 90px; object-fit: contain; }
.k2-cmp__badge { display: inline-flex; align-items: center; padding: 3px 9px; border-radius: var(--r-full); font-size: 10px; font-weight: var(--fw-bold); text-transform: uppercase; letter-spacing: .06em; }
.k2-cmp__badge--gkv, .k2-cmp__badge--offen { background: var(--k2-chip-bg); color: var(--k2-grau-pill-fg); }
.k2-cmp__badge--mein { background: var(--k2-gruen); color: var(--c-text-on-accent); }
.k2-cmp__name { font-size: 13px; font-weight: var(--fw-bold); }
.k2-cmp__sub { font-size: 11.5px; color: var(--c-text-muted); font-variant-numeric: tabular-nums; }
.k2-cmp__aktionen { display: flex; flex-wrap: wrap; gap: 8px; margin-top: auto; padding-top: 6px; }
.k2-cmp__wahl { display: inline-flex; align-items: center; padding: 6px 12px; border-radius: var(--btn-radius); background: var(--c-surface); border: 1px solid var(--kk-violet-500); color: var(--kk-violet-700); font-size: 11px; font-weight: var(--fw-bold); cursor: pointer; white-space: nowrap; }
.k2-cmp__wahl:hover { background: var(--kk-violet-50); }
.k2-cmp__entf { display: inline-flex; align-items: center; padding: 6px 11px; border-radius: var(--btn-radius); background: var(--c-surface); border: 1px solid var(--kr-karte-bd); color: var(--c-text-muted); font-size: 11px; font-weight: var(--fw-semibold); cursor: pointer; white-space: nowrap; }
.k2-cmp__label { font-size: 12.5px; font-weight: var(--fw-semibold); align-self: center; min-width: 0; }
.k2-cmp__zelle { display: flex; align-items: center; gap: 6px; padding: 8px 10px; border-radius: var(--kr-radius-box); font-size: 12px; min-width: 0; }
.k2-cmp__zelle--ja { background: var(--k2-gruen-bg); color: var(--k2-gruen); font-weight: var(--fw-semibold); }
.k2-cmp__zelle--nein { background: var(--k2-rail-bg); color: var(--k2-rot-x); }
.k2-cmp__zelle--neutral { justify-content: center; color: var(--k2-dash-neutral); }
.k2-cmp__chips { display: flex; flex-direction: column; gap: 8px; margin-top: 8px; padding-top: 12px; border-top: 1px solid var(--k2-trenner); }
.k2-cmp__chips-titel { font-size: 10.5px; font-weight: var(--fw-bold); color: var(--c-text-soft); text-transform: uppercase; letter-spacing: .06em; }
.k2-cmp__chips-liste { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 8px; }
.k2-cmp__chip { display: flex; align-items: center; gap: 10px; padding: 8px 12px; border-radius: var(--k2-radius-box); background: var(--c-surface); border: 1px solid var(--k2-trenner); cursor: pointer; text-align: left; }
.k2-cmp__chip:disabled { opacity: .5; cursor: default; }
.k2-cmp__chip .logo-img { max-height: 18px; max-width: 52px; object-fit: contain; flex: none; }
.k2-cmp__chip-text { display: flex; flex-direction: column; min-width: 0; }
.k2-cmp__chip-name { font-size: 12.5px; font-weight: var(--fw-semibold); }
.k2-cmp__chip-sub { font-size: 11px; color: var(--c-text-soft); }
.k2-cmp__chip-preis { margin-left: auto; font-size: 12.5px; font-weight: var(--fw-bold); font-variant-numeric: tabular-nums; white-space: nowrap; }
.k2-cmp__chip-plus { width: 22px; height: 22px; flex: none; display: inline-flex; align-items: center; justify-content: center; border-radius: var(--r-full); background: var(--k2-flaeche-aktiv); color: var(--k2-aktion); font-weight: var(--fw-bold); }

/* Kassen-Popup .k2-kk (Bs angemeldeter Schnitt; Markup folgt bei B) */
.k2-kk { display: flex; flex-direction: column; gap: 12px; width: min(100%, var(--k2-modal-w-kk)); padding: 18px 26px 22px; }
.k2-kk__grid { display: grid; grid-template-columns: var(--k2-cmp-label-w) 1fr 1fr; gap: 10px; align-items: center; }
.k2-kk__kopf { display: flex; flex-direction: column; align-items: flex-start; gap: 4px; }
.k2-kk__kopf .logo-img { max-height: 20px; max-width: 90px; object-fit: contain; }
.k2-kk__kopf-name { font-size: 11.5px; color: var(--c-text-muted); }
.k2-kk__pill { display: inline-flex; align-items: center; padding: 6px 12px; border-radius: var(--r-full); font-size: 12.5px; font-variant-numeric: tabular-nums; white-space: nowrap; }
.k2-kk__pill--alt { background: var(--k2-chip-bg); color: var(--k2-grau-pill-fg); }
.k2-kk__pill--neu { background: var(--k2-gruen-bg); color: var(--k2-gruen); font-weight: var(--fw-bold); }
.k2-kk__ersparnis { display: flex; flex-direction: column; align-items: flex-end; gap: 2px; }
.k2-kk__ersparnis-zeile { font-size: 12px; color: var(--c-text-muted); font-variant-numeric: tabular-nums; white-space: nowrap; }
.k2-kk__ersparnis-gesamt { font-size: 14px; font-weight: var(--fw-bold); color: var(--k2-gruen); font-variant-numeric: tabular-nums; white-space: nowrap; }
.k2-kk__details-toggle { display: flex; align-items: center; justify-content: center; width: 100%; padding: 9px 0; border-radius: var(--btn-radius); background: var(--c-surface); border: 1px solid var(--kk-violet-300); color: var(--kk-violet-700); font-size: 12.5px; font-weight: var(--fw-bold); cursor: pointer; }
.k2-kk__kat { display: flex; align-items: center; padding: 7px 12px; border-radius: var(--kr-radius-innen); background: var(--k2-chip-bg); font-size: 12px; font-weight: var(--fw-bold); }
.k2-kk__paar { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; }
.k2-kk__delta { display: inline-flex; align-items: center; align-self: center; padding: 3px 9px; border-radius: var(--r-full); background: var(--k2-gruen-bg); color: var(--k2-gruen); font-size: 11px; font-weight: var(--fw-bold); font-variant-numeric: tabular-nums; white-space: nowrap; }
.k2-kk__fuss { font-size: 11.5px; color: var(--c-text-soft); }
/* Kassen-Popup — FINALER B-Schnitt (Owner-Befund 2026-08-25: Popup war Freitext,
   weil der Block oben gegen Bs ANGEMELDETEN Schnitt gebaut war, das Markup aber
   den finalen nutzt — PRs 241/242). Zeile = Grid Label | alt | neu wie Prototyp;
   Details klappen über die checkbox .k2-kk__alle (CSS-only, kein JS). */
.k2-kk__abschnitt { font-size: 13.5px; font-weight: var(--fw-bold); padding-bottom: 4px; }
.k2-kk__abschnitt .muted { font-weight: var(--fw-regular); font-size: 11.5px; }
.k2-kk__zeile { display: grid; grid-template-columns: var(--k2-cmp-label-w) 1fr 1fr; gap: 10px; align-items: center; padding: 8px 0; border-top: 1px solid var(--k2-trenner-leise); }
.k2-kk__zeile--kopf { border-top: 0; padding-bottom: 4px; }
.k2-kk__zeile--ersparnis { grid-template-columns: var(--k2-cmp-label-w) 1fr; }
.k2-kk__zeile--ersparnis .k2-kk__ersparnis { grid-column: 2; }
.k2-kk__label { font-size: 12.5px; font-weight: var(--fw-semibold); min-width: 0; }
.k2-kk__kasse { display: flex; flex-direction: column; align-items: center; gap: 3px; text-align: center; }
.k2-kk__kasse .logo-img { max-height: 22px; max-width: 100px; object-fit: contain; }
.k2-kk__kasse-name { font-size: 11px; color: var(--c-text-muted); }
.k2-kk__hinweis { margin: 0; font-size: 12px; color: var(--c-text-muted); max-width: 560px; text-wrap: pretty; }
.k2-kk__box { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 1px; padding: 9px 12px; border-radius: var(--k2-radius-box); background: var(--k2-chip-bg); border: 1px solid var(--k2-trenner); text-align: center; min-width: 0; }
.k2-kk__box--besser { background: var(--k2-gruen-bg-leise); border-color: var(--k2-gruen-bd-leise); }
.k2-kk__box--besser .k2-kk__box-wert { color: var(--k2-gruen); font-weight: var(--fw-bold); }
.k2-kk__box-wert { font-size: 12px; color: var(--c-text-muted); overflow-wrap: break-word; min-width: 0; }
.k2-kk__kategorie { display: flex; align-items: center; margin: 12px 0 4px; padding: 7px 14px; border-radius: var(--kr-radius-innen); background: var(--k2-chip-bg); font-size: 12px; font-weight: var(--fw-bold); }
.k2-kk__alle { position: absolute; opacity: 0; pointer-events: none; }
.k2-kk__toggle { display: flex; align-items: center; justify-content: center; gap: 6px; margin: 12px 0 4px; padding: 11px 0; border-radius: var(--k2-radius-box); border: 1px solid var(--kk-violet-300); color: var(--kk-violet-700); font-size: 13px; font-weight: var(--fw-bold); cursor: pointer; }
.k2-kk__toggle-weniger { display: none; }
.k2-kk__alle:checked ~ .k2-kk__toggle .k2-kk__toggle-mehr { display: none; }
.k2-kk__alle:checked ~ .k2-kk__toggle .k2-kk__toggle-weniger { display: inline; }
.k2-kk__details { display: none; flex-direction: column; padding-top: 14px; } /* ÜBERHOLT seit Trello 215 (27.08.) — Ganz-oder-gar-nicht-Container, Markup nutzt jetzt __leistungen + __rest */
.k2-kk__alle:checked ~ .k2-kk__details { display: flex; }
/* Trello 215 (27.08.): Leistungen & Bonus zeigt initial NUR die Vorteils-
   Zeilen der neuen Kasse — .k2-kk__rest (übrige Zeilen + Kategorien ohne
   Vorteils-Zeile) klappt über dieselbe Checkbox auf (kvk-rest-Muster). */
.k2-kk__leistungen { display: flex; flex-direction: column; padding-top: 14px; }
.k2-kk__rest { display: none; }
.k2-kk__alle:checked ~ .k2-kk__leistungen .k2-kk__rest { display: block; }
/* Trello 270 (Owner 04.09.): Suchfeld im Kassen-Vergleich. Im Suchmodus
   (.k2-kk__leistungen.is-suche, app.js) sind ALLE Rest-Blöcke sichtbar —
   die Suche durchsucht auch „Weitere Details"; Zeilen/Kategorien ohne
   Treffer bekommen [hidden]. */
.k2-kk__suche { margin: 6px 0 2px; }
.k2-kk__suche-feld { width: 100%; }
.k2-kk__suche-leer { margin: 8px 0 0; font-size: 12px; color: var(--c-text-muted); }
.k2-kk__leistungen.is-suche .k2-kk__rest { display: block; }
.k2-kk__leistungen.is-suche ~ .k2-kk__toggle { display: none; }
.k2-kk__quelle { padding-top: 14px; font-size: 11.5px; color: var(--c-text-soft); }

/* Abschluss (Track D): Rahmen, Policen-Karten, Summenband, Aktivieren-CTA */
.k2-abschluss { display: flex; flex-direction: column; gap: 14px; }
.k2-abschluss__band { display: flex; align-items: center; justify-content: center; padding: 15px 20px; border-radius: var(--k2-radius-karte); background: var(--k2-reform-bg); border: 1px solid var(--k2-reform-bd); font-size: 14px; font-weight: var(--fw-bold); color: var(--k2-akzent); text-align: center; }
.k2-abschluss__zaehler { align-self: flex-end; font-size: 11.5px; color: var(--c-text-soft); }
.k2-abschluss__summe { display: flex; align-items: center; justify-content: space-between; gap: 16px; padding: 15px 22px; border-radius: var(--k2-radius-karte); background: var(--k2-reform-bg); border: 1px solid var(--k2-reform-bd); font-weight: var(--fw-bold); color: var(--k2-akzent); }
/* Ds Abschluss-Feinschliff (v2 Punkt 5): Headline-Zeile mit Zähler rechts,
   Aktivieren-Block rechtsbündig, Eckdaten als natives details/summary. */
.k2-spar-zeile { display: flex; align-items: baseline; justify-content: space-between; gap: 14px; }
.k2-spar-zeile .k2-abschluss__zaehler { align-self: baseline; }
/* Owner 02.09.: Aktions-Zeile wie der Schritt-2-Fuß — Zurück-Link links,
   „Konzept aktivieren" rechts auf derselben Höhe (align-items: center), die
   Fußnote darunter rechtsbündig. Vorher stand der Zurück-Link in einem
   eigenen k2-fuss unter dem Fragment (Owner: „verrutscht"). */
.k2-abschluss__aktion { display: flex; flex-direction: column; align-items: flex-end; gap: 4px; align-self: stretch; }
.k2-abschluss__aktion-zeile { display: flex; align-items: center; justify-content: space-between; gap: 16px; width: 100%; }
/* Owner 08.09.: rechte Aktionsgruppe der Abschluss-Zeile — „Anträge
   vorbereiten" + „Konzept aktivieren" bleiben zusammen rechts, damit
   space-between der Zeile nur ZWEI Kinder verteilt (Zurück links, Gruppe
   rechts). Ohne die Gruppe zöge die Zeile die drei Elemente auseinander. */
.k2-abschluss__aktion-rechts { display: flex; align-items: center; gap: 12px; }
.k2-pol__eck { padding: 0 22px 12px; }
.k2-pol__eck .k2-pol__eck-toggle { display: inline-block; list-style: none; }
.k2-pol__eck .k2-pol__eck-toggle::-webkit-details-marker { display: none; }
/* Fix 04.09. (Owner-Foto „Alles auf einen Blick"): ~~overflow: hidden~~ ist
   RAUS. Die Karte schnitt ihr EIGENES Hover-Feld ab — der k2-tip am
   Kassen-Beitrag steht über dem Preis, also außerhalb der Karte, und blieb bis
   auf einen dunklen Streifen unsichtbar. Der Klipp war für die runden Ecken
   gedacht; nötig ist er dafür nicht: Der einzige Kasten mit eigener Fläche
   (.k2-pol__eckdaten) sitzt im Innenabstand von .k2-pol__eck und berührt die
   Ecken gar nicht (im Bild geprüft, mit und ohne Klipp).
   REGEL: Ein Behälter, der einen k2-tip enthält, darf nicht klippen — ein
   Tooltip ragt per Definition hinaus. Wer klippen MUSS, legt den Tooltip eine
   Ebene höher (Muster .k2-bd__metall-huelle). */
.k2-pol { display: flex; flex-direction: column; background: var(--c-surface); border: 1px solid var(--k2-rahmen-bd); border-radius: var(--k2-radius-karte); }
.k2-pol--raus { opacity: .45; }
.k2-pol--raus .k2-pol__name, .k2-pol--raus .k2-pol__preis { text-decoration: line-through; }
.k2-pol__kopf { display: flex; align-items: center; gap: 16px; padding: 16px 22px; }
.k2-pol__logo { width: 96px; height: 46px; flex: none; display: inline-flex; align-items: center; justify-content: center; border-radius: var(--kr-radius-innen); background: var(--k2-rail-bg); border: 1px solid var(--k2-trenner); padding: 6px; }
.k2-pol__logo img { max-width: 100%; max-height: 100%; object-fit: contain; }
.k2-pol__spalte { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.k2-pol__name { font-size: 14.5px; font-weight: var(--fw-bold); }
.k2-pol__deckt { font-size: 12px; color: var(--c-text-muted); text-wrap: pretty; }
.k2-pol__eck-toggle { align-self: flex-start; font-size: 12px; font-weight: var(--fw-semibold); color: var(--k2-aktion); cursor: pointer; }
.k2-pol__rechts { margin-left: auto; display: flex; flex-direction: column; align-items: flex-end; gap: 4px; flex: none; }
.k2-pol__preis { font-size: 14px; font-weight: var(--fw-bold); font-variant-numeric: tabular-nums; white-space: nowrap; }
.k2-pol__tag { font-size: 10px; font-weight: var(--fw-bold); color: var(--c-text-soft); text-transform: uppercase; letter-spacing: .06em; }
/* Owner 02.09.: „Baustein vergleichen" auf der Abschluss-Seite — die violette
   Aktions-Pill in der rechten Spalte der Police-Karte, eine Stufe kompakter
   als in Schritt 2, damit sie neben Preis/Tag/Entfernen Platz hat. */
.k2-pol__vergleich { padding: 7px 14px; font-size: 11.5px; margin-top: 2px; }
.k2-pol__entf { display: inline-flex; align-items: center; padding: 5px 11px; border-radius: var(--btn-radius); background: var(--c-surface); border: 1px solid var(--kr-karte-bd); color: var(--c-text-muted); font-size: 11px; font-weight: var(--fw-semibold); cursor: pointer; white-space: nowrap; }
.k2-pol__wieder { display: inline-flex; align-items: center; padding: 5px 11px; border-radius: var(--btn-radius); background: var(--c-surface); border: 1px solid var(--kk-violet-500); color: var(--kk-violet-700); font-size: 11px; font-weight: var(--fw-bold); cursor: pointer; white-space: nowrap; }
.k2-pol__eckdaten { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 8px 24px; padding: 4px 22px 18px 134px; background: var(--k2-rail-bg); border-top: 1px solid var(--k2-rail-trenner); }
.k2-pol__eck-zeile { display: flex; align-items: baseline; justify-content: space-between; gap: 14px; padding: 6px 0; border-bottom: 1px solid var(--k2-rail-trenner); }
.k2-pol__eck-label { font-size: 12px; color: var(--c-text-muted); }
.k2-pol__eck-wert { font-size: 12px; font-weight: var(--fw-semibold); color: var(--c-text); text-align: right; text-wrap: pretty; }
/* Grüner Abschluss-CTA — Prototyp-final; die Grün-Ausnahme der Konzept-
   Präsentation deckt den Aktivieren-Moment (Ds Frage: eigene Klasse, ja). */
/* V2-Delta 5 (24.08.): Aktivieren-CTA LILA statt gruen (Owner-Update;
   die Gruen-Fassung vom Mittag ist widerrufen, s. design-system). */
.k2-aktivieren { display: inline-flex; align-items: center; padding: 13px 26px; border-radius: var(--btn-radius); background: var(--k2-aktion); color: var(--c-text-on-accent); font-size: 14px; font-weight: var(--fw-bold); cursor: pointer; border: 0; text-decoration: none; }
.k2-aktivieren:hover { background: var(--kk-violet-800); color: var(--c-text-on-accent); text-decoration: none; }

/* ── V2-Polish (Design-Update 24.08.): Spar-Headline + grosser Lila-Titel ──
   Headline erscheint NUR, wenn der A-Vertrag ersparnis_headline liefert
   (None = Konzept spart nicht → kein Element). __betrag steht NACH .k2-help
   im Stylesheet: die 3px-Vollunterstreichung gewinnt gegen die gestrichelte. */
.k2-spar-headline { display: flex; align-items: baseline; gap: 14px; padding: 0; font-size: 2rem; font-weight: var(--fw-bold); letter-spacing: -.02em; }
.k2-spar-headline__betrag { color: var(--k2-gruen); border-bottom: 3px solid var(--k2-gruen); }
/* Abschluss-Titel „Dein Gesundheitsupgrade" (Delta 5, D wendet an) */
.k2-titel-gross { font-size: 2.25rem; font-weight: var(--fw-bold); letter-spacing: -.02em; color: var(--k2-aktion); }

/* Sanfter Seitenwechsel (Owner 2026-08-25: Klick von Thema zu Thema „zuckt") —
   browsereigene Cross-Document-View-Transition: kurze Überblendung statt
   hartem Neuaufbau. Rein progressiv (Chrome 126+), ältere Browser ignorieren
   die Regel folgenlos. */
@view-transition { navigation: auto; }


/* ======================================================================
   Vorteils-Buehne (Owner 2026-09-03, Design 2c „Geteilte Buehne")
   Rotierende Foto-Slides zwischen Tarif-Kopfzeile und „So wirkt das
   konkret". Farben ausschliesslich ueber Tokens — die Hex-Werte des
   Design-Pakets sind auf die vorhandene Marken-Palette abgebildet:
   Rahmen/Punkt = --c-border, Panel = --c-surface-muted, Titel = --c-text,
   Sub = --c-text-soft, Ist-Zustand = --c-error, Badge = --c-spart,
   aktiver Punkt = --c-primary.
   ====================================================================== */
/* Owner 04.09.: immer sichtbar unter der Tarif-Kopfzeile — der Abstand kommt
   aus dem gap des .k2-bd/.k2-kind-Containers, kein eigener Rand. */
.vb { margin: 0; }
.vb__buehne { position: relative; border: 1px solid var(--c-border); border-radius: var(--r-md); overflow: hidden; }
/* Owner-Karte 281: Mini-Pfeile am linken/rechten Bildrand (Berater blättert
   im Gespräch), ~~Punkte darunter~~ entfernt. Kreis auf dem Foto — heller
   Grund, damit der Pfeil auf jedem Bild lesbar bleibt. */
.vb__pfeil { position: absolute; top: 50%; z-index: 1; display: inline-flex; align-items: center;
  justify-content: center; width: 28px; height: 28px; margin-top: -14px; padding: 0;
  border: 1px solid var(--c-border); border-radius: var(--r-full); background: var(--c-surface);
  color: var(--c-text); font-family: inherit; font-size: 16px; font-weight: var(--fw-bold);
  line-height: 1; cursor: pointer; opacity: .9; }
.vb__pfeil:hover { opacity: 1; background: var(--c-surface-muted); color: var(--c-text); }
.vb__pfeil--zurueck { left: var(--sp-3); }
.vb__pfeil--vor { right: var(--sp-3); }
/* Immer genau EINE Slide sichtbar; die uebrigen tragen das hidden-Attribut. */
.vb__slide { display: grid; grid-template-columns: 1.15fr 1fr; min-height: 230px; }
.vb__slide[hidden] { display: none; }
.vb__foto { position: relative; overflow: hidden; background: var(--c-surface-muted); }
.vb__foto img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover;
  animation: vb-kenburns 4.5s linear forwards; }
.vb__text { display: flex; flex-direction: column; justify-content: space-between;
  gap: var(--sp-3); padding: var(--sp-5) var(--sp-6); background: var(--c-surface-muted);
  animation: vb-rein .6s cubic-bezier(.2,.7,.2,1); }
.vb__oben, .vb__unten { display: flex; flex-direction: column; }
.vb__oben { gap: var(--sp-2); }
.vb__unten { align-items: flex-start; gap: var(--sp-2); }
.vb__label { font-size: var(--fs-caption); font-weight: var(--fw-bold); color: var(--c-accent-2);
  text-transform: uppercase; letter-spacing: .07em; }
.vb__titel { font-size: var(--fs-h1); font-weight: var(--fw-bold); color: var(--c-text);
  line-height: 1.1; letter-spacing: -.015em; }
.vb__sub { font-size: var(--fs-sm); color: var(--c-text-soft); }
/* Owner 04.09. (Trello 271): ~~text-decoration: line-through~~ widerrufen —
   „Wir streichen da nicht mehr durch, sondern unterstreichen in rot. somit kann
   man es immernoch lesen." Durchgestrichener Fließtext ist auf Distanz (Beamer,
   Kundengespräch) kaum noch entzifferbar; die Unterstreichung markiert genauso
   deutlich, lässt den Satz aber lesbar. Farbe bleibt --c-error — die Aussage
   „das zahlt deine Kasse heute NICHT" ändert sich nicht. */
.vb__heute { font-size: var(--fs-caption); color: var(--c-error); text-decoration: underline; text-decoration-color: var(--c-error); text-decoration-thickness: 2px; text-underline-offset: 3px; }
.vb__badge { display: inline-flex; align-items: center; gap: var(--sp-1);
  padding: var(--sp-2) var(--sp-3); border-radius: var(--r-full);
  background: var(--c-spart); color: var(--c-text-on-accent);
  font-size: var(--fs-caption); font-weight: var(--fw-bold); letter-spacing: .04em;
  text-transform: uppercase; }
/* Owner 04.09.: Ist-Bühne (Schritt 1) — dieselbe Komponente, Zustand „heute
   nicht abgedeckt": Label + Pille in Fehler-Rot, der Heute-Satz ist der
   gültige Ist-Zustand und darum NICHT durchgestrichen. */
/* Owner-Screenshot 04.09. (2. Runde): in Schritt 1 nur so breit wie die
   Nachbar-Container (.k2-posten/.k2-tk/.k2-szc: 30px-Rand), nicht randlos. */
.vb--ist { margin: 0 30px 20px; }
.vb--ist .vb__label { color: var(--c-error); }
.vb--ist .vb__heute { text-decoration: none; }
.vb__badge--ist { background: var(--c-error); }
/* ~~.vb__punkte / .vb__punkt~~ ersatzlos entfernt (Owner-Karte 281). */
@keyframes vb-rein { 0% { opacity: 0; transform: translateX(24px); } 100% { opacity: 1; transform: translateX(0); } }
@keyframes vb-kenburns { 0% { transform: scale(1); } 100% { transform: scale(1.08); } }
/* Schmale Fenster: Foto ueber Text statt nebeneinander. */
@media (max-width: 640px) {
  .vb__slide { grid-template-columns: 1fr; }
  .vb__foto { min-height: 160px; }
}
/* Bewegungsempfindliche Nutzer: kein Zoom, kein Einfliegen (das Autoplay
   schaltet app.js zusaetzlich ab). */
@media (prefers-reduced-motion: reduce) {
  .vb__foto img, .vb__text { animation: none; }
}

/* ===========================================================================
   M&M-MONITOR — Dev-Panel fuer die M&M-Aufrufe (Design-Handoff 09.09.).
   Ersetzt das alte Tacho-Abzeichen: schliess- und minimierbar, feste Hoehe,
   drei Register. Markup in _mm_monitor.html, Verhalten in js/mm_monitor.js,
   Zahlen aus app/services/mm_zaehler.py. NUR sichtbar bei MM_PANEL=1.

   EIGENE Ebene mit Prefix .mmm- und eigenen Tokens (--mmm-*): Das Panel darf
   KEINE Konzeptberater-Komponentenklasse benutzen. Der Grund ist nicht Stil,
   sondern Haltbarkeit — wer die Konzept-Optik umbaut, darf das Messwerkzeug
   nicht mit umbauen. Farben ausschliesslich als Token (Design-Lint).
   =========================================================================== */
.mmm { position: fixed; left: 24px; bottom: 24px; z-index: 950; font-size: var(--fs-caption); color: var(--c-text); }

/* --- minimiert: dunkle Pille mit Live-Punkt --- */
.mmm__pille { display: inline-flex; align-items: center; gap: 9px; padding: 10px 16px 10px 12px; border: none; border-radius: var(--r-full); background: var(--kk-navy-cta); color: var(--kk-white); font: inherit; font-size: var(--fs-caption); font-weight: var(--fw-semibold); cursor: pointer; box-shadow: var(--mmm-pille-schatten); white-space: nowrap; }
.mmm__pille-punkt { width: 8px; height: 8px; border-radius: var(--r-full); background: var(--mmm-punkt-live); box-shadow: var(--mmm-punkt-glanz); }
.mmm__pille-pfeil { opacity: .55; }

/* --- geschlossen: kleiner Rueckweg (sonst kommt niemand mehr ran) --- */
.mmm__oeffnen { padding: 8px 14px; border: 1px solid var(--kk-border); border-radius: var(--r-full); background: var(--kk-white); color: var(--c-text-muted); font: inherit; font-size: var(--fs-caption); font-weight: var(--fw-semibold); cursor: pointer; white-space: nowrap; }

/* --- offen --- */
.mmm__panel { display: flex; flex-direction: column; width: var(--mmm-breite); max-width: calc(100vw - 48px); height: var(--mmm-hoehe); max-height: calc(100vh - 48px); background: var(--kk-white); border: 1px solid var(--kk-border); border-radius: var(--mmm-radius); box-shadow: var(--mmm-schatten); overflow: hidden; }

.mmm__kopf { display: flex; align-items: center; gap: 9px; padding: 12px 14px 10px; }
.mmm__ampel { flex: none; width: 9px; height: 9px; border-radius: var(--r-full); background: var(--c-text-soft); }
.mmm__ampel--gruen { background: var(--kk-green); box-shadow: var(--mmm-ampel-gruen-glanz); }
.mmm__ampel--gelb { background: var(--mmm-ampel-gelb); }
.mmm__ampel--rot { background: var(--c-error); }
.mmm__titel { font-size: var(--fs-sm); font-weight: var(--fw-bold); white-space: nowrap; }
.mmm__chip { padding: 2px 7px; border-radius: 5px; background: var(--kk-violet-100); color: var(--kk-violet-800); font-weight: var(--fw-semibold); white-space: nowrap; }
.mmm__chip--test { background: var(--mmm-chip-test-bg); color: var(--mmm-chip-test-fg); }
.mmm__luecke { flex: 1; }
.mmm__knopf { height: 26px; display: inline-flex; align-items: center; justify-content: center; gap: 5px; padding: 0 9px; border: 1px solid var(--kk-border); border-radius: 7px; background: var(--mmm-flaeche); color: var(--c-text-muted); font: inherit; font-size: var(--fs-caption); font-weight: var(--fw-semibold); cursor: pointer; white-space: nowrap; }
.mmm__knopf--quadrat { width: 26px; padding: 0; }
.mmm__knopf:hover { color: var(--c-text); }

.mmm__status { display: flex; align-items: center; gap: 8px; margin: 0 14px; padding: 7px 11px; border: 1px solid var(--kk-violet-trenner); border-radius: 9px; background: var(--mmm-flaeche-zart); color: var(--c-text-muted); white-space: nowrap; overflow: hidden; }
.mmm__status b { color: var(--c-text); }
.mmm__status-an { color: var(--kk-green); font-weight: var(--fw-bold); }
.mmm__status-geld { font-variant-numeric: tabular-nums; }
.mmm__status-geld b { color: var(--c-primary); }

.mmm__tabs { display: flex; gap: 2px; padding: 8px 10px 0; border-bottom: 1px solid var(--kk-violet-trenner); }
.mmm__tab { padding: 6px 11px 8px; border: none; background: none; color: var(--c-text-muted); font: inherit; font-size: var(--fs-caption); font-weight: var(--fw-semibold); cursor: pointer; border-bottom: 2px solid transparent; }
.mmm__tab--aktiv { color: var(--c-primary); border-bottom-color: var(--c-primary); }

.mmm__koerper { display: flex; flex-direction: column; flex: 1; min-height: 0; }
.mmm__rollflaeche { flex: 1; min-height: 0; overflow-y: auto; padding: 4px 14px 10px; }
.mmm__werkzeuge { padding: 10px 14px 0; }
.mmm__suchfeld { display: flex; align-items: center; gap: 7px; padding: 6px 10px; border: 1px solid var(--kk-border); border-radius: 8px; background: var(--mmm-flaeche); }
.mmm__suchfeld input { flex: 1; min-width: 0; border: none; background: none; font: inherit; font-size: var(--fs-caption); color: var(--c-text); }
.mmm__suchfeld input:focus { outline: none; }
.mmm__nurverbunden { flex: none; border: none; background: none; font: inherit; font-size: var(--fs-caption); font-weight: var(--fw-semibold); color: var(--c-text-soft); cursor: pointer; white-space: nowrap; }
.mmm__nurverbunden--an { color: var(--c-primary); }

/* --- Endpunkt-Liste --- */
.mmm__zeile { display: flex; width: 100%; align-items: center; gap: 10px; padding: 10px 4px; margin: 0; border: none; border-bottom: 1px solid var(--mmm-flaeche); border-radius: 8px; background: none; font: inherit; font-size: var(--fs-caption); text-align: left; cursor: pointer; }
.mmm__zeile:hover { background: var(--mmm-flaeche-zart); }
.mmm__punkt { flex: none; width: 8px; height: 8px; border-radius: var(--r-full); background: var(--mmm-punkt-aus); }
.mmm__punkt--verbunden { background: var(--kk-green); }
.mmm__punkt--nur_cache { background: var(--kk-violet-500); }
.mmm__punkt--fehler { background: var(--c-error); }
.mmm__zeile-mitte { min-width: 0; flex: 1; }
.mmm__mono { display: block; font-family: ui-monospace, Menlo, monospace; font-size: var(--fs-sm); font-weight: var(--fw-semibold); color: var(--c-text); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.mmm__chips { display: flex; gap: 4px; margin-top: 4px; flex-wrap: nowrap; overflow: hidden; }
.mmm__stellchip { padding: 1px 6px; border-radius: 5px; background: var(--kk-violet-100); color: var(--kk-violet-800); font-weight: var(--fw-semibold); white-space: nowrap; }
.mmm__stellchip--leer { background: var(--kk-muted); color: var(--c-text-soft); }
.mmm__zahl { display: block; font-size: var(--fs-sm); font-weight: var(--fw-bold); font-variant-numeric: tabular-nums; text-align: right; }
.mmm__zahl-klein { display: block; color: var(--c-text-soft); white-space: nowrap; text-align: right; }
.mmm__pfeil { flex: none; color: var(--kk-violet-300); }
.mmm__fuss { display: flex; align-items: center; gap: 8px; padding: 8px 14px; border-top: 1px solid var(--kk-violet-trenner); background: var(--mmm-flaeche-zart); color: var(--c-text-soft); white-space: nowrap; }
.mmm__fuss-punkt { display: inline-flex; align-items: center; gap: 5px; }
.mmm__leer { padding: 18px 4px; color: var(--c-text-soft); text-align: center; line-height: 1.6; }

/* --- Endpunkt-Detail --- */
.mmm__zurueck { display: inline-flex; align-items: center; gap: 6px; padding: 0 0 10px; border: none; background: none; font: inherit; font-size: var(--fs-caption); font-weight: var(--fw-semibold); color: var(--c-primary); cursor: pointer; }
.mmm__detail-kopf { display: flex; align-items: center; gap: 8px; }
.mmm__detail-beschreibung { margin: 3px 0 0; color: var(--c-text-muted); line-height: 1.5; white-space: normal; }
.mmm__kennzahlen { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 8px; margin-top: 12px; }
.mmm__kachel { padding: 9px 11px; border: 1px solid var(--kk-border); border-radius: 10px; background: var(--mmm-flaeche); }
.mmm__kachel--geld { border-color: var(--kk-violet-100); background: var(--kk-violet-50); }
.mmm__kachel-titel { font-weight: var(--fw-bold); letter-spacing: .05em; color: var(--c-text-soft); }
.mmm__kachel--geld .mmm__kachel-titel { color: var(--c-primary); }
.mmm__kachel-wert { margin-top: 2px; font-size: var(--fs-h3); font-weight: var(--fw-bold); }
.mmm__kachel--geld .mmm__kachel-wert { color: var(--c-primary); }
.mmm__abschnitt { display: flex; align-items: center; gap: 8px; margin: 14px 0 4px; font-weight: var(--fw-bold); letter-spacing: .06em; color: var(--c-text-soft); white-space: nowrap; }
.mmm__stelle { display: flex; align-items: center; gap: 9px; padding: 8px 4px; border-bottom: 1px solid var(--mmm-flaeche); border-radius: 8px; }
.mmm__stelle:hover { background: var(--mmm-flaeche-zart); }
.mmm__stelle-text { min-width: 0; flex: 1; }
.mmm__stelle-label { display: block; font-size: var(--fs-sm); font-weight: var(--fw-semibold); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.mmm__stelle-unter { display: block; color: var(--c-text-soft); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.mmm__zeigen { flex: none; padding: 5px 10px; border: 1px solid var(--kk-violet-200); border-radius: 7px; background: var(--kk-white); color: var(--c-primary); font: inherit; font-size: var(--fs-caption); font-weight: var(--fw-semibold); cursor: pointer; white-space: nowrap; }
.mmm__zeigen--an { background: var(--c-primary); border-color: var(--c-primary); color: var(--kk-white); }
.mmm__zeigen[disabled] { opacity: .5; cursor: default; }
/* Stelle auf einer anderen Seite: die Karte IST der Link dorthin (Hash #mm=…
   markiert die Stelle drueben). Ohne Ziel (keine Beratung offen) bleibt sie
   ein stummes div — dieselbe Optik, kein Cursor, kein Hover. */
.mmm__woanders { display: flex; align-items: center; gap: 10px; margin-top: 10px; padding: 9px 11px; border: 1px solid var(--kk-border); border-radius: 10px; background: var(--mmm-flaeche-zart); color: inherit; text-decoration: none; }
a.mmm__woanders { cursor: pointer; transition: border-color var(--dur-fast), background var(--dur-fast); }
a.mmm__woanders:hover, a.mmm__woanders:focus-visible { border-color: var(--kk-violet-200); background: var(--kk-violet-50); outline: none; }
a.mmm__woanders:hover .mmm__stelle-unter { color: var(--c-primary); }
.mmm__woanders--ohne-ziel { opacity: .75; }
/* Mini-Vorschau: stilisierte Seite (Kopfzeile + Fleck an der Lage der Stelle).
   Lagen kommen aus mm_register.LAGEN — kopf / liste / unten. */
.mmm__vorschau { position: relative; flex: none; width: 54px; height: 38px; overflow: hidden; border: 1px solid var(--kk-violet-200); border-radius: 6px; background: var(--mmm-streifen); }
.mmm__vorschau-kopf { position: absolute; top: 0; left: 0; right: 0; height: 5px; background: var(--kk-violet-200); }
.mmm__vorschau-fleck { position: absolute; left: 10px; right: 10px; height: 5px; border-radius: 2px; background: var(--c-primary); outline: 2px solid var(--kk-violet-200); outline-offset: 1px; }
.mmm__vorschau-fleck--kopf { top: 8px; }
.mmm__vorschau-fleck--liste { top: 16px; }
.mmm__vorschau-fleck--unten { bottom: 5px; }

/* --- Historie --- */
.mmm__filter { display: flex; gap: 5px; padding: 10px 14px 6px; }
.mmm__pille-filter { padding: 4px 10px; border: 1px solid var(--kk-border); border-radius: var(--r-full); background: var(--kk-white); color: var(--c-text-muted); font: inherit; font-size: var(--fs-caption); font-weight: var(--fw-semibold); cursor: pointer; white-space: nowrap; }
.mmm__pille-filter--an { background: var(--kk-violet-100); border-color: var(--kk-violet-200); color: var(--kk-violet-800); }
.mmm__ereignis { display: grid; width: 100%; grid-template-columns: 44px 1fr auto; gap: 0 10px; align-items: center; padding: 9px 4px; border: none; border-bottom: 1px solid var(--mmm-flaeche); border-radius: 8px; background: none; font: inherit; font-size: var(--fs-caption); text-align: left; cursor: pointer; }
.mmm__ereignis:hover { background: var(--mmm-flaeche-zart); }
.mmm__zeit { color: var(--c-text-soft); font-variant-numeric: tabular-nums; }
.mmm__ereignis-name { display: flex; align-items: center; gap: 6px; }
.mmm__grund { display: block; color: var(--c-text-soft); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.mmm__dauer { display: block; font-weight: var(--fw-bold); font-variant-numeric: tabular-nums; text-align: right; }
.mmm__dauer--langsam { color: var(--mmm-warn); }
.mmm__tag { display: block; font-weight: var(--fw-semibold); text-align: right; white-space: nowrap; }
.mmm__tag--echt { color: var(--c-primary); }
.mmm__tag--cache { color: var(--kk-green); }
.mmm__tag--fehler { color: var(--mmm-fehler); }
.mmm__blaettern { display: flex; align-items: center; gap: 8px; padding: 8px 14px; border-top: 1px solid var(--kk-violet-trenner); background: var(--mmm-flaeche-zart); }
.mmm__blaettern-info { color: var(--c-text-soft); white-space: nowrap; }
.mmm__ereignis-detail { margin: 6px 0 10px; padding: 9px 11px; border: 1px solid var(--kk-border); border-radius: 9px; background: var(--mmm-flaeche); color: var(--c-text-muted); line-height: 1.6; white-space: normal; }

/* --- Verbrauch --- */
.mmm__karten { display: grid; grid-template-columns: 1fr 1fr; gap: 9px; }
.mmm__karte { padding: 11px 13px; border: 1px solid var(--kk-border); border-radius: 11px; background: var(--mmm-flaeche); }
.mmm__karte--start { border-color: var(--kk-violet-100); background: var(--kk-violet-50); }
.mmm__karte-titel { font-weight: var(--fw-bold); letter-spacing: .05em; color: var(--c-text-soft); white-space: nowrap; }
.mmm__karte--start .mmm__karte-titel { color: var(--c-primary); }
.mmm__karte-wert { margin-top: 3px; font-size: var(--fs-h2); font-weight: var(--fw-bold); }
.mmm__karte-wert span { font-size: var(--fs-caption); font-weight: var(--fw-semibold); color: var(--c-text-muted); }
.mmm__breitknopf { margin-top: 9px; padding: 7px 13px; border: 1px solid var(--kk-violet-200); border-radius: 9px; background: var(--kk-white); color: var(--c-primary); font: inherit; font-size: var(--fs-caption); font-weight: var(--fw-semibold); cursor: pointer; white-space: nowrap; }
.mmm__cachezeile { display: flex; align-items: center; gap: 8px; margin-top: 12px; padding: 8px 11px; border: 1px solid var(--kk-green-bd); border-radius: 9px; background: var(--kk-green-hero); white-space: nowrap; }
.mmm__cachezeile b { color: var(--kk-green); }
.mmm__miss { color: var(--mmm-fehler); }
.mmm__balkenzeile { display: flex; align-items: center; gap: 9px; padding: 6px 0; }
.mmm__balkenname { flex: 1; min-width: 0; font-family: ui-monospace, Menlo, monospace; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.mmm__balken { flex: none; width: 96px; height: 7px; border-radius: 4px; background: var(--kk-violet-trenner); overflow: hidden; }
.mmm__balken span { display: block; height: 100%; border-radius: 4px; background: var(--kk-violet-500); }
.mmm__fussnote { margin-top: 12px; color: var(--c-text-soft); line-height: 1.5; white-space: normal; }

/* --- Markierung AUF der beobachteten Seite -------------------------------
   Diese zwei Klassen sind die einzigen, die das Panel fremden Elementen
   anhaengt — und sie setzen nur Ring und Label, nie Layout. Ein Monitor, der
   die Seite verschiebt, misst am Ende sich selbst. */
.mmm-hl { position: relative; box-shadow: var(--mmm-hl-ring) !important; }
.mmm-hl__label { position: absolute; top: -11px; left: 12px; z-index: 940; padding: 2px 7px; border-radius: 5px; background: var(--c-primary); color: var(--kk-white); font-size: var(--fs-caption); font-weight: var(--fw-bold); white-space: nowrap; pointer-events: none; }

/* --- Handy (Owner-Bug O1, 15.09.): Das Panel war 440 px breit und wurde auf
   100vw − 48px begrenzt; die Kopfleiste brach nicht um — „✕“ lag außerhalb
   des Panels und war am iPhone nicht antippbar (Playwright 430 px: Panel bis
   406 px, ✕ bei 417–428 px). Hier: volle Breite, Kopf darf umbrechen, Höhe
   nach der SICHTBAREN Bildschirmhöhe (dvh — iOS-Leisten), Kacheln zweispaltig. */
@media (max-width: 860px) {
  .mmm { left: 8px; bottom: calc(8px + env(safe-area-inset-bottom, 0px)); }
  .mmm__panel { width: calc(100vw - 16px); max-width: none; max-height: calc(100vh - 16px); max-height: calc(100dvh - 16px - env(safe-area-inset-bottom, 0px)); }
  .mmm__kopf { flex-wrap: wrap; row-gap: 6px; }
  /* Die Umgebungs-Chips rutschen in die zweite Zeile — „Prüfen“, „–“ und „✕“
     bleiben wie am Desktop zusammen oben rechts. Der volle Umbruch davor ist
     ein leeres Flex-Element (::after, order 1), sonst passte ein kurzer Chip
     noch in die erste Zeile und stünde rechts neben „✕“. */
  .mmm__kopf::after { content: ""; order: 1; flex-basis: 100%; height: 0; }
  .mmm__chip { order: 2; }
  .mmm__status { flex-wrap: wrap; }
  .mmm__kennzahlen { grid-template-columns: 1fr 1fr; }
  .mmm__kachel { min-width: 0; }
}

/* ══ Klickzeiten-Auswertung (Owner-Auftrag 2026-09-08) ══════════════════════
   Diagnose-Tabelle unter /messung. Bewusst nuechtern: sie soll Zahlen lesbar
   machen, nicht gestalten. Alle Farben aus Tokens. */
.mess { max-width: var(--k2-max); margin: 0 auto; padding: 24px 32px 60px; }
.mess__titel { margin: 0 0 6px; font-size: var(--fs-h1); font-weight: var(--fw-bold); color: var(--c-primary); }
.mess__hinweis { margin: 0 0 16px; font-size: var(--fs-sm); line-height: 1.6; color: var(--c-text-muted); max-width: 90ch; }
.mess__tabelle-rahmen { overflow-x: auto; border: 1px solid var(--k2-rahmen-bd); border-radius: var(--r-md); }
.mess__tabelle { width: 100%; border-collapse: collapse; font-size: var(--fs-sm); }
.mess__tabelle th { text-align: left; padding: 9px 12px; background: var(--c-surface-muted); font-weight: var(--fw-bold); white-space: nowrap; }
.mess__tabelle td { padding: 8px 12px; border-top: 1px solid var(--k2-rahmen-bd); white-space: nowrap; }
.mess__z { text-align: right; font-variant-numeric: tabular-nums; }
.mess__leise { color: var(--c-text-muted); }
.mess__stark { font-weight: var(--fw-bold); color: var(--c-text); }

/* Merge 14.09.: Beide Seiten haben hier angebaut — develop das M&M-Sync-
   Backoffice (.mms-*), der Arbeitsbranch die mobile Seitenmenue-Schicht
   (.k2-mobilkopf/.k2-burger/.k2-menue). Getrennte Namensraeume, keine
   Ueberschneidung; die Media-Query steht bewusst zuletzt. */
/* ==========================================================================
   M&M-Sync-Backoffice-Seite (mms-*) — Design-Handoff „MM Sync Admin" (Owner 10.09.).
   Drei Zonen: Sparten-Karten (Knopf + Zustand), Abweichungen (nur was nicht stimmt),
   eingeklappte Gesamtliste + Tarife ohne Mapping. Liest nur --mms-Tokens und Marken-Tokens.
   Die data-*-Marker im Template sind Vertrag mit den Waechtern, nicht mit dem CSS.
   ========================================================================== */
.mms { max-width: var(--mms-breite); margin: 0 auto; font-variant-numeric: tabular-nums; }
.mms a { color: var(--c-primary); text-decoration: none; }
.mms a:hover { color: var(--c-primary-hover); text-decoration: underline; }
.mms-kopf { margin-bottom: var(--sp-6); }
.mms-kopf__titel { margin: 0; font-size: 28px; font-weight: var(--fw-bold); letter-spacing: -.01em; line-height: 1.15; }
.mms-kopf__stand { margin: 6px 0 0; font-size: 14px; color: var(--c-text-muted); }
.mms-kopf__stand[data-ampel="leer"] { color: var(--mms-err); font-weight: var(--fw-semibold); }

/* Karte: weiss, 16er Radius, Inhalt selbst gerahmt (kein Card-Padding) */
.mms-karte { background: var(--c-surface); border: 1px solid var(--mms-bd); border-radius: var(--mms-radius); overflow: hidden; }
.mms-karte + .mms-karte, .mms-unten { margin-top: var(--sp-4); }
.mms-karte__kopf { display: flex; align-items: center; gap: 10px; padding: 14px 20px; border-bottom: 1px solid var(--mms-trenner); }
.mms-karte__titel { margin: 0; font-size: 15px; font-weight: var(--fw-bold); white-space: nowrap; }
.mms-karte__hint { font-size: 12px; color: var(--c-text-soft); white-space: nowrap; }
.mms-karte__spacer { flex: 1; }

/* Knoepfe der Seite: kompakter als .btn-sm, 8er Radius (Handoff) */
.mms .btn { border-radius: var(--mms-knopf-radius); font-size: 12.5px; font-weight: var(--fw-semibold); padding: 7px 14px; white-space: nowrap; line-height: 1.2; }
.mms-knopf-primaer, .mms-sync-knopf { background: var(--mms-run); color: var(--c-text-on-accent); border-color: var(--mms-run); }
.mms-knopf-primaer:hover, .mms-sync-knopf:hover { background: var(--c-primary-hover); border-color: var(--c-primary-hover); }
.mms-knopf-outline { background: var(--c-surface); color: var(--c-primary); border: 1px solid var(--kk-violet-300); padding: 6px 12px; font-size: 12px; }
.mms-knopf-outline:hover { background: var(--kk-violet-50); }
.mms .btn:disabled { opacity: 1; background: var(--kk-violet-trenner); color: var(--c-text-soft); border-color: var(--kk-violet-trenner); cursor: not-allowed; pointer-events: auto; }
.mms-sync-knopf--laeuft:disabled { background: var(--mms-run-bg); color: var(--c-text-on-accent); border-color: var(--mms-run-bg); cursor: progress; }
.mms-spinner { width: 11px; height: 11px; border: 2px solid var(--mms-spinner-ring); border-top-color: var(--c-text-on-accent); border-radius: 50%; display: inline-block; margin-right: 7px; vertical-align: -1px; animation: mms-drehen .8s linear infinite; }
@keyframes mms-drehen { to { transform: rotate(360deg); } }

/* Fehler-Leiste ueber den Sparten-Karten */
.mms-fehler { display: flex; align-items: center; gap: 12px; background: var(--mms-err-bg); border-bottom: 1px solid var(--mms-err-bd); padding: 12px 20px; }
.mms-fehler__punkt { width: 20px; height: 20px; flex: none; display: inline-flex; align-items: center; justify-content: center; border-radius: 50%; background: var(--mms-err); color: var(--c-text-on-accent); font-size: 11px; font-weight: var(--fw-bold); }
.mms-fehler__text { flex: 1; min-width: 0; font-size: 13px; line-height: 1.4; }
.mms-fehler__detail { color: var(--c-text-muted); }
.mms .mms-fehler__knopf { background: var(--c-surface); border: 1px solid var(--mms-err-knopf-bd); color: var(--mms-err); padding: 6px 12px; font-size: 12px; }
.mms .mms-fehler__knopf:hover { background: var(--mms-err-bg); }

/* Zone 1 — Sparten-Karten: 5 Spalten, 1px-Linien, Fuss unten gepinnt */
.mms-sparten__raster { display: grid; grid-template-columns: repeat(5, minmax(0, 1fr)); }
.mms-sparte { display: flex; flex-direction: column; padding: 18px 20px; min-width: 0; border-right: 1px solid var(--mms-trenner); }
.mms-sparte:last-child { border-right: 0; }
.mms-sparte--none { opacity: .6; }
.mms-sparte__kopf { display: flex; align-items: center; gap: 8px; min-height: 20px; }
.mms-sparte__punkt { width: 8px; height: 8px; flex: none; border-radius: 50%; background: var(--mms-none); }
.mms-sparte--ok .mms-sparte__punkt { background: var(--mms-ok); box-shadow: 0 0 0 3px var(--mms-ok-ring); }
.mms-sparte--warn .mms-sparte__punkt { background: var(--mms-warn); }
.mms-sparte--err .mms-sparte__punkt { background: var(--mms-err); box-shadow: 0 0 0 3px var(--mms-err-ring); }
.mms-sparte--run .mms-sparte__punkt { background: var(--mms-run); }
.mms-sparte__name { font-size: 13.5px; font-weight: var(--fw-bold); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; flex: 1; min-width: 0; }
.mms-sparte__zahl { margin-top: 12px; font-size: 24px; font-weight: var(--fw-bold); letter-spacing: -.02em; line-height: 1; }
.mms-sparte__zahl-label { font-size: 12px; font-weight: var(--fw-medium); color: var(--c-text-soft); letter-spacing: 0; margin-left: 5px; }
.mms-sparte__sub { font-size: 12px; margin-top: 6px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; color: var(--c-text-muted); }
.mms-sparte--warn .mms-sparte__sub { color: var(--mms-warn); font-weight: var(--fw-semibold); }
.mms-sparte--err .mms-sparte__sub { color: var(--mms-err); font-weight: var(--fw-semibold); }
.mms-sparte--run .mms-sparte__sub { color: var(--mms-run); }
.mms-sparte__fuss { display: flex; align-items: center; gap: 8px; margin-top: auto; padding-top: 16px; }
.mms-sparte__calls { font-size: 11px; color: var(--c-text-soft); white-space: nowrap; }

/* Zone 2 — Abweichungen */
.mms-zaehler { font-size: 11.5px; font-weight: var(--fw-bold); border-radius: var(--r-full); padding: 2px 9px; }
.mms-zaehler--warn { background: var(--mms-warn-bg); color: var(--mms-warn); }
.mms-zaehler--ok { background: var(--mms-ok-bg); color: var(--mms-ok); }
.mms-abw__zeile { display: grid; grid-template-columns: minmax(0, 1.6fr) 130px minmax(0, 1.6fr) auto; gap: 16px; align-items: center; padding: 13px 20px; border-bottom: 1px solid var(--mms-trenner-zart); }
.mms-abw__zeile:last-child { border-bottom: 0; }
.mms-abw__detail { font-size: 12.5px; color: var(--c-text); min-width: 0; line-height: 1.4; }
.mms-abw__aktion { display: flex; justify-content: flex-end; min-width: 180px; }
.mms-abw__link { font-size: 12px; font-weight: var(--fw-semibold); padding: 6px 0; white-space: nowrap; }
.mms-abw__leer { display: flex; align-items: center; gap: 10px; padding: 16px 20px; font-size: 13px; color: var(--c-text); }
.mms-haken { width: 18px; height: 18px; flex: none; display: inline-flex; align-items: center; justify-content: center; border-radius: 50%; background: var(--mms-ok); color: var(--c-text-on-accent); font-size: 10px; font-weight: var(--fw-bold); }
.mms-tag { display: inline-block; justify-self: start; font-size: 10.5px; font-weight: var(--fw-bold); border-radius: 5px; padding: 3px 8px; white-space: nowrap; }
.mms-tag--warn { background: var(--mms-warn-bg); color: var(--mms-warn); }
.mms-tag--err { background: var(--mms-err-bg); color: var(--mms-err); }

/* Tarif-Zelle: Logo + Name + Meta (Zone 2 und 3) */
.mms-tarif { display: flex; align-items: center; gap: 10px; min-width: 0; }
.mms-tarif__text { min-width: 0; }
.mms-tarif__name { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; font-size: 13px; font-weight: var(--fw-semibold); }
.mms-abw__zeile .mms-tarif__name { font-size: 13.5px; }
.mms-tarif__ges { font-size: 11.5px; color: var(--c-text-muted); font-weight: var(--fw-regular); }
.mms-tarif__meta { font-size: 11.5px; color: var(--c-text-soft); margin-top: 2px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.mms-tarif__mm { font-size: 11px; color: var(--c-text-soft); font-family: ui-monospace, Menlo, monospace; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.mms-logo { width: 28px; height: 28px; flex: none; border-radius: 7px; background: var(--c-surface); border: 1px solid var(--mms-bd); object-fit: contain; padding: 4px; box-sizing: border-box; }
.mms-logo--md { width: 34px; height: 34px; }
.mms-logo--sm { width: 30px; height: 30px; }
.mms-logo--mono { display: inline-flex; align-items: center; justify-content: center; padding: 0; color: var(--c-text-muted); font-size: 9px; font-weight: var(--fw-bold); letter-spacing: -.02em; text-transform: uppercase; }
.mms-logo--md.mms-logo--mono { font-size: 10px; }

/* Zone 3 — Gesamtliste (details, Standard zu) + Ohne-Mapping-Spalte */
.mms-unten { display: grid; grid-template-columns: minmax(0, 2fr) minmax(0, 1fr); gap: var(--sp-4); align-items: start; }
.mms-rechts-spalte { display: flex; flex-direction: column; gap: var(--sp-4); }
.mms-liste__kopf { display: flex; width: 100%; align-items: center; gap: 10px; padding: 14px 20px; cursor: pointer; list-style: none; border-bottom: 1px solid var(--mms-trenner); }
.mms-liste__kopf::-webkit-details-marker { display: none; }
.mms-liste__pfeil { width: 16px; font-size: 11px; color: var(--c-text-soft); transition: transform var(--t-fast); }
.mms-liste[open] > .mms-liste__kopf .mms-liste__pfeil { transform: rotate(90deg); }
.mms-liste:not([open]) > .mms-liste__kopf { border-bottom: 0; }
.mms-filter { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; padding: 10px 20px; border-bottom: 1px solid var(--mms-trenner); }
.mms-filter__trenner { width: 1px; height: 18px; background: var(--mms-bd); margin: 0 4px; }
.mms-pille { border-radius: var(--r-full); padding: 4px 11px; font-size: 11.5px; font-weight: var(--fw-semibold); white-space: nowrap; background: var(--c-surface); border: 1px solid var(--mms-bd); color: var(--c-text-muted); }
.mms a.mms-pille:hover { text-decoration: none; color: var(--c-primary); }
.mms a.mms-pille--aktiv, .mms a.mms-pille--aktiv:hover { background: var(--mms-run); border-color: var(--mms-run); color: var(--c-text-on-accent); }
.mms-pille--leer { opacity: .55; }
.mms-liste__kopfzeile, .mms-liste__zeile { display: grid; grid-template-columns: minmax(0, 2fr) minmax(0, 1.1fr) minmax(0, 1.1fr) 90px; gap: 0 12px; align-items: center; padding: 9px 20px; border-bottom: 1px solid var(--mms-trenner-zart); }
.mms-liste__kopfzeile { padding: 8px 20px; font-size: 10.5px; font-weight: var(--fw-bold); letter-spacing: .06em; text-transform: uppercase; color: var(--c-text-soft); border-bottom-color: var(--mms-trenner); }
.mms-liste__gruppe { padding: 8px 20px 5px; font-size: 10.5px; font-weight: var(--fw-bold); letter-spacing: .06em; text-transform: uppercase; color: var(--c-primary); background: var(--mms-gruppe-bg); border-bottom: 1px solid var(--mms-trenner); }
.mms-liste__zeile--warn, .mms-liste__zeile--err { background: var(--mms-warn-zeile); }
.mms-liste__leer { padding: 16px 20px; font-size: 13px; color: var(--c-text-muted); }
.mms-zelle { font-size: 11.5px; min-width: 0; line-height: 1.3; color: var(--c-text-muted); }
.mms-zelle--ok { color: var(--mms-ok); }
.mms-liste__zeile .mms-zelle--ok:first-of-type { color: var(--c-text-muted); } /* Status „Einfuehrung · aktiv" bleibt grau */
.mms-zelle--warn { color: var(--mms-warn); font-weight: var(--fw-bold); }
.mms-zelle--err { color: var(--mms-err); font-weight: var(--fw-bold); }
.mms-zelle--leer { color: var(--c-text-soft); }
.mms-zelle--abruf { color: var(--c-text-soft); white-space: nowrap; }
.mms-rechts { text-align: right; }
.mms-ohne__zeile { display: flex; align-items: center; gap: 8px; padding: 10px 20px; border-bottom: 1px solid var(--mms-trenner-zart); color: var(--c-text); }
.mms a.mms-ohne__zeile { color: var(--c-text); }
.mms a.mms-ohne__zeile:hover { text-decoration: none; background: var(--mms-gruppe-bg); }
.mms-ohne__text { flex: 1; min-width: 0; }
.mms-ohne__name { display: block; font-size: 13px; font-weight: var(--fw-semibold); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.mms-ohne__ges { display: block; font-size: 11.5px; color: var(--c-text-soft); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.mms-mini-badge { font-size: 10px; font-weight: var(--fw-bold); color: var(--c-text-soft); background: var(--kk-violet-trenner); border-radius: 4px; padding: 2px 6px; }
.mms-ohne__pfeil { font-size: 13px; color: var(--kk-violet-300); }
.mms-ohne__fuss { font-size: 11.5px; color: var(--c-text-soft); padding: 12px 20px; line-height: 1.5; }

@media (max-width: 1100px) {
  .mms-sparten__raster { grid-template-columns: repeat(3, minmax(0, 1fr)); }
  .mms-sparte { border-bottom: 1px solid var(--mms-trenner); }
  .mms-unten { grid-template-columns: 1fr; }
}
@media (max-width: 720px) {
  .mms-sparten__raster { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .mms-abw__zeile { grid-template-columns: 1fr; gap: 8px; }
  .mms-abw__aktion { justify-content: flex-start; min-width: 0; }
  .mms-liste__kopfzeile { display: none; }
  .mms-liste__zeile { grid-template-columns: 1fr; gap: 4px; }
  .mms-rechts { text-align: left; }
}

/* ==========================================================================
   Tarif-Detailseite (tarif-*) — Design-Handoff „Tarif Detail Admin" (Owner 10.09.).
   Kopfzeile + drei Tabs; Lese-Tabellen, deren Zeilen als natives <details> zum
   Inline-Edit aufklappen; Altersbaender als Sammel-Formular. Liest mms- und
   Marken-Tokens. Die data-*-Marker im Template sind Vertrag mit den Waechtern.
   ========================================================================== */
.tarif { max-width: var(--mms-breite); margin: 0 auto; font-variant-numeric: tabular-nums; }
.tarif a { color: var(--c-primary); text-decoration: none; }
.tarif a:hover { color: var(--c-primary-hover); text-decoration: underline; }
.tarif .btn { border-radius: var(--mms-knopf-radius); font-size: 13px; font-weight: var(--fw-semibold); padding: 7px 14px; white-space: nowrap; line-height: 1.2; }
/* `.tarif a` (oben) faerbt alle Links lila — der Primaer-Knopf braucht deshalb die hoehere Spezifitaet, sonst lila auf lila (Owner 10.09., Verursacher PR 799) */
.tarif a.tarif-knopf-primaer, .tarif-knopf-primaer { background: var(--mms-run); color: var(--c-text-on-accent); border-color: var(--mms-run); }
.tarif a.tarif-knopf-primaer:hover, .tarif-knopf-primaer:hover { background: var(--c-primary-hover); border-color: var(--c-primary-hover); color: var(--c-text-on-accent); text-decoration: none; }
.tarif-knopf-outline { background: var(--c-surface); color: var(--c-primary); border: 1px solid var(--kk-violet-300); display: inline-flex; align-items: center; gap: 8px; }
.tarif-knopf-outline:hover { background: var(--kk-violet-50); text-decoration: none; }
.tarif .btn:disabled { opacity: 1; background: var(--kk-violet-trenner); color: var(--c-text-soft); border-color: var(--kk-violet-trenner); cursor: not-allowed; pointer-events: auto; }

/* Kopf */
.tarif-kopf { display: flex; align-items: center; gap: 16px; flex-wrap: wrap; }
.tarif-logo { width: 52px; height: 52px; flex: none; border-radius: var(--tarif-logo-radius); background: var(--c-surface); border: 1px solid var(--mms-bd); object-fit: contain; padding: 6px; box-sizing: border-box; }
.tarif-logo--mono { display: inline-flex; align-items: center; justify-content: center; padding: 0; color: var(--c-text-muted); font-size: 14px; font-weight: var(--fw-bold); letter-spacing: -.02em; text-transform: uppercase; }
.tarif-kopf__text { flex: 1; min-width: 260px; }
.tarif-kopf__titel { margin: 0; font-size: 26px; font-weight: var(--fw-bold); letter-spacing: -.01em; line-height: 1.15; }
.tarif-kopf__meta { display: flex; align-items: center; gap: 8px; margin-top: 6px; font-size: 13px; color: var(--c-text-muted); flex-wrap: wrap; }
.tarif-kopf__punkt { color: var(--kk-violet-200); }
.tarif-kopf__link { font-size: 12.5px; font-weight: var(--fw-semibold); white-space: nowrap; }
.tarif-kopf__aktionen { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.tarif-kopf__aktionen form { display: contents; }
.tarif-status { display: inline-flex; align-items: center; gap: 5px; font-weight: var(--fw-semibold); }
.tarif-status__punkt { width: 6px; height: 6px; border-radius: 50%; background: var(--mms-none); }
.tarif-status--aktiv { color: var(--mms-ok); }
.tarif-status--aktiv .tarif-status__punkt { background: var(--mms-ok); }
.tarif-zaehler { font-size: 11px; font-weight: var(--fw-bold); border-radius: var(--r-full); padding: 1px 7px; white-space: nowrap; }
.tarif-zaehler--warn { background: var(--mms-warn-bg); color: var(--mms-warn); }
.tarif-zaehler--ok { background: var(--mms-ok-bg); color: var(--mms-ok); }

/* Tabs: Border-bottom, aktiv lila; Panels ohne JS alle sichtbar (Progressive Enhancement) */
.tarif-tabs { display: flex; gap: 2px; margin-top: 22px; border-bottom: 1px solid var(--mms-bd); overflow-x: auto; }
.tarif-tab { display: inline-flex; align-items: center; gap: 7px; border-bottom: 2px solid transparent; margin-bottom: -1px; padding: 10px 14px; font-size: 13.5px; font-weight: var(--fw-semibold); white-space: nowrap; color: var(--c-text-muted); }
.tarif-tab:hover { text-decoration: none; color: var(--c-primary); }
.tarif-tab.is-aktiv { color: var(--c-primary); border-bottom-color: var(--mms-run); }
.tarif-tab__zahl { font-size: 11px; font-weight: var(--fw-bold); border-radius: var(--r-full); padding: 1px 7px; background: var(--kk-violet-trenner); color: var(--c-text-soft); }
.tarif-tab.is-aktiv .tarif-tab__zahl { background: var(--kk-violet-100); color: var(--kk-violet-800); }
.tarif-panel { margin-top: 16px; }
.js .tarif-panel[hidden] { display: none; }

/* Raster + Karten */
.tarif-raster { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(100%, 540px), 1fr)); gap: 16px; align-items: start; }
.tarif-raster--halb { grid-template-columns: repeat(auto-fit, minmax(min(100%, 380px), 1fr)); }
.tarif-raster__voll { grid-column: 1 / -1; }
.tarif-seite { display: flex; flex-direction: column; gap: 16px; }
.tarif-karte { background: var(--c-surface); border: 1px solid var(--mms-bd); border-radius: var(--mms-radius); overflow: hidden; }
.tarif-karte--pad { padding: 16px 20px; }
.tarif-karte__kopf { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; padding: 14px 20px; border-bottom: 1px solid var(--mms-trenner); }
.tarif-karte__titel { font-size: 15px; font-weight: var(--fw-bold); white-space: nowrap; }
.tarif-karte__hint { font-size: 12px; color: var(--c-text-soft); }
.tarif-karte__spacer { flex: 1; }
.tarif-karte__inhalt { padding: 6px 20px 14px; }
.tarif-karte__fussknopf { margin-top: 12px; }
.tarif-overline { font-size: 11px; font-weight: var(--fw-bold); letter-spacing: .06em; text-transform: uppercase; color: var(--c-text-soft); }
.tarif-overline--abstand { margin-top: 16px; }
.tarif-text { font-size: 12.5px; color: var(--c-text-muted); line-height: 1.55; margin: 8px 0 0; }
.tarif-text strong { color: var(--c-text); }
.tarif-text--sub { font-size: 11.5px; color: var(--c-text-soft); margin-top: 4px; }
.tarif-text--gross { font-size: 22px; font-weight: var(--fw-bold); color: var(--c-text); margin-top: 6px; line-height: 1.2; }
.tarif-leer { padding: 16px 20px; font-size: 13px; color: var(--c-text-muted); margin: 0; }
.tarif-leer--mitte { text-align: center; }
.tarif-rechts { text-align: right; }
.tarif-fehler { margin: 10px 20px 0; padding: 8px 12px; border-radius: var(--mms-knopf-radius); background: var(--mms-err-bg); color: var(--mms-err); font-size: 12.5px; }

/* Leistungs-Tabelle: Kopfzeile, Gruppenzeile, Lese-Zeile als summary */
.tarif-tabelle__kopfzeile { display: grid; grid-template-columns: minmax(160px, 2fr) 80px 90px minmax(0, 1fr) 32px; gap: 0 12px; padding: 8px 20px; font-size: 10.5px; font-weight: var(--fw-bold); letter-spacing: .06em; text-transform: uppercase; color: var(--c-text-soft); border-bottom: 1px solid var(--mms-trenner); }
.tarif-tabelle__kopfzeile--preise { grid-template-columns: 120px minmax(0, 1fr) 110px 110px; }
.tarif-gruppe { padding: 8px 20px 5px; font-size: 10.5px; font-weight: var(--fw-bold); letter-spacing: .06em; text-transform: uppercase; color: var(--c-primary); background: var(--mms-gruppe-bg); border-bottom: 1px solid var(--mms-trenner); }
.tarif-zeile { border-bottom: 1px solid var(--mms-trenner-zart); }
.tarif-zeile__lesen { display: grid; grid-template-columns: minmax(160px, 2fr) 80px 90px minmax(0, 1fr) 32px; gap: 0 12px; align-items: center; padding: 9px 20px; cursor: pointer; list-style: none; }
.tarif-zeile__lesen::-webkit-details-marker { display: none; }
.tarif-zeile__lesen:hover { background: var(--mms-gruppe-bg); }
.tarif-zeile[open] > .tarif-zeile__lesen { background: var(--tarif-edit-bg); border-bottom: 1px solid var(--tarif-edit-bd); }
.tarif-zeile__name { min-width: 0; }
.tarif-zeile__titel { display: block; font-size: 13px; font-weight: var(--fw-semibold); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.tarif-zeile--leer .tarif-zeile__titel { color: var(--c-text-soft); font-weight: var(--fw-medium); }
.tarif-zeile__sub { display: block; font-size: 11px; color: var(--c-text-soft); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.tarif-zeile__prozent { font-size: 14px; font-weight: var(--fw-bold); color: var(--mms-ok); }
.tarif-zeile--leer .tarif-zeile__prozent { color: var(--mms-none); }
.tarif-zeile__max { font-size: 12.5px; color: var(--c-text-muted); }
.tarif-chips { display: flex; gap: 4px; flex-wrap: wrap; min-width: 0; align-items: center; }
.tarif-chips--abstand { margin-top: 10px; }
.tarif-chip { font-size: 10.5px; font-weight: var(--fw-semibold); background: var(--tarif-chip-bg); color: var(--c-text-muted); border-radius: 4px; padding: 2px 6px; white-space: nowrap; }
.tarif-zeile__stift { width: 28px; height: 28px; display: inline-flex; align-items: center; justify-content: center; background: var(--c-surface); border: 1px solid var(--mms-bd); border-radius: 7px; font-size: 12px; color: var(--c-text-muted); }
a.tarif-zeile__stift:hover { text-decoration: none; color: var(--c-primary); }
.tarif-zeile[open] > .tarif-zeile__lesen .tarif-zeile__stift { background: var(--mms-run); color: var(--c-text-on-accent); border-color: var(--mms-run); }

/* Inline-Edit: lila Karte unter der Zeile */
.tarif-edit { padding: 16px 20px; background: var(--tarif-edit-bg); border-bottom: 1px solid var(--tarif-edit-bd); }
.tarif-edit__kopf { display: flex; align-items: baseline; gap: 8px; flex-wrap: wrap; }
.tarif-edit__titel { font-size: 14px; font-weight: var(--fw-bold); }
.tarif-edit__sub { font-size: 12px; color: var(--c-text-muted); }
.tarif-edit__abbrechen { background: none; border: 0; font-family: inherit; font-size: 12px; color: var(--c-text-muted); cursor: pointer; padding: 6px 4px; }
.tarif-edit__abbrechen:hover { color: var(--mms-err); }
.tarif-edit__quelle { margin: 12px 0 0; font-size: 11.5px; color: var(--c-text-soft); line-height: 1.5; }
.tarif-felder { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 12px 16px; margin-top: 14px; }
.tarif-felder--mehr { margin-top: 12px; padding-top: 12px; border-top: 1px solid var(--tarif-edit-bd); }
.tarif-felder--dok { padding: 12px 20px 16px; margin-top: 0; }
.tarif-feld { display: block; min-width: 0; }
.tarif-feld--knopf { display: flex; align-items: flex-end; }
.tarif-feld__label { display: block; font-size: 11.5px; font-weight: var(--fw-semibold); color: var(--c-text); }
.tarif-feld__eingabe { display: flex; align-items: center; gap: 6px; margin-top: 4px; }
.tarif-feld .input { width: 100%; min-width: 0; height: 34px; padding: 0 10px; font-size: 13px; border-radius: var(--mms-knopf-radius); }
.tarif-feld__einheit { font-size: 12px; color: var(--c-text-soft); white-space: nowrap; }
.tarif-feld__hilfe { display: block; font-size: 11px; color: var(--c-text-soft); margin-top: 3px; }
.tarif-mehr { margin-top: 14px; }
.tarif-mehr__kopf { display: inline-flex; align-items: center; gap: 6px; cursor: pointer; list-style: none; font-size: 12.5px; font-weight: var(--fw-semibold); color: var(--c-primary); }
.tarif-mehr__kopf::-webkit-details-marker { display: none; }
.tarif-mehr__sub { font-weight: var(--fw-regular); color: var(--c-text-soft); }
.tarif-mehr__pfeil { display: inline-block; transition: transform var(--t-fast); }
.tarif-mehr[open] > .tarif-mehr__kopf .tarif-mehr__pfeil { transform: rotate(90deg); }

/* Andere Sparten: eingeklappt, Knopf im Kopf */
.tarif-andere__kopf { display: flex; align-items: center; gap: 10px; padding: 10px 20px; cursor: pointer; list-style: none; border-bottom: 1px solid var(--mms-trenner); }
.tarif-andere__kopf::-webkit-details-marker { display: none; }
.tarif-andere__knopf { background: var(--c-surface); border: 1px solid var(--mms-bd); border-radius: var(--mms-knopf-radius); padding: 5px 11px; font-size: 12px; font-weight: var(--fw-semibold); color: var(--c-text-muted); white-space: nowrap; }
.tarif-andere[open] > .tarif-andere__kopf .tarif-andere__knopf { background: var(--kk-violet-100); border-color: var(--kk-violet-300); color: var(--kk-violet-800); }

/* Balken (Staffeln + Alterspreise) */
.tarif-balken__zeile { display: flex; align-items: center; gap: 10px; padding: 6px 0; border-bottom: 1px solid var(--mms-trenner-zart); font-size: 12.5px; }
.tarif-balken__label { width: 64px; color: var(--c-text-muted); white-space: nowrap; }
.tarif-balken__spur { flex: 1; display: block; height: 6px; border-radius: 3px; background: var(--kk-violet-trenner); overflow: hidden; }
.tarif-balken__fuell { display: block; height: 100%; background: var(--kk-violet-500); }
.tarif-balken__fuell--offen { background: var(--mms-ok); }
.tarif-balken__wert { width: 72px; text-align: right; font-weight: var(--fw-bold); white-space: nowrap; }

/* Alterspreise: Lese-Zeile + Edit-Formular */
.tarif-preis { display: grid; grid-template-columns: 120px minmax(0, 1fr) 110px 110px; gap: 0 12px; align-items: center; padding: 7px 20px; border-bottom: 1px solid var(--mms-trenner-zart); }
.tarif-preis__alter { font-size: 13px; font-weight: var(--fw-semibold); }
.tarif-preis__monat { font-size: 13.5px; font-weight: var(--fw-bold); }
.tarif-preis__jahr { font-size: 12.5px; color: var(--c-text-muted); }
.tarif-preis--edit, .tarif-preis--neu { grid-template-columns: 120px minmax(0, 1fr) 110px 110px 36px; background: var(--c-surface); }
.tarif-preis--neu { background: var(--mms-gruppe-bg); }
.tarif-preis__von-bis { display: flex; align-items: center; gap: 4px; }
.tarif-preis__strich { color: var(--c-text-soft); }
.tarif-input--alter.input { width: 46px; height: 30px; padding: 0 4px; text-align: center; font-size: 12.5px; border-radius: 6px; }
.tarif-input--preis.input { width: 100%; min-width: 0; height: 30px; padding: 0 8px; text-align: right; font-size: 12.5px; border-radius: 6px; }
.tarif-preis__loeschen { display: inline-flex; align-items: center; justify-content: center; width: 26px; height: 26px; color: var(--c-text-soft); cursor: pointer; }
.tarif-preis__loeschen input { position: absolute; opacity: 0; width: 1px; height: 1px; }
.tarif-preis__loeschen:has(input:checked) { color: var(--mms-err); font-weight: var(--fw-bold); }
.tarif-preise-edit__kopf { display: flex; align-items: center; gap: 10px; padding: 12px 20px; cursor: pointer; list-style: none; border-top: 1px solid var(--mms-trenner); }
.tarif-preise-edit__kopf::-webkit-details-marker { display: none; }
.tarif-preise-edit[open] > .tarif-preise-edit__kopf .btn { background: var(--kk-violet-100); border-color: var(--kk-violet-300); color: var(--kk-violet-800); }
.tarif-preise-edit__fuss { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; padding: 12px 20px; border-top: 1px solid var(--mms-trenner); }

/* Vorstellung & Dokumente */
.tarif-dl { display: grid; grid-template-columns: 130px minmax(0, 1fr); gap: 0 14px; padding: 10px 0; border-bottom: 1px solid var(--mms-trenner-zart); font-size: 13px; }
.tarif-dl__label { color: var(--c-text-muted); }
.tarif-dl__wert { min-width: 0; overflow-wrap: anywhere; }
.tarif-dl__wert--umbruch { white-space: pre-line; }
.tarif-dl__quelle { display: block; font-size: 11.5px; color: var(--c-text-soft); margin-top: 2px; }
/* Klapp-Zeile (Owner 11.09.): Label + Wert lesen, M&M-Herkunft erst auf Klick darunter */
.tarif-dl--klapp > .tarif-dl__lesen { display: grid; grid-column: 1 / -1; grid-template-columns: 130px minmax(0, 1fr); gap: 0 14px; cursor: pointer; list-style: none; }
.tarif-dl--klapp > .tarif-dl__lesen::-webkit-details-marker { display: none; }
.tarif-dl--klapp > .tarif-dl__lesen:hover .tarif-dl__label { color: var(--c-primary); }
.tarif-dl--klapp > .tarif-dl__lesen .tarif-dl__wert::after { content: " ▸"; font-size: 10px; color: var(--c-text-soft); display: inline-block; transition: transform var(--t-fast); }
.tarif-dl--klapp[open] > .tarif-dl__lesen .tarif-dl__wert::after { transform: rotate(90deg); }
/* Chrome/Firefox: ::details-content ist das Grid-Item, nicht .tarif-dl__herkunft — ohne Spalte 130 px schmal in Spalte 1 (Owner 11.09., Verursacher PR 810; Lehre PR 801) */
.tarif-dl--klapp::details-content { grid-column: 1 / -1; min-width: 0; }
.tarif-dl__herkunft { grid-column: 1 / -1; display: flex; flex-wrap: wrap; align-items: baseline; gap: 6px 10px; padding-top: 6px; min-width: 0; }
.tarif-dl__herkunft .tarif-dl__quelle { flex: 1 1 260px; }
.tarif-dl__herkunft .tarif-dl__quelle { margin-top: 0; }
.tarif-edit__quelle .badge { margin-right: 6px; vertical-align: middle; }
.tarif-dok { display: flex; align-items: center; gap: 10px; padding: 10px 20px; border-bottom: 1px solid var(--mms-trenner-zart); font-size: 13px; }
.tarif-dok__text { flex: 1; min-width: 0; }
.tarif-dok__quelle { display: block; font-size: 11.5px; color: var(--c-text-soft); }
.tarif-dok-neu__kopf { display: flex; align-items: center; justify-content: center; padding: 12px 20px; cursor: pointer; list-style: none; }
.tarif-dok-neu__kopf::-webkit-details-marker { display: none; }

@media (max-width: 720px) {
  .tarif-tabelle__kopfzeile { display: none; }
  .tarif-zeile__lesen, .tarif-preis { grid-template-columns: 1fr 1fr; }
  .tarif-chips { grid-column: 1 / -1; }
  .tarif-rechts { text-align: left; }
}

/* ==========================================================================
   M&M-Abgleich-Seite (mmfg-*) — Design-Handoff „MM Freigabe Admin" (Owner 10.09.).
   Vier Zaehler-Kacheln als Filter, kompakte Ist→Vorschlag-Liste mit Wortlaut-
   Aufklapper, feste Navy-Aktionsleiste. Nutzt tarif-/mms-Bausteine (Logo, Karte,
   Knoepfe). Die data-*-Marker sind Vertrag mit den Waechtern.
   ========================================================================== */
.mmfg { max-width: var(--mms-breite); margin: 0 auto; padding-bottom: 100px; font-variant-numeric: tabular-nums; }
.mmfg a { color: var(--c-primary); text-decoration: none; }
.mmfg a:hover { text-decoration: underline; }
.mmfg-kopf { display: flex; align-items: center; gap: 16px; flex-wrap: wrap; }
.mmfg-kopf__text { flex: 1; min-width: 280px; }
.mmfg-overline { font-size: 11.5px; font-weight: var(--fw-bold); letter-spacing: .06em; text-transform: uppercase; color: var(--c-primary); }
.mmfg-kopf__titel { margin: 2px 0 0; font-size: 26px; font-weight: var(--fw-bold); letter-spacing: -.01em; line-height: 1.15; }
.mmfg-kopf__meta { display: flex; align-items: center; gap: 8px; margin-top: 6px; font-size: 13px; color: var(--c-text-muted); flex-wrap: wrap; }
.mmfg-chip { font-size: 11.5px; font-weight: var(--fw-semibold); background: var(--kk-violet-100); color: var(--kk-violet-800); border-radius: 5px; padding: 2px 7px; white-space: nowrap; }
.mmfg-hinweis { margin-top: 22px; }

/* Kacheln */
.mmfg-kacheln { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); background: var(--c-surface); border: 1px solid var(--mms-bd); border-radius: var(--mms-radius); margin-top: 22px; overflow: hidden; box-shadow: var(--mmfg-karte-schatten); }
.mmfg-kachel { display: flex; flex-direction: column; align-items: flex-start; text-align: left; background: var(--c-surface); border: 0; border-right: 1px solid var(--mms-trenner); padding: 16px 20px; font-family: inherit; color: var(--c-text); cursor: pointer; box-shadow: inset 0 -3px 0 transparent; transition: background var(--t-fast); }
.mmfg-kachel:last-child { border-right: 0; }
.mmfg-kachel__label { font-size: 11px; font-weight: var(--fw-bold); letter-spacing: .06em; text-transform: uppercase; }
.mmfg-kachel__zahl { font-size: 26px; font-weight: var(--fw-bold); margin-top: 6px; line-height: 1; }
.mmfg-kachel__sub { font-size: 12px; color: var(--c-text-muted); margin-top: 4px; }
.mmfg-kachel--abw .mmfg-kachel__label { color: var(--mms-warn); }
.mmfg-kachel--neu .mmfg-kachel__label { color: var(--c-primary); }
.mmfg-kachel--ok .mmfg-kachel__label { color: var(--mms-ok); }
.mmfg-kachel--beleg .mmfg-kachel__label { color: var(--c-text-soft); }
.mmfg-kachel--abw[aria-pressed="true"] { background: var(--mmfg-abw-bg); box-shadow: inset 0 -3px 0 var(--mms-warn); }
.mmfg-kachel--neu[aria-pressed="true"] { background: var(--mmfg-neu-bg); box-shadow: inset 0 -3px 0 var(--mms-run); }
.mmfg-kachel--ok[aria-pressed="true"] { background: var(--mmfg-ok-bg); box-shadow: inset 0 -3px 0 var(--mms-ok); }
.mmfg-kachel--beleg[aria-pressed="true"] { background: var(--mmfg-beleg-bg); box-shadow: inset 0 -3px 0 var(--c-text-soft); }

/* Liste */
.mmfg-liste { margin-top: 16px; box-shadow: var(--mmfg-karte-schatten); }
.mmfg-liste__kopf { display: flex; align-items: center; gap: 10px; padding: 12px 20px; border-bottom: 1px solid var(--mms-trenner); flex-wrap: wrap; }
.mmfg-liste__gruppe { display: inline-flex; align-items: baseline; gap: 10px; flex-wrap: wrap; }
.mmfg-liste__titel { font-size: 13px; font-weight: var(--fw-bold); white-space: nowrap; }
.mmfg-textknopf { background: none; border: 0; padding: 0; font-family: inherit; font-size: 12px; font-weight: var(--fw-semibold); color: var(--c-primary); cursor: pointer; white-space: nowrap; }
.mmfg-kopfzeile, .mmfg-zeile__raster { display: grid; grid-template-columns: 32px minmax(180px, 1.4fr) minmax(0, 1fr) 20px minmax(0, 1fr) 28px; gap: 0 10px; align-items: center; }
.mmfg-kopfzeile { padding: 8px 20px; font-size: 10.5px; font-weight: var(--fw-bold); letter-spacing: .06em; text-transform: uppercase; color: var(--c-text-soft); border-bottom: 1px solid var(--mms-trenner); background: var(--mms-gruppe-bg); }
.mmfg-kopfzeile--mm { color: var(--c-primary); }
.mmfg-zeile { padding: 11px 20px; border-bottom: 1px solid var(--mms-trenner-zart); transition: background var(--t-fast); }
.mmfg-zeile:has(.mmfg-haken:checked) { background: var(--mmfg-neu-bg); box-shadow: inset 3px 0 0 var(--kk-violet-500); }
.js .mmfg-zeile[hidden], .js .mmfg-leer[hidden], .js .mmfg-belege[hidden], .js .mmfg-liste__gruppe[hidden], .js .mmfg-textknopf[hidden] { display: none; }
.mmfg-zeile__wahl { display: flex; align-items: center; justify-content: center; }
.mmfg-haken { width: 16px; height: 16px; accent-color: var(--mms-run); cursor: pointer; margin: 0; }
.mmfg-punkt { width: 8px; height: 8px; border-radius: 50%; background: var(--mms-none); }
.mmfg-punkt--ok { background: var(--mms-ok); }
.mmfg-zeile__name { min-width: 0; }
.mmfg-zeile__titel { display: flex; align-items: center; gap: 6px; min-width: 0; flex-wrap: wrap; font-size: 13px; font-weight: var(--fw-semibold); line-height: 1.35; }
.mmfg-zeile__sub { font-size: 11px; color: var(--c-text-soft); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.mmfg-tag { flex: none; font-size: 10px; font-weight: var(--fw-bold); border-radius: 4px; padding: 2px 6px; white-space: nowrap; }
.mmfg-tag--abw { background: var(--mms-warn-bg); color: var(--mms-warn); }
.mmfg-tag--neu { background: var(--kk-violet-100); color: var(--kk-violet-800); }
.mmfg-tag--ok { background: var(--mms-ok-bg); color: var(--mms-ok); }
.mmfg-tag--beleg { background: var(--kk-violet-trenner); color: var(--c-text-soft); }
.mmfg-tag--err { background: var(--mms-err-bg); color: var(--mms-err); }
.mmfg-wert { min-width: 0; }
.mmfg-wert__zahl { display: block; font-size: 13px; font-weight: var(--fw-semibold); line-height: 1.35; overflow-wrap: anywhere; }
.mmfg-wert__zahl--leer { color: var(--c-text-soft); font-weight: var(--fw-medium); }
.mmfg-wert__zahl--mm { color: var(--c-primary); }
.mmfg-wert__sub { display: block; font-size: 11px; color: var(--c-text-soft); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.mmfg-pfeil { text-align: center; font-size: 14px; color: var(--mms-bd); }
.mmfg-pfeil--aktiv { color: var(--kk-violet-500); }
.mmfg-wortlaut { display: contents; }
/* Chrome/Firefox packen den details-Inhalt in eine eigene Box (::details-content) — DIE ist das Grid-Item, nicht die Karte; ohne Spalte landet sie 32 px schmal in Spalte 1 (Owner 10.09., Verursacher PR 800) */
.mmfg-wortlaut::details-content { grid-column: 2 / -1; min-width: 0; }
.mmfg-wortlaut__knopf { width: 26px; height: 26px; display: inline-flex; align-items: center; justify-content: center; border: 1px solid var(--mms-bd); border-radius: 6px; font-size: 11px; color: var(--c-text-soft); cursor: pointer; list-style: none; }
.mmfg-wortlaut__knopf::-webkit-details-marker { display: none; }
.mmfg-wortlaut[open] > .mmfg-wortlaut__knopf { background: var(--kk-violet-100); color: var(--kk-violet-800); border-color: var(--kk-violet-300); }
.mmfg-wortlaut__karte { grid-column: 2 / -1; margin-top: 10px; padding: 12px 16px; background: var(--c-surface); border: 1px solid var(--mms-bd); border-radius: 10px; font-size: 12.5px; line-height: 1.5; color: var(--c-text); box-shadow: var(--mmfg-karte-schatten); }
.mmfg-wortlaut__text { color: var(--c-text-muted); }
.mmfg-wortlaut__meta { font-size: 11px; color: var(--c-text-soft); margin-top: 6px; }
.mmfg-hinweis { margin-top: 6px; font-size: 12px; color: var(--mms-err); font-weight: var(--fw-semibold); }
.mmfg-hinweis--leise { color: var(--c-text-soft); font-weight: var(--fw-regular); }
.mmfg-diff { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 8px 16px; margin-top: 10px; padding-top: 10px; border-top: 1px solid var(--mms-trenner); }
.mmfg-diff__label { display: block; font-size: 10.5px; font-weight: var(--fw-bold); letter-spacing: .04em; text-transform: uppercase; color: var(--c-text-soft); }
.mmfg-diff__wert { display: block; font-size: 12.5px; margin-top: 2px; overflow-wrap: anywhere; }
.mmfg-diff__wert--abw { font-weight: var(--fw-bold); color: var(--mms-warn); }
.mmfg-warnung { display: inline-flex; align-items: center; gap: 8px; margin: 8px 0 0 42px; padding: 5px 10px; background: var(--mms-err-bg); border-radius: 7px; font-size: 12px; color: var(--mms-err); }
.mmfg-warnung__punkt { width: 14px; height: 14px; flex: none; display: inline-flex; align-items: center; justify-content: center; border-radius: 50%; background: var(--mms-err); color: var(--c-text-on-accent); font-size: 9px; font-weight: var(--fw-bold); }
.mmfg-belege { padding: 8px 20px 5px; font-size: 10.5px; font-weight: var(--fw-bold); letter-spacing: .06em; text-transform: uppercase; color: var(--c-text-soft); background: var(--mms-gruppe-bg); border-bottom: 1px solid var(--mms-trenner); }
.mmfg-leer { padding: 24px 20px; text-align: center; font-size: 13px; color: var(--c-text-soft); }

/* Feste Aktionsleiste (Navy) */
.mmfg-leiste { position: fixed; left: 0; right: 0; bottom: 0; display: flex; justify-content: center; pointer-events: none; padding: 0 36px 20px; z-index: 40; }
.mmfg-leiste__innen { pointer-events: auto; display: flex; align-items: center; gap: 14px; background: var(--mmfg-leiste-bg); color: var(--c-text-on-accent); border-radius: 14px; padding: 12px 14px 12px 20px; box-shadow: var(--mmfg-leiste-schatten); max-width: var(--mms-breite); width: 100%; }
.mmfg-leiste__zahl { font-size: 13px; white-space: nowrap; }
.mmfg-leiste__hint { font-size: 12px; color: var(--mmfg-leiste-text-soft); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; min-width: 0; }
.mmfg-leiste__knopf { border: 0; border-radius: 9px; padding: 9px 18px; font-family: inherit; font-size: 13px; font-weight: var(--fw-bold); white-space: nowrap; cursor: pointer; }
.mmfg-leiste__knopf--outline { background: transparent; border: 1px solid var(--mmfg-leiste-rand); color: var(--c-text-on-accent); font-weight: var(--fw-semibold); font-size: 12.5px; padding: 8px 14px; }
.mmfg-leiste__knopf--primaer { background: var(--kk-violet-500); color: var(--c-text-on-accent); }
.mmfg-leiste__knopf--primaer:disabled { background: var(--mmfg-leiste-aus-bg); color: var(--mmfg-leiste-aus-fg); cursor: not-allowed; }

@media (max-width: 900px) {
  .mmfg-kopfzeile { display: none; }
  .mmfg-zeile__raster { grid-template-columns: 32px minmax(0, 1fr) 28px; }
  .mmfg-wert, .mmfg-pfeil { grid-column: 2; }
  .mmfg-pfeil { text-align: left; }
  .mmfg-leiste { padding: 0 12px 12px; }
  .mmfg-leiste__hint { display: none; }
}


/* ==========================================================================
   Tarif bearbeiten (tarifedit-*) — Design-Handoff „Tarif Bearbeiten Admin" (Owner 10.09.).
   Sechs Karten, Merkmale nur der gewaehlten Sparte, sticky Sprungnavigation, feste
   Speichern-Leiste. Liest tarif-/mms-/Marken-Tokens; der Kopf nutzt die tarif-kopf-Klassen.
   Feld-Anatomie: label = Spalte mit Mindesthoehe, damit alle Inputs einer Zeile buendig sind.
   ========================================================================== */
.tarifedit { padding-bottom: 96px; }
.tarifedit-overline { font-size: 11.5px; font-weight: var(--fw-bold); letter-spacing: .06em; text-transform: uppercase; color: var(--c-primary); }
.tarifedit-raster { display: grid; grid-template-columns: minmax(0, 1fr) var(--tarifedit-nav-breite); gap: 20px; margin-top: 22px; align-items: start; }
.tarifedit-spalte { display: flex; flex-direction: column; gap: 16px; min-width: 0; }

/* Karten */
.tarifedit-karte { background: var(--c-surface); border: 1px solid var(--mms-bd); border-radius: var(--mms-radius); overflow: hidden; box-shadow: var(--mmfg-karte-schatten); scroll-margin-top: 20px; }
.tarifedit-karte__kopf { display: flex; align-items: center; gap: 10px; padding: 14px 20px; border-bottom: 1px solid var(--mms-trenner); flex-wrap: wrap; }
.tarifedit-karte__titel { font-size: 15px; font-weight: var(--fw-bold); }
.tarifedit-karte__sub { font-size: 12px; color: var(--c-text-soft); }
.tarifedit-karte__spacer { flex: 1; }
.tarifedit-aktiv { display: inline-flex; align-items: center; gap: 8px; font-size: 13px; cursor: pointer; }
.tarifedit-aktiv input { width: 16px; height: 16px; margin: 0; accent-color: var(--c-primary); }
.tarifedit-felder { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 14px 16px; padding: 18px 20px; }
.tarifedit-leer { padding: 18px 20px; font-size: 13px; color: var(--c-text-soft); }

/* Feld-Anatomie */
.tarifedit-feld { display: flex; flex-direction: column; min-width: 0; min-height: var(--tarifedit-feld-min-h); }
.tarifedit-feld--voll { grid-column: 1 / -1; }
.tarifedit-feld__label { display: block; font-size: 12px; font-weight: var(--fw-semibold); line-height: 18px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; color: var(--c-text); }
.tarifedit .tarifedit-input { width: 100%; min-width: 0; height: var(--tarifedit-feld-h); margin-top: 5px; padding: 0 11px; border: 1px solid var(--mms-bd); border-radius: var(--mms-knopf-radius); font-size: 13.5px; background: var(--c-surface); box-sizing: border-box; }
.tarifedit .tarifedit-input:focus { border-color: var(--kk-violet-500); box-shadow: 0 0 0 2px var(--kk-violet-300); }
.tarifedit .tarifedit-input--zahl { text-align: right; font-variant-numeric: tabular-nums; }
.tarifedit .tarifedit-textarea { margin-top: 5px; border: 1px solid var(--mms-bd); border-radius: var(--mms-knopf-radius); font-size: 13.5px; }
.tarifedit-feld__einheit { display: flex; align-items: center; gap: 6px; }
.tarifedit-feld__einheit .tarifedit-input { flex: 1; }
.tarifedit-feld__suffix { margin-top: 5px; font-size: 12px; color: var(--c-text-soft); white-space: nowrap; }
.tarifedit-feld__hilfe { display: block; margin-top: 4px; font-size: 11px; line-height: 14px; color: var(--c-text-soft); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.tarifedit-feld__fehler { display: block; margin-top: 4px; font-size: 11px; line-height: 14px; color: var(--mms-err); font-weight: var(--fw-semibold); }
.tarifedit-feld--fehler .tarifedit-input { border-color: var(--mms-err); background: var(--mms-err-bg); }
.tarifedit-pflicht { display: inline-block; margin-left: 4px; padding: 0 5px; border-radius: 4px; font-size: 10px; font-weight: var(--fw-bold); letter-spacing: .04em; text-transform: uppercase; background: var(--mms-err-bg); color: var(--mms-err); vertical-align: 1px; }

/* Status + Badges im Kartenkopf */
.tarifedit-status { display: inline-flex; align-items: center; gap: 6px; font-size: 12px; font-weight: var(--fw-semibold); color: var(--c-text-soft); white-space: nowrap; }
.tarifedit-status__punkt { width: 7px; height: 7px; border-radius: 50%; background: var(--mms-none); }
.tarifedit-status--ok { color: var(--mms-ok); }
.tarifedit-status--ok .tarifedit-status__punkt { background: var(--mms-ok); }
.tarifedit-badge { font-size: 11.5px; font-weight: var(--fw-semibold); border-radius: var(--r-full); padding: 2px 9px; white-space: nowrap; background: var(--kk-violet-trenner); color: var(--c-text-soft); }
.tarifedit-badge--ok { background: var(--mms-ok-bg); color: var(--mms-ok); }
.tarifedit-badge--fehlt { background: var(--mms-err-bg); color: var(--mms-err); }

/* Leistungsliste (JS baut sie aus dem Textarea; ohne JS bleibt das Textarea) */
.tarifedit-liste { display: flex; flex-direction: column; padding: 8px 12px; }
.tarifedit-liste__zeile { display: flex; align-items: center; gap: 6px; padding: 2px 0; border-bottom: 1px solid var(--mms-trenner-zart); }
.tarifedit-liste__zeile:last-child { border-bottom: 0; }
.tarifedit-liste__zeile.is-drag { opacity: .45; }
.tarifedit-liste__griff { flex: none; width: 22px; text-align: center; color: var(--tarifedit-liste-griff); cursor: grab; user-select: none; letter-spacing: -2px; }
.tarifedit .tarifedit-liste__input { flex: 1; min-width: 0; height: 34px; padding: 0 8px; border: 1px solid transparent; border-radius: 6px; font: inherit; font-size: 13.5px; background: transparent; }
.tarifedit .tarifedit-liste__input:focus { border-color: var(--mms-bd); background: var(--c-surface); outline: none; box-shadow: 0 0 0 2px var(--kk-violet-300); }
.tarifedit-liste__weg { flex: none; width: 26px; height: 26px; display: inline-flex; align-items: center; justify-content: center; border: 0; border-radius: 6px; background: transparent; color: var(--c-text-soft); font: inherit; cursor: pointer; }
.tarifedit-liste__weg:hover { background: var(--mms-err-bg); color: var(--mms-err); }
.tarifedit-liste__leer { padding: 12px 8px; font-size: 12.5px; color: var(--c-text-soft); }

/* Rechte Spalte: Sprungnavigation + Regeln */
.tarifedit-seite { position: sticky; top: 20px; display: flex; flex-direction: column; gap: 14px; }
.tarifedit-nav { display: flex; flex-direction: column; background: var(--c-surface); border: 1px solid var(--mms-bd); border-radius: var(--mms-radius); padding: 8px; box-shadow: var(--mmfg-karte-schatten); }
.tarifedit-nav__link { display: flex; align-items: center; gap: 8px; padding: 8px 10px; border-radius: 8px; font-size: 13px; font-weight: var(--fw-semibold); color: var(--c-text); }
.tarifedit-nav__link:hover { background: var(--kk-violet-50); text-decoration: none; color: var(--c-primary); }
.tarifedit-nav__link.is-aktiv { background: var(--kk-violet-50); color: var(--c-primary); }
.tarifedit-nav__punkt { margin-left: auto; width: 7px; height: 7px; border-radius: 50%; background: var(--mms-none); }
.tarifedit-nav__punkt.is-ok { background: var(--mms-ok); }
.tarifedit-nav__punkt.is-fehler { background: var(--mms-err); }
.tarifedit-regeln { background: var(--mms-gruppe-bg); border: 1px solid var(--mms-bd); border-radius: var(--mms-radius); padding: 14px 16px; }
.tarifedit-regeln__titel { font-size: 10.5px; font-weight: var(--fw-bold); letter-spacing: .06em; text-transform: uppercase; color: var(--c-text-soft); }
.tarifedit-regeln__text { margin: 8px 0 0; font-size: 12.5px; line-height: 1.5; color: var(--c-text-muted); }

/* Feste Aktionsleiste */
.tarifedit-leiste { position: fixed; left: 0; right: 0; bottom: 0; z-index: 40; background: var(--c-surface); border-top: 1px solid var(--mms-bd); box-shadow: var(--tarifedit-leiste-schatten); }
.tarifedit-leiste__innen { max-width: var(--mms-breite); margin: 0 auto; display: flex; align-items: center; gap: 12px; padding: 12px 36px; }
.tarifedit-leiste__text { font-size: 12.5px; color: var(--c-text-soft); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; min-width: 0; }
.tarifedit-leiste__text--fehler { color: var(--mms-err); font-weight: var(--fw-bold); }

@media (max-width: 900px) {
  .tarifedit-raster { grid-template-columns: minmax(0, 1fr); }
  .tarifedit-seite { position: static; }
  .tarifedit-nav { display: none; }
  .tarifedit-leiste__innen { padding: 10px 16px; }
  .tarifedit-leiste__text { display: none; }
}
/* ⚠ 15.09.: Diese schließende Klammer ging beim develop-Merge (c856486e) verloren —
   alles Folgende galt dadurch nur unter 900 px, am Desktop standen Mobil-Kopfleiste
   und Seitenmenü ungestylt oben. Wächter: tests/test_1509_darstellung_repariert.py. */

/* ══ MOBIL: Seitenmenü, Kopfleiste, einspaltiges Board (Owner 2026-09-09) ═════
   Ausgangslage (gemessen bei 393 px): Die Seite war 992 px breit, also 599 px
   seitlicher Überstand — Rail (300 px fest) und Detailfläche standen
   nebeneinander. Der Kopf war 231 px hoch, bevor der erste Inhalt kam.

   Lösung: Die Rail wandert unter 860 px in ein Seitenmenü, das über einen
   Burger einfährt; darüber liegt eine 52-px-Kopfleiste mit Logo und Kundenname.
   Der mittlere Bereich (Thema, Bühne, Karten) bekommt damit den ganzen Schirm.

   ⚠ Der Schalter ist eine CHECKBOX, kein JS: So geht das Menü auch ohne
   JavaScript wieder ZU. Der bisherige Topbar-Griff ließ sich nur öffnen
   (Owner-Befund 09.09.) — dieser Fehler soll sich nicht wiederholen.

   Am Desktop ändert sich nichts: Burger, Kopfleiste und Menü stehen
   ausschließlich in der Media-Query. */
.k2-mobilkopf, .k2-burger, .k2-menue, .k2-menue__schliesser { display: none; }

@media (max-width: 860px) {
  /* Kein seitliches Verschieben — die Seite ist auf die Schirmbreite genagelt.
     `clip` statt `hidden` (10.09., Revier Seitenleiste): `overflow-x: hidden`
     macht html/body zum Scroll-Container und hebelt JEDES position: sticky
     darunter aus — die Kopfleiste und die Spaltenköpfe klebten nicht mehr. */
  html, body { max-width: 100%; overflow-x: clip; }
  .k2-seite { padding: 0 0 24px; gap: 10px; max-width: 100%; }

  /* Kopfleiste: Burger, Marke und Kunde in EINER Zeile (Owner-Vorgabe). */
  .k2-mobilkopf { position: sticky; top: 0; z-index: 40; display: flex; align-items: center; gap: 10px; height: var(--k2-mobilkopf-h); padding: 0 12px; background: var(--c-surface); border-bottom: 1px solid var(--k2-trenner); }
  .k2-mobilkopf__marke { height: 22px; width: auto; flex: none; }
  .k2-mobilkopf__kunde { font-size: 11px; font-weight: var(--fw-bold); color: var(--c-text-muted); text-transform: uppercase; letter-spacing: .02em; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }

  .k2-burger { display: flex; flex-direction: column; justify-content: center; gap: 4px; flex: none; width: 34px; height: 34px; padding: 7px; border-radius: var(--r-sm); cursor: pointer; }
  .k2-burger:active { background: var(--k2-flaeche-aktiv); }
  .k2-burger__strich { display: block; height: 2px; border-radius: 2px; background: var(--k2-akzent); }

  /* Das Menü liegt links außerhalb und fährt ein. */
  .k2-menue { display: flex; flex-direction: column; position: fixed; z-index: 60; top: 0; bottom: 0; left: 0; width: var(--k2-menue-breite); background: var(--c-surface); box-shadow: var(--sh-lg); transform: translateX(-100%); transition: transform var(--dur-base) var(--ease-out); will-change: transform; }
  .k2-menue__schalter:checked ~ .k2-menue { transform: none; }
  /* Zieh-Geste (menue_mobil.js): Seiten mit dem Menü geben die waagerechte
     Verlaufs-Geste des Browsers ab — sonst zieht Chrome die vorige Seite
     herein, während wir das Menü herausziehen. */
  body:has(.k2-menue) { overscroll-behavior-x: none; }
  /* Dunkle Fläche daneben: ein Tipp daneben schließt ebenfalls. */
  .k2-menue__schliesser { display: block; position: fixed; z-index: 50; inset: 0; background: var(--modal-backdrop); opacity: 0; pointer-events: none; transition: opacity var(--dur-base); will-change: opacity; }
  .k2-menue__schalter:checked ~ .k2-menue__schliesser { opacity: 1; pointer-events: auto; }

  .k2-menue__kopf { display: flex; align-items: center; justify-content: space-between; padding: 14px 16px; border-bottom: 1px solid var(--k2-trenner); }
  .k2-menue__titel { font-size: 11px; font-weight: var(--fw-bold); color: var(--c-text-soft); text-transform: uppercase; letter-spacing: .06em; }
  .k2-menue__zu { width: 32px; height: 32px; display: inline-flex; align-items: center; justify-content: center; border-radius: var(--r-full); background: var(--k2-chip-bg); color: var(--c-text-muted); cursor: pointer; }
  .k2-menue__liste { flex: 1; overflow-y: auto; padding: 6px 0; }
  /* Eine Zeile = Bild | Name | heutiger Betrag (Owner-Vorlage 09.09.: „links
     das Logo, in der Mitte Krankenkasse, rechts der Preis"). Drei feste
     Spalten, damit die Beträge über alle Zeilen bündig stehen. */
  .k2-menue__eintrag { display: grid; grid-template-columns: var(--k2-menue-bild) 1fr auto; align-items: center; gap: 12px; padding: 10px 16px; text-decoration: none; color: var(--c-text); }
  .k2-menue__eintrag--aktiv { background: var(--k2-flaeche-aktiv); box-shadow: inset 3px 0 0 var(--k2-aktion); }
  .k2-menue__bild { width: var(--k2-menue-bild); height: var(--k2-menue-bild); display: flex; align-items: center; justify-content: center; overflow: hidden; border-radius: var(--r-sm); background: var(--c-surface); border: 1px solid var(--k2-trenner); }
  .k2-menue__logo { max-width: 100%; max-height: 100%; padding: 4px; object-fit: contain; }
  .k2-menue__foto { width: 100%; height: 100%; object-fit: cover; }
  .k2-menue__icon { width: 26px; height: 26px; object-fit: contain; }
  .k2-menue__name { font-size: 14px; font-weight: var(--fw-semibold); }
  .k2-menue__wert { font-size: 14px; color: var(--c-text-muted); }
  /* Fuß: die Summe der heutigen Ausgaben — hell und ruhig (Owner: „in schön
     und in hell, nicht in so dunkel-lila"). Keine Berater-Aktionen mehr:
     das Menü ist Kundenansicht. */
  /* Owner 09.09. (2. Runde): „fällt nicht genug auf" — der Fuß ist jetzt
     etwa doppelt so hoch, Label oben, Betrag groß und fett darunter. */
  /* 3. Runde: beides in EINER Zeile, Label schwarz, Zahl grau, gleich groß;
     die Linie oben lila und 20 % dicker als die übrigen Trenner (1 px → 1.2 px). */
  .k2-menue__fuss { flex: none; display: flex; flex-direction: column; justify-content: center; gap: 6px; min-height: var(--k2-menue-fuss-h); padding: 18px 16px 22px; border-top: 1.2px solid var(--k2-menue-fuss-linie); background: var(--k2-rail-bg); }
  .k2-menue__fuss-zeile { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; }
  /* Erklärzeile unter der Summe (Owner 09.09.): Stil der Zeilen-Beträge, aufrecht (kursiv probiert und verworfen). */
  .k2-menue__fuss-hinweis { margin: 0; font-size: 14px; color: var(--c-text-muted); }
  .k2-menue__fuss-label { font-size: var(--k2-menue-fuss-fs); line-height: 1.2; font-weight: var(--fw-semibold); color: var(--c-text); }
  .k2-menue__fuss-wert { font-size: var(--k2-menue-fuss-wert-fs); line-height: 1.2; font-weight: var(--fw-semibold); color: var(--c-text-muted); }

  /* Die Berater-Topbar steckt jetzt im Menü — oben wäre sie doppelt. */
  .topbar-huelle { display: none; }

  /* Board einspaltig: die Rail lebt im Menü weiter. */
  .k2-board { grid-template-columns: 1fr; border-radius: 0; border-left: 0; border-right: 0; }
  .k2-rail { display: none; }
  .k2-detail { min-height: 0; }

  /* Der Seiten-Kopf ist auf dem Handy nur noch Titel + Stepper. Marke und
     Kundenname stehen in der Kopfleiste, das Siegel entfällt (Platz). */
  .k2-kopf { flex-direction: column; align-items: flex-start; gap: 6px; padding: 4px 16px 0; }
  .k2-kopf__kicker, .k2-marke, .bekannt-aus--k2 { display: none; }
  .k2-kopf__titel { font-size: 22px; }

  /* Die 30-px-Einzüge der Desktop-Flächen sind auf 393 px zu viel. */
  .k2-detail__kopf, .k2-szc, .vb, .k2-reform, .k2-band, .k2-gkvinfo,
  .k2-strahl-zone, .k2-posten, .k2-tk, .k2-fuss { margin-left: 12px; margin-right: 12px; }

  /* Szenario-Karte: Bild über den Text statt daneben — nebeneinander bleiben
     auf 393 px für beides zu wenig Platz. */
  .k2-sz__karte--fest .k2-sz__kopf { flex-direction: column; align-items: flex-start; gap: 12px; }
  .k2-sz__karte--fest .k2-sz__foto { width: 100%; height: 150px; }
  .k2-sz__rechts { align-self: flex-start; }
}


/* ══ Ereignis-Liste Zahn (Owner-Layout aus Canva, 2026-09-09) ════════════════
   Vier Spalten — Bild · Ereignis · Kostenübernahme · Eigenanteil — und sechs
   Zeilen. Owner: „Es soll keine Tabelle sein vom Aussehen her, aber so, dass
   der Kunde sofort versteht, was wo steht."

   Deshalb: EIN Grid für Kopf und Zeilen (gleiche Spuren aus Tokens, sonst
   rutscht die Beschriftung gegen die Werte), aber jede Zeile ist eine eigene
   Karte mit Rand und Abstand — kein Tabellengitter, keine Zebrastreifen.

   Die Kopfzeile ist `position: sticky`: Beim Scrollen bleibt die Orientierung
   „was steht in welcher Spalte" stehen (ausdrückliche Owner-Vorgabe).
   Sie klebt unter der mobilen Kopfleiste (--k2-mobilkopf-h), damit sie nicht
   darunter verschwindet.

   Farbe: Vorsorge grün, Risiko grau — bewusst sparsam (Owner: „erstmal noch
   nicht so viele Farben"). */
.k2-erl { display: flex; flex-direction: column; gap: 8px; margin: 0 30px 22px; }
.k2-erl__kopf, .k2-erl__zeile { display: grid; grid-template-columns: var(--k2-erl-bild) 1fr var(--k2-erl-wert) var(--k2-erl-wert); align-items: center; gap: 14px; }
/* ⚠ Der transparente Rahmen ist KEIN Schmuck: Die Zeilen darunter tragen
   einen 1-px-Rahmen. Ohne ihn ist die Innenbreite der Kopfzeile um 2 px
   größer, die `1fr`-Spur rechnet anders — Beschriftung und Werte standen
   1 px versetzt (gemessen 09.09.). */
.k2-erl__kopf { position: sticky; top: 0; z-index: 20; padding: 8px 16px; border: 1px solid transparent; background: var(--c-bg); }
/* ⚠ Die Kopf-Beschriftungen dürfen UMBRECHEN. Mit `nowrap` liefen
   „KOSTENÜBERNAHME" und „EIGENANTEIL" auf 393 px ineinander (gemessen 09.09.,
   im Bild als „KOSTENÜBERNAHEIGENANTEIL" sichtbar) — die Werte darunter
   bleiben einzeilig, die Überschriften nicht. */
.k2-erl__kopf-titel, .k2-erl__kopf-wert { font-size: 11.5px; font-weight: var(--fw-bold); color: var(--c-text-muted); text-transform: uppercase; letter-spacing: .04em; line-height: 1.25; overflow-wrap: anywhere; hyphens: auto; }
.k2-erl__kopf-wert { text-align: right; }
.k2-erl__zeile { padding: 12px 16px; border: 1px solid var(--k2-rahmen-bd); border-radius: var(--k2-radius-karte); background: var(--c-surface); }
/* Vorsorge = grün (die Kasse trägt es), Risiko = grau (hier bleibt etwas bei dir). */
.k2-erl__zeile--vorsorge { border-color: var(--k2-gruen-bd-leise); background: var(--k2-gruen-bg-leise); }
.k2-erl__bild { width: var(--k2-erl-bild); height: var(--k2-erl-bild); object-fit: cover; border-radius: var(--r-md); background: var(--c-surface-muted); }
.k2-erl__bild--leer { display: block; border: 1px dashed var(--k2-rahmen-bd); }
.k2-erl__titel { font-size: 14px; font-weight: var(--fw-semibold); color: var(--c-text); text-wrap: pretty; min-width: 0; }
.k2-erl__wert { text-align: right; font-size: 14.5px; font-weight: var(--fw-bold); font-variant-numeric: tabular-nums; white-space: nowrap; }
.k2-erl__wert--kasse { color: var(--k2-gruen); }
.k2-erl__wert--eigen { color: var(--k2-rot); }
.k2-erl__zeile--vorsorge .k2-erl__wert--eigen { color: var(--c-text-muted); }

@media (max-width: 860px) {
  .k2-erl { margin: 0 12px 18px; gap: 6px; }
  .k2-erl__kopf, .k2-erl__zeile { grid-template-columns: var(--k2-erl-bild-mobil) 1fr var(--k2-erl-wert-mobil) var(--k2-erl-wert-mobil); gap: 8px; }
  .k2-erl__kopf { top: var(--k2-mobilkopf-h); padding: 8px 10px; }
  .k2-erl__kopf-titel, .k2-erl__kopf-wert { font-size: 9.5px; letter-spacing: 0; }
  .k2-erl__kopf { align-items: end; }
  .k2-erl__zeile { padding: 10px; }
  .k2-erl__bild { width: var(--k2-erl-bild-mobil); height: var(--k2-erl-bild-mobil); }
  .k2-erl__titel { font-size: 12.5px; }
  .k2-erl__wert { font-size: 13px; }
}
