/* ============================================================
   PERSONAL OS — DIE BAUSTEINE.  Fassung v34 (24.08.2026)

   Hier steht die Oberflaeche als Material: Knoepfe, Flaechen, Zeilen,
   Felder, Anzeigen, Schale. Was eine BUEHNE ausmacht — das Blatt, die
   Achse, die Modulkarte, die Zeitlinsen —, steht in `buehnen.css`.
   Was sich BEWEGT, steht in `motion.css`. Was eine ZAHL ist, steht in
   `tokens.css`. Vier Blaetter, vier Fragen, keine Ueberschneidung.

   DAS PRINZIP: Alles ist aus DERSELBEN Flaeche gepresst. Ein Element ist
   entweder GEHOBEN (`--neo-auf`) oder GEDRUECKT (`--neo-ein`) — es gibt
   keinen dritten Zustand und keine vierte Farbe. Kein Kasten mit Rand,
   kein Glas im Inhalt, keine gefaerbte Platte. Wer hier eine Kante
   zeichnet, hat das Material nicht verstanden: Eine Kante trennt zwei
   Dinge, ein Relief formt eines.

   Herkunft: `Personal OS Design System/parts/*.css`, dort aus der App
   gespiegelt und in v5 auf Neomorphismus gebracht. Die Bewegung, die
   dort in den Regeln stand, ist beim Uebernehmen nach `motion.css`
   gewandert — sonst stuende sie an vier Orten.
   ============================================================ */

/* ============================================================
   0 · DER GRUND
   ============================================================ */

*,*::before,*::after{box-sizing:border-box}
p,h1,h2,h3,h4,h5,h6,figure,fieldset,ul,ol{margin:0;padding:0}
ul,ol{list-style:none}
button,input,select,textarea{font:inherit;color:inherit;background:none;border:0}
button{cursor:pointer;text-align:left}
svg{display:block}
img{max-width:100%;height:auto}

html{overscroll-behavior-y:none;-webkit-text-size-adjust:100%;overflow-x:clip}

body{
  margin:0;
  background:var(--grund);
  color:var(--tinte);
  font:var(--type-body);
  -webkit-font-smoothing:antialiased;
  text-rendering:optimizeLegibility;
  font-variant-numeric:tabular-nums;
  overscroll-behavior-y:none;
}

a{color:var(--akzent-schrift);text-decoration:underline;
  text-decoration-color:var(--linie-stark);text-underline-offset:3px}
a:hover{color:var(--tinte);text-decoration-color:currentColor}
::selection{background:var(--tinte-hauch-stark);color:var(--tinte)}

/* Der Fokusring ist nie weg. Wer ihn entfernt, macht die App fuer den
   unbedienbar, der keine Maus hat (Kodex Z3). */
:focus-visible{outline:2px solid var(--akzent-glueh);outline-offset:3px;border-radius:var(--radius-xs)}

*{scrollbar-width:thin;scrollbar-color:var(--linie-stark) transparent}
::-webkit-scrollbar{width:10px;height:10px}
::-webkit-scrollbar-track{background:transparent}
::-webkit-scrollbar-thumb{background:var(--linie-stark);border-radius:var(--radius-pill);
  border:3px solid transparent;background-clip:padding-box}
::-webkit-scrollbar-thumb:hover{background:var(--tinte-fern);background-clip:padding-box}
::-webkit-scrollbar-corner{background:transparent}

/* Die vier Helfer, die ueberall gelten. */
.lm-label{font:var(--type-label);letter-spacing:var(--tracking-label);
  text-transform:uppercase;color:var(--tinte-fern)}
.lm-num{font-variant-numeric:tabular-nums;letter-spacing:var(--tracking-metric)}
.lm-plate{background:var(--flaeche);border-radius:var(--radius-md);box-shadow:var(--neo-auf)}
.lm-script{font:var(--type-script);color:var(--tinte)}
[hidden]{display:none !important}
.nur-vorlesen{position:absolute;width:1px;height:1px;padding:0;margin:-1px;
  overflow:hidden;clip-path:inset(50%);white-space:nowrap;border:0}


/* ============================================================
   1 · KNOEPFE, FLAECHEN, ZEILEN — DIE BAUSTEINE
   ============================================================ */

/* ---------- Knöpfe ----------
   Alle Knöpfe sind dasselbe Material. Die Primäraktion führt durch
   Schriftgewicht und — als einzige — die wandernde Chromkante drumherum
   (.lm-rand). Drücken = einsinken, nicht färben. */
.knopf{
  display:inline-flex;align-items:center;justify-content:center;gap:var(--space-3);
  min-height:var(--griff);padding:0 var(--space-6);
  font:var(--type-body-strong);
  border:0;border-radius:var(--radius-md);
  background:var(--flaeche);color:var(--tinte-still);
  box-shadow:var(--neo-auf);
  cursor:pointer;white-space:nowrap;
}
.knopf:hover:not(:disabled){color:var(--tinte)}
.knopf:active:not(:disabled){box-shadow:var(--neo-ein)}
.knopf:disabled{opacity:.42;cursor:not-allowed}
.knopf-primary{color:var(--tinte)}
.knopf-ghost{background:none;box-shadow:none}
.knopf-ghost:hover:not(:disabled){background:var(--tinte-hauch)}
.knopf-ghost:active:not(:disabled){box-shadow:var(--neo-ein);background:var(--flaeche)}
.knopf-gefahr{color:var(--glut-schrift)}
.knopf-sm{min-height:34px;padding:0 var(--space-5);font:var(--type-small-strong);border-radius:var(--radius-sm)}
.knopf-lg{min-height:52px;padding:0 var(--space-7);font:var(--type-title);border-radius:var(--radius-lg)}
.knopf-breit{width:100%}

/* ---------- Die Chromkante um die EINE Primaeraktion je Buehne ----------
   Ein Verlauf, der sich dreht, unter einem Knopf, der 1 px kleiner ist
   als sein Rahmen. Uebrig bleibt eine wandernde Haarlinie.

   Wo es WebGL gibt, legt `js/ds/effekte.js` zusaetzlich den Shader-Ring
   (`vendor/metallrand.js`) darueber — dasselbe Bild, nur aus echtem
   Licht statt aus einem Verlauf. Faellt der aus, traegt diese Kante
   allein (Kodex G1: der Rueckfall ist sichtbar, nicht nichts). */
.lm-rand{position:relative;display:inline-flex;isolation:isolate;
  border-radius:calc(var(--radius-md) + 1px);padding:1px;overflow:hidden}
.lm-rand::before{content:"";position:absolute;left:50%;top:50%;
  width:160%;aspect-ratio:1;translate:-50% -50%;z-index:-1;
  background:var(--chrom-lauf)}
.lm-rand>.knopf{width:100%;border-radius:var(--radius-md);
  box-shadow:inset 0 1px 0 var(--licht-innen)}
.lm-rand>.knopf:active{box-shadow:var(--neo-ein)}
.lm-rand.ist-breit{display:flex}
.lm-rand.ist-breit>.knopf{flex:1}

.ikon{
  display:inline-grid;place-items:center;flex:none;
  width:var(--griff);height:var(--griff);
  background:var(--flaeche);border:0;border-radius:50%;
  color:var(--tinte-still);cursor:pointer;
  box-shadow:var(--neo-auf);
}
.ikon:hover{color:var(--tinte)}
.ikon:active{box-shadow:var(--neo-ein)}
.ikon:disabled{opacity:.4;cursor:not-allowed}
.ikon-sm{width:40px;height:40px}
.ikon-lg{width:50px;height:50px}
.ikon-ghost{background:none;box-shadow:none}
.ikon-ghost:hover{background:var(--tinte-hauch)}
.ikon-ghost:active{background:var(--flaeche);box-shadow:var(--neo-ein)}
.ikon-quiet{color:var(--tinte-fern)}
.ikon[aria-pressed="true"]{box-shadow:var(--neo-ein);color:var(--tinte)}

.knopfreihe{display:flex;flex-wrap:wrap;gap:var(--space-4);align-items:center}

.stillzeile{
  background:none;border:0;padding:var(--space-3) 0;
  font:var(--type-small);color:var(--tinte-still);cursor:pointer;
  text-decoration:underline;text-decoration-color:var(--linie-stark);
  text-underline-offset:4px}
.stillzeile:hover{color:var(--tinte);text-decoration-color:currentColor}
.stillzeile.ist-gefahr{color:var(--glut-schrift)}

/* ---------- Platten ----------
   Die Platte ist eine gehobene Form aus dem Grundmaterial — kein Rand.
   ton="field" ist die GEDRÜCKTE Fassung (eine Mulde im Material). */
.platte{
  background:var(--flaeche);
  border:0;
  border-radius:var(--radius-lg);
  padding:var(--gutter-card);
  box-shadow:var(--neo-auf);
}
.platte-blank{padding:0}
.platte-field{box-shadow:var(--neo-ein);background:var(--flaeche)}
.platte-raised,.platte-plate-hi{box-shadow:var(--neo-auf-tief)}
.platte-klick{cursor:pointer}
.platte-klick:active{box-shadow:var(--neo-ein)}
/* DIE GERAHMTE PLATTE ist die eine, die jetzt zaehlt — sie traegt die
   Blende. Bis v33 war sie deshalb FLACH: Der Rahmen war das ganze
   Chrome, und eine Platte darunter waere ein zweiter Rahmen gewesen.

   Auf einem Relief ist das falsch herum. Flach heisst hier „liegt im
   Grund", und dann steht die wichtigste Flaeche der Buehne tiefer als
   die zweitwichtigste daneben. Sie ist jetzt die TIEFE gehobene Form —
   und weil es hoechstens eine je Buehne gibt, bleibt das eindeutig. */
.platte-rahmen{box-shadow:var(--neo-auf-tief);padding:var(--space-7) var(--space-8)}

/* MIT UMBRUCH. Ohne ihn schob eine Reihe aus fuenf Kacheln (die
   Wochenzahlen der Reflexion) auf dem Handy 12 px aus dem Bild — und
   eine Reihe, die nicht umbrechen kann, tut das bei jedem neuen
   Element wieder. */
.reihe{display:flex;flex-wrap:wrap;gap:var(--space-5);align-items:flex-start}
.stapel{display:flex;flex-direction:column;gap:var(--space-5)}
.seite,.blatt,.nah,.fokus{display:flex;flex-direction:column;gap:var(--space-7)}
.stapel-weit{display:flex;flex-direction:column;gap:var(--space-7)}

/* ---------- Zwei Spalten am Laptop ----------

   DIE WERKBANK LINKS, DIE LAGE RECHTS. Das ist die Aufteilung, die
   jede Arbeitsbuehne dieser App braucht: Links wird geschoben,
   abgehakt, geschrieben; rechts steht, woran man sich dabei haelt —
   Zahlen, Fristen, was klemmt. Bis v33 stand beides untereinander,
   und am Laptop war die rechte Bildschirmhaelfte leer.

   1,45 : 1 — links stehen Zeilen mit Griffen, die Breite brauchen;
   rechts Zahlen und kurze Zeilen. Gleiche Haelften saehen ordentlich
   aus und waeren fuer beide falsch. */
.spalten{display:flex;flex-direction:column;gap:var(--space-9)}
.spalte-werk,.spalte-lage{display:flex;flex-direction:column;gap:var(--space-9);min-width:0}
@media (min-width:1100px){
  .spalten{display:grid;grid-template-columns:minmax(0,1.45fr) minmax(320px,1fr);
    gap:var(--space-9);align-items:start}
  /* Rechts steht, was man ANSIEHT, waehrend man links arbeitet — also
     bleibt es stehen. */
  .spalte-lage{position:sticky;top:calc(var(--kopf-hoehe) + var(--space-6))}
}

/* ---------- Abschnitte ---------- */
.abschnitt{display:flex;align-items:center;gap:var(--space-3);margin-top:var(--space-6)}
.abschnitt-block .abschnitt{margin:0}
.abschnitt-text{flex:none}
.abschnitt-neben{margin-left:auto;color:var(--tinte-fern)}
/* Der Denk-Orb neben "Aufträge dieser App", solange die Warteschlange
   schreibt — die einzige Stelle, an der `.abschnitt-neben` einen Knoten
   statt nur Text traegt (Kodex Z4: eine der zwei erlaubten
   Dauerbewegungen). */
.abschnitt-neben-schreibt{display:inline-flex;align-items:center;gap:var(--space-2)}
.abschnitt-symbol{color:var(--tinte-fern);flex:none}
.abschnitt-block{display:flex;flex-direction:column;gap:var(--space-5)}
.abschnitt-fuss{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-4);margin-top:var(--space-1)}
.seiten-kopf{display:flex;flex-direction:column;gap:var(--space-2)}
.seiten-eyebrow{color:var(--tinte-fern)}
.seiten-titel{font:var(--type-display-m);letter-spacing:var(--tracking-display);margin:0}
.seiten-titel-gross{font:var(--type-display-l)}
.seiten-stand,.seiten-unter{font:var(--type-small);color:var(--tinte-still);margin:0}
.seiten-fuss{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-4);
  color:var(--tinte-fern)}

.trenner{height:1px;background:var(--linie);border:0;margin:0}

/* ---------- Der Stand und die Chips ----------
   Kein Kasten: Ein Stand ist ein WERT, keine Flaeche. Das Relief traegt
   die Zeile, in der er steht; er selbst traegt nur seine Farbe. */
.stand{
  display:inline-flex;align-items:center;gap:var(--space-3);
  min-height:20px;flex:none;white-space:nowrap;
  font:var(--type-small);letter-spacing:0;text-transform:none;
  color:var(--tinte-still);
}
.stand::before{
  content:"";flex:none;width:7px;height:7px;border-radius:50%;
  background:var(--tinte-fern);
  /* Der Punkt sitzt IM Material: Lichtsaum oben, ein Hauch Schatten unten. */
  box-shadow:inset 0 1px 0 var(--licht-innen),
             0 1px 2px color-mix(in srgb,var(--grund) 70%,transparent);
}
.stand-info::before{background:var(--tinte-fern)}
.stand-positive{color:var(--tinte)}       .stand-positive::before{background:var(--moos)}
.stand-highlight{color:var(--tinte)}      .stand-highlight::before{background:var(--ocker)}
.stand-critical{color:var(--glut-schrift)} .stand-critical::before{background:var(--glut)}
.stand-accent{color:var(--tinte);font:var(--type-small-strong)}
.stand-accent::before{background:var(--akzent-glueh)}

/* Die EINE freistehende Fassung: Stand allein auf einer Platte, als Mulde.
   Hoechstens eine je Buehne. */
.stand-mulde{min-height:28px;padding:0 var(--space-5);
  border-radius:var(--radius-xs);background:var(--flaeche);box-shadow:var(--neo-ein)}

/* Der Chip rastet: gewählt = eingedrückt, mit weißem Wort. */
.chip{
  display:inline-flex;align-items:center;justify-content:center;gap:var(--space-2);
  /* 34 px hoch — aber nie schmaler als 44. „ET" als Modulfilter war
     40 x 34 px und damit die eine Trefferflaeche, die der Waechter zu
     Recht anmahnte: Ein Chip mit zwei Buchstaben ist genauso oft
     gemeint wie einer mit zwanzig. */
  min-height:34px;min-width:44px;padding:0 var(--space-5);
  font:var(--type-small);
  background:var(--flaeche);color:var(--tinte-still);
  border:0;border-radius:var(--radius-pill);
  box-shadow:var(--neo-auf);
  cursor:pointer;white-space:nowrap;
}
.chip:hover:not(.chip-an){color:var(--tinte)}
.chip-an{box-shadow:var(--neo-ein);color:var(--tinte);font:var(--type-small-strong)}
.chipreihe{display:flex;flex-wrap:wrap;gap:var(--space-3)}
.chip-trenner{width:1px;height:20px;background:var(--linie-stark);flex:none;align-self:center}
.filterzeile{display:flex;flex-wrap:wrap;gap:var(--space-4);align-items:center}

/* ---------- Die Werkzeugleiste ----------
   Eine gedrückte Rille, in der das gewählte Werkzeug als erhabene
   Form sitzt und sein Wort trägt. */
.werkzeuge{
  display:flex;align-items:center;gap:var(--space-2);
  padding:4px;
  background:var(--flaeche);border-radius:var(--radius-pill);
  border:0;box-shadow:var(--neo-ein);
  align-self:flex-start;max-width:100%;
}
.werkzeug{
  display:flex;align-items:center;gap:0;
  min-height:40px;padding:0 var(--space-5);
  border:0;border-radius:var(--radius-pill);
  background:none;color:var(--tinte-still);cursor:pointer;
  font:var(--type-small);white-space:nowrap;
}
.werkzeug:hover{color:var(--tinte)}
.werkzeug-glyph{display:grid;place-items:center;flex:none}
.werkzeug-wort{display:block;overflow:hidden;max-width:0;opacity:0}
.werkzeug.ist-gewaehlt{background:var(--flaeche);color:var(--tinte);box-shadow:var(--neo-auf)}
.werkzeug.ist-gewaehlt .werkzeug-wort{max-width:12ch;opacity:1;padding-left:var(--space-3)}
.werkzeuggruppe{display:flex;align-items:center;gap:2px;padding:4px;
  background:var(--flaeche);border-radius:var(--radius-pill);box-shadow:var(--neo-ein);max-width:100%}
.werkzeuggruppe .werkzeug{min-height:32px;padding:0 var(--space-3)}
.werkzeuggruppe .werkzeug:hover,.werkzeuggruppe .werkzeug:focus-visible{color:var(--tinte)}

/* ---------- Zustände ---------- */
.leer{
  display:flex;flex-direction:column;align-items:center;gap:var(--space-4);
  padding:var(--space-9) var(--space-6);text-align:center;
  border-radius:var(--radius-lg);
  background:var(--flaeche);box-shadow:var(--neo-ein);
}
.leer-symbol{color:var(--tinte-fern)}
.leer-titel{font:var(--type-title);margin:0}
.leer-text{font:var(--type-small);color:var(--tinte-still);margin:0;max-width:36ch;text-wrap:pretty}
.leer-aktionen{display:flex;flex-direction:column;gap:var(--space-4);align-items:center;width:100%}
.leer-fehler .leer-symbol{color:var(--glut-schrift)}
.leer-fehler .leer-titel{color:var(--glut-schrift)}
.leer-zeile{font:var(--type-small);color:var(--tinte-fern);margin:0;padding:var(--space-4) 0}
.laedt{display:flex;flex-direction:column;align-items:center;justify-content:center;
  gap:var(--space-5);padding:var(--space-12) var(--space-6);color:var(--tinte-fern)}
.laedt-text{font:var(--type-small)}

/* ---------- Das Skelett ----------
   Flache Flaechen in der Form des Inhalts — kein Relief, kein Neo-Kissen
   (26.08.2026, Paket J4): `--neo-ein` ist der Schatten einer gedrueckten
   Flaeche, mit der man etwas TUT. Ein Skelett zeigt nichts an, das sich
   druecken liesse, trug aber denselben Schatten — ein wulstiges Kissen,
   wo eine ruhige Flaeche nur noch nicht geladen hat. Jetzt traegt es den
   Ton der naechsthoeheren Flaeche und sonst nichts: keine Kante, kein
   Schatten. Weiterhin kein Schimmer, kein Puls — motion.css bekommt hier
   keinen Eintrag (Kodex Z4). Staffelung laeuft ueber die BREITE mehrerer
   Zeilen, nie ueber Opazitaet (eine transparente Flaeche sieht aus wie
   "deaktiviert", nicht wie "laedt"). */
.skelett-flaeche{display:flex;flex-direction:column;gap:var(--space-5)}
.skelett{display:block;flex:none;
  background:var(--flaeche-hoch);border-radius:var(--radius-sm)}

/* Textzeilen: drei Breiten im Wechsel statt einer einzelnen kuerzeren
   letzten Zeile — echter Fliesstext bricht nie auf dieselbe Kante. */
.skelett-text{height:var(--space-5);border-radius:var(--radius-pill);width:100%}
.skelett-text+.skelett-text{margin-top:var(--space-4)}
.skelett-text:nth-child(3n+2){width:86%}
.skelett-text:nth-child(3n+3){width:70%}
.skelett-text:last-child{width:54%}

/* Zeile: die Form einer Listenzeile (Trefferhoehe), keine Karte. */
.skelett-zeile{height:calc(var(--griff) + var(--space-4));border-radius:var(--radius-sm)}
/* Kachel und Karte: dieselbe flache Flaeche, nur die Rundung der
   jeweils echten Form (Kodex G3 — eine Mulde, mehrere Groessen). */
.skelett-kachel{height:calc(var(--griff) + var(--space-9));border-radius:var(--radius-md);
  flex:1;min-width:0}
.skelett-karte{height:calc(var(--griff) * 3);border-radius:var(--radius-lg)}

.skelett-liste{display:flex;flex-direction:column;gap:var(--space-3)}
.skelett-reihe{display:flex;gap:var(--space-5)}

/* ---------- Das Skelett des Starts ----------
   Es steht dort, wo gleich die App steht: Ortsleiste links, Kopfzeile
   oben, Buehne in der Mitte mit ihren Massen. Vorher lagen hier zwei
   Karten-Mulden in der nackten Wurzel — randlos ueber den ganzen Schirm
   und oben an der Kante (`ds/skelett.js` sagt, warum das schlimmer ist
   als es aussieht). */
.skelett-start{display:flex;min-height:100dvh}
.skelett-start-leiste{
  flex:none;width:var(--orte-breite);
  display:flex;flex-direction:column;gap:var(--space-3);
  padding:calc(env(safe-area-inset-top) + var(--space-6)) var(--space-5) 0;
  border-right:var(--hairline);
}
.skelett-start-haupt{
  flex:1;min-width:0;
  padding:calc(env(safe-area-inset-top) + var(--space-6)) var(--gutter-screen) var(--space-8);
}
.skelett-start-buehne{
  max-width:1080px;margin-top:var(--space-8);
  display:flex;flex-direction:column;gap:var(--space-6);
}
.skelett-marke{height:32px;width:70%;border-radius:var(--radius-sm)}
/* Die Momentgruppe ist eine Mulde mit drei Hoehen darin — hier als eine
   Flaeche, denn ein Skelett zeichnet die Form, nicht den Inhalt. */
.skelett-fach{height:calc(var(--moment-hoehe) * 3 + var(--space-4));
  border-radius:var(--radius-xl);margin-top:var(--space-6)}
.skelett-pfad{height:var(--space-6);width:min(320px,60%);border-radius:var(--radius-pill)}
.skelett-titel{height:var(--space-8);width:min(280px,50%);border-radius:var(--radius-sm)}

/* Unter 1100 px traegt der Start keine Leiste — dort hat die App auch
   keine offene. */
@media (max-width:1099px){
  .skelett-start-leiste{display:none}
}
.fussnote{font:var(--type-caption);color:var(--tinte-fern);margin:0;text-wrap:pretty}
.herkunft{font:var(--type-caption);color:var(--tinte-fern)}
.befundzeile,.befundzeile-still{
  display:block;width:100%;text-align:left;
  background:none;border:0;border-left:2px solid var(--glut);
  padding:var(--space-3) 0 var(--space-3) var(--space-5);
  font:var(--type-small);color:var(--glut-schrift);cursor:pointer;
}
.befundzeile{cursor:default}

/* ---------- Metriken und Kacheln ---------- */
.metrik{font:var(--type-metric);letter-spacing:var(--tracking-metric)}
.metrik-gross{font:var(--type-metric-xl)}
.metrik-paar{display:inline-flex;align-items:baseline;gap:var(--space-2)}
.metrik-einheit{font:var(--type-caption);color:var(--tinte-fern)}

/* Die Zelle: eine flach gehobene Form im Bento. */
.kachel{
  display:flex;flex-direction:column;gap:var(--space-1);
  flex:1;min-width:0;align-self:stretch;
  padding:var(--space-4) var(--space-6);
  border-radius:var(--radius-md);
  background:var(--flaeche);
  box-shadow:var(--neo-auf);
}
.kachel-label{color:var(--tinte-fern)}
.kachel-wert{font:var(--type-metric);letter-spacing:var(--tracking-metric)}
.kachel-unten{font:var(--type-caption);color:var(--tinte-fern)}

.ton-critical{color:var(--glut-schrift)}
.ton-caution,.ton-highlight{color:var(--ocker-schrift)}
.ton-positive{color:var(--moos-schrift)}

.notenkopf{display:flex;flex-direction:column;gap:var(--space-2)}
.notenkopf-zahl{display:flex;align-items:baseline;gap:var(--space-4);margin:0;flex-wrap:wrap;
  font:var(--type-display-l);letter-spacing:var(--tracking-display)}
.notenkopf-qualifier{font:var(--type-small);color:var(--tinte-still);letter-spacing:0}
.notenkopf-fakten{font:var(--type-small);color:var(--tinte-still);margin:0}

/* ---------- Listen und Zeilen ---------- */
.liste{display:flex;flex-direction:column;overflow:hidden}
.liste>*+*{border-top:1px solid var(--linie)}
.zeile{display:flex;align-items:center;gap:var(--space-4);
  min-height:52px;padding:var(--space-4) var(--gutter-card)}
.zeile.ist-oeffenbar{cursor:pointer}
.zeile.ist-oeffenbar:hover{background:var(--tinte-hauch)}
.zeile.ist-oeffenbar:hover .zeile-chevron{transform:translateX(3px);color:var(--tinte-still)}
.zeile-mitte{display:flex;flex-direction:column;gap:1px;min-width:0;flex:1}
.zeile-titel{font:var(--type-body);overflow-wrap:anywhere;min-width:0;
  display:flex;flex-wrap:wrap;align-items:baseline;column-gap:var(--space-3);row-gap:2px}
.zeile-titel>span:not(.zeile-kennung){flex:1 1 auto;min-width:0}
.zeile-meta{font:var(--type-caption);color:var(--tinte-fern)}
.zeile-kennung{flex:none;font:var(--type-caption);color:var(--tinte-fern);font-variant-numeric:tabular-nums}
.zeile-griffe{display:flex;align-items:center;gap:var(--space-3);flex:none}
.zeile-symbol,.zeile-chevron{color:var(--tinte-fern);flex:none}
.zeile-befund{font:var(--type-caption);color:var(--glut-schrift)}
.zeile.ist-erledigt .zeile-titel{color:var(--tinte-fern);text-decoration:line-through;
  text-decoration-color:var(--linie-stark)}
.zeile.ist-atem{background:var(--tinte-hauch)}
.zeile.ist-ausstehend{opacity:.6}
.zeile.ist-markiert{background:var(--tinte-hauch-stark)}
.zeile.ist-dran{background:var(--tinte-hauch)}
button.zeile{width:100%;text-align:left;color:inherit}
.posten-zeit{font:var(--type-small);color:var(--tinte-fern);flex:none;width:44px;
  font-variant-numeric:tabular-nums}
.posten-symbol{color:var(--tinte-fern);flex:none}
.posten-trenner .zeile-titel{color:var(--tinte-still)}

/* ---------- Griffe in Zeilen ----------
   Fläche 40×40, Zeichnung klein. Der Haken RASTET: die Mulde füllt
   sich mit Moos und drückt sich dabei ein. */
.hakengriff{
  position:relative;flex:none;width:40px;height:40px;padding:0;
  display:grid;place-items:center;background:none;border:0;cursor:pointer;
}
.hakengriff::before{content:"";position:absolute;
  background:var(--flaeche);box-shadow:var(--neo-ein)}
.hakengriff::before{width:26px;height:26px;border-radius:var(--radius-xs)}
.hakengriff svg{position:relative;z-index:1}
/* DER HAKEN IST IMMER ZU SEHEN, auch ungesetzt. Bis v34 war er
   `transparent` und erschien erst beim Ueberfahren — eine Mulde ohne
   Zeichnung, die aussah wie ein Loch im Material. Mit der Maus war das
   eine Entdeckung, mit dem Finger ein Raten (Kodex Z1: was man
   antippen kann, muss man sehen koennen). */
.hakengriff{color:var(--tinte-fern);opacity:.5}
.hakengriff:hover,.hakengriff:focus-visible{color:var(--tinte-still);opacity:1}
.hakengriff.ist-an{opacity:1}
.hakengriff.ist-an::before{background:var(--moos);box-shadow:var(--neo-ein),inset 0 0 8px rgba(0,0,0,.25)}
.hakengriff.ist-an{color:var(--auf-moos)}
.uhrgriff{display:inline-flex;align-items:center;gap:var(--space-2);
  background:none;border:0;color:var(--tinte-still);cursor:pointer;font:var(--type-caption)}
.uhrgriff-zeit{font-variant-numeric:tabular-nums}

/* ---------- Der Popover ---------- */
.popover{
  position:absolute;z-index:40;min-width:190px;
  /* Ohne Deckel wuchs die Blase mit dem laengsten Zeilentext — ein langer
     Modulname zog sie so breit, dass sie am Fensterrand klemmte, statt am
     Anker zu bleiben (`js/ds/flaechen.js popoverLinks()`). */
  max-width:min(320px,calc(100vw - 16px));
  background:var(--flaeche-hoch);
  border:0;border-radius:var(--radius-md);
  box-shadow:var(--neo-auf-tief);
  padding:var(--space-3);
}

/* ============================================================
   2 · ANZEIGEN — AMPELN, BALKEN, RINGE, TABELLEN, PROSA
   ============================================================ */

.ampel{position:relative;display:inline-grid;place-items:center;flex:none;
  width:24px;height:24px;color:var(--tinte-fern)}
.ampel::before{content:"";position:absolute;width:24px;height:24px;border-radius:50%;
  background:var(--flaeche);box-shadow:var(--neo-ein)}
button.ampel{cursor:pointer;width:40px;height:40px}
button.ampel:hover::before{box-shadow:var(--neo-ein),inset 0 0 0 1px var(--linie-stark)}
.ampel-gross{width:34px;height:34px}
.ampel-gross::before{width:34px;height:34px}
button.ampel.ampel-gross{width:44px;height:44px}
.ampel-2::after{content:"";position:absolute;width:16px;height:16px;border-radius:50%;
  background:linear-gradient(to right, var(--ocker) 0 50%, transparent 50% 100%)}
.ampel-gross.ampel-2::after{width:24px;height:24px}
/* Gruen ist die lauteste Farbe, die dieses System kennt, und die Ampel
   ist ein Zustand und keine Meldung. Sie traegt es deshalb gedaempft:
   eine gefuellte Mulde, kein Leuchtpunkt. */
.ampel-3::before{background:color-mix(in srgb,var(--moos) 76%,var(--flaeche));
  box-shadow:var(--neo-ein)}
.thema-ampel{display:inline-flex;align-items:center;gap:var(--space-3)}
.thema-ampel-wort{font:var(--type-caption);color:var(--tinte-fern)}
.ampelwahl{display:flex;flex-direction:column;gap:var(--space-1)}
.ampelwahl-zeile{display:flex;align-items:center;gap:var(--space-4);
  min-height:42px;padding:0 var(--space-4);
  background:none;border:0;border-radius:var(--radius-xs);
  color:var(--tinte);cursor:pointer;text-align:left;font:var(--type-body)}
.ampelwahl-zeile:hover{background:var(--tinte-hauch)}
.ampelwahl-wort{flex:1}

.balken{height:6px;border-radius:3px;background:var(--flaeche);box-shadow:var(--neo-ein);overflow:hidden}
.balken>i,.balken-fuell{display:block;height:100%;border-radius:3px;
  background:linear-gradient(90deg,color-mix(in srgb,var(--akzent-glueh) 20%,transparent),color-mix(in srgb,var(--akzent-glueh) 85%,transparent))}
.stufenbalken{display:flex;height:6px;border-radius:3px;overflow:hidden;gap:2px}
.stufenbalken-1{background:var(--tinte-hauch-stark)}
.stufenbalken-2{background:var(--ocker)}
.stufenbalken-3{background:var(--moos)}

/* Der Ring: ein weicher Wulst, eine eingelassene Rille, ein dünner
   Chrombogen. Kein Chassis, keine Skala. */
.ring{position:relative;display:grid;place-items:center;flex:none}
.ring-svg{transform:rotate(-90deg)}
.ring-spur{fill:none;stroke:var(--senke)}
.ring-wert{fill:none;stroke:var(--akzent-glueh);stroke-linecap:round}
.ring-mitte{position:absolute;display:flex;flex-direction:column;align-items:center;gap:1px}

.spark,.sparkline{display:block;width:100%;height:auto;overflow:visible}
.spark path,.sparkline path{fill:none;stroke:var(--tinte-still);stroke-width:1.5;
  stroke-linecap:round;stroke-linejoin:round}
.spark .flaeche,.sparkline .flaeche{fill:var(--tinte-hauch);stroke:none}

.balkentage{position:relative;display:flex;align-items:flex-end;gap:3px;height:64px;width:100%}
.balkentage-spalte{flex:1 1 0;min-width:0;height:100%;padding:0;
  display:flex;align-items:flex-end;background:none;border:0}
button.balkentage-spalte{cursor:pointer}
button.balkentage-spalte:hover .balkentage-stab{background:var(--akzent-glueh)}
.balkentage-stab{flex:1;min-width:1px;border-radius:3px 3px 0 0;background:var(--tinte-still)}
.balkentage-stab.ton-positive{background:var(--moos)}
.balkentage-stab.ton-critical{background:var(--glut)}
.balkentage-stab.ton-caution{background:var(--ocker)}
.balkentage-luecke{flex:1;min-width:1px;height:100%;background:none;
  border:1px dashed var(--linie-stark);border-bottom:0;border-radius:3px 3px 0 0}
.balkentage-ziel{position:absolute;left:0;right:0;border-top:1px dashed var(--linie-stark)}

.wochenspur{display:flex;gap:var(--space-3);align-items:center}
.wochenspur i{width:9px;height:9px;border-radius:50%;background:var(--flaeche);box-shadow:var(--neo-ein)}
.wochenspur i.ist-da{background:var(--moos);box-shadow:none}

.tabelle{width:100%;border-collapse:collapse;font:var(--type-small)}
.tabelle th{font:var(--type-label);letter-spacing:var(--tracking-label);text-transform:uppercase;
  color:var(--tinte-fern);text-align:left;padding:var(--space-3) var(--space-4);
  border-bottom:1px solid var(--linie-stark)}
.tabelle td{padding:var(--space-4);border-bottom:1px solid var(--linie);vertical-align:top}
.tabelle tr:last-child td{border-bottom:0}
.tabelle .rechts,.tabelle-rahmen .rechts{text-align:right;font-variant-numeric:tabular-nums}
.tabelle-rahmen{overflow-x:auto;border:0;border-radius:var(--radius-md);
  background:var(--flaeche);box-shadow:var(--neo-auf)}
/* Eine Tabelle, in der GEGRIFFEN wird, richtet ihre Zellen mittig aus —
   sonst steht ein Knopf oben in der Zelle und der Titel daneben in der
   Mitte (Quellen-PDFs, `formulare/bibliothek.js`). */
.tabelle-rahmen[data-schluessel="quellpdf-tabelle"] td{vertical-align:middle}
.quellpdf-titel{display:block;max-width:34ch;overflow:hidden;
  text-overflow:ellipsis;white-space:nowrap}
.quellpdf-griffe{display:flex;align-items:center;gap:var(--space-2)}

.prosa{display:flex;flex-direction:column;gap:var(--space-4)}
.prosa-absatz{font:var(--type-body);color:var(--tinte-still);margin:0;max-width:66ch;text-wrap:pretty}
.prosa-code{font-family:var(--font-mono);font-size:12.5px;padding:1px var(--space-2);
  background:var(--tinte-hauch);border-radius:var(--radius-xs);word-break:break-word}
.prosa-zaun{margin:0;font-family:var(--font-mono);font-size:12.5px;line-height:1.6;
  padding:var(--space-4) var(--space-5);background:var(--flaeche);box-shadow:var(--neo-ein);
  border-radius:var(--radius-sm);overflow-x:auto;white-space:pre-wrap;word-break:break-word}
.prosa-ueber{color:var(--tinte);margin:0}
.prosa-ueber-1{font:var(--type-title)}
.prosa-ueber-2{font:var(--type-subtitle)}
.prosa-ueber-3,.prosa-ueber-4{font:var(--type-body-strong)}
.prosa-liste{margin:0;padding-left:var(--space-6);font:var(--type-body);color:var(--tinte-still);
  max-width:66ch;display:flex;flex-direction:column;gap:var(--space-2)}
ul.prosa-liste{list-style:disc}
ol.prosa-liste{list-style:decimal}
.prosa-linie{border:0;border-top:1px solid var(--linie);margin:var(--space-2) 0}
.prosa-verweis{color:var(--tinte);text-decoration:underline;
  text-decoration-color:var(--linie-stark);text-underline-offset:2px}
.prosa-verweis:hover{text-decoration-color:var(--tinte)}
.prosa-zitat{border-left:2px solid var(--linie-stark);padding-left:var(--space-5);
  font:var(--type-blatt-notiz);color:var(--tinte-still);margin:0}

.ausklapper{border:0;border-radius:var(--radius-md);
  background:var(--flaeche);box-shadow:var(--neo-auf);overflow:hidden}
.ausklapper-kopf{display:flex;align-items:center;gap:var(--space-3);width:100%;
  padding:var(--space-5) var(--space-6);background:none;border:0;color:var(--tinte);
  cursor:pointer;font:var(--type-subtitle);text-align:left}
.ausklapper-kopf svg{margin-left:auto;flex:none;color:var(--tinte-fern)}
.ausklapper[open] .ausklapper-kopf svg{transform:rotate(180deg)}
.ausklapper-koerper{padding:0 var(--space-6) var(--space-6)}
.ausklapper-koerper[hidden]{display:none}

.sessionzeile{display:flex;align-items:center;gap:var(--space-5);
  padding:var(--space-5) var(--space-6);background:var(--flaeche);
  border:0;border-radius:var(--radius-md);box-shadow:var(--neo-auf);
  color:var(--tinte);text-decoration:none}
.sessionzeile:hover{color:var(--tinte)}
.sessionzeile:active{box-shadow:var(--neo-ein)}
.sessionzeile>svg{flex:none;color:var(--tinte-fern);order:3;margin-left:auto}
.sessionzeile:hover>svg{transform:translate(2px,-2px);color:var(--tinte)}
.sessionzeile-mitte{display:flex;flex-direction:column;gap:2px;min-width:0;flex:1}
.sessionzeile-text{font:var(--type-body-strong);color:var(--tinte)}
.sessionzeile-satz{font:var(--type-caption);color:var(--tinte-fern);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100%}
.sessionzeile-marke{flex:none;display:grid;place-items:center;width:32px;height:32px;
  border-radius:50%;background:var(--flaeche);box-shadow:var(--neo-ein);color:var(--tinte-still)}

/* ============================================================
   3 · FORMULARE — SHEETS, FELDER, SCHALTER, SUCHE
   ============================================================ */

/* ---------- Sheet ---------- */
/* DER SCHLEIER TRENNT, ODER ER IST KEINER.

   Er war eine blosse Faerbung, und der Inhalt dahinter blieb voll
   lesbar: Das Sheet lag AUF der Buehne, statt VOR ihr zu stehen. Wer ein
   Formular ausfuellt, soll nicht nebenbei den Tagesplan mitlesen —
   nicht weil es verboten waere, sondern weil das Auge es tut und dabei
   die Haelfte der Aufmerksamkeit verliert.

   Ein leichter Schliff dazu, und mehr braucht es nicht: Zwei Pixel
   Unschaerfe nehmen dem Hintergrund die Lesbarkeit und lassen ihm die
   Form — man sieht weiter, WO man ist, nur nicht mehr, was dort steht. */
.sheet-huelle{position:fixed;inset:0;z-index:50;
  display:flex;align-items:flex-end;justify-content:center;
  padding:0;background:var(--schleier);
  backdrop-filter:blur(2px);-webkit-backdrop-filter:blur(2px)}
.sheet-panel{position:relative;width:100%;max-width:560px;max-height:92dvh;
  display:flex;flex-direction:column;
  background:var(--flaeche);border:0;
  border-radius:var(--radius-xl) var(--radius-xl) 0 0;
  box-shadow:var(--schatten-sheet),inset 0 1px 0 var(--licht-innen)}
.sheet-panel::before{content:"";position:absolute;top:8px;left:50%;transform:translateX(-50%);
  width:34px;height:4px;border-radius:2px;background:var(--linie-stark)}
.sheet-kopf{padding:var(--space-8) var(--space-7) var(--space-4)}
.sheet-titelzeile{display:flex;align-items:flex-start;gap:var(--space-5)}
.sheet-titelzeile>div:first-child{flex:1;min-width:0}
.sheet-eyebrow{display:block;color:var(--tinte-fern);margin-bottom:var(--space-2)}
.sheet-titel{font:var(--type-title);margin:0;text-wrap:balance}
/* `flex:0 1 auto` UND NICHT `flex:1`.

   Mit `flex:1` wuchs der Koerper auf die volle erlaubte Hoehe des
   Sheets, auch wenn er halb so viel Inhalt hatte — und schob die
   klebende Aktionsleiste an den unteren Rand. Uebrig blieb ein leeres
   Feld zwischen dem letzten Feld und „Sichern", bei „Tag umplanen"
   fuenfzig Pixel hoch.

   `0 1 auto` heisst: Nimm die Hoehe deines Inhalts, und SCHRUMPFE nur,
   wenn das Sheet an seine Hoechsthoehe stoesst. Genau dann faengt der
   Bildlauf an, und genau dann klebt die Leiste — vorher gibt es nichts
   zu kleben. */
.sheet-koerper{padding:0 var(--space-7) 0;overflow-y:auto;flex:0 1 auto;
  overscroll-behavior:contain}
.sheet-text{font:var(--type-body);color:var(--tinte-still);margin:0;text-wrap:pretty}
/* SIE KLEBT AM FUSS. Bis v34 stand sie am Ende des Fliesstexts, und in
   einem langen Formular hiess das: erst bis ganz nach unten scrollen,
   dann sichern. Bei „Thema bearbeiten" mit offenen Details waren das
   zwei Bildschirmhoehen. Jetzt steht sie immer da, wo sie hingehoert —
   und der Verlauf darueber sagt, dass darunter noch etwas weitergeht. */
.sheet-aktionen{
  position:sticky;bottom:0;z-index:1;
  display:flex;gap:var(--space-4);justify-content:flex-end;flex-wrap:wrap;
  /* Am 26.08.2026 von 20/16/20 auf 12/12/16 gekuerzt: Die Leiste stand
     mit 56 px Luft ueber dem letzten Feld, und in einem kurzen Formular
     war das der groesste Block der ganzen Flaeche. Sie braucht Abstand,
     damit sie nicht am Text klebt — sie braucht keinen Absatz. */
  margin-top:var(--space-5);
  padding:var(--space-5) 0 var(--space-6);
  background:linear-gradient(to bottom,transparent,var(--flaeche) var(--space-5));
}
.sheet-aktionen .knopf,.sheet-aktionen .lm-rand{flex:1;min-width:130px}
.sheet-aktionen-stapel{flex-direction:column-reverse}
.sheet-aktionen-stapel .knopf{width:100%}
/* DIE GEFAHRENAKTION GANZ LINKS, und `margin-right:auto` schiebt die
   beiden anderen nach rechts. Sie waechst NICHT mit (`flex:0 0 auto`):
   Eine Loeschzeile, die so breit ist wie „Sichern", sieht aus wie eine
   gleichrangige Wahl. */
.sheet-aktionen-gefahr{flex:0 0 auto;margin-right:auto;
  padding-inline:var(--space-3);white-space:nowrap}
/* AUF DEM HANDY UNTER DIE BEIDEN, auf einer eigenen Zeile. Dort waechst
   jeder Knopf auf volle Breite und die Leiste bricht um; laege die
   Loeschzeile dann zwischen „Verwerfen" und „Sichern", stuende sie genau
   dort, wo der Daumen ohnehin liegt. `order` schiebt sie ans Ende, die
   volle Breite erzwingt den Umbruch davor. */
@media (max-width:899px){
  .sheet-aktionen-gefahr{order:1;width:100%;margin-right:0;
    padding-block:var(--space-4);text-align:center}
}
/* DER ZWEITE SCHLEIER IST DUENNER ALS DER ERSTE (26.08.2026).

   `--schleier` liegt hier ein zweites Mal ueber dem, was die Huelle schon
   verschleiert hat: zweimal 66 % ergeben 88 %, und weil dem inneren die
   Unschaerfe fehlt, wurde das Panel als flache, deutlich dunklere Scheibe
   sichtbar — ein Rechteck mitten im Bild statt einer Tiefe dahinter. Was
   diese Ebene zu leisten hat, ist ein Schritt Abstand, nicht ein zweiter
   Vorhang. */
.sheet-rueckfrage{position:absolute;inset:0;z-index:2;
  display:grid;place-items:center;padding:var(--space-7);
  background:color-mix(in srgb,var(--schleier) 55%,transparent);
  border-radius:inherit}
.sheet-rueckfrage-karte{background:var(--flaeche-hoch);border-radius:var(--radius-md);
  box-shadow:var(--neo-auf-tief);padding:var(--space-7);
  display:flex;flex-direction:column;gap:var(--space-3);max-width:380px}
/* UND DIE KNOEPFE TRAGEN HIER KEINEN VERLAUF.

   Die Reihe benutzt dieselbe Klasse wie die Fussleiste eines Formulars,
   und die ist `sticky` mit einem Verlauf auf `--flaeche` — der sagt dort
   „darunter geht es weiter". In der Rueckfrage-Karte gibt es kein
   Darunter, und die Karte steht auf `--flaeche-hoch`: Der Verlauf malte
   eine FREMDE Farbe mit harter Kante hinter die zwei Knoepfe. Das war das
   schwarze Rechteck. */
.sheet-rueckfrage .sheet-aktionen{
  position:static;background:none;margin-top:var(--space-4);padding:0}
.sheet-rueckfrage-titel{font:var(--type-title);margin:0}
.sheet-rueckfrage-text{font:var(--type-small);color:var(--tinte-still);margin:0}
.blende-flug{position:fixed;inset:0;z-index:48;
  display:flex;align-items:flex-end;justify-content:center;background:var(--schleier)}
.blende-panel{width:100%;max-width:520px;
  background:var(--flaeche);border:0;
  border-radius:var(--radius-xl) var(--radius-xl) 0 0;
  box-shadow:var(--schatten-sheet),inset 0 1px 0 var(--licht-innen);
  padding:var(--space-6) var(--space-6) var(--space-8);
  display:flex;flex-direction:column;gap:var(--space-3)}
.blende-griff{width:34px;height:4px;border-radius:2px;background:var(--linie-stark);
  align-self:center;margin-bottom:var(--space-4)}

/* ---------- Toast · Banner ---------- */
.toast-host{position:fixed;left:50%;transform:translateX(-50%);
  bottom:calc(var(--space-11) + env(safe-area-inset-bottom));
  z-index:60;width:min(440px,calc(100vw - 32px));pointer-events:none}
.toast{display:flex;align-items:center;gap:var(--space-4);
  padding:var(--space-5) var(--space-6);
  background:var(--flaeche-hoch);border:0;border-radius:var(--radius-md);
  box-shadow:var(--neo-auf-tief);
  font:var(--type-small);color:var(--tinte);pointer-events:auto}
.toast svg{color:var(--moos-schrift);flex:none}
.toast-text{flex:1;min-width:0;text-wrap:pretty}
.toast-aktion{background:none;border:0;color:var(--tinte);cursor:pointer;
  font:var(--type-body-strong);text-decoration:underline;text-underline-offset:3px;flex:none}
.banner{display:flex;align-items:center;gap:var(--space-4);
  padding:var(--space-4) var(--space-5);
  border:0;border-radius:var(--radius-sm);
  font:var(--type-small);background:var(--flaeche);box-shadow:var(--neo-ein)}
.banner-symbol{flex:none;color:var(--tinte-still)}
.banner-text{flex:1;min-width:0;text-wrap:pretty}
.banner-aktion{background:none;border:0;color:inherit;cursor:pointer;flex:none;
  font:var(--type-body-strong);text-decoration:underline;text-underline-offset:3px}
.banner-critical{color:var(--glut-schrift);box-shadow:var(--neo-ein),inset 0 0 14px var(--glut-hauch)}
.banner-critical .banner-symbol{color:var(--glut-glueh)}
.banner-caution{color:var(--ocker-schrift)}
.banner-caution .banner-symbol{color:var(--ocker)}
.banner-still{color:var(--tinte-still)}

/* ---------- Felder ----------
   Ein Feld ist eine Mulde. Fokus = die Mulde vertieft sich und der
   Rand fängt einen Hauch Licht — kein blauer Ring. */
.formular{display:flex;flex-direction:column;gap:var(--space-8)}
.feld{display:flex;flex-direction:column;gap:var(--space-3)}
/* OHNE DIESE ZEILE VERSCHWINDET NICHTS. `[hidden]{display:none}` steht im
   Stylesheet des BROWSERS, und jede Autorenregel mit `display` schlaegt es —
   unabhaengig von der Spezifitaet. Zwei Felder verlassen sich darauf und
   standen deshalb da, obwohl sie nicht gelten: „Name des neuen Oberthemas"
   bei jedem geoeffneten Themenformular und seit dem 26.08.2026 „Unter
   Kapitel" auch bei einem Arbeitsschritt (`formulare/struktur.js`).
   Gefunden beim Umbau des Kapitelformulars; der Waechter in
   `pruefen.test.js` sieht diese Schreibweise (`feld.knoten.hidden = …`)
   nicht, weil er nur nach `const x = el("div.klasse")` sucht. */
.feld[hidden]{display:none}
/* Das Label wird gelesen, nicht ueberflogen — Satzschreibung statt
   Versalien, wie jeder andere Fliesstext im Formular. */
.feld-label{font:var(--type-small-strong);letter-spacing:0;
  text-transform:none;color:var(--tinte-still)}
.feld-hinweis{font:var(--type-caption);color:var(--tinte-fern);text-wrap:pretty}
.feld.hat-fehler .feld-label{color:var(--tinte-still)}
.feld.hat-fehler .feld-hinweis{color:var(--glut-schrift)}
.eingabe,.eingabe-flaeche,.eingabe-datum,.eingabe-suche{
  width:100%;min-height:var(--griff);
  padding:var(--space-4) var(--space-5);
  font:var(--type-body);color:var(--tinte);
  background:var(--flaeche);
  border:0;border-radius:var(--radius-sm);
  box-shadow:var(--neo-ein);
}
.eingabe-flaeche{min-height:96px;resize:vertical;line-height:1.55}
.eingabe::placeholder,.eingabe-flaeche::placeholder{color:var(--tinte-fern)}

/* ---------- Die Uhrzeit ----------
   Ein `input[type=time]` bringt eigene Innereien mit, und dafuer gab es
   bis zum 26.08.2026 keine einzige Regel — das Feld erbte `.eingabe` und
   sah darin aus wie ein Fremdkoerper: helle Systemschrift, ein Uhrsymbol
   in Browsergrau, und im Nachtlicht ein weisser Kasten.

   Die Ziffern bekommen Tabellenziffern, damit sie beim Tippen nicht
   springen, und das Uhrsymbol wird eingefaerbt statt versteckt: Es ist
   der Hinweis darauf, dass hier mehr geht als Tippen. */
.eingabe[type="time"]{
  font-variant-numeric:tabular-nums;
  /* Sonst dehnt Safari das Feld auf seine eigene Vorstellung. */
  min-width:0;
}
/* `--k` ist 1 in der Nacht und 0 am Tag (`tokens.css`). Das schwarze
   Browser-Symbol wird damit genau dort gekehrt, wo es sonst im Dunkeln
   verschwaende — ohne eine zweite Regel je Licht. */
.eingabe[type="time"]::-webkit-calendar-picker-indicator{
  filter:invert(var(--k));opacity:.55;cursor:pointer;padding:0;margin:0}
.eingabe[type="time"]:hover::-webkit-calendar-picker-indicator{opacity:1}
.eingabe[type="time"]::-webkit-datetime-edit-fields-wrapper{padding:0}
.eingabe[type="time"]::-webkit-datetime-edit-hour-field:focus,
.eingabe[type="time"]::-webkit-datetime-edit-minute-field:focus{
  background:var(--tinte-hauch-stark);color:var(--tinte);border-radius:3px;outline:none}
/* Fokus macht tiefer, nie heller/groesser — und der Innenring ist jetzt
   wirklich zu sehen: `--akzent-hauch` (8 %) war auf der Mulde faktisch
   unsichtbar. `.auswahl-knopf` traegt denselben Ring, offen oder fokussiert —
   drei Tiefen im ganzen Formular (ruhend `--neo-ein`, aktiv `--neo-ein-tief`,
   Gruppe `--neo-auf`), keine vierte. */
.eingabe:focus,.eingabe-flaeche:focus,.eingabe-datum:focus,.eingabe-suche:focus,
.auswahl[data-offen="ja"] .auswahl-knopf,.auswahl-knopf:focus-visible{
  outline:none;
  box-shadow:var(--neo-ein-tief),
             inset 0 0 0 1px color-mix(in srgb,var(--akzent-glueh) 38%,transparent);
}
.eingabe-rahmen,.eingabe-rahmen-flaeche{position:relative;display:flex;align-items:center;gap:var(--space-3)}
.eingabe-rahmen .eingabe{flex:1}
.eingabe-symbol{position:absolute;left:var(--space-4);color:var(--tinte-fern);pointer-events:none}
.eingabe-symbol~.eingabe{padding-left:calc(var(--space-5) + 20px)}
.eingabe-datum{display:flex;align-items:center;gap:var(--space-3);text-align:left}
.eingabe-datum .eingabe-symbol{position:static;flex:none}
.eingabe-einheit{font:var(--type-small);color:var(--tinte-fern);flex:none}
.eingabe-chevron{position:absolute;right:var(--space-4);color:var(--tinte-fern);pointer-events:none}

/* TABELLENZIFFERN, WO EINE NUMMER STEHT (27.08.2026, `ds/feldtypen.js`).
   Eine ISBN in Proportionalziffern liest sich nicht als Nummer: Die Eins ist
   schmal, die Null breit, und beim Vergleich zweier Zeilen verrutschen die
   Stellen gegeneinander. `tabular-nums` gibt jeder Ziffer dieselbe Breite —
   derselbe Grund, aus dem `.numeric` unten steht. Die Klasse setzt der TYP,
   nicht die Aufrufstelle. */
.eingabe.ist-ziffern{font-variant-numeric:tabular-nums;letter-spacing:.01em}

/* DER GRIFF IM RAHMEN — beim `url`- und `doi`-Feld. Er sitzt IN der Mulde
   und traegt deshalb kein eigenes Relief: Relief bezeichnet Ebenen, und der
   Griff liegt auf derselben wie das Feld. Was ihn abhebt, ist die Farbe beim
   Zeigen.

   AUS HEISST WIRKLICH AUS: Solange nichts oder etwas Falsches drinsteht,
   fuehrt er nirgendwohin — und ein Griff, der ins Leere fuehrt, ist
   schlimmer als keiner (Kodex G1). */
.eingabe-griff{position:absolute;right:var(--space-3);display:flex;
  align-items:center;justify-content:center;
  /* 32 px sichtbar, 44 mit dem Pseudoelement darunter — ein groesserer
     Knopf haette die Mulde gesprengt.

     HIER STAND „(Kodex Z2)" HINTER DER 44, und das war falsch zitiert: Z2
     verlangt 24 x 24 px (WCAG 2.2 AA, `System/Kodex.md`). Die 44 sind
     Apples Empfehlung und stehen in diesem Repo nirgends. Sie sind nicht
     falsch, nur nicht gefordert — ein Kommentar, der eine Regel falsch
     zitiert, ist aber schlimmer als keiner: Der naechste richtet sich
     danach. */
  width:32px;height:32px;border:0;border-radius:var(--radius-sm);
  background:none;color:var(--tinte-fern);cursor:pointer}
.eingabe-griff::after{content:"";position:absolute;inset:-6px}
.eingabe-griff:hover:not(:disabled){color:var(--tinte);background:var(--tinte-hauch)}
.eingabe-griff:focus-visible{outline:2px solid var(--akzent-glueh);outline-offset:2px}
.eingabe-griff:disabled{opacity:.35;cursor:default}
.eingabe-griff~.eingabe,.eingabe-rahmen:has(.eingabe-griff) .eingabe{
  padding-right:calc(var(--space-5) + 28px)}
/* Der Fehler ist eine warme Mulde, keine rote Box: Sie gluet innen statt
   einen Ring zu ziehen. Das Label bleibt neutral (oben) — nur die Mulde und
   der Hinweis tragen die Warnung. */
.feld.hat-fehler .eingabe,.feld.hat-fehler .eingabe-flaeche,
.feld.hat-fehler .auswahl-knopf{box-shadow:var(--neo-ein),inset 0 0 12px var(--glut-hauch)}
.numeric{font-variant-numeric:tabular-nums}

.feldgruppe{display:flex;flex-direction:column;gap:var(--space-5);
  padding:var(--space-6);background:var(--flaeche);
  border:0;border-radius:var(--radius-lg);box-shadow:var(--neo-auf)}
.feldgruppe-titel{font:var(--type-subtitle);margin:0}
.feldgruppe-hinweis{font:var(--type-caption);color:var(--tinte-fern);margin:0}
.feldgruppe-innen{display:flex;flex-direction:column;gap:var(--space-5)}
.gruppe{display:flex;flex-direction:column;gap:var(--space-5)}
/* Die Unterschrift im Deckblatt: Label, Stand und Griff untereinander,
   mit derselben Luft wie ein Feld daneben. Der Griff steht LINKS und nicht
   breit — er ist ein Nebengriff, kein zweites Sichern. */
.deckblatt-unterschrift{display:flex;flex-direction:column;
  align-items:flex-start;gap:var(--space-3)}
.deckblatt-unterschrift .fussnote{margin:0}
/* Im Sheet traegt nur das Sheet — eine Platte auf der Platte waere ein
   zweiter Rahmen. Getrennt wird per Abstand und Haarlinie statt Flaeche. */
.sheet-koerper .feldgruppe{background:none;box-shadow:none;padding:0}
/* EIN ABSTAND AUS EINER QUELLE (26.08.2026).

   Zwischen zwei Gruppen standen 61 px, und die kamen aus drei Toepfen:
   12 px `gap` des `.stapel`, 24 px `margin-top` und 24 px `padding-top`
   dieser Regel. Innerhalb einer Gruppe waren es 16 px, zwischen Label und
   Feld 6 px — und wo ein Fremd-Wrapper dazwischenstand (`.formular-mass`,
   `.postenbereich`, ein `.stapel` im `.stapel`), griff die Regel gar
   nicht und es blieben 12. Dasselbe Formular hatte damit vier
   verschiedene Abstaende fuer dieselbe Sache: „viel zu viel White Space,
   an anderer Stelle zu eng".

   Der `gap` des `.stapel` traegt jetzt allein die Trennung, dazu kommt
   nur noch die Luft ueber der Linie. Macht 32 px, ueberall gleich. */
.sheet-koerper .feldgruppe+.feldgruppe{margin-top:0;
  padding-top:var(--space-7);border-top:1px solid var(--linie)}

/* AUSSER DER DETAILGRUPPE, und die ist der Grund, warum diese Regel
   ueberhaupt eine Ausnahme braucht (26.08.2026).

   `.sheet-koerper .feldgruppe` (0-2-0) schlug `.feldgruppe-details`
   (0-1-0) unabhaengig von der Reihenfolge — die Kachel verlor im
   Formular ihren Grund, ihren Schatten und ihr Padding. Uebrig blieben
   ein Wort und ein 7-px-Pfeil in `--tinte-fern`, und darueber zog die
   Regel eine Haarlinie: Es sah aus wie ein Trenner, nicht wie etwas zum
   Aufklappen. Man fand es nur, wenn man wusste, dass es da ist.

   Sie IST eine Platte auf der Platte, und anders als eine gewoehnliche
   Feldgruppe darf sie das: Sie ist zusammengeklappt, und was man
   aufklappen kann, muss als Gegenstand zu erkennen sein. */
.sheet-koerper .feldgruppe-details{
  background:var(--flaeche);box-shadow:var(--neo-auf);
  border-radius:var(--radius-lg);overflow:hidden}
.sheet-koerper .feldgruppe+.feldgruppe-details{border-top:0;padding-top:0}
/* Die Detailfelder standen doppelt eingerueckt — einmal von der Kachel,
   einmal von dieser Regel. Sie fluchten jetzt mit dem Rest des Formulars. */
.sheet-koerper .feldgruppe-details[open] .feldgruppe-innen{
  padding:0 var(--space-6) var(--space-6)}

/* ---------- Schalter, Haken, Stepper ----------
   Der Schalter ist DER Schnapp des Systems: die Mulde, in der ein
   Silberknubbel in 160 ms einrastet. An = das Metall fängt Licht. */
.schalter{display:flex;align-items:center;gap:var(--space-5);cursor:pointer}
/* EIN BEFUND AM SCHALTER (28.08.2026). Ein Schalter hat keine Mulde, die
   gluehen koennte — die Warnung traegt der Text, und die Zeile bekommt
   links eine Glutkante. Sie sitzt am WRAPPER und nicht am `<label>`: Innen
   waere jeder Klick auf die Meldung ein Umlegen des Schalters. */
.feld-schaltzeile.hat-fehler{
  border-left:2px solid var(--glut-schrift);
  padding-left:var(--space-4);margin-left:calc(var(--space-4) * -1)}
.feld-schaltzeile.hat-fehler .schalter-label,
.feld-schaltzeile.hat-fehler .haken-label{color:var(--glut-schrift)}
.schalter-text{display:flex;flex-direction:column;gap:1px;flex:1;min-width:0}
.schalter-label{font:var(--type-body)}
.schalter-beschreibung{font:var(--type-caption);color:var(--tinte-fern)}
.schalter-eingabe{position:absolute;opacity:0;width:0;height:0}
/* DER SCHALTER HAT EINE EIGENE FARBE, KEINE GELIEHENE.

   Zweimal stand hier ein Untergrund aus dem allgemeinen Vorrat, und
   zweimal war das Ergebnis dasselbe: Der Schalter verschwand — nur
   woanders. Bis zum 26.08.2026 war es `--flaeche`, und auf der
   Schreibbühne (Untergrund `--grund`) sah man ihn nicht. Danach war es
   `--grund`, und im Sheet (Untergrund `--flaeche`) sah man ihn nicht:
   Grund auf Flaeche steht in der Nacht bei 1,2 : 1, im Porzellan-Licht
   sogar nur bei 1,1 : 1. Die gemessenen Werte stehen bei den Tokens.

   Ein Element, dessen Sichtbarkeit sich nach EINEM Untergrund richtet,
   steht irgendwann auf einem zweiten. Deshalb `--schalter-spur` und
   `--schalter-rand` (`tokens.css`): eine Fläche, die gegen beide
   Untergründe steht, und eine Kante, die sie in jedem Fall umreißt.
   Die Kante ist das Eigentliche: Sie trägt über 3 : 1 gegen alle drei
   Untergründe. Die Füllung darf darum ruhig bleiben — der Aus-Zustand
   soll sichtbar sein, nicht laut. */
.schalter-spur{position:relative;width:52px;height:30px;flex:none;
  background:var(--schalter-spur);border:1px solid var(--schalter-rand);
  border-radius:var(--radius-pill);box-shadow:var(--neo-ein)}
.schalter-knopf{position:absolute;top:3px;left:3px;width:22px;height:22px;border-radius:50%;
  background:var(--flaeche-hoch);box-shadow:var(--neo-auf)}

/* GESPERRT SIEHT NICHT AUS WIE AUS. `arbeit/latex.js` sperrt den
   Auto-Satz-Schalter, wenn der Worker nicht setzen kann — und bis zum
   26.08.2026 gab es dafür keine Regel: Ein Schalter, der nicht reagiert,
   sah aus wie einer, der eben aus ist. Wer ihn dann umlegt und nichts
   geschieht, sucht den Fehler bei sich (Kodex G1). */
.schalter:has(.schalter-eingabe:disabled){cursor:not-allowed}
.schalter-eingabe:disabled+.schalter-spur{opacity:.45;box-shadow:none}
/* `:has()` und nicht `~`: Im Baum steht der Text VOR der Eingabe
   (`ds/felder.js`), ein Geschwister-Selektor greift also nicht. */
.schalter:has(.schalter-eingabe:disabled) .schalter-text{opacity:.55}
.schalter-eingabe:checked+.schalter-spur{box-shadow:var(--neo-ein),inset 0 0 10px var(--akzent-hauch)}
.schalter-eingabe:checked+.schalter-spur .schalter-knopf{transform:translateX(22px);
  background:linear-gradient(150deg,var(--akzent-glueh),var(--akzent))}
.schalter-eingabe:focus-visible+.schalter-spur{outline:2px solid var(--akzent-glueh);outline-offset:3px}

.haken{display:flex;align-items:flex-start;gap:var(--space-4);cursor:pointer}
.haken-eingabe{position:absolute;opacity:0;width:0;height:0}
/* DERSELBE BEFUND, DIESELBE KLASSE. Der Haken trug `--flaeche` und steht
   im Sheet auf `--flaeche` — dieselbe Rechnung wie beim Schalter darüber
   und dasselbe Ergebnis. Er nimmt dieselben Tokens. */
.haken-box{width:24px;height:24px;flex:none;margin-top:1px;
  background:var(--schalter-spur);box-shadow:var(--neo-ein);
  border:1px solid var(--schalter-rand);border-radius:var(--radius-xs);
  display:grid;place-items:center;color:transparent}
.haken-eingabe:checked+.haken-box{background:var(--moos);color:var(--auf-moos)}
.haken-eingabe:focus-visible+.haken-box{outline:2px solid var(--akzent-glueh);outline-offset:3px}
.haken-text{display:flex;flex-direction:column;gap:1px}
.haken-label{font:var(--type-body)}
.haken-beschreibung{font:var(--type-caption);color:var(--tinte-fern)}

.stepper{display:flex;align-items:center;gap:var(--space-3)}
/* Ein Griff ist `--griff` (44 px) — der Stepper war mit 42 px knapp darunter. */
.stepper-knopf{width:var(--griff);height:var(--griff);flex:none;display:grid;place-items:center;
  background:var(--flaeche);color:var(--tinte);cursor:pointer;
  border:0;border-radius:var(--radius-sm);box-shadow:var(--neo-auf);
  font:var(--type-title)}
.stepper-knopf:active{box-shadow:var(--neo-ein)}
.stepper-wert{font:var(--type-metric-sm);min-width:64px;text-align:center;font-variant-numeric:tabular-nums}

/* ---------- Das Suchfeld ----------
   Die eine leise Glas-Ausnahme: Es schwebt über allem und darf deshalb
   dezent durchscheinen — nirgendwo sonst. */
.suchleiste{position:relative}
.suchfeld{position:relative;display:flex;align-items:center;gap:var(--space-4);
  min-height:46px;padding:0 var(--space-5) 0 var(--space-4);
  border-radius:var(--radius-pill);
  background:var(--glas-feld);
  backdrop-filter:var(--glas-schliff);
  -webkit-backdrop-filter:var(--glas-schliff);
  border:0;box-shadow:var(--neo-ein),inset 0 1px 0 var(--licht-innen)}
.suchfeld:focus-within{box-shadow:var(--neo-ein-tief),inset 0 0 0 1px var(--akzent-hauch)}
.suchfeld-symbol{position:relative;flex:none;width:18px;height:18px;color:var(--tinte-fern)}
.suchfeld-glyph{position:absolute;inset:0;display:grid;place-items:center}
.suchfeld-glyph.ist-pfeil{opacity:0;transform:rotate(-90deg) scale(.7)}
.suchfeld.hat-text .suchfeld-glyph.ist-lupe{opacity:0;transform:rotate(90deg) scale(.7)}
.suchfeld.hat-text .suchfeld-glyph.ist-pfeil{opacity:1;transform:none}
.suchfeld.hat-text .suchfeld-symbol{color:var(--tinte)}
.suchfeld-eingabe{flex:1;min-width:0;background:none;border:0;outline:none;
  color:var(--tinte);font:var(--type-body);padding:var(--space-4) 0;box-shadow:none}
.suchfeld-eingabe::placeholder{color:var(--tinte-fern)}
.suchfeld-eingabe::-webkit-search-cancel-button{display:none}
.suchfeld-loeschen{flex:none;display:grid;place-items:center;
  width:40px;height:40px;margin-right:calc(var(--space-4) * -1);
  border:0;border-radius:50%;background:none;color:var(--tinte-fern);cursor:pointer;
  opacity:0;pointer-events:none}
.suchfeld.hat-text .suchfeld-loeschen{opacity:1;pointer-events:auto}
.suchfeld-loeschen:hover{color:var(--tinte)}
.suchleiste-panel{position:absolute;left:0;right:0;top:calc(100% + var(--space-3));z-index:40;
  display:none;flex-direction:column;padding:var(--space-3);
  border-radius:var(--radius-md);background:var(--flaeche-hoch);
  border:0;box-shadow:var(--neo-auf-tief)}
.suchleiste.ist-offen .suchleiste-panel{display:flex}
.suchleiste-liste{display:flex;flex-direction:column;max-height:min(52vh,380px);overflow-y:auto}
.suchleiste-liste[hidden]{display:none}
.suchleiste-zeile{display:flex;align-items:center;gap:var(--space-4);
  width:100%;min-height:var(--griff);padding:var(--space-3) var(--space-4);
  border:0;border-radius:var(--radius-sm);background:none;
  color:var(--tinte);text-align:left;cursor:pointer}
.suchleiste-zeile.ist-gewaehlt{background:var(--flaeche);box-shadow:var(--neo-ein)}
.suchleiste-zeile-art{flex:none;color:var(--tinte-fern);display:grid;place-items:center}
.suchleiste-zeile-mitte{display:flex;flex-direction:column;gap:1px;flex:1;min-width:0}
.suchleiste-zeile-titel{font:var(--type-body);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.suchleiste-zeile-unter{font:var(--type-caption);color:var(--tinte-fern);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.suchleiste-zeile-wort{flex:none;font:var(--type-caption);color:var(--tinte-fern)}
.suchleiste-fuss{font:var(--type-caption);color:var(--tinte-fern);margin:0;
  padding:var(--space-3) var(--space-4) var(--space-2);border-top:1px solid var(--linie)}
@media (pointer:coarse){.suchleiste-fuss{display:none}}

@media (min-width:900px){
  .sheet-huelle,.blende-flug{align-items:center}
  .sheet-panel{border-radius:var(--radius-xl);max-height:86dvh}
  .sheet-panel::before{display:none}
  .sheet-aktionen .knopf,.sheet-aktionen .lm-rand{flex:0 0 auto}
  .blende-panel{border-radius:var(--radius-xl)}
}

/* ---------- Formulare am Laptop: ZWEI SPALTEN ----------

   Das Sheet war 560 px breit — die Breite eines Handys, auf einem Schirm
   von 1440. Das kostete nicht Platz, sondern Uebersicht: „Kapitel
   bearbeiten" hatte 1.325 px Inhalt in 698 px Hoehe, also mehr als eine
   ganze Bildschirmhoehe zum Rollen. Wer ein Formular ausfuellt, soll
   sehen, was er ausfuellt (Kodex Z6) — und was unter dem Rand liegt,
   sieht man nicht.

   760 px breit, und die kurzen Felder stehen nebeneinander: ein Datum,
   eine Zahl, ein Kuerzel brauchen keine 700 px. Was WIRKLICH Breite
   braucht — Fliesstext, Chipreihen, Segmentleisten — traegt `.feld-weit`
   und spannt weiter ueber beide Spalten. Aus zwoelf Rollzeilen werden
   sechs, und meistens keine. */
/* Fliesstext im Sheet bleibt lesbar breit. Mit 760 px Sheetbreite waren
   die Erklaerungen ueber hundert Zeichen lang; ab etwa 75 verliert das
   Auge beim Zeilensprung die Zeile. Felder duerfen breiter sein — sie
   werden nicht gelesen, sondern ausgefuellt. */
.sheet-text,.formular-hinweis,.feldgruppe-hinweis{max-width:74ch}

@media (min-width:1000px){
  /* 90dvh statt 86: Der Unterschied sind rund 40 px, und 40 px sind bei
     einem Formular die Zeile, wegen der man haette rollen muessen. */
  /* 860 STATT 760 (26.08.2026). Bei 760 blieben nach dem Innenrand rund
     700 px, also 335 px je Spalte — zu wenig fuer ein Feld mit einem Satz
     darin, und daneben stand der halbe Schirm als Schleier. Hundert
     Pixel mehr geben jeder Spalte 385, ohne dass eine Zeile zu lang wird,
     um sie noch zu lesen. */
  .sheet-panel{max-width:860px;max-height:90dvh}
  /* Das Notizblatt ist eine Zusammenschau, kein Formular (`sheet({weit})`,
     `js/ds/flaechen.js`). */
  .sheet-panel.ist-weit{max-width:1100px}

  /* AUCH DER NACKTE STAPEL RASTERT (26.08.2026).

     Das Raster hing allein an `.feldgruppe`, und ein knappes Drittel der
     Formulare benutzt gar keine Gruppe: Schlaf, Woerter, Aufgabenzeit,
     Projektzeit, Rahmenzeit und der Posten-Detail legen ihre Felder
     direkt in den `.stapel`. Die bekamen deshalb NIE zwei Spalten — ein
     Stepper „Minuten" stand ueber 820 px, mit dem Griff am rechten Rand
     und der Beschriftung am linken. Genau das meinte „komische
     Feldgroessen".

     Ein Formular soll nicht daran haengen, ob jemand seine Felder in
     eine Gruppe gelegt hat. Es rastert, wo Felder stehen. */
  .feldgruppe,.feldgruppe-innen,.formular>.stapel{
    display:grid;grid-template-columns:repeat(2,minmax(0,1fr));
    gap:var(--space-6) var(--space-6);align-items:start;
  }
  /* Alles spannt — ausser einem kurzen Feld. Anders herum waere es eine
     Liste von Ausnahmen, die mit jedem neuen Baustein laenger wird. */
  .feldgruppe>*,.feldgruppe-innen>*,.formular>.stapel>*{grid-column:1 / -1}
  .feldgruppe>.feld:not(.feld-weit),
  .feldgruppe-innen>.feld:not(.feld-weit),
  .formular>.stapel>.feld:not(.feld-weit),
  /* Ein Schalter und ein Haken sind eine Zeile mit einem Wort. Ueber die
     volle Breite gezogen lag der Griff 600 px rechts von seiner
     Beschriftung — man las links und griff rechts. */
  .feldgruppe>.schalter,.feldgruppe-innen>.schalter,
  .formular>.stapel>.schalter,
  .feldgruppe>.haken,.feldgruppe-innen>.haken,
  .formular>.stapel>.haken{grid-column:auto}
  /* Das Kalenderblatt und das Auswahlmenue haengen unter ihrem Feld und
     duerfen ueber die Spaltengrenze hinaus — sie liegen ohnehin ueber
     dem Formular. */
  .feldgruppe>.feld,.formular>.stapel>.feld{min-width:0}
}


/* ============================================================
   3b · FORMULARE, ZWEITER TEIL

   Was hier steht, hat das Designsystem nicht mitgeliefert und die App
   deshalb selbst gebaut: das eigene AUSWAHLMENUE (statt des
   Systemkastens, der auf Android ein grauer Vollbild-Dialog ist), der
   eigene MONATSKALENDER (statt `input[type=date]`, das auf jeder
   Plattform anders aussieht), der WAEHLER und der SEGMENTWAEHLER.

   Es sind genau die vier Stellen, an denen ein Formular vor v34 wehtat:
   Das Menue lag halb unter dem Bildschirmrand, der Kalender war im Sheet
   abgeschnitten, der Waehler sprang beim Tippen, und der Laeufer im
   Segment hüpfte. Alle vier tragen jetzt dieselbe Regel: Was aufgeht,
   geht dorthin auf, wo Platz ist — und wenn nirgends Platz ist, scrollt
   es in sich selbst statt aus dem Bild zu laufen.
   ============================================================ */

/* ---------- Der Segmentwähler ----------
   Er ist eine ZEILE. Untereinander gestapelt wäre er eine Liste, und
   eine Liste beantwortet eine andere Frage als eine Wahl. */

.segmente{
  position:relative;
  display:flex;flex-direction:row;gap:var(--space-2);
  padding:3px;
  background:var(--flaeche);border-radius:var(--radius-pill);
  box-shadow:var(--neo-ein);
  --laeufer-luft:3px;
}
/* IM FORMULAR HUGT DIE SCHIENE IHREN INHALT. „Klausur | Arbeit" ueber
   700 px auseinandergezogen sah aus wie zwei Knoepfe, die zufaellig
   nebeneinander liegen — und der Laeufer legte fuer eine Wahl aus zwei
   Woertern die halbe Sheetbreite zurueck. */
.feld>.segmente{align-self:flex-start;max-width:100%}
.segmente-kopf{align-self:flex-start;max-width:100%;overflow-x:auto;scrollbar-width:none}
.segmente-kopf::-webkit-scrollbar{display:none}
/* Für Reihen, die länger sind als jedes Sheet breit („Gelaufen in" hat
   sechs Abschnitte): rollen statt quetschen — dieselbe Entscheidung wie
   beim Kopf, nur ohne dessen Schrumpf auf Inhaltsbreite, denn im
   Formular soll die Schiene bündig mit den Feldern stehen. */
.segmente-rollbar{max-width:100%;overflow-x:auto;scrollbar-width:none}
.segmente-rollbar::-webkit-scrollbar{display:none}
.segment{
  position:relative;z-index:1;
  flex:1 1 auto;min-width:0;white-space:nowrap;
  min-height:38px;padding:0 var(--space-5);
  border:0;border-radius:var(--radius-pill);
  background:none;color:var(--tinte-still);
  font:var(--type-small);cursor:pointer;
  /* Der Reset stellt jeden Knopf auf linksbuendig — hier ist das falsch:
     Der Laeufer faehrt unter das Wort, also muss das Wort in der Mitte
     seines Knopfs stehen. */
  text-align:center;
}
/* Derselbe Spezifitätsfehler wie beim Chip, nur harmloser: Der gewählte
   Abschnitt verlor beim Überfahren seine gehobene Fläche und bekam die
   flache Hover-Tönung — er sah dann kurz aus wie nicht gewählt. */
.segment:hover:not(.ist-aktiv,[aria-selected="true"],[aria-checked="true"],[aria-pressed="true"]){
  color:var(--tinte);background:var(--tinte-hauch)}
/* Der gewählte Abschnitt trägt seine Fläche NICHT mehr selbst — sie ist
   der Läufer darunter und FÄHRT zu ihm. Vorher sprang sie von einem Wort
   zum nächsten und machte dabei einen kleinen Hüpfer (`lm-segment`); das
   war Bewegung, aber sie erzählte nichts über den Weg. Der Knopf ändert
   jetzt nur noch seine Schriftfarbe. */
.segment.ist-aktiv,.segment.ist-gewaehlt,
.segment[aria-checked="true"],.segment[aria-selected="true"],.segment[aria-pressed="true"]{
  color:var(--tinte);
}


.indikator{position:absolute;left:0;top:var(--laeufer-luft,5px);bottom:var(--laeufer-luft,5px);
  border-radius:var(--radius-pill);background:var(--flaeche);
  box-shadow:var(--neo-auf);opacity:0}
.indikator.ist-da{opacity:1}

/* ---------- Das Auswahlmenue ----------
   Ein Knopf, der wie ein Feld aussieht (eine Mulde), und darunter eine
   gehobene Flaeche mit den Optionen. `blaseAusrichten()` in
   `js/ds/felder.js` entscheidet vor jedem Oeffnen, ob sie nach unten
   oder nach oben klappt und ob sie gestutzt werden muss. */
.auswahl{position:relative}
.auswahl-knopf{
  display:flex;align-items:center;gap:var(--space-3);width:100%;
  min-height:var(--griff);padding:var(--space-4) var(--space-5);
  background:var(--flaeche);color:var(--tinte);text-align:left;cursor:pointer;
  border:0;border-radius:var(--radius-sm);box-shadow:var(--neo-ein);
  font:var(--type-body);
}
/* Fokus-/Offen-Ring: siehe die konsolidierte Regel bei den Feldern oben
   (`.eingabe:focus, ... .auswahl-knopf:focus-visible`). */
/* Eine Auswahl ohne Eintraege sieht aus wie eine, die nichts tut — weil
   sie nichts tun kann. Der Hinweis darunter sagt, warum. */
.auswahl-knopf:disabled{cursor:default;color:var(--tinte-fern);
  box-shadow:var(--neo-ein);opacity:.6}
.auswahl-knopf:disabled .eingabe-chevron{opacity:.4}
.auswahl-text{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
/* Ein Feld, in dem noch nichts steht, wirbt nicht mit voller Tinte um
   Aufmerksamkeit — es sagt bloss, dass hier eine Wahl hingehoert. */
.auswahl-text.ist-leer{color:var(--tinte-fern)}
.auswahl-menue{
  position:absolute;left:0;right:0;top:calc(100% + var(--space-3));z-index:30;
  /* Nie schmaler als 280 px oder der freie Platz — ein Menue in einer
     schmalen Spalte darf breiter sein als sein Knopf, es liegt ohnehin
     darueber. */
  min-width:min(280px,calc(100vw - 2*var(--gutter-screen)));
  /* So hoch, wie der Bildschirm hergibt — `blaseAusrichten()` stutzt es
     danach auf den tatsaechlich freien Platz. Ein fester Wert war bei
     einer Uhrzeitenliste mit 96 Eintraegen unnoetig eng. */
  max-height:min(360px,50dvh);overflow-y:auto;overscroll-behavior:contain;
  background:var(--flaeche-hoch);
  border:0;border-radius:var(--radius-md);
  box-shadow:var(--neo-auf-tief),inset 0 1px 0 var(--licht-innen);
  display:flex;flex-direction:column;padding:var(--space-2);
}
/* Die Browserregel [hidden]{display:none} ist schwach: JEDE Autorenregel
   mit `display` schlaegt sie, und zwar lautlos. So stand eine Auswahl
   eine Fassung lang dauerhaft offen und fing die Klicks ab, die dem Feld
   darunter galten. Deshalb diese Zeile. */
.auswahl-menue[hidden]{display:none}
.auswahl-menue.ist-oben{top:auto;bottom:calc(100% + var(--space-3))}
/* AUSGEHAENGT — die Blase liegt nicht mehr in ihrem Feld.

   Ein `position:absolute`-Kind wird von jedem Vorfahren mit
   `overflow:auto` GECLIPPT, und `.sheet-koerper` ist genau so einer. Ein
   Auswahlfeld in der unteren Haelfte eines Formulars klappte deshalb in
   einen Kasten auf, der es abschnitt — kein `z-index` hilft dagegen, nur
   ein anderer Elternteil. `blaseAnhaengen()` (`ds/felder.js`) haengt sie
   fuer die Dauer des Oeffnens an die Sheet-Huelle und setzt `left`, `top`
   und `width` in Fensterkoordinaten; `ist-oben` braucht hier keine Regel,
   weil `top` dann ausgerechnet ist statt abgeleitet.

   `z-index` ueber dem Panel, aber unter den Toasts (60) und der
   Ortsleiste (80): Eine Meldung muss ueber einem offenen Menue stehen. */
.auswahl-menue.ist-losgeloest{
  position:fixed;right:auto;bottom:auto;z-index:55}
.auswahl-option{
  display:flex;align-items:center;gap:var(--space-3);
  min-height:42px;padding:var(--space-2) var(--space-4);
  background:none;border:0;border-radius:var(--radius-xs);
  color:var(--tinte);cursor:pointer;text-align:left;font:var(--type-body);
  /* `flex:none` ist hier die halbe Miete: Die Optionen stehen in einer
     scrollenden Flex-Spalte, und Flex-Kinder SCHRUMPFEN, wenn der Platz
     nicht reicht. Eine Option mit drei Zeilen Text wurde auf 42 px
     gedrueckt, und ihr Text lief ueber die Nachbarn. Gescrollt wird die
     Liste, nie die Zeile. */
  flex:none;
}
.auswahl-option>span:first-child{min-width:0;overflow:hidden;
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}
/* Hover toent flach (Maus), die Tastatur-Marke ist die staerkere Toenung
   (sie muss auch OHNE Hover auffindbar sein), gewaehlt ist gedrueckt. */
.auswahl-option:hover{background:var(--tinte-hauch)}
.auswahl-option.ist-markiert{background:var(--tinte-hauch-stark)}
.auswahl-option.ist-gewaehlt{font:var(--type-body-strong);
  background:var(--flaeche);box-shadow:var(--neo-ein)}
.auswahl-option-haken{margin-left:auto;flex:none;color:var(--akzent-schrift)}

/* ---------- Das Menue in der Blase ----------
   Dieselben Zeilen wie im Auswahlmenue, nur in einem Popover statt in
   einem Feld — die Geschwister eines Pfadglieds, die Ampelwahl. */
.menue{display:flex;flex-direction:column;gap:1px;min-width:180px;
  max-width:min(320px,calc(100vw - 16px))}
.menuezeile{
  display:flex;align-items:center;gap:var(--space-4);
  width:100%;min-height:40px;padding:var(--space-2) var(--space-4);
  background:none;border:0;border-radius:var(--radius-xs);
  color:var(--tinte);cursor:pointer;text-align:left;font:var(--type-small);
}
/* DAS WORT NIMMT DEN PLATZ, und es wird beim Namen genannt.

   Hier stand `.menuezeile>span:first-child`. Bei einer Zeile OHNE Symbol
   war das erste Kind das Wort und alles stimmte; mit Symbol war es der
   Glyph-Platz — der dehnte sich auf die ganze Breite und schob das Wort an
   den rechten Rand. Weil `.menuezeile-glyph{flex:none}` die schwaechere
   Auswahl ist, gewann der Positionsselektor, und zwar still: Es sah nach
   einer Gestaltungsentscheidung aus, nicht nach einem Fehler. Aufgefallen
   am 27.08.2026 an „Einfuegen" — vierzehn Zeilen, alle rechtsbuendig. */
.menuezeile-wort{flex:1;min-width:0;overflow:hidden;
  text-overflow:ellipsis;white-space:nowrap;text-align:left}
.menuezeile:hover{background:var(--tinte-hauch)}
.menuezeile.ist-aktiv{font:var(--type-small-strong);
  background:var(--flaeche);box-shadow:var(--neo-ein)}
.menuezeile svg{flex:none;color:var(--akzent)}
.menuezeile:disabled{color:var(--tinte-fern);cursor:default}
.menuezeile:disabled:hover{background:none}
/* Der Glyph-Platz steht IMMER, auch wenn kein Symbol darin liegt: Sonst
   ruecken die Woerter einer Menueliste je nach Zeile verschieden weit ein,
   und eine Liste, deren linke Kante tanzt, liest sich nicht senkrecht. */
.menuezeile-glyph{flex:none;display:grid;place-items:center;width:15px;height:15px}
.menuezeile-glyph svg{color:var(--tinte-still)}
/* Das Tastenkuerzel: rechts, leise, in Tabellenziffern — es wird gesucht,
   nicht gelesen. */
.menuezeile-kuerzel{
  flex:none;margin-left:var(--space-4);
  font:var(--type-caption);color:var(--tinte-fern);
  font-variant-numeric:tabular-nums;white-space:nowrap;
}
.menue-trenner{
  height:0;margin:var(--space-2) var(--space-3);
  border-top:var(--hairline);
}

/* ---------- Die Menueleiste ----------
   Eine Zeile, in der Woerter stehen und aufklappen. Sie traegt kein Relief
   und keinen Rahmen: Sie ist die KANTE einer Arbeitsflaeche, kein Kasten
   darauf (siehe den Kopf von `js/ds/navigation.js`). */
.menueleiste{
  display:flex;align-items:center;gap:var(--space-2);
  min-height:34px;width:100%;
}
.menueleiste-links{
  display:flex;align-items:center;gap:var(--space-1,2px);
  min-width:0;flex:1;overflow-x:auto;scrollbar-width:none;
}
.menueleiste-links::-webkit-scrollbar{display:none}
/* Rechts steht, was ein Ergebnis erzeugt oder darueber Auskunft gibt. Der
   Abstandshalter davor ist diese Regel selbst (Kodex G3). */
.menueleiste-rechts{
  display:flex;align-items:center;gap:var(--space-3);flex:none;
}
.menueknopf{
  display:inline-flex;align-items:center;gap:var(--space-2);
  min-height:28px;padding:0 var(--space-3);
  background:none;border:0;border-radius:var(--radius-xs);
  color:var(--tinte-still);font:var(--type-small);cursor:pointer;
  white-space:nowrap;
}
.menueknopf:hover{background:var(--tinte-hauch);color:var(--tinte)}
.menueknopf[aria-expanded="true"]{background:var(--tinte-hauch-stark);color:var(--tinte)}
.menueknopf.ist-stark{color:var(--tinte);font:var(--type-small-strong)}
.menueknopf-glyph{display:flex;flex:none}
/* Der Pfeil ist eine Zusage („hier geht etwas auf") und kein Schmuck —
   deshalb leiser als das Wort, aber immer da. */
.menueknopf-pfeil{display:flex;flex:none;color:var(--tinte-fern)}
.menueknopf:hover .menueknopf-pfeil,
.menueknopf[aria-expanded="true"] .menueknopf-pfeil{color:var(--tinte-still)}

/* Bedienbares ist >= `--griff` (44 px) unter dem Finger — Maus darf enger
   sein (42px/40px oben reichen dort als Trefferflaeche, Kodex Z2). */
@media (pointer:coarse){.auswahl-option,.menuezeile{min-height:var(--griff)}
  .menueknopf{min-height:var(--griff)}}

/* ---------- Der Monatskalender ----------
   Er steht IM FLUSS und nicht als absolut gesetzte Blase. Der Grund ist
   ein Bildschirmfoto vom 10.08.2026: In einem Sheet lag er zur Haelfte
   unter dem Rand, und scrollen liess er sich nicht, weil das Sheet
   scrollte und nicht er. Im Fluss schiebt er das Formular auseinander —
   das sieht weniger elegant aus und ist bedienbar. */
.kalender{
  display:flex;flex-direction:column;gap:var(--space-3);
  width:min(340px,100%);
  padding:var(--space-5);
  background:var(--flaeche);
  border:0;border-radius:var(--radius-md);box-shadow:var(--neo-ein);
}
.kalender[hidden]{display:none}
.kalender-kopf{display:flex;align-items:center;gap:var(--space-4)}
.kalender-monat{font:var(--type-subtitle);flex:1;text-align:center}
/* 32x32 statt 18x18. Die beiden Monatspfeile waren die kleinsten
   Trefferflaechen der App — kleiner als das Glyph, das darin steckt
   (Kodex Z2). Dasselbe fuer „Heute" und „Kein Datum" darunter. */
.kalender-kopf>.kalender-nav{width:32px;height:32px;flex:none;
  display:grid;place-items:center;
  background:none;border:0;border-radius:var(--radius-xs);
  color:var(--tinte-still);cursor:pointer}
.kalender-kopf>.kalender-nav:hover{background:var(--tinte-hauch);color:var(--tinte)}
.kalender-nav{display:flex;gap:var(--space-2)}
.kalender-raster{display:grid;grid-template-columns:repeat(7,1fr);gap:3px}
.kalender-wochentag{font:var(--type-label);letter-spacing:var(--tracking-label);
  text-transform:uppercase;color:var(--tinte-fern);text-align:center;padding:var(--space-2) 0}
.kalender-tag{
  text-align:center;aspect-ratio:1;display:grid;place-items:center;
  background:none;border:0;border-radius:var(--radius-xs);
  color:var(--tinte);cursor:pointer;font:var(--type-small);
}
.kalender-tag:hover{background:var(--tinte-hauch)}
/* Der gewaehlte Tag ist EINGEDRUECKT, nicht gefaerbt — dasselbe
   Material, dieselbe Regel wie beim Chip und beim Segment. */
.kalender-tag.ist-gewaehlt{background:var(--flaeche-hoch);
  box-shadow:var(--neo-auf);font:var(--type-small-strong)}
.kalender-tag.ist-heute{box-shadow:inset 0 0 0 1px var(--linie-stark)}
.kalender-tag.ist-leer{visibility:hidden}
.kalender-fuss,.kalender-schnell{display:flex;flex-wrap:wrap;gap:var(--space-3)}
.kalender-fuss>.kalender-schnell{min-height:32px;padding:0 var(--space-4);align-items:center;
  background:none;border:0;border-radius:var(--radius-xs);
  font:var(--type-small);color:var(--tinte-still);cursor:pointer}
.kalender-fuss>.kalender-schnell:hover{background:var(--tinte-hauch);color:var(--tinte)}
.eingabe-datum.ist-offen{box-shadow:var(--neo-ein-tief)}
.datum-rahmen{display:flex;flex-direction:column;gap:var(--space-3)}
.datum-text{flex:1;min-width:0;text-align:left}
.datum-text.ist-leer{color:var(--tinte-fern)}

/* ---------- Der Waehler ----------
   Eine Liste, die man durchsucht: Zielwahl, Quellenwahl, Schrittwahl. */
.waehler-liste{display:flex;flex-direction:column;gap:var(--space-2);
  max-height:320px;overflow-y:auto;overscroll-behavior:contain}
/* Steht ein Suchfeld davor, ist die Hoehe FEST: Beim Tippen wachsen und
   schrumpfen sonst Liste und Sheet mit jedem Zeichen — ein Dialog, der
   unter dem Finger springt, waehrend man ihn benutzt. Gescrollt wird
   innen, die Groesse steht. */
.suchfeld~.waehler-liste{height:min(320px,48dvh)}
.waehler-liste>*{flex:none}
.waehler-gruppe{margin:var(--space-4) 0 var(--space-1);padding-left:var(--space-4)}
.waehler-zeile{border-radius:var(--radius-sm)}
.waehler-zeile:hover{background:var(--tinte-hauch)}
.waehler-zeile.ist-verknuepft{opacity:.5;cursor:default}
.waehler-zeile.ist-verknuepft:hover{background:none}

/* ---------- Der Stepper ---------- */
.stepper-eingabe{
  /* Fest statt mitwachsend: Eine Zahl zwischen zwei Knoepfen ist ein
     Wert, kein Textfeld. Volle Breite liess sie aussehen wie eine
     Eingabezeile, in die man einen Satz schreibt. */
  flex:0 0 92px;min-width:0;text-align:center;
  min-height:42px;padding:0 var(--space-4);
  background:var(--flaeche);color:var(--tinte);
  border:0;border-radius:var(--radius-sm);box-shadow:var(--neo-ein);
  font:var(--type-metric-sm);font-variant-numeric:tabular-nums;
}
.stepper-einheit{flex:none;font:var(--type-small);color:var(--tinte-fern)}

/* ---------- Das Formular selbst ---------- */
.formular-hinweis{font:var(--type-small);color:var(--tinte-still);margin:0;text-wrap:pretty}
.formular-fehler{font:var(--type-small);color:var(--glut-schrift);margin:0}
.formular-fehler[hidden]{display:none}
/* `.formular-gefahr` STAND HIER — ein Kasten mit Trennlinie um die
   Loeschzeile, angehaengt UNTER der Aktionsleiste. Da die Leiste klebt,
   lag er ausserhalb des Blattes (die Messung steht in `gemeinsam.js`).
   Die Zeile steht jetzt IN der Leiste, und ein Rahmen um ein Drittel einer
   Reihe waere ein Rahmen zu viel (Kodex Q8). */
.formular-fussnote{font:var(--type-caption);color:var(--tinte-fern);margin:0}
.formular-ergebnis{display:flex;flex-direction:column;gap:var(--space-4)}

/* Eine Feldgruppe, die zugeklappt mitreist. Sie traegt die Felder, die
   man selten anfasst — und die trotzdem mitmuessen, weil ein Auftrag
   einen ZIELZUSTAND beschreibt: Ein Formular, das `inhalt` nicht kennt,
   wuerde `inhalt` beim Sichern loeschen. */
.feldgruppe-details{border:0;border-radius:var(--radius-lg);
  background:var(--flaeche);box-shadow:var(--neo-auf);overflow:hidden}
.feldgruppe-summary{
  display:flex;align-items:center;gap:var(--space-3);
  padding:var(--space-5) var(--space-6);cursor:pointer;
  font:var(--type-subtitle);list-style:none;
}
.feldgruppe-summary::-webkit-details-marker{display:none}
.feldgruppe-summary::after{content:"";width:7px;height:7px;margin-left:auto;
  border-right:1.5px solid var(--tinte-fern);border-bottom:1.5px solid var(--tinte-fern);
  transform:rotate(45deg) translateY(-2px)}
.feldgruppe-details[open] .feldgruppe-summary::after{transform:rotate(-135deg) translateY(-2px)}
.feldgruppe-details[open] .feldgruppe-innen{padding:0 var(--space-6) var(--space-6)}

/* Ein Filterfeld, kein Suchfeld: Es steht in einer Zeile mit Chips und
   nimmt sich deshalb nur so viel Platz, wie es braucht. Volle Breite
   saehe aus wie die Suchleiste darueber — und die tut etwas anderes. */
.eingabe-rahmen-schmal{flex:0 1 240px;min-width:170px}
.eingabe-rahmen-schmal .eingabe{min-height:38px;font:var(--type-small)}
/* Die Stufenleiste steht am RECHTEN Ende derselben Zeile: links, womit
   man einengt (Wort, Modul), rechts, wonach man sortiert sieht. Bis v33
   erzwang `flex-basis:100%` eine zweite Zeile — am Laptop eine halbe
   leere Zeile ueber der Liste, nur damit vier Glyphen unter dem
   Suchfeld stehen. Am Handy ist die zweite Zeile richtig. */
.filterzeile-stufen{display:flex;margin-left:auto}
@media (max-width:720px){.filterzeile-stufen{flex-basis:100%;margin-left:0}}

/* Eine Mitte, die selbst der Knopf ist (siehe `zeile()` in ds/zeilen.js). */
.zeile-lesen{cursor:pointer;text-align:left;background:none;border:0;width:100%}

/* Solange ein Sheet offen ist, scrollt der Hintergrund nicht mit. Ohne
   diese Zeile scrollt unter dem Finger die Buehne statt des Formulars —
   und beim Schliessen steht man woanders als vorher. */
body.sheet-offen{overflow:hidden}

/* ---------- Das Ziehen (js/ds/ziehen.js) ----------
   Quelle, Geist, Ziel — drei Zustaende, ein Zug. Die Transitions dazu
   stehen in `motion.css`, hier nur die Form. */
body.zieht-gerade{-webkit-user-select:none;user-select:none}
/* Quelle: bleibt an Ort, wird nur blass — der Platz klappt nicht zu. */
.ist-zieht{opacity:.35}
/* Der Geist: EINE ZEILE, nicht ein Klon (07.09.2026).

   Bis dahin klonte `ds/ziehen.js` die gezogene Zeile. Das Raster einer
   Zeile kommt aber aus ihrer Liste, und an `document.body` gibt es die
   nicht — die Spalten fielen zusammen und der Titel brach auf ein Zeichen
   je Zeile um. Der Grund steht ausfuehrlich bei `schlepper()`.

   Deshalb hier eine feste Form statt einer geerbten: eine Reihe, ein Name,
   optional eine Dauer, und nichts davon bricht um. */
.schleppgeist{
  position:fixed;top:0;left:0;z-index:80;
  display:flex;align-items:center;gap:var(--space-3);
  padding:var(--space-3) var(--space-4);box-sizing:border-box;
  background:var(--flaeche);border-radius:var(--radius-md);
  font:var(--type-small-strong);color:var(--tinte);
  pointer-events:none;transform-origin:center;
  box-shadow:var(--neo-auf-tief);opacity:.96;
}
/* EINZEILIG, UND ZWAR ERZWUNGEN. Ein Schlepper, der waechst, verdeckt
   genau die Spalte, in die er soll. */
.schleppgeist-name{
  flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.schleppgeist-dauer{
  flex:none;font:var(--type-caption);color:var(--tinte-still);
  font-variant-numeric:tabular-nums}
.schleppgeist.faehrt-fort{opacity:0}
/* Das Ziel: sinkt ein und traegt eine Moos-Kante — dieselbe Aussage, ob es
   eine Flaeche ist (eine Mulde nimmt auf) oder eine Zeile in einer Liste
   (die Kante zeigt, wo der Zug landet). */
.ist-ziel{
  box-shadow:var(--neo-ein),0 -2px 0 var(--moos);
  outline:1px solid var(--moos);outline-offset:-1px;
}

/* ============================================================
   9 · DIE SCHALE

   Sie besteht aus vier Dingen, und keines gehoert einer Buehne:
   die ORTSLEISTE links (wo man sein kann), die KOPFLEISTE oben (wo man
   ist, und der Weg dorthin), die BUEHNE (was man sieht) und die
   UHRLEISTE unten (was gerade laeuft).

   WAS HIER BIS v33 STAND UND WARUM ES WEG IST: eine senkrechte
   „Hoehenspur" am rechten Rand mit drei Punkten, und darunter ein Knopf
   zum „Abtauchen" in einen Maschinenraum mit eigener Reiterschiene und
   eigenem, immer dunklem Licht. Das waren ZWEI Navigationen fuer EINE
   App — und wer drei Ebenen tief stand, sah seinen Weg nicht, sondern
   nur einen Zurueck-Knopf mit dem Namen des Elternteils.

   Jetzt gibt es acht Orte in einer Leiste und darueber den Pfad, den man
   gegangen ist. Wie im Datei-Explorer: jede Ebene sichtbar, jede Ebene
   anspringbar, und jede Ebene mit Geschwistern traegt ein Chevron, das
   sie zeigt. Zwei Bewegungen — nach unten in die Tiefe, zur Seite unter
   Geschwistern — und beide sind zu sehen, bevor man sie macht.
   ============================================================ */

.wurzel{min-height:100dvh}

/* Am Laptop zwei Spalten: die Ortsleiste steht, der Rest scrollt.
   Sie ist `position:fixed` und nicht `sticky`, weil sie unabhaengig
   vom Inhalt ihre eigene Hoehe hat und ihren eigenen Bildlauf braucht,
   sobald acht Orte nicht mehr auf den Schirm passen. */
.huelle{
  min-height:100dvh;
  display:flex;
  flex-direction:column;
  padding-bottom:env(safe-area-inset-bottom);
}

/* EIN GRUND, UND ES GIBT KEINEN ZWEITEN.

   Hier stand ein Mischton aus `--grund` und `--flaeche` (70/30), der die
   Saeule „eine Nuance" ueber die Sidebar heben sollte. Solange Grund und
   Flaeche denselben Wert trugen, war die Mischung folgenlos — sie fiel
   erst auf, als der Nachtgrund am 25.08.2026 tiefer gelegt wurde: Aus
   der gedachten Nuance wurde ein sichtbar anderer Streifen neben der
   Leiste, also zwei Grundfarben in einem Bild.

   Das Relief traegt die Trennung ohnehin: Was gehoben ist, ist gehoben,
   und was liegt, liegt. Eine zweite Grundfarbe daneben ist dafuer nicht
   noetig — sie war nur nie zu sehen. */
/* DER SATZ STEHT HIER UND NICHT AN DER BUEHNE.

   `--buehne-max` und `--buehne-rinne` beschreiben EINEN Satzspiegel, und
   an dem haengen drei Dinge: die Buehne, die Kopfleiste und das
   Suchband. Stand das Mass an der Buehne, konnten Kopf und Suche es
   nicht lesen — sie sind ihre Geschwister, nicht ihre Kinder. Genau
   daran lagen die drei linken Kanten vom 26.08.2026: Die Chrome-Ebene
   mass vom Rand, der Inhalt von der Mitte, und niemand konnte den
   Unterschied sehen, weil die zwei Rechnungen an zwei Orten standen
   (Kodex G3 — eine Sache, ein Ort). */
.saeule{display:flex;flex-direction:column;flex:1;min-width:0;
  background:var(--grund);
  --buehne-max:760px;
  --buehne-rinne:var(--gutter-screen);
  /* Wo die linke Kante des Inhalts liegt — von der Saeule aus gerechnet.
     Die Buehne kommt dort ueber `margin:auto` von selbst hin; Kopf und
     Suche brauchen die Rechnung ausgeschrieben. */
  --satz-links:max(var(--buehne-rinne),
    calc((100% - var(--buehne-max)) / 2 + var(--buehne-rinne)));
}

.buehne{
  flex:1;
  display:flex;
  flex-direction:column;
  width:100%;
  max-width:var(--buehne-max);
  margin:0 auto;
  padding:var(--space-7) var(--buehne-rinne) calc(var(--space-13) + env(safe-area-inset-bottom));
}

/* ---------- Die Ortsleiste ----------
   Acht Zeilen, ein Trennstrich. Der aktive Ort ist eine Mulde im
   Material — er ist nicht hervorgehoben, er ist EINGEDRUECKT: das ist
   die Stelle, an der man steht, nicht die, die leuchtet. */
/* EINE BREITE, ZWEI SCHALTER. `--orte-w` ist der einzige Ort, an dem
   steht, wie breit die Leiste ist; umgelegt wird er vom Griff
   (`.ist-schmal`) und von der Fensterbreite (Block 11). Ohne diese
   Variable stuenden dieselben Regeln zweimal da — einmal fuer den Griff,
   einmal fuer den Media-Query — und die zweite Fassung waere die, die
   beim naechsten Mal vergessen wird (G3). */
.orte{
  --orte-w:var(--orte-breite);
  position:fixed;left:0;top:0;bottom:0;z-index:22;
  width:var(--orte-w);
  display:flex;flex-direction:column;gap:var(--space-3);
  padding:calc(env(safe-area-inset-top) + var(--space-6)) var(--space-5) 0;
  background:var(--grund);
  /* EINE KANTE, KEINE ZWEITE FARBE.

     Die Leiste und die Buehne liegen auf demselben Grund — ein zweiter
     Grundton daneben waere ein Streifen im Bild (der Grund steht
     ausfuehrlich bei `.saeule`). Ohne jede Trennung standen sie
     allerdings auch nicht als zwei Ebenen da, sondern als eine sehr
     leere Flaeche. Eine Haarlinie sagt genau das Noetige: hier hoert
     das Instrument auf und faengt die Arbeit an. */
  border-right:var(--hairline);
  overflow-y:auto;overscroll-behavior:contain;
}

/* Die Marke und der Klappgriff teilen sich eine Zeile. Eingeklappt hat
   die Zeile keine Breite mehr fuer beides nebeneinander — dann stapeln
   sie sich, das Zeichen oben, der Griff darunter. */
.orte-kopf{flex:none;display:flex;align-items:center;gap:var(--space-2)}
.orte-marke{
  flex:1;min-width:0;
  display:flex;align-items:center;gap:var(--space-4);
  padding:0 var(--space-4);min-height:var(--griff);
  background:none;border:0;color:var(--tinte);cursor:pointer;
}
/* Die 32-px-Marke braucht mehr Luft zum Wort, sonst wirkt sie geklemmt —
   und minimal mehr Laufweite, ruhiger als der enge Standardabstand. */
.orte-marke-wort{font:var(--type-subtitle);letter-spacing:calc(var(--tracking-tight) + .01em);white-space:nowrap}
.orte-marke svg.marke{flex:none}

.orte-klapp{
  flex:none;width:28px;height:28px;display:grid;place-items:center;
  border:0;border-radius:var(--radius-sm);background:none;
  color:var(--tinte-fern);cursor:pointer;
}
.orte-klapp:hover{color:var(--tinte);background:var(--tinte-hauch)}
.orte.ist-schmal .orte-kopf{flex-direction:column;gap:var(--space-2)}
.orte.ist-schmal .orte-marke{flex:none;min-height:auto}
/* Der Pfeil zeigt, wohin es geht: eingeklappt heraus, ausgeklappt hinein. */
.orte.ist-schmal .orte-klapp svg{transform:rotate(180deg)}

.orte-liste{display:flex;flex-direction:column;gap:var(--space-2)}

/* Die Augenbraue vor jeder Gruppe — „Moment" und „Bereiche" ersetzen den
   fruehen `hr.orte-strich`: Gliederung durch Beschriftung, nicht durch
   einen Strich, der nichts erklaert. */
/* Die Augenbraue gehoert zur Gruppe UNTER ihr — sie steht dicht darauf
   und haelt Abstand nach oben. Andersherum klebte sie an der fremden
   Gruppe darueber und schwebte ueber der eigenen. */
.orte-augenbraue{padding:0 var(--space-4);margin:var(--space-6) 0 var(--space-2)}
.orte-augenbraue:first-of-type{margin-top:var(--space-5)}

.orte-zeile{
  display:flex;align-items:center;gap:var(--space-4);
  min-height:var(--griff);padding:0 var(--space-4);
  border:0;border-radius:var(--radius-sm);
  background:none;color:var(--tinte-still);cursor:pointer;
  font:var(--type-body);white-space:nowrap;
  width:100%;
}
/* ---------- Die Ebene unter dem aktiven Ort ----------

   Study und Time haben keine nackte Wurzel; was man dort sieht, ist
   immer ein Segment oder eine Linse. Bis v96 fuehrte der einzige Weg
   dorthin ueber das Chevron der Pfadleiste. Jetzt stehen sie hier —
   eingerueckt, kleiner, mit einem Punkt statt einer Ikone: Sie sind
   eine Ebene tiefer und sollen nicht aussehen wie ein neunter Ort.

   Eingeklappt (`ist-schmal`) verschwinden sie: Dort gibt es nur Ikonen,
   und ein Punkt ohne Wort ist keine Auskunft. */
.orte-unter{display:flex;flex-direction:column;gap:1px;
  margin:var(--space-2) 0 var(--space-3) var(--space-7)}
.orte-unterzeile{
  display:flex;align-items:center;gap:var(--space-4);
  min-height:34px;padding:0 var(--space-4);
  border:0;border-radius:var(--radius-sm);
  background:none;color:var(--tinte-fern);cursor:pointer;
  font:var(--type-small);white-space:nowrap;width:100%;text-align:left}
.orte-unterzeile:hover{color:var(--tinte-still);background:var(--tinte-hauch)}
.orte-unterzeile.ist-aktiv{color:var(--tinte);font:var(--type-small-strong)}
.orte-unterpunkt{width:5px;height:5px;flex:none;border-radius:50%;
  background:currentColor;opacity:.55}
.orte-unterzeile.ist-aktiv .orte-unterpunkt{opacity:1}
.orte.ist-schmal .orte-unter{display:none}

/* `.orte-zeile.ist-moment` stand hier mit `min-height:36px` — die Klasse
   setzt seit dem Umbau auf `.orte-moment-zeile` niemand mehr (Q8). */
.orte-zeile:hover{color:var(--tinte);background:var(--tinte-hauch)}
.orte-zeile svg{flex:none;color:var(--tinte-fern)}
.orte-zeile:hover svg{color:var(--tinte-still)}
.orte-zeile.ist-aktiv{
  color:var(--tinte);font:var(--type-body-strong);
  background:var(--flaeche);box-shadow:var(--neo-ein);
}
.orte-zeile.ist-aktiv svg{color:var(--akzent)}
.orte-wort{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis}
/* Die Zahl rechts sagt, was dort wartet — nie eine Null, nie ein Punkt
   ohne Zahl. Ein Abzeichen ohne Auskunft ist Druck ohne Inhalt. */
.orte-zahl{flex:none;font:var(--type-caption);color:var(--tinte-fern);
  font-variant-numeric:tabular-nums}
.orte-zeile.ist-eng .orte-zahl{color:var(--glut-schrift)}

/* ---------- Moment: die drei Hoehen, oben unter der Marke ----------

   SIE STAND BIS ZUM 26.08.2026 IN DER MITTE (`margin-block:auto`), und
   das war richtig, solange darunter nur ein zugeklappter Griff kam:
   Eine einzelne Gruppe oben an der Marke haette die Leiste kopflastig
   gemacht. Seit die vier Bereiche offen darunter stehen, gilt das
   Gegenteil — eine Navigation liest man von oben nach unten, und was
   in der Mitte anfaengt, hat keinen Anfang.

   DIE PILLE FAEHRT UEBER `--moment-i` (0|1|2), das `ortsleiste()` beim
   Bauen setzt. Vorher stand das in drei `:has(...:nth-child(N))`-Regeln,
   und die brechen still, sobald eine vierte Hoehe dazukommt oder die
   Pille ihren Platz in der Kindfolge wechselt. Eine Regel, die still
   bricht, ist schlimmer als keine (G1). */
/* Dieselbe Grenze wie beim Faecher: Was innen rund ist, darf aussen
   nicht darueber stehen (siehe `.orte-workspace-liste`). */
.orte-moment-container{
  flex:none;
  padding:var(--space-3);
  border-radius:var(--radius-xl);overflow:hidden;
  background:var(--flaeche);
  box-shadow:var(--neo-ein-tief);
}
.orte-moment-liste{position:relative;display:flex;flex-direction:column}
/* ZWEI PIXEL LUFT NACH AUSSEN (26.08.2026).

   Die Pille sass randbuendig am Polster ihrer Mulde (`left:0;right:0`),
   und ihr Relief ist ein ERHABENER Schatten: Der traegt ueber die eigene
   Kante hinaus. Bei vier Pixel Polster stand er damit auf dem Rand des
   Containers und darueber — sichtbar vor allem eingeklappt, wo die Mulde
   nur so breit ist wie ein Griff und jede Unschaerfe zaehlt.

   Der Schatten braucht Platz, nicht die Flaeche. */
.orte-moment-gleitpille{
  position:absolute;left:2px;right:2px;top:0;height:var(--moment-hoehe);
  background:var(--flaeche-hoch);border-radius:var(--radius-lg);
  box-shadow:var(--neo-auf);
  transform:translateY(calc(var(--moment-i,0) * var(--moment-hoehe)));
  z-index:1;pointer-events:none;
}
/* Steht man in einem der vier Bereiche, gehoert die Pille niemandem. Sie
   auf Position 0 stehen zu lassen hiesse: "du bist auf Now" — und das
   waere gelogen. */
.orte-moment-container.ist-fern{opacity:.42}
.orte-moment-container.ist-fern .orte-moment-gleitpille{opacity:0}
.orte-moment-zeile{
  position:relative;z-index:2;
  display:flex;align-items:center;gap:var(--space-4);
  width:100%;height:var(--moment-hoehe);padding:0 var(--space-5);
  border:0;background:transparent;border-radius:var(--radius-lg);
  color:var(--tinte-fern);font:var(--type-small-strong);
  cursor:pointer;text-align:left;
}
.orte-moment-zeile:hover{color:var(--tinte-still)}
/* KEINE Schriftgroesse im aktiven Zustand. `font-size:1.15em` liess die
   Zeile bei jedem Wechsel ihre Breite aendern — ein Layoutsprung mitten
   in einer Bewegung, die Ruhe behaupten soll. Farbe und Gewicht sagen
   dasselbe, ohne etwas zu verschieben. */
.orte-moment-zeile.ist-aktiv{color:var(--tinte);font-weight:700}
.orte-moment-zeile svg{flex:none;color:currentColor}
.orte-moment-zeile.ist-aktiv svg{color:var(--akzent-glueh);transform:scale(1.14)}

/* ---------- Der Boden: Workspace und Fuss ----------

   `margin-top:auto` sitzt am BODEN und nicht mehr am Fuss. Zwei
   Geschwister mit je `auto` teilen sich den freien Raum, statt ihn beide
   nach oben zu schieben — der Workspace waere dann in der Mitte
   gelandet und der Fuss unten, mit einem Loch dazwischen. Ein Container,
   ein `auto`. */
.orte-boden{margin-top:auto;display:flex;flex-direction:column;gap:var(--space-2)}

/* Der Faecher geht nach OBEN auf: Die Liste haengt ueber ihrem Griff
   (`bottom:100%`) statt unter ihm, und weil sie dabei aus dem Fluss
   genommen ist, schiebt sie den Fuss nicht weg. Sie legt sich ueber die
   Momentgruppe — das ist der Sinn eines Faechers: Er nimmt sich den
   Platz, den er braucht, und gibt ihn wieder her. */
.orte-workspace{position:relative}
.orte-workspace-griff{
  list-style:none;                       /* das Dreieck des `<summary>` */
  user-select:none;
}
.orte-workspace-griff::-webkit-details-marker{display:none}
.orte-workspace-griff .ausklapper-pfeil{
  flex:none;display:grid;place-items:center;color:var(--tinte-fern)}
.orte-workspace[open] .orte-workspace-griff{color:var(--tinte);background:var(--tinte-hauch)}

/* `overflow:hidden` UND ein Polster, das breiter ist als die Rundung
   innen (26.08.2026).

   Die gewaehlte Zeile ist eine Mulde mit eigenem Radius, und sie sass in
   einem Kasten mit `--radius-xl`. Zwei verschiedene Rundungen ineinander
   treffen sich an den Ecken nie: Aussen krummt der Kasten frueher, innen
   steht die Mulde noch gerade — und genau dort schaute sie ueber die
   Kante. Der Beschnitt zieht die Grenze da, wo sie hingehoert, und das
   groessere Polster sorgt dafuer, dass er nichts zu tun bekommt. */
.orte-workspace-liste{
  position:absolute;left:0;right:0;bottom:100%;z-index:1;
  margin-bottom:var(--space-2);padding:var(--space-3);
  border-radius:var(--radius-xl);overflow:hidden;
  background:var(--flaeche);box-shadow:var(--neo-auf-tief);
}

/* Profil und Einstellungen — die Bar ganz unten. */
.orte-fuss{display:flex;align-items:center;gap:var(--space-3);
  padding:var(--space-4); border-top: var(--hairline);}
.orte-profil {
  flex: 1; display: flex; align-items: center; gap: var(--space-3);
  background: transparent; border: 0; padding: 0; cursor: pointer;
  text-align: left; min-width: 0;
}
.orte-avatar {
  flex: none; width: 32px; height: 32px; border-radius: 50%;
  background: var(--tinte-hauch-stark); color: var(--tinte);
  display: grid; place-items: center; font: var(--type-caption-strong);
}
.orte-profil-text { flex: 1; min-width: 0; display: flex; flex-direction: column; }
.orte-profil-name { font: var(--type-body-strong); color: var(--tinte); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.orte-profil-email { font: var(--type-small); color: var(--tinte-fern); word-break: break-word; }
.orte-einstellungen-knopf { 
  flex: none; width: var(--griff); height: var(--griff); border-radius: 50%;
  display: grid; place-items: center; background: transparent; border: 0; cursor: pointer; color: var(--tinte); position: relative;
}
.orte-einstellungen-knopf:hover { background: var(--tinte-hauch); }
.orte-fuss-punkt{position:absolute;top:4px;right:4px;width:7px;height:7px;
  border-radius:50%;background:var(--akzent-glueh);pointer-events:none}

/* ---------- Die Kopfleiste ----------
   Die eine dezente Glasflaeche der Chrome-Ebene: sie reagiert auf den
   Bildlauf, nicht der Inhalt. Links die Marke (der Lichtschalter), in
   der Mitte der Pfad, rechts die Suche und die Handgriffe dieser Sicht. */
/* DIE SCHREIBBÜHNE IST BREITER — und die Kopfleiste muss es mitbekommen.
   `.saeule` rechnet `--satz-links` aus `--buehne-max` und `--buehne-rinne`;
   daran richten sich Kopfleiste und Suchband aus. `body.ist-schreiben .buehne`
   sprengt die Bahn aber auf 1760px (`buehnen.css`), ohne diese zwei Variablen
   mitzustellen — bis zum 26.08.2026 stand der Pfad deshalb auf der
   1080er-Rechnung und wirkte „zu weit in der Mitte", während der Editor
   darunter viel weiter links begann.

   Dieselbe Fehlerklasse wurde am selben Tag für alle ANDEREN Bühnen behoben;
   die Schreibbühne war der übersehene Sonderfall. Die Regel steht hier und
   nicht in `buehnen.css`, weil `--satz-links` hier gerechnet wird: Wer die
   Zahl ändert, findet die Ausnahme daneben. */
body.ist-schreiben .saeule{
  --buehne-max: 1760px;
  --buehne-rinne: var(--space-6);
}

/* DER KALENDER IST DER ZWEITE SONDERFALL (07.09.2026).

   Aus demselben Grund und mit derselben Zahl: Auf 1080 px teilen sich eine
   300er-Vorschlagsspalte und sieben Tagesspalten den Platz — rund 110 px je
   Tag, und darin steht von „Prozessoptimierung & Qualitaetsmanagement" das
   erste Wort. Ein Kalender ist keine Textspalte; er hat so viele Spalten,
   wie die Ansicht Tage zeigt, und jede davon traegt Titel.

   Die Begruendung fuer 1760px statt `none` steht eine Regel hoeher und gilt
   hier unveraendert: Darueber muessen die Augen wandern.

   ES STEHT AN `.saeule` UND NICHT AN `.buehne`, weil `--satz-links` hier
   gerechnet wird — sonst blieben Kopfleiste und Suchband auf der
   1080er-Rechnung stehen, waehrend der Kalender darunter weiter links
   beginnt. Genau diese Fehlerklasse hat die Schreibbuehne schon einmal
   gehabt. */
body.ist-kalender .saeule{
  --buehne-max: 1760px;
  --buehne-rinne: var(--space-6);
}

.kopfleiste{
  /* Ueber der Ortsleiste (z-index:22), nicht darunter: Sie ist sticky und
     damit selbst ein Stacking-Context — ihr Suchleisten-Panel (z-index:40
     weiter unten) bleibt sonst darin gefangen und faellt hinter die
     Sidebar zurueck, egal wie hoch sein EIGENER z-index steht. */
  position:sticky;top:0;z-index:23;
  display:flex;align-items:center;gap:var(--space-5);
  min-height:var(--kopf-hoehe);
  padding-block:calc(env(safe-area-inset-top) + var(--space-4)) var(--space-4);
  padding-inline:var(--satz-links) var(--buehne-rinne);
  /* EINE LINKE KANTE, UND ES GIBT KEINE ZWEITE.

     Bis zum 26.08.2026 standen drei uebereinander: Der Pfad lag buendig
     am Rand der Saeule (272 px), das Suchband ebenso mit einer anderen
     Rinne (258 px), und die Buehne war MITTIG in der Saeule gesetzt
     (332 px). Drei Kanten in den obersten 130 Pixeln — auf einem Schirm,
     dessen ganze Ordnung darauf beruht, dass Dinge fluchten.

     Der Grund war nicht Nachlaessigkeit, sondern zwei verschiedene
     Rechnungen: Die Chrome-Ebene mass vom Rand, der Inhalt von der
     Mitte. Jetzt messen beide gleich — dieselbe Hoechstbreite, dieselbe
     Rinne, derselbe Mittelsatz. Wer die Hoechstbreite der Buehne
     aendert, verschiebt Kopf und Suche mit. */
  /* Ganz oben ist die Leiste der Grund und sonst nichts — ein Glas ueber
     dem Nichts ist ein milchiger Streifen ohne Aussage. Erst wenn Inhalt
     unter sie faehrt, legt sie ihr Glas an und zieht eine Kante
     (`html.ist-gerollt`, gesetzt von `app/gesten.js`). Damit sagt die
     Leiste etwas, das sie vorher nicht sagen konnte: dass hier etwas
     DURCHLAEUFT. */
  background:transparent;
  box-shadow:0 1px 0 0 transparent;
}
:root.ist-gerollt .kopfleiste{
  background:var(--glas-grund);
  backdrop-filter:var(--glas-schliff);
  -webkit-backdrop-filter:var(--glas-schliff);
  box-shadow:0 1px 0 0 var(--linie);
}
/* Faehrt der Browser als installierte App mit eigener Titelzone (Window
   Controls Overlay), wird die Kopfleiste selbst diese Zone: Sie darf
   gezogen werden wie ein Fenstertitel, und ihre Hoehe/ihr Rand folgen den
   Massen, die der Browser dafuer meldet. OHNE WCO-Unterstuetzung greift
   diese Regel nie — das heutige Verhalten aendert sich dann nicht (G1). */
@media (display-mode: window-controls-overlay){
  .kopfleiste{
    min-height:env(titlebar-area-height, var(--kopf-hoehe));
    padding-inline-start:max(var(--satz-links), env(titlebar-area-x, 0px));
    padding-inline-end:max(var(--buehne-rinne),
      calc(100vw - env(titlebar-area-x, 0px) - env(titlebar-area-width, 100vw)));
    -webkit-app-region:drag;app-region:drag;
  }
  /* Alles, was man antippen koennte, bleibt antippbar — sonst zieht ein
     Klick auf die Suche das Fenster statt zu fokussieren. */
  .kopf-marke,.kopf-suche,.kopf-griffe,.pfad,.kopf-zurueck{-webkit-app-region:no-drag;app-region:no-drag}
}
.kopf-marke{
  flex:none;display:grid;place-items:center;
  width:var(--griff);height:var(--griff);margin-left:-10px;
  background:none;border:0;color:var(--tinte);cursor:pointer;padding:0;
}
.kopf-griffe{display:flex;align-items:center;gap:var(--space-2);flex:none;margin-left:auto}

/* Der Zurueck-Griff und der Pfad teilen sich die Mitte. Der Griff steht
   VOR dem Pfad, weil er dasselbe meint wie dessen linkes Ende — eine
   Ebene hinaus —, nur ohne dass man das richtige Glied treffen muss. */
.kopf-mitte{display:flex;align-items:center;gap:var(--space-3);min-width:0;flex:1}
.kopf-zurueck{flex:none}
/* DIE SUCHE STEHT NICHT MEHR IN DER KOPFLEISTE (seit 25.08.2026).

   Sie lag dort neben dem Pfad, und in der installierten App mit
   eingeklapptem Browserbalken rutschte sie genau unter ihn: Das Feld war
   da, anklickbar war es nicht. Jetzt traegt sie ein eigenes Band eine
   Zeile tiefer — ausserhalb jeder Zone, die sich ein Browser oder ein
   Fenstertitel nehmen kann.

   Das Band rollt MIT. Zwei sticky Leisten uebereinander sind zwei
   Ordnungen, und die Suche ist keine Ortsangabe: Sie ist ein Werkzeug,
   das man holt, wenn man es braucht. Am schmalen Schirm bleibt sie ein
   Griff im Kopf (`.kopf-suchgriff`), dort ist die Zeile zu teuer. */
.suchband{
  display:flex;align-items:center;gap:var(--space-4);
  padding-block:var(--space-2) var(--space-4);
  padding-inline:var(--satz-links) var(--buehne-rinne);
}
/* Die Taste, die dieses Feld oeffnet — ein Zeichen aus derselben Flaeche,
   in die Mulde gedrueckt. Sie ist kein Knopf: Man tippt sie auf der
   Tastatur, hier steht nur, WELCHE. */
.suchband-taste{
  flex:none;display:grid;place-items:center;
  min-width:24px;height:24px;padding:0 var(--space-3);
  border-radius:var(--radius-xs);
  background:var(--flaeche);box-shadow:var(--neo-ein);
  color:var(--tinte-fern);font:var(--type-small-strong);
  font-family:var(--font-sans);
}
/* Die Suche ist ein Werkzeug, kein Formularfeld: Sie nimmt die Breite,
   die sie zum Lesen eines Treffers braucht, und nicht die ganze Zeile. */
.suchband .suchleiste{flex:0 1 420px;min-width:0}
@media (max-width:719px){ .suchband{display:none} }

/* ---------- Die Pfadleiste ----------
   Sie ist der Rueckweg, der Seitweg und die Ortsangabe in einem. Das
   letzte Glied ist der Ort selbst und kein Knopf — man kann nicht
   dorthin springen, wo man schon steht. */
.pfad{display:flex;align-items:center;min-width:0;flex:1 1 auto}
.pfad-liste{display:flex;align-items:center;gap:var(--space-1);min-width:0;flex-wrap:nowrap}
.pfad-teil{display:flex;align-items:center;gap:var(--space-1);min-width:0}
/* DIE GLIEDER SCHRUMPFEN, SIE BRECHEN NICHT. Eine feste Obergrenze in
   `ch` war zweimal falsch: Bei „2 Grundlagen Elektrolyse" auf 320 px
   ragte das letzte Glied aus dem Bild, und bei kurzen Namen auf 1440 px
   schnitt sie, wo Platz genug war. Jetzt teilt sich die Leiste den
   Raum, den sie hat, und was nicht passt, endet mit Auslassung. */
.pfad-teil{flex:0 1 auto}
.pfad-teil:last-child{flex:1 1 auto;min-width:4ch}
.pfad-glied{
  display:flex;align-items:center;gap:var(--space-2);
  min-height:40px;padding:0 var(--space-3);
  border:0;border-radius:var(--radius-xs);
  background:none;color:var(--tinte-still);cursor:pointer;
  font:var(--type-small);white-space:nowrap;
  flex:0 1 auto;min-width:0;overflow:hidden;
}
.pfad-glied>span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.pfad-glied:hover{color:var(--tinte);background:var(--tinte-hauch)}
/* Das letzte Glied: der Ort, an dem man ist. Kraeftiger, kein Knopf. */
.pfad-glied.ist-hier{color:var(--tinte);font:var(--type-subtitle);cursor:default}
.pfad-glied.ist-hier:hover{background:none}
.pfad-trenner{flex:none;color:var(--tinte-fern);padding-inline:1px}
/* Das Chevron oeffnet die Geschwister dieser Ebene — der Sprung zur
   Seite, ohne den Umweg ueber die Elternliste. */
/* 40 px hoch, wie jedes Ziel dieser App (`probe/waechter.mjs` §2). Bei
   26 x 26 war es die kleinste Trefferflaeche der Schale — und die eine,
   die man am Handy mit dem Daumen trifft oder eben nicht. Die
   ZEICHNUNG bleibt 13 px: Die Flaeche ist fuer den Finger, das Glyph
   fuer das Auge (Kodex Z2). */
.pfad-chevron{
  flex:none;display:grid;place-items:center;
  width:28px;height:40px;padding:0;
  border:0;border-radius:var(--radius-xs);
  background:none;color:var(--tinte-fern);cursor:pointer;
}
.pfad-chevron:hover{color:var(--tinte);background:var(--tinte-hauch)}
.pfad-chevron[aria-expanded="true"]{color:var(--tinte);background:var(--flaeche);box-shadow:var(--neo-ein)}
/* Die Drehung hing an `.pfad-teil.ist-offen` — eine Klasse, die niemand
   setzt (Q8). Sie haengt jetzt an demselben Zustand wie die Zeile
   darueber, und damit dreht der Chevron sich wirklich. */
.pfad-chevron[aria-expanded="true"] svg{transform:rotate(180deg)}
/* Die Meta-Zeile rechts vom Pfad — Datum, Zaehler, Stand. Sie faellt
   als Erstes weg, wenn der Platz knapp wird. */
.pfad-meta{flex:none;font:var(--type-caption);color:var(--tinte-fern);
  white-space:nowrap;padding-left:var(--space-3)}

/* ---------- Die Uhrleiste ---------- */
.uhrleiste{
  position:fixed;left:50%;transform:translateX(-50%);
  bottom:calc(var(--space-5) + env(safe-area-inset-bottom));z-index:19;
  display:flex;align-items:center;gap:var(--space-4);
  max-width:min(420px,calc(100vw - 88px));
  padding:var(--space-4) var(--space-6);
  background:var(--flaeche-hoch);
  border:0;border-radius:var(--radius-pill);
  box-shadow:var(--neo-auf-tief);color:var(--tinte);cursor:pointer;font:var(--type-subtitle);
}
.uhrleiste[hidden]{display:none}
.uhrleiste-punkt{width:8px;height:8px;border-radius:50%;flex:none;background:var(--tinte-fern)}
.uhrleiste-punkt.ist-aktiv{background:var(--moos)}
.uhrleiste-ziel{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
  font:var(--type-small);color:var(--tinte-still)}
.uhrleiste-zeit{font:var(--type-metric-sm);font-variant-numeric:tabular-nums;flex:none}

/* ---------- Das Band einer neuen Fassung ---------- */
.fassungsband{
  position:fixed;top:0;left:0;right:0;z-index:70;
  display:flex;align-items:center;gap:var(--space-4);
  padding:var(--space-4) var(--gutter-screen);
  background:var(--flaeche-hoch);box-shadow:var(--neo-auf);
  font:var(--type-small);color:var(--tinte);
}
.fassungsband-text{flex:1;min-width:0}

/* ============================================================
   10 · DIE BLENDE

   Vier Boegen auf einem gedachten Kreis. Sie ist die Marke UND der
   Fokusrahmen — dieselbe Form, zwei Aufgaben. Es gibt genau EINEN
   Rahmen im Dokument; er sucht sich `[data-blende]` und sitzt darauf.
   Wird alles gerahmt, ist nichts gerahmt.

   Der Strich traegt den wandernden Chromverlauf `#lmc`, den
   `js/ds/effekte.js` einmal je Dokument als SVG-Verlauf anlegt. Fehlt
   er, faellt der Strich auf stilles Silber zurueck — nie auf nichts.
   ============================================================ */

.marke{color:var(--tinte)}
.blende-rahmen{position:absolute;top:0;left:0;width:0;height:0;
  pointer-events:none;z-index:24;opacity:0}
.blende-rahmen.ist-da{opacity:1}
/* VIER STRICHE, KEINE VIER KAESTEN.

   Hier stand bis zum 26.08.2026 der Maskenweg: jeder Bogen ein Kasten mit
   `border` auf zwei Seiten, dem Verlauf als `background` auf der
   border-box, und zwei Masken, die die Fuellung per `mask-composite`
   wieder herausrechneten. Er hatte eine Sollbruchstelle, und sie ist
   gebrochen: `-webkit-mask-composite:xor` stand VOR der Kurzform `mask:`,
   und eine Kurzform setzt ihre Longhands zurueck. Wo die Engine
   `mask-composite` nicht kennt, blieb `add` stehen — Vereinigung statt
   Ausschluss, also der ganze Kasten. Das Quadrat mit der einen runden
   Ecke, das an der Blende klebte, war die Fuellung, die niemand mehr
   wegnahm.

   Derselbe Kommentar verwarf einmal den Chrom-Schimmer mit dem Argument,
   „eine Ringmaske faerbt zwangslaeufig alle vier [Seiten]". Das galt fuer
   Kaesten. Ein Pfad hat keine vier Seiten: Er ist gezeichnet, wo er
   gezeichnet ist. Form, Radius und Strichbreite rechnet jetzt
   `ds/blende.js`; hier bleibt nur, wo sie liegen. */
.blende-bogen{position:absolute;top:0;left:0;overflow:visible}

/* Der WebGL-Ring von `vendor/metallrand.js`. Er liegt UNTER dem Knopf
   und ragt genau `--ring` weit heraus; die Mitte ist gestanzt. */
.metallrand{position:absolute;inset:0;width:100%;height:100%;
  pointer-events:none;border-radius:inherit;z-index:0}

/* ============================================================
   11 · DIE BREITEN

   Laptop zuerst — das ist seit v34 die Grundannahme und nicht mehr die
   Ausnahme. Die schmalen Breiten sind der Rueckbau, nicht der Aufbau.
   ============================================================ */

/* ---- Die eingeklappte Leiste ----
   Dieselbe Gestalt, die der Media-Query darunter fuer mittlere Fenster
   herstellt — nur auf Ansage statt auf Breite. Die Woerter werden NICHT
   ausgeblendet, sondern vom `overflow` der schrumpfenden Leiste
   abgeschnitten: `display` laesst sich nicht animieren, eine Breite
   schon. Was uebrig bleibt, ist das Zeichen. */
.orte.ist-schmal{--orte-w:var(--orte-schmal);padding-inline:var(--space-2);align-items:center;
  overflow-x:hidden}
/* DIE WOERTER GEHEN AUS DEM FLUSS, NICHT NUR AUF DURCHSICHTIG.

   Mit `opacity:0` allein standen sie unsichtbar weiter im Layout — und
   das kostete am 26.08.2026 ausgerechnet die Marke: `justify-content:
   center` zentrierte Zeichen UND Wort in einem Kasten, der viel breiter
   war als die 44 px der schmalen Leiste, also rutschte das Zeichen nach
   links aus dem Bild. Uebrig blieb ein Chevron ueber einer leeren Spalte.

   `max-width` ist der Weg, den das Haus dafuer schon kennt
   (`.werkzeug-wort`, `motion.css`): Er nimmt den Platz WEG und laesst sich
   trotzdem fahren — anders als `display:none`.

   ZWEI SCHALTER, EIN REGELSATZ. `--wort-max` und `--wort-hin` kippen an
   genau zwei Stellen: hier am Griff und im Media-Query fuer mittlere
   Fenster (Block 11). Die Regeln selbst stehen einmal — sonst haette der
   Griff eine Gestalt und die Fensterbreite eine zweite, und die zweite
   waere die, die beim naechsten Mal vergessen wird (G3). */
.orte{--wort-max:none;--wort-hin:1;--fuss-richtung:row}
.orte.ist-schmal{--wort-max:0px;--wort-hin:0;--fuss-richtung:column}
.orte-wort,.orte-zahl,.orte-marke-wort,.ausklapper-pfeil{
  max-width:var(--wort-max);opacity:var(--wort-hin);
  overflow:hidden;white-space:nowrap}
.orte-augenbraue{max-height:var(--wort-max);opacity:var(--wort-hin);overflow:hidden}
.orte:where(.ist-schmal) .orte-zeile,
.orte:where(.ist-schmal) .orte-moment-zeile,
.orte:where(.ist-schmal) .orte-marke{
  justify-content:center;padding:0;width:var(--griff);gap:0}
.orte:where(.ist-schmal) .orte-fuss{
  flex-direction:column;gap:var(--space-2);padding:var(--space-2) 0}
.orte:where(.ist-schmal) .orte-profil-text{display:none}
/* EINGEKLAPPT FAECHERT ER IKONEN AUF, NICHT NAMEN.

   Er tat hier bis zum 26.08.2026 das Gegenteil: Er setzte `--wort-max`
   zurueck und legte sich in voller Leistenbreite neben die schmale
   Spalte. Das war als Hilfe gedacht („vier Ikonen ohne Namen") und war
   ein Bruch: Wer die Leiste einklappt, hat gesagt, dass ihm Ikonen
   genuegen — dann darf ein Faecher daraus nicht wieder eine Wortliste
   machen. Die Namen stehen im `title` und im `aria-label`, wie ueberall
   sonst in der schmalen Leiste auch. */
.orte:where(.ist-schmal) .orte-workspace-liste{
  left:50%;translate:-50% 0;width:max-content;min-width:0}

/* Ab hier steht die Ortsleiste mit Worten. */
@media (min-width:1100px){
  .huelle{padding-left:var(--orte-breite)}
  /* Die Buehne folgt dem Griff: Was die Leiste an Breite abgibt, nimmt
     der Inhalt. `:has()` liest den Zustand dort, wo er steht — am
     Element selbst —, statt ihn ein zweites Mal an den Body zu haengen. */
  body:has(.orte.ist-schmal) .huelle{padding-left:var(--orte-schmal)}
  /* Uhrleiste und Toast wandern in die rechte Ecke: In der Mitte
     unten liegen sie ueber dem Inhalt, an dem man gerade arbeitet. */
  .uhrleiste{left:auto;right:var(--space-9);transform:none;bottom:var(--space-8)}
  .toast-host{left:auto;right:var(--space-9);transform:none;bottom:var(--space-8)}
  /* Zwei Marken waeren eine zu viel: Am Laptop steht sie in der
     Ortsleiste, mit dem Namen daneben. */
  .kopf-marke{display:none}
  .saeule{--buehne-max:1080px;--buehne-rinne:var(--space-9)}
}

/* Dazwischen: dieselbe Leiste, nur Ikonen. Die Worte stehen im `title`
   und im `aria-label` — sichtbar bleibt, wo man ist. */
@media (min-width:720px) and (max-width:1099px){
  .huelle{padding-left:var(--orte-schmal)}
  .kopf-marke{display:none}
  /* Der Griff hat hier nichts zu entscheiden: Die Breite entscheidet.
     Umgelegt werden nur die Schalter — alle Regeln dazu stehen bei
     `.orte.ist-schmal` (Block 10), und sie treffen ueber `:where()` auch
     diesen Fall, weil er dieselbe Gestalt meint. */
  .orte{--orte-w:var(--orte-schmal);--wort-max:0px;--wort-hin:0;
    padding-inline:var(--space-2);align-items:center;overflow-x:hidden}
  .orte-zeile,.orte-moment-zeile,.orte-marke{
    justify-content:center;padding:0;width:var(--griff);gap:0}
  .orte-marke{flex:none;min-height:auto}
  .orte-fuss{flex-direction:column;gap:var(--space-2);padding:var(--space-2) 0}
  .orte-profil-text{display:none}
  /* Kein Griff: Hier entscheidet das Fenster, und ein Knopf, der die
     Entscheidung nicht aendern kann, ist eine Attrappe (G1). */
  .orte-klapp{display:none}
  /* Auch hier Ikonen statt Namen — dieselbe Begruendung wie beim Griff
     (Block 10): Eine schmale Leiste bleibt schmal, auch wenn sie
     auffaechert. */
  .orte-workspace-liste{left:50%;translate:-50% 0;width:max-content;min-width:0}
  /* Zu schmal fuer die Reihe aus Block D — Profil und Einstellungen
     stapeln sich, bleiben aber beide ein eigener Griff. */
  .orte-fuss{flex-direction:column;gap:var(--space-2);padding:var(--space-2) 0}
  .orte-profil-text{display:none}
  .saeule{--buehne-max:920px;--buehne-rinne:var(--space-8)}
}

/* Unter 720 px wird aus der Spalte eine Chipreihe unter der Kopfleiste.
   Sie ist die EINZIGE Stelle der App, an der waagerecht gescrollt wird —
   und sie darf es, weil eine Chipreihe genau dafuer gebaut ist. */
@media (max-width:719px){
  .orte{
    position:sticky;top:var(--kopf-hoehe);left:auto;bottom:auto;
    width:auto;flex-direction:row;align-items:center;gap:var(--space-3);
    padding:var(--space-3) var(--gutter-screen);
    overflow-x:auto;overflow-y:hidden;
    scrollbar-width:none;
  }
  .orte::-webkit-scrollbar{display:none}
  .orte-marke,.orte-augenbraue,.orte-moment-gleitpille{display:none}
  .orte-moment-container{position:relative;top:auto;transform:none;
    padding:0;margin:0;flex:none;background:none;box-shadow:none}
  .orte-moment-liste,.orte-liste{flex-direction:row;gap:var(--space-3);padding:0}
  
  .orte-moment-zeile, .orte-zeile{
    min-height:36px; height: 36px; padding:0 var(--space-5); border-radius:var(--radius-pill);
    background:var(--flaeche);box-shadow:var(--neo-auf);font:var(--type-small);
  }
  .orte-moment-zeile.ist-aktiv, .orte-zeile.ist-aktiv{box-shadow:var(--neo-ein);font:var(--type-small-strong); color: var(--tinte); font-size: var(--type-small-strong); }
  .orte-moment-zeile svg, .orte-zeile svg{display:none}
  /* Am schmalsten Schirm ist die Ortsleiste eine Chipreihe — die
     Untereintraege reihen sich ein statt eine zweite Zeile zu oeffnen. */
  .orte-unter{flex-direction:row;gap:var(--space-3);margin:0}
  .orte-unterzeile{width:auto;min-height:32px;height:32px;
    padding:0 var(--space-4);border-radius:var(--radius-pill);
    background:var(--flaeche);box-shadow:var(--neo-auf)}
  
  /* Profil und Einstellungen bleiben Teil der Chipreihe statt zu
     verschwinden — sonst waeren sie auf dem schmalsten Schirm gar nicht
     mehr zu erreichen (nur Taste 8 fuer Einstellungen, kein Griff). */
  .orte-fuss{flex:none;margin:0;padding:0 0 0 var(--space-2); border: 0; gap: var(--space-3)}
  .orte-profil-text, .orte-profil-name, .orte-profil-email { display: none; }
  .saeule{--buehne-max:640px;--buehne-rinne:var(--gutter-screen)}
  .pfad-meta{display:none}
  /* Der Pfad rollt, statt zu kuerzen — siehe `ds/navigation.js`. Er ist
     neben der Ortsleiste die zweite und letzte Stelle der App, an der
     waagerecht gerollt wird, und aus demselben Grund: Beide sind
     Navigation, und eine Navigation darf nichts weglassen. */
  .pfad{overflow-x:auto;scrollbar-width:none;overscroll-behavior-x:contain;
    /* Der Verlauf am linken Rand sagt, dass links noch etwas liegt.
       Ohne ihn sah das angeschnittene erste Wort aus wie ein Fehler
       und nicht wie eine Leiste, die weiterrollt. */
    mask-image:linear-gradient(to right,transparent 0,currentColor 14px)}
  .pfad::-webkit-scrollbar{display:none}
  .pfad-teil{flex:none}
  .pfad-teil:last-child{flex:none}
  /* Kein Platz fuer beides: Die Suche wird ein Griff, und der oeffnet
     sie als Sheet. Ein Feld von 40 px Breite ist keine Suche. */
  .kopf-suche{display:none}
}
@media (min-width:720px){
  .kopf-suchgriff{display:none}
}

/* Ist niemand angemeldet, traegt der Fuss nur den Weg zu den
   Einstellungen — und der ist dann eine Zeile wie die acht darueber,
   nicht ein Zahnrad, das rechts allein steht. */
.orte-fuss.ist-leer{padding:var(--space-2) 0 var(--space-4)}
.orte-einstellungen-zeile{color:var(--tinte-fern)}
