/* ============================================================
   wk-app.css — Styles des Mitgliederbereichs

   FARBEN, SCHRIFTEN UND ECKEN STEHEN NICHT HIER. Sie kommen aus
   `wk-tokens.css` — verteilt von `npm run design` aus wk-design/tokens.css,
   derselben Datei, aus der auch Hauptseite und Archiv leben. Bis zum
   31.08.2026 führte diese Datei eine eigene Kopie mit dem Vermerk „identisch
   mit tokens.css v3.2"; solche Sätze stimmen irgendwann nicht mehr, und dann
   sieht der Mitgliederbereich anders aus als die Website, ohne dass jemand etwas geändert
   hätte. Unten stehen nur noch Werte, die es NUR hier gibt.
   Abschnitte (per Suche springen):
     TOKENS · RESET · HEADER · ROLE-TAG · PAGEHERO · MAIN/PUBLIC
     WERKRAUM (Buttons/Cards/Tiles) · FORMS · EVENTS/RSVP
     PILLS/STATUS · KETTE · REITER (alle Umschalter) · LEDGER/SALDO
     STAT/TABLE · VORLAGE-OUT · WIR-SIND · OVERLAY/SHEET
     FAB · TEXTBUCH · REVEAL · FOOTER · ICONS/MOTION
   ============================================================ */
  /* HIER STANDEN ZWEI LINIENFARBEN (`--line`, `--gold-line`) — bis zum
     12.09.2026. Sie gehören nicht dem Mitgliederbereich: die Hauptseite mischte sich
     dieselben Werte von Hand zusammen, und das Archiv auch. Jetzt stehen sie
     in wk-design/tokens.css, abgeleitet aus `--braun` und `--gold` statt als
     Zahlen geschrieben — ändert sich die Hausfarbe, ändert sich die Linie mit.

     DIESE DATEI FÜHRT KEINE EIGENEN FARBEN MEHR. Was aussieht wie eine
     Ausnahme, ist ein Token: die Marken-Töne (`--ton-*`) und die Feldmaße
     (`--feld-*`) stehen ebenfalls in tokens.css. Eine Prüfung in
     `test-frontend.mjs` meldet jeden Hex- und rgb-Wert, der hier wieder
     auftaucht. */
  *,*::before,*::after{box-sizing:border-box;margin:0;padding:0}
  /* „GANZ OBEN" IST NICHT DER BILDSCHIRMRAND (13.09.2026).

     `.site-header` ist `position:fixed` und nimmt keinen Platz im Fluss ein —
     der Inhalt läuft darunter hindurch, und das ist gewollt: so bleibt das
     Bühnenbild oben ganz. Ein SPRUNG ZU EINEM ANKER rechnet aber ohne die
     Kopfzeile: der Browser stellt das Ziel an y=0, also unter die Leiste.

     Am deutlichsten im Textbuch, und dort ist es doppelt so schlimm: klickt man
     links auf eine Marke, stapeln sich Kopfzeile (--kopf) UND die Werkzeugleiste
     `.kopf-leiste` (--leiste) über dem Ziel — zusammen 130 Pixel. Die Marke war
     also nicht „schlecht lesbar", sie war vollständig verdeckt.

     `scroll-padding-top` sagt dem Browser, wo oben anfängt. Es gilt für JEDEN
     Sprung im Dokument — Anker, Tastatur, `scrollIntoView()` —, deshalb steht es
     hier einmal und nicht an jedem Ziel. Die zwölf Pixel obendrauf sind der
     Abstand, der den Unterschied zwischen „gerade noch da" und „angekommen"
     macht.

     DIE HÖHEN STEHEN HIER UND NICHT ZWEIMAL: `--kopf` hieß unten in
     `body.tb-edit` schon einmal `--tb-kopf: 64px` — derselbe Wert, zweimal
     aufgeschrieben, für dieselbe Leiste. Wer die Kopfzeile höher macht und nur
     eine der beiden Zahlen nachzieht, bekommt genau diesen Fehler zurück. */
  html{scroll-behavior:smooth;-webkit-text-size-adjust:100%;
    --kopf:64px;--leiste:66px;--luft:12px;
    scroll-padding-top:calc(var(--kopf) + var(--luft))}
  /* IM TEXTBUCH GIBT ES KEINE KOPFZEILE — `.kopf-leiste` IST der Kopf.

     Die durchscheinende Kopfzeile über einer deckend weißen Werkzeugleiste
     ergab einen Streifen halb sichtbaren Textes oberhalb der eigentlichen
     Leiste: der Text lief unter dem Blur durch und hörte an der weißen Kante
     abrupt auf. Zwei Kopfzeilen mit verschiedener Durchsicht übereinander sind
     keine Gestaltung, sondern ein Unfall — und die obere hatte hier ohnehin
     nichts zu sagen: Home, Tickets, Über uns gehören zur Website, nicht in ein
     Textbuch. Bühnenbild und Seitenfuß sind aus demselben Grund längst weg.

     Der Weg hinaus bleibt: `← Übersicht` steht als erstes in `.kopf-leiste`.

     `--kopf:0px` genügt — die Leiste rückt nach oben, `main` verliert seinen
     Vorhalt, die Seitenspalte klebt eine Leiste höher, und der Ankersprung
     rechnet ab jetzt nur noch mit der Werkzeugleiste. Vier Stellen, ein Wert. */
  html:has(body.tb-edit),html:has(body.fo-edit){--kopf:0px;
    scroll-padding-top:calc(var(--leiste) + var(--luft))}
  body{
    background:var(--bx-d);color:var(--creme);
    font-family:var(--f-body);font-size:16.5px;line-height:1.65;
    -webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;overflow-x:hidden;
  }
  h1,h2,h3,h4{
    font-family:var(--f-display);
    font-variation-settings:'opsz' 144,'SOFT' var(--fd-soft),'WONK' var(--fd-wonk);
    font-weight:400;line-height:1.05;
  }
  a{color:inherit;text-decoration:none}
  /* `height:auto` ist hier KEINE Kosmetik, und sein Fehlen hat am 15.09.2026
     die Fotos verunstaltet.
     Die Attribute `width` und `height` am `<img>` setzen in CSS die
     gleichnamigen EIGENSCHAFTEN (Präsentationshinweis). Wer nur `max-width`
     oder `width` überschreibt, lässt `height` auf dem Attributwert stehen —
     bei einem Foto also auf 4000px. Die Zelle wird dann 200 breit und 4000
     hoch, `aspect-ratio` greift gar nicht (es gilt nur, wenn eine Seite `auto`
     ist), und `object-fit:cover` schneidet einen schmalen senkrechten Streifen
     heraus. Das sieht aus wie ein verzerrtes Hochformat und ist genau das.
     Ohne die Attribute springt die Seite beim Nachladen — sie müssen bleiben,
     also muss diese Zeile hier stehen. */
  img,svg{display:block;max-width:100%;height:auto}
  ::selection{background:var(--gold);color:var(--bx-d)}
  :focus-visible{outline:3px solid var(--gold-h);outline-offset:2px;box-shadow:0 0 0 2px var(--bx-d);border-radius:var(--radius)}
  button{font-family:var(--f-body);cursor:pointer;border:none;background:none;color:inherit;font-size:inherit}
  .hide{display:none!important}

  .skip-link{position:absolute;left:16px;top:-60px;background:var(--gold);color:var(--bx-d);padding:10px 18px;border-radius:var(--radius);font-weight:600;z-index:999;transition:top .2s var(--ease-soft)}
  .skip-link:focus{top:16px}

  /* ── Header: fixiert, über dem Bordeaux transparent auslaufend ── */
  .site-header{
    position:fixed;inset:0 0 auto 0;z-index:40;
    display:flex;align-items:center;justify-content:space-between;gap:16px;
    padding:14px var(--gutter);
    background:linear-gradient(to bottom,color-mix(in srgb, var(--bx-d) 86%, transparent),transparent);
    backdrop-filter:blur(2px);
  }
  .brand{display:flex;align-items:center;gap:12px;text-align:left;padding:0}
  .brand-mark{width:40px;height:40px;background:var(--creme);border-radius:50%;padding:2px;box-shadow:0 2px 12px rgba(0,0,0,.4)}
  .brand-text{display:flex;flex-direction:column;line-height:1.1}
  .brand-name{font-family:var(--f-display);font-size:15px;font-weight:600;color:var(--creme)}
  .brand-sub{font-size:8px;letter-spacing:.22em;text-transform:uppercase;color:var(--gold-h);margin-top:2px}
  .site-nav{display:flex;gap:26px;align-items:center;margin-left:auto}
  .site-nav a{font-size:15px;font-weight:500;letter-spacing:.02em;color:color-mix(in srgb, var(--creme) 78%, transparent);position:relative;padding:4px 0;transition:color .25s var(--ease-soft);cursor:pointer}
  .site-nav a::after{content:'';position:absolute;left:0;bottom:0;width:100%;height:1px;background:var(--gold);transform:scaleX(0);transform-origin:right;transition:transform .4s var(--ease-curtain)}
  .site-nav a:hover{color:var(--gold-h)}
  .site-nav a:hover::after{transform:scaleX(1);transform-origin:left}
  .bar-actions{display:flex;align-items:center;gap:12px;flex-wrap:wrap;justify-content:flex-end}
  .nav-intern{font-size:14px;font-weight:500;color:var(--gold-h);padding:6px 14px;border-radius:var(--radius);border:1px solid color-mix(in srgb, var(--gold) 40%, transparent);transition:background .25s}
  .nav-intern:hover{background:color-mix(in srgb, var(--gold) 12%, transparent)}
  .user-name{font-size:14px;font-weight:600;color:var(--creme)}
  .btn-logout{font-size:13px;color:color-mix(in srgb, var(--creme) 75%, transparent);border-radius:var(--radius);padding:6px 12px;border:1px solid color-mix(in srgb, var(--creme) 30%, transparent);transition:color .2s,border-color .2s}
  .btn-logout:hover{color:var(--creme);border-color:var(--creme)}
  /* ── Mobiles Menü: dieselbe Mechanik und Optik wie auf der Hauptseite ── */
  .nav-burger{display:none}
  @media screen and (max-width:860px){
    .brand-sub{display:none}
    .nav-burger{display:flex;flex-direction:column;justify-content:center;gap:5px;
      width:42px;height:42px;padding:0 9px;cursor:pointer;z-index:50}
    .nav-burger span{height:2px;background:var(--creme);border-radius:var(--radius);
      transition:transform .3s var(--ease-soft),opacity .2s}
    .nav-toggle:checked ~ .nav-burger span:nth-child(1){transform:translateY(7px) rotate(45deg)}
    .nav-toggle:checked ~ .nav-burger span:nth-child(2){opacity:0}
    .nav-toggle:checked ~ .nav-burger span:nth-child(3){transform:translateY(-7px) rotate(-45deg)}
    .site-nav{position:fixed;inset:0 0 auto 0;flex-direction:column;align-items:flex-start;
      gap:4px;padding:88px var(--gutter) 28px;
      background:linear-gradient(180deg,var(--bx-d) 0%,var(--bx-t) 100%);
      border-bottom:1px solid color-mix(in srgb, var(--gold) 30%, transparent);box-shadow:0 24px 60px rgba(0,0,0,.5);
      transform:translateY(-100%);opacity:0;pointer-events:none;
      transition:transform .35s var(--ease-soft),opacity .3s}
    .site-nav .nav-link{font-size:17px;padding:10px 0;color:var(--creme)}
    .nav-toggle:checked ~ .site-nav{transform:translateY(0);opacity:1;pointer-events:auto}
    /* OFFENES MENÜ = POP-UP (01.10.2026): die Seite dahinter steht still, wie
       hinter jedem Fenster (wk-popup.css). Das Menü hat kein aria-modal, also
       steht es hier — in der Media-Query, damit ein offen gelassenes Menü die
       Seite nicht sperrt, wenn das Fenster breiter gezogen wird. Dafür scrollt
       das Menü selbst, sonst wären Einträge unter dem Bildschirmrand weg. */
    html:has(.nav-toggle:checked){overflow:hidden;scrollbar-gutter:stable}
    .site-nav{max-height:100dvh;overflow-y:auto;overscroll-behavior:contain}
    /* Rolle, Name und Abmelden rutschen im offenen Menü untereinander. */
    .bar-actions{flex-direction:column;align-items:flex-start;gap:10px;margin-top:14px;
      padding-top:14px;border-top:1px solid color-mix(in srgb, var(--gold) 25%, transparent);width:100%}
  }

  .role-tag{font-size:10px;font-weight:700;letter-spacing:.14em;text-transform:uppercase;border-radius:var(--radius);padding:5px 10px;background:var(--bx);color:var(--creme);border:1px solid color-mix(in srgb, var(--gold) 50%, transparent);white-space:nowrap}
  .role-tag.publikum{background:var(--gruen)}
  .role-tag.admin{background:var(--tinte)}
  .role-tag.regisseurin,.role-tag.kassenwart,.role-tag.praesident,.role-tag.vizepraesident,.role-tag.social_media{background:var(--gold-d)}
  /* Kein Amt ist der Normalfall und keine Auszeichnung: dieselbe Marke, aber
     ruhig — sie sagt „Mutter" oder „Mitglied", nicht „Vorstand". */
  .role-tag.ohne-amt{background:var(--braun)}

  /* ── Seitenkopf wie PageHero.astro: Bordeaux-Verlauf + Gold-Sonne ── */
  .phero{
    position:relative;overflow:hidden;
    background:linear-gradient(180deg,var(--bx) 0%,var(--bx-d) 100%);
    border-bottom:1px solid color-mix(in srgb, var(--gold) 28%, transparent);
    padding:clamp(110px,16vh,160px) var(--gutter) clamp(36px,6vh,60px);
  }
  body:not(.is-in) .phero{padding:clamp(130px,20vh,200px) var(--gutter) clamp(44px,7vh,72px)}
  .phero-spot{position:absolute;inset:0;pointer-events:none;
    background:radial-gradient(ellipse 78% 135% at 94% -15%,color-mix(in srgb, var(--gold-h) 15%, transparent) 0%,color-mix(in srgb, var(--gold-h) 6%, transparent) 32%,transparent 64%)}
  .phero-in{position:relative;max-width:var(--maxw);margin:0 auto}
  .phero-eyebrow{font-size:clamp(10px,1.4vw,12px);letter-spacing:.26em;text-transform:uppercase;color:var(--gold-h);margin-bottom:14px}
  .phero h1{font-size:clamp(32px,5.5vw,56px);color:var(--creme);line-height:1;max-width:20ch}
  body:not(.is-in) .phero h1{font-size:clamp(38px,7vw,72px)}
  .phero h1 em{font-style:italic;color:var(--gold-h);font-variation-settings:'opsz' 96,'SOFT' 44,'WONK' 1}
  .phero-lead{margin-top:18px;max-width:56ch;font-size:clamp(16px,2vw,18px);color:color-mix(in srgb, var(--creme) 86%, transparent);line-height:1.7}

  /* ── Inhalt: eingeloggt = heller Werkraum (Creme), ausgeloggt = Bühne ── */
  main{min-height:52vh}
  body.is-in main{background:var(--creme);color:var(--braun);padding:clamp(32px,5vh,52px) var(--gutter) clamp(70px,10vh,110px)}
  body:not(.is-in) main{padding:34px var(--gutter) clamp(70px,10vh,120px)}
  .wrap{max-width:var(--maxw);margin:0 auto}

  /* Öffentliche (dunkle) Sicht */
  .pub-acts{display:flex;gap:14px;flex-wrap:wrap;margin:0 0 48px}
  .pub-h{font-size:12px;letter-spacing:.2em;text-transform:uppercase;color:var(--gold);margin-bottom:14px;font-weight:600}
  .pub-ev{display:flex;justify-content:space-between;align-items:center;gap:16px;padding:18px 20px;border:1px solid color-mix(in srgb, var(--gold) 30%, transparent);background:color-mix(in srgb, var(--weiss) 4%, transparent);border-radius:var(--radius);margin-bottom:10px;transition:border-color .3s}
  .pub-ev:hover{border-color:var(--gold)}
  .pub-ev-t{font-family:var(--f-display);font-size:19px;color:var(--creme)}
  .pub-ev-d{font-size:14px;color:var(--sepia)}
  .pub-badge{border-radius:var(--radius);font-size:10px;letter-spacing:.14em;text-transform:uppercase;color:var(--gold-h);border:1px solid color-mix(in srgb, var(--gold) 45%, transparent);padding:5px 10px;white-space:nowrap}

  /* ── Heller Werkraum (CD-Unterseiten): Sand-Karten, Bordeaux, Gold nur Linie ── */
  .eyebrow{font-size:11px;letter-spacing:.16em;text-transform:uppercase;color:var(--bx-h);font-weight:600}
  .muted{color:var(--braun)}

  .btn-primary{background:var(--bx);color:var(--creme);font-weight:700;font-size:14px;letter-spacing:.02em;border-radius:var(--radius);padding:13px 26px;transition:transform .25s var(--ease-soft),background .25s,box-shadow .25s}
  .btn-primary:hover{background:var(--bx-h);transform:translateY(-2px);box-shadow:0 14px 30px color-mix(in srgb, var(--bx) 28%, transparent)}
  .btn-gold{background:var(--gold);color:var(--bx-d);font-weight:700;font-size:14px;border-radius:var(--radius);padding:13px 26px;transition:background .25s,transform .25s var(--ease-soft)}
  .btn-gold:hover{background:var(--gold-h);transform:translateY(-2px)}
  .btn-ghost{border:1px solid var(--bx);color:var(--bx);font-weight:600;font-size:14px;border-radius:var(--radius);padding:12px 24px;transition:background .25s,color .25s}
  .btn-ghost:hover{background:var(--bx);color:var(--creme)}
  .btn-soft{background:var(--sand);color:var(--braun);border:1px solid var(--line);font-weight:600;font-size:13.5px;border-radius:var(--radius);padding:10px 16px;transition:border-color .25s,color .25s}
  .btn-soft:hover{border-color:var(--gold);color:var(--tinte)}
  .btn-sm{padding:8px 14px;font-size:13px}
  .link{color:var(--bx);font-weight:600;font-size:14px;text-decoration:underline;text-underline-offset:3px;text-decoration-color:color-mix(in srgb, var(--gold) 60%, transparent);padding:8px 0}
  .link:hover{color:var(--bx-h)}
  /* Ein Knopf, der gerade arbeitet, sieht auch so aus — und federt nicht mehr
     mit. Sonst bleibt ein gesperrter Knopf äußerlich ein Angebot, und wer
     drückt, weil nichts passiert, drückt gleich noch einmal. Die Knöpfe mit
     eigener Regel (`.kv-gross`, `.bu-pm`) bleiben davon unberührt — ihre
     Klassen wiegen schwerer. */
  /* NICHT der gewählte Zustand: `.gewaehlt` ist auch `disabled`, aber aus dem
     entgegengesetzten Grund — nicht „geht gerade nicht", sondern „das ist deine
     Antwort". Ein Knopf, der eine Auskunft ist, wird nicht blass. */
  button:disabled:not(.gewaehlt){opacity:.55;cursor:default}
  button:not(:disabled):active{transform:translateY(1px)}

  .card{background:var(--sand);border:1px solid var(--gold-line);border-radius:var(--radius);padding:24px 22px;transition:border-color .3s}
  .card h3{font-size:20px;color:var(--bx)}

  /* Kachel-Übersicht (wie Wegweiser-Karten der Hauptseite, mit 3D-Kippen) */
  .home-head{display:flex;justify-content:flex-end;align-items:center;gap:10px;margin-bottom:18px}
  .prev-sel{font-family:var(--f-body);font-size:13.5px;font-weight:600;color:var(--braun);background:var(--sand);border:1px solid var(--line);padding:9px 12px;border-radius:var(--radius);cursor:pointer}
  .prev-sel:focus{border-color:var(--gold);outline:none}
  /* DIE Reiterleiste. Jeder Umschalter im Mitgliederbereich benutzt sie (reiterHTML in
     wk-app.js): Auswertungen, Info-Vorlagen, Spielplan-Ansicht, „Für: …". */
  .reiter{display:flex;flex-wrap:wrap;align-items:center;gap:4px;margin:0 0 16px;border-bottom:1px solid var(--gold-line)}
  .reiter-label{font-size:11px;letter-spacing:.16em;text-transform:uppercase;color:var(--bx-h);font-weight:600;margin-right:6px}
  .reiter-btn{font-family:var(--f-body);font-size:14.5px;font-weight:600;color:var(--braun);background:none;border:none;
    padding:9px 14px;cursor:pointer;border-bottom:2px solid transparent;margin-bottom:-1px;border-radius:var(--radius) var(--radius) 0 0;
    transition:color .2s var(--ease-soft),background .2s,border-color .2s;border-radius:var(--radius)}
  .reiter-btn:hover{color:var(--bx);background:var(--sand)}
  .reiter-btn.an{color:var(--bx);border-bottom-color:var(--gold)}
  /* Die Leiste im Werkzeug sitzt unter dem Kopf, nicht am Seitenrand kleben. */
  .tool-head+.reiter{margin-top:-2px}
  .vorschau-band{margin-left:auto;font-size:13px;font-weight:600;color:var(--braun);background:var(--sand);
    border:1px solid var(--gold-line);border-radius:var(--radius);padding:6px 14px;display:inline-flex;align-items:center;gap:8px}
  .tiles-gruppe+.tiles-gruppe{margin-top:34px}
  .tiles-titel{font-family:var(--f-display);font-size:19px;color:var(--bx);margin-bottom:14px;
    display:flex;align-items:baseline;gap:10px;padding-bottom:8px;border-bottom:1px solid var(--gold-line)}
  .tiles-titel span{font-family:var(--f-body);font-size:13.5px;font-weight:500;color:var(--braun)}
  .tiles{display:grid;gap:18px;grid-template-columns:repeat(auto-fill,minmax(230px,1fr));perspective:1000px}
  .tile{text-align:left;background:var(--sand);border:1px solid var(--gold-line);border-radius:var(--radius);padding:22px;
    position:relative;
    display:flex;flex-direction:column;gap:10px;align-items:flex-start;min-height:142px;
    transform-style:preserve-3d;transition:transform .4s var(--ease-soft),box-shadow .4s var(--ease-soft),border-color .3s}
  .tile:hover{transform:rotateX(-3deg) rotateY(3.5deg) translateY(-5px);box-shadow:-12px 16px 36px color-mix(in srgb, var(--schatten-warm) 18%, transparent);border-color:var(--gold)}
  .tile .ico{width:42px;height:42px;border-radius:var(--radius);background:var(--creme);border:1px solid color-mix(in srgb, var(--gold) 30%, transparent);display:flex;align-items:center;justify-content:center;color:var(--bx)}
  .tile h3{font-size:20px;color:var(--bx)}
  .tile p{font-size:14.5px;color:var(--braun);line-height:1.55}
  .tile.admin .ico{background:var(--bx);color:var(--creme)}
  /* Die eine Zahl im Mitgliederbereich (offene Antworten, Kachel „Auftritte"). Bordeaux mit
     Creme darauf — die Handlungsfarbe, nicht Gold: Gold ist Detail und auf Hell
     nicht lesbar. Eckig wie alles andere (`--radius`). */
  .tile-zahl{position:absolute;top:16px;right:16px;background:var(--bx);color:var(--creme);
    font-family:var(--f-body);font-size:13px;font-weight:700;line-height:1;
    min-width:24px;padding:6px 7px;text-align:center;border-radius:var(--radius)}
  /* Dieselbe Marke mitten im Satz — dort trägt sie keine Ecke oben rechts. */
  .tile-zahl.im-text{position:static;display:inline-block;margin-right:4px;vertical-align:2px}
  /* Und derselbe Platz für die gute Nachricht: nichts offen. Das Paar aus
     Fläche und Schrift, wie jede Statusfarbe — nie eine Farbe allein. */
  .tile-zahl.gut{background:var(--ton-gut-flaeche);color:var(--ton-gut-schrift);font-size:14px}

  .tool-head{display:flex;align-items:center;gap:12px;margin-bottom:20px;flex-wrap:wrap}
  .grid{display:grid;gap:16px}
  @media screen and (min-width:760px){.grid.two{grid-template-columns:1fr 1fr}.grid.side{grid-template-columns:1.5fr 1fr}}
  .row{display:flex;gap:10px;flex-wrap:wrap;align-items:center}

  /* ── FORMULARE ────────────────────────────────────────────────────────────
     WIE EIN FELD AUSSIEHT, STEHT NICHT MEHR HIER, sondern in `wk-felder.css`
     (verteilt aus wk-design/felder.css) — dieselbe Datei, aus der auch
     Hauptseite und Archiv ihre Felder nehmen. Hier steht nur noch, wie ein
     Feld im Werkraum LIEGT: Beschriftung darüber, Abstand darunter.

     Und `class="feld"` gibt es nicht mehr. Es war der zweite Weg: 29 Stellen
     im Finanz-Strang, zu denen es in keiner Stylesheet-Datei eine Regel gab —
     Konto, Geldgeber, Kostenart, Vereinsdaten, Beleg-Posten standen deshalb
     als nackte Browser-Felder in einem sonst durchgestalteten Mitgliederbereich, und ein
     `style="flex-direction:row"` daran tat nichts, weil `.feld` kein `flex`
     hatte. Eine Prüfung meldet jetzt jede Klasse im Quelltext, zu der es keine
     Regel gibt. */
  .field{display:flex;flex-direction:column;gap:6px;margin:13px 0}
  .field label{font-size:13px;font-weight:600;color:var(--braun)}
  /* Eine Ankreuzzeile liegt quer, nicht untereinander: Kästchen, dann Satz. */
  .field.quer{flex-direction:row;align-items:center;gap:8px}
  .field.quer label{font-weight:400;color:var(--tinte);font-size:14.5px}
  /* Ein Auswahlfeld IN einem Feld nimmt dessen Breite. Seine eigene
     Mindestbreite gilt nur, wenn es frei in einer Leiste steht — in einer
     90 px schmalen Spalte („Satz") würde sie die Zeile sprengen. */
  .field .wk-select{min-width:0;width:100%}
  /* Passwortfeld mit Augen-Schalter: der Knopf sitzt IM Feld, deshalb rechts
     Platz freihalten, damit lange Passwörter nicht unter ihm verschwinden. */
  .pw-wrap{position:relative;display:flex}
  .pw-wrap input{flex:1;min-width:0;padding-right:46px}
  .pw-auge{position:absolute;right:2px;top:2px;bottom:2px;width:40px;display:flex;
    align-items:center;justify-content:center;border:0;background:none;cursor:pointer;
    color:var(--braun);border-radius:var(--radius)}
  .pw-auge:hover{color:var(--bx)}
  .pw-auge .i{width:20px;height:20px}

  .ev{display:flex;align-items:center;gap:14px;justify-content:space-between;padding:13px 15px;background:var(--weiss);border:1px solid var(--line);border-radius:var(--radius)}
  .ev-main{display:flex;flex-direction:column;gap:2px}
  .ev-t{font-family:var(--f-display);font-size:17px;color:var(--tinte)}
  .ev-d{font-size:13.5px;color:var(--braun)}
  .rsvp{display:flex;gap:8px;margin-top:10px}
  .rsvp button{flex:1;font-weight:600;font-size:13.5px;padding:10px}
  .rsvp .on-ja{background:var(--gruen);color:var(--creme)}
  .rsvp .on-nein{background:var(--bx);color:var(--creme)}
  .att{display:flex;flex-wrap:wrap;gap:6px;margin-top:12px}
  .chip{font-size:12.5px;padding:4px 10px;border-radius:var(--radius);border:1px solid var(--line);background:var(--weiss);color:var(--braun)}
  .chip.ja{background:var(--ton-gut-flaeche);color:var(--gruen);border-color:color-mix(in srgb, var(--gruen) 30%, transparent)}
  .chip.nein{background:var(--ton-offen-flaeche);color:var(--bx);border-color:color-mix(in srgb, var(--bx) 30%, transparent)}
  .check-row{display:flex;flex-wrap:wrap;gap:8px;margin:10px 0}
  .check{display:flex;align-items:center;gap:7px;background:var(--weiss);padding:8px 13px;border-radius:var(--radius);font-size:14px;cursor:pointer;border:1px solid var(--line);color:var(--tinte)}
  .check input{accent-color:var(--bx)}
  .note{font-size:14px;color:var(--braun);background:var(--weiss);border-left:3px solid var(--gold);padding:12px 14px;border-radius:0 var(--radius) var(--radius) 0;margin-top:14px;line-height:1.6}

  .pill{display:inline-block;font-size:10px;font-weight:700;letter-spacing:.1em;padding:4px 8px;border-radius:var(--radius);text-transform:uppercase}
  .pill.jugend{background:var(--ton-gut-flaeche);color:var(--gruen)}
  .pill.kinder{background:var(--ton-achtung-flaeche);color:var(--gold-d)}
  .pill.erwachsene{background:var(--ton-offen-flaeche);color:var(--bx)}
  .pill.warte{background:var(--ton-wartet-flaeche);color:var(--braun)}
  /* Zustand eines Zahlungseingangs in der Durchsicht (Beiträge › Einnahmen):
     offen = noch nichts entschieden, warte = Zahler ungeklärt, ja = fertig. */
  .pill.offen{background:var(--ton-offen-flaeche);color:var(--bx)}
  .pill.ja{background:var(--ton-gut-flaeche);color:var(--gruen)}
  .pill.aktiv{background:var(--ton-gut-flaeche);color:var(--gruen)}
  /* Status-Phasen (wartend → eingeladen → schnuppernd → aktiv/passiv → ausgetreten) */
  .pill.wartend{background:var(--ton-wartet-flaeche);color:var(--braun)}
  .pill.eingeladen{background:var(--ton-unterwegs-flaeche);color:var(--ton-unterwegs-schrift)}
  .pill.schnuppernd{background:var(--ton-schnuppert-flaeche);color:var(--ton-schnuppert-schrift)}
  .pill.passiv{background:var(--ton-passiv-flaeche);color:var(--braun)}
  .pill.ausgetreten{background:var(--ton-ruht-flaeche);color:var(--ton-ruht-schrift)}
  .pill.selbst,.pill.mutter,.pill.vater,.pill.vormund,.pill.sorgeberechtigt{background:var(--sand);color:var(--bx)}
  /* Beziehungs-Chip (Konto ↔ Mitglied) */
  .bez{font-size:11px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--braun);background:var(--sand);border:1px solid var(--gold-line);padding:3px 8px;border-radius:var(--radius)}
  .bez.pending{background:var(--ton-wartet-flaeche);color:var(--gold-d);border-color:color-mix(in srgb, var(--gold-d) 40%, transparent)}
  /* Status-Kette als Mini-Fluss */
  .kette{display:flex;flex-wrap:wrap;gap:6px;align-items:center;margin:2px 0 16px}
  .kette .k{font-size:11px;font-weight:600;letter-spacing:.05em;text-transform:uppercase;color:var(--braun);background:var(--weiss);border:1px solid var(--line);border-radius:var(--radius);padding:4px 11px}
  .kette .k .c{color:var(--bx);font-weight:700}
  .kette .arr{color:var(--sepia);font-size:12px}
  /* Kind-/Mitglied-Umschalter für Eltern-Konten */
  /* Ledger-Beträge */
  .num{font-variant-numeric:tabular-nums;font-weight:600;text-align:right;white-space:nowrap}
  .num.pos{color:var(--gruen)}
  .num.neg{color:var(--bx)}
  .saldo{display:flex;align-items:baseline;gap:10px;padding:12px 16px;border-radius:var(--radius);border:1px solid var(--gold-line);background:var(--sand);margin-bottom:14px}
  .saldo .lbl{font-size:12px;letter-spacing:.08em;text-transform:uppercase;color:var(--braun);font-weight:600}
  .saldo .val{font-family:var(--f-display);font-size:26px}
  .saldo .val.pos{color:var(--gruen)}
  .saldo .val.neg{color:var(--bx)}
  /* Info-Vorlagen: fertiger Text zum Kopieren (WhatsApp-Look) */
  .vorlage-out{white-space:pre-wrap;font-family:var(--f-body);font-size:13.5px;line-height:1.55;background:var(--weiss);border:1px solid var(--line);border-radius:var(--radius);padding:14px 16px;color:var(--tinte);max-height:360px;overflow:auto;margin-top:4px}
  /* „Wir sind X" — anonyme Mitgliederzahl, sichtbar für JEDE Rolle (DSGVO-ok) */
  .wir-sind{display:flex;align-items:center;gap:22px;background:linear-gradient(120deg,var(--bx) 0%,var(--bx-d) 100%);color:var(--creme);border:1px solid var(--gold-line);border-radius:var(--radius);padding:20px 26px;margin-bottom:24px;box-shadow:0 12px 30px -18px color-mix(in srgb, var(--schatten-warm) 50%, transparent)}
  .wir-zahl{font-family:var(--f-display);font-size:clamp(42px,7vw,64px);line-height:.95;color:var(--gold-h)}
  .wir-txt .eyebrow{color:var(--gold-h)}
  .wir-txt p{font-size:14.5px;color:color-mix(in srgb, var(--creme) 85%, transparent);margin-top:4px;line-height:1.5}
  .wir-txt b{color:var(--creme);font-variant-numeric:tabular-nums}
  .wir-groups{display:flex;flex-wrap:wrap;gap:8px;margin-top:10px}
  .wir-groups .g{font-size:12px;font-weight:600;letter-spacing:.04em;color:var(--creme);background:color-mix(in srgb, var(--weiss) 10%, transparent);border:1px solid var(--gold-line);border-radius:var(--radius);padding:4px 11px}
  @media screen and (max-width:560px){.wir-sind{flex-direction:column;align-items:flex-start;gap:12px;text-align:left}}
  .vorlagen-controls{display:flex;flex-wrap:wrap;gap:14px;align-items:flex-end}
  .vorlagen-foot{display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:10px;margin-top:12px}

  .stat-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(115px,1fr));gap:14px}
  .stat{background:var(--sand);border:1px solid var(--gold-line);border-radius:var(--radius);padding:14px 16px}
  .stat .n{font-family:var(--f-display);font-size:30px;color:var(--bx);line-height:1.1}
  .stat .l{font-size:11px;color:var(--braun);letter-spacing:.08em;text-transform:uppercase;font-weight:600;margin-top:2px}

  .tbl-wrap{overflow:auto;border:1px solid var(--line);border-radius:var(--radius);margin-top:10px;background:var(--weiss)}
  table.db{width:100%;border-collapse:collapse;font-size:13px}
  table.db th,table.db td{text-align:left;padding:8px 11px;border-bottom:1px solid var(--line);white-space:nowrap;color:var(--tinte)}
  table.db th{font-size:10.5px;text-transform:uppercase;letter-spacing:.08em;color:var(--bx-h);font-weight:700}
  table.db tr:last-child td{border-bottom:none}
  /* Ein Eingabefeld MITTEN in einer Tabelle bekommt sonst gar keins ab: die
     Feldgestaltung hängt an `.field`, und in einer Zelle steht kein `.field`.
     Ergebnis war ein nacktes Browser-Kästchen zwischen lauter gesetztem Text. */
  .zell-eingabe{font-family:var(--f-body);font-size:14px;padding:8px 11px;border-radius:var(--radius);
    border:1px solid color-mix(in srgb, var(--braun) 30%, transparent);background:var(--weiss);color:var(--tinte);min-width:210px}
  .zell-eingabe:focus{border-color:var(--gold);outline:none}
  /* Der Knopf steht mit Abstand daneben, nicht an der Feldkante: sonst sieht
     er aus, als gehörte er ins Feld, und wird beim Tippen mitgetroffen. */
  .zell-tat{display:flex;gap:14px;align-items:center;flex-wrap:nowrap}
  .zell-eingabe.schmal{min-width:0;width:88px}
  /* Ein Feld IN einer Tabellenzelle bringt keinen eigenen Abstand mit — die
     Zelle hat schon einen, und die Zeile soll nicht auseinandergehen. */
  .field.zell-feld{margin:0;display:inline-flex}
  table.matrix td{text-align:center}
  table.matrix td:first-child{text-align:left;font-weight:600}
  table.matrix input{accent-color:var(--bx);width:17px;height:17px;cursor:pointer}
  .lock{display:flex;flex-direction:column;align-items:center;gap:8px;text-align:center;padding:28px;color:var(--braun);background:var(--sand);border-radius:var(--radius);border:1px dashed var(--sepia)}

  /* ── Pop-ups: wie die Dialoge der Hauptseite (Weiß, Bordeaux-Kante) ── */
  .overlay{position:fixed;inset:0;z-index:60;background:color-mix(in srgb, var(--schatten-tief) 60%, transparent);display:flex;align-items:center;justify-content:center;padding:16px;backdrop-filter:blur(3px)}
  .sheet{background:var(--weiss);border-radius:var(--radius);border-top:4px solid var(--bx);max-width:440px;width:100%;padding:28px;box-shadow:0 30px 70px -20px rgba(0,0,0,.6);max-height:92vh;overflow:auto;color:var(--braun)}
  .sheet h2{font-size:26px;color:var(--bx);margin-bottom:4px}
  .demo-cards{display:grid;gap:8px;margin:8px 0}
  /* Überschrift je Testkonten-Gruppe (Ämter · Klammern · Ränder). Einundzwanzig
     Knöpfe untereinander sind keine Liste, sondern eine Wand. */
  .tk-gruppe{margin:16px 0 6px;font-size:12px;font-weight:700;letter-spacing:.08em;
    text-transform:uppercase;color:var(--braun)}
  /* Ein Konto, dessen Anmeldung scheitern MUSS — das ist die Aussage, nicht
     ein Fehler. Gestrichelt statt rot: rot hieße „kaputt". */
  .demo.scheitert{border-style:dashed;opacity:.75}
  .demo{display:flex;align-items:center;justify-content:space-between;gap:10px;text-align:left;width:100%;background:var(--sand);color:var(--tinte);border:1px solid var(--gold-line);border-radius:var(--radius);padding:12px 14px;font-weight:500;transition:border-color .25s}
  .demo:hover{border-color:var(--gold)}
  .demo b{font-family:var(--f-display);font-weight:600;color:var(--bx)}
  .demo small{display:block;color:var(--braun);font-weight:400;font-size:12.5px}
  .sep{display:flex;align-items:center;gap:10px;margin:18px 0 10px;color:var(--braun);font-size:13px}
  .sep::before,.sep::after{content:"";height:1px;background:var(--line);flex:1}
  .code-hint{background:var(--sand);border:1px dashed var(--gold-d);border-radius:var(--radius);padding:10px 14px;font-size:14px;color:var(--braun);margin:10px 0}
  .code-hint b{font-family:var(--f-display);color:var(--bx);letter-spacing:.12em}
  .close-x{color:var(--braun);font-size:22px;padding:2px 8px;line-height:1}
  .close-x:hover{color:var(--bx)}
  /* Kopf, Text und Fuß eines Fensters. Standen vorher als Inline-Stil in jedem
     einzelnen Dialog — die Kopfzeile vierundzwanzigmal Zeichen für Zeichen
     gleich, die Fußzeile neunmal. Geschrieben werden sie jetzt von `dialog()`
     in wk-bausteine.js, und wie sie aussehen, steht hier. */
  .dlg-kopf{display:flex;justify-content:space-between;align-items:flex-start;gap:12px}
  .dlg-kopf>div{flex:1;min-width:0}
  .dlg-kopf h2{min-width:0}
  .dlg-unter{color:var(--braun);font-size:14px}
  .dlg-text{color:var(--braun);font-size:14.5px;margin-top:6px}
  .dlg-fuss{display:flex;gap:10px;justify-content:flex-end;flex-wrap:wrap;margin-top:18px}
  .dlg-fertig{display:flex;flex-direction:column;align-items:center;gap:12px;text-align:center}
  .dlg-fertig .muted{font-size:14.5px}


  .empty-coll{font-size:13px;color:var(--braun);font-style:italic;padding:8px}

  /* ── MITGLIEDERVERWALTUNG: Tabelle zum Arbeiten ────────────
     Raster statt <table>, damit Spaltenbreiten und das Bearbeiten in der Zelle
     sauber zusammengehen. Ruhig gehalten: die Daten sollen auffallen, nicht das Gitter. */
  .mv-leiste{display:flex;gap:10px;align-items:center;flex-wrap:wrap;margin-bottom:10px}
  .mv-suche{flex:1;min-width:210px;font-family:var(--f-body);font-size:15px;
    padding:10px 13px;border:1px solid var(--line);border-radius:var(--radius);
    background:var(--weiss);color:var(--tinte)}
  .mv-suche:focus{border-color:var(--gold);outline:none}
  .mv-filter{font-family:var(--f-body);font-size:14px;padding:10px 11px;
    border:1px solid var(--line);border-radius:var(--radius);background:var(--weiss);
    color:var(--braun);cursor:pointer}
  .mv-filter:focus{border-color:var(--gold);outline:none}
  .mv-zahl{font-size:13px;color:var(--braun);font-variant-numeric:tabular-nums;
    white-space:nowrap;margin-left:auto}
  .mv-hilfe{font-size:13px;color:var(--sepia);margin-bottom:12px}
  .mv-hilfe b{color:var(--braun);font-weight:600}

  /* Die Zeile über der Tabelle, wenn Konten auf ihre Einladung warten (1082).
     Sie IST das Nachfassen — es gibt bewusst keinen Cron dafür —, also darf sie
     nicht wie ein Hinweis aussehen, den man wegliest. Linker Balken wie beim
     offenen Antrag, aber am Ort der Handlung statt in einem eigenen Bereich. */
  .mv-offen{display:flex;flex-wrap:wrap;align-items:center;gap:10px;
    margin-bottom:12px;padding:10px 13px;background:var(--weiss);
    border:1px solid var(--line);border-left:3px solid var(--bx);
    border-radius:var(--radius);font-size:13.5px;color:var(--braun)}
  .mv-offen .mv-offen-wer{color:var(--sepia);font-size:12.5px;width:100%}
  .mv-offen button{margin-left:auto}

  .mv-tabelle{background:var(--weiss);border:1px solid var(--line);border-radius:var(--radius);
    overflow-x:auto}
  .mv-kopf,.mv-zeile{display:grid;grid-template-columns:var(--mv-raster);
    align-items:stretch;min-width:940px}
  .mv-kopf{background:var(--sand);border-bottom:1px solid var(--line);
    position:sticky;top:0;z-index:2}
  .mv-th{font-family:var(--f-body);font-size:11.5px;font-weight:700;
    letter-spacing:.09em;text-transform:uppercase;color:var(--braun);
    text-align:left;padding:11px 12px;background:none;border:none;cursor:pointer;
    display:flex;align-items:center;gap:5px;border-radius:var(--radius)}
  .mv-th:hover{color:var(--bx)}
  .mv-th.sortiert{color:var(--bx)}
  .mv-th .pfeil{color:var(--gold-d);font-size:12px}
  .mv-th.still{cursor:default}
  .mv-th.still:hover{color:var(--braun)}

  .mv-zeile{border-bottom:1px solid color-mix(in srgb, var(--braun) 9%, transparent)}
  .mv-zeile:last-child{border-bottom:none}
  .mv-zeile:hover{background:var(--creme)}
  .mv-td{padding:9px 12px;font-size:14.5px;color:var(--tinte);display:flex;
    align-items:center;min-height:44px;overflow:hidden}
  .mv-td.still{color:var(--braun);font-size:13.5px}
  .mv-td .leer{color:var(--sepia)}
  /* Die Notiz aus dem Anmeldeformular: drei Zeilen, dann Tooltip. Ganz
     abgeschnitten wäre sie wertlos, ganz ausgeklappt sprengte sie die Zeile. */
  .mv-notiz{display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;
    overflow:hidden;white-space:normal;line-height:1.35}
  /* Die Gegenliste unter „Wer darf auf …": fließender Text statt Tabelle — sie
     ist zum Abgleichen da, nicht zum Durchgehen. */
  .frg-nicht{margin:14px 0 4px;font-size:14px;line-height:1.7;color:var(--braun)}
  .mv-abschnitt{font-family:var(--f-display);font-size:19px;color:var(--bx);margin:26px 0 4px}
  .mv-edit{cursor:text;border-radius:var(--radius);outline:none;
    box-shadow:inset 0 0 0 1px transparent;transition:box-shadow .12s,background .12s}
  .mv-edit:hover{box-shadow:inset 0 0 0 1px var(--line);background:var(--weiss)}
  .mv-edit:focus-visible{box-shadow:inset 0 0 0 2px var(--gold)}
  .mv-edit.tippt{background:var(--weiss);box-shadow:inset 0 0 0 2px var(--gold);padding:4px 6px}
  .mv-edit.frisch{background:color-mix(in srgb, var(--gruen) 10%, transparent)}
  .mv-edit input,.mv-edit select{width:100%;font-family:var(--f-body);font-size:14.5px;
    padding:6px 7px;border:none;background:none;color:var(--tinte);outline:none}
  .mv-aktionen{gap:5px;justify-content:flex-end;flex-wrap:wrap}
  .btn-xs{padding:5px 10px;font-size:12px;border-radius:var(--radius)}
  .mv-nichts{padding:34px;text-align:center;color:var(--braun);font-style:italic;font-size:15px}

  /* DIE DREI SCHNUPPERPUNKTE. Groß genug für einen Daumen (Treffer 30px), auch
     wenn der Punkt selbst klein aussieht — geklickt wird das hier am Rand der
     Halle auf dem Handy, nicht am Schreibtisch. Kein Rot und kein Häkchen: es
     ist eine Zählung, keine Bewertung. */
  .mv-punkte{display:inline-flex;gap:2px;align-items:center}
  .mv-punkt{min-width:30px;height:30px;padding:0;border:none;background:none;cursor:pointer;
    font-size:17px;line-height:1;color:var(--line);transition:color .12s,transform .12s}
  .mv-punkt:hover{color:var(--gold-d);transform:scale(1.15)}
  .mv-punkt.voll{color:var(--gruen)}
  .mv-punkt:focus-visible{outline:2px solid var(--gold);outline-offset:2px;border-radius:50%}

  /* Erlaubnis-Marken: erledigt oder offen. Kein Rot fürs Offene — es ist keine
     Verfehlung, sondern eine Nachfassliste. */
  .mv-erl{gap:5px;flex-wrap:wrap}
  .erl{font-size:12px;padding:3px 8px;border-radius:var(--radius);border:1px solid var(--line);
    white-space:nowrap;line-height:1.5}
  .erl.ja{background:var(--ton-gut-flaeche);color:var(--gruen);border-color:color-mix(in srgb, var(--gruen) 30%, transparent)}
  .erl.offen{background:var(--sand);color:var(--braun)}
  /* „Nichts erlaubt" ist entschieden — deshalb fest umrandet und nicht blass
     wie das offene. Es steht neben ✓, nicht neben ○. */
  .erl.nein{background:var(--weiss);color:var(--bx);border-color:var(--bx-h)}
  /* „Ältere Fassung": erteilt, aber zu einem Text, den es so nicht mehr gibt.
     Warm wie „offen", weil beides eine Nachfrage bedeutet — aber deutlicher
     abgesetzt, damit man die beiden in einer langen Liste unterscheidet. */
  .erl.alt{background:var(--sand);color:var(--braun);border-color:var(--gold)}
  /* Eine Anmeldung, die seit Tagen nicht bestätigt wurde. Bordeaux und fett,
     aber ohne Kasten: sie steht mitten in der Kontaktspalte zwischen Namen und
     Telefonnummern, und eine Marke dort würde die Zeile auseinanderreißen.
     Auffallen soll sie trotzdem — dahinter steckt fast immer ein Tippfehler in
     der Adresse, und den findet nur, wer hinsieht. */
  .warn-alt{color:var(--bx);font-weight:700;cursor:help}

  /* Was bisher galt — dieselbe Bauform wie die Namenslisten am Termin. */
  .foto-verlauf{margin-top:14px;padding-top:12px;border-top:1px solid var(--line)}
  .foto-verlauf>summary{cursor:pointer;display:flex;align-items:center;gap:8px;
    font-size:12px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--braun)}

  /* Die Aktionsknöpfe bleiben stehen, solange die Tabelle seitlich läuft —
     sonst schiebt man die Zeile nach rechts und verliert genau das, wofür man
     sie geöffnet hat. Der Hintergrund muss mit, sonst scheinen die Zellen durch. */
  .mv-aktionen{position:sticky;right:0;background:var(--weiss)}
  .mv-zeile:hover .mv-aktionen{background:var(--creme)}

  /* ── Karteikarte ── */
  .kt-kopf h2{font-family:var(--f-display);font-size:22px}
  .kt-raster{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:2px 18px}
  .kt-zeile{display:flex;flex-direction:column;padding:6px 0}
  .kt-label{font-size:11.5px;letter-spacing:.09em;text-transform:uppercase;color:var(--braun);font-weight:700}
  .kt-zeile .mv-td{min-height:38px;padding:6px 8px;margin-left:-8px}
  .kt-liste{list-style:none;padding:0;margin:8px 0 0;display:flex;flex-direction:column;gap:12px}
  .kt-kontakt,.kt-punkt{font-size:14.5px;color:var(--tinte)}
  .kt-punkt{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
  .kt-erreich{font-size:13.5px;color:var(--braun);margin-top:2px}
  .kt-erreich a{color:var(--bx)}

  /* Auf dem Handy wird aus jeder Zeile eine Karte: eine 940 px breite Tabelle
     auf einem 390-px-Schirm ist kein Kompromiss, sondern eine Zumutung.
     Die Überschrift kommt aus data-label, weil die Kopfzeile hier entfällt.
     WICHTIG: `screen` muss dranstehen — eine A4-Seite ist im Druck rund 790 px
     „breit", und ohne das griffe diese Regel auch auf Papier. */
  @media screen and (max-width:760px){
    .mv-zahl{margin-left:0}
    .mv-leiste{position:sticky;top:0;z-index:3;background:var(--creme);
      padding:8px 0;margin-bottom:6px}
    /* In einer Karte klebt sie auf deren Sand, nicht auf dem Creme der Seite. */
    .card .mv-leiste{background:var(--sand)}
    .mv-tabelle{background:none;border:none;overflow-x:visible}
    .mv-kopf{display:none}

    /* Die Karte ist ein umbrechender Fluss, kein Stapel: Name und Pillen legen
       sich nebeneinander, alles Weitere darunter. Acht Zeilen aus Überschrift
       UND Wert wären auf einem 390-px-Schirm eine Bildschirmhöhe je Mitglied —
       man sähe zwei Leute und müsste für den dritten scrollen. */
    .mv-zeile{position:relative;display:flex;flex-wrap:wrap;align-items:baseline;
      gap:1px 8px;min-width:0;background:var(--weiss);border:1px solid var(--line);
      border-radius:var(--radius);padding:9px 11px;margin-bottom:8px}
    .mv-zeile:hover{background:var(--weiss)}
    .mv-zeile .mv-td{display:block;width:100%;min-height:0;padding:1px 0;
      font-size:14px;overflow:visible}

    /* Die Überschrift steht VOR dem Wert, nicht darüber — das halbiert die Höhe
       der Karte, und gelesen wird sie ohnehin nur beim ersten Mal. */
    .mv-zeile .mv-td[data-label]::before{content:attr(data-label) ":";display:inline;
      font-size:11px;letter-spacing:.06em;text-transform:uppercase;color:var(--braun);
      font-weight:700;margin-right:5px}

    /* Kopf der Karte: der Name ist die Zeile, Gruppe und Status stehen als
       Pillen daneben. Alle drei brauchen keine Überschrift — man sieht ihnen an,
       was sie sind. */
    .mv-zeile .mv-c-nachname{font-size:16px;font-weight:600;padding-bottom:3px}
    .mv-zeile .mv-c-gruppe,.mv-zeile .mv-c-status{width:auto;padding:0 0 6px}
    .mv-zeile .mv-c-nachname::before,.mv-zeile .mv-c-gruppe::before,
    .mv-zeile .mv-c-status::before,.mv-zeile .mv-c-offen::before{content:none}
    /* Kurze Angaben teilen sich eine Zeile, lange bekommen ihre eigene: so
       schrumpft die Karte von acht Zeilen auf fünf, ohne dass etwas zusammenrückt,
       was zusammen keinen Sinn ergibt. */
    .mv-zeile .mv-c-geb,.mv-zeile .mv-c-aufnahme,.mv-zeile .mv-c-alter{width:auto}
    .mv-zeile .mv-c-kontakt{font-size:13.5px}
    .mv-zeile .mv-c-offen{padding-top:5px}

    /* Was leer ist, braucht auf dem Handy keine Zeile. Fällt `:has` aus, steht
       dort eben ein Strich — die Karte ist dann länger, aber nicht kaputt. */
    .mv-zeile .mv-td:has(> .leer:only-child){display:none}

    .mv-zeile .mv-edit{padding:2px 4px;margin-left:-4px}

    /* Aktionen: mehr Luft dazwischen als am Rechner. Auf einem Touchscreen
       liegen 6 px zwischen zwei Knöpfen innerhalb einer Fingerkuppe — man trifft
       dann „Austritt" statt „Ändern", und das ist eine Rückfrage, die niemand
       erwartet hat. Deshalb 12 px und größere Flächen. */
    .mv-aktionen{position:static;display:flex;justify-content:flex-start;
      gap:12px;flex-wrap:wrap;padding-top:10px;padding-right:52px;background:none}
    .mv-zeile:hover .mv-aktionen{background:none}
    .mv-aktionen::before{content:none}
    .mv-aktionen .btn-xs{padding:8px 14px;font-size:13px}

    /* Das Kuvert immer an derselben Stelle: unten rechts in der Karte. Der
       Innenabstand rechts oben hält die anderen Knöpfe davon fern, damit sich
       nichts überlagert, wenn die Zeile umbricht. */
    .mv-zeile .mv-mailknopf{position:absolute;right:11px;bottom:9px;margin:0;
      padding:8px 12px;font-size:15px;line-height:1}
    .kt-raster{grid-template-columns:1fr}
  }

  /* ── BEITRÄGE & FINANZEN ── */
  .bt-minus{color:var(--bx);font-weight:600}
  .bt-plus{color:var(--gruen);font-weight:600}

  /* ── SPIELPLAN ─────────────────────────────────────────── */
  .pill.vs-verfuegbar{background:var(--ton-gut-flaeche);color:var(--gruen)}
  .pill.vs-wenige{background:var(--ton-achtung-flaeche);color:var(--gold-d)}
  .pill.vs-ausverkauft{background:var(--ton-offen-flaeche);color:var(--bx)}
  .pill.vs-abgesagt{background:var(--ton-ruht-flaeche);color:var(--ton-ruht-schrift);text-decoration:line-through}
  .mv-zeile.vergangen{opacity:.5}
  .sp-status{font-family:var(--f-body);font-size:12px;padding:4px 6px;border-radius:var(--radius);
    border:1px solid var(--line);background:var(--weiss);color:var(--braun);max-width:118px}
  .sp-zaehler{font-size:12px;color:var(--bx);margin-top:-6px}
  .sp-zaehler.ok{color:var(--gruen)}
  /* Schalter statt Häkchen: „öffentlich" ist die folgenreichste Angabe der Zeile. */
  .sp-schalter{position:relative;display:inline-flex;cursor:pointer}
  .sp-schalter input{position:absolute;opacity:0;width:0;height:0}
  .sp-schalter span{width:38px;height:21px;border-radius:var(--radius);background:var(--sand);
    border:1px solid var(--line);transition:background .2s;position:relative;display:block}
  .sp-schalter span::after{content:"";position:absolute;top:2px;left:2px;width:15px;height:15px;
    border-radius:50%;background:var(--weiss);box-shadow:0 1px 3px color-mix(in srgb, var(--braun) 35%, transparent);transition:transform .2s}
  .sp-schalter input:checked + span{background:var(--gruen);border-color:var(--gruen)}
  .sp-schalter input:checked + span::after{transform:translateX(17px)}
  .sp-schalter input:focus-visible + span{outline:2px solid var(--gold);outline-offset:2px}

  /* ── BLATT FÜR DEN TOURISMUS-HUB ── */
  .hub-pruef{border-radius:var(--radius);padding:14px 16px;margin:14px 0 18px;font-size:14px}
  .hub-pruef.fertig{background:var(--ton-gut-flaeche);color:var(--gruen)}
  .hub-pruef.offen{background:var(--sand);color:var(--braun)}
  .hub-pruef ul{list-style:none;margin:8px 0 0;padding:0;display:flex;flex-direction:column;gap:3px}
  .hub-pruef li{font-size:13.5px}
  .hub-pruef li.ok{color:var(--gruen)}
  .hub-pruef li.fehlt{color:var(--bx);font-weight:600}
  .hub-block{margin-bottom:18px}
  .hub-block h3{font-size:12px;letter-spacing:.1em;text-transform:uppercase;color:var(--braun);
    font-family:var(--f-body);font-weight:700;padding-bottom:6px;border-bottom:1px solid var(--line);margin-bottom:8px}
  .hub-feld{display:grid;grid-template-columns:150px 1fr auto;gap:10px;align-items:start;
    padding:7px 0;font-size:14px}
  .hub-bez{color:var(--braun);font-weight:600;font-size:13px}
  .hub-hint{display:block;font-weight:400;font-size:11.5px;color:var(--sepia)}
  .hub-wert{white-space:pre-line;word-break:break-word;color:var(--tinte)}
  .hub-wert .leer{color:var(--bx);font-style:italic}
  .hub-feld .btn-xs.kopiert{background:var(--gruen);color:var(--creme);border-color:var(--gruen)}
  @media screen and (max-width:600px){ .hub-feld{grid-template-columns:1fr;gap:3px} }

  /* ── ANMELDESEITE ──────────────────────────────────────────
     Bewusst schlicht: eine ruhige Karte in der Bildschirmmitte. Kein Bühnenbild,
     keine Werbeflächen — wer hier ist, will sich anmelden. */
  /* Bühnenbild und Fuß sind hier weg — dieselbe Paarung wie beim Textbuch-Editor
     (`body.tb-edit`, weiter unten).

     DIESE ZEILE HAT GEFEHLT, und zwar unsichtbar (13.09.2026): die beiden
     Selektoren standen ohne eigenen Block direkt über dem Kommentar zur
     Kopfzeile und gehörten damit zu DEREN Regel. Ein Kommentar zwischen zwei
     Selektorzeilen trennt sie nicht — CSS liest darüber hinweg. Hero und Fuß
     bekamen also `background:weiß` statt `display:none`, und der Hero blieb auf
     der Anmeldeseite stehen: mitsamt dem, was zuletzt darin stand. Wer sich
     abmeldete, dem stand „Hallo, <Vorname>" über dem Anmeldeformular — der Gruß
     an den gerade Abgemeldeten. `#pheroIn` wird beim Abmelden nicht geleert,
     weil es bis heute niemand musste. */
  body.is-login .phero,
  body.is-login .site-footer{display:none}
  /* Die Kopfzeile ist für den dunklen Hintergrund gebaut — auf der hellen
     Anmeldeseite wäre sie creme auf creme, also unsichtbar. Hier bekommt sie
     eine helle Fassung, damit der Weg zurück zur Website sichtbar bleibt. */
  body.is-login .site-header{background:var(--weiss);border-bottom:1px solid var(--line);
    backdrop-filter:none}
  body.is-login .brand-name{color:var(--bx)}
  body.is-login .brand-sub{color:var(--braun)}
  body.is-login .brand-mark{box-shadow:0 1px 6px color-mix(in srgb, var(--braun) 20%, transparent)}
  body.is-login .nav-link{color:var(--braun)}
  body.is-login .nav-link:hover{color:var(--bx)}
  body.is-login .nav-link::after{background:var(--gold)}
  /* Der Login-Knopf oben rechts ist hier überflüssig — das Formular steht ja da. */
  body.is-login #barActions{display:none}
  /* Auf schmalen Bildschirmen versteckt die Kopfzeile ihre Links. Damit man auch
     dort zurück auf die Website kommt, bleiben sie auf der Anmeldeseite sichtbar. */
  @media screen and (max-width:860px){
    /* Die Striche des Burgers stehen hier auf hellem Grund. */
    body.is-login .nav-burger span{background:var(--bx)}
    /* ABER: aufgeklappt ist das Menü auch auf der Anmeldeseite DUNKEL — es ist
       dieselbe Tafel wie überall (`.site-nav` weiter oben, Verlauf bx-d →
       var(--bx-t)). Die helle Fassung der Kopfzeile gilt nur für die Leiste, nicht
       für das, was aus ihr herausklappt.

       Ohne diese Zeilen gewann `body.is-login .nav-link` mit seinem `body`
       davor gegen `.site-nav .nav-link` — beide zwei Klassen, das eine mit
       einem Element mehr. Die Links standen deshalb genau hier BRAUN auf
       Dunkelrot, während sie im übrigen Mitgliederbereich und auf der Hauptseite creme
       sind: dieselbe Tafel, zwei Farben, je nachdem ob man angemeldet ist. */
    body.is-login .site-nav .nav-link{color:var(--creme)}
    body.is-login .site-nav .nav-link:hover{color:var(--gold-h)}
  }
  body.is-login main{background:var(--creme);min-height:100vh;display:flex;align-items:center;
    justify-content:center;padding:96px var(--gutter) 48px}
  body.is-login .wrap{width:100%}

  .anmeldung{max-width:380px;margin:0 auto;text-align:center;color:var(--tinte)}
  .anmeldung-logo{margin:0 auto 18px;border-radius:50%;background:var(--weiss);
    padding:3px;box-shadow:0 2px 14px color-mix(in srgb, var(--braun) 18%, transparent)}
  .anmeldung h1{font-size:29px;color:var(--bx);line-height:1.15}
  .anmeldung-sub{font-size:13px;letter-spacing:.14em;text-transform:uppercase;
    color:var(--braun);margin-top:8px}
  .anmeldung-form{margin-top:30px;text-align:left}
  .anmeldung-form .field{margin:0 0 14px}
  .anmeldung-form input{width:100%;padding:13px 14px;font-size:16px}
  .anmeldung-form .pw-wrap input{padding-right:46px}
  .anmeldung-vergessen{display:inline-block;margin-top:14px;font-size:14px}
  .anmeldung-fuss{margin-top:30px;padding-top:20px;border-top:1px solid var(--line);
    font-size:14px;color:var(--braun)}
  .anmeldung-fuss a{color:var(--bx);font-weight:600;text-decoration:underline;
    text-underline-offset:3px;text-decoration-color:var(--gold-line);cursor:pointer}
  .anmeldung-fuss a:hover{text-decoration-color:var(--gold)}
  .anmeldung .sep{justify-content:center;margin-top:26px}
  .anmeldung-zurueck{margin-top:14px}
  .anmeldung-zurueck a{font-size:13.5px;color:var(--braun);cursor:pointer}
  .anmeldung-zurueck a:hover{color:var(--bx)}
  @media screen and (max-width:520px){
    body.is-login main{padding:84px var(--gutter) 40px;align-items:flex-start}
  }

  /* ── TEXTBUCH: Übersicht ── */
  .tb-grid{display:grid;gap:16px;grid-template-columns:repeat(auto-fill,minmax(240px,1fr))}
  .tb-card{display:flex;flex-direction:column;gap:9px;align-items:flex-start;text-align:left;cursor:pointer;
    background:var(--sand);border:1px solid var(--gold-line);border-radius:var(--radius);padding:20px;min-height:132px;
    transition:transform .3s var(--ease-soft),box-shadow .3s var(--ease-soft),border-color .3s}
  .tb-card:hover{transform:translateY(-3px);box-shadow:-10px 14px 30px color-mix(in srgb, var(--schatten-warm) 16%, transparent);border-color:var(--gold)}
  .tb-card-t{font-family:var(--f-display);font-size:19px;color:var(--bx);line-height:1.15}
  .tb-card-m{font-size:13px;color:var(--braun)}
  .tb-card-f{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:10px;width:100%;margin-top:auto}
  .tb-card.neu{align-items:center;justify-content:center;background:none;border-style:dashed;color:var(--braun);font-weight:600;gap:6px}
  .tb-card.neu:hover{color:var(--bx);border-color:var(--bx)}
  .tb-card.neu .plus{font-family:var(--f-display);font-size:24px;line-height:1}
  /* Die leise Fassung einer Kachelwand (`wandAbschnitt`, art 'leise'): ohne
     Fläche, halb so hoch, enger gestellt — findbar, aber nicht gleichrangig.
     Die Foto-Wand hatte bis zum 26.10.2026 eine Kopie dieser Kachel
     (`fo-card`); jetzt ist es dieselbe. */
  .tb-grid.klein{grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:10px}
  .tb-grid.klein>*{min-height:0;padding:10px 14px;gap:2px;background:none;border-color:var(--line)}
  .tb-grid.klein .tb-card-t{font-size:15.5px}
  .pill.tb-entwurf{background:var(--ton-wartet-flaeche);color:var(--braun)}
  .pill.tb-gegenlesen{background:var(--ton-unterwegs-flaeche);color:var(--ton-unterwegs-schrift)}
  .pill.tb-gespielt{background:var(--ton-gut-flaeche);color:var(--gruen)}
  .pill.tb-archiv{background:var(--ton-ruht-flaeche);color:var(--ton-ruht-schrift)}

  /* ── TEXTBUCH: Editor ──────────────────────────────────────────
     Alle Maße hängen an vier Zahlen. Vorher standen dieselben Werte als
     64/68/132/250/1250 über den Block verteilt — änderte man eine, verrutschte
     der Rest, und die Eingabezeile stand ohnehin nie unter der Textspalte
     (mittig zentrierter Kasten mit `padding-left:250px`). Jetzt teilen sich
     Seitenspalte, Buch und Eingabe dieselbe Rechnung. */
  /* --tb-klang: der Blauton der Pille „Gegenlesen". Kein CD-Token, deshalb hier. */
  /* `--tb-zeile` ist die Höhe der Eingabezeile und steht deshalb EINMAL da:
     das Textfeld nimmt sie, die Auswahl und der Knopf wachsen über `stretch`
     mit. Vorher gab das Textfeld die Höhe vor (zwei Zeilen plus Innenabstand =
     74px) — und wo es keins gibt, war die Leiste eben 18px flacher. */
  /* `--tb-kopf` und `--leiste` stehen oben bei `html`, weil der Ankersprung
     sie braucht und ein Wert für zwei Zwecke ein Wert bleiben muss. Die Namen
     hier ändern sich nicht — sie zeigen nur auf dieselbe Quelle. */
  body.tb-edit{--tb-kopf:var(--kopf);--tb-side:320px;--tb-mass:1000px;--tb-eingabe:186px;
    --tb-zeile:74px;--tb-klang:var(--ton-unterwegs-schrift)}
  body.tb-edit .phero,body.tb-edit .site-footer,body.tb-edit .site-header{display:none}
  /* Ohne diese Zeile endet `main` bei kurzem Inhalt mitten auf dem Schirm und
     darunter steht der bordeauxrote Seitengrund — bei einem leeren Textbuch
     also fast überall. */
  body.tb-edit main{padding:var(--tb-kopf) 0 0;min-height:100vh}
  body.tb-edit .wrap{max-width:none}
  
  /* Die Leiste über jeder Arbeitsfläche (`kopfLeiste`, wk-bausteine.js). Bis
     zum 26.10.2026 zweimal da, als `.tb-top` und `.fo-top`, mit denselben
     Maßen. Im Textbuch sitzt sie unter der Kopfzeile, sonst ganz oben. */
  .kopf-leiste{position:sticky;top:var(--tb-kopf,0);z-index:30;display:flex;align-items:center;gap:16px;flex-wrap:wrap;
    min-height:var(--leiste);padding:12px var(--gutter);background:var(--weiss);border-bottom:1px solid var(--line)}
  .kopf-leiste-meta{flex:1;min-width:200px}
  .kopf-leiste-tools{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
  .kopf-leiste-sub{display:block;font-size:13px;color:var(--braun);padding-left:1px}
  .tb-titel{font-family:var(--f-display);font-size:23px;line-height:1.15;color:var(--bx);outline:none;
    border:1px dashed transparent;padding:2px 6px;margin-left:-6px}
  .tb-titel:hover{border-color:var(--line)}
  .tb-titel:focus{border-color:var(--gold);background:var(--creme)}
  .tb-status{font-family:var(--f-body);font-size:13px;font-weight:600;color:var(--braun);background:var(--sand);
    border:1px solid var(--line);padding:8px 10px;cursor:pointer}
  .tb-status:focus{border-color:var(--gold);outline:none}
  .tb-auto{display:flex;align-items:center;gap:7px;font-size:12.5px;color:var(--braun);white-space:nowrap}
  .tb-auto .dot{width:7px;height:7px;border-radius:50%;background:var(--gruen);animation:tbpuls 2s infinite}
  @keyframes tbpuls{0%,100%{opacity:1}50%{opacity:.25}}

  /* LESEN: keine Seitenspalte, keine Eingabeleiste — also auch kein Platz, den
     beide sonst brauchen. Sonst stünde das Buch in einer Spalte mit 320px
     Luft links und 186px unten, die niemand füllt. */
  .tb-layout.lesen{display:block}
  .tb-layout.lesen .tb-doc{padding-bottom:60px}
  /* ══ FOTOS: die Kachelwand und die Werkstatt ══════════════════════════
     Dieselbe Bauart wie im Textbuch, und zwar bewusst: „eine Wand aus Kacheln,
     eine davon wählen, dann ganzseitig arbeiten" ist EIN Muster im Mitgliederbereich und
     soll nicht zweimal verschieden aussehen. Die Maße stehen deshalb neben
     denen des Textbuchs und nicht in einer eigenen Ecke. */

  body.fo-edit{--fo-side:320px}
  body.fo-edit .phero,body.fo-edit .site-footer,body.fo-edit .site-header{display:none}
  body.fo-edit main{padding:0;min-height:100vh}
  body.fo-edit .wrap{max-width:none;padding:0}
  .fo-titel{font-family:var(--f-display);font-size:23px;line-height:1.15;color:var(--bx)}
  /* Die Zahl der gewählten Bilder — groß, im Bordeaux des Hauses, damit man
     sie aus dem Augenwinkel sieht, während man im Gitter klickt. Sie ist
     zugleich der Knopf, der die Auswahl aufhebt. */
  .fo-zahl{display:inline-flex;align-items:baseline;gap:7px;cursor:pointer;
    background:var(--bx);color:var(--weiss);border:none;border-radius:var(--radius);padding:6px 14px}
  .fo-zahl b{font-family:var(--f-display);font-size:28px;line-height:1}
  .fo-zahl span{font-size:13px}
  .fo-zahl:hover{opacity:.9}
  /* Leer steht sie trotzdem da, nur gedämpft — sonst rutschte die Spalte beim
     ersten Klick um ihre Höhe nach unten. */
  .fo-zahl.leer{background:var(--sand);color:var(--braun);cursor:default}
  .fo-zahl.leer:hover{opacity:1}
  /* Kopf der Seitenspalte: Auswahlzahl und „alle wählen" (26.10.2026, vorher
     oben in der Leiste, wo sie die Reiter verschoben). */
  .fo-auswahl{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin:0 0 14px}
  .fo-layout{display:grid;grid-template-columns:var(--fo-side) 1fr;align-items:stretch;
    min-height:calc(100vh - var(--leiste))}
  /* Feste Höhe statt max-height — so reicht die weiße Spalte immer bis nach
     unten, auch wenn nur drei Namen darin stehen. Dieselbe Begründung wie bei
     `.tb-side`, und derselbe Aufbau. */
  .fo-side{position:sticky;top:var(--leiste);height:calc(100vh - var(--leiste));overflow-y:auto;
    background:var(--weiss);border-right:1px solid var(--line);padding:18px 14px 40px}
  .fo-side h3{font-family:var(--f-body);font-size:11px;font-weight:600;letter-spacing:.1em;text-transform:uppercase;
    color:var(--braun);margin:0 0 8px;padding-bottom:6px;border-bottom:1px solid var(--gold-line)}
  .fo-doc{padding:16px var(--gutter) 60px;min-width:0}
  .fo-ablage{margin-bottom:16px}

  /* SCHMAL: aus der Spalte wird ein Block über dem Gitter. Sie bleibt oben
     kleben, damit die Namen beim Blättern durchs Gitter nicht weglaufen. */
  @media screen and (max-width:900px){
    body.fo-edit{--fo-side:0px}
    .fo-layout{display:block}
    .fo-side{position:static;height:auto;border-right:none;border-bottom:1px solid var(--line);padding:14px var(--gutter)}
    .fo-doc{padding-top:14px}
  }

  /* Die Prompt-Anleitung im Import-Fenster. */
  .tb-prompt summary{cursor:pointer;font-size:13.5px;font-weight:600;color:var(--bx);padding:6px 0}
  .tb-prompt textarea{width:100%;border:1px solid var(--line);background:var(--weiss);padding:10px;line-height:1.5}
  /* Das Textbuch am Termin: eine Zeile im Kalender-Eintrag, kein eigener Kasten. */
  .tb-termin{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-top:4px}
  .kal-spielt{display:block;margin-top:4px;font-size:15px}
  .kal-spielt b{color:var(--bx)}
  .tb-layout{display:grid;grid-template-columns:var(--tb-side) 1fr;align-items:stretch;
    min-height:calc(100vh - var(--tb-kopf) - var(--leiste))}
  /* Feste Höhe statt max-height: so reicht die weiße Spalte immer bis nach
     unten, auch wenn erst zwei Rollen darin stehen. */
  .tb-side{position:sticky;top:calc(var(--tb-kopf) + var(--leiste));
    height:calc(100vh - var(--tb-kopf) - var(--leiste));overflow-y:auto;
    background:var(--weiss);border-right:1px solid var(--line);padding:18px 14px calc(var(--tb-eingabe) + 20px)}
  .tb-side h3{font-family:var(--f-body);font-size:11px;font-weight:600;letter-spacing:.1em;text-transform:uppercase;
    color:var(--braun);margin:22px 0 8px;padding-bottom:6px;border-bottom:1px solid var(--gold-line)}
  .tb-side h3:first-child{margin-top:0}
  .tb-leer{font-size:12.5px;font-style:italic;color:var(--sepia);padding:4px 6px}
  /* `padding-right` hält die Ecke frei, in der das Löschkreuz sitzt — ohne das
     schöbe ein langer Name es vor sich her. */
  .tb-char,.tb-buehne{position:relative;display:flex;align-items:baseline;gap:7px;flex-wrap:wrap;
    padding:6px 26px 6px 7px;font-size:13.5px}
  .tb-char:hover,.tb-buehne:hover{background:var(--creme)}
  .tb-char-n{font-weight:700;color:var(--bx);outline:none;border:1px dashed transparent;padding:0 3px}
  .tb-char-n:hover{border-color:var(--line)}
  .tb-char-n:focus{border-color:var(--gold);background:var(--creme)}
  .tb-char-k{font-size:11.5px;color:var(--sepia);letter-spacing:.04em}
  /* Besetzung: die realen Menschen hinter der Figur — in derselben Zeile wie
     Figur und Rollenschlüssel, dafür ist die Spalte breiter geworden. */
  .tb-bes-chip{display:inline-flex;align-items:center;gap:4px;font-size:11.5px;font-weight:600;
    color:var(--gruen);background:color-mix(in srgb, var(--gruen) 10%, transparent);padding:2px 4px 2px 9px}
  .tb-bes-chip button{background:none;border:none;cursor:pointer;color:var(--gruen);opacity:.55;
    font-size:11px;line-height:1;padding:2px 4px}
  .tb-bes-chip button:hover{opacity:1;color:var(--bx)}
  .tb-bes-add{background:none;border:1px dashed var(--line);cursor:pointer;
    font-family:var(--f-body);font-size:11.5px;font-weight:600;color:var(--braun);padding:2px 9px;flex-shrink:0}
  .tb-bes-add:hover{border-color:var(--gruen);color:var(--gruen)}
  /* Auswahlfenster: eine lange Namensliste, deshalb mit Suche und Gruppen. */
  .bes-liste{max-height:46vh;overflow-y:auto;border:1px solid var(--line);border-radius:var(--radius);padding:4px 10px}
  .bes-gruppe{padding:8px 0}
  .bes-gruppe+.bes-gruppe{border-top:1px solid var(--line)}
  .bes-gruppe .eyebrow{display:block;margin-bottom:4px}
  .bes-z{display:flex;align-items:center;gap:8px;padding:4px 2px;font-size:14px}
  .tb-add{background:none;border:none;color:var(--gruen);font-family:var(--f-body);font-weight:600;font-size:12px;
    cursor:pointer;padding:6px 7px}
  .tb-add:hover{color:var(--bx)}
  .tb-marken a{display:block;padding:5px 7px;font-size:12.5px;color:var(--tinte);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .tb-marken a:hover{background:var(--creme)}
  .tb-marken a.mk-klang{color:var(--tb-klang)}

  /* Das Deckblatt ist eine ganze Seite, kein Kasten: Titel oben links, die
     Grafik dazwischen, Autor:in unten rechts. Kein Rahmen und kein Hintergrund —
     die Grafik ist ein PNG mit durchsichtigem Grund und soll ins Blatt
     hineinwirken, nicht auf einer Karte liegen. Weil das Bild jedes Mal ein
     anderes ist, sieht auch jedes Deckblatt anders aus, ohne dass am Aufbau
     etwas geändert werden müsste. */
  /* Am Bildschirm ist das Deckblatt nur ein kleiner Entwurf: es zeigt den
     Aufbau — Titel oben links, Grafik dazwischen, Autor:in unten rechts — und
     nimmt dem Text darunter keinen Platz weg. Gedruckt füllt es die Seite. */
  .tb-deckblatt{display:flex;flex-direction:column;gap:10px;max-width:300px;
    margin-bottom:30px;padding-bottom:20px;border-bottom:1px solid var(--gold-line)}
  .tb-deckblatt img{max-height:190px;width:100%;object-fit:contain;object-position:center}
  .tb-dk-leer{display:flex;align-items:center;justify-content:center;min-height:110px;
    font-size:12.5px;font-style:italic;color:var(--sepia);
    border:1px dashed var(--line);padding:16px}
  .tb-dk-titel{align-self:flex-start;font-family:var(--f-script);font-weight:400;
    font-size:26px;line-height:1.15;color:var(--bx)}
  .tb-dk-autor{align-self:flex-end;text-align:right;font-size:13px;font-style:italic;color:var(--braun)}
  .tb-dk-vorschau{width:100%;border:1px solid var(--line);margin-bottom:6px}
  .tb-doc{padding:34px var(--gutter) calc(var(--tb-eingabe) + 60px);max-width:var(--tb-mass);margin:0 auto;width:100%;color:var(--tinte)}
  /* ── DIE LÜCKE ZWISCHEN DEN ABSCHNITTEN ───────────────────────
     Hier stand bis zum 15.09.2026 Text („Hier einfügen", und in der gewählten
     Lücke ein 46px hoher Kasten mit „Hier wird eingefügt"). Zwischen zwei
     Repliken ist das eine Zeile, die niemand gesprochen hat — beim Lesen stört
     sie, und gelesen wird ein Textbuch häufiger als bearbeitet.

     Jetzt ist die Lücke ein schmaler Streifen ohne Inhalt. Wo eingefügt wird,
     sagt eine dünne Linie; WAS dort passiert, sagt die Traube am linken Rand
     (s. u.). Die Höhe springt nicht mehr: der Text stand sonst bei jedem Klick
     um 26px woanders. */
  .tb-gap{position:relative;height:26px;margin:2px 0;cursor:pointer}
  .tb-gap::after{content:"";position:absolute;left:0;right:0;top:50%;height:2px;
    transform:translateY(-50%);background:var(--gold);opacity:0;transition:opacity .18s,height .18s}
  .tb-gap:hover::after{opacity:.45}
  .tb-gap.active{height:34px;margin:8px 0}
  .tb-gap.active::after{opacity:1;height:3px}
  /* ── DIE TRAUBE ───────────────────────────────────────────────
     Rund und nach innen spitz — eine Beere, die mit ihrer SPITZE an der Linie
     andockt. Die Form ist ein Kreis mit EINER eckigen Ecke; 225° gedreht zeigt
     die Ecke waagerecht nach rechts und trifft damit den Anfang der Linie (bei
     135° stand sie senkrecht und zeigte an ihr vorbei). Das „+" steht als
     eigenes Kind darin und dreht deshalb NICHT mit — eine gedrehte Ziffer sieht
     aus wie ein Fehler.

     Sie sitzt im linken Rand der Textspalte (`--gutter`, mindestens 20px) und
     nicht im Satz: 46% ihrer Breite liegen außerhalb, nur die Spitze reicht in
     die Spalte. Beim Zeigen wächst sie, in der gewählten Lücke steht sie ganz
     und schiebt sich leicht gegen die Linie — so findet man die Stelle wieder,
     ohne sie zu lesen. */
  .tb-traube{position:absolute;left:0;top:50%;width:52px;height:52px;display:grid;place-items:center;
    pointer-events:none;opacity:0;transform:translate(-46%,-50%) scale(.5);
    transition:opacity .18s,transform .22s var(--ease-soft)}
  .tb-traube::before{content:"";position:absolute;inset:0;border-radius:50% 50% 50% 0;
    transform:rotate(225deg);background:var(--sand);border:1px solid var(--gold)}
  .tb-traube span{position:relative;font-size:26px;line-height:1;font-weight:700;color:var(--bx)}
  .tb-gap:hover .tb-traube{opacity:1;transform:translate(-46%,-50%) scale(.85)}
  .tb-gap.active .tb-traube{opacity:1;transform:translate(-46%,-50%) scale(1);animation:tbbob 1.8s infinite}
  .tb-gap.active .tb-traube::before{background:var(--bx);border-color:var(--gold)}
  .tb-gap.active .tb-traube span{color:var(--creme)}
  /* Gewippt wird die Traube, nicht ihr Platz: die Verschiebung steckt im
     `translate` der Regeln oben und muss in jedem Schritt mitlaufen. Bewegt
     wird sie seitwärts gegen die Linie — die Spitze soll andocken, und eine
     Bewegung nach oben führte von ihr weg. */
  @keyframes tbbob{0%,100%{transform:translate(-46%,-50%) scale(1)}
    50%{transform:translate(-42%,-50%) scale(1.03)}}

  .tb-block{position:relative}
  .tb-block:hover,.tb-technik:hover,.tb-klang:hover{background:var(--weiss)}
  .tb-del{position:absolute;right:2px;top:4px;opacity:0;transition:opacity .12s;background:none;border:none;
    cursor:pointer;color:var(--sepia);font-size:16px;line-height:1;padding:3px 6px}
  .tb-block:hover .tb-del,.tb-technik:hover .tb-del,.tb-klang:hover .tb-del,.tb-char:hover .tb-del,.tb-buehne:hover .tb-del{opacity:1}
  .tb-del:hover{color:var(--bx)}
  /* In der Seitenspalte saß das Kreuz bisher IM Textfluss und wanderte mit dem
     Namen in die zweite Zeile — samt einer Lücke davor, wo `margin-left:auto`
     den Rest der ersten Zeile aufspannte. Jetzt steht es fest in der Ecke oben
     rechts, genau wie an einem Abschnitt im Skript. */
  .tb-char .tb-del,.tb-buehne .tb-del{right:1px;top:3px;font-size:15px}
  /* Zwei Spalten wie bisher — nur steht der Sprecher jetzt LINKS in seiner
     Spalte statt rechtsbündig an der Textkante. Die Textspalte bleibt
     unverändert; sie ist der Teil, den man liest. */
  .tb-block.dialog{display:grid;grid-template-columns:180px 1fr;gap:2px 22px;padding:7px 30px 7px 0;font-size:19px}
  /* Der Sprechername ist ein <select>, sieht aber aus wie Text — die Liste
     erscheint erst beim Klick. Der Doppelpunkt steht daneben, weil er nicht in
     die Auswahlliste gehört. */
  /* Seit „beide" mehrere Namen bedeuten kann, ist der Sprecher nicht mehr EIN
     Wort — „Jack, Tim" muss in seiner Spalte umbrechen dürfen, statt sie
     aufzureißen und den Text nach rechts zu schieben.

     Dafür reicht es NICHT, `white-space:nowrap` wegzunehmen: dann bricht die
     Zeile auch zwischen dem Namen und dem Doppelpunkt daneben, und der landet
     allein in der nächsten Zeile. `flex` hält die beiden zusammen — umbrechen
     darf der Name INNERHALB seines Knopfes, die Spalte selbst nicht.
     `align-items:baseline`, damit der Doppelpunkt auf der Schriftlinie der
     ERSTEN Namenszeile sitzt und nicht mittig neben einem zweizeiligen Namen. */
  .tb-sprecher{display:flex;align-items:baseline;justify-self:start;min-width:0;
    font-weight:700;font-size:18px;color:var(--bx)}
  /* `.tb-name` ist die gemeinsame Erscheinung: ein Feld, das aussieht wie Text
     und sich erst beim Zeigen als bedienbar zu erkennen gibt. DAHINTER stecken
     inzwischen zwei verschiedene Elemente, und was für das eine richtig ist,
     ist für das andere falsch — deshalb steht das Besondere getrennt darunter. */
  .tb-name{padding:1px 3px;max-width:100%;min-width:0;
    font-family:var(--f-body);font-weight:700;font-size:18px;letter-spacing:.01em;color:var(--bx);
    appearance:none;-webkit-appearance:none;background:none;cursor:pointer;
    border:1px dashed transparent}
  /* DER SPRECHER ist ein <button>. Der zentriert seinen Inhalt von sich aus —
     als er noch ein <select> war, fiel das nicht auf; seit dem Knopf stand ein
     zweizeiliger Name mittig, während jeder einzeilige links stand. Und weil
     „Jack, Tim" mehr als ein Wort ist, muss er IM Knopf umbrechen dürfen. */
  button.tb-name{text-align:left;white-space:normal;overflow-wrap:anywhere;line-height:1.25}
  /* KLANG UND BÜHNENBILD sind <select>. Ohne eigenes Zeichen
     (`appearance:none`) misst der Browser sie zu knapp — beim Klang fehlte der
     letzte Buchstabe. Sie stehen allein auf ihrer Zeile, der Platz kostet also
     nichts; umbrechen dürfen sie dagegen nicht, ein Auswahlfeld ist einzeilig. */
  select.tb-name{padding-right:24px;white-space:nowrap}
  .tb-name:hover{border-color:var(--line);background:var(--creme)}
  /* EINE OFFENE STELLE. „**BEIDE**" aus einem Import: der Text sagt, dass
     mehrere sprechen, aber nicht wer. Sie darf nicht wie ein Name aussehen —
     sonst bleibt sie stehen und fällt erst bei der Leseprobe auf.

     Kein Rot: das CD hat keins (tokens.css führt als einzige Statusfarbe
     `--gruen`, ausdrücklich als Notausgang). Getragen wird die Warnung deshalb
     von der Form — gestrichelt, kursiv, mit einem Fragezeichen dahinter — und
     von Bordeaux-hell, das sich vom gesetzten Namen absetzt, ohne eine sechste
     Farbe ins Haus zu holen. */
  .tb-name.tb-offen{color:var(--bx-h);border-color:currentColor;border-style:dashed;font-style:italic}
  .tb-offen-karte{border-left:3px solid var(--bx-h)}
  .tb-name:focus{outline:none;border-color:var(--gold);background:var(--creme)}
  .tb-text{line-height:1.6;padding:1px 6px;outline:none;border:1px dashed transparent}
  .tb-text:hover{border-color:var(--line)}
  .tb-text:focus{border-color:var(--gold);background:var(--weiss)}
  .tb-block.regie{padding:3px 30px 9px 0}
  .tb-block.regie .tb-text{font-style:italic;color:var(--gruen);font-size:17px;padding-left:0}
  /* Zwei Regieanweisungen hintereinander sind EINE Anweisung, die jemand in zwei
     Absätzen aufgeschrieben hat, und stehen im Buch ohne Luft dazwischen. Das
     steht seit dem 03.09.2026 in `werkzeuge/textbuch.py` und nicht mehr hier:
     im Editor sind es zwei anklickbare Kästen, die ihren Rand brauchen, damit
     man den richtigen trifft. */

  /* VORHANG AUF, darunter „Bühnenbild: …" — beides fett und links, wie der
     Klang. Vorher stand die Marke mittig zwischen zwei Linien; das trennte das
     Blatt optisch stärker, als die Marke im Ablauf wiegt. */
  .tb-technik{position:relative;display:flex;margin:16px 0 8px;padding:4px 30px 4px 0}
  /* Zwei Zeilen, zwei Naturen: „VORHANG AUF" steht fest da (es ergibt sich aus
     der Reihenfolge und ist deshalb nichts, worüber man verfügen könnte), das
     Bühnenbild daneben ist ein Auswahlfeld wie der Sprechername. Getippt wird
     an einer Marke gar nichts mehr. */
  .tb-technik-l{display:flex;flex-direction:column;gap:1px;
    font-size:17px;line-height:1.45;color:var(--tinte);font-weight:700}
  .tb-fest{cursor:default}
  .tb-marke-z{display:flex;align-items:baseline;gap:4px;font-weight:700}

  /* Der Klang steht wie die Bühnenbild-Zeile: fett und ganz links, ohne Wort
     davor. Der Farbton unterscheidet ihn am Bildschirm von der Technik-Marke;
     auf Papier bleibt nur das Fette. */
  .tb-klang{position:relative;display:flex;margin:8px 0;padding:4px 30px 4px 0}
  .tb-klang-l{flex:1;font-size:17px;font-weight:700;line-height:1.45;color:var(--tb-klang)}
  /* Der Klang ist im Text ein Auswahlfeld und trägt deshalb seine eigene Farbe
     — sonst sähe er aus wie ein Sprechername. */
  .tb-klang-l .tb-name{color:var(--tb-klang);font-size:17px}

  /* Die Eingabe steht über der Textspalte, nicht über der ganzen Seite: sie
     beginnt, wo die Seitenspalte endet, und benutzt dasselbe Maß wie `.tb-doc`. */
  .tb-composer{position:fixed;left:var(--tb-side);right:0;bottom:0;z-index:45;background:var(--weiss);
    border-top:1px solid var(--line);box-shadow:0 -8px 22px color-mix(in srgb, var(--tinte) 8%, transparent);padding:12px 0 14px}
  .tb-composer-in{max-width:var(--tb-mass);margin:0 auto;padding:0 var(--gutter);display:flex;flex-direction:column;gap:9px}
  /* GLEICH HOCH IN JEDEM MODUS — und zwar über EINE Zahl, nicht über zwei, die
     zufällig zusammenpassen sollen. */
  .tb-composer-zeile{display:flex;gap:10px;align-items:stretch;min-height:var(--tb-zeile)}
  .tb-modes-zeile{display:flex;align-items:center;gap:14px;flex-wrap:wrap}
  .tb-modes{display:flex;border:1px solid var(--line);overflow:hidden;flex-shrink:0}
  /* Was beim Einfügen entsteht, steht daneben — nicht im Eingabefeld. Dort
     stand es früher als vorgeschriebener Text, und das war eine Einladung,
     darin herumzuschreiben. */
  .tb-vorschau{font-size:13px;color:var(--braun)}
  .tb-vorschau b{color:var(--bx);font-weight:700}
  .tb-modes button{font-family:var(--f-body);font-size:13.5px;font-weight:600;
    padding:8px 14px;background:var(--weiss);border:none;border-right:1px solid var(--line);cursor:pointer;color:var(--braun);border-radius:var(--radius)}
  .tb-modes button:last-child{border-right:none}
  .tb-modes button:hover{background:var(--creme)}
  .tb-modes button.dialog.active{background:var(--bx);color:var(--creme)}
  .tb-modes button.regie.active{background:var(--gruen);color:var(--creme)}
  .tb-modes button.buehne.active{background:var(--gold);color:var(--bx-d)}
  .tb-modes button.klang.active{background:var(--tb-klang);color:var(--creme)}
  .tb-sel{font-family:var(--f-body);font-size:15px;padding:0 12px;border:1px solid var(--line);
    background:var(--weiss);color:var(--tinte);width:210px;flex-shrink:0;transition:box-shadow .15s}
  /* Steht die Auswahl allein in der Zeile (Bühnenbild, Klang — dort gibt es kein
     Textfeld mehr), darf sie den Platz nehmen, den sie sonst dem Text ließe. */
  .tb-sel.breit{flex:1;width:auto;max-width:520px}
  .tb-sel.flash{box-shadow:0 0 0 3px var(--gold)}
  /* Sprechen mehrere, steht statt der Auswahlliste ein Knopf da: eine Liste
     kann nur eine Antwort geben. Er sieht aus wie das Feld, das er ersetzt. */
  .tb-sel-mehr{text-align:left;cursor:pointer;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .tb-mehr{font-family:var(--f-body);font-size:14px;padding:0 10px;border:1px dashed var(--line);
    background:none;color:var(--tinte);cursor:pointer;flex-shrink:0}
  .tb-mehr:hover{border-style:solid;background:var(--creme)}
  /* Feste Höhe statt `rows` + `min-height`: das Feld wächst ohnehin nicht mit
     (kein `resize`, kein Nachrechnen beim Tippen), also darf es auch nicht die
     Höhe der Leiste bestimmen. */
  .tb-text-in{flex:1;resize:none;font-family:var(--f-body);font-size:16px;line-height:1.5;padding:12px 14px;
    border:1px solid var(--line);background:var(--weiss);color:var(--tinte);height:var(--tb-zeile)}
  .tb-text-in.fill{background:color-mix(in srgb, var(--gold) 12%, transparent);border-color:var(--gold);font-weight:600}
  .tb-ein{flex-shrink:0;padding:0 20px;font-size:14px}

  .tb-sel:focus,.tb-text-in:focus{outline:2px solid var(--gold);outline-offset:1px}

  /* `screen and` ist hier nicht schmückend, sondern nötig: eine A4-Seite ist im
     Druck rund 790px „breit", also griffe eine reine `max-width:860px`-Regel
     auch auf Papier — und legte dort Sprecher und Text untereinander, obwohl
     der Platz da ist. Alle Umbruch-Regeln dieser Datei gelten deshalb nur für
     den Bildschirm; fürs Papier ist `wk-print.css` zuständig. */
  @media screen and (max-width:860px){
    body.tb-edit{--tb-side:0px;--tb-eingabe:220px}
    .tb-layout{grid-template-columns:1fr}
    .tb-side{position:static;max-height:none;border-right:none;border-bottom:1px solid var(--line);padding-bottom:20px}
    .tb-composer-zeile{flex-wrap:wrap}
    .tb-sel{width:100%}
    .tb-text-in{min-width:60%}
    .tb-block.dialog{grid-template-columns:1fr;gap:0;font-size:17px}
    /* AM HANDY GIBT ES KEINEN RAND ZUM HINEINLEGEN. `--gutter` ist hier 20px,
       die Traube ist 52 breit — sie hinge zur Hälfte hinter dem Bildschirmrand
       (`body{overflow-x:hidden}` schneidet sie ab, man sähe eine halbe Beere).
       Also rückt sie ganz in die Spalte: die Spitze zeigt weiter auf die Linie,
       nur dockt sie ein Stück weiter innen an. */
    .tb-traube{width:44px;height:44px;transform:translate(-4%,-50%) scale(.5)}
    .tb-traube span{font-size:23px}
    .tb-gap:hover .tb-traube{transform:translate(-4%,-50%) scale(.85)}
    .tb-gap.active .tb-traube{transform:translate(-4%,-50%) scale(1);animation:tbbob-eng 1.8s infinite}
    @keyframes tbbob-eng{0%,100%{transform:translate(-4%,-50%) scale(1)}
      50%{transform:translate(0,-50%) scale(1.03)}}
  }
  /* ── TEXTBUCH: das Deckblatt ───────────────────────────────
     Hier lag einmal das ganze gedruckte Buch. Seit dem 03.09.2026 setzt es der
     Server (`werkzeuge/textbuch.py`) — der Grund waren die Seitenzahlen, die
     ein Browser im Druck gar nicht setzen kann (`counter(page)` gibt es nur in
     den Randfeldern von @page, und die setzen weder Chrome noch Firefox
     um). Hier liegt nur noch das Deckblatt: es trägt als einzige Seite die
     hochgeladene Grafik und soll oft auf anderes Papier, kommt also ohnehin
     einzeln aus dem Drucker.

     Das Stück steht am Bildschirm links außerhalb des Sichtfelds und in
     Druckmaßen — eine Blattbreite, eine Blatthöhe. */
  .tb-druck{position:absolute;left:-10000px;top:0;width:178mm;height:0;overflow:hidden;
    background:#fff;color:#000}
  /* `.tb-blatt` und die kleineren Druckgrößen sind am 03.09.2026 weggefallen:
     das Buch setzt seit dann der Server (`werkzeuge/textbuch.py`), und hier
     liegt nur noch das Deckblatt. Schriftgrad und Umbruch entscheidet reportlab
     — beides steht dort, wo es hingehört, und nur einmal. */
  .tb-druck .tb-deckblatt{max-width:none;width:100%;height:252mm;
    margin:0;padding:0;border:none;gap:10mm}
  .tb-druck .tb-deckblatt img{max-height:none;flex:1;min-height:0;object-fit:contain}
  .tb-druck .tb-dk-titel{font-size:54pt}
  .tb-druck .tb-dk-autor{font-size:13pt}
  .tb-druck .tb-dk-leer{display:none}
  .tb-druck .tb-technik-l>span{display:block}

  /* Der Vorspann: Titel, Besetzung, Bühnenbilder, Klänge, Inhalt. Wer ein
     Textbuch in die Hand bekommt, liest zuerst das. */

  /* Druck: die Arbeitsansicht weicht ganz, das Druckstück tritt an ihre Stelle. */
  @media print{
    .site-header,.site-footer,.phero,.tool-head,
    .kopf-leiste,.tb-layout,.tb-composer{display:none!important}
    body,body.is-in main{background:#fff;color:#000}
    .tb-druck{position:static;left:auto;width:auto;height:auto;overflow:visible}
    .tb-druck .tb-deckblatt{break-after:page;page-break-after:always}
    /* AUF DEM LETZTEN TEIL KEIN UMBRUCH. Ein `break-after:page` am Ende des
       Dokuments erzeugt genau das, was es verspricht: noch eine Seite, und die
       ist leer. „Deckblatt drucken" kam so auf zwei Blätter statt auf eins. */
    .tb-druck>:last-child{break-after:auto!important;page-break-after:auto!important}
    .tb-block.dialog,.tb-klang,.tb-technik{break-inside:avoid;page-break-inside:avoid}
    /* Auf Papier ist nichts blau und nichts bordeaux: das Buch ist schwarz. */
    .tb-sprecher,.tb-klang-l,.tb-technik-l,.tb-dk-titel,.tb-dk-autor{color:#000}
  }

  /* ── Vorhang (wie Hero-Intro der Hauptseite) ── */
  .reveal{position:fixed;inset:0;z-index:70;display:flex;pointer-events:none;visibility:hidden}
  .reveal.show{visibility:visible}
  .reveal .panel{width:50%;height:100%;background:repeating-linear-gradient(90deg,var(--bx-d) 0 18px,var(--bx) 18px 44px),var(--bx);
    box-shadow:inset -30px 0 60px -20px rgba(0,0,0,.5);transition:transform .8s var(--ease-curtain)}
  .reveal .panel.r{box-shadow:inset 30px 0 60px -20px rgba(0,0,0,.5)}
  .reveal.part .panel.l{transform:translateX(-101%)}
  .reveal.part .panel.r{transform:translateX(101%)}

  /* ── Footer wie BaseLayout ── */
  .site-footer{background:var(--bx-d);border-top:1px solid color-mix(in srgb, var(--gold) 30%, transparent);padding:64px var(--gutter) 30px}
  .footer-grid{max-width:var(--maxw);margin:0 auto;display:grid;grid-template-columns:repeat(3,1fr);gap:36px}
  .footer-col h3{font-size:13px;font-weight:600;letter-spacing:.14em;text-transform:uppercase;color:var(--gold);margin-bottom:14px}
  .footer-col p{font-size:14.5px;color:color-mix(in srgb, var(--creme) 62%, transparent);line-height:1.85}
  .footer-col a{transition:color .2s;cursor:pointer}
  .footer-col a:hover{color:var(--gold-h)}
  .extern-arrow{color:var(--gold);font-size:.9em}
  .footer-copy{max-width:var(--maxw);margin:30px auto 0;padding-top:24px;border-top:1px solid color-mix(in srgb, var(--gold) 12%, transparent);font-size:12.5px;color:color-mix(in srgb, var(--creme) 70%, transparent);letter-spacing:.04em}
  @media screen and (max-width:640px){.footer-grid{grid-template-columns:1fr;gap:28px}}

  svg.i{width:22px;height:22px;fill:none;stroke:currentColor;stroke-width:1.6;stroke-linecap:round;stroke-linejoin:round}
  @media(prefers-reduced-motion:reduce){
    html{scroll-behavior:auto}
    *,*::before,*::after{animation-duration:.001ms!important;transition-duration:.001ms!important}
    .tile:hover{transform:none;box-shadow:none}
  }

  /* ══ KARTENVERKAUF ══════════════════════════════════════════════════════
     Gebaut für ein Tablet auf dem Tisch im Foyer, nicht für eine Maus.
     Deshalb: Flächen ab 48 px, nichts hängt an :hover, und die beiden
     Knöpfe, die es wirklich braucht, sind die größten auf der Seite. */
  .kv-termine{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:12px;margin-bottom:22px}
  .kv-termin{display:flex;flex-direction:column;align-items:flex-start;gap:3px;text-align:left;
    min-height:88px;padding:14px 16px;background:var(--weiss);border:1px solid var(--line);
    border-radius:var(--radius);cursor:pointer;transition:border-color .2s,background .2s}
  .kv-termin:hover:not(:disabled){border-color:var(--gold)}
  .kv-termin.aktiv{border-color:var(--gold);border-width:2px;background:var(--sand);padding:13px 15px}
  .kv-termin.gesperrt{opacity:.5;cursor:not-allowed}
  .kv-termin-t{font-family:var(--f-display);font-size:16px;font-weight:600;color:var(--bx-d)}
  .kv-termin-m{font-size:13.5px;color:var(--braun)}
  .kv-termin-r{font-size:13px;color:var(--braun);margin-top:auto}

  /* Der Rest-Zähler. Wer im Foyer draufschaut, soll EINE Zahl sehen. */
  .kv-stand{display:flex;align-items:center;gap:18px;padding:18px 22px;margin-bottom:16px;
    background:var(--weiss);border:2px solid var(--gold-line);border-radius:var(--radius)}
  .kv-stand.knapp{border-color:var(--gold)}
  .kv-stand.aus{border-color:var(--bx);background:var(--sand)}
  .kv-stand-zahl{font-family:var(--f-display);font-size:46px;line-height:1;font-weight:700;color:var(--bx-d);min-width:1.6em;text-align:center}
  .kv-stand.aus .kv-stand-zahl{color:var(--bx)}
  .kv-stand-txt{font-size:14.5px;color:var(--braun);line-height:1.6}
  /* Wer kommt — rechts, leise, zwei Zeilen untereinander. Abgesetzt durch eine
     feine Linie statt einen eigenen Kasten: es gehört zur Restzahl dazu. */
  .kv-stand-wer{margin-left:auto;display:flex;flex-direction:column;gap:2px;padding-left:16px;
    border-left:1px solid var(--gold-line);font-size:13.5px;color:var(--braun);line-height:1.4;text-align:right}
  .kv-stand-wer b{font-family:var(--f-display);font-size:17px;font-weight:600;color:var(--bx-d);
    font-variant-numeric:tabular-nums}

  .kv-posten{display:grid;gap:10px;margin-bottom:14px}
  .kv-posten-z{display:flex;align-items:center;justify-content:space-between;gap:16px;flex-wrap:wrap;
    padding:14px 16px;background:var(--weiss);border:1px solid var(--line);border-radius:var(--radius)}
  .kv-posten-n{display:flex;flex-direction:column;gap:2px;font-size:16px}
  .kv-posten-n .muted{font-size:13.5px}
  .kv-zaehler{display:flex;align-items:center;gap:10px}
  .kv-pm{width:56px;height:56px;font-size:26px;line-height:1;font-weight:700;
    background:var(--sand);color:var(--bx-d);border:1px solid var(--gold-line);border-radius:var(--radius);cursor:pointer}
  .kv-pm:active{background:var(--gold-h)}
  .kv-num{width:74px;height:56px;text-align:center;font-size:22px;font-weight:600;
    border:1px solid var(--line);border-radius:var(--radius);background:var(--weiss);color:var(--bx-d)}
  /* Die Pfeilchen im Zahlenfeld sind auf einem Tablet unbedienbar — die
     großen −/+ daneben sind der Weg. */
  .kv-num::-webkit-outer-spin-button,.kv-num::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}
  .kv-num{-moz-appearance:textfield}

  .kv-summe{display:flex;justify-content:space-between;align-items:baseline;gap:12px;
    padding:12px 16px;font-size:17px;color:var(--braun)}
  .kv-summe b{font-family:var(--f-display);font-size:24px;color:var(--bx-d)}
  .kv-aktionen{display:flex;gap:12px;flex-wrap:wrap}
  .kv-gross{flex:1 1 200px;min-height:60px;font-size:17px}
  .kv-gross:disabled{opacity:.45;cursor:not-allowed}
  .kv-storniert{opacity:.55}
  .kv-storniert .ev-t{text-decoration:line-through}

  /* Finger statt Zeiger: alles noch eine Spur größer.
     Die Termine bleiben NEBENEINANDER — auf dem Tablet im Querformat stehen
     fünf bis sieben Termine im Verkauf, und untereinander schiebt das die
     Eingabe unter den Rand. Volle Breite nur dort, wo wirklich kein Platz
     ist (Handy, Tablet hochkant). */
  @media (pointer: coarse){
    .kv-termin{min-height:76px}
    .kv-pm{width:64px;height:64px}
    .kv-num{height:64px;width:84px}
    .kv-gross{min-height:68px}
  }
  @media screen and (max-width:560px){
    .kv-termine{grid-template-columns:1fr}
  }

  /* Gewählter Zustand bei „Bin dabei" / „Kann nicht".
     Vorher trug „Kann nicht" gewählt wie ungewählt dieselbe Klasse — die Absage
     war gespeichert, aber unsichtbar. Zwei Farben, damit man auf einen Blick
     sieht, was man geantwortet hat. */
  .btn-sm.gewaehlt{font-weight:700;border-width:2px}
  /* GRÜN und nicht mehr Gold (17.09.2026). Gold steht im CD für „Achtung, aber
     nicht schlimm" und trug hier die Zusage — auf einer Karte voller sandfarbener
     Flächen ging sie unter, besonders am Handy. Grün ist der Ton für „dabei"
     (`--ton-gut`), nur als volle Fläche statt als blasse Marke: `--ton-gut-flaeche`
     hebt sich vom Kartengrund gerade mal 1,13:1 ab — das wäre noch leiser
     geworden, nicht lauter.
     Der Kontrast hält: Creme auf `--gruen` sind 8,64:1 (AA braucht 4,5, AAA 7),
     die Fläche gegen den Kartengrund 9,4:1. `--creme` ist im CD ausdrücklich die
     Schrift auf Dunkel, genau wie beim `.btn-primary`. */
  .btn-sm.gewaehlt-ja{background:var(--gruen);border-color:var(--gruen);color:var(--creme)}
  .btn-sm.gewaehlt-nein{background:var(--weiss);border-color:var(--bx);color:var(--bx)}

  /* Wer kann wann — nur für Regie und Vorstand, unter dem Termin über die ganze
     Breite. Drei Listen, jede mit ihrer Zahl in der Überschrift; die Namen
     darunter als einzelne Marken, damit auch neunzig noch zu lesen sind. */
  .bes-zeile{display:flex;flex-direction:column;gap:8px;margin-top:12px;padding-top:11px;
    border-top:1px solid var(--line);font-size:13px;line-height:1.5}
  .bes-block>summary{cursor:pointer;display:flex;align-items:center;gap:8px;
    font-size:12px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--braun)}
  .bes-block>summary::marker{color:var(--gold-d)}
  /* Eckig wie alles im CD — die Zahl ist eine Marke, kein Abzeichen. */
  .bes-n{font-weight:700;letter-spacing:0;padding:1px 7px;border-radius:var(--radius);
    background:var(--sand);border:1px solid var(--line);color:var(--tinte)}
  .bes-namen{display:flex;flex-wrap:wrap;gap:5px 6px;margin:7px 0 2px}
  .bes-name{padding:3px 9px;border-radius:var(--radius);border:1px solid var(--line);
    background:var(--weiss);color:var(--braun)}
  .bes-ja>summary{color:var(--gruen)}
  .bes-ja .bes-name{border-color:var(--gruen)}
  .bes-nein>summary{color:var(--bx)}
  .bes-nein .bes-name{border-color:var(--bx-h);opacity:.85}
  .bes-offen .bes-name{border-style:dashed;opacity:.8}

  /* Steht etwas aus, das noch nicht auf der Website ist? */
  .ws-zeile{display:flex;align-items:center;justify-content:space-between;gap:16px;
    flex-wrap:wrap;padding:12px 16px;margin-bottom:16px;border-radius:var(--radius);font-size:14.5px;line-height:1.55}
  /* Beide Zustände tragen dieselbe Form — sonst springt die Seite, sobald
     etwas aussteht, und man merkt die Änderung an der Bewegung statt am Text. */
  .ws-zeile.ruhig{background:var(--weiss);border:1px solid var(--line);color:var(--braun)}
  .ws-zeile.offen{background:var(--sand);border:1px solid var(--gold)}
  .ws-zeile .muted{display:block;font-size:13px;margin-top:2px}

  /* Eine Zusage ist bindend — das soll man sehen, nicht nur erfahren. */
  .zu-fest{font-size:12px;letter-spacing:.06em;text-transform:uppercase;color:var(--braun);opacity:.75;white-space:nowrap}
  .bes-wann{opacity:.6;font-size:.92em}
  /* Besetzung im Programmplaner: ein Chip je Person. Der ROTE Chip ist ein
     Name, der auf niemanden in der Kartei zeigt — er soll auffallen, nicht
     hübsch sein. Gestrichelter Rand, weil die Zeile eben noch nicht steht. */
  .bes-row{display:flex;flex-wrap:wrap;gap:5px;align-items:center;margin-top:6px}
  .bes-chip{display:inline-flex;align-items:center;gap:5px;font-size:12.5px;
    padding:4px 6px 4px 10px;border-radius:var(--radius);border:1px solid var(--line);
    background:var(--weiss);color:var(--braun)}
  .bes-chip.offen{border:1px dashed var(--bx);background:var(--ton-fehlt-flaeche);color:var(--bx);font-weight:600}
  .bes-chip.leer{border-style:dashed;opacity:.6;padding:4px 10px}

  /* ZU- UND ABSAGE AN DER BESETZUNG (nur bei genau einem Termin).
     Grün und Rot, aber gedämpft: die Chips stehen zu zehnt nebeneinander, und
     Signalfarben in dieser Dichte machen die Zeile unlesbar. Beide tragen
     zusätzlich ein Zeichen — wer Rot und Grün nicht unterscheidet, sieht ✓ und
     ✗, und im `title` steht es ohnehin ausgeschrieben. */
  .bes-chip.dabei{background:var(--ton-gut-flaeche);color:var(--gruen);border-color:color-mix(in srgb, var(--gruen) 30%, transparent)}
  .bes-chip.dabei::before{content:"✓ ";font-weight:700}
  .bes-chip.kannnicht{background:var(--ton-fehlt-flaeche);color:var(--bx);border-color:color-mix(in srgb, var(--bx) 35%, transparent);font-weight:600}
  .bes-chip.kannnicht::before{content:"✗ ";font-weight:700}
  /* „Noch nicht geantwortet" bleibt absichtlich neutral — es ist kein Zustand,
     den jemand verschuldet hat, und drei Farben nebeneinander sind eine zu viel. */
  .bes-chip.unklar{opacity:.75}

  /* Die Zeile eines Songs, in dem jemand fehlt: eine Kante links, kein Block.
     Der Song ist nicht kaputt — er braucht eine Entscheidung. */
  .ev.pl-luecke{border-left:3px solid var(--bx);padding-left:9px}
  .pl-absagen{background:var(--ton-fehlt-flaeche);border:1px solid color-mix(in srgb, var(--bx) 25%, transparent);border-radius:var(--radius);
    padding:10px 12px;margin:8px 0;font-size:14px;line-height:1.9}
  .bes-x{border:0;background:none;cursor:pointer;font-size:15px;line-height:1;
    padding:0 3px;color:inherit;opacity:.55}
  .bes-x:hover{opacity:1}
  .bes-plus{border:1px dashed var(--line);background:none;cursor:pointer;
    font-size:12.5px;padding:4px 10px;border-radius:var(--radius);color:var(--braun);opacity:.8}
  .bes-plus:hover{opacity:1;border-style:solid}
  /* Terminliste im Planer: der Einstieg. Jede Zeile sagt, WANN, WAS und ob
     dafür schon etwas geplant ist — die dritte Angabe ist der Grund, warum die
     Liste besser ist als ein Auswahlfeld. */
  .pl-termine{display:grid;gap:6px}
  .pl-termin{display:grid;grid-template-columns:minmax(150px,auto) 1fr auto;gap:4px 14px;
    align-items:center;text-align:left;width:100%;cursor:pointer;
    border:1px solid var(--line);border-radius:var(--radius);background:var(--weiss);
    padding:9px 12px;font:inherit;font-size:14px;color:var(--tinte)}
  .pl-termin:hover{border-color:var(--gold)}
  .pl-termin.aktiv{border-color:var(--bx);background:var(--sand)}
  /* Ein Stück mit Textbuch wird nicht geplant. Der Termin bleibt sichtbar —
     sonst suchte jemand ihn und fände ihn nirgends —, aber gedämpft und ohne
     Zeigefinger: hier gibt es nichts anzuklicken. */
  .pl-t-wann{font-weight:600}
  .pl-t-was{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
  .pl-t-stand{font-size:12.5px;opacity:.7;white-space:nowrap}
  .pl-mehr{cursor:pointer;font-size:13.5px;color:var(--braun);opacity:.8}
  /* Aufklappbare Pool-Zeile. Der Kopf ist ein Knopf, damit er auch mit der
     Tastatur erreichbar ist — geklickt wird hier oft und schnell. */
  .song-auf{display:block;width:100%;text-align:left;border:0;background:none;
    padding:0;cursor:pointer;font:inherit;color:inherit}
  .song-auf .ev-t{display:block}
  .song-auf:hover .ev-t{color:var(--bx)}
  .ev.song-offen{border-color:var(--gold);background:var(--sand)}
  .song-felder{margin-top:8px;padding-top:8px;border-top:1px solid var(--line)}
  /* Der Titel ist ein Feld wie die anderen, sieht aber aus wie eine
     Überschrift — bis man hineinklickt. Ein Eingabefeld, das sich als solches
     aufdrängt, macht aus einer Liste ein Formular. */
  .song-titel{width:100%;font-size:16px;font-weight:600;color:var(--bx);
    border:1px solid transparent;background:none;padding:3px 6px;margin:-3px 0 0 -6px;
    border-radius:var(--radius);font-family:inherit}
  .song-titel:hover{border-color:var(--line)}
  .song-titel:focus{border-color:var(--gold);background:var(--weiss)}
  .ev-nr{font-size:13px;font-weight:700;opacity:.55}
  .pool-luecken{font-size:13px;background:var(--sand);border-left:3px solid var(--bx);
    padding:7px 10px;border-radius:0 var(--radius) var(--radius) 0;margin:8px 0}
  .pl-gilt{font-size:13px;background:var(--sand);border-left:3px solid var(--gold);
    padding:7px 10px;border-radius:0 var(--radius) var(--radius) 0;margin:8px 0}
  .pill.oeffentlich{background:var(--ton-gut-flaeche);color:var(--gruen)}
  .pill.intern{background:var(--ton-unterwegs-flaeche);color:var(--ton-unterwegs-schrift)}
  .pill.probe{background:var(--ton-wartet-flaeche);color:var(--braun)}
  @media screen and (max-width:640px){.pl-termin{grid-template-columns:1fr}}
  .bes-offen-kasten{border:1px dashed var(--bx);border-radius:var(--radius);padding:10px 12px;margin-bottom:10px}

  /* ── Die Beitrittserklärung im Profil und in der Karteikarte ──────────── */
  /* Ein Kasten IN einer Karte, nicht daneben: das Blatt gehört zu dieser
     Person und nicht in einen eigenen Bereich. `.antrag-kasten--offen` ist
     die Rückfrage — sie bekommt die Vereinsfarbe an die Kante, damit man
     beim Überfliegen sieht, dass hier etwas zu tun ist. */
  .antrag-kasten{margin-top:14px;padding:12px 14px;border:1px solid var(--line);
    border-radius:var(--radius);background:var(--weiss)}
  .antrag-kasten--offen{border-left:3px solid var(--bx)}
  .antrag-kasten p{margin:6px 0 10px}
  .antrag-knoepfe{display:flex;gap:8px;flex-wrap:wrap}

  /* ── Kartenverkauf: Name, Auswertung, Saalplan ────────────────────────── */
  .kv-name{margin-bottom:12px}
  .kv-name label{display:block;font-size:13px;font-weight:600;letter-spacing:.06em;
    text-transform:uppercase;color:var(--braun);margin-bottom:6px}
  .kv-name input{width:100%;height:56px;padding:0 16px;font-size:18px;
    border:1px solid var(--line);border-radius:var(--radius);background:var(--weiss);color:var(--bx-d)}
  /* `.kv-mehr` (der Knopf „Auswertung") ist am 13.09.2026 entfallen — die drei
     Reiter haben ihn ersetzt. Und die Trennlinie darüber ist mit ihm gegangen:
     sie trennte den angehängten Block von der Eingabe. Als Inhalt eines
     Reiters trennt sie nichts mehr, sie stünde nur direkt unter der
     Reiterleiste und sähe aus wie deren zweiter Boden. */
  .kv-auswertung{margin-top:4px}

  /* ── Buchungsliste ──────────────────────────────────────────────────────
     Groß ist der NAME und die ZAHL. Der Betrag steht klein daneben: beim
     Verteilen ist er ohne Bedeutung, und was groß gedruckt ist, wird gelesen. */
  .bu-liste{display:grid;gap:6px}
  .bu{border:1px solid var(--line);border-radius:var(--radius);background:var(--weiss);overflow:hidden}
  .bu.bu-auf{border-color:var(--gold)}
  .bu-weg{opacity:.5}
  .bu-weg .bu-name{text-decoration:line-through}
  /* Das ✕ steht in der ZEILE, nicht im aufgeklappten Bereich: zurücknehmen
     ist der eine Handgriff, der vor Ort schnell gehen muss. */
  .bu-reihe{display:flex;align-items:stretch}
  .bu-x{flex:0 0 auto;border:0;border-left:1px solid var(--line);background:none;
    cursor:pointer;font-size:15px;color:var(--braun);opacity:.5;padding:0 14px}
  .bu-x:hover{opacity:1;color:var(--bx);background:var(--sand)}
  .bu-kopf{flex:1;min-width:0;display:grid;grid-template-columns:1fr auto minmax(0,auto);
    grid-template-areas:"name zahl sitz" "klein zahl sitz";
    gap:0 12px;align-items:center;width:100%;text-align:left;
    border:0;background:none;font:inherit;color:inherit;cursor:pointer;padding:10px 13px}
  .bu-kopf[disabled]{cursor:default}
  .bu-kopf:hover{background:var(--sand)}
  .bu-name{grid-area:name;font-size:17px;font-weight:600;color:var(--bx);line-height:1.25}
  .bu-zahl{grid-area:zahl;font-size:26px;font-weight:700;color:var(--bx);
    font-variant-numeric:tabular-nums;line-height:1}
  .bu-klein{grid-area:klein;font-size:12.5px;color:var(--braun);opacity:.75}
  /* DIESE Buchung, nicht der Abend: wie viele Stühle welcher Art. */
  .bu-mix{grid-area:sitz;display:flex;gap:10px;align-items:baseline}
  .bu-mix-z{font-size:11.5px;color:var(--braun);white-space:nowrap;text-align:right}
  .bu-mix-z b{display:block;font-size:17px;color:var(--bx);
    font-variant-numeric:tabular-nums;line-height:1.1}
  .bu-auf-inhalt{border-top:1px solid var(--line);padding:11px 13px;background:var(--sand)}
  /* Ändern: EIN Feld, EIN Knopf. Kein ±-Rechnen — wer am Telefon hört „wir
     kommen jetzt zu siebt", tippt 7. */
  .bu-aendern{display:flex;gap:8px;align-items:center;flex-wrap:wrap}
  .bu-aendern label{font-size:13px;color:var(--braun);font-weight:600}
  .bu-n{width:84px;font-size:19px;font-weight:700;text-align:center;
    font-variant-numeric:tabular-nums}
  /* Grün = mehr als gebucht, rot = weniger, schwarz = unverändert. */
  .bu-n-mehr{color:var(--gruen);border-color:var(--gruen)}
  .bu-n-weniger{color:var(--bx);border-color:var(--bx)}
  /* Keine Browser-Pfeile: die Zahl bestimmen die Knöpfe daneben. Zwei winzige
     Pfeilchen neben einem 40px-Knopf sind eine Einladung zum Danebentippen. */
  .bu-n,.sp-w-n{-moz-appearance:textfield}
  .bu-n::-webkit-outer-spin-button,.bu-n::-webkit-inner-spin-button,
  .sp-w-n::-webkit-outer-spin-button,.sp-w-n::-webkit-inner-spin-button{
    -webkit-appearance:none;margin:0}
  .bu-pm[disabled]{opacity:.35;cursor:default}
  .bu-pm[disabled]:hover{border-color:var(--line);background:var(--weiss)}
  /* Groß und mit Abstand: getippt wird am Tablet, oft im Stehen. */
  .bu-pm{width:40px;height:40px;flex:0 0 40px;border:1px solid var(--line);
    border-radius:var(--radius);background:var(--weiss);color:var(--bx);
    font-size:22px;line-height:1;cursor:pointer;font-family:inherit}
  .bu-pm:hover{border-color:var(--gold);background:var(--gold-h)}
  .pr-sorten{display:flex;align-items:center;gap:5px;margin-top:6px;
    font-size:12.5px;color:var(--braun)}
  .pr-sorten input{width:52px;text-align:center;font-variant-numeric:tabular-nums}
  .kv-sorten{display:flex;gap:10px;margin-top:8px;flex-wrap:wrap}
  .kv-sorte{flex:1;min-width:110px;background:var(--sand);border-radius:var(--radius);
    padding:7px 10px;font-size:13px;color:var(--braun)}
  .kv-sorte b{display:block;font-size:22px;color:var(--bx);
    font-variant-numeric:tabular-nums;line-height:1.15}
  /* Der Verlauf ist eine Zahlenspalte, keine Sätze: er wird überflogen. */
  .bu-verlauf{display:grid;gap:2px;margin-top:10px;padding-top:8px;
    border-top:1px solid var(--line)}
  .bu-v-z{display:flex;justify-content:space-between;gap:12px;font-size:12.5px;
    color:var(--braun);opacity:.85}
  .bu-v-z b{font-variant-numeric:tabular-nums;font-size:13.5px}

  /* ── Der gezeichnete Saal ───────────────────────────────────────────────
     5 Spalten × 12 Zeilen — SCHEMATISCH, nicht maßstäblich (21.09.2026).
     Vorher lagen hier zehn schmale Spalten mit Gängen dazwischen, damit die
     Proportionen des Raums stimmen. Das Ergebnis: ein Tischkasten war so
     schmal, dass „Schmiedener" als „Schmied…" darin stand — und die Namen
     sind der einzige Grund, warum dieser Plan gezeichnet wird. Jetzt ist jede
     Kachel so groß wie möglich; die Bühne oben genügt zur Orientierung. */
  .sp-saal{display:grid;grid-template-columns:repeat(5,1fr);
    grid-auto-rows:46px;gap:8px;margin-top:10px;padding:14px;
    background:var(--sand);border:1px solid var(--line);border-radius:var(--radius);
    /* Lieber schieben als quetschen: unter 720px werden fünf Spalten so schmal,
       dass wieder kein Name hineinpasst — und dann hat das Raster nichts mehr
       zu sagen. Der Plan wird ohnehin am Schreibtisch gelegt, nicht im Gehen. */
    overflow-x:auto}
  .sp-saal>*{min-width:0}
  .sp-saal .sp-tisch{display:flex;flex-direction:column;padding:8px 10px;
    overflow:hidden;min-width:0}
  .sp-saal .sp-kopf{font-size:12.5px;margin-bottom:4px;flex:0 0 auto}
  .sp-gaeste{display:flex;flex-direction:column;gap:2px;min-height:0}
  /* EIN VOLLER TISCH LÄSST SICH SCROLLEN. Die Kästen haben feste Höhe — sie
     sitzen in einem Raster, das den Saal abbildet, und ein Kasten, der mit der
     Gästezahl wächst, schöbe die halbe Bestuhlung nach unten. Vorher stand hier
     `overflow:hidden`: ab der fünften Gruppe fielen Namen lautlos heraus, und
     man kam nicht mehr an sie heran. Der Zähler oben („11/14") stimmte zwar
     weiter, aber wer einen bestimmten Namen suchte, fand ihn nicht.
     Jetzt scrollt die Gästeliste IM Kasten; die Kopfzeile bleibt stehen, weil
     sie nicht mitscrollt (`flex:0 0 auto`) — und mit ihr der Zähler, der sagt,
     wie viele es insgesamt sind.
     Der Balken bleibt SICHTBAR: ein Scrollbereich, den man nicht sieht, ist
     derselbe Fehler noch einmal — man weiß dann nicht, dass da etwas ist. */
  .sp-saal .sp-gaeste{flex:1 1 auto;overflow-y:auto;overscroll-behavior:contain;
    scrollbar-width:thin;scrollbar-color:var(--braun) transparent}
  .sp-saal .sp-gaeste::-webkit-scrollbar{width:6px}
  .sp-saal .sp-gaeste::-webkit-scrollbar-thumb{
    background:var(--braun);border-radius:var(--radius);opacity:.5}
  /* DIE NAMEN SIND DER ZWECK. Ein Klick nimmt die Gruppe vom Tisch — deshalb
     ein Knopf, aber einer, der wie Text aussieht. */
  .sp-saal .sp-gast{display:flex;justify-content:space-between;align-items:baseline;
    gap:5px;width:100%;text-align:left;border:0;background:none;cursor:pointer;
    font-family:inherit;font-size:16px;font-weight:600;color:var(--bx);
    line-height:1.2;padding:2px 3px;border-radius:var(--radius);min-width:0;
    /* Nicht schrumpfen: in einem scrollenden Flex-Container quetscht der
       Browser die Kinder sonst zusammen, statt scrollen zu lassen. */
    flex:0 0 auto}
  .sp-saal .sp-gast:hover{background:var(--bx);color:var(--creme)}
  .sp-g-name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .sp-g-z{flex:0 0 auto;font-variant-numeric:tabular-nums;font-size:14px;opacity:.75}
  .sp-saal .sp-tisch.sp-frei{background:var(--weiss);opacity:.7}
  /* Möbel sind NUR Orientierung — dezent, damit die Namen tragen. */
  .sp-moebel{display:flex;align-items:center;justify-content:center;text-align:center;
    font-size:10.5px;font-weight:600;letter-spacing:.06em;border-radius:var(--radius);
    text-transform:uppercase;color:var(--braun);padding:2px;opacity:.75}
  .sp-buehne{background:var(--bx);color:var(--creme);opacity:1}
  .sp-tanz{background:var(--weiss);border:1px dashed var(--line)}
  .sp-kueche{background:var(--weiss);border:1px solid var(--line)}
  .sp-weg{background:var(--weiss);border:1px dashed var(--braun)}
  /* Noch ohne Tisch: je Gruppe eine Zeile — Tisch, wie viele, setzen. */
  /* Gelesen wird von links nach rechts: WER, WIE VIELE, WOHIN, setzen. */
  .sp-w-z{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin-top:10px}
  .sp-w-name{font-size:15px;font-weight:600;color:var(--bx);min-width:130px}
  .sp-w-zaehler{display:flex;gap:5px;align-items:center}
  .sp-w-n{width:60px;font-size:18px;font-weight:700;text-align:center;
    font-variant-numeric:tabular-nums}
  .sp-w-von{font-size:12px;color:var(--braun);opacity:.65;white-space:nowrap}

  /* HIER STAND `.wk-select` — das einzige Auswahlfeld im Mitgliederbereich mit eigenem
     Pfeil, fertig gebaut und an genau EINER von einundfünfzig Stellen benutzt.
     Es steht jetzt in `wk-felder.css` und gilt damit für alle, auch für das
     einzige Auswahlfeld der Hauptseite, das dort unabhängig ungestylt war.
     Geschrieben wird es von niemandem mehr von Hand: `auswahl()` in
     `wk-bausteine.js` setzt die Hülle von selbst. */
  @media screen and (max-width:720px){
    .sp-saal{grid-auto-rows:40px;gap:6px;padding:10px;min-width:640px}
    .sp-saal .sp-tisch{padding:5px 6px}
    .sp-saal .sp-gast{font-size:14px}
  }

  .sp-leiste{display:flex;justify-content:space-between;align-items:center;gap:12px;
    flex-wrap:wrap;margin-bottom:12px;font-size:13.5px}
  .sp-plan{display:grid;grid-template-columns:repeat(auto-fill,minmax(180px,1fr));gap:10px}
  .sp-tisch{background:var(--weiss);border:1px solid var(--line);border-radius:var(--radius);padding:10px 12px}
  .sp-tisch.voll{border-color:var(--bx)}
  .sp-kopf{display:flex;justify-content:space-between;font-size:13.5px;color:var(--braun);
    padding-bottom:6px;margin-bottom:6px;border-bottom:1px solid var(--line)}
  .sp-gast{display:flex;justify-content:space-between;gap:8px;width:100%;text-align:left;
    padding:7px 9px;margin-bottom:4px;font-size:14px;background:var(--sand);
    border:1px solid transparent;border-radius:var(--radius);cursor:pointer}
  .sp-gast span{opacity:.65;font-variant-numeric:tabular-nums}
  .sp-gast.gewaehlt{border-color:var(--gold);background:var(--gold-h)}
  .sp-leer{font-size:13px;font-style:italic;color:var(--braun);opacity:.6}
  .sp-warte{margin-top:12px;padding:10px 12px;background:var(--sand);
    border:1px solid var(--gold-line);border-radius:var(--radius);font-size:13.5px}
  .sp-warte .sp-gast{display:inline-flex;width:auto;margin:4px 6px 0 0;background:var(--weiss)}

/* Nur auf Papier sichtbar (Vereinskopf, Stand-Datum, Unterschriftszeile).
   Sichtbar gemacht wird es in wk-print.css — hier steht nur die Gegenseite. */
.nur-druck{display:none}

/* ── SPIELPLAN: TERMINE ALS AUFKLAPPBARE KARTEN ──────────────
   Vorher eine Tabelle mit elf Spalten. Sie sah aus wie eine Liste zum
   Abhaken, obwohl dort die wichtigste Entscheidung fällt — und zwei
   Felder (Gruppen, Ticket-Link) passten gar nicht mehr hinein.
   Jetzt: zugeklappt eine Zeile zum Überfliegen, aufgeklappt vier Blöcke
   mit Luft dazwischen. */
  .spt-liste{display:grid;gap:8px}
  /* Abendbesetzung (1112): am Handy antippen, deshalb groß genug für einen
     Daumen und umbrechend statt quer zu scrollen. */
  .umschalter{font-family:var(--f-body);font-size:14px;font-weight:600;min-height:38px;padding:6px 12px;
    border:1px solid var(--line);border-radius:var(--radius);background:var(--weiss);color:var(--braun);cursor:pointer}
  .umschalter:hover{border-color:var(--bx)}
  .umschalter.an{background:var(--ton-gut-flaeche);color:var(--ton-gut-schrift);border-color:var(--ton-gut-schrift)}
  /* Abgeraten, nicht gesperrt: blass, aber antippbar. */
  .umschalter.grau:not(.an){opacity:.5;border-style:dashed}
  .bes-grund{margin-left:6px;font-size:12px;font-weight:400}
  .bes-wahl,.bes-chips{display:flex;flex-wrap:wrap;gap:6px}
  .bes-wahl{margin:10px 0 14px}
  .bes-rolle{padding:10px 0;border-top:1px dashed var(--line)}
  .bes-rolle-kopf{display:flex;justify-content:space-between;gap:8px;align-items:baseline;margin-bottom:6px}
  .bes-ab{margin-left:6px;font-size:12px;font-weight:600;padding:1px 6px;border-radius:var(--radius);
    background:var(--ton-offen-flaeche);color:var(--ton-offen-schrift)}
  /* Die einzige Besetzung ist eine Marke, kein Knopf: es gibt nichts umzuschalten. */
  .bes-einzig{display:inline-flex;align-items:center;cursor:default}
  .bes-warn{margin:8px 0 0;font-size:13px;padding:6px 10px;border-radius:var(--radius);
    background:var(--ton-achtung-flaeche);color:var(--ton-achtung-schrift)}
  .bes-wie{display:flex;flex-wrap:wrap;gap:6px;align-items:center;margin:-6px 0 14px;font-size:13px}
  .bes-fair{display:grid;grid-template-columns:repeat(auto-fill,minmax(170px,1fr));gap:4px 16px}
  .bes-fair>div{display:flex;justify-content:space-between;gap:8px;padding:4px 0;border-bottom:1px dashed var(--line)}
  .spt{background:var(--weiss);border:1px solid var(--line);border-radius:var(--radius);overflow:hidden}
  .spt.auf{border-color:var(--gold);box-shadow:0 6px 20px -12px color-mix(in srgb, var(--braun) 50%, transparent)}
  .spt.vergangen{opacity:.6}
  .spt.abgesagt .spt-wann{text-decoration:line-through}

  .spt-kopf{display:grid;grid-template-columns:minmax(160px,auto) minmax(110px,1fr) auto 24px;
    align-items:center;gap:14px;width:100%;text-align:left;padding:13px 16px;cursor:pointer}
  .spt-kopf:hover{background:var(--sand)}
  .spt-wann{font-family:var(--f-display);font-size:16px;font-weight:600;color:var(--bx-d)}
  .spt-kicker{font-size:14px;color:var(--braun)}
  .spt-kicker .leer{opacity:.5;font-style:italic}
  .spt-meta{font-size:13px;color:var(--braun);text-align:right;font-variant-numeric:tabular-nums}
  .spt-pfeil{font-size:13px;color:var(--sepia);text-align:center}

  .spt-body{padding:4px 16px 16px;border-top:1px solid var(--line)}
  .spt-block{padding:14px 0;border-bottom:1px dashed var(--line)}
  .spt-block:last-of-type{border-bottom:none}
  .spt-block .eyebrow{display:block;margin-bottom:8px}
  /* Die Felder fließen in Reihen statt in feste Spalten: was nicht mehr
     passt, rutscht in die nächste Zeile — auf dem Tablet im Foyer genauso
     wie am großen Bildschirm. */
  .spt-reihe{display:flex;flex-wrap:wrap;gap:12px;align-items:flex-end}
  .spt-f{margin:0;min-width:130px}
  .spt-f label{white-space:nowrap}
  .spt-f textarea{min-height:56px}

  .spt-gruppen{display:flex;flex-wrap:wrap;align-items:center;gap:14px;margin-top:12px}
  .spt-glabel{font-size:13px;letter-spacing:.06em;text-transform:uppercase;color:var(--braun)}
  .spt-schalter{margin-bottom:10px;font-size:14.5px}

  .spt-fuss{display:flex;justify-content:space-between;align-items:center;gap:14px;flex-wrap:wrap;
    padding-top:14px;margin-top:4px;border-top:1px solid var(--line);font-size:13.5px}

/* ── AUFTRITTE: eingeplant oder nur zur Kenntnis ─────────────
   Seit dem 29.08. sieht jedes Mitglied ALLE Termine des Vereins. Damit das
   nicht zur Zumutung wird, muss man auf einen Blick sehen, welche einen
   selbst betreffen — sonst liest man zehn Zeilen, um zwei zu finden. */
  .ev.nicht-gefragt{opacity:.55}
  .ev.nicht-gefragt:hover{opacity:.8}
  .kal-eingeplant{font-size:12.5px;font-weight:600;letter-spacing:.04em;text-transform:uppercase;
    color:var(--gruen);white-space:nowrap}
  .kal-nicht{display:flex;flex-direction:column;align-items:flex-end;gap:1px;
    font-size:12.5px;color:var(--braun);white-space:nowrap}
  /* Die Karte hat jetzt zwei Stockwerke: oben Termin + Antwort nebeneinander,
     darunter die Namen über die ganze Breite. */
  .kal-ev{flex-direction:column;align-items:stretch;gap:0}
  .kal-kopf{display:flex;align-items:center;justify-content:space-between;gap:14px}
  .kal-tat{display:flex;flex-direction:column;align-items:flex-end;gap:7px}
  .kal-knoepfe{display:flex;gap:6px}
  /* „3 dabei" — die letzte Auskunft vor der eigenen Entscheidung, deshalb
     direkt über den Knöpfen und nicht in der Zeile mit Datum und Ort. */
  /* DER ZUSATZ-HINWEIS IST KEINE METAZEILE.

     „Bitte Essen mitbringen" stand hier in derselben Schrift wie Datum und Ort —
     also da, wo das Auge nach Angaben zum Termin sucht und nicht nach einer
     Aufforderung. Wer ihn überliest, steht mittags ohne Essen da. Deshalb ein
     eigener Block mit Marke am Rand: er soll nach etwas aussehen, das man TUN
     muss, nicht nach etwas, das man nachschlagen kann. */
  .kal-hinweis{margin:6px 0 0;padding:6px 10px;font-size:14px;color:var(--tinte);
    background:var(--sand);border-left:3px solid var(--gold)}

  .kal-zahl{font-size:12.5px;color:var(--braun);white-space:nowrap}
  /* AM HANDY: die Antwort rutscht unter den Termin, und die beiden Knöpfe
     teilen sich die Breite — links und rechts, gleich groß. Am rechten Rand
     wurden sie schmal und schmaler, bis „Kann nicht" umbrach. */
  @media screen and (max-width:640px){
    .kal-kopf{flex-direction:column;align-items:stretch;gap:12px}
    .kal-tat{align-items:stretch;gap:8px}
    .kal-knoepfe{display:grid;grid-template-columns:1fr 1fr;gap:10px}
    .kal-knoepfe .btn-sm{width:100%}
    .kal-nicht{align-items:flex-start;white-space:normal}
    .kal-eingeplant,.kal-frei,.kal-zahl,.kal-extra{white-space:normal}
  }
  .kal-nicht .muted{font-size:12px}
  /* EXTRA AUSGEWÄHLT — die Ausnahme, und sie steht klein unter dem grünen
     „Du bist eingeplant". Ohne sie sieht der Termin aus wie einer, bei dem man
     ohnehin dabei wäre; er ist aber einer, für den die Regie einen aus einer
     anderen Gruppe geholt hat. Das negative `margin-top` frisst die 7px Lücke
     von `.kal-tat`: die Zeile gehört zur Marke darüber, nicht daneben. */
  .kal-extra{font-size:12px;color:var(--braun);white-space:nowrap;margin-top:-5px}
  /* „Kannst dabei sein" — die Gruppe ist gefragt, die Person ist nicht besetzt.
     Bewusst leiser als das grüne „Du bist eingeplant": es ist eine Einladung,
     keine Verpflichtung, und beide dürfen nicht gleich laut sein. */
  .kal-frei{font-size:12.5px;font-weight:600;letter-spacing:.04em;text-transform:uppercase;
    color:var(--bx-h);white-space:nowrap}

  /* FREISTELLUNGEN: die Knöpfe stehen unten, mit Luft und einer Linie davor.
     Vorher klebten sie direkt unter dem Textfeld — man drückte auf „Senden",
     während man noch am Text war. Ein Schritt, der Post an eine fremde Schule
     auslöst, verträgt einen Zentimeter Abstand. */
  .fr-aktionen{margin-top:26px;padding-top:18px;border-top:1px solid var(--gold-line)}

/* ── ABSCHNITTE IM ABLAUF (1057) ──────────────────────────────
   Eine Zeile, die kein Song ist: „Block 2", „Pause", „Zugabe". Sie muss auf
   den ersten Blick anders aussehen als das, was gespielt wird — sonst sucht
   man am Pult die Nummer, die sie nicht hat. Deshalb keine Nummer, keine
   Felder, sondern eine Marke im Bordeaux des Hauses. */
.pl-abschnitt-zeile{background:color-mix(in srgb, var(--bx) 5%, transparent);border-left:3px solid var(--bx)}
.pl-abschnitt-feld{width:100%;font-family:var(--f-display);font-size:16px;font-weight:700;
  color:var(--bx);background:none;border:1px dashed transparent;padding:4px 6px;border-radius:var(--radius)}
.pl-abschnitt-feld:hover{border-color:var(--line)}
.pl-abschnitt-feld:focus{outline:none;border-color:var(--gold);background:var(--weiss)}
/* ── „NUR DIESMAL" AN DER SETLIST-ZEILE ───────────────────────
   Der wegwerfbare Hinweis eines Auftritts („ohne Tuba", „Zugabe"). Er steht
   unter den Songfeldern und muss sich von ihnen unterscheiden, weil er etwas
   anderes ist: die Felder gehören dem Song und gelten immer, diese Zeile gilt
   einmal. Deshalb kursiv, in Gold gerahmt, ohne Fläche — sichtbar, aber nicht
   so gewichtig wie der Titel darüber. */
.pl-hinweis-feld{width:100%;margin-top:6px;font-size:13.5px;font-style:italic;
  color:var(--braun);background:none;border:1px dashed transparent;padding:4px 6px;border-radius:var(--radius)}
.pl-hinweis-feld::placeholder{font-style:italic;opacity:.75}
.pl-hinweis-feld:hover{border-color:var(--line)}
.pl-hinweis-feld:focus{outline:none;border-color:var(--gold);background:var(--weiss)}
/* Im Archiv wird er gelesen, nicht getippt. */
.pl-hinweis-gelesen{display:block;margin-top:4px;font-size:13.5px;font-style:italic;
  border-left:2px solid var(--gold);padding-left:8px}
/* Doppelbesetzung eines Songs unter „Alle Abende" — grau und klein: sie ist
   die Ausnahme und soll nur dem auffallen, der sie sucht. */
.pl-je-abend{display:block;margin-top:4px;font-size:12.5px;color:var(--braun);font-style:italic}

/* In der Lese-Ansicht des Archivs gibt es nichts zu tippen — dort steht die
   Überschrift als Marke. */
.pl-abschnitt.gelesen{font-family:var(--f-display);font-size:16px;font-weight:700;color:var(--bx);
  border-left:3px solid var(--bx);padding:6px 10px;margin-top:6px}

/* ── DER KONTAKTBOGEN (1096) ──────────────────────────────────
   Zweihundert Bilder eines Abends, und der ganze Zweck ist: mehrere auf
   einmal auswählen. Deshalb ein Gitter mit fester Spaltenbreite statt einer
   Liste — das Auge findet eine Szene an der Bildfolge, nicht am Dateinamen.

   `auto-fill` und nicht `auto-fit`: bei drei Bildern sollen es drei bleiben
   und nicht drei auf Plakatgröße gezogene werden. */
/* GLEICH HOHE ZEILEN, ECHTE SEITENVERHÄLTNISSE (21.09.2026).

   Bis hierher war der Kontaktbogen ein Gitter aus QUADRATEN, 150 px, mit
   `object-fit:cover`. Das hatte einen Grund — gleich hohe Zellen springen nicht
   und lassen sich mit der Maus überstreichen —, aber es kostete zu viel: ein
   Hochformat war auf ein Quadrat beschnitten, und was oben und unten fehlte,
   war oft der Kopf. Wer beurteilen soll, ob ein Bild taugt, sah nicht das Bild.

   Jetzt stehen die Bilder in Zeilen gleicher HÖHE und behalten ihre Breite —
   ein Panorama ist breit, ein Hochformat schmal. Das ist der Aufbau jeder
   Bildstrecke, und er kommt hier ohne eine Zeile JavaScript aus:

     · die Zeile ist ein `flex-wrap`-Container mit fester Höhe je Kachel;
     · jede Kachel bekommt ihr Seitenverhältnis als `--ar` ins Attribut
       (`bildGitterKacheln`) und daraus ihre Grundbreite;
     · `flex-grow` im Verhältnis von `--ar` dehnt die letzte Lücke einer Zeile
       auf die breiten Bilder, nicht gleichmäßig auf alle. So bleibt der
       Anschnitt unter fünf Prozent, statt ein Hochformat zu strecken.

   `--zh` ist die Zeilenhöhe. Sie steht am Container, damit eine Ansicht sie
   überschreiben kann, ohne die Kacheln anzufassen.

   DIE OBERGRENZE ist das Gegenstück zum Dehnen: ohne sie zöge ein einzelnes
   Bild in der letzten Zeile sich über die ganze Breite und stünde als
   Riesenpanorama unter dem Bogen. */
.bild-gitter{display:flex;flex-wrap:wrap;gap:10px;margin-top:10px;--zh:230px}
/* Der Tag über den Bildern eines Abends — im Auftritt (Stück und Jahr) stehen mehrere untereinander. */
.fo-abend{font-family:var(--f-display);font-size:16px;margin:18px 0 0;color:var(--tinte)}
.fo-abend:first-child{margin-top:0}
.bild-rahmen{margin:0;position:relative;border-radius:var(--radius);
  height:var(--zh);flex:var(--ar,1.5) 0 calc(var(--zh) * var(--ar,1.5));
  max-width:calc(var(--zh) * 2.6);min-width:0;
  overflow:hidden;border:2px solid transparent;background:var(--sand)}
/* `cover` schneidet nur noch das an, was das Dehnen der Zeile hinzugibt —
   wenige Prozent an den Seiten. Das GANZE Bild zeigt die Lightbox. */
.bild-rahmen img{display:block;width:100%;height:100%;object-fit:cover}
/* Auf dem Telefon sind 230 px fast der halbe Bildschirm. 140 px zeigen zwei
   bis drei Bilder je Zeile — genug, um einen Stapel durchzusehen. */
@media screen and (max-width:640px){.bild-gitter{--zh:140px;gap:6px}}
/* AUSGEWÄHLT muss man aus zwei Metern Entfernung sehen — wer einen Stapel
   markiert, schaut nicht genau hin, sondern klickt im Takt. Deshalb nicht nur
   ein Rand, sondern auch das Bordeaux des Hauses als Schleier. */
.bild-rahmen.fertig{border-color:var(--gruen)}
/* FERTIG TRITT ZURÜCK (26.10.2026). Der grüne Rahmen allein war beim
   Durchsehen kaum zu sehen — gemeldet von JD. Jetzt sind fertige Bilder grau
   und blass, und was noch Arbeit ist, steht in Farbe: das Auge findet die
   offenen, ohne zu suchen. Beim Darüberfahren kommt die Farbe zurück — man
   will auch ein fertiges Bild ansehen können, bevor man es öffnet. */
.bild-rahmen.fertig img{filter:grayscale(1);opacity:.55;transition:opacity .12s,filter .12s}
.bild-rahmen.fertig:hover img,.bild-rahmen.fertig:focus-visible img{filter:none;opacity:1}
.bild-rahmen.fertig .bild-marke .chip.ja{font-weight:600}
.bild-rahmen.an{border-color:var(--bx)}
/* Der Rand allein ging im Takt unter (25.10.2026): 2 px Bordeaux auf einem
   dunklen Bühnenfoto. Jetzt ein dicker Innenrand und ein kräftigerer Schleier. */
.bild-rahmen.an::after{content:"";position:absolute;inset:0;
  box-shadow:inset 0 0 0 4px var(--bx);
  background:color-mix(in srgb, var(--bx) 28%, transparent);pointer-events:none}
/* Die Nummer des gewählten Bildes, oben links (die Lupe sitzt rechts). Nicht
   gewählt steht dort nichts — erst wenn eine Auswahl läuft, ein leeres Feld
   mit „+", der sagt: dieses kommt beim Klick dazu. */
.bild-nr{position:absolute;top:6px;left:6px;z-index:1;min-width:28px;height:28px;padding:0 7px;
  display:none;place-items:center;border-radius:var(--radius);pointer-events:none;
  font-family:var(--f-display);font-size:15px;font-weight:600;line-height:1}
.bild-rahmen.an .bild-nr{display:grid;background:var(--bx);color:var(--weiss);
  box-shadow:0 0 0 2px var(--weiss)}
.wahl-laeuft .bild-rahmen:not(.an) .bild-nr{display:grid;color:var(--weiss);
  border:2px solid var(--weiss);background:color-mix(in srgb, var(--tinte) 35%, transparent)}
/* Was nicht gewählt ist, tritt zurück, solange gewählt wird — und kommt beim
   Überfahren nach vorn, damit man sieht, was der Klick gleich dazunimmt. */
.wahl-laeuft .bild-rahmen:not(.an) img{opacity:.5;filter:grayscale(.6);transition:opacity .12s,filter .12s}
.wahl-laeuft .bild-rahmen:not(.an):hover img{opacity:1;filter:none}
.wahl-laeuft .bild-rahmen:not(.an):hover .bild-nr{background:var(--bx);border-color:var(--bx)}
.bild-rahmen[role="button"]{cursor:pointer}
/* Wo der Klick nichts auswählt, macht er das Bild groß — und sagt es vorher. */
.bild-rahmen.zoom{cursor:zoom-in}
.bild-rahmen[role="button"]:focus-visible{outline:2px solid var(--gold);outline-offset:2px}
/* EINE ZEILE, NIE MEHR. Die Marke lag über dem Bild, und bei einem Gruppenbild
   wuchs sie auf drei Zeilen — sie verdeckte genau das, was man beurteilen will.
   Gekürzt wird jetzt schon im Text (zwei Namen und eine Zahl, `bildMarkeText`);
   diese Regel ist der Riegel dahinter, damit ein langer Vorname es nicht doch
   noch umbricht. */
.bild-marke{position:absolute;left:0;right:0;bottom:0;padding:4px;
  background:color-mix(in srgb, var(--tinte) 62%, transparent);
  font-size:11.5px;line-height:1.3;text-align:center;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.bild-marke .chip{max-width:100%;overflow:hidden;text-overflow:ellipsis}
/* Noch nicht aufbereitet: das Bild liegt zwar da, aber als Original, und die
   kleine Fassung fehlt noch. Es SOLL auffallen — sonst hält man den Stapel
   für fertig und wundert sich später über die Ladezeiten. */
.bild-warte{position:absolute;left:0;right:0;top:0;padding:3px 4px;
  background:var(--ton-offen-flaeche);color:var(--ton-offen-schrift);
  font-size:11px;text-align:center}
/* Aufgegeben ist nicht dasselbe wie unterwegs. Der Minutenlauf versucht es
   nicht noch einmal, also darf hier auch nicht „gleich soweit" stehen — ein
   Fehler, der wie Fortschritt aussieht, wird nie behoben. */
.bild-warte.kaputt{background:var(--ton-fehlt-flaeche);color:var(--ton-fehlt-schrift)}
.bild-rahmen.kaputt{border-color:var(--ton-fehlt-schrift)}
/* Die Lupe liegt IM Bild und nicht daneben: im Kontaktbogen wählt der Klick
   aufs Bild aus, groß ansehen ist ein zweiter Wunsch und braucht eine eigene
   Fläche. Sie zeigt sich beim Überfahren — und auf Geräten ohne Zeiger
   dauerhaft, denn dort gibt es kein Überfahren. */
.bild-lupe{position:absolute;top:4px;right:4px;z-index:1;width:26px;height:26px;
  display:grid;place-items:center;cursor:pointer;
  border:1px solid color-mix(in srgb, var(--sand) 40%, transparent);
  border-radius:var(--radius);font-size:13px;line-height:1;
  background:color-mix(in srgb, var(--tinte) 55%, transparent);color:var(--sand);
  opacity:0;transition:opacity .12s}
.bild-rahmen:hover .bild-lupe,.bild-lupe:focus-visible{opacity:1}
@media (hover:none){.bild-lupe{opacity:.85}}

/* ── DURCHKLICKEN ─────────────────────────────────────────────────────────
   Links das Gesicht, rechts die Namen. Zwei Spalten und nicht drei: was im
   Kontaktbogen die Seitenspalte ist, ist hier die ganze rechte Hälfte — der
   Durchgang hat genau eine Frage, und die darf Platz haben. */
/* „Fotograf dieses Abends: Maria Schulz [ändern]" — eine Zeile über der
   Ablage, kein Formular. Sie ist eine Auskunft und soll auch so aussehen. */
.fo-urheber{display:flex;align-items:center;gap:8px;flex-wrap:wrap;
  font-size:13.5px;color:var(--braun);margin:0 0 10px}
.ges-durchgang{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,300px);
  gap:26px;align-items:start;padding-top:6px}
/* Die Bilder haben die Breite, die Namen 300 px (16.10.2026 umgedreht): die
   Antwort ist EIN Klick, die Prüfung „alle dieselbe Person?" die Arbeit. */
@media screen and (max-width:820px){.ges-durchgang{grid-template-columns:1fr;gap:16px}}

/* DAS FENSTER SCHNEIDET, DAS BILD LIEGT DARIN UND WIRD VERSCHOBEN. Es liegt
   keine Datei je Gesicht auf der Platte — der Ausschnitt entsteht aus der
   800er-Vorschau, die der Kontaktbogen ohnehin geladen hat. Die Maße rechnet
   `gesAusschnitt` und schreibt sie ans Bild; hier steht nur der Rahmen. */
/* Die linke Spalte klebt beim Blättern oben — die Namensreihe rechts ist
   länger als das Gesicht links, und wer scrollt, soll trotzdem sehen, wen er
   gerade benennt. */
/* Links das große Gesicht, daneben ALLE weiteren der Gruppe in einer Fläche,
   die selbst scrollt — die Seite bleibt stehen, das Hauptgesicht im Blick. */
.ges-links{display:flex;gap:16px;align-items:flex-start;min-width:0}
.ges-vergleich{flex:1;min-width:0}
.ges-vergleich .ges-reihe{margin-top:0;max-height:calc(100vh - 230px);overflow-y:auto;padding:2px}
@media screen and (max-width:820px){.ges-links{flex-direction:column}
  .ges-vergleich .ges-reihe{max-height:60vh}}
.ges-rechts{min-width:0;position:sticky;top:calc(var(--leiste) + 12px)}
/* ── NACHTRAGEN, BILD FÜR BILD (`wk-nachtragen.js`) ───────────────────────
   Das Bild groß, an jedem Gesicht sein Schild. Der Rahmen bleibt dünn — er
   sagt nur „ungefähr hier"; das Schild darunter sagt, wer. */
.nach-kopf{display:flex;justify-content:space-between;align-items:center;gap:10px;
  flex-wrap:wrap;margin:0 0 12px}
.nach-links{min-width:0}
.nach-fortschritt{display:flex;align-items:center;gap:10px;flex:1;min-width:200px;max-width:520px}
.nach-fortschritt .balken{flex:1;height:10px}
.nach-zahl{font-size:13.5px;white-space:nowrap;font-variant-numeric:tabular-nums}
.nach-bild{position:relative;width:fit-content;max-width:100%;line-height:0;
  border-radius:var(--radius);overflow:hidden;background:var(--tinte)}
.nach-bild img{display:block;width:auto;height:auto;max-width:100%;max-height:calc(100vh - 220px)}
.nach-tag{position:absolute;padding:0;cursor:pointer;background:none;
  border:1px solid var(--weiss);border-radius:var(--radius);
  box-shadow:0 0 0 1px color-mix(in srgb, var(--tinte) 60%, transparent)}
.nach-tag span{position:absolute;top:100%;left:50%;transform:translateX(-50%);margin-top:3px;
  padding:2px 7px;border-radius:var(--radius);white-space:nowrap;
  font:600 12px/1.3 var(--f-body);background:var(--bx);color:var(--weiss)}
/* Offen fällt auf — es ist die Frage, die noch fehlt. */
.nach-tag.st-offen{border:2px dashed var(--gold)}
.nach-tag.st-offen span{background:var(--gold);color:var(--tinte)}
.nach-tag.st-fremd span{background:color-mix(in srgb, var(--tinte) 75%, transparent)}
/* Ein Abbild (1125) — gepunktet: da ist ein Gesicht, aber kein Mensch. */
.nach-tag.st-abbild{border:2px dotted var(--weiss)}
.nach-tag.st-abbild span{background:color-mix(in srgb, var(--tinte) 60%, transparent)}
/* Angeklickt: der Rest des Bildes tritt zurück, wie im Durchgang. */
.nach-tag.an{border:2px solid var(--weiss);z-index:2;
  box-shadow:0 0 0 1px var(--tinte),0 0 0 9999px color-mix(in srgb, var(--tinte) 45%, transparent)}
.nach-tag:focus-visible{outline:2px solid var(--gold);outline-offset:2px}
.nach-warn{color:var(--ton-offen-schrift)}
/* DIE ZEILE UNTER DEM BILD — in Durchgang und Nachtragen gleich gebaut
   (26.10.2026): links, was man entscheidet, rechts außen der Ausweg. */
.wege-zeile{display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin-top:10px}
.wege-raus{margin-left:auto}
/* So breit wie das große Gesicht, nicht wie die Zeile darunter: mit
   „Abbild" (26.10.2026) wurde die Zeile breiter als das Bild, die Spalte
   wuchs mit, und zwischen großem und kleinen Gesichtern stand eine Lücke.
   `min-content` nimmt das Breiteste, das nicht umbrechen kann — das Bild —,
   und die Knöpfe brechen darunter in eine zweite Reihe um. */
.ges-haupt{display:flex;flex-direction:column;flex:0 0 auto;width:min-content}
/* Der eine Weg weiter am Ende eines Schritts. */
.schritt-zeile{gap:10px;align-items:center;flex-wrap:wrap;margin:6px 0 14px}
.nach-geschafft .schritt-zeile{justify-content:center;margin-top:14px}
.nach-weg{cursor:pointer;border:none}
/* Der Schluss nach „Bild für Bild": ein Haken, der einmal aufspringt. Grün,
   weil es ein Zustand ist (fertig), keine Werbung. */
.nach-geschafft{text-align:center;max-width:52ch;margin:24px auto;padding:8px}
.nach-geschafft h3{font-size:28px;margin:12px 0 6px}
.nach-geschafft-haken{width:72px;height:72px;margin:0 auto;border-radius:50%;
  display:grid;place-items:center;font-size:38px;line-height:1;
  background:var(--ton-gut-flaeche);color:var(--ton-gut-schrift);
  animation:nachHurra .5s cubic-bezier(.3,1.6,.5,1) both}
@keyframes nachHurra{from{transform:scale(.3);opacity:0}to{transform:scale(1);opacity:1}}
@media(prefers-reduced-motion:reduce){.nach-geschafft-haken{animation:none}}
.ges-fenster{display:block;position:relative;overflow:hidden;flex:0 0 auto;
  border-radius:var(--radius);background:var(--sand)}
.ges-fenster img{position:absolute;max-width:none}
/* Das gemeinte Gesicht: ein heller Rahmen mit dunkler Kante (auf hellem wie
   dunklem Bild zu sehen), und alles drumherum etwas dunkler — der riesige
   Schatten IST die Abdunklung, `overflow:hidden` am Fenster schneidet ihn ab. */
.ges-kasten{position:absolute;pointer-events:none;border:1px solid var(--weiss);
  border-radius:var(--radius);
  box-shadow:0 0 0 1px var(--tinte),0 0 0 9999px color-mix(in srgb, var(--tinte) 38%, transparent)}
.ges-zum-bild{padding:0;border:none;background:none;cursor:zoom-in;line-height:0;
  border-radius:var(--radius);flex:0 0 auto}
.ges-zum-bild:focus-visible{outline:2px solid var(--gold);outline-offset:2px}
/* Im ganzen Bild nur der Rahmen, ohne Abdunkeln — dort geht es gerade um die
   Umgebung. */
.ges-orig{position:relative;width:fit-content;max-width:100%;margin:10px auto 0;line-height:0}
.ges-orig img{margin:0}
.ges-orig .ges-kasten{box-shadow:0 0 0 1px var(--tinte),0 0 0 3px color-mix(in srgb, var(--bx) 60%, transparent)}
.ges-reihe{display:flex;flex-wrap:wrap;gap:6px;margin-top:10px;align-items:center}
/* Jedes Vergleichsbild ist ein Knopf: anklicken nimmt es aus der Gruppe. Der
   Zustand muss aus zwei Metern zu sehen sein — wer eine Gruppe prüft, schaut
   nicht genau hin. Deshalb nicht nur ein Rand, sondern die abgewählten
   ausgegraut und halb durchsichtig: was nicht mehr dazugehört, soll auch nicht
   mehr mitreden. */
.ges-w{position:relative;display:inline-block;line-height:0;
  border:2px solid transparent;border-radius:var(--radius);transition:border-color .12s}
.ges-w.an{border-color:var(--bx)}
/* Seit dem 26.10.2026 wählt der Klick aufs Gesicht (`.ges-wahl`), und die
   Lupe oben rechts zeigt das Foto — wie an den Bildern: sichtbar beim
   Überfahren, auf Geräten ohne Zeiger immer (`.bild-lupe`). */
.ges-w .ges-wahl{cursor:pointer}
.ges-w:not(.an) .ges-zum-bild{opacity:.4;filter:grayscale(1)}
.ges-gross{position:relative;display:inline-block;line-height:0}
/* „Eben: Mia · 3 Gesichter — Rückgängig": klein, aber über der Frage, damit
   ein Fehlklick auffällt, bevor der nächste kommt. */
.ges-zuletzt{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin:0 0 10px;padding:6px 10px;
  font-size:13px;background:var(--sand);border-radius:var(--radius)}
.ges-zuletzt .btn-sm{margin-left:auto}
.ges-unter{margin-top:8px}
.ges-w:hover .bild-lupe,.ges-gross:hover .bild-lupe{opacity:1}

/* Der Vorschlag ist der einzige Knopf in Bordeaux auf dieser Seite. Das ist
   Absicht: er ist die Antwort, die in neun von zehn Fällen stimmt, und wer
   durchklickt, soll ihn finden, ohne zu lesen. */
.ges-vorschlag{width:100%;justify-content:center;margin-bottom:2px}
/* Zwei Kandidaten (Zwillinge): gleich breit, gleich gewichtet — keiner ist der Vorschlag. */
.ges-zwei .ges-vorschlag{flex:1;width:auto}
.ges-namen{display:flex;flex-wrap:wrap;gap:6px;max-height:44vh;overflow-y:auto;
  padding:2px}
.ges-namen kbd{opacity:.6;margin-right:2px}
.ges-schluss{max-width:70ch;padding-top:6px}
/* Wie weit die Aufbereitung ist — ein Balken statt eines Kreisels: er sagt
   nicht nur „es tut sich was", sondern wie lange noch. */
.balken{display:flex;height:8px;background:var(--sand);border-radius:var(--radius);overflow:hidden}
.balken span{display:block;height:100%;background:var(--bx);transition:width .6s ease}
.balken .in-arbeit{background:color-mix(in srgb, var(--bx) 25%, transparent)}

/* GROSS ANSEHEN — das ganze Bild, in seinem eigenen Seitenverhältnis.
   `width:auto;height:auto` mit zwei Obergrenzen statt `width:100%`: so bleibt
   ein Hochformat hochkant und ein Querformat quer, ohne Balken daneben und
   ohne dass irgendwo gestreckt wird. `object-fit` braucht es dann gar nicht
   mehr — es gibt keinen Kasten, in den etwas hineingezwängt würde. */
.bild-gross img{display:block;width:auto;height:auto;
  max-width:100%;max-height:72vh;margin:10px auto 0;
  border-radius:var(--radius);background:var(--tinte)}

/* Ein Befehl zum Abtippen oder Kopieren — bisher gab es dafür nichts, und ein
   `<pre>` ohne Zutun sähe aus wie ein Versehen. `user-select:all` macht aus
   dem Doppelklick eine vollständige Auswahl: wer einen rsync-Aufruf halb
   kopiert, merkt es erst an der Fehlermeldung. */
.code-block{margin:0;padding:10px 12px;border-radius:var(--radius);
  background:var(--sand);border:1px solid var(--line);
  font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;
  font-size:13px;line-height:1.5;overflow-x:auto;user-select:all}

/* DAS ZEICHEN AM BELEG (1099) — `WK-4F2A`, zum Abtippen und Vorlesen.

   Monospace, weil es abgeschrieben wird: in einer Proportionalschrift stehen
   `4F2A` und `4E2A` fast gleich breit, und die Stelle, an der man sich
   verliest, ist genau die, an der man sich vertippt. `user-select:all` macht
   aus einem Doppelklick das ganze Zeichen — ein halb kopiertes wäre schlimmer
   als ein abgetipptes, weil es richtig aussieht.

   Kein `--gold` und kein Markenton: das Zeichen ist Technik, keine Aussage
   über einen Zustand. Die Statusfarben bleiben dem Status. */
.zeichen{display:inline-block;padding:1px 6px;border-radius:var(--radius);
  background:var(--sand);border:1px solid var(--line);
  font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;
  font-size:.92em;letter-spacing:.04em;white-space:nowrap;user-select:all}

/* DIE NAMENSREIHE beim Markieren — Blöcke nach Wahrscheinlichkeit.
   „Kann nicht" steht unten und gedämpft, aber NICHT versteckt: die Zusage sagt
   etwas über den Abend, nicht darüber, wer auf einem Bild ist. Zu neunzig
   Prozent stimmt sie; die restlichen zehn sucht man sonst vergeblich. */
.bild-namen{margin:4px 0 2px}
.bild-nam-block{margin-top:8px}
.bild-nam-block>.eyebrow{display:flex;align-items:center;gap:6px;margin-bottom:4px}
.bild-nam-block.abseits{opacity:.62;border-top:1px solid var(--line);
  margin-top:12px;padding-top:8px}
.bild-nam-block.abseits:hover,.bild-nam-block.abseits:focus-within{opacity:1}
/* Sitzt der Name auf ALLEN gewählten Bildern, entfernt der Klick ihn — das
   muss man vorher sehen. `halb` heißt: auf manchen, der Klick trägt nach. */
.bild-nam.an{border-color:var(--bx);
  background:color-mix(in srgb, var(--bx) 14%, transparent)}
.bild-nam.halb{border-color:var(--gold-d);border-style:dashed}

/* Der Kasten `.bild-werkzeug` stand hier bis zum 16.09.2026: das Werkzeug
   erschien mit der Auswahl mitten über dem Gitter und schob es nach unten. In
   der Werkstatt hat es einen festen Platz — die Seitenspalte `.fo-side`, die
   immer steht und nur ihren Inhalt wechselt. Die Regel dahinter gilt weiter
   und steht bei `bildSeite`: nichts, was gerade nichts tut. */
