/* ═══════════════════════════════════════════════════════════════
   GEHABility — Design-System
   Grundlage für alle Seiten. Farben aus dem GEHA-Auftritt, Abstände
   und Größen bewusst auf einer festen Skala, damit die Oberfläche
   zusammenhängend wirkt und nicht wie zusammengesetzte Formulare.
   ═══════════════════════════════════════════════════════════════ */

/*
 * ════════════════════════════════════════════════════════════════
 * hidden gilt. Immer.
 * ════════════════════════════════════════════════════════════════
 *
 * Das HTML-Attribut hidden bedeutet nur display:none aus dem Standard-
 * stylesheet des Browsers. Jede eigene Regel mit einem display schlaegt es --
 * ohne Warnung, ohne dass es im Quelltext auffaellt.
 *
 * Am 11.10.2026 hat das zweimal zugeschlagen:
 *
 *   - Im Postfach standen leerer Zustand und Nachricht gleichzeitig da.
 *   - Auf dem iPad war die GANZE Seite nicht mehr anklickbar: Der Schleier
 *     hinter der Navigation lag mit display:block, position:fixed und
 *     inset:0 ueber allem. Unsichtbar wegen opacity:0, aber jeder Fingertipp
 *     landete darauf. Von Muhammed gemeldet, und es haette jeden Patienten
 *     am Tablet genauso getroffen.
 *
 * Eine Pruefung des Stylesheets fand danach sieben weitere Stellen, an denen
 * dieselbe Kollision moeglich war. Sie einzeln zu entschaerfen hiesse, beim
 * naechsten neuen Element wieder daran denken zu muessen.
 *
 * Deshalb hier einmal grundsaetzlich. Das !important ist an dieser einen
 * Stelle richtig: Es gibt keinen Fall, in dem etwas Verstecktes sichtbar sein
 * soll.
 */
[hidden] { display: none !important; }

:root{
  /* Marke */
  --green:#103D00;
  --green-dark:#0A2A00;
  --green-mid:#245916;
  --green-light:#E9F0E5;

  /*
   * Neutrale Töne.
   *
   * --muted ist auf 7:1 gegen beide Untergründe gerechnet (8,2 auf Weiss,
   * 7,6 auf --bg) und erfüllt damit WCAG AAA, nicht nur AA. Der Preis dafür
   * ist ehrlich zu benennen: Der Ton liegt jetzt dicht an --ink-2, die
   * Abstufung zwischen „zweitrangig" und „beiläufig" trägt also nicht mehr
   * über die Helligkeit allein.
   *
   * Das ist Absicht und kein Versehen: Hierarchie über Grösse und Gewicht ist
   * ohnehin die robustere — --muted steht durchweg bei 11 bis 13 Pixel und
   * normalem Gewicht, --ink-2 bei 14 Pixel und 500. Wer schlecht sieht,
   * gewinnt dabei mehr, als die Gestaltung verliert.
   */
  --ink:#14201A;
  --ink-2:#3D4A44;
  --muted:#45524B;
  --line:#E2E8DF;
  --line-strong:#CBD5C6;
  --bg:#F5F7F3;
  --card:#FFFFFF;

  /* Signale */
  --red:#8E2A1E;
  --red-light:#FBECEA;
  --amber:#66490D;
  --amber-light:#FDF4E3;
  /*
   * Blau ist die Farbe fuer „liegt vor dir" — Termine, die noch kommen,
   * Hinweise ohne Handlungsdruck. Bewusst als eigene Familie aufgenommen und
   * nicht aus Rot geliehen: Rot und Gruen sind laut Design-DNA fuer den
   * Behandlungsstatus reserviert (erschienen / nicht erschienen). Wer den
   * Normalzustand rot faerbt, verbraucht die Warnfarbe fuer den Alltag, und
   * dann faellt die echte Warnung nicht mehr auf.
   */
  --blau:#1A4E6E;
  --blau-mid:#2B6B92;
  --blau-light:#EAF2F7;

  /* Abstandsskala */
  --s1:4px; --s2:8px; --s3:12px; --s4:16px; --s5:24px; --s6:32px; --s7:48px;

  /*
   * Schriftskala. Vorher standen 17 verschiedene Größen im Projekt, sieben
   * davon mit halben Pixeln (14.5, 13.5, 12.5 …). Halbe Pixel sind kein
   * Feinschliff, sondern ein Fehler: sie werden auf Displays ohne doppelte
   * Pixeldichte gerundet und wirken dort unscharf, und zwar je Browser
   * unterschiedlich. Acht ganzzahlige Stufen genügen für die gesamte
   * Anwendung — jede weitere Größe wäre Drift, keine Gestaltung.
   */
  --t-2xs:11px;    /* Versalien-Etiketten, Abzeichen */
  --t-xs:12px;     /* Nebentext, Meta */
  --t-sm:13px;     /* dichte Bedienelemente */
  --t-base:14px;   /* Fließtext, Eingaben, Navigation */
  --t-md:15px;     /* Kartentitel, h2 */
  --t-lg:17px;     /* Marke, Abschnittstitel */
  --t-xl:22px;     /* Seitentitel */
  --t-2xl:26px;    /* Kennzahlen */

  /*
   * Zeilenhöhen. Vorher standen neun verschiedene Werte im Projekt
   * (1.15 bis 1.65) — dieselbe Drift wie zuvor bei den Schriftgrößen, nur
   * unauffälliger, weil man sie nicht sieht, sondern nur spürt.
   */
  --lh-zahl:1.15;    /* grosse Kennzahlen — eng, damit sie als Block wirken */
  --lh-eng:1.3;      /* dichte Bedienelemente, Kalendereinträge */
  --lh-normal:1.5;   /* Fließtext */
  --lh-weit:1.65;    /* längere Lesetexte: Nachrichten, Vertragstext */

  /*
   * Bewegung. Eine Dauer für alles, was auf eine Eingabe antwortet, eine
   * längere für Ein- und Ausblenden. Das Easing ist bewusst kein „ease" —
   * beschleunigt anfangs kaum und bremst weich ab, wie bei iOS.
   */
  --motion-schnell:120ms;
  --motion-ruhig:180ms;
  --motion-kurve:cubic-bezier(.32,.72,0,1);

  /*
   * Radienskala. Vorher gab es nur die beiden grossen Stufen — kleinere
   * Bauteile erfanden sich daraufhin eigene Werte: 4, 5, 6, 7, 8 und 9 Pixel
   * nebeneinander. Hauptnavigation (8), Unternavigation (8) und Ansichtswahl
   * (9) sind optisch dasselbe Bauteil und rundeten trotzdem unterschiedlich.
   * Einzeln sieht das niemand; zusammen ist es der Unterschied zwischen einem
   * System und gesammelten Einzelentscheidungen.
   */
  --radius-xs:4px;    /* Kalenderzellen, Balken, Fokusring */
  --radius-sm:8px;    /* Navigationspunkte, Menüeinträge, Termine, Kästchen */
  --radius:10px;      /* Eingabefelder, Schaltflächen */
  --radius-lg:14px;   /* Karten, Dialoge */
  --radius-pille:100px; /* Abzeichen und Balken, vollständig gerundet */
  --shadow-sm:0 1px 2px rgba(16,61,0,.06);
  --shadow:0 1px 3px rgba(16,61,0,.08), 0 8px 24px rgba(16,61,0,.06);
  --shadow-lg:0 12px 48px rgba(10,42,0,.18);

  /* Fokusring: eine Definition für die ganze Anwendung, siehe :focus-visible. */
  --fokus:0 0 0 3px rgba(36,89,22,.32);

  --sidebar:236px;
  --sidebar-schmal:60px;
}

*{box-sizing:border-box}
html,body{height:100%}
body{
  margin:0;
  font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",sans-serif;
  font-size:var(--t-base);
  line-height:var(--lh-normal);
  color:var(--ink);
  background:var(--bg);
  -webkit-font-smoothing:antialiased;
}
a{color:var(--green);text-decoration:none}
a:hover{text-decoration:underline}
h1,h2,h3{margin:0;color:var(--green-dark);letter-spacing:-.011em;font-weight:650}
h1{font-size:var(--t-xl)}
h2{font-size:var(--t-md)}
h3{font-size:var(--t-sm)}
p{margin:0}

/*
 * Tastaturbedienung.
 *
 * Vorher gab es im ganzen System genau eine Fokusregel, und Eingabefelder
 * setzten zusätzlich outline:none. Wer die Anwendung ohne Maus bedient — aus
 * Gewohnheit, wegen einer Sehbehinderung oder weil beim Aufnehmen eines
 * Termins eine Hand am Telefon ist — sah schlicht nicht, wo er gerade steht.
 *
 * :focus-visible statt :focus ist dabei wesentlich: der Ring erscheint nur bei
 * Tastaturbedienung, nicht nach einem Mausklick. Deshalb darf er kräftig sein,
 * ohne im Alltag zu stören.
 */
:focus-visible{
  outline:2px solid var(--green-mid);
  outline-offset:2px;
  border-radius:var(--radius-xs);
}
/* Elemente mit eigenem Radius bekommen den Ring als Schatten, damit er der
   Form folgt statt sie zu überdecken. */
.btn:focus-visible,.btn-zweit:focus-visible,.btn-still:focus-visible,.btn-gefahr:focus-visible,
button:focus-visible,.nav a:focus-visible,.konto-menu a:focus-visible,
input:focus-visible,select:focus-visible,textarea:focus-visible,
tr[tabindex]:focus-visible,.karte summary:focus-visible{
  outline:none;
  box-shadow:var(--fokus);
}

/*
 * Bewegung respektiert die Systemeinstellung. Wer „Bewegung reduzieren"
 * aktiviert hat, tut das oft wegen Schwindel oder Migräne — Animationen sind
 * dann kein Detail, sondern ein körperliches Problem.
 */
@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{
    animation-duration:.01ms !important;
    animation-iteration-count:1 !important;
    transition-duration:.01ms !important;
    scroll-behavior:auto !important;
  }
}

/* ─── Anwendungsrahmen ─────────────────────────────────────── */

.app{display:flex;min-height:100vh}

.sidebar{
  width:var(--sidebar);flex-shrink:0;
  background:var(--card);border-right:1px solid var(--line);
  display:flex;flex-direction:column;
  position:sticky;top:0;height:100vh;
}
.sidebar-brand{
  padding:var(--s5) var(--s5) var(--s4);
  font-size:var(--t-lg);font-weight:700;color:var(--green-dark);letter-spacing:-.02em;
}
.sidebar-brand small{display:block;font-size:var(--t-2xs);font-weight:500;color:var(--muted);letter-spacing:0;margin-top:2px}
.nav{flex:1;overflow-y:auto;padding:0 var(--s3)}
.nav-gruppe{margin-bottom:var(--s5)}
.nav-gruppe > span{
  display:block;padding:0 var(--s3) var(--s2);
  font-size:var(--t-2xs);font-weight:650;text-transform:uppercase;letter-spacing:.06em;color:var(--muted);
}
.nav a{
  display:flex;align-items:center;gap:var(--s3);
  padding:8px var(--s3);margin-bottom:1px;border-radius:var(--radius-sm);
  color:var(--ink-2);font-size:var(--t-base);font-weight:500;
  transition:background var(--motion-schnell) var(--motion-kurve),color var(--motion-schnell) var(--motion-kurve);
}
.nav a:hover{background:var(--bg);color:var(--ink);text-decoration:none}
.nav a.aktiv{background:var(--green-light);color:var(--green-dark);font-weight:600}
.nav a svg{width:17px;height:17px;flex-shrink:0;opacity:.75}
.nav a.aktiv svg{opacity:1}

.sidebar-fuss-wrap{position:relative}
.sidebar-fuss{
  width:100%;padding:var(--s3) var(--s4);border-top:1px solid var(--line);border-left:none;border-right:none;border-bottom:none;
  display:flex;align-items:center;gap:var(--s3);
  background:none;font:inherit;text-align:left;cursor:pointer;color:inherit;
  transition:background var(--motion-schnell) var(--motion-kurve);
}
.sidebar-fuss:hover{background:var(--bg)}

/* Konto-Menü: ruhig statt hektisch — leichtes Einblenden, keine harte Kante. */
.konto-menu{
  display:none;position:absolute;left:var(--s3);right:var(--s3);bottom:calc(100% + 6px);
  background:var(--card);border:1px solid var(--line);border-radius:var(--radius-lg);
  box-shadow:var(--shadow-lg);padding:6px;z-index:20;
  opacity:0;transform:translateY(4px);transition:opacity var(--motion-schnell) var(--motion-kurve),transform var(--motion-schnell) var(--motion-kurve);
}
.konto-menu.offen{display:block;opacity:1;transform:translateY(0)}
.konto-menu a{
  display:flex;align-items:center;gap:10px;padding:9px 10px;border-radius:var(--radius-sm);
  font-size:var(--t-sm);font-weight:500;color:var(--ink-2);
}
.konto-menu a:hover{background:var(--bg);color:var(--ink);text-decoration:none}
.konto-menu a svg{width:16px;height:16px;flex-shrink:0;opacity:.75}
.konto-menu a.gefahr{color:var(--red)}
.konto-menu a.gefahr:hover{background:var(--red-light)}
.konto-menu-trenner{height:1px;background:var(--line);margin:5px 4px}
.avatar{
  width:30px;height:30px;border-radius:50%;flex-shrink:0;
  background:var(--green);color:#fff;
  display:flex;align-items:center;justify-content:center;
  font-size:var(--t-xs);font-weight:650;
}
.sidebar-fuss .wer{flex:1;min-width:0}
.sidebar-fuss .wer b{display:block;font-size:var(--t-sm);font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.sidebar-fuss .wer span{font-size:var(--t-2xs);color:var(--muted)}

.inhalt{flex:1;min-width:0;display:flex;flex-direction:column}

/*
 * Hauptnavigation auf Symbolbreite (.nav-schmal).
 *
 * Auf Seiten mit eigener Unternavigation standen zwei Menüs nebeneinander:
 * 236 Pixel Hauptnavigation plus 232 Pixel Unternavigation, also über 400
 * Pixel, bevor überhaupt Inhalt beginnt. Neben dem Platz war das vor allem
 * eine Frage der Orientierung — bei zwei gleich aussehenden Listen ist nicht
 * mehr erkennbar, welche gerade die gültige Ebene ist.
 *
 * Zusammengefahren bleibt die Ortsangabe erhalten (das aktive Symbol ist
 * weiterhin hervorgehoben), die Aufmerksamkeit liegt aber auf der
 * Unternavigation. Bei Mauskontakt fährt sie wieder aus — und zwar ÜBER den
 * Inhalt, nicht neben ihn: Würde sie schieben, spränge die halbe Seite bei
 * jedem versehentlichen Überstreichen.
 *
 * Nur ab 861 Pixel: Darunter ist die Navigation ohnehin eine Schublade.
 */
@media (min-width:861px){
  .app.nav-schmal .sidebar{
    position:fixed;top:0;left:0;height:100vh;z-index:30;
    width:var(--sidebar-schmal);
    transition:width var(--motion-ruhig) var(--motion-kurve);
    overflow:hidden;
  }
  /* Platzhalter, damit der Inhalt nicht unter die Leiste rutscht */
  .app.nav-schmal .inhalt{margin-left:var(--sidebar-schmal)}

  .app.nav-schmal .sidebar:hover,
  .app.nav-schmal .sidebar:focus-within{
    width:var(--sidebar);
    box-shadow:var(--shadow);
  }

  /*
   * Was im schmalen Zustand verschwindet.
   *
   * display:none statt opacity:0 — mit blosser Transparenz belegt der Text
   * weiterhin Platz, die Verweise werden breiter als die 60 Pixel der Leiste,
   * und die Symbole werden am linken Rand abgeschnitten. Auf das Überblenden
   * wird deshalb bewusst verzichtet; die Breitenänderung trägt die Bewegung.
   */
  .app.nav-schmal .nav-text,
  .app.nav-schmal .nav-gruppe > span,
  .app.nav-schmal .sidebar-brand small,
  .app.nav-schmal .sidebar-fuss .wer,
  .app.nav-schmal .sidebar-fuss > svg{
    display:none;
  }
  .app.nav-schmal .sidebar:hover .nav-text,
  .app.nav-schmal .sidebar:focus-within .nav-text{display:inline}
  .app.nav-schmal .sidebar:hover .nav-gruppe > span,
  .app.nav-schmal .sidebar:focus-within .nav-gruppe > span,
  .app.nav-schmal .sidebar:hover .sidebar-brand small{display:block}
  .app.nav-schmal .sidebar:hover .sidebar-fuss .wer,
  .app.nav-schmal .sidebar:focus-within .sidebar-fuss .wer{display:block}
  .app.nav-schmal .sidebar:hover .sidebar-fuss > svg{display:inline}

  /*
   * Zusammengefahren bleibt nur die Bildmarke.
   *
   * Hier stand ::before{content:"G"} -- ein Kuerzel aus der Zeit, als es noch
   * kein Logo gab. Seit die Bildmarke daneben steht, erscheinen beide: ein
   * einzelner Buchstabe neben dem Zeichen, das ihn ersetzen sollte. Von
   * Muhammed am 11.10.2026 gemeldet: "Das G von GEHABility ist auch noch mit
   * drauf. Das sieht sehr unsauber aus."
   *
   * text-align zentriert hier ausserdem nichts: .sidebar-brand ist ein
   * Flex-Element, und dort entscheidet justify-content ueber die waagerechte
   * Lage. Das war der zweite Teil desselben Fehlers.
   */
  .app.nav-schmal .sidebar-brand{
    padding-left:0;padding-right:0;
    justify-content:center;
  }
  .app.nav-schmal .marke-lang{display:none}
  .app.nav-schmal .sidebar:hover .sidebar-brand,
  .app.nav-schmal .sidebar:focus-within .sidebar-brand{
    justify-content:flex-start;padding-left:var(--s5);padding-right:var(--s5);
  }
  .app.nav-schmal .sidebar:hover .marke-lang,
  .app.nav-schmal .sidebar:focus-within .marke-lang{display:inline}

  /* Symbole mittig, solange keine Beschriftung daneben steht */
  .app.nav-schmal .nav{padding:0 var(--s2)}
  .app.nav-schmal .nav a{gap:0;padding:9px 0;justify-content:center;white-space:nowrap}
  .app.nav-schmal .sidebar:hover .nav{padding:0 var(--s3)}
  .app.nav-schmal .sidebar:hover .nav a{gap:var(--s3);padding:8px var(--s3);justify-content:flex-start}

  .app.nav-schmal .sidebar-fuss{justify-content:center;padding-left:0;padding-right:0}
  .app.nav-schmal .sidebar:hover .sidebar-fuss{justify-content:flex-start;padding-left:var(--s4);padding-right:var(--s4)}

  /* Der gewonnene Platz kommt dem Inhalt zugute */
  .app.nav-schmal .unterseite{grid-template-columns:210px 1fr}
}
.kopf{
  background:var(--card);border-bottom:1px solid var(--line);
  padding:var(--s4) var(--s6);
  display:flex;align-items:center;gap:var(--s4);flex-wrap:wrap;
}
.kopf .titel{flex:1;min-width:200px}
.kopf .titel p{color:var(--muted);font-size:var(--t-sm);margin-top:2px}
/*
 * Rücksprung über der Überschrift. Bewusst klein und ruhig: Er soll gefunden
 * werden, wenn man ihn sucht, und sonst nicht mit dem Titel um Aufmerksamkeit
 * ringen. Der Pfeil rückt beim Überfahren ein Stück nach links — dieselbe
 * Richtung, in die der Klick führt.
 */
.kopf .titel .zurueck{
  display:inline-flex;align-items:center;gap:4px;
  margin-bottom:2px;
  color:var(--muted);font-size:var(--t-sm);font-weight:550;
  text-decoration:none;
}
.kopf .titel .zurueck svg{width:14px;height:14px;transition:transform var(--motion-schnell) var(--motion-kurve)}
.kopf .titel .zurueck:hover{color:var(--ink)}
.kopf .titel .zurueck:hover svg{transform:translateX(-2px)}
.kopf .titel .zurueck:focus-visible{outline:var(--fokus);outline-offset:3px;border-radius:4px}
.seite{padding:var(--s5) var(--s6);max-width:1180px;width:100%}

/*
 * Navigation auf schmalen Geräten.
 *
 * Vorher wurde die Seitenleiste zu einer waagerechten Leiste, die seitlich
 * scrollte. Auf einem Tablet an der Rezeption waren damit drei von vierzehn
 * Punkten sichtbar, die Gruppentitel („Praxis", „Analyse", „Betrieb") wurden
 * zusätzlich ausgeblendet — wer Rechnungen oder Verträge suchte, musste erst
 * erraten, dass sich die Leiste überhaupt schieben lässt.
 *
 * Jetzt eine Schublade: ein Knopf im Seitenkopf fährt die vollständige,
 * gruppierte Navigation aus. Nichts ist mehr versteckt, und die Gliederung
 * bleibt dieselbe wie am grossen Bildschirm.
 */
.menue-knopf{display:none}
.nav-schleier{display:none}

@media (max-width:860px){
  .menue-knopf{
    display:flex;align-items:center;justify-content:center;
    width:38px;height:38px;flex-shrink:0;padding:0;
    border:1px solid var(--line-strong);border-radius:var(--radius);
    background:var(--card);color:var(--ink-2);cursor:pointer;
  }
  .menue-knopf svg{width:19px;height:19px}
  .menue-knopf:hover{background:var(--bg)}

  /*
   * Der Schleier hinter der ausgefahrenen Navigation.
   *
   * Am 11.10.2026 von Muhammed gemeldet: Auf dem iPad liess sich die ganze
   * Seite nicht mehr anklicken. Die Ursache stand hier:
   *
   * Das Element traegt im HTML das Attribut hidden. Das bedeutet aber nur
   * display:none aus dem Standardstylesheet des Browsers -- und jede eigene
   * Regel mit display:block schlaegt es. Unterhalb von 860 Pixeln lag also
   * eine bildschirmfuellende Flaeche ueber der gesamten Seite. Unsichtbar,
   * weil opacity:0, aber jeder Fingertipp landete darauf statt auf dem, was
   * darunter lag.
   *
   * Zwei Riegel dagegen, weil einer schon einmal nicht gereicht hat:
   *   1. hidden gilt wieder, ausdruecklich.
   *   2. Solange der Schleier nicht offen ist, nimmt er keine Eingaben an.
   *      Selbst wenn ihn jemand kuenftig sichtbar schaltet, blockiert er
   *      nichts mehr.
   */
  .nav-schleier[hidden]{display:none}
  .nav-schleier{
    display:block;position:fixed;inset:0;z-index:40;
    background:rgba(10,42,0,.32);
    opacity:0;pointer-events:none;
    transition:opacity var(--motion-ruhig) var(--motion-kurve);
  }
  .nav-schleier.offen{opacity:1;pointer-events:auto}

  .sidebar{
    position:fixed;top:0;left:0;bottom:0;height:100dvh;
    width:min(280px,84vw);z-index:50;
    border-right:1px solid var(--line);
    transform:translateX(-100%);
    transition:transform var(--motion-ruhig) var(--motion-kurve);
    box-shadow:var(--shadow-lg);
  }
  .sidebar.offen{transform:translateX(0)}

  .app{flex-direction:row}
  .sidebar-brand{padding:var(--s4) var(--s4) var(--s3)}
  .kopf,.seite{padding-left:var(--s4);padding-right:var(--s4)}
}

/* ─── Karten ───────────────────────────────────────────────── */

.karte{
  background:var(--card);border:1px solid var(--line);
  border-radius:var(--radius-lg);box-shadow:var(--shadow-sm);
  margin-bottom:var(--s5);overflow:hidden;
}
.karte-kopf{
  padding:var(--s4) var(--s5);border-bottom:1px solid var(--line);
  display:flex;align-items:center;gap:var(--s3);flex-wrap:wrap;
}
.karte-kopf h2{flex:1;min-width:120px}
.karte-kopf .hinweis{font-size:var(--t-xs);color:var(--muted);width:100%}

/* Ein <details>-Element als aufklappbare Karte: die Kopfzeile bleibt sichtbar
   und ist der Klickbereich, der Körper klappt ein/aus. Für sekundäre Bereiche
   gedacht (Haussätze, offene Abrechnungen) — sie sollen zur Verfügung stehen,
   ohne die Übersicht dauerhaft zu füllen. */
.karte > summary.karte-kopf{cursor:pointer}
.karte > summary.karte-kopf::-webkit-details-marker{display:none}
.karte > summary.karte-kopf::before{
  content:'';width:7px;height:7px;border-right:1.6px solid var(--muted);border-bottom:1.6px solid var(--muted);
  transform:rotate(-45deg);transition:transform var(--motion-ruhig) var(--motion-kurve);margin-right:2px;flex-shrink:0;
}
.karte[open] > summary.karte-kopf::before{transform:rotate(45deg)}

/* Schlichte Aufklapp-Zeile in Formularen — z. B. "Anschrift, weitere
   Kontakte" beim Patienten anlegen. Bewusst zurückhaltender als .karte >
   summary: das hier ist ein Feld unter mehreren, keine eigene Sektion. */
details:not(.karte) > summary{
  cursor:pointer;font-size:var(--t-sm);font-weight:560;color:var(--green-mid);
  padding:4px 0;list-style:none;display:flex;align-items:center;gap:6px;
}
details:not(.karte) > summary::-webkit-details-marker{display:none}
details:not(.karte) > summary::before{
  content:'';width:6px;height:6px;border-right:1.5px solid currentColor;border-bottom:1.5px solid currentColor;
  transform:rotate(-45deg);transition:transform var(--motion-ruhig) var(--motion-kurve);flex-shrink:0;
}
details:not(.karte)[open] > summary::before{transform:rotate(45deg)}
details:not(.karte) > summary:hover{color:var(--green-dark)}

/* Gruppenüberschrift innerhalb einer Liste, z. B. Partner nach Art gebündelt */
.gruppen-kopf{
  padding:var(--s3) var(--s5) var(--s2);font-size:var(--t-xs);font-weight:650;
  text-transform:uppercase;letter-spacing:.04em;color:var(--muted);
}
.gruppen-kopf:not(:first-child){border-top:1px solid var(--line);margin-top:var(--s2)}
.karte-koerper{padding:var(--s5)}
.karte-koerper > p:first-child{margin-top:0}

/* Kennzahlen */
.kennzahlen{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:var(--s4);margin-bottom:var(--s5)}
/*
 * Ausführliche Kacheln (Wert, Bezeichnung UND Erklärzeile) brauchen mehr Platz
 * als die einfachen. Mit derselben Mindestbreite von 150px standen im Dashboard
 * sechs Kacheln nebeneinander, jede rund 150px schmal — die Bezeichnung brach
 * über zwei, die Erklärung über vier Zeilen. Lieber eine Kachel umbrechen
 * lassen als jede einzelne unlesbar quetschen.
 */
.kennzahlen.ausfuehrlich{grid-template-columns:repeat(auto-fit,minmax(200px,1fr))}
.kennzahl{
  background:var(--card);border:1px solid var(--line);border-radius:var(--radius-lg);
  padding:var(--s4) var(--s5);box-shadow:var(--shadow-sm);
}
.kennzahl b{display:block;font-size:var(--t-2xl);font-weight:680;color:var(--green-dark);letter-spacing:-.02em;line-height:var(--lh-zahl)}
.kennzahl span{display:block;font-size:var(--t-xs);color:var(--muted);margin-top:2px}
/*
 * Zahlen, aus denen unmittelbar Arbeit folgt, heben sich ab — aber nur, wenn
 * tatsächlich etwas offen ist. Bei null bleibt die Kachel unauffällig: Eine
 * dauerhaft farbige Warnung wird nach zwei Tagen nicht mehr gesehen.
 */
.kennzahl.warnend{border-color:var(--amber);background:var(--amber-light)}
.kennzahl.warnend b{color:var(--amber)}
/*
 * „Liegt noch vor dir" — kein Problem, nur der Tag, der kommt. Deshalb Blau
 * und kein Rot: Diese Kachel steht jeden Morgen auf einer hohen Zahl.
 */
.kennzahl.vorschau{border-color:var(--blau-mid);background:var(--blau-light)}
.kennzahl.vorschau b{color:var(--blau)}
/*
 * Nichts mehr offen. Die einzige Kachel, die sich freuen darf — und sie tut es
 * nur, wenn wirklich nichts aussteht, sonst waere Gruen wertlos.
 */
.kennzahl.erledigt{border-color:var(--green-mid);background:var(--green-light)}
.kennzahl.erledigt b{color:var(--green-mid)}
/*
 * Ein 3px-Streifen oben traegt die Farbe, ohne die Kachel einzufaerben: Die
 * Zahl bleibt das Lauteste, die Farbe ordnet nur ein. Das ist der Unterschied
 * zwischen „edel" und „bunt".
 */
.kennzahl{position:relative;overflow:hidden}
.kennzahl::before{
  content:"";position:absolute;inset:0 0 auto 0;height:3px;
  background:var(--line-strong);
}
.kennzahl.vorschau::before{background:var(--blau-mid)}
.kennzahl.warnend::before{background:var(--amber)}
.kennzahl.erledigt::before{background:var(--green-mid)}
/* Dashboard-Variante: Wert, Bezeichnung und eine erklärende Zeile darunter.
   Die dritte Zeile ist Absicht — „62 %" allein sagt nicht, wovon. */
.kennzahl .wert{font-size:var(--t-2xl);font-weight:680;color:var(--green-dark);letter-spacing:-.02em;line-height:var(--lh-zahl);margin-top:0}
.kennzahl .bez{font-size:var(--t-sm);font-weight:560;color:var(--ink-2);margin-top:2px}
.kennzahl .detail{font-size:var(--t-2xs);color:var(--muted);margin-top:4px;line-height:var(--lh-eng)}

/* Waagerechter Anteilsbalken, z. B. Auslastung je Behandler */
.balken{flex:1;height:8px;border-radius:var(--radius-pille);background:var(--bg);overflow:hidden;min-width:60px}
.balken > div{height:100%;background:var(--green-mid);border-radius:var(--radius-pille)}

/* Verlauf: ein Balken je Tag bzw. Monat. Der dunkle Sockel ist der online
   gebuchte Anteil — so ist beides in einem Balken lesbar, ohne Legende. */
.verlauf{display:flex;align-items:flex-end;gap:3px;height:150px;overflow-x:auto;padding-bottom:2px}
.verlauf-spalte{flex:1;min-width:14px;display:flex;flex-direction:column;justify-content:flex-end;height:100%;gap:5px}
.verlauf-balken{
  width:100%;background:var(--green-light);border-radius:var(--radius-xs) 4px 0 0;
  min-height:0;display:flex;flex-direction:column;justify-content:flex-end;
}
.verlauf-online{width:100%;background:var(--green-mid);border-radius:0 0 4px 4px}
.verlauf-spalte > span{font-size:var(--t-2xs);color:var(--muted);text-align:center;white-space:nowrap}
/*
 * Einfarbige Balken für Verteilungen ohne Aufteilung — etwa die Ausfälle nach
 * Wochentag. Der helle Grundton des Buchungsverlaufs ist dort nur der
 * Hintergrund für den dunklen Onlineanteil; ohne diesen Anteil bleibt ein
 * Balken übrig, den man kaum sieht.
 */
.verlauf.einfarbig .verlauf-balken{background:var(--green-mid)}

/* ─── Tabellen ─────────────────────────────────────────────── */

.tabelle-huelle{overflow-x:auto}
table{width:100%;border-collapse:collapse;font-size:var(--t-base)}
th{
  text-align:left;padding:10px var(--s5);
  font-size:var(--t-2xs);font-weight:650;text-transform:uppercase;letter-spacing:.05em;color:var(--muted);
  background:var(--bg);border-bottom:1px solid var(--line);white-space:nowrap;
}
td{padding:12px var(--s5);border-bottom:1px solid var(--line);vertical-align:middle}
tbody tr:last-child td{border-bottom:none}
tbody tr{transition:background var(--motion-schnell) var(--motion-kurve)}
tbody tr:hover{background:var(--bg)}
td.rechts,th.rechts{text-align:right}

/*
 * Tabellen auf schmalen Geräten.
 *
 * Eine Tabelle mit fünf Spalten passt nicht in 375 Pixel — sie scrollt dann
 * seitwärts, und was rechts steht, existiert für den Benutzer praktisch nicht.
 * Genau dort stehen aber oft Betrag, Status oder die Aktion. Am Empfangstresen
 * mit einem Tablet ist das der Normalfall, nicht die Ausnahme.
 *
 * Statt 48 Tabellen einzeln umzubauen: Jede Zeile wird zur Karte, jede Zelle
 * zu einer Zeile „Spaltenname — Wert". Den Spaltennamen holt sich die Zelle
 * aus dem zugehörigen <th> (siehe _layout_ende.php); ohne ihn bliebe eine
 * nackte Zahl übrig, die niemand einordnen kann.
 *
 * Eine künftige Tabelle bekommt das Verhalten automatisch — es hängt am
 * Baustein, nicht an der einzelnen Seite.
 */
@media (max-width:640px){
  .tabelle-huelle{overflow-x:visible}
  .tabelle-huelle table,
  .tabelle-huelle tbody,
  .tabelle-huelle tr,
  .tabelle-huelle td{display:block;width:100%}
  .tabelle-huelle thead{display:none}

  .tabelle-huelle tr{
    border:1px solid var(--line);border-radius:var(--radius);
    margin-bottom:var(--s3);padding:var(--s3) var(--s4);background:var(--card);
  }
  .tabelle-huelle tbody tr:last-child{margin-bottom:0}

  .tabelle-huelle td{
    border:none;padding:5px 0;
    display:flex;align-items:baseline;gap:var(--s3);justify-content:space-between;
    text-align:right;
  }
  .tabelle-huelle td::before{
    content:attr(data-spalte);
    color:var(--muted);font-size:var(--t-xs);font-weight:560;
    text-align:left;flex:0 0 auto;
  }
  .tabelle-huelle td:empty{display:none}
  /* Die erste Zelle trägt meist den Namen — volle Breite, keine Beschriftung. */
  .tabelle-huelle td:first-child{
    justify-content:flex-start;text-align:left;
    font-size:var(--t-base);padding-top:0;padding-bottom:var(--s2);
  }
  .tabelle-huelle td:first-child::before{display:none}
  /* Der Hauptlink der Karte soll die volle Breite treffbar machen — ein
     21 Pixel hoher Textlink ist mit dem Finger kaum zu erwischen. */
  .tabelle-huelle td:first-child > a{display:block;padding:3px 0}
  /* Auch Verweise in den übrigen Zellen bekommen Fingerhöhe. */
  .tabelle-huelle td > a{min-height:24px;display:inline-flex;align-items:center}
  .tabelle-huelle tr.klickbar{cursor:pointer}
}

/*
 * Klickbare Tabellenzeilen.
 *
 * Vorher lag auf der Zeile ein onclick="location.href=…". Das sieht mit der
 * Maus richtig aus und ist sonst in jeder Hinsicht falsch: die Zeile ist mit
 * der Tastatur nicht erreichbar, ein Screenreader kündigt keinen Link an,
 * Cmd-Klick öffnet keinen neuen Tab, Rechtsklick bietet nichts an — und wer
 * einen Namen zum Kopieren markieren will, landet stattdessen auf der
 * Unterseite.
 *
 * Stattdessen trägt die erste Zelle einen echten <a>, dessen Klickfläche sich
 * per Pseudoelement über die ganze Zeile legt. Damit stimmt die Semantik, und
 * alles, was ein Link kann, funktioniert wieder.
 */
tr.klickbar{position:relative}
tr.klickbar .zeile-link::after{content:"";position:absolute;inset:0;z-index:1}
tr.klickbar .zeile-link{color:inherit;text-decoration:none}
tr.klickbar:hover .zeile-link{text-decoration:none}
/* Weitere Bedienelemente in der Zeile müssen über der Klickfläche liegen. */
tr.klickbar a:not(.zeile-link),tr.klickbar button,tr.klickbar input,tr.klickbar label{position:relative;z-index:2}
/* Der Fokusring gehört um die ganze Zeile, nicht nur um den Text. */
tr.klickbar:has(.zeile-link:focus-visible){box-shadow:inset var(--fokus);border-radius:var(--radius)}
tr.klickbar .zeile-link:focus-visible{outline:none}
/* Aktuell geöffnete Zeile, z. B. die gerade gelesene Nachricht im Postfach. */
tr.klickbar.offen,tr.klickbar.offen:hover{background:var(--green-light)}
.punkt-ungelesen{display:inline-block;width:7px;height:7px;border-radius:50%;background:var(--green)}

/* ─── Öffentliche Seiten (Buchung, Portal, Fehlerseiten) ───── */

.oeffentlich-huelle{max-width:640px;margin:0 auto;padding:var(--s6) var(--s4)}
.oeffentlich-marke{
  text-align:center;margin-bottom:var(--s5);
  font-size:var(--t-sm);font-weight:650;color:var(--muted);
  letter-spacing:.03em;text-transform:uppercase;
}

/* ─── Checkliste abarbeiten ────────────────────────────────── */

.sop-zeile-form{margin:0}
.sop-zeile{
  /* justify-content ausdrücklich: <button> zentriert seinen Inhalt von sich
     aus, sodass Kästchen und Text sonst in der Zeilenmitte schwebten. */
  display:flex;align-items:center;justify-content:flex-start;gap:var(--s3);width:100%;
  padding:12px 10px;margin:0;
  background:none;border:none;border-bottom:1px solid var(--line);border-radius:var(--radius);
  font:inherit;color:var(--ink);text-align:left;cursor:pointer;
  transition:background var(--motion-schnell) var(--motion-kurve);
}
.sop-zeile:hover{background:var(--bg)}
.sop-box{
  width:24px;height:24px;flex-shrink:0;
  display:inline-flex;align-items:center;justify-content:center;
  border:1.5px solid var(--line-strong);border-radius:var(--radius-sm);background:var(--card);
  transition:background var(--motion-schnell) var(--motion-kurve),border-color var(--motion-schnell) var(--motion-kurve);
}
.sop-box svg{width:15px;height:15px}
.sop-zeile:hover .sop-box{border-color:var(--green-mid)}
.sop-zeile.erledigt .sop-box{background:var(--green);border-color:var(--green);color:#fff}
.sop-zeile.erledigt .sop-text{color:var(--muted);text-decoration:line-through}

/* ─── Regelzeile (Einstellungen) ───────────────────────────── */

/*
 * Beschreibung links, Eingabe rechts. Bewusst nicht das übliche Formular mit
 * Beschriftung über dem Feld: Diese Einstellungen ändert man selten, und dann
 * muss man verstehen, was der Wert bewirkt — der Hilfetext ist hier wichtiger
 * als das Feld und darf entsprechend Platz bekommen.
 */
.regel{
  display:grid;grid-template-columns:1fr 210px;gap:var(--s5);
  align-items:start;padding:var(--s4) 0;border-bottom:1px solid var(--line);
}
.regel:last-child{border-bottom:none;padding-bottom:0}
.regel:first-child{padding-top:0}
.regel-text label{display:block;font-size:var(--t-base);font-weight:600;color:var(--ink);margin-bottom:2px}
.regel-text p{font-size:var(--t-sm);line-height:var(--lh-normal);margin:0}
.regel-ausnahmen{display:flex;flex-direction:column;align-items:flex-start;gap:2px;margin-top:var(--s2)}
.ausnahme{
  display:flex;align-items:center;gap:var(--s2);
  font-size:var(--t-xs);color:var(--amber);
}
.ausnahme b{font-weight:650}
/* Der Entfernen-Knopf soll die Zeile nicht dominieren — er ist die seltenere
   Handlung und steht neben einer Information, nicht neben einem Formularfeld. */
.ausnahme .btn-still{padding:2px 7px;font-size:var(--t-2xs);color:var(--muted)}
.ausnahme .btn-still:hover{color:var(--red);background:var(--red-light)}
.ausnahme-neu{align-self:flex-start;padding:3px 8px;font-size:var(--t-2xs)}
.ausnahme-neu svg{width:12px;height:12px}
.regel-eingabe{display:flex;align-items:center;gap:var(--s2);flex-wrap:wrap}
/* Doppelte Klasse, weil die Grundregel input[type=number]{width:100%} dieselbe
   Spezifität hätte und als spätere gewinnen würde — das Feld füllte dann die
   ganze Spalte, und die Einheit rutschte darunter. */
.regel-eingabe.regel-eingabe input,
.regel-eingabe.regel-eingabe select{width:88px;flex:none}
.regel-einheit{font-size:var(--t-sm);color:var(--muted)}
.regel-standard{
  width:100%;font-size:var(--t-xs);color:var(--muted);
  border-top:1px dashed var(--line);padding-top:4px;margin-top:2px;
}

@media (max-width:600px){
  .regel{grid-template-columns:1fr;gap:var(--s3)}
}

/* ─── Suchfeld ─────────────────────────────────────────────── */

.suchform{display:flex;flex:1;min-width:200px}
.suchfeld{position:relative;display:flex;align-items:center;width:100%;max-width:380px}
.suchfeld > svg{
  position:absolute;left:11px;width:16px;height:16px;
  color:var(--muted);pointer-events:none;
}
.suchfeld input[type=search]{
  padding-left:34px;padding-right:34px;
  /* Die eigene Löschkreuz-Darstellung von WebKit passt nicht zum System und
     erscheint zusätzlich zu unserer — deshalb aus. */
  -webkit-appearance:none;appearance:none;
}
.suchfeld input[type=search]::-webkit-search-cancel-button{display:none}
.suchfeld input:focus + .suchfeld-loeschen,.suchfeld-loeschen{color:var(--muted)}
.suchfeld-loeschen{
  position:absolute;right:8px;display:flex;align-items:center;justify-content:center;
  width:22px;height:22px;border-radius:50%;
  transition:background var(--motion-schnell) var(--motion-kurve),color var(--motion-schnell) var(--motion-kurve);
}
.suchfeld-loeschen svg{width:15px;height:15px}
.suchfeld-loeschen:hover{background:var(--line);color:var(--ink);text-decoration:none}

/* ─── Unternavigation (Einstellungen) ──────────────────────── */

/*
 * Vorher lagen hier zehn gleichwertige Reiter in einer waagerechten Leiste,
 * die auf normalen Bildschirmen seitlich scrollen musste — im Code stand dazu
 * der Satz, ohne Scrollen wären „die letzten Reiter unerreichbar, ohne dass es
 * auffällt". Eine Navigation, die Punkte versteckt, ist keine Navigation.
 *
 * Zehn ungeordnete Wahlmöglichkeiten sind ausserdem schlicht zu viele (Hick).
 * Vier benannte Gruppen zu je zwei bis vier Punkten lassen sich dagegen mit
 * einem Blick erfassen, und alles ist gleichzeitig sichtbar.
 */
/*
 * minmax(0,1fr) statt 1fr: Eine Rasterspalte hat von sich aus min-width:auto
 * und schrumpft nicht unter die Mindestbreite ihres Inhalts. Eine breite
 * Tabelle im rechten Bereich drückte die Spalte deshalb über den Container
 * hinaus — die ganze Seite scrollte waagerecht und schnitt Schaltflächen ab,
 * statt dass die Tabelle in ihrer eigenen Hülle gescrollt hätte.
 */
.unterseite{display:grid;grid-template-columns:200px minmax(0,1fr);gap:var(--s6);align-items:start}
/*
 * Reiterleiste der Patientenakte.
 *
 * Waagerecht und nicht als Seitenleiste wie .unternav: Die Akte hat keine
 * zweispaltige Anlage, und eine Spalte nur für fünf Einträge nähme dem
 * Behandlungsverlauf ein Viertel der Breite. Die Unterstreichung markiert den
 * aktiven Reiter, ohne den Text zu verschieben — ein Rahmen, der beim Wechsel
 * erscheint, ruckelt.
 */
/*
 * Betragsaufstellung in der Ausfall-Rückfrage. Die Endsumme ist abgesetzt und
 * größer — sie ist die Zahl, über die entschieden wird; die beiden Zeilen
 * darüber erklären nur, wie sie zustande kommt.
 */
.ausfall-betrag{
  background:var(--bg);border:1px solid var(--line);border-radius:var(--radius-sm);
  padding:var(--s3) var(--s4);
}
.ausfall-betrag > div{display:flex;justify-content:space-between;align-items:baseline;
  gap:var(--s4);padding:3px 0;font-size:var(--t-sm)}
.ausfall-betrag > div > span{color:var(--muted)}
.ausfall-betrag .ausfall-summe{
  border-top:1px solid var(--line);margin-top:6px;padding-top:8px;
}
.ausfall-betrag .ausfall-summe > span{color:var(--ink-2);font-weight:600}
.ausfall-betrag .ausfall-summe > b{font-size:var(--t-lg);font-weight:680;color:var(--green-dark)}

.akte-reiter{
  display:flex;gap:var(--s1);flex-wrap:wrap;
  border-bottom:1px solid var(--line);margin-bottom:var(--s5);
}
.akte-reiter a{
  padding:9px var(--s3);margin-bottom:-1px;
  border-bottom:2px solid transparent;
  color:var(--muted);font-size:var(--t-sm);font-weight:550;
  transition:color var(--motion-schnell) var(--motion-kurve),
             border-color var(--motion-schnell) var(--motion-kurve);
}
.akte-reiter a:hover{color:var(--ink);text-decoration:none;border-bottom-color:var(--line-strong)}
.akte-reiter a.aktiv{color:var(--green-dark);font-weight:650;border-bottom-color:var(--green)}
.akte-reiter a:focus-visible{outline:var(--fokus);outline-offset:-2px;border-radius:var(--radius-sm)}

/*
 * Kopfzeile der Akte: die vier bis fünf Angaben, die unabhängig vom Reiter
 * gelten. Bewusst klein und ohne Kartenrahmen — sie soll begleiten, nicht
 * konkurrieren.
 */
.akte-kopf{
  display:flex;flex-wrap:wrap;gap:var(--s5);
  padding:0 0 var(--s4);margin-bottom:var(--s3);
}
.akte-fakt span{display:block;font-size:var(--t-2xs);color:var(--muted);
  text-transform:uppercase;letter-spacing:.05em;margin-bottom:2px}
.akte-fakt b{font-size:var(--t-sm);font-weight:620;color:var(--ink)}
.akte-fakt.warnend b,.akte-fakt.warnend b a{color:var(--amber)}
/* Zwei Stufen, zwei Farben: Bernstein heisst „zur Kenntnis", Rot heisst
   „hier läuft etwas aus dem Ruder". Wäre beides rot, hiesse Rot nichts mehr. */
.akte-fakt.kritisch b,.akte-fakt.kritisch b a{color:var(--red)}

.unternav{position:sticky;top:var(--s5)}
.unternav-gruppe{margin-bottom:var(--s5)}
.unternav-gruppe > span{
  display:block;padding:0 var(--s3) var(--s2);
  font-size:var(--t-2xs);font-weight:650;text-transform:uppercase;
  letter-spacing:.06em;color:var(--muted);
}
.unternav a{
  display:block;padding:7px var(--s3);margin-bottom:1px;border-radius:var(--radius-sm);
  color:var(--ink-2);font-size:var(--t-sm);font-weight:500;
  transition:background var(--motion-schnell) var(--motion-kurve),color var(--motion-schnell) var(--motion-kurve);
}
.unternav a:hover{background:var(--card);color:var(--ink);text-decoration:none}
.unternav a.aktiv{background:var(--green-light);color:var(--green-dark);font-weight:600}

@media (max-width:860px){
  /* Auch hier minmax(0,…): Bei einer Spalte übernimmt das Raster sonst die
     Mindestbreite der breitesten Tabelle und zieht die Unternavigation mit
     über den Bildschirmrand hinaus. */
  .unterseite{grid-template-columns:minmax(0,1fr);gap:var(--s4)}
  .unternav{position:static;background:var(--card);border:1px solid var(--line);
            border-radius:var(--radius-lg);padding:var(--s3)}
  .unternav-gruppe{margin-bottom:var(--s3)}
  .unternav-gruppe:last-child{margin-bottom:0}
}
/* Belegnummern, Datumsangaben und Beträge dürfen nie umbrechen — eine über
   drei Zeilen zerrissene Rechnungsnummer ist nicht mehr lesbar. Die Tabelle
   scrollt stattdessen waagerecht (.tabelle-huelle). */
td.nowrap,th.nowrap{white-space:nowrap}
td .haupt{font-weight:600;color:var(--ink)}
td .neben{font-size:var(--t-xs);color:var(--muted)}
/*
 * Zeilenaktionen.
 *
 * Vorher standen sie auf opacity:.35 und wurden erst bei :hover voll sichtbar.
 * Das war gleich dreifach falsch: ausgegrauter Text bedeutet in jeder
 * Oberfläche „nicht verfügbar", nicht „fahr mal drüber"; der Kontrast lag weit
 * unter jedem WCAG-Wert; und beim Durchtabben hellte nichts auf, weil nur
 * :hover berücksichtigt war — der Fokus landete also sichtbar auf einem Knopf,
 * der deaktiviert aussah.
 *
 * Jetzt dauerhaft lesbar, nur zurückhaltend gesetzt. In einer Praxis bedient
 * dieselbe Handvoll Leute die Software jeden Tag; Verlässlichkeit ist dort mehr
 * wert als das Aufgeräumtwirken einer Tabelle, in der man erst suchen muss.
 */
.zeilen-aktionen{display:flex;gap:var(--s2);justify-content:flex-end;align-items:center}

/*
 * Trefferflächen in Tabellenzeilen.
 *
 * Der Haken zum Abhaken einer Aufgabe maß 29×25 Pixel. Das erfüllt gerade eben
 * die 24 Pixel aus WCAG 2.5.8, verfehlt aber die 44 aus 2.5.5 deutlich — und
 * 44 Pixel sind genau das, was Apple für Bedienung mit dem Finger nennt.
 *
 * Volle 44 Pixel überall würden dichte Tabellen aufblähen; ein Terminplan, der
 * halb so viele Zeilen zeigt, wäre ein neuer Nachteil. Deshalb am Zeigegerät
 * 36 Pixel — spürbar sicherer als 25 — und die vollen 44 dort, wo mit dem
 * Finger bedient wird.
 */
/* Auch verschachtelt (die Aktionen liegen oft in einem eigenen <form>). */
.zeilen-aktionen button,.zeilen-aktionen .btn,.zeilen-aktionen .btn-zweit,
.zeilen-aktionen .btn-still,.zeilen-aktionen .btn-gefahr{
  min-height:36px;display:inline-flex;align-items:center;justify-content:center;
}
@media (hover:none){
  .zeilen-aktionen button,.zeilen-aktionen .btn,.zeilen-aktionen .btn-zweit,
  .zeilen-aktionen .btn-still,.zeilen-aktionen .btn-gefahr{min-height:44px}
}

/*
 * Abhaken einer Aufgabe.
 *
 * Vorher stand in beiden Zuständen derselbe Haken, unterschieden allein durch
 * opacity:.5 — dasselbe Zeichen bedeutete also einmal „erledigen" und einmal
 * „wieder öffnen", und der Unterschied las sich als „deaktiviert".
 *
 * Jetzt wie in jeder Aufgabenliste, die Menschen kennen: offen ist ein leerer
 * Kreis, der zum Anklicken einlädt, erledigt ein gefüllter Haken.
 */
.zeilen-schalter{
  width:36px;height:36px;padding:0;flex-shrink:0;
  display:inline-flex;align-items:center;justify-content:center;
  border:none;background:none;cursor:pointer;border-radius:50%;
  color:var(--line-strong);
  transition:background var(--motion-schnell) var(--motion-kurve),color var(--motion-schnell) var(--motion-kurve);
}
.zeilen-schalter svg{width:20px;height:20px}

/*
 * Auswahlfeld innerhalb einer Tabellenzeile.
 *
 * Ein vollständig ausgestaltetes Formularfeld in jeder Zeile ist das Merkmal,
 * an dem man Verwaltungssoftware erkennt: Bei drei Aufgaben stehen drei
 * Rahmen mit drei Chevrons in der Liste und ziehen mehr Aufmerksamkeit auf
 * sich als die Aufgaben selbst. Die Zuständigkeit zu ändern ist aber die
 * seltenere Handlung — gelesen und abgehakt wird häufiger.
 *
 * Deshalb: normal nur Text, das Chrome erscheint bei Mauszeiger oder Fokus.
 * Die Bedienung bleibt identisch (ein Klick), nur die Ruhe kehrt zurück.
 * Auf Touchgeräten gibt es kein Hover — dort bleibt der Rahmen sichtbar,
 * sonst wäre nicht erkennbar, dass sich hier etwas ändern lässt.
 */
/* ─── Rolle, eingeklappt (Benutzer & Rechte) ───────────────── */

.rolle-block{border-bottom:1px solid var(--line)}
.rolle-block:last-of-type{border-bottom:none}
.rolle-block > summary{
  display:flex;align-items:center;gap:var(--s3);flex-wrap:wrap;
  padding:var(--s3) 0;cursor:pointer;list-style:none;
}
.rolle-block > summary::-webkit-details-marker{display:none}
/* Eigenes Dreieck, damit es zur Formensprache des Systems passt und sich beim
   Öffnen dreht — der Standardmarker sieht je Browser anders aus. */
.rolle-block > summary::before{
  content:"";width:0;height:0;flex-shrink:0;
  border-left:5px solid var(--muted);
  border-top:4px solid transparent;border-bottom:4px solid transparent;
  transition:transform var(--motion-schnell) var(--motion-kurve);
}
.rolle-block[open] > summary::before{transform:rotate(90deg)}
.rolle-block > summary:hover .rolle-name{color:var(--green)}
.rolle-name{font-weight:600;color:var(--ink)}
.rolle-beschreibung{flex:1;min-width:120px;color:var(--muted);font-size:var(--t-sm)}
.rolle-rechte{color:var(--muted);font-size:var(--t-xs);white-space:nowrap}

select.zeilen-select{
  width:auto;max-width:100%;
  padding:4px 24px 4px 7px;
  border-color:transparent;background-color:transparent;
  font-size:var(--t-sm);color:var(--ink-2);
  transition:border-color var(--motion-schnell) var(--motion-kurve),background-color var(--motion-schnell) var(--motion-kurve);
}
select.zeilen-select:hover{border-color:var(--line-strong);background-color:var(--card)}
select.zeilen-select:focus,select.zeilen-select:focus-visible{border-color:var(--green-mid);background-color:var(--card)}
@media (hover:none){
  select.zeilen-select{border-color:var(--line-strong);background-color:var(--card)}
}
.zeilen-schalter:hover{background:var(--bg);color:var(--green-mid)}
.zeilen-schalter.erledigt{color:var(--green-mid)}
.zeilen-schalter.erledigt:hover{color:var(--muted)}
@media (hover:none){.zeilen-schalter{width:44px;height:44px}}

/* ─── Leerzustände ─────────────────────────────────────────── */

.leer{padding:var(--s7) var(--s5);text-align:center}
.leer svg{width:38px;height:38px;color:var(--line-strong);margin-bottom:var(--s3)}
.leer b{display:block;font-size:var(--t-md);color:var(--ink);margin-bottom:var(--s2);font-weight:600}
.leer p{color:var(--muted);font-size:var(--t-sm);max-width:400px;margin:0 auto var(--s4)}

/* Knappe Fassung für leere Abschnitte innerhalb einer gefüllten Seite,
   siehe geha_leer_knapp(). */
.leer-knapp{padding:var(--s4) var(--s5);display:flex;align-items:center;gap:var(--s3);flex-wrap:wrap}
.leer-knapp p{color:var(--muted);font-size:var(--t-sm);margin:0}
/* Steht er schon in einem Kartenkörper, bringt der seine Polsterung mit —
   sonst stünde der Satz doppelt eingerückt. */
.karte-koerper .leer-knapp{padding:0}

/* ─── Schaltflächen ────────────────────────────────────────── */

/*
 * Grundgestaltung für alle Schaltflächen — ausdrücklich auch für die Varianten.
 *
 * Vorher stand hier nur `button,.btn`, und .btn-zweit/.btn-still/.btn-gefahr
 * setzten lediglich Farben. Das ging gut, solange die Variante auf einem echten
 * <button> sass oder zusätzlich .btn trug. Auf einem <a class="btn-zweit"> fehlte
 * dagegen jedes Layout: kein Innenabstand, kein Rahmen, kein inline-flex — der
 * Link stand als nackter Text neben einem fertigen Knopf. Sechzehn Stellen waren
 * betroffen, und man sah es nur, wenn man genau diese Seite ansah.
 *
 * Dieselbe Ursache steckte hinter dem zu grossen Symbol auf der Checklistenseite:
 * Regeln, die Varianten stillschweigend als Zusatz zu .btn voraussetzen. Die
 * Varianten tragen jetzt selbst, was sie brauchen.
 */
button,.btn,.btn-zweit,.btn-still,.btn-gefahr{
  display:inline-flex;align-items:center;justify-content:center;gap:var(--s2);
  font:inherit;font-size:var(--t-base);font-weight:560;
  padding:9px 16px;border-radius:var(--radius);border:1px solid transparent;
  background:var(--green);color:#fff;cursor:pointer;
  transition:background var(--motion-schnell) var(--motion-kurve),border-color var(--motion-schnell) var(--motion-kurve),color var(--motion-schnell) var(--motion-kurve);
  white-space:nowrap;text-decoration:none;
}
button:hover,.btn:hover{background:var(--green-dark);text-decoration:none;color:#fff}
/* Die Tag-Regel (button) trifft jeden <button>, egal welche Klasse. Die
   Klassenregeln daneben sind nötig, weil dieselben Knöpfe manchmal auch als
   <a> auftreten (z. B. eine Kopfzeilen-Aktion, die zu einer anderen Seite
   führt) — ohne sie bliebe das Symbol in so einem Link unbegrenzt groß. */
button svg,.btn svg,.btn-zweit svg,.btn-still svg,.btn-gefahr svg{width:15px;height:15px}

.btn-zweit{background:var(--card);color:var(--ink);border-color:var(--line-strong)}
.btn-zweit:hover{background:var(--bg);color:var(--ink);border-color:var(--muted)}

.btn-still{background:transparent;color:var(--muted);border-color:transparent;padding:6px 10px;font-size:var(--t-sm)}
.btn-still:hover{background:var(--bg);color:var(--ink)}

/*
 * Löschen, Deaktivieren, Stornieren.
 *
 * Bewusst NICHT dauerhaft rot: Rot ist in dieser Oberfläche die Farbe für
 * Fehler und Warnungen. Steht in jeder Tabellenzeile ein rotes „Entfernen",
 * nutzt sich das Signal ab — und gleichzeitig zieht die gefährlichste Aktion
 * der Zeile den Blick am stärksten auf sich, was genau falsch herum ist.
 *
 * Ruhig im Grundzustand, rot erst, wenn der Zeiger oder der Tastaturfokus
 * darauf steht. Dann ist die Warnung da, wo sie zählt: im Moment davor.
 */
.btn-gefahr{background:transparent;color:var(--ink-2);border-color:transparent;padding:6px 10px;font-size:var(--t-sm);
            transition:background var(--motion-schnell) var(--motion-kurve),color var(--motion-schnell) var(--motion-kurve)}
.btn-gefahr:hover,.btn-gefahr:focus-visible{background:var(--red-light);color:var(--red)}

.btn-klein{padding:5px 11px;font-size:var(--t-sm)}

/* ─── Formulare ────────────────────────────────────────────── */

.feld{margin-bottom:var(--s4)}
/* Beschriftung eines Felds — und einer Gruppe von Ankreuzfeldern.
   Für eine Gruppe wäre <label for> falsch: Es dürfte nur auf genau ein
   Element zeigen. Dort steht deshalb ein <span> plus role="group" und
   aria-labelledby, das dieselbe Gestaltung bekommt. */
.feld > label,.feld > .gruppen-label{display:block;font-size:var(--t-xs);font-weight:560;color:var(--ink-2);margin-bottom:5px}
.feld .hilfe{font-size:var(--t-xs);color:var(--muted);margin-top:5px}
input[type=text],input[type=email],input[type=password],input[type=date],
input[type=time],input[type=datetime-local],input[type=color],
input[type=number],input[type=search],select,textarea{
  width:100%;padding:9px 11px;font:inherit;font-size:var(--t-base);
  border:1px solid var(--line-strong);border-radius:var(--radius);
  background:var(--card);color:var(--ink);
  transition:border-color var(--motion-schnell) var(--motion-kurve),box-shadow var(--motion-schnell) var(--motion-kurve);
}
input:focus,select:focus,textarea:focus{
  outline:none;border-color:var(--green-mid);
  box-shadow:0 0 0 3px rgba(36,89,22,.13);
}
/* Bei Tastaturbedienung der kräftigere Ring aus dem System, damit ein
   angesprungenes Feld sich deutlich von einem angeklickten unterscheidet. */
input:focus-visible,select:focus-visible,textarea:focus-visible{box-shadow:var(--fokus)}

/*
 * Deaktivierte Bedienelemente.
 *
 * Für diesen Zustand gab es im ganzen System keine einzige Regel — bei zehn
 * deaktivierten Feldern und Knöpfen. Die eigenen Farbangaben überschrieben
 * dabei die Standarddarstellung des Browsers, sodass etwa die Anmeldeadresse
 * im Profil aussah wie ein ganz normales Eingabefeld: weisser Grund, voller
 * Kontrast, gewöhnlicher Rahmen. Man durfte hineinklicken und tippen — nur
 * passierte nichts.
 *
 * Ein Feld, das nicht bearbeitet werden kann, muss das zeigen, bevor jemand es
 * versucht.
 */
input:disabled,select:disabled,textarea:disabled{
  background:var(--bg);
  color:var(--muted);
  border-color:var(--line);
  cursor:not-allowed;
}
button:disabled,.btn:disabled,.btn-zweit:disabled,.btn-still:disabled,.btn-gefahr:disabled{
  opacity:.5;
  cursor:not-allowed;
}
button:disabled:hover,.btn:disabled:hover{filter:none}
textarea{resize:vertical;min-height:80px}

/*
 * Datum/Zeit ohne eigene font-family fallen auf die Systemschrift des
 * Betriebssystems zurück, nicht auf unsere — genau der „Uhrenschrift"-Effekt.
 * Zahlen laufen zusätzlich über font-variant-numeric auf gleiche Breite,
 * damit die Ziffern beim Tippen nicht seitlich springen.
 */
input[type=date],input[type=time],input[type=datetime-local]{
  font-variant-numeric:tabular-nums;letter-spacing:.01em;color:var(--ink);
}
input[type=date]::-webkit-datetime-edit,
input[type=time]::-webkit-datetime-edit,
input[type=datetime-local]::-webkit-datetime-edit{padding:0}
input[type=date]::-webkit-datetime-edit-fields-wrapper,
input[type=time]::-webkit-datetime-edit-fields-wrapper,
input[type=datetime-local]::-webkit-datetime-edit-fields-wrapper{padding:0}
/* Die einzelnen Ziffernfelder (Tag/Monat/Jahr/Stunde/Minute): ohne dies stehen
   sie in der fetten OS-Ziffernschrift, während alles drumherum unsere ist. */
input[type=date]::-webkit-datetime-edit-text,
input[type=date]::-webkit-datetime-edit-day-field,
input[type=date]::-webkit-datetime-edit-month-field,
input[type=date]::-webkit-datetime-edit-year-field,
input[type=time]::-webkit-datetime-edit-text,
input[type=time]::-webkit-datetime-edit-hour-field,
input[type=time]::-webkit-datetime-edit-minute-field,
input[type=time]::-webkit-datetime-edit-ampm-field,
input[type=datetime-local]::-webkit-datetime-edit-text,
input[type=datetime-local]::-webkit-datetime-edit-day-field,
input[type=datetime-local]::-webkit-datetime-edit-month-field,
input[type=datetime-local]::-webkit-datetime-edit-year-field,
input[type=datetime-local]::-webkit-datetime-edit-hour-field,
input[type=datetime-local]::-webkit-datetime-edit-minute-field,
input[type=datetime-local]::-webkit-datetime-edit-ampm-field{
  font-family:inherit;color:var(--ink);
}
input[type=date]::-webkit-calendar-picker-indicator,
input[type=time]::-webkit-calendar-picker-indicator,
input[type=datetime-local]::-webkit-calendar-picker-indicator{
  opacity:.45;filter:none;cursor:pointer;padding:2px;border-radius:var(--radius-xs);
  transition:opacity var(--motion-schnell) var(--motion-kurve),background var(--motion-schnell) var(--motion-kurve);
}
input[type=date]::-webkit-calendar-picker-indicator:hover,
input[type=time]::-webkit-calendar-picker-indicator:hover,
input[type=datetime-local]::-webkit-calendar-picker-indicator:hover{
  opacity:.85;background:var(--bg);
}
select{appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 8'%3E%3Cpath fill='%236B7A73' d='M1 1l5 5 5-5'/%3E%3C/svg%3E");
  background-repeat:no-repeat;background-position:right 11px center;background-size:11px;padding-right:32px}
/* Dateiauswahl: der native Knopf sieht in jedem Browser anders aus und passt
   zu keinem. Der Rahmen kommt deshalb von uns, nur der Knopf darin bleibt nativ. */
input[type=file]{
  width:100%;padding:7px 9px;font:inherit;font-size:var(--t-sm);
  border:1px dashed var(--line-strong);border-radius:var(--radius);
  background:var(--card);color:var(--ink-2);cursor:pointer;
}
input[type=file]::file-selector-button{
  font:inherit;font-size:var(--t-sm);font-weight:560;margin-right:10px;padding:5px 11px;
  border:1px solid var(--line-strong);border-radius:var(--radius);
  background:var(--bg);color:var(--ink);cursor:pointer;
}
input[type=file]:hover{border-color:var(--green-mid)}

.feld-reihe{display:grid;grid-template-columns:1fr 1fr;gap:0 var(--s4)}
@media (max-width:600px){.feld-reihe{grid-template-columns:1fr}}

/*
 * Zwei Karten nebeneinander.
 *
 * Eigene Klasse statt eines Inline-Stils an der Stelle: Ein Inline-Style
 * schlaegt jede Medienabfrage, und genau daran scheiterte das Umbrechen auf
 * schmalen Geraeten. Bei 375 Pixel standen zwei Karten weiterhin
 * nebeneinander, gut 159 Pixel breit, und die Tabellen darin mussten seitlich
 * gescrollt werden.
 *
 * Die Modifikatorklasse .einspaltig gilt, wenn nur eine der beiden Karten
 * vorhanden ist: Eine halbe Karte neben einer leeren Spalte sieht aus, als
 * fehle etwas.
 */
.karten-reihe{display:grid;grid-template-columns:1fr 1fr;gap:var(--s5);align-items:start}
.karten-reihe.einspaltig{grid-template-columns:1fr}
.karten-reihe > .karte{margin-bottom:0}
@media (max-width:860px){.karten-reihe{grid-template-columns:1fr}}

/* Wochentagsauswahl */
.tagwahl{display:flex;gap:6px;flex-wrap:wrap}
.tag-chip{position:relative;cursor:pointer;user-select:none}
.tag-chip input{position:absolute;opacity:0;width:0;height:0}
.tag-chip span{
  display:inline-flex;align-items:center;justify-content:center;
  min-width:46px;padding:8px 10px;border:1px solid var(--line-strong);border-radius:var(--radius);
  background:var(--card);font-size:var(--t-sm);font-weight:560;transition:background var(--motion-schnell) var(--motion-kurve),border-color var(--motion-schnell) var(--motion-kurve),color var(--motion-schnell) var(--motion-kurve);
}
.tag-chip:hover span{border-color:var(--green-mid)}
.tag-chip input:checked + span{background:var(--green);border-color:var(--green);color:#fff}
.tag-chip input:focus-visible + span{box-shadow:0 0 0 3px rgba(36,89,22,.25)}

/* Auswahlkästchen als Zeile */
.wahl-liste{display:flex;flex-direction:column;gap:var(--s1)}
.wahl{display:flex;align-items:center;gap:var(--s3);padding:8px 11px;border:1px solid var(--line);border-radius:var(--radius);cursor:pointer;transition:border-color var(--motion-schnell) var(--motion-kurve),background var(--motion-schnell) var(--motion-kurve)}
.wahl:hover{border-color:var(--line-strong);background:var(--bg)}
.wahl input{width:16px;height:16px;accent-color:var(--green);cursor:pointer}

/* ─── Dialog ───────────────────────────────────────────────── */

dialog{
  border:none;padding:0;border-radius:var(--radius-lg);
  box-shadow:var(--shadow-lg);max-width:620px;width:calc(100% - 32px);
  color:var(--ink);background:var(--card);
}
dialog::backdrop{background:rgba(10,42,0,.4)}

/*
 * Dialoge sprangen bisher ohne jede Bewegung ins Bild. Bei einer Software, die
 * den ganzen Tag benutzt wird, ist das kein Detail: Ein Kasten, der ohne
 * Übergang erscheint, wirkt wie ein Fehler und zwingt das Auge, die neue
 * Bildmitte erst zu suchen. Die kurze Bewegung sagt „das kommt von hier" und
 * führt den Blick.
 *
 * Bewusst sparsam — 180 ms, acht Pixel, zwei Prozent Maßstab. Wer „Bewegung
 * reduzieren" eingestellt hat, bekommt sie durch die Regel weiter oben gar
 * nicht erst zu sehen.
 */
@keyframes geha-dialog-auf{
  from{opacity:0;transform:translateY(8px) scale(.985)}
  to{opacity:1;transform:none}
}
@keyframes geha-schleier-auf{from{opacity:0}to{opacity:1}}
dialog[open]{animation:geha-dialog-auf var(--motion-ruhig) var(--motion-kurve)}
dialog[open]::backdrop{animation:geha-schleier-auf var(--motion-ruhig) var(--motion-kurve)}
.dialog-kopf{padding:var(--s5) var(--s5) var(--s3);display:flex;align-items:flex-start;gap:var(--s3)}
.dialog-kopf h2{flex:1;font-size:var(--t-lg)}
/*
 * Ein Dialogkörper, der scrollt, muss das zeigen.
 *
 * Der Termindialog ist über 1400 Pixel hoch, sichtbar sind rund 585 — ohne
 * Hinweis endet der Inhalt für den Betrachter einfach an der Kante, und was
 * darunter liegt, wird nicht gesucht. Der weiche Verlauf unten sagt „hier geht
 * es weiter", ohne einen Balken einzublenden.
 *
 * Umgesetzt über background-attachment:local: Der Verlauf klebt am Rand des
 * Sichtfensters und verschwindet von selbst, sobald das Ende erreicht ist —
 * ohne eine Zeile JavaScript und ohne Scroll-Ereignisse zu belauschen.
 */
.dialog-koerper{
  padding:0 var(--s5) var(--s4);max-height:65vh;overflow-y:auto;
  background:
    linear-gradient(var(--card) 30%, rgba(255,255,255,0)) top / 100% 24px no-repeat local,
    linear-gradient(rgba(255,255,255,0), var(--card) 70%) bottom / 100% 24px no-repeat local,
    radial-gradient(farthest-side at 50% 0, rgba(20,32,26,.10), rgba(0,0,0,0)) top / 100% 10px no-repeat scroll,
    radial-gradient(farthest-side at 50% 100%, rgba(20,32,26,.10), rgba(0,0,0,0)) bottom / 100% 10px no-repeat scroll;
}
.dialog-fuss{
  padding:var(--s4) var(--s5);border-top:1px solid var(--line);background:var(--bg);
  display:flex;justify-content:flex-end;gap:var(--s2);
}

/* ─── Abzeichen und Hinweise ───────────────────────────────── */

.badge{display:inline-flex;align-items:center;gap:5px;padding:3px 10px;border-radius:var(--radius-pille);font-size:var(--t-xs);font-weight:600;white-space:nowrap}
.badge.ja,.badge.aktiv{background:var(--green-light);color:var(--green-dark)}
.badge.gefahr{background:var(--red-light);color:var(--red)}
.badge.warn{background:var(--amber-light);color:var(--amber)}
.badge.neutral{background:var(--bg);color:var(--muted);border:1px solid var(--line)}

.hinweis-kasten{padding:var(--s3) var(--s4);border-radius:var(--radius);font-size:var(--t-sm);margin-bottom:var(--s4)}
.hinweis-kasten.fehler{background:var(--red-light);color:var(--red)}
.hinweis-kasten.erfolg{background:var(--green-light);color:var(--green-dark)}
.hinweis-kasten.warn{background:var(--amber-light);color:var(--amber)}
.hinweis-kasten.info,
.hinweis-kasten.hinweis{background:var(--bg);color:var(--ink-2);border:1px solid var(--line)}

.muted{color:var(--muted);font-size:var(--t-sm)}

/* Kopierbarer Link */
.kopierlink{display:inline-flex;align-items:center;gap:var(--s2);max-width:100%}
.kopierlink code{
  font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:var(--t-xs);
  background:var(--bg);border:1px solid var(--line);border-radius:var(--radius-sm);padding:3px 8px;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
}

/* ─── Anmeldeseite ─────────────────────────────────────────── */

.anmelden{min-height:100vh;display:flex;align-items:center;justify-content:center;padding:var(--s5)}
.anmelden-box{width:100%;max-width:380px}
.anmelden-marke{text-align:center;margin-bottom:var(--s5)}
.anmelden-marke b{font-size:var(--t-2xl);font-weight:700;color:var(--green-dark);letter-spacing:-.02em}
.anmelden-marke span{display:block;font-size:var(--t-sm);color:var(--muted);margin-top:var(--s1)}

/* ─── Diagramm ─────────────────────────────────────────────── */

/* ── Terminkalender ─────────────────────────────────────────────
   Zeitraster als CSS-Grid: linke Spalte Uhrzeiten, danach je eine
   Spalte pro Behandler (Tagesansicht) bzw. pro Tag (Wochenansicht).
   Termine liegen absolut positioniert in ihrer Spalte. */
.kalender{display:grid;position:relative;overflow-x:auto;background:var(--card)}
.kal-kopf{position:sticky;top:0;z-index:3;background:var(--card);border-bottom:1px solid var(--line);
  padding:10px 8px;font-size:var(--t-sm);font-weight:600;text-align:center;white-space:nowrap}
.kal-kopf small{display:block;font-weight:400;color:var(--muted);font-size:var(--t-2xs)}
.kal-zeitspalte{border-right:1px solid var(--line)}
.kal-zeit{font-size:var(--t-2xs);color:var(--muted);text-align:right;padding:0 8px;
  position:relative;top:-7px;white-space:nowrap}
.kal-spalte{position:relative;border-right:1px solid var(--line)}
.kal-spalte:last-child{border-right:0}
/*
 * Jetzt-Linie.
 *
 * Der Tagesplan hatte keine Markierung der aktuellen Uhrzeit. Genau das ist
 * aber die häufigste Frage an einen Praxiskalender: Wo stehen wir gerade, was
 * kommt als Nächstes? Ohne Linie muss man die Uhrzeitspalte absuchen und mit
 * der eigenen Uhr vergleichen.
 *
 * Rot, obwohl Rot sonst die Fehlerfarbe ist: Als zwei Pixel dünne Linie mit
 * Punkt ist das die Darstellung aus Apple Kalender, Google Kalender und
 * Outlook — sie wird nicht als Warnung gelesen, sondern sofort als „jetzt".
 * Eine grüne Linie ginge zwischen den grün getönten Terminen unter.
 */
.kal-jetzt{position:absolute;left:0;right:0;height:0;border-top:2px solid var(--red);z-index:2;pointer-events:none}
.kal-jetzt::before{
  content:"";position:absolute;left:-4px;top:-4px;
  width:8px;height:8px;border-radius:50%;background:var(--red);
}
/*
 * Reiter innerhalb eines Dialogs.
 *
 * Gleiche Bauart wie die Reiter der Patientenakte (.akte-reiter), nur enger:
 * In einem Dialog steht weniger Platz zur Verfuegung, und die Leiste soll die
 * Ueberschrift nicht ueberwiegen.
 */
.dialog-reiter{
  display:flex;gap:var(--s1);flex-wrap:wrap;
  border-bottom:1px solid var(--line);margin-bottom:var(--s4);
}
.dialog-reiter button{
  padding:7px var(--s3);margin-bottom:-1px;
  background:transparent;border:0;border-bottom:2px solid transparent;border-radius:0;
  color:var(--muted);font-size:var(--t-sm);font-weight:550;cursor:pointer;
  transition:color var(--motion-schnell) var(--motion-kurve),
             border-color var(--motion-schnell) var(--motion-kurve);
}
.dialog-reiter button:hover{color:var(--ink);border-bottom-color:var(--line-strong)}
.dialog-reiter button.aktiv{color:var(--green-dark);font-weight:650;border-bottom-color:var(--green)}
.dialog-reiter button:focus-visible{outline:var(--fokus);outline-offset:-2px;border-radius:var(--radius-sm)}

/*
 * Statuswahl im Termindialog: die erste Frage, deshalb als Knopfreihe und
 * nicht als Auswahlliste. Eine Liste verlangt zwei Klicks und verbirgt, wie
 * viele Möglichkeiten es überhaupt gibt.
 *
 * Die Farbe steht nie allein — jeder Knopf trägt zusätzlich sein Zeichen und
 * seine Beschriftung (WCAG 1.4.1).
 */
.status-wahl{display:flex;align-items:center;gap:var(--s2);flex-wrap:wrap;margin-bottom:var(--s3)}
.status-frage{font-size:var(--t-sm);font-weight:600;color:var(--ink-2);margin-right:2px}
.status-knopf{position:relative;display:inline-flex}
.status-knopf input{position:absolute;opacity:0;width:100%;height:100%;margin:0;cursor:pointer}
.status-knopf span{
  display:inline-flex;align-items:center;gap:5px;
  padding:7px 14px;border-radius:var(--radius-sm);
  border:1px solid var(--line-strong);background:var(--card);
  font-size:var(--t-sm);font-weight:600;color:var(--ink-2);
  transition:background var(--motion-schnell) var(--motion-kurve),
             color var(--motion-schnell) var(--motion-kurve),
             border-color var(--motion-schnell) var(--motion-kurve);
}
.status-knopf:hover span{border-color:var(--ink-2)}
.status-knopf input:focus-visible + span{outline:var(--fokus);outline-offset:2px}
.status-knopf.ja input:checked + span{background:var(--green);border-color:var(--green-dark);color:#fff}
.status-knopf.nein input:checked + span{background:var(--red);border-color:var(--red);color:#fff}
.status-knopf.offen input:checked + span{background:var(--bg);border-color:var(--ink-2);color:var(--ink)}

.kal-linie{position:absolute;left:0;right:0;border-top:1px solid var(--line)}
.kal-linie.halb{border-top-style:dotted;opacity:.55}
.kal-slot{position:absolute;left:0;right:0;cursor:pointer;background:transparent;
  border:0;padding:0;transition:background var(--motion-schnell) var(--motion-kurve)}
.kal-slot:hover{background:var(--green-light)}
.kal-slot:hover::after{content:"+";position:absolute;left:6px;top:1px;font-size:var(--t-sm);
  color:var(--green);font-weight:700}
/*
 * Der Terminblock besteht aus zwei Teilen: einer klickbaren Fläche, die den
 * Dialog öffnet, und den Abhakknöpfen rechts. Deshalb ist der Block selbst ein
 * Behälter — ein Knopf im Knopf wäre ungültiges Markup, und der Browser würde
 * die inneren Klicks unvorhersehbar behandeln.
 */
.kal-termin{position:absolute;border-radius:var(--radius-sm);
  font-size:var(--t-xs);line-height:var(--lh-eng);overflow:hidden;
  border-left:3px solid var(--green);background:var(--green-light);color:var(--green-dark);
  display:block}
.kal-flaeche{position:absolute;inset:0;width:100%;height:100%;
  padding:4px 7px;background:transparent;border:0;border-radius:0;
  text-align:left;cursor:pointer;color:inherit;font:inherit;overflow:hidden;
  /* Die allgemeine Knopfregel setzt display:inline-flex und stellte Uhrzeit
     und Leistung damit nebeneinander statt untereinander. */
  display:block;
  /* Rechts Platz lassen für die Abhakknöpfe, damit der Name nicht darunter
     verschwindet. */
  padding-right:56px}
.kal-flaeche:hover{background:rgba(16,61,0,.06)}
.kal-termin b{display:block;font-weight:620;font-size:var(--t-xs);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.kal-termin span{opacity:.85;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block}
/* Ebenfalls mit .kal-termin davor — sonst greift `.kal-termin span{display:block}`
   und das Zeichen rutscht in eine eigene Zeile. */
.kal-termin b span.kal-dokumentiert{display:inline;width:auto;opacity:.7;margin-left:4px}
/*
 * Offener Betrag im Terminblock. Bernstein statt Rot: Ein Restbetrag ist eine
 * Sache, die man ansprechen sollte, keine, die den Termin gefährdet. Die
 * Abstufung nach „wächst" steht in der Akte — im Kalender wäre sie zu viel
 * Information für einen Block von fünf Millimetern Höhe.
 */
/* Selektor mit .kal-termin davor: Sonst gewinnt die allgemeinere Regel
   `.kal-termin span{display:block}` und die Marke zöge sich über die ganze
   Zeile, statt vor dem Leistungsnamen zu stehen. */
.kal-termin span.kal-offen{
  display:inline-block;width:auto;margin-right:5px;padding:0 5px;border-radius:4px;
  background:var(--amber-light);color:var(--amber);opacity:1;
  font-size:var(--t-2xs);font-weight:700;white-space:nowrap;
}
.kal-termin.wahrgenommen span.kal-offen{background:rgba(255,255,255,.92)}

/*
 * Abhaken ohne Umweg über den Dialog. Klein und zurückhaltend, solange nichts
 * entschieden ist; die getroffene Wahl bleibt sichtbar gefüllt, damit man den
 * Zustand auch dann erkennt, wenn die Blockfarbe im Ausdruck fehlt.
 */
.kal-abhaken{position:absolute;top:3px;right:4px;display:flex;gap:2px;z-index:3}
.kal-abhaken button{
  width:22px;height:22px;padding:0;border-radius:5px;
  display:flex;align-items:center;justify-content:center;
  font-size:12px;line-height:1;font-weight:700;
  border:1px solid transparent;background:rgba(255,255,255,.72);color:var(--muted);
  cursor:pointer;
}
.kal-abhaken button:hover{background:#fff}
.kal-abhaken button.ja:hover{background:var(--green);color:#fff;border-color:var(--green-dark)}
.kal-abhaken button.nein:hover{background:var(--red);color:#fff;border-color:var(--red)}
.kal-abhaken button:focus-visible{outline:var(--fokus);outline-offset:1px}

/*
 * Der gewählte Zustand: weisser Grund, farbiges Zeichen, farbiger Rahmen.
 *
 * Bewusst nicht andersherum. Ein grün gefüllter Haken verschwand auf dem
 * grünen Block eines wahrgenommenen Termins vollständig — dieselbe Farbe auf
 * derselben Farbe. Weiss trägt auf beiden Untergründen, hell wie dunkel, und
 * der Rahmen sagt zusätzlich, welcher der beiden Knöpfe gemeint ist.
 */
.kal-abhaken button.gewaehlt{background:#fff;border-width:2px;font-weight:800}
.kal-abhaken button.ja.gewaehlt{color:var(--green);border-color:var(--green)}
.kal-abhaken button.nein.gewaehlt{color:var(--red);border-color:var(--red)}
/* Auf dem dunklen Grün eines wahrgenommenen Termins braucht der nicht gewählte
   Knopf mehr Deckkraft, sonst verschwindet er im Hintergrund. */
.kal-termin.wahrgenommen .kal-abhaken button:not(.gewaehlt){background:rgba(255,255,255,.85)}
.kal-termin.storniert{opacity:.45;text-decoration:line-through}

/*
 * Der Status eines Termins am Farbton erkennbar.
 *
 * Bisher sahen alle Termine gleich aus, egal ob die Behandlung stattgefunden
 * hat, ob jemand nicht erschienen ist oder ob noch gar nichts entschieden
 * wurde. Genau das ist aber die Frage, die man beim Blick in den Kalender am
 * häufigsten hat.
 *
 * Die Zuordnung ist bewusst eindeutig und exklusiv:
 *   geplant           – hell, zurückhaltend: noch nichts entschieden
 *   wahrgenommen      – volles GEHA-Grün mit Haken: erledigt
 *   nicht erschienen  – Rot: kostet Geld und will bearbeitet werden
 *
 * Volles Grün und Rot sind damit für den Status reserviert. Behandler dürfen
 * keine ähnliche Farbe bekommen — sonst hiesse dieselbe Farbe an zwei Stellen
 * etwas anderes, und die Verwechslung ginge zulasten der Abrechnung.
 *
 * Die Farbe steht nie allein: Wahrgenommene Termine tragen zusätzlich einen
 * Haken, nicht erschienene ein Ausrufezeichen. Rot und Grün sind die häufigste
 * Farbfehlsichtigkeit überhaupt; ohne zweites Merkmal wäre die Unterscheidung
 * für einen Teil der Nutzer nicht vorhanden (WCAG 1.4.1).
 */
.kal-termin.wahrgenommen{
  background:var(--green);border-left-color:var(--green-dark);color:#fff;
}
.kal-termin.wahrgenommen span{opacity:.9}
.kal-termin.wahrgenommen b::before{content:"✓ ";font-weight:700}
.kal-termin.nicht_erschienen{
  background:#FBEAE7;border-left-color:var(--red);color:var(--red);
}
.kal-termin.nicht_erschienen b::before{content:"! ";font-weight:700}
/* Gesperrte Zeit (Urlaub, Feiertag, Fortbildung): schraffiert, nicht anklickbar */
.kal-gesperrt{position:absolute;left:0;right:0;z-index:1;pointer-events:none;overflow:hidden;
  background:repeating-linear-gradient(45deg,rgba(107,122,115,.09),rgba(107,122,115,.09) 6px,
    rgba(107,122,115,.16) 6px,rgba(107,122,115,.16) 12px)}
.kal-gesperrt span{display:block;padding:4px 7px;font-size:var(--t-2xs);font-weight:600;color:var(--muted);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
/* .kal-jetzt steht weiter oben — hier stand dieselbe Klasse ein zweites Mal
   und überschrieb sie stillschweigend. Zwei Definitionen derselben Sache sind
   eine Falle: Wer die obere ändert, sieht keine Wirkung und sucht am falschen
   Ende. */

/* ── Bausteine für schnelleres Dokumentieren ── */
.bausteine{display:flex;flex-wrap:wrap;gap:4px;margin-top:6px;
  max-height:76px;overflow-y:auto;padding-bottom:2px}
.baustein{
  font:inherit;font-size:var(--t-xs);font-weight:500;line-height:var(--lh-eng);
  padding:3px 9px;border-radius:var(--radius-pille);cursor:pointer;
  background:var(--bg);color:var(--ink-2);border:1px solid var(--line);
  transition:background var(--motion-schnell) var(--motion-kurve),border-color var(--motion-schnell) var(--motion-kurve),color var(--motion-schnell) var(--motion-kurve);
}
.baustein:hover{background:var(--green-light);border-color:var(--green-mid);color:var(--green-dark)}
.baustein.partie{background:var(--card);border-style:dashed}
.baustein.gewaehlt{background:var(--green);border-color:var(--green);color:#fff}

/* ── Messwertverläufe in der Patientenakte ── */
.messwert-block{padding:var(--s4) 0;border-bottom:1px solid var(--line)}
.messwert-block:last-of-type{border-bottom:none}
.messwert-kopf{display:flex;justify-content:space-between;align-items:baseline;
  gap:var(--s3);flex-wrap:wrap;margin-bottom:var(--s2)}
.messwert-kopf b{font-size:var(--t-base);font-weight:600}
.messwert-kopf .muted{font-size:var(--t-xs);margin-left:var(--s2)}
.messwert-aktuell{font-size:var(--t-xl);font-weight:680;color:var(--green-dark);letter-spacing:-.02em}
.messwert-aktuell .einheit{font-size:var(--t-xs);font-weight:500;color:var(--muted);margin-left:3px}
.mess-chart{width:100%;height:110px;display:block}
.messwert-achse{display:flex;justify-content:space-between;font-size:var(--t-2xs);color:var(--muted);margin-top:2px}

/* ── Jahresansicht: zwölf Monatsgitter, Auslastung als Farbintensität ── */
/* Feste Spaltenbreite statt 1fr: sonst dehnen sich die Monatsblöcke auf die
   volle Breite und die quadratischen Tageszellen werden riesig. */
.kal-jahr{display:grid;grid-template-columns:repeat(auto-fill,196px);
  gap:var(--s5) var(--s6);justify-content:space-between}
.kal-jahr-monat{min-width:0}
.kal-jahr-kopf{display:flex;justify-content:space-between;align-items:baseline;
  margin-bottom:var(--s2);font-size:var(--t-base);font-weight:650;color:var(--green-dark)}
.kal-jahr-kopf a{color:inherit;text-decoration:none}
.kal-jahr-kopf a:hover{text-decoration:underline}
.kal-jahr-kopf .muted{font-size:var(--t-xs);font-weight:500}
.kal-jahr-gitter{display:grid;grid-template-columns:repeat(7,24px);gap:2px}
.kal-jahr-wt{width:24px;text-align:center;font-size:var(--t-2xs);color:var(--muted);padding-bottom:2px}
.kal-jahr-tag{display:flex;align-items:center;justify-content:center;
  width:24px;height:24px;border-radius:var(--radius-xs);font-size:var(--t-2xs);text-decoration:none;
  color:var(--ink);background:var(--bg);border:1px solid transparent}
.kal-jahr-tag.stufe-0{background:var(--bg);color:var(--muted)}
.kal-jahr-tag.stufe-1{background:#D8E6D0;color:var(--green-dark)}
.kal-jahr-tag.stufe-2{background:#8FBF7A;color:#fff}
.kal-jahr-tag.stufe-3{background:var(--green);color:#fff;font-weight:600}
/*
 * „Heute" im Jahreskalender: Doppelring statt Goldrahmen.
 *
 * Vorher markierte ein goldener Rahmen den heutigen Tag. Auf einer Heatmap,
 * deren Kacheln von fast weiss (#F5F7F3) bis fast schwarz (--green) reichen,
 * kann das nicht funktionieren: Gemessen erreichte Gold gegen die mittlere
 * Auslastungsstufe nur 1,49:1 — an einem mittelmässig vollen Tag war die
 * Markierung schlicht nicht zu sehen. Und es lag nicht am Farbton: Jeder
 * einzelne Ton scheitert an einem der beiden Enden des Helligkeitsbereichs.
 *
 * Zwei Ringe lösen das ohne Kompromiss — auf hellen Kacheln trägt der dunkle,
 * auf dunklen der weisse. Der jeweils sichtbare erreicht mindestens 7,9:1,
 * gefordert sind 3:1 (WCAG 1.4.11).
 */
.kal-jahr-tag.heute{
  border-color:transparent;font-weight:700;
  box-shadow:0 0 0 2px var(--ink), 0 0 0 4px #fff;
}
a.kal-jahr-tag:hover{outline:2px solid var(--green-mid);outline-offset:1px}

.kal-monat{display:grid;grid-template-columns:repeat(7,1fr);gap:1px;background:var(--line);
  border:1px solid var(--line)}
.kal-monat-kopf{background:var(--card);padding:8px;text-align:center;font-size:var(--t-xs);
  font-weight:600;color:var(--muted)}
.kal-tag{background:var(--card);min-height:96px;padding:6px;position:relative}
.kal-tag.fremd{background:var(--bg);opacity:.6}
.kal-tag.heute{box-shadow:inset 0 0 0 2px var(--green)}
.kal-tag-zahl{font-size:var(--t-xs);font-weight:600;margin-bottom:4px}
.kal-tag-eintrag{font-size:var(--t-2xs);padding:2px 5px;border-radius:var(--radius-xs);margin-bottom:2px;
  background:var(--green-light);border-left:2px solid var(--green);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block;color:var(--green-dark)}

.filterleiste{display:flex;gap:var(--s3);align-items:center;flex-wrap:wrap;
  padding:var(--s3) var(--s5);border-bottom:1px solid var(--line)}
.filterleiste select{width:auto;min-width:150px;padding:6px 10px;font-size:var(--t-sm)}
.ansichtswahl{display:inline-flex;border:1px solid var(--line);border-radius:var(--radius-sm);overflow:hidden}
.ansichtswahl a{padding:6px 14px;font-size:var(--t-sm);color:var(--muted);text-decoration:none;
  border-right:1px solid var(--line)}
.ansichtswahl a:last-child{border-right:0}
.ansichtswahl a.aktiv{background:var(--green);color:#fff;font-weight:600}
.ansichtswahl a:hover:not(.aktiv){background:var(--bg);text-decoration:none}

/*
 * Filter als Trichter. Sieht aus wie ein Knopf, ist ein <details>: Der
 * Pfeil zeigt an, dass sich etwas aufklappt, der Text daneben nennt immer
 * den gerade gewählten Filter — man muss nicht aufklappen, um zu sehen,
 * wonach gefiltert wird.
 */
/*
 * Die Regeln tragen `details.filterwahl`, nicht nur `.filterwahl`: Weiter
 * oben steht `details:not(.karte) > summary` samt eigenem ::before-Dreieck,
 * und das ist spezifischer als eine einzelne Klasse. Ohne die höhere
 * Spezifität stand vor dem Trichter noch ein zweites Zeichen.
 */
/*
 * Das Filtermenü auf der Patientenseite ist breiter als die übrigen: Es
 * enthält ein ganzes Formular, keine Liste von Verweisen.
 */
.patienten-filter{width:min(620px,calc(100vw - 4 * var(--s4)));padding:var(--s4)}
.patienten-filter .feld{margin-bottom:var(--s3)}
.patienten-filter .feld-reihe{gap:var(--s3)}
@media (max-width:720px){
  .patienten-filter{width:calc(100vw - 2 * var(--s4))}
  details.filterwahl#patientenFilter .filterwahl-liste{left:auto;right:0}
}

/* ══ Balkenzeile: Name, Balken, Zahl ══════════════════════════════════
 *
 * Für Auswertungen, bei denen die Reihenfolge die Aussage ist. Eine Tabelle
 * mit denselben Zahlen liesse sich lesen, aber nicht auf einen Blick
 * vergleichen — und genau darum geht es bei „welche Beschwerde führt".
 */
.balkenzeile{display:grid;grid-template-columns:minmax(120px,15em) 1fr auto;
  align-items:center;gap:var(--s3);padding:5px 0;font-size:var(--t-sm)}
.balkenzeile-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
/*
 * Kombinationen brauchen mehr Platz als einzelne Namen: „Schulter +
 * Verspannungen allgemein" wurde sonst abgeschnitten, und gerade bei
 * Kombinationen steht die Aussage im zweiten Teil.
 */
.balkenzeile.breit{grid-template-columns:minmax(200px,24em) 1fr auto}
/*
 * Wenige Spalten sollen nicht über die ganze Breite auseinanderlaufen.
 * Drei Monate ergaben sonst drei 348 Pixel breite Balken mit viel Luft
 * dazwischen — das liest sich wie ein kaputtes Diagramm, nicht wie drei
 * Monate.
 */
.verlauf.wenige{justify-content:flex-start;gap:var(--s4)}
.verlauf.wenige .verlauf-spalte{max-width:88px;flex:0 0 88px}
.balkenzeile-wert{text-align:right;white-space:nowrap;min-width:5.5em}
.balkenzeile-wert .muted{margin-left:5px;font-size:var(--t-xs)}
@media (max-width:620px){
  .balkenzeile{grid-template-columns:1fr auto;gap:2px var(--s3)}
  .balkenzeile .balken{grid-column:1 / -1;order:3}
}

/* Zwei Karten nebeneinander, auf schmalem Schirm untereinander. */
.zwei-spalten{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));
  gap:var(--s4);align-items:start}
.zwei-spalten > .karte{margin-bottom:0}

/* ══ Warnband in der Patientenakte ════════════════════════════════════
 *
 * Allergien und Dauermedikation, ganz oben und vor allem anderen. Rot, aber
 * nicht schreiend: Es steht auf jeder Akte, die eines hat, und muss im Alltag
 * lesbar bleiben, ohne zu ermüden. Die Warnung liegt in der Platzierung, nicht
 * in der Lautstärke.
 */
.warnband{display:flex;align-items:flex-start;gap:10px;
  margin:0 0 var(--s4);padding:11px 14px;border-radius:var(--radius-sm);
  background:#fdf2f2;border:1px solid #e9b8b8;color:#8a2020;
  font-size:var(--t-sm);line-height:1.45}
.warnband > svg{width:18px;height:18px;flex-shrink:0;margin-top:1px}
.warnband-inhalt{flex:1;display:flex;flex-wrap:wrap;gap:4px var(--s4)}
.warnband-posten b{font-weight:650}
.warnband-allergie b{color:#8a2020}
.warnband-medikation b{color:#8a5520}
.warnband-hinweis b{color:#5a4a20}
.warnband-notiz{opacity:.75}
.warnband-link{flex-shrink:0;color:#8a2020;font-size:var(--t-xs);
  text-decoration:underline;opacity:.75}
.warnband-link:hover{opacity:1;color:#8a2020}

/* ══ Schnellsuche ══════════════════════════════════════════════════════
 *
 * Einstieg in der Seitenleiste, Dialog in der Mitte. Bewusst oben und nicht
 * als Menüpunkt: Die Suche ersetzt das Menü für den häufigsten Vorgang, sie
 * ist kein weiterer Punkt darin.
 */
/*
 * Von Muhammed am 11.10.2026: "Die Suchleiste links ist zu breit. Die ist
 * buendig mit der Navigationsleiste links und rechts."
 *
 * Der Knopf stand ausserhalb von .nav und damit ausserhalb von deren
 * seitlicher Einrueckung -- er lief bis an beide Kanten der Leiste, waehrend
 * jeder Menuepunkt darunter um --s3 eingerueckt ist. Zwei verschiedene Kanten
 * in derselben Spalte liest das Auge als Fehler, nicht als Absicht.
 */
.schnellsuche-start{display:flex;align-items:center;gap:8px;
  width:auto;margin:0 var(--s3) var(--s4);padding:7px 10px;cursor:pointer;
  background:var(--bg);border:1px solid var(--line);border-radius:var(--radius-sm);
  font:inherit;font-size:var(--t-sm);color:var(--muted);text-align:left}
.schnellsuche-start:hover{background:#fff;border-color:var(--green-mid);color:var(--text)}
.schnellsuche-start svg{width:15px;height:15px;flex-shrink:0}
.schnellsuche-start span{flex:1}
.schnellsuche-start kbd,.schnellsuche kbd{
  font:inherit;font-size:10px;padding:1px 5px;border-radius:4px;
  background:#fff;border:1px solid var(--line);color:var(--muted);white-space:nowrap}
/* In der zusammengefahrenen Leiste bleibt nur die Lupe. */
.nav-schmal .schnellsuche-start span,
.nav-schmal .schnellsuche-start kbd{display:none}
.nav-schmal .schnellsuche-start{justify-content:center;margin-left:6px;margin-right:6px}

dialog.schnellsuche{
  width:min(620px,calc(100vw - 2 * var(--s4)));max-width:none;padding:0;
  border:1px solid var(--line);border-radius:var(--radius);
  box-shadow:0 24px 64px rgba(0,0,0,.18);
  /* Oben statt mittig: Die Liste wächst nach unten, der Dialog soll dabei
     nicht wandern. */
  margin:12vh auto auto;overflow:hidden}
dialog.schnellsuche::backdrop{background:rgba(20,28,20,.34)}

.schnellsuche-kopf{display:flex;align-items:center;gap:10px;
  padding:13px 16px;border-bottom:1px solid var(--line)}
.schnellsuche-kopf svg{width:17px;height:17px;color:var(--muted);flex-shrink:0}
.schnellsuche-kopf input{flex:1;border:0;outline:0;background:none;padding:0;
  font:inherit;font-size:var(--t-lg);color:var(--text)}
.schnellsuche-kopf input::-webkit-search-cancel-button{display:none}

.schnellsuche-liste{max-height:52vh;overflow-y:auto;padding:6px}
.schnellsuche-gruppe{padding:9px 10px 4px;font-size:var(--t-xs);font-weight:650;
  color:var(--muted);letter-spacing:.04em;text-transform:uppercase}
.schnellsuche-zeile{display:flex;flex-direction:column;gap:1px;
  padding:8px 10px;border-radius:var(--radius-sm);
  color:var(--text);text-decoration:none;cursor:pointer}
.schnellsuche-zeile:hover{text-decoration:none}
.schnellsuche-zeile.gewaehlt{background:var(--green);color:#fff}
.schnellsuche-titel{font-size:var(--t-base);font-weight:560}
.schnellsuche-neben{font-size:var(--t-xs);color:var(--muted)}
.schnellsuche-zeile.gewaehlt .schnellsuche-neben{color:rgba(255,255,255,.82)}
.schnellsuche-leer{padding:22px 12px;margin:0;text-align:center;
  font-size:var(--t-sm);color:var(--muted)}

.schnellsuche-fuss{display:flex;gap:var(--s4);
  padding:8px 16px;border-top:1px solid var(--line);background:var(--bg);
  font-size:var(--t-xs);color:var(--muted)}
.schnellsuche-fuss span{display:flex;align-items:center;gap:4px}
/* Auf dem Telefon gibt es keine Tastatur, für die diese Zeile gilt. */
@media (max-width:640px){.schnellsuche-fuss{display:none}
  dialog.schnellsuche{margin-top:6vh}}

/*
 * Hinweis auf einen angefangenen Entwurf. Steht als erstes im Formular, weil
 * es die erste Frage beantwortet: „Wo war ich stehen geblieben?" Zurückhaltend
 * gefärbt — es ist ein Angebot, keine Warnung.
 */
/*
 * Beträge nicht umbrechen.
 *
 * Auf Tabletbreite stand in der Terminliste „160,00" in der einen und „€" in
 * der nächsten Zeile. Gelöst im Satz und nicht im Datenformat: geha_preis()
 * liefert weiterhin ein gewöhnliches Leerzeichen, damit Export, PDF und
 * Vergleiche unverändert bleiben.
 */
td.rechts, th.rechts, .betrag, .kennzahl b, .summe td,
td[data-spalte="Preis"], td[data-spalte="Betrag"], td[data-spalte="Summe"],
td[data-spalte="Offen"], td[data-spalte="Termin"], td[data-spalte="Datum"]{white-space:nowrap}

/*
 * Kennziffern und Namen gehören auf eine Zeile.
 *
 * In der Rechnungsliste stand „RE-2026-0011" über drei Zeilen: „RE-",
 * „2026-", „0011". Der Browser darf nach einem Bindestrich umbrechen, und
 * bei schmaler Spalte tut er das auch — eine Rechnungsnummer, die man
 * buchstabieren muss, ist aber keine mehr. Dasselbe bei „Krüger, Sophia",
 * das nach dem Komma auseinanderfiel.
 *
 * Die Spalten dürfen dafür breiter werden; die Tabelle liegt in einer
 * .tabelle-huelle und kann waagerecht rollen. Lieber rollen als raten.
 */
td[data-spalte="Nummer"], td[data-spalte="Patient"], td[data-spalte="Rechnung"],
td[data-spalte="Partner"], td[data-spalte="Behandler"], td[data-spalte="Leistung"],
td[data-spalte="Telefon"], td[data-spalte="Geburtsdatum"], td[data-spalte="Name"],
td[data-spalte="E-Mail"], td[data-spalte="Zeitraum"], td[data-spalte="Status"],
.rechnungsnummer, .haupt > a, a.zeile-link.haupt{white-space:nowrap}

/*
 * Kennzahlen gleichmässig verteilen.
 *
 * Mit `auto-fit` füllte die letzte Kachel den Rest der Zeile aus — bei vier
 * Kacheln standen drei oben und eine allein darunter, schmaler als die
 * anderen. `auto-fill` lässt die Spaltenbreite gleich, egal wie viele
 * Kacheln es gibt, und die Reihe bricht sauber um.
 */
.kennzahlen{grid-template-columns:repeat(auto-fill,minmax(190px,1fr))}
.kennzahlen.ausfuehrlich{grid-template-columns:repeat(auto-fill,minmax(210px,1fr))}

.entwurf-leiste{display:flex;align-items:center;gap:var(--s3);flex-wrap:wrap;
  margin:0 0 var(--s4);padding:9px 12px;border-radius:var(--radius-sm);
  background:var(--green-light);border:1px solid var(--green-mid);
  font-size:var(--t-sm);color:var(--green-dark)}
.entwurf-leiste span{flex:1;min-width:180px}
.entwurf-leiste .btn-klein{flex-shrink:0}

details.filterwahl{position:relative;display:inline-block}
details.filterwahl>summary::before{content:none}
details.filterwahl>summary{display:inline-flex;align-items:center;gap:7px;cursor:pointer;list-style:none;
  padding:6px 11px;border:1px solid var(--line);border-radius:var(--radius-sm);
  font-size:var(--t-sm);color:var(--text);background:#fff;white-space:nowrap}
details.filterwahl>summary::-webkit-details-marker{display:none}
details.filterwahl>summary::marker{content:""}
details.filterwahl>summary:hover{background:var(--bg)}
details.filterwahl>summary svg{width:15px;height:15px;flex-shrink:0;color:var(--muted)}
details.filterwahl>summary svg:last-child{width:13px;height:13px;transform:rotate(90deg);transition:transform .12s}
details.filterwahl[open]>summary svg:last-child{transform:rotate(-90deg)}
/* Gesetzter Filter wird erkennbar, ohne die Liste zu öffnen. */
details.filterwahl[data-gesetzt]>summary{border-color:var(--green);color:var(--green);font-weight:600}
details.filterwahl[data-gesetzt]>summary svg:first-child{color:var(--green)}

.filterwahl-liste{position:absolute;z-index:40;top:calc(100% + 4px);left:0;min-width:210px;
  background:#fff;border:1px solid var(--line);border-radius:var(--radius-sm);
  box-shadow:0 8px 24px rgba(0,0,0,.10);padding:4px;max-height:60vh;overflow-y:auto}
.filterwahl-liste a{display:flex;align-items:center;justify-content:space-between;gap:var(--s3);
  padding:7px 10px;border-radius:calc(var(--radius-sm) - 2px);
  font-size:var(--t-sm);color:var(--text);text-decoration:none}
.filterwahl-liste a:hover{background:var(--bg);text-decoration:none}
.filterwahl-liste a.aktiv{background:var(--green);color:#fff;font-weight:600}
/* Nach rechts ausgerichtet, wenn der Knopf am rechten Rand sitzt. */
.filterwahl.rechts .filterwahl-liste{left:auto;right:0}
/*
 * Blättern steht direkt neben der Ansichtswahl. Die Pfeile liegen
 * nebeneinander, „Heute" dahinter — so bleiben beide Pfeile an derselben
 * Stelle, egal ob „Heute" gerade sichtbar ist. Wer mehrfach weiterblättert,
 * trifft jedes Mal denselben Punkt.
 */
.blaettern{display:inline-flex;gap:var(--s2);align-items:center}
.blaettern .btn-zweit{padding:6px 12px}

.trefferliste{border:1px solid var(--line);border-radius:var(--radius-sm);margin-top:4px;max-height:180px;
  overflow-y:auto;background:#fff}
.trefferliste:empty{display:none}
.treffer{padding:8px 11px;cursor:pointer;font-size:var(--t-base);border-bottom:1px solid var(--line)}
.treffer:last-child{border-bottom:0}
.treffer:hover,.treffer.markiert{background:var(--green-light)}
.treffer small{display:block;color:var(--muted);font-size:var(--t-xs)}

.svg-chart{width:100%;height:150px;display:block}
.legende{display:flex;gap:var(--s5);font-size:var(--t-sm);margin-top:var(--s3);flex-wrap:wrap}
.legende span{display:inline-flex;align-items:center;gap:6px;color:var(--ink-2)}
.punkt{width:9px;height:9px;border-radius:50%;display:inline-block}

/* ─── Beschreibungslisten ──────────────────────────────────── */

.daten{display:grid;grid-template-columns:repeat(auto-fit,minmax(210px,1fr));gap:var(--s4) var(--s5)}
.daten > div > dt{font-size:var(--t-xs);color:var(--muted);margin-bottom:2px}
.daten > div > dd{margin:0;font-size:var(--t-base);color:var(--ink)}

/* ═══════════════════════════════════════════════════════════════
   Zwischenmessung: Skalen von 1 bis 10 und das Körperschema
   ═══════════════════════════════════════════════════════════════

   Die Skala ist eine Reihe von Radiofeldern, deren Beschriftungen wie Knöpfe
   aussehen. Bewusst nicht mit <button> gebaut: Radiofelder tragen die Auswahl
   von sich aus im Formular, lassen sich mit den Pfeiltasten bedienen und
   werden von Vorlesesoftware als Gruppe angesagt. Das eigentliche Feld liegt
   nur optisch verborgen, nicht mit display:none — sonst wäre es auch für die
   Tastatur weg. */

.skala { display: flex; gap: 5px; flex-wrap: wrap; }

.skala input[type="radio"] {
  position: absolute;
  opacity: 0;
  width: 0;
  height: 0;
  pointer-events: none;
}

.skala label {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  /* 44 Pixel ist die kleinste Fläche, die sich am Tablet zuverlässig mit dem
     Finger trifft — und die Messung entsteht am Tablet, nicht mit der Maus. */
  min-width: 44px;
  height: 44px;
  padding: 0 4px;
  border: 1px solid var(--line-strong);
  border-radius: var(--radius-sm);
  background: var(--card);
  color: var(--ink);
  font-variant-numeric: tabular-nums;
  cursor: pointer;
  transition: background var(--motion-schnell), border-color var(--motion-schnell);
}

.skala label:hover { border-color: var(--green-mid); color: var(--green); }

.skala input[type="radio"]:checked + label {
  background: var(--green);
  border-color: var(--green);
  color: #fff;
}

/* Der Fokusring gehört sichtbar an die Beschriftung, weil das Feld selbst
   unsichtbar ist. Ohne das wüsste niemand, wo die Tastatur gerade steht. */
.skala input[type="radio"]:focus-visible + label {
  outline: 2px solid var(--fokus);
  outline-offset: 2px;
}

.skala-enden {
  display: flex;
  justify-content: space-between;
  gap: var(--s3);
  margin-top: 7px;
  font-size: var(--t-xs);
  color: var(--muted);
}

/* ── Körperschema ── */

.koerper-ansichten {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
  gap: var(--s3);
}

.koerper-ansicht { text-align: center; }

.koerper-ansicht h4 {
  margin: 0 0 var(--s2);
  font-size: var(--t-xs);
  font-weight: 650;
  color: var(--muted);
  text-transform: uppercase;
  letter-spacing: .03em;
}

.koerper-ansicht svg {
  width: 100%;
  max-width: 190px;
  height: auto;
  border: 1px solid var(--line);
  border-radius: var(--radius);
  background: var(--card);
  touch-action: manipulation;   /* kein Doppeltipp-Zoom beim Setzen */
}

.koerper-ansicht .koerper { fill: var(--green-light); stroke: none; }

/* Die Trefferfläche liegt über der ganzen Ansicht und ist unsichtbar. Ohne
   sie trifft man schmale Stellen wie Hals oder Handgelenk am Tablet kaum. */
.koerper-ansicht .hit { fill: transparent; cursor: crosshair; }

.koerper-ansicht .mk { cursor: pointer; }
.koerper-ansicht .mk circle { stroke: #fff; stroke-width: 2; }
.koerper-ansicht .mk text {
  fill: #fff;
  font-size: 13px;
  font-weight: 650;
  text-anchor: middle;
  dominant-baseline: central;
  pointer-events: none;
}

/* Der gewählte Modus muss sichtbar sein: Wer auf „Narbe" gestellt hat und es
   nicht merkt, setzt lila Kreuze, wo er Schmerzpunkte wollte. */
.modus.aktiv {
  background: var(--green);
  border-color: var(--green);
  color: #fff;
}

/* Gegenüberstellung der Messungen: Frage links, Zeitpunkte daneben.
   Die Frage bleibt beim seitlichen Scrollen stehen — ohne sie ist eine Zahl
   in der vierten Spalte nur eine Zahl. */
.mess-vergleich td:first-child,
.mess-vergleich th:first-child {
  position: sticky;
  left: 0;
  background: var(--card);
  z-index: 1;
}

.mess-vergleich td { font-variant-numeric: tabular-nums; }

.mess-vergleich .gruppenzeile td {
  padding-top: var(--s4);
  font-size: var(--t-xs);
  font-weight: 650;
  color: var(--muted);
  text-transform: uppercase;
  letter-spacing: .03em;
  background: var(--card);
}

/* Vorschau der getippten Unterschrift, wie im Anamnesebogen. Sie soll aussehen
   wie das, was gleich im Vertrag steht — sonst überrascht das Ergebnis. */
.sig-vorschau {
  margin-top: var(--s3);
  min-height: 78px;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: var(--s3);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  background: #fff;
  font-family: "Snell Roundhand", "Apple Chancery", "Segoe Script", "Brush Script MT", cursive;
  font-style: italic;
  font-size: 30px;
  color: var(--ink);
  word-break: break-word;
  text-align: center;
}
.sig-vorschau .muted {
  font-family: inherit;
  font-style: normal;
  font-size: var(--t-sm);
}

/* Ein Vertragstext braucht Platz. Der Regeldialog ist auf 620 Pixel begrenzt —
   richtig für eine Handvoll Felder, zu schmal für sechzehn Zeilen Fliesstext,
   die man beim Schreiben im Zusammenhang sehen muss. */
dialog.dialog-breit { max-width: 980px; }

.vorlage-arbeitsflaeche {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: var(--s4);
  align-items: start;
}
@media (max-width: 880px) {
  .vorlage-arbeitsflaeche { grid-template-columns: 1fr; }
}

.vorlage-arbeitsflaeche textarea {
  min-height: 420px;
  line-height: var(--lh-normal);
  font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
  font-size: var(--t-sm);
  resize: vertical;
}

/* Die Vorschau zeigt denselben Text, wie ihn der Unterzeichner später sieht.
   Ohne sie schreibt man blind: Überschriften, Absätze und offene Platzhalter
   fallen erst auf, wenn der Vertrag schon verschickt ist. */
.vorlage-vorschau {
  border: 1px solid var(--line);
  border-radius: var(--radius);
  background: var(--bg);
  padding: var(--s4);
  min-height: 420px;
  max-height: 60vh;
  overflow-y: auto;
  font-size: var(--t-sm);
  line-height: var(--lh-weit);
  white-space: pre-wrap;
}
.vorlage-vorschau h3 { margin: var(--s4) 0 var(--s2); font-size: var(--t-md); }
.vorlage-vorschau h3:first-child { margin-top: 0; }

/* Ein noch nicht ersetzter Platzhalter muss ins Auge fallen. Im fertigen
   Vertrag stünde sonst „{{geburtsdatum}}" und niemand hätte es gesehen. */
.vorlage-vorschau .platzhalter {
  background: var(--amber-light);
  border-radius: var(--radius-xs);
  padding: 1px 5px;
  font-size: var(--t-xs);
}

/* Platzhalter zum Anklicken statt zum Abtippen. Ein vertippter Platzhalter
   wird stillschweigend nie ersetzt. */
.platzhalter-leiste { display: flex; flex-wrap: wrap; gap: 6px; margin-top: var(--s2); }
.platzhalter-leiste button {
  font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
  font-size: var(--t-xs);
  padding: 3px 8px;
  border: 1px solid var(--line-strong);
  border-radius: var(--radius-pille);
  background: var(--card);
  color: var(--muted);
  cursor: pointer;
}
.platzhalter-leiste button:hover { border-color: var(--green-mid); color: var(--green); }

/* Kennzahlen, die irgendwohin führen. Wer „295,00 € offen" liest, will wissen,
   wer nicht gezahlt hat — und klickt darauf. */
.kennzahl-klickbar {
  text-decoration: none;
  color: inherit;
  transition: border-color var(--motion-schnell), transform var(--motion-schnell);
}
.kennzahl-klickbar:hover {
  border-color: var(--green-mid);
  transform: translateY(-1px);
}
.kennzahl-klickbar:hover .bez { color: var(--green); }


/* ── Tagesliste: Status am linken Rand ──────────────────────────────────
 *
 * Wer morgens auf die Übersicht schaut, will den Tag in einer Sekunde lesen,
 * nicht Zeile für Zeile die Statusspalte am rechten Rand abgleichen. Ein
 * schmaler Streifen am Zeilenanfang trägt den Zustand dorthin, wo das Auge
 * ohnehin beginnt.
 *
 * Die Farbe steht nie allein — rechts in der Zeile bleibt das Wort bzw. das
 * Knopfpaar. Rot-Grün-Schwäche ist die häufigste Farbfehlsichtigkeit, und ein
 * Streifen allein wäre für diese Menschen keine Information.
 */
tr[class*="tagzeile"] > td:first-child{position:relative;padding-left:calc(var(--s3) + 6px)}
tr[class*="tagzeile"] > td:first-child::before{
  content:"";position:absolute;left:0;top:50%;transform:translateY(-50%);
  width:3px;height:22px;border-radius:var(--radius-pille);background:var(--line-strong);
}
/*
 * Das fuehrende tr ist noetig, nicht Zierde: Die allgemeine Regel darueber
 * benutzt einen Attributselektor und wiegt damit genauso schwer wie eine
 * Klasse. Ohne tr verlieren diese vier Regeln, und jede Zeile bliebe grau --
 * gemessen, nicht vermutet.
 */
tr.tagzeile-kommt    > td:first-child::before{background:var(--blau-mid)}
tr.tagzeile-offen    > td:first-child::before{background:var(--amber)}
tr.tagzeile-erledigt > td:first-child::before{background:var(--green-mid)}
tr.tagzeile-ausfall  > td:first-child::before{background:var(--red)}

/* Vergangene, bereits entschiedene Zeilen treten zurück: Der Tag, der noch
   kommt, ist das Wichtigere. Nicht ausgrauen, nur leicht zurücknehmen. */
.tagzeile-erledigt{color:var(--muted)}

/* ── Wartezimmer-Zustand in der Zeitspalte ─────────────────────────────
 *
 * Zweite Zeile unter der Uhrzeit, bewusst klein und ruhig: Sie beantwortet
 * „wo steht dieser Termin gerade", ohne der Uhrzeit die Hauptrolle zu nehmen.
 *
 * „ist da" ist ein Knopf, der nicht wie einer aussieht, bis man darauf zeigt.
 * Er steht in jeder Zeile des Tages — als Knopf gestaltet waere die Liste eine
 * Knopfleiste, und die Uhrzeiten gingen darin unter.
 */
.zeitzeile-form{display:block;margin-top:2px}
.zeitzeile{
  display:inline-block;font-size:var(--t-2xs);line-height:1.4;
  color:var(--muted);font-weight:500;
}
button.zeitzeile{
  background:none;border:1px solid transparent;border-radius:var(--radius-pille);
  padding:1px 7px;margin-left:-7px;cursor:pointer;font-family:inherit;
  transition:background var(--motion-schnell) var(--motion-kurve),
             border-color var(--motion-schnell) var(--motion-kurve);
}
button.zeitzeile.knopf{color:var(--blau)}
button.zeitzeile.knopf:hover{background:var(--blau-light);border-color:var(--blau-mid)}
button.zeitzeile.wartet{color:var(--green-mid);font-weight:600}
button.zeitzeile.wartet:hover{background:var(--green-light);border-color:var(--green-mid)}
/* Ab einer Viertelstunde ist Warten kein Zustand mehr, sondern ein Problem. */
button.zeitzeile.wartet.lang{color:var(--amber)}
button.zeitzeile.wartet.lang:hover{background:var(--amber-light);border-color:var(--amber)}
.zeitzeile.laeuft{color:var(--blau);font-weight:600}

/* ── Laufende Behandlung: das leise Band ───────────────────────────────
 *
 * Eine Zeile unter der Kopfzeile, auf jeder Seite. Sie unterbricht nichts und
 * verdeckt nichts — wer sie ignoriert, verliert nichts, weil der Nachtlauf
 * jede vergessene Behandlung schliesst. Sie ist Rueckmeldung, keine Warnung,
 * und deshalb blau und nicht bernstein.
 */
.laufband{
  display:flex;align-items:center;gap:var(--s3);
  margin:0 0 var(--s4);padding:var(--s2) var(--s4);
  background:var(--blau-light);border:1px solid var(--blau-mid);
  border-radius:var(--radius);font-size:var(--t-sm);color:var(--blau);
}
/*
 * Der Name darf nicht umbrechen. Auf Tabletbreite stand er sonst ueber drei
 * Zeilen und machte aus dem Band einen Block -- im Test gesehen, nicht
 * vermutet. Lieber abschneiden: Wer die Behandlung fuehrt, weiss, wen er vor
 * sich hat; das Band erinnert nur daran, dass die Uhr laeuft.
 */
.laufband b{font-weight:620;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}
/* Auf schmalen Geraeten faellt die Leistung weg, bevor der Name leidet. */
@media (max-width:640px){.laufband .still{display:none}}
.laufband .still{color:var(--blau-mid);font-weight:460}
.laufband .dauer{margin-left:auto;font-variant-numeric:tabular-nums;font-weight:620}
.laufband a{color:var(--blau);text-decoration:underline;text-underline-offset:2px}
/* Der Punkt pulst langsam — die einzige Bewegung auf der Seite, und sie sagt
   genau eine Sache: hier laeuft gerade etwas. */
.laufband .punkt{
  width:7px;height:7px;border-radius:50%;background:var(--blau-mid);flex:none;
  animation:laufband-puls 2.4s var(--motion-kurve) infinite;
}
@keyframes laufband-puls{0%,100%{opacity:1}50%{opacity:.35}}
@media (prefers-reduced-motion:reduce){.laufband .punkt{animation:none}}

/* ── Folgeempfehlung: die Chip-Reihe ───────────────────────────────────
 *
 * Der eine Griff, der die Behandlung beendet. Er steht im Behandlungsraum,
 * waehrend der Patient noch da ist — also muss er mit dem Daumen auf einem
 * iPad treffbar sein: 44px Hoehe, grosszuegige Abstaende, kein Zielen.
 *
 * Sieben Spannen und nicht mehr. Eine laengere Liste waere vollstaendiger und
 * langsamer, und Vollstaendigkeit hilft niemandem, der einen Menschen vor sich
 * hat.
 */
.karte-laufend{border-color:var(--blau-mid);box-shadow:var(--shadow)}
.karte-laufend .karte-kopf{background:var(--blau-light);border-bottom-color:var(--blau-mid)}
.karte-laufend .karte-kopf h2{color:var(--blau)}
.karte-laufend .laufzeit{
  font-size:var(--t-lg);font-weight:660;color:var(--blau);
  font-variant-numeric:tabular-nums;
}

.chips{display:flex;flex-wrap:wrap;gap:var(--s2);margin:var(--s3) 0}
.chips-zweit{display:flex;flex-wrap:wrap;gap:var(--s2);margin-top:var(--s3);
  padding-top:var(--s3);border-top:1px solid var(--line)}
.chip{
  display:inline-flex;align-items:center;justify-content:center;
  min-height:44px;padding:0 var(--s4);
  background:var(--card);border:1px solid var(--line-strong);
  border-radius:var(--radius-pille);
  font-size:var(--t-base);font-weight:560;color:var(--ink);
  font-family:inherit;cursor:pointer;list-style:none;
  transition:border-color var(--motion-schnell) var(--motion-kurve),
             background var(--motion-schnell) var(--motion-kurve),
             color var(--motion-schnell) var(--motion-kurve);
}
/*
 * Browser setzen vor jedes <summary> ein Dreieck. Es ist hier falsch: Diese
 * Chips sehen aus wie Knoepfe und verhalten sich so -- das Dreieck verraet
 * eine technische Entscheidung, die den Benutzer nichts angeht. Beide
 * Schreibweisen, weil Chrome und Firefox unterschiedliche benutzen.
 */
/*
 * Das Dreieck vor <summary> laesst sich nicht wegstylen, solange das summary
 * selbst ein Flex-Container ist: Chrome macht den Marker dann zu einem
 * Flex-Element und ignoriert list-style. Gemessen, nicht vermutet -- erst
 * display:inline-block beseitigt ihn zuverlaessig.
 *
 * Die Zentrierung uebernimmt dann line-height statt align-items. Das ist der
 * aeltere Weg, aber hier der einzige, der funktioniert.
 */
/*
 * Das Dreieck kam nicht vom Browser, sondern aus dem eigenen Stylesheet:
 * `details:not(.karte) > summary` setzt weiter oben ein ::before, damit
 * aufklappbare Felder als solche erkennbar sind. Fuer diese Chips ist das
 * falsch -- sie sehen aus wie Knoepfe und sollen sich so verhalten.
 *
 * Die Regel muss denselben Zuschnitt haben, sonst verliert sie: `.chip`
 * allein waere weniger spezifisch als `details:not(.karte) > summary`.
 * Dieselbe Loesung benutzt bereits die Filterwahl weiter oben.
 */
details.chip-aufklapp > summary::before{content:none}
details.chip-aufklapp > summary{
  display:inline-flex;align-items:center;justify-content:center;
  padding:0 var(--s4);border:1px solid var(--line-strong);
  border-radius:var(--radius-pille);color:var(--ink);font-weight:560;
}
details.chip-aufklapp > summary::-webkit-details-marker{display:none}
details.chip-aufklapp > summary::marker{content:""}
.chip:hover{border-color:var(--blau-mid);background:var(--blau-light);color:var(--blau)}
.chip:focus-visible{outline:none;box-shadow:var(--fokus)}
/* Abschluss und Abbruch sind keine Spannen — sie beenden die Serie und werden
   deshalb abgesetzt, nicht eingereiht. */
.chip-abgeschlossen:hover{border-color:var(--green-mid);background:var(--green-light);color:var(--green-mid)}
.chip-abgebrochen:hover{border-color:var(--amber);background:var(--amber-light);color:var(--amber)}
.chip-aufklapp[open] > .chip{border-color:var(--blau-mid);background:var(--blau-light);color:var(--blau)}
.chip-grund{
  margin-top:var(--s3);padding:var(--s4);background:var(--bg);
  border:1px solid var(--line);border-radius:var(--radius);
  display:flex;flex-direction:column;gap:var(--s2);min-width:min(420px,100%);
}
.chip-grund label{font-size:var(--t-xs);color:var(--muted);font-weight:560}
.spanne-felder{display:flex;align-items:center;gap:var(--s2)}
.spanne-felder input{width:6.5rem}
.chip-aufklapp{position:relative}

/* ── Theke: Zulauf links, Abgang rechts ───────────────────────────────── */
.theke{display:grid;grid-template-columns:minmax(260px,1fr) minmax(360px,1.4fr);gap:var(--s4);align-items:start}
@media (max-width:900px){.theke{grid-template-columns:1fr}}

.theke-liste{display:flex;flex-direction:column;gap:0}
.theke-zeile{display:flex;align-items:center;gap:var(--s3);padding:var(--s3) 0;border-bottom:1px solid var(--line)}
.theke-zeile:last-child{border-bottom:none}
.theke-zeile .punkt{width:7px;height:7px;border-radius:50%;background:var(--line-strong);flex:none}
.theke-zeile .punkt.aktiv{background:var(--blau-mid);animation:laufband-puls 2.4s var(--motion-kurve) infinite}
@media (prefers-reduced-motion:reduce){.theke-zeile .punkt.aktiv{animation:none}}
.theke-wer{display:flex;flex-direction:column;min-width:0;flex:1}
.theke-wer .still{font-size:var(--t-2xs);color:var(--muted)}
.theke-zeit{font-size:var(--t-xs);color:var(--muted);font-variant-numeric:tabular-nums;white-space:nowrap}
.theke-zeile.laeuft .theke-zeit{color:var(--blau);font-weight:600}

.theke-abgang{padding:var(--s4) 0;border-bottom:1px solid var(--line)}
.theke-abgang:last-child{border-bottom:none}
.theke-abgang:first-child{padding-top:0}
.theke-abgang-kopf{display:flex;align-items:baseline;gap:var(--s2);flex-wrap:wrap}
.theke-abgang-kopf .still{font-size:var(--t-xs);color:var(--muted)}
.theke-empfehlung{margin:var(--s2) 0 var(--s3);font-size:var(--t-sm)}
.theke-empfehlung .still{color:var(--muted);font-weight:440}
.theke-vorschlaege{display:flex;flex-wrap:wrap;gap:var(--s2);align-items:center}
/* Die Kasse steht unter dem Termin, nicht daneben: erst wann, dann was. */
.theke-kasse{margin:var(--s3) 0 0;font-size:var(--t-sm);color:var(--amber)}
.theke-kasse a{margin-left:var(--s2)}

/* ══════════════════════════════════════════════════════════════════════
 * FARBDURCHGANG — 11.10.2026
 *
 * Von Muhammed beauftragt: „Nun möchte ich auch etwas mehr Farbe im
 * gesamten System. Das ist mir zu viel Weißraum." Auf Rückfrage praezisiert:
 * „clean ist gut aber nicht so langweilig weiß."
 *
 * Damit ist die Richtung klar und sie widerspricht der Design-DNA nicht:
 * Der Weissraum bleibt, die Abstaende bleiben, die Ruhe bleibt. Was sich
 * aendert, sind die FLAECHEN -- sie waren fast alle weiss.
 *
 * Drei Eingriffe, mehr nicht:
 *   1. Die Seitenleiste traegt die Hausfarbe statt Weiss.
 *   2. Kartenkoepfe und Tabellenkoepfe bekommen einen leichten Ton, damit
 *      Abschnitte ohne Linien erkennbar sind.
 *   3. Der Seitenhintergrund wird eine Spur tiefer, damit weisse Karten
 *      darauf schweben statt zu verschwimmen.
 *
 * Bewusst NICHT geaendert: Abstaende, Schriftgroessen, Rundungen. Wer diesen
 * Block entfernt, hat exakt den vorherigen Zustand zurueck.
 * ══════════════════════════════════════════════════════════════════════ */

:root{
  /* Die Seitenleiste ist die einzige grosse dunkle Flaeche. Sie traegt die
     Marke und rahmt alles andere -- so machen es Linear, Notion und Figma. */
  --leiste-bg:#0D3200;
  --leiste-text:#D4E2CD;
  --leiste-still:#8EA486;
  --leiste-aktiv:#FFFFFF;
  /* Ein Ton, kein Farbauftrag: knapp ueber Weiss, nur so viel, dass das Auge
     eine Kante sieht, wo keine Linie ist. */
  --flaeche-kopf:#F1F5EE;
}

.sidebar{background:var(--leiste-bg);border-right:none}
.sidebar-brand{color:#FFFFFF}
.sidebar-brand small{color:var(--leiste-still)}
.nav-gruppe > span{color:var(--leiste-still)}
.nav a{color:var(--leiste-text)}
.nav a svg{opacity:.65}
.nav a:hover{background:rgba(255,255,255,.07);color:var(--leiste-aktiv)}
.nav a.aktiv{background:rgba(255,255,255,.12);color:var(--leiste-aktiv);font-weight:600}
.nav a.aktiv svg{opacity:1}
.sidebar-fuss{border-top:1px solid rgba(255,255,255,.12);color:var(--leiste-text)}
.sidebar-fuss:hover{background:rgba(255,255,255,.07)}
/* Die Suche sitzt auf der dunklen Flaeche und muss sich davon abheben,
   ohne wie ein Fremdkoerper zu wirken. */
.sidebar .suchfeld,.sidebar input[type="search"],.sidebar .suche{
  background:rgba(255,255,255,.08);border-color:rgba(255,255,255,.14);color:var(--leiste-text);
}
.sidebar .suchfeld::placeholder,.sidebar input::placeholder{color:var(--leiste-still)}

/* Karten- und Tabellenkoepfe: ein Ton statt Weiss. Erst dadurch sieht man,
   wo ein Abschnitt beginnt, ohne dass eine weitere Linie noetig waere. */
.karte-kopf{background:var(--flaeche-kopf)}
thead th{background:var(--flaeche-kopf)}

/* Der Seitenhintergrund eine Spur tiefer: Weisse Karten brauchen etwas, von
   dem sie sich abheben. Vorher lagen Weiss auf Fast-Weiss. */
body{background:#EDF2EA}

/* Nachtrag zum Farbdurchgang: Was im Fussbereich der Seitenleiste stand, war
 * noch auf hellen Grund gerechnet. --muted ist #45524B und auf dem dunklen
 * Gruen praktisch unsichtbar -- Muhammed hat es sofort gesehen.
 *
 * Der Pfeil trug seine Farbe fest im Markup und liess sich von hier gar nicht
 * erreichen; sie steht jetzt im Stylesheet, wo sie hingehoert. */
.sidebar-fuss .wer span{color:var(--leiste-still)}
.sidebar-fuss .fuss-pfeil{color:var(--leiste-still);flex-shrink:0}
.sidebar-fuss:hover .fuss-pfeil{color:var(--leiste-text)}

/* Bildmarke in der Seitenleiste. Sie steht vor dem Namen, nicht darüber:
 * Eine Zeile liest sich schneller als zwei, und die Leiste ist schmal.
 *
 * Beim Zusammenfahren bleibt sie stehen, während der Schriftzug verschwindet —
 * dann ist sie das Einzige, was von der Marke übrig bleibt. */
.sidebar-brand{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.marke-bild{display:block;flex:none;opacity:.95}
.sidebar-brand small{flex-basis:100%;margin-top:0}

/* ── GebüH-Ziffern nach Themengebiet (11.10.2026) ────────────────────────── */

.ziffer-gruppen { display: flex; flex-direction: column; gap: var(--s2); }

.ziffer-gruppe { margin: 0; }
.ziffer-gruppe > summary {
  display: flex; align-items: baseline; gap: var(--s3);
  padding: 10px var(--s3); cursor: pointer; flex-wrap: wrap;
}
.ziffer-gruppe > summary::-webkit-details-marker { display: none; }
.ziffer-gruppe[open] > summary { border-bottom: 1px solid var(--line); }

.ziffer-liste { padding: 4px 0; }

/*
 * Eine Zeile je Ziffer, als eigenes Formular: So geht jede Zeile einzeln ab,
 * ohne JavaScript und ohne dass ein Fehler in einer Zeile die anderen mitnimmt.
 */
.ziffer-zeile {
  display: grid;
  grid-template-columns: 3.4rem 1fr 5.5rem 5rem auto;
  align-items: center; gap: var(--s3);
  padding: 5px var(--s3);
  font-size: var(--t-sm);
}
.ziffer-zeile:hover { background: var(--flaeche-kopf); }

.ziffer-nr { font-variant-numeric: tabular-nums; font-weight: 620; color: var(--leiste-bg); }
.ziffer-text { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ziffer-betrag { text-align: right; font-variant-numeric: tabular-nums; padding: 3px 6px; }
.ziffer-spanne { font-size: var(--t-xs); white-space: nowrap; }

/* Auf engen Geräten kippt die Zeile, statt den Text abzuschneiden. */
@media (max-width: 720px) {
  .ziffer-zeile { grid-template-columns: 3.4rem 1fr; row-gap: 2px; }
  .ziffer-text { white-space: normal; grid-column: 2; }
  .ziffer-betrag, .ziffer-spanne, .ziffer-zeile button { grid-column: 2; justify-self: start; }
}

/* Häufig gebrauchte Ziffern, quer durch die Themengebiete. */
.ziffer-haeufig { margin-bottom: var(--s4); }
.ziffer-haeufig-kopf {
  display: flex; align-items: baseline; gap: var(--s3);
  margin-bottom: 8px; flex-wrap: wrap;
}
.ziffer-haeufig-kopf .muted { font-size: var(--t-xs); }
.ziffer-chips { display: flex; flex-wrap: wrap; gap: 6px; }
.ziffer-chip { display: inline-flex; align-items: baseline; gap: 6px; }
.ziffer-chip .ziffer-nr { font-size: var(--t-xs); }

/* Der Nebenweg an der Theke: lesbar, aber nicht lauter als der Normalfall. */
.theke-ohne-termin { display: inline-flex; align-items: center; gap: 5px; }
.theke-ohne-termin span { font-size: 1.05em; line-height: 1; }

/* ── Patientenwahl mit Vorschlägen (11.10.2026) ──────────────────────────
 *
 * Von Muhammed: „Ich sollte zumindest mal direkt n paar Namen sehen, und da
 * dann sauber ohne Lücken runterscrollen können."
 *
 * Deshalb hier eine hohe Liste statt der knappen Trefferbox: 180 Pixel zeigen
 * drei Namen, und drei Namen sind keine Auswahl, sondern ein Ausschnitt.
 */
.trefferliste-gross { max-height: 46vh; }
.trefferliste-gross:empty { display: block; }

/*
 * Die Treffer sind Knöpfe, keine Textzeilen — sie brauchen ihren eigenen
 * Grundzustand, sonst erbt jeder von ihnen das Aussehen eines Knopfes.
 */
.treffer {
  display: block; width: 100%; text-align: left;
  border: 0; border-bottom: 1px solid var(--line);
  background: none; font: inherit; color: var(--ink);
}
.treffer b { font-weight: 560; }
.treffer span { display: block; color: var(--muted); font-size: var(--t-xs); }
.treffer:hover span, .treffer.markiert span { color: var(--ink-2); }

.trefferliste-leer { padding: 18px 12px; margin: 0; text-align: center; font-size: var(--t-sm); }

.wahl-reiter { display: flex; gap: 6px; margin: 8px 0 0; flex-wrap: wrap; }
.wahl-reiter .chip { display: inline-flex; align-items: center; gap: 6px; }
.wahl-reiter .chip small {
  font-size: var(--t-2xs); padding: 0 5px; border-radius: 999px;
  background: var(--line); color: var(--muted); font-variant-numeric: tabular-nums;
}
.wahl-reiter .chip.aktiv { background: var(--green); color: #fff; border-color: var(--green); }
.wahl-reiter .chip.aktiv small { background: rgba(255,255,255,.26); color: #fff; }
.wahl-reiter .chip.leer { opacity: .5; }

/* Während einer Suche gelten die Reiter nicht — sie sucht über alle. */
.wahl-reiter.zurueck { opacity: .4; pointer-events: none; }

/* ══ Postfach: zwei Spalten wie in Outlook (11.10.2026) ══════════════════
 *
 * Liste links, Nachricht rechts. Beide Spalten scrollen für sich, damit das
 * Lesen einer langen Mail die Liste nicht verschiebt — der Grund, warum es
 * diesen Umbau gibt.
 */
.postfach-zwei {
  display: grid;
  grid-template-columns: minmax(300px, 400px) 1fr;
  gap: var(--s4);
  align-items: start;
}

.postfach-liste, .postfach-lesen {
  max-height: calc(100vh - 150px);
  display: flex; flex-direction: column;
  overflow: hidden;
}
.postfach-liste .karte-kopf { flex-shrink: 0; }

.mail-liste { overflow-y: auto; flex: 1; }

.mail-zeile {
  display: block; padding: 9px 12px;
  border-bottom: 1px solid var(--line);
  color: var(--ink-2); text-decoration: none;
  border-left: 3px solid transparent;
}
.mail-zeile:hover { background: var(--bg); text-decoration: none; }
.mail-zeile.offen { background: var(--green-light); border-left-color: var(--green); }

.mail-oben { display: flex; justify-content: space-between; gap: var(--s3); align-items: baseline; }
.mail-von { font-size: var(--t-sm); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.mail-datum { font-size: var(--t-xs); color: var(--muted); white-space: nowrap; flex-shrink: 0; }
.mail-betreff {
  display: block; font-size: var(--t-sm); color: var(--muted);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap; margin-top: 1px;
}
.mail-unten { display: flex; gap: 6px; align-items: center; margin-top: 4px; font-size: var(--t-xs); }

/* Ungelesenes trägt Gewicht — das ist der einzige Unterschied, den man
 * beim Überfliegen wirklich braucht. */
.mail-zeile.ungelesen .mail-von { font-weight: 660; color: var(--ink); }
.mail-zeile.ungelesen .mail-betreff { color: var(--ink-2); font-weight: 520; }

/*
 * Das hidden-Attribut schlaegt die Anzeigeart. Ohne diese Zeile gewinnt das
 * display:flex darunter, und leerer Zustand und Nachricht stehen beide da.
 */
.postfach-lesen > [hidden] { display: none; }
.postfach-lesen > #mailInhalt { display: flex; flex-direction: column; min-height: 0; flex: 1; }
.postfach-lesen .karte-koerper { overflow-y: auto; flex: 1; }
.mail-text {
  white-space: pre-wrap; font-size: var(--t-base);
  line-height: var(--lh-weit); margin-top: var(--s4);
}
.mail-zuweisung { padding-bottom: var(--s3); border-bottom: 1px solid var(--line); }

/* Während die Nachricht geholt wird, blasst der alte Inhalt ab, statt zu
 * verschwinden: Ein leerer Kasten wirkt wie ein Fehler, ein blasser wie ein
 * Vorgang. */
#mailInhalt.laedt { opacity: .55; }

/* Unter 1000 px passen zwei Spalten nicht mehr nebeneinander. */
@media (max-width: 1000px) {
  .postfach-zwei { grid-template-columns: 1fr; }
  .postfach-liste, .postfach-lesen { max-height: none; }
  .mail-liste { max-height: 40vh; }
}

/* Antworten im Postfach: zugeklappt, weil öfter gelesen als geschrieben wird. */
.mail-antwort { margin-top: var(--s4); border-top: 1px solid var(--line); padding-top: var(--s3); }
.mail-antwort > summary { cursor: pointer; font-weight: 600; font-size: var(--t-sm); }
.mail-antwort > summary::-webkit-details-marker { display: none; }
.mail-antwort-form { margin-top: var(--s3); }
.mail-antwort-form textarea { width: 100%; font: inherit; line-height: var(--lh-weit); }
.mail-antwort-fuss { display: flex; gap: var(--s3); align-items: center; flex-wrap: wrap; }
.mail-antwort-fuss .muted { font-size: var(--t-xs); }

/* ── Leseansicht: Nachricht statt Textdokument (11.10.2026) ──────────────
 *
 * Von Muhammed: „Stelle die Ansicht der Mails modern und clean dar, nicht so
 * textdokumentartig."
 *
 * Drei Eingriffe: eine Lesebreite, die das Auge hält; der zitierte Verlauf
 * weggeklappt; die Signatur leise. Der Rest ist Ruhe.
 */
.mail-text {
  /* 68 Zeichen sind die Breite, bei der das Auge die nächste Zeile noch
     findet, ohne zu suchen. Darüber beginnt man Zeilen zu überspringen. */
  max-width: 68ch;
  font-size: var(--t-base);
  line-height: 1.65;
  overflow-wrap: anywhere;   /* lange Verweise sprengen die Spalte nicht */
}

.mail-signatur {
  max-width: 68ch; margin: var(--s4) 0 0;
  font-size: var(--t-xs); color: var(--muted);
  white-space: pre-wrap; overflow-wrap: anywhere;
  padding-top: var(--s3); border-top: 1px dashed var(--line);
}

.mail-verlauf { margin-top: var(--s4); max-width: 68ch; }
.mail-verlauf > summary {
  cursor: pointer; font-size: var(--t-xs); color: var(--muted);
  display: inline-flex; align-items: center; gap: 6px;
  padding: 3px 10px; border: 1px solid var(--line); border-radius: 999px;
  background: var(--bg); list-style: none;
}
.mail-verlauf > summary::-webkit-details-marker { display: none; }
.mail-verlauf > summary:hover { color: var(--ink-2); border-color: var(--green-mid); }
.mail-zitat {
  margin-top: var(--s3); padding-left: var(--s4);
  border-left: 2px solid var(--line);
  white-space: pre-wrap; font-size: var(--t-sm);
  color: var(--muted); line-height: 1.6; overflow-wrap: anywhere;
}

/* Kopf der Nachricht: Betreff trägt, Absender ordnet ein. */
.postfach-lesen .karte-kopf h2 { line-height: 1.35; overflow-wrap: anywhere; }
.postfach-lesen .karte-kopf .hinweis { overflow-wrap: anywhere; }

/* ── Band für fällige Checklisten (11.10.2026) ───────────────────────────
 *
 * Gebaut wie das Laufband der Behandlung: eine Zeile unter dem Seitenkopf,
 * die nichts blockiert. Wer sie ignoriert, arbeitet weiter — sie kommt von
 * selbst wieder.
 */
.sopband {
  display: flex; align-items: center; gap: var(--s3); flex-wrap: wrap;
  /*
   * position:relative ist hier keine Formsache, sondern die Voraussetzung
   * dafuer, dass .sopband-oeffnen::after sich auf DIESES Band bezieht.
   *
   * Ohne sie sucht sich die absolut gesetzte Flaeche den naechsten
   * positionierten Vorfahren -- am 11.10.2026 war das ein Element weit
   * oberhalb, und die Klickflaeche des 49 Pixel hohen Bandes reichte bis ans
   * Seitenende. Jeder Tipp auf den Inhalt oeffnete die Checkliste.
   */
  position: relative;
  padding: 8px var(--s5);
  background: var(--green-light);
  border-bottom: 1px solid var(--line);
  font-size: var(--t-sm);
}
.sopband .punkt { background: var(--green); width: 8px; height: 8px; }
.sopband .still { color: var(--muted); font-size: var(--t-xs); }
.sopband-form { display: flex; align-items: center; gap: 6px; margin-left: auto; flex-wrap: wrap; }
.sopband-form select { font-size: var(--t-xs); padding: 3px 8px; width: auto; }

/*
 * Ab dem zweiten Verschieben etwas wärmer im Ton — nicht rot. Rot heisst in
 * diesem System „da ist etwas kaputt"; hier ist nur etwas liegen geblieben.
 */
.sopband.nachdruck { background: #FDF4E3; border-bottom-color: #E8D5A9; }
.sopband.nachdruck .punkt { background: #B5802A; }

@media (max-width: 700px) {
  .sopband { padding: 8px var(--s4); }
  .sopband-form { margin-left: 0; width: 100%; }
}

/* Zeitplan je Checkliste, aufklappbar in der Übersicht. */
.plan-wahl > summary { cursor: pointer; font-size: var(--t-xs); }
.plan-wahl > summary::-webkit-details-marker { display: none; }
.plan-form { display: flex; flex-wrap: wrap; gap: var(--s3); align-items: end; margin-top: 8px; }
.plan-form label { display: flex; flex-direction: column; gap: 2px; font-size: var(--t-xs); color: var(--muted); }
.plan-form select, .plan-form input { width: auto; font-size: var(--t-sm); }

/* ── Zahlen in der Navigation (11.10.2026) ───────────────────────────────
 *
 * Von Muhammed: „Bitte nicht als langen Text. Das macht es nur
 * unübersichtlich. Eventuell durch einen Effekt, oder durch eine
 * Hervorhebung, oder Farbbalken."
 *
 * Eine Zahl statt eines Punktes: „3" sagt, ob es sich lohnt, jetzt
 * hinzusehen — ein Punkt sagt nur, dass irgendetwas da ist. Dazu ein
 * schmaler Balken am linken Rand, der auch in der zusammengefahrenen
 * Leiste noch sichtbar ist, wo keine Zahl mehr Platz hat.
 */
.nav a { position: relative; }

.nav-zahl {
  margin-left: auto;
  min-width: 18px; padding: 1px 6px;
  border-radius: 999px;
  background: var(--green); color: #fff;
  font-size: var(--t-2xs); font-weight: 650;
  font-variant-numeric: tabular-nums; text-align: center;
  flex-shrink: 0;
}
.nav a.aktiv .nav-zahl { background: var(--green-dark); }

/* Der Balken trägt die Nachricht, wenn die Zahl nicht mehr hineinpasst. */
.nav a.hat-offenes::before {
  content: ""; position: absolute; left: 0; top: 7px; bottom: 7px;
  width: 3px; border-radius: 0 2px 2px 0; background: var(--green);
}

.app.nav-schmal .nav-zahl { display: none; }
.app.nav-schmal .sidebar:hover .nav-zahl,
.app.nav-schmal .sidebar:focus-within .nav-zahl { display: inline-block; }

/*
 * Die Zahlen auf der dunklen Leiste.
 *
 * Der Grundentwurf setzte sie in --green auf --green: auf einer hellen
 * Seitenleiste richtig, auf der dunklen seit dem Farbdurchgang unsichtbar.
 * Hier tragen helle Fläche und dunkle Schrift.
 */
.sidebar .nav-zahl { background: var(--leiste-text); color: var(--leiste-bg); }
.sidebar .nav a.aktiv .nav-zahl { background: #FFFFFF; color: var(--leiste-bg); }
.sidebar .nav a.hat-offenes::before { background: var(--leiste-text); }

/* ── Band und „als Nächstes" anklickbar (11.10.2026) ─────────────────────
 *
 * Von Muhammed: „Ich will, dass die Checkliste durch Klicken auf den Balken
 * auch schon öffnet, nicht extra Öffnen anklicken müssen."
 *
 * Der Verweis spannt sich über das ganze Band. „Später" liegt darüber und
 * bleibt eigenständig — sonst verschöbe man beim Öffnen versehentlich.
 */
.sopband-oeffnen {
  display: flex; align-items: center; gap: var(--s3);
  color: inherit; text-decoration: none; flex: 1; min-width: 0;
}
.sopband-oeffnen::after { content: ""; position: absolute; inset: 0; }
.sopband-oeffnen:hover { text-decoration: none; }
/*
 * cursor:pointer steht ausserhalb von :hover.
 *
 * Auf einem iPad gibt es kein :hover -- die Regel darin wird also nie
 * angewandt. Safari auf iOS liefert Antippen an ein Element aber nur dann
 * zuverlaessig aus, wenn es als anklickbar erkennbar ist. Eine Flaeche, die
 * ihre Anklickbarkeit erst beim Darueberfahren bekommt, bleibt auf dem Tablet
 * tot.
 */
.sopband { cursor: pointer; }
.sopband:hover { filter: brightness(.97); }
.sopband-oeffnen b { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.sopband-pfeil { opacity: .45; flex-shrink: 0; }
.sopband:hover .sopband-pfeil { opacity: .8; }

/* Die Bedienelemente liegen über der aufgespannten Fläche. */
.sopband-form { position: relative; z-index: 1; }

/* „Als Nächstes" auf der Übersicht — dieselbe Idee, ruhiger im Ton. */
.sop-naechste {
  display: flex; align-items: center; gap: var(--s3);
  margin: var(--s3) var(--s5) 0;
  padding: 8px 12px; border-radius: var(--radius-sm);
  background: var(--bg); border: 1px solid var(--line);
  color: var(--ink-2); text-decoration: none; font-size: var(--t-sm);
}
.sop-naechste:hover { border-color: var(--green-mid); color: var(--ink); text-decoration: none; }
.sop-naechste-zeit { color: var(--muted); font-size: var(--t-xs); white-space: nowrap; }
.sop-naechste-zeit b { color: var(--ink-2); font-variant-numeric: tabular-nums; }
.sop-naechste-titel { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.sop-naechste-pfeil { opacity: .45; }
