/* ==========================================================================
   FÖRDERBUCH – Anwendungsgerüst (Seitenleiste, Kopf, Bauteile)
   --------------------------------------------------------------------------
   WIE ES FUNKTIONIERT: index.css bringt die WERTE mit (§1–§3), diese Datei
   benutzt sie. Hier steht KEIN einziger Farbwert – wer einen braucht, legt
   ihn dort an. `qa/unit/test_design_system.py` prüft das für beide Dateien.

   DIE DREI ENTSCHEIDUNGEN, DIE DAS GERÜST TRAGEN
   ----------------------------------------------
   1. SEITENLEISTE STATT REITER. Die Bereiche eines Projekts heißen
      „Bescheid und Pflichten", „Berichte und Verwendungsnachweis",
      „Budget und Mittelabrufe". Neun solche Namen nebeneinander ergeben eine
      Reiterleiste, die umbricht oder waagerecht scrollt – beides schlecht zu
      treffen und schlecht zu lesen. Senkrecht haben sie Platz.

   2. DIE LEISTE WECHSELT NICHT DEN INHALT, SIE ERGÄNZT IHN. Öffnet man ein
      Projekt, erscheinen dessen Bereiche EINGERÜCKT unter dem Projektnamen;
      die Ebene darüber (Übersicht, Projekte, Fristen, Team) bleibt sichtbar.
      Der übliche Weg – die Leiste tauscht ihren Inhalt gegen den
      Projektkontext – spart Platz und kostet Orientierung. Unsere Nutzer
      sind ehrenamtliche Vorstände und Buchhaltungen in Teilzeit, die alle
      paar Wochen hereinschauen. Für sie darf beim Klicken nichts
      VERSCHWINDEN, nur dazukommen.

   3. DIE LEISTE TRÄGT DAS MARKENGRÜN. Es ist die einzige große farbige
      Fläche der Anwendung. Der Arbeitsbereich daneben bleibt Papier mit
      1px-Linien, damit Zahlenkolonnen ruhig bleiben. Farbe im Inhalt
      bedeutet etwas (Ampel), Farbe in der Leiste ist die Marke.
      Zuerst war die Leiste blau. Als ganze Spalte macht das Markenblau die
      Oberfläche schwer – sie liest sich wie Verwaltungssoftware aus dem
      Rechenzentrum. Grün ist derselbe Ernst, aber freundlich; Blau bleibt,
      wo es hingehört: in der SCHRIFT.

   VERBUNDEN MIT: static/css/index.css (Werte), docs/DESIGN_SYSTEM.md,
   templates/anwendung/ (Hülle und Seiten), qa/unit/test_design_system.py
   ========================================================================== */

/* ===== §1 GERÜST ========================================================= */
/* 280px, nicht 240: „Bescheid und Pflichten" und „Berichte und Nachweis"
   brechen darunter zusammen mit ihrem Zähler um. Die Breite folgt hier den
   längsten echten Begriffen, nicht einem runden Wert. */
.app {
  display: grid;
  grid-template-columns: 280px 1fr;
  height: 100vh;
  overflow: hidden;
  /* Bezugsrahmen fuer den Falt-Griff, der auf der Trennlinie sitzt (§3a). */
  position: relative;
}

/* NICHT `position: sticky`. Erster Versuch war genau das, und beim Scrollen
   wanderte die Leiste mit nach unten: Ein Rasterfeld wird standardmäßig auf
   die Zeilenhöhe gedehnt, damit hat ein klebendes Element keinen Bereich, in
   dem es kleben könnte. Statt das mit `align-self` zu flicken, scrollt hier
   nur der Arbeitsbereich – die übliche Bauform einer Anwendungshülle, und
   die einzige, bei der die Navigation garantiert stehen bleibt. */
.leiste {
  background: var(--leiste);
  color: var(--leiste-text);
  display: flex;
  flex-direction: column;
  gap: var(--a4);
  /* UNTEN KEIN AUSLAUF (Vorgabe Murat, 08.09.2026: „aşağıda bir karış
     boşluk var, aşağıya daya"). Der Fuss traegt seinen eigenen kleinen
     Abstand; die 24 Punkte hier kamen NOCH DAZU und liessen den Block
     ueber dem unteren Rand schweben. Oben bleiben sie: Dort steht die
     Wortmarke, und die braucht Luft. */
  padding: var(--a5) var(--a3) var(--a2);
  overflow-y: auto;
}

/* Die Wortmarke steht mittig über der Navigation. Linksbündig sass sie
   optisch schief: Die Einträge darunter haben links ihr Symbol und damit
   eine andere Kante als das „F". Mittig gibt es diesen Vergleich nicht.

   DREI SPALTEN STATT `justify-content: center` (v1.3.0): Rechts steht jetzt
   der Griff zum Einklappen (§3a). In einem zentrierten Flex-Kasten schöbe er
   die Marke nach links, und zwar genau um seine halbe Breite – die Marke sässe
   also wieder schief, nur diesmal andersherum. `1fr auto 1fr` hält sie in der
   Mitte der LEISTE, unabhängig davon, was rechts daneben steht. */
.leiste__marke {
  display: grid;
  grid-template-columns: 1fr auto 1fr;
  align-items: center;
  padding: var(--a2) var(--a2) var(--a3);
}

.leiste__markenverweis { grid-column: 2; display: block; }

.leiste__wortmarke { display: block; height: 24px; width: auto; }

.leiste__orga {
  padding: 0 var(--a3) var(--a2);
  margin-top: calc(var(--a3) * -1);
  color: var(--leiste-leise);
  font-size: var(--s-klein);
  font-weight: 600;
  text-align: center;
  overflow-wrap: anywhere;
}

/* ---------------------------------------------------------------------
   DIE EIGENE STELLUNG – unter dem Vereinsnamen (v0.53.0)
   ---------------------------------------------------------------------
   BEFUND MURAT, 15.08.2026: Er sah zwei Reiter statt sechs und konnte
   nirgends ablesen, ob das eine Sperre, ein Fehler oder Absicht ist.

   ALS MARKE UND NICHT ALS ZEILE: Auf dem grünen Grund verschwindet ein
   weiterer Text in Grau zwischen Vereinsname und Navigation. Ein
   abgesetztes Feld liest man als das, was es ist – eine Auszeichnung.

   FARBE UND WORT, nie Farbe allein (DESIGN_SYSTEM §3.2): Der Betreiber ist
   hell hervorgehoben, die übrigen Stufen bleiben ruhig. Wer die Farbe nicht
   unterscheiden kann, liest weiterhin „Betreiber · Vollzugriff". */
.leiste__stellung {
  align-self: center;
  margin: 0 var(--a3) var(--a4);
  padding: 2px var(--a3);
  border: 1px solid var(--leiste-linie);
  border-radius: var(--ecke-rund);
  color: var(--leiste-leise);
  font-size: var(--s-klein);
  font-weight: 600;
  text-align: center;
  overflow-wrap: anywhere;
}

/* Der Betreiber hebt sich ab – er ist die einzige Stufe ÜBER dem Verein. */
/* Das Schild ist für den Betreiber ein GRIFF (v0.97.2). Es sieht aus wie
   vorher – es reagiert nur, weil dahinter jetzt eine Seite liegt. Vorgabe
   Murat, 22.08.2026: „üstte superadmin vollzugriff kismi var ya oraya
   basinca gireyim." Ohne diese Zeilen wäre es ein Verweis mit
   Unterstreichung und Verweisfarbe – also ein anderes Bauteil, obwohl es
   dasselbe Schild bleiben soll. */
.leiste__stellung--griff {
  display: block;
  text-decoration: none;
  cursor: pointer;
}
/* Hover und „hier bin ich" sehen aus wie bei jedem Eintrag der Leiste
   (`.navi a:hover`). Zwei verschiedene Arten, dasselbe zu sagen, wären
   eine zu viel. */
.leiste__stellung--griff:hover,
.leiste__stellung--griff[aria-current="page"] {
  background: var(--leiste-flaeche);
  color: var(--leiste-aktiv);
  border-color: var(--leiste-aktiv);
}

.leiste__stellung--betreiber {
  border-color: var(--leiste-aktiv);
  background: var(--leiste-flaeche);
  color: var(--leiste-aktiv);
}

/* Ohne Zugang ist kein Zustand, den man übersieht: Wer das liest, kommt
   gerade nirgends hinein und muss erfahren, dass das der Grund ist. */
.leiste__stellung--ohne {
  border-color: var(--leiste-gefahr);
  color: var(--leiste-gefahr);
}

.arbeit {
  min-width: 0;               /* ohne das sprengen breite Tabellen das Raster */
  display: flex;
  flex-direction: column;
  overflow-y: auto;           /* hier wird gescrollt, nicht auf der Seite */
  /* DIESE EINE ZEILE HÄLT DIE NAVIGATION STEHEN – sie sieht nach nichts aus
     und ist der ganze Unterschied. `overflow-y: auto` schneidet nur ab, was
     SEIN Bezugsrahmen ist. Ein Element mit `position: absolute` OHNE
     positionierten Vorfahren bezieht sich auf die Seite selbst; der
     Arbeitsbereich schneidet es dann nicht ab, und es verlängert
     stattdessen die SEITE. Genau das ist am 13.08.2026 passiert: Die
     vorlesbare Beschriftung „Zeilen je Seite" (v0.20.0, `.nur-vorlesen`)
     steht unten am Blätterwerk, ist mit `position: absolute` aus dem Bild
     geschoben – und machte das Dokument 3182px hoch. Gescrollt wurde
     danach die ganze Seite, also wanderte die Leiste mit nach oben.
     GEMESSEN: vorher `documentElement.scrollHeight` 3182 bei 900px Schirm,
     nachher 900. Mit `position: relative` wird der Arbeitsbereich zum
     Bezugsrahmen, und was in ihm liegt, bleibt in ihm. */
  position: relative;
}

/* ===== §2 ORGANISATIONSWECHSLER ==========================================
   Erscheint NUR, wenn jemand zu mehreren Organisationen gehört – Berater,
   Dachverbände. Ein Wechsler mit genau einem Eintrag ist ein Bedienelement,
   das nichts tut, und Nutzer suchen dahinter trotzdem eine Funktion. */
/* Zweizeilig: Name oben, Hinweis darunter. `display:flex` mit
   `align-items:center` setzt Textknoten und <small> NEBENeinander – der Name
   bricht dann um und der Hinweis rutscht daneben. */
.orgwechsler {
  display: block;
  width: 100%;
  padding: var(--a2) var(--a3);
  background: var(--leiste-flaeche);
  border: 1px solid var(--leiste-linie);
  border-radius: var(--ecke-klein);
  color: var(--leiste-aktiv);
  font: inherit;
  font-weight: 600;
  text-align: left;
  cursor: pointer;
}

.orgwechsler small {
  display: block;
  font-weight: 400;
  color: var(--leiste-leise);
}

/* ===== §2a SYMBOLE =======================================================
   Eingebettet über helfer.symbol(), Strichstärke von Lucide, Farbe = Textfarbe
   (`currentColor`). Deshalb braucht kein Ort eine eigene Symbolfarbe.
   Die Grösse folgt der Schrift (`em`), nicht einer festen Pixelzahl: In einer
   kleineren Zeile wird das Symbol mit kleiner, ohne dass es jemand pflegen
   muss. */
.sym {
  width: 1.15em;
  height: 1.15em;
  flex: none;
  vertical-align: -.18em;
}

.sym--gross { width: 2.2rem; height: 2.2rem; stroke-width: 1.5; }

/* ===== §3 NAVIGATION ===================================================== */
.navi { display: flex; flex-direction: column; gap: 2px; }

.navi__titel {
  padding: var(--a3) var(--a3) var(--a1);
  font-size: var(--s-klein);
  font-weight: 600;
  letter-spacing: .06em;
  text-transform: uppercase;
  color: var(--leiste-leise);
}

.navi a,
.navi__knopf {
  display: flex;
  align-items: center;
  gap: var(--a3);
  padding: var(--a2) var(--a3);
  border-radius: var(--ecke-klein);
  color: var(--leiste-text);
  text-decoration: none;
  font-size: var(--s-hinweis);
}

.navi a:hover,
.navi__knopf:hover { background: var(--leiste-flaeche); color: var(--leiste-aktiv); }

.navi a[aria-current="page"] {
  background: var(--leiste-flaeche);
  color: var(--leiste-aktiv);
  font-weight: 600;
}

/* Zähler am rechten Rand – die Zahl, die sagt "hier ist etwas offen". */
.navi .zaehler,
.navi__zahl {
  margin-left: auto;
  min-width: 1.4rem;
  padding: 0 .35rem;
  border-radius: var(--ecke-rund);
  background: var(--schlecht);
  color: var(--leiste-aktiv);
  font-size: var(--s-klein);
  font-weight: 600;
  text-align: center;
}

.navi .zaehler--warnung { background: var(--warnung); }

/* Die Bereiche des geöffneten Projekts. Die Linie links ist keine Zierde:
   sie zeigt, dass diese Einträge zu dem Projekt darüber gehören. */
.navi__projekt {
  margin: var(--a1) 0 var(--a2) var(--a4);
  padding-left: var(--a3);
  border-left: 2px solid var(--leiste-linie);
  display: flex;
  flex-direction: column;
  gap: 2px;
}

.navi__projekt a { font-size: var(--s-klein); padding: .3rem var(--a3); }

.leiste__trenner {
  height: 1px;
  background: var(--leiste-linie);
  margin: var(--a2) var(--a3);
}

/* DER FUSS SITZT GANZ UNTEN und wird dorthin geschoben, nicht dorthin
   gerechnet: `margin-top: auto` in einer Spalte drückt alles, was folgt, an
   den unteren Rand – unabhängig davon, wie viele Einträge darüber stehen.

   VORGABE MURAT, 15.08.2026: „o profil kismini asagi kaydir, daha çok
   versiyonu tam en alta yapistir." Die Versionsnummer klebt deshalb ohne
   eigenen Abstand am unteren Rand; sie ist der Deploy-Beweis und kein
   Gestaltungselement. */
.leiste__fuss { margin-top: auto; padding-bottom: 0; }

/* Kontakt steht ohne Gruppenüberschrift direkt über dem Profil. Eine
   Überschrift für EINEN Eintrag ist ein Wort ohne Aufgabe. */
.navi--fuss { margin-bottom: var(--a2); }

.leiste__profil {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  align-items: center;
  gap: var(--a2);
  padding: var(--a2) var(--a3);
}

.leiste__profilverweis {
  min-width: 0;
  display: grid;
  grid-template-columns: auto minmax(0, 1fr);
  align-items: center;
  gap: var(--a2);
  color: inherit;
  text-decoration: none;
}

.leiste__profilverweis:hover .leiste__person,
.leiste__profilverweis[aria-current="page"] .leiste__person { color: var(--grund); }

.leiste__profilbild {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 2rem;
  height: 2rem;
  border: 1px solid var(--leiste-linie);
  border-radius: var(--ecke-rund);
  color: var(--leiste-text);
  object-fit: cover;
}

.leiste__person {
  min-width: 0;
  color: var(--leiste-text);
  font-size: var(--s-hinweis);
  font-weight: 600;
  overflow-wrap: anywhere;
}

.leiste__person small {
  display: block;
  font-weight: 400;
  color: var(--leiste-leise);
  overflow-wrap: anywhere;
}

/* Abmelden ist ein Knopf in einem Formular (POST) und sitzt als roter Ausgang
   direkt am Profil. Ein <a> waere von aussen auslösbar und meldete Leute
   ungefragt ab. */
.leiste__abmelden {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: var(--bedienhoehe);
  height: var(--bedienhoehe);
  padding: 0;
  border: 1px solid transparent;
  border-radius: var(--ecke-klein);
  background: none;
  font: inherit;
  color: var(--leiste-gefahr);
  cursor: pointer;
}

.leiste__abmelden:hover {
  border-color: var(--leiste-gefahr);
  background: var(--schlecht-hell);
  color: var(--schlecht);
}

/* DIE VERSIONSNUMMER IST DER DEPLOY-BEWEIS UND SONST NICHTS.
   Sie muss LESBAR sein, wenn man sie sucht, und darf in keiner Sekunde davor
   Aufmerksamkeit kosten. Deshalb: die kleinste Schrift der Anwendung, die
   leiseste Farbe, und ein Abstand nach oben, der sie deutlich unter das
   Abmelden setzt statt direkt daran (Vorgabe Murat, 12.08.2026). Sie steht
   damit ganz unten in der Leiste – dem Ort, an dem man sie sucht. */
.leiste__version {
  margin-top: var(--a3);
  padding: 0 var(--a3);
  color: var(--leiste-leise);
  font-size: .68rem;
  letter-spacing: .02em;
  opacity: .75;
  font-variant-numeric: tabular-nums;
}

/* ===== §3a DIE SCHMALE LEISTE ===========================================
   VORGABE MURAT, 01.09.2026: „sol taraftaki nav kismi var ya orayi acili
   kapanir yapalim. yukarda ok olsun sag sol olsun. förderbuch logosu
   daralinca ikon kullanalim fb ikonu. menülerde büyükce olsun altinda kücük
   yazssin. yere ihtiyacimiz var."

   WAS HIER PASSIERT: Ein Griff oben in der Markenzeile setzt am
   <html>-Element die Klasse `leiste-schmal` (leiste.js). Diese Klasse ist der
   einzige Schalter; alles Weitere steht in diesem Abschnitt. 280 Punkte
   werden zu 96 – das sind 184 Punkte mehr für die Arbeitsfläche, auf einem
   1440er Schirm knapp ein Achtel der Breite. Auf einer Excel-Liste mit neun
   Spalten (§8b) ist das der Unterschied zwischen „passt" und „rollt".

   DIE EINTRÄGE VERLIEREN IHR WORT NICHT, sie stellen es um: Symbol gross
   oben, Wort klein darunter. Das ist der Kern der Vorgabe und keine
   Geschmacksfrage. Eine Leiste aus reinen Symbolen – wie sie viele
   Anwendungen an dieser Stelle bauen – verlangt, dass man neunzehn Bildchen
   auswendig kennt oder auf jedes einzeln zeigt und wartet. „Fristen" und
   „Förderprojekte" sind beides Ordner-Sinnbilder; welches welches ist, sagt
   nur das Wort. Ein Kurzhinweis am Mauszeiger hilft ausserdem an keinem
   Tastaturplatz und auf keinem Tastbildschirm.

   DAS SYMBOL WÄCHST IN `rem` UND NICHT IN `em` (§2a rechnet in `em`, damit
   Symbole der Schrift folgen). Hier ist das genau falsch herum gewollt: Die
   Schrift wird KLEINER, das Symbol GRÖSSER. In `em` würde das Symbol mit dem
   Wort zusammen schrumpfen – dann wäre der Eintrag nur klein statt anders.

   DIE MASSE GEHÖREN ZUSAMMEN: 6rem Spaltenbreite, davon 2×.25rem Polsterung
   der Leiste und 2×2px am Eintrag, bleiben rund 80 Punkte für das Wort. Bei
   .62rem Schriftgrad trägt eine Zeile etwa vierzehn Zeichen –
   „Förderprojekte" hat genau vierzehn. Deshalb steht hier `hyphens: auto`:
   Was nicht passt, wird an einer deutschen Trennstelle geteilt („Förder-
   projekte") und nicht mitten im Wort abgeschnitten. Die Sprache dafür kommt
   aus `<html lang="de">`.

   NUR AUF BREITEN SCHIRMEN. Unter 900px ist die Leiste eine Schublade (§12) –
   sie ist dort ohnehin weg, wenn man sie nicht braucht, und eine schmale
   Schublade wäre eine Verkleinerung von etwas, das gar keinen Platz kostet.
   Deshalb liegt fast alles hier in `@media (min-width: 901px)`, und der Griff
   selbst verschwindet unterhalb davon (§12).

   VERBUNDEN MIT: static/js/leiste.js (setzt die Klasse, merkt sie sich),
   templates/anwendung/huelle.html (Markenzeile, Griff, Zeichen),
   qa/unit/test_leiste.py.
   ========================================================================= */

/* Der Griff. Er sieht aus wie das Abmelden-Kreuz unten – dieselbe Familie:
   ein Symbol in einem stillen Rahmen, der erst beim Darüberfahren Farbe
   bekommt. Zwei verschiedene Formen für zwei kleine Griffe in derselben
   Leiste wären eine zu viel. */
/* AUF DER LINIE, NICHT IN DER FLAECHE (Vorgabe Murat, 08.09.2026: „onu tam
   çizgiye … koysan, direkt alan içine koymasan").

   ER SASS BIS v1.23.0 IN DER MARKENZEILE, also innerhalb der Leiste. Dort
   war er ein Bedienelement unter anderen und nahm oben rechts Platz weg,
   den die Wortmarke gebraucht haette. Auf der Trennlinie ist er, was er
   ist: der Griff AN der Kante, die er verschiebt.

   ER HAENGT AM `.app`-RASTER UND NICHT AN DER LEISTE. `.leiste` hat
   `overflow-y: auto`; ein Knopf, der zur Haelfte ueber ihre rechte Kante
   ragt, wuerde dort abgeschnitten. `left` liegt genau auf der
   Spaltengrenze, `translateX(-50%)` legt ihn mittig darauf – die schmale
   Leiste aendert deshalb nur diesen einen Wert (§3a).

   KLEIN UND RUND. Ein rechteckiger Knopf auf einer Linie sieht aus wie ein
   Fehler im Rahmen; ein Kreis sieht aus wie ein Griff. */
.leiste__falten {
  position: absolute;
  /* MITTIG AUF DER GANZEN HOEHE. Oben klebte er an der Kopfzeile und sah aus
     wie deren Bedienelement; in der Mitte gehoert er sichtbar zur Kante. */
  top: 50%;
  left: 280px;
  z-index: 40;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  /* EINE AUSBUCHTUNG AUS DER LEISTE, KEINE SCHEIBE AUF DER LINIE (Vorgabe
     Murat, 08.09.2026, mit Zeichnung: „böyle çıkıntı yapcaksın … ortada
     olmucak").

     ERSTER VERSUCH WAR MITTIG AUF DER KANTE - halb im Gruenen, halb im
     Hellen. Das sah aus wie ein Knopf, den jemand dort abgelegt hat. Eine
     AUSBUCHTUNG gehoert sichtbar zu der Flaeche, aus der sie herauswaechst:
     Sie sitzt AN der Kante und ragt nach rechts, rund nur auf der
     Aussenseite, und sie traegt die Farbe der Leiste. Damit ist ohne ein
     Wort klar, was sie bewegt.

     `left: 280px` ohne `translateX` - die linke Kante liegt genau auf der
     Spaltengrenze, alles Weitere waechst nach rechts. */
  width: .95rem;
  height: 3.2rem;
  padding: 0;
  border: 0;
  border-radius: 0 var(--ecke-rund) var(--ecke-rund) 0;
  background: var(--leiste);
  box-shadow: var(--schatten-kante);
  font: inherit;
  color: var(--leiste-aktiv);
  cursor: pointer;
  transition: width .12s ease, height .12s ease;
}

.leiste__falten .sym { width: .8rem; height: .8rem; }

/* Beim Ueberfahren waechst sie ein Stueck - die Ruecksicht, die eine so
   schmale Flaeche braucht, damit man sie trifft. */
.leiste__falten:hover { width: 1.15rem; height: 3.8rem; }

.leiste__falten:hover {
  border-color: var(--akzent);
  background: var(--grund);
  color: var(--akzent);
}

.leiste-schmal .leiste__falten { left: 6rem; }

/* Kein `translate` mehr auf der X-Achse - nur die Mitte der Hoehe. */
.leiste__falten { transform: translateY(-50%); }

/* ZWEI PFEILE IN DER SEITE, EINER SICHTBAR. Der Pfeil zeigt, WOHIN es geht –
   nach links beim Einklappen, nach rechts beim Ausklappen. Ein einzelner
   gedrehter Pfeil hätte dasselbe geleistet, aber über eine Drehung, die man
   beim Lesen des Quelltextes erst nachrechnen muss. */
.leiste__falten-ein,
.leiste__falten-aus { display: inline-flex; }
.leiste__falten-aus { display: none; }
.leiste-schmal .leiste__falten-ein { display: none; }
.leiste-schmal .leiste__falten-aus { display: inline-flex; }

/* Das Zeichen (f+b) tritt an die Stelle der Wortmarke – siehe die Begründung
   in huelle.html an der Markenzeile. Der gerundete Rahmen ist nicht Zierde:
   Die Vorlage bringt ihren cremefarbenen Grund als Bildfläche mit, und ein
   scharfkantiges helles Rechteck auf dem grünen Grund liest sich wie ein
   Ladefehler. */
.leiste__zeichen { display: none; }

@media (min-width: 901px) {
  .leiste-schmal .leiste__wortmarke { display: none; }

  .leiste-schmal .leiste__zeichen {
    display: block;
    width: 2.25rem;
    height: 2.25rem;
    border-radius: var(--ecke-klein);
  }

  /* Die Markenzeile wird eine Spalte: Zeichen oben, Griff darunter. Nebeneinander
     blieben für beide je 40 Punkte – der Griff wäre dann kleiner als das, was
     man mit dem Finger trifft. */
  .leiste-schmal .leiste__marke {
    grid-template-columns: 1fr;
    justify-items: center;
    gap: var(--a2);
    padding: var(--a2) 0 var(--a3);
  }

  .leiste-schmal .leiste__markenverweis {
    grid-column: 1;
    justify-self: center;
  }

  /* 96 Punkte statt 280. Der Wert steht neben dem der breiten Leiste (§1) –
     wer den einen ändert, sieht den anderen. */
  .leiste-schmal .app { grid-template-columns: 6rem 1fr; }

  .leiste-schmal .leiste {
    padding-left: var(--a1);
    padding-right: var(--a1);
    gap: var(--a3);
    /* Ein Rollbalken der üblichen Breite frässe hier ein Sechstel der Leiste
       weg. `thin` ist genau für diesen Fall da. */
    scrollbar-width: thin;
  }

  /* --- Die Einträge: Symbol gross oben, Wort klein darunter --------------- */
  .leiste-schmal .navi a,
  .leiste-schmal .navi__knopf {
    position: relative;          /* Bezugsrahmen für die Zahl, siehe unten */
    flex-direction: column;
    gap: 2px;
    padding: var(--a2) 2px;
    text-align: center;
    font-size: .62rem;
    line-height: 1.15;
    hyphens: auto;
    overflow-wrap: break-word;
  }

  .leiste-schmal .navi .sym {
    width: 1.55rem;
    height: 1.55rem;
    stroke-width: 1.75;          /* dünner, weil grösser – sonst wird es klobig */
    vertical-align: 0;           /* der Versatz aus §2a gilt nur neben Text */
  }

  /* DIE ZAHL WANDERT IN DIE ECKE. `margin-left: auto` schiebt sie in einer
     Spalte nicht nach rechts, sondern nach OBEN – sie sässe dann über dem
     Symbol. Als Abzeichen an der oberen rechten Ecke bleibt sie da, wo man
     eine offene Zahl sucht, und kostet keine Zeile. */
  .leiste-schmal .navi .zaehler,
  .leiste-schmal .navi__zahl {
    position: absolute;
    top: 2px;
    right: 2px;
    margin-left: 0;
    min-width: 1.05rem;
    padding: 0 .2rem;
    font-size: .6rem;
    line-height: 1.05rem;
  }

  /* Die Bereiche eines geöffneten Projekts (§3) rücken ohne Einzug und ohne
     Linie: Bei 80 Punkten Textbreite kostet ein Einzug von 1rem jede zweite
     Zeile einen Umbruch, und die Linie zeigt eine Zugehörigkeit, die durch
     die Reihenfolge ohnehin klar ist. */
  .leiste-schmal .navi__projekt {
    margin: var(--a1) 0 var(--a2);
    padding-left: 0;
    border-left: 0;
  }

  .leiste-schmal .navi__projekt a { font-size: .58rem; padding: var(--a1) 2px; }

  /* --- Was oben und unten steht, bleibt stehen – nur kleiner -------------- */
  /* DER VEREINSNAME BLEIBT (Vorgabe Murat, 12.08.2026: er steht auf JEDER
     Seite). Wer mehrere Träger betreut, verwechselt sie genau in dem Moment,
     in dem der Name fehlt – daran ändert eine schmale Leiste nichts. Er wird
     kleiner und bricht um, er verschwindet nicht. */
  .leiste-schmal .leiste__orga {
    padding: 0 2px var(--a1);
    font-size: .62rem;
    line-height: 1.2;
  }

  /* Dasselbe für die eigene Stellung: Für den Betreiber ist das Schild der
     EINGANG in den Betriebsbereich (huelle.html) – ausblenden hiesse hier,
     einen Weg zu schliessen. */
  .leiste-schmal .leiste__stellung {
    margin: 0 0 var(--a3);
    padding: 2px var(--a1);
    font-size: .58rem;
    line-height: 1.2;
  }

  .leiste-schmal .leiste__trenner { margin: var(--a2) var(--a1); }

  /* Das Profil wird ein Stapel: Bild, darunter der Ausgang. Nebeneinander
     bliebe für den Namen ohnehin kein Platz, und ein zweispaltiges Raster mit
     einer leeren Spalte schöbe das Bild aus der Mitte. */
  /* DER AUSGANG STEHT NEBEN DEM BILD UND NICHT DARUNTER (Vorgabe Murat,
     08.09.2026: „o kişinin profili … çıkış ikonunu sağına"). Untereinander
     kostete das zwei Zeilen für zwei Zeichen und schob den Fuss nach oben.
     Nebeneinander passen sie: 2,25 rem Bild plus ein verkleinerter Knopf
     bleiben unter den 6 rem der schmalen Leiste. */
  .leiste-schmal .leiste__profil {
    grid-template-columns: auto auto;
    justify-content: center;
    justify-items: center;
    gap: var(--a1);
    padding: var(--a2) 0;
  }

  .leiste-schmal .leiste__abmelden {
    width: 1.9rem;
    height: 1.9rem;
  }

  .leiste-schmal .leiste__profilverweis {
    grid-template-columns: auto;
    justify-items: center;
  }

  /* Name und E-Mail sind das Einzige, was hier wirklich weggeht. Sie stehen
     vollständig im persönlichen Konto, das hinter genau diesem Bild liegt –
     und das Bild selbst beantwortet die Frage „bin ich das noch?" auch ohne
     sie. */
  .leiste-schmal .leiste__person { display: none; }

  /* DIE VERSIONSNUMMER GEHT IN DER SCHMALEN LEISTE WEG (Vorgabe Murat,
     08.09.2026: „daralınca soldaki menü versiyonu gösterme").

     WARUM SIE VORHER BLIEB, und warum das jetzt trotzdem richtig ist: Sie
     ist der Deploy-Beweis (§3) – steht nach einem Deploy die alte Nummer
     da, ist es ein Cache- und kein Codeproblem. Diese Zusage bleibt
     unangetastet: Die schmale Leiste ist eine ANSICHTSEINSTELLUNG, die
     jeder mit einem Klick zurücknimmt, und die Nummer steht ausserdem
     unter `/gesund`. Wer sie sucht, findet sie in einer Sekunde.

     `display: none` UND NICHT `visibility: hidden`: Der erste Versuch war
     das Zweite, mit der Begründung, die Zeile solle ihren Platz behalten,
     damit nichts springt. Der Platz war der Fehler – er stand als leere
     Zeile unter dem Profil, und zusammen mit dem Aussenabstand der Leiste
     ergab das den Streifen, den Murat eine Handbreit nannte. Es springt
     auch nichts: Beim Falten wird die ganze Leiste neu gesetzt.

     DER WÄCHTER AUS test_anmeldung.py BLEIBT HEIL. Er sucht die
     Zeichenfolge im QUELLTEXT, nicht im Bild – sie steht unverändert da. */
  .leiste-schmal .leiste__version { display: none; }
}

/* ===== §4 KOPFZEILE DES ARBEITSBEREICHS =================================
   Titel links, EINE Hauptaktion rechts. Mehr als eine Hauptaktion heißt,
   dass die Seite nicht weiß, wofür sie da ist. */
.kopfzeile {
  /* Bezugsrahmen fuer die BREITEN Menueblaetter (§14). Sie haengen nicht an
     ihrem Knopf, sondern an der Kopfzeile - ein 1000px breites Blatt, das
     rechtsbuendig an einem Knopf in der Mitte klebt, ragt links aus dem
     Arbeitsbereich heraus und wird abgeschnitten. GEMESSEN am 13.08.2026:
     genau das ist passiert, die Spalte "Stelle" lag ausserhalb des Bildes. */
  position: relative;
  display: flex;
  align-items: center;
  gap: var(--a4);
  flex-wrap: wrap;
  padding: var(--a5) var(--a6);
  border-bottom: 1px solid var(--linie);
  background: var(--grund);
}

/* DER TITEL NIMMT SEINE BREITE UND NICHT DEN GANZEN PLATZ (08.09.2026).

   BEFUND MURAT: „mein projektgebiet en sola taşınsın." Er stand auf den
   Förderungen in der Mitte der Kopfzeile – obwohl links nichts war. Ursache
   war `flex: 1 1 auto` hier: Der Titelkasten wuchs auf allen freien Platz,
   auch wenn er nur eine für das Vorleseprogramm sichtbare Überschrift trug,
   und schob die Ansicht vor sich her.

   NACH RECHTS GESCHOBEN WIRD WEITERHIN, aber von der Stelle aus, die es
   angeht: `.kopfzeile__aktionen` hat `margin-left: auto`. Damit steht
   links, WAS man sieht, und rechts, was man daran ändert – dieselbe Regel
   wie vorher, nur ohne den leeren Kasten dazwischen. */
.kopfzeile__titel { flex: 0 1 auto; min-width: 0; }

/* ===== DIE REITERZEILE (09.09.2026) ======================================
   Vorgabe Murat: „browseri biraz daha genişletince başlığın yanına kaydı o
   menüler."

   DAS REITERBAND DER FÖRDERAKTE STAND IM TITELBLOCK und sprang ab etwa 1400
   Punkten neben den Aktennamen; darunter blieb ein leeres weisses Band mit
   einer einsamen Lupe. Jetzt hat es eine eigene Zeile, IMMER – der Titel
   nimmt darüber die volle Breite, damit nichts mehr neben ihn passt.

   `:has()` UND NICHT EINE KLASSE AN DER SEITE: Die Regel gilt genau dann,
   wenn es wirklich Reiter gibt. Eine Klasse müsste jede Seite selbst
   setzen, und die erste, die es vergisst, bekommt still das alte Verhalten
   zurück. `:empty` trifft hier zu, weil die Hülle den Block ohne ein
   einziges Leerzeichen ausgibt. */
/* `flex: 1 1 0` UND NICHT `1 1 auto`: Mit `auto` ist die Grundbreite der
   Zeile der Inhalt – Reiter plus Nebenwege, hier 828 Punkte. Danebengelegt
   passte die Lupe nicht mehr in dieselbe Zeile und rutschte auf eine
   eigene, dritte (gemessen am 09.09.2026 bei 1100 Punkten). Mit Grundbreite
   0 wird zuerst die Lupe untergebracht, und die Reiterzeile bekommt, was
   übrig bleibt. */
.kopfzeile__reiter { flex: 1 1 0; min-width: 0; display: flex;
                     align-items: center; gap: var(--a4); flex-wrap: wrap; }
.kopfzeile__reiter:empty { display: none; }

/* DAS BAND NIMMT SEINE BREITE UND NICHT DIE GANZE ZEILE. `.reiter--kopf`
   bringt `flex: 1 1 100%` mit (§13) – dort steht es allein in einer Zeile
   und soll sie füllen. HIER stehen die Nebenwege und die Lupe daneben, und
   ein Band mit Basis 100 % drängt beide vor sich her: gemessen am
   09.09.2026 bei 1100 Punkten – die Reiter brachen auf zwei Zeilen um und
   die Lupe rutschte auf eine dritte, obwohl die Zeile halb leer war. */
.kopfzeile__reiter .reiter--kopf { flex: 0 1 auto; }

/* DIE REITER DER AKTE SIND EINE SPUR KLEINER ALS DIE DER VERWALTUNG. Dort
   steht das Band allein in seiner Zeile; hier teilt es sie mit den
   Nebenwegen und der Lupe. Bei `--s-text` fehlten zehn Punkte, und die
   Nebenwege brachen um (gemessen bei 1100 Punkten) – dieselbe Auskunft,
   eine Zeile mehr.

   DREI KLASSEN IM WÄHLER, weil `.reiter--kopf .reiter__eintrag` (§13) genau
   so schwer wiegt wie zwei – und weiter unten in dieser Datei steht. Das ist
   in dieser Datei die dritte Stelle, an der die Reihenfolge entscheidet;
   deshalb steht es hier und nicht in einem `!important`. */
.kopfzeile__reiter .reiter--kopf .reiter__eintrag {
  font-size: var(--s-hinweis);
}
.kopfzeile:has(.kopfzeile__reiter:not(:empty)) .kopfzeile__titel {
  flex: 1 1 100%;
}

/* EIN LEERER KASTEN IST NICHT NICHTS: Zwischen Flex-Kindern steht ein
   Zwischenraum, auch wenn eines davon nichts enthält. `.kopfzeile__ansicht`
   und `.kopfzeile__aktionen` gibt es auf JEDER Seite – auf den meisten
   leer, und dort kosteten sie zusammen zwei Zwischenräume. */
.kopfzeile__ansicht:empty,
.kopfzeile__aktionen:empty { display: none; }

/* DIE WERKZEUGE GANZ RECHTS (C08). Sie gehören keiner einzelnen Seite,
   sondern gelten überall: die Suche in den eigenen Unterlagen und der
   Hinweis auf Mitteilungen. Deshalb stehen sie HINTER `.kopfzeile__aktionen`
   – dessen `margin-left: auto` schiebt beide Gruppen nach rechts, auch wenn
   die Seite gar keine eigene Aktion hat.

   KEIN EIGENES `margin-left: auto`: Zwei automatische Ränder in derselben
   Zeile TEILEN sich den freien Platz, statt ihn einer Seite zu geben – die
   Werkzeuge stünden dann in der Mitte. */
.kopfzeile__werkzeuge {
  display: flex;
  align-items: center;
  gap: var(--a2);
}

/* EINE KOPFZEILE OHNE INHALT IST EIN LEERER STREIFEN (08.09.2026). Auf der
   Übersicht steht der Seitenname schon links in der Leiste, und die einzige
   Aktion ist als Kachel ins Raster gewandert. Was blieb, war ein weisses
   Band von 88 Punkten über einem Cockpit, das in einen Blick passen soll.

   AM TELEFON BLEIBT SIE STEHEN: Dort steckt in ihr der Griff zur
   Schublade (§12). Die Regel dafür steht im Block für schmale Schirme. */
.kopfzeile--leer { display: none; }

/* ===== §4b DIE AUFTRAGSZEILE (C07) ======================================
   Was im Hintergrund läuft, steht über der Liste – und die Liste bleibt
   bedienbar. Das ist der ganze Unterschied zum alten Vorhang, der die
   Anwendung anhielt, während ein Lauf fremde Behördenserver abfragte.

   FARBE IST NIE DAS EINZIGE MERKMAL (DESIGN_SYSTEM §3.2): Der Zustand
   steht als Wort im Satz; der Rand daneben ist die Zugabe, nicht die
   Auskunft. */
.auftrag {
  display: flex;
  align-items: center;
  gap: var(--a2);
  margin: 0 0 var(--a4);
  padding: var(--a3) var(--a4);
  border-left: 3px solid var(--akzent);
  border-radius: var(--ecke-klein);
  background: var(--akzent-hell);
  font-size: var(--s-hinweis);
}

.auftrag[data-auftrag-zustand="fertig"] {
  border-left-color: var(--gut);
  background: var(--gut-hell);
}

.auftrag[data-auftrag-zustand="fehler"],
.auftrag[data-auftrag-zustand="unbekannt"] {
  border-left-color: var(--warnung);
  background: var(--warnung-hell);
}

.auftrag .knopf--klein { margin-left: auto; }

/* ===== §4b2 DIE ZWEITE ZEILE IN EINER TABELLENZELLE (C13) ==============
   Der Fördergeber unter dem Programmnamen, die offene Regel unter der
   Einschätzung. Beides gehört zusammen und wird zusammen gelesen – zwei
   Spalten dafür kosteten die Breite, die dem Namen fehlte.

   `display: block` IST HIER DER GANZE PUNKT: Als Inline-Element stand der
   Geber hinter dem Namen in derselben Zeile, und die Zelle las sich als
   ein einziger langer Name (im Browser gemessen, 08.09.2026). */
.zeile__zusatz {
  display: block;
  margin-top: 2px;
  color: var(--leise);
  font-size: var(--s-winzig);
  line-height: 1.3;
}

/* ===== §4c DIE REGELLISTE EINER EINSCHÄTZUNG (C12) ======================
   Jede geprüfte Regel mit ihrem Stand und, wo es sie gibt, ihrer Quelle.
   Der Stand steht als WORT in der Ampel – Farbe ist nie das einzige
   Merkmal (DESIGN_SYSTEM §3.2), und „noch zu klären" ist ohnehin keine
   Farbe, sondern eine Auskunft. */
.regelliste { margin: 0 0 var(--a4); }
.regelliste dt { margin-top: var(--a3); }
.regelliste dd {
  margin: var(--a1) 0 0;
  color: var(--leise);
  font-size: var(--s-hinweis);
}
.regelliste dd small { display: block; margin-top: var(--a1); }

/* DAS KOPFSTÜCK EINER FÖRDERAKTE (Vorgabe Murat, 21.08.2026): Name und
   Reiterband in der Kopfzeile. Es heisst `.foerderkopf__name` und nicht
   `.aktenkopf`: Den gibt es schon – als Kopf der KUNDENakte im
   Betriebsbereich (v0.55.0, weiter unten in dieser Datei).

   DEN UMSCHLIESSENDEN `.foerderkopf` GIBT ES SEIT v1.29.0 NICHT MEHR. Er
   war die Flex-Zeile, in der Name und Reiterband nebeneinander lagen,
   „solange die Breite reicht" – und genau das war der Fehler: Ab etwa 1400
   Punkten sprang das Band neben den Namen und liess darunter ein leeres
   Band stehen. Die Reiter haben jetzt ihre eigene Zeile in der Kopfzeile
   (`.kopfzeile__reiter`, §4), unabhängig von der Fensterbreite.

   DER NAME IST EIN GRIFF, KEINE ÜBERSCHRIFT (Vorgabe Murat, 21.08.2026:
   „başlığa tıklayınca başlık değişsin, Idee'ye tıklayınca onu da
   değiştirebileyim").

   WARUM DAS MEHR IST ALS BEQUEMLICHKEIT: Titel und Stand waren nur über
   den Umweg Überblick → Förderakte → Formular → Speichern erreichbar –
   vier Schritte für zwei Wörter, und der Stand ist die Angabe, die sich am
   HÄUFIGSTEN ändert (Idee → in Vorbereitung → eingereicht → …). Was man am
   häufigsten ändert, gehört dorthin, wo es steht.

   ES SIND ECHTE <button>: mit der Tastatur erreichbar, auf Eingabetaste
   auslösend, vom Vorlesegerät als Schaltfläche angesagt. Die Zeichnung
   nimmt die Knopfvorgaben zurück, damit sie aussehen wie das, was sie
   ersetzen – ein Titel und eine Unterzeile. Der Rahmen kommt beim
   Überfahren. */
.foerderkopf__name {
  display: grid;
  gap: 2px;
  min-width: 0;
  padding: var(--a2) var(--a3);
  border: 1px solid transparent;
  border-radius: var(--ecke-klein);
}

.foerderkopf__name:hover { border-color: var(--linie); background: var(--grund); }

.aktenname, .aktenstand {
  display: flex;
  align-items: center;
  gap: var(--a2);
  padding: 0;
  border: 0;
  background: none;
  color: inherit;
  font: inherit;
  text-align: left;
  cursor: pointer;
}

.aktenname { font-size: 1.35rem; font-weight: 700; color: var(--text); }
.aktenstand { font-size: var(--s-hinweis); color: var(--leise); }
.aktenname .sym, .aktenstand .sym { opacity: 0; }
.foerderkopf__name:hover .sym, .aktenname:focus-visible .sym,
.aktenstand:focus-visible .sym { opacity: 1; }
.aktenname:hover, .aktenstand:hover { color: var(--akzent); }
.aktenname:focus-visible, .aktenstand:focus-visible {
  outline: 3px solid var(--fokus);
  outline-offset: 2px;
}

/* Der Stand trägt seine Ampelfarbe schon im Kopf – man sieht beim Öffnen
   der Akte, wo sie steht, ohne ein Wort zu lesen. */
.aktenstand__wort { font-weight: 600; color: var(--text); }

.kopfzeile h1 { font-size: 1.35rem; margin: 0; }
.kopfzeile .unterzeile { margin: 0; font-size: var(--s-hinweis); }
.kopfzeile__aktionen { margin-left: auto; display: flex; gap: var(--a2); }

.inhalt {
  padding: var(--a5) var(--a6);
  display: flex;
  flex-direction: column;
  gap: var(--a5);
}

/* ===== §5 KNÖPFE ========================================================= */
.knopf {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--a2);
  /* Dieselbe Höhe wie Eingabe- und Auswahlfeld (§12a). Ohne sie ergibt sich
     die Knopfhöhe aus Schriftgröße plus Innenabstand und passt neben einem
     Feld nur zufällig. */
  min-height: var(--bedienhoehe);
  padding: var(--a2) var(--a4);
  border: 1px solid var(--linie);
  border-radius: var(--ecke-klein);
  background: var(--grund);
  color: var(--text);
  font: inherit;
  font-weight: 600;
  font-size: var(--s-hinweis);
  text-decoration: none;
  cursor: pointer;
}

.knopf:hover { border-color: var(--akzent); color: var(--akzent); }

.knopf--haupt {
  background: var(--akzent);
  border-color: var(--akzent);
  color: var(--grund);
}

.knopf--haupt:hover { color: var(--grund); opacity: .92; }

/* DER STILLE KNOPF (C08). Er trägt keinen Rahmen, weil er nichts verändert,
   sondern nur woandershin führt – ein gerahmter Knopf neben der Hauptaktion
   einer Seite konkurriert mit ihr um den Blick. Beim Überfahren bekommt er
   Fläche statt Rand: Das sagt „hier kann man klicken", ohne dass er im
   Ruhezustand mitredet.

   ER STEHT HINTER `.knopf` UND NICHT DAVOR, und das ist kein Ordnungssinn:
   `.knopf` setzt die KURZSCHRIFT `border`. Sie überschreibt ein vorher
   notiertes `border-color` vollständig – gemessen am 07.09.2026 im Browser,
   die Knöpfe trugen trotz `transparent` ihren Rahmen. */
.knopf--still {
  border-color: transparent;
  background: transparent;
  color: var(--leise);
}

.knopf--still:hover {
  border-color: transparent;
  background: var(--papier);
  color: var(--text);
}

/* DER KNOPF, DER ETWAS WEGNIMMT. Er ist NICHT rot gefüllt: Eine rote Fläche
   zieht den Blick an und lädt zum Klicken ein – genau das Gegenteil dessen,
   was hier gebraucht wird. Rot ist die Schrift und der Rand, die Fläche
   bleibt ruhig. Und er steht nie allein, sondern hinter einem Griff, den man
   erst aufklappt (templates/anwendung/projekt.html).

   FARBE IST NIE DAS EINZIGE MERKMAL (DESIGN_SYSTEM §3.2): Das Zeichen und
   das Wort im Knopf sagen dasselbe noch einmal. */
.knopf--warnung { border-color: var(--schlecht); color: var(--schlecht); }
.knopf--warnung:hover {
  border-color: var(--schlecht);
  background: var(--schlecht-hell);
  color: var(--schlecht);
}
/* Der kleine Knopf steht IN einer Tabellenzeile und nicht neben einem Feld –
   dort wäre die volle Bedienhöhe eine Zeile, die dreimal so hoch ist wie ihr
   Inhalt. Er nimmt die Regel deshalb ausdrücklich zurück. */
.knopf--klein {
  min-height: 0;
  padding: var(--a1) var(--a3);
  font-size: var(--s-klein);
}

/* NUR DAS ZEICHEN, KEIN RAHMEN (Vorgabe Murat, 21.08.2026: „silme tuşunun
   etrafında çerçeve var, o çerçeveyi kaldır … görünümü tamamen etkiliyor").

   Er hat recht, und der Grund ist derselbe wie beim Merkherz (§14c): In einer
   Liste mit zwanzig Zeilen sind zwanzig gerahmte Knöpfe ein GITTER – das Auge
   liest dann die Rahmen und nicht die Namen. Ein Papierkorb ist ausserdem
   nichts, wozu man einladen will.

   ES BLEIBT EIN KNOPF: volle Trefferfläche, Zeigefinger, sichtbarer
   Tastaturfokus, und `title`/`aria-label` tragen das Wort, das hier fehlt.
   Erst beim Überfahren erscheint die Fläche – dann sieht man, was man
   trifft. */
.knopf--nurzeichen {
  min-height: 0;
  padding: var(--a2);
  border-color: transparent;
  background: none;
  color: var(--leise);
}

.knopf--nurzeichen:hover {
  border-color: transparent;
  background: var(--papier);
  color: var(--akzent);
}

.knopf--nurzeichen.knopf--warnung { color: var(--schlecht); }
.knopf--nurzeichen.knopf--warnung:hover {
  border-color: transparent;
  background: var(--schlecht-hell);
  color: var(--schlecht);
}

/* ===== §6 AMPEL ==========================================================
   Farbe ist NIE das einzige Merkmal: jede Ampel trägt zusätzlich ein Zeichen
   und ein Wort (DESIGN_SYSTEM.md §3.2). Rot-Grün-Schwäche betrifft rund
   jeden zwölften Mann – in einem Produkt, dessen Kernanzeige eine Ampel ist,
   wäre Farbe allein eine Funktion, die für einen Teil der Nutzer fehlt. */
.ampel {
  display: inline-flex;
  align-items: center;
  gap: var(--a2);
  font-size: var(--s-klein);
  font-weight: 600;
  white-space: nowrap;
}

.ampel::before { font-size: .7em; }
.ampel--gut      { color: var(--gut); }
.ampel--gut::before      { content: "\25CF"; }   /* ● */
.ampel--warnung  { color: var(--warnung); }
.ampel--warnung::before  { content: "\25B2"; }   /* ▲ */
.ampel--schlecht { color: var(--schlecht); }
.ampel--schlecht::before { content: "\25A0"; }   /* ■ */
.ampel--offen    { color: var(--leise); }
.ampel--offen::before    { content: "\25CB"; }   /* ○ */

/* Die Zeilen des Dashboards: eine Warnung, ihre Zahl, ihr Betrag, ihr Weg. */
.ampelliste { display: flex; flex-direction: column; }

.ampelzeile {
  display: flex;
  align-items: center;
  gap: var(--a4);
  padding: var(--a3) var(--a4);
  border-bottom: 1px solid var(--linie);
  color: var(--text);
  text-decoration: none;
}

.ampelzeile:last-child { border-bottom: 0; }
.ampelzeile:hover { background: var(--papier); }
.ampelzeile__text { flex: 1; min-width: 0; }
.ampelzeile__betrag { font-weight: 600; }
.ampelzeile__pfeil { color: var(--leise); }

/* ===== §7 KARTEN, KACHELN, BALKEN ======================================== */
.block {
  background: var(--grund);
  border: 1px solid var(--linie);
  border-radius: var(--ecke);
  overflow: hidden;
}

.block__kopf {
  display: flex;
  align-items: center;
  gap: var(--a3);
  padding: var(--a3) var(--a4);
  border-bottom: 1px solid var(--linie);
}

.block__kopf h2 { margin: 0; font-size: var(--s-h3); }
.block__kopf .knopf { margin-left: auto; }

/* `auto-fit` UND NICHT `auto-fill` (Vorgabe Murat, 21.08.2026: „o 4 tane
   kutucuğu yay, otomatik büyüyüp küçülsün").

   Der Unterschied ist genau das: `auto-fill` legt auch LEERE Spalten an –
   vier Kacheln auf einem breiten Schirm bleiben schmal und rechts steht
   eine handbreit Nichts. `auto-fit` lässt die leeren Spalten zusammenfallen,
   die vorhandenen Kacheln nehmen die Fläche. Ein Buchstabe Unterschied im
   Stylesheet, ein sichtbarer im Bild. */
.kacheln {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
  gap: var(--a4);
}

.kachel {
  display: block;
  padding: var(--a4);
  background: var(--grund);
  border: 1px solid var(--linie);
  border-radius: var(--ecke);
  color: var(--text);
  text-decoration: none;
}

.kachel:hover { border-color: var(--akzent); }
.kachel h3 { margin: 0 0 var(--a1); font-size: var(--s-h3); }
.kachel .geber { color: var(--leise); font-size: var(--s-klein); }

/* EINE KACHEL, DIE SICH ÖFFNET (Vorgabe Murat, 21.08.2026: „üstüne basınca
   pop-up çıksın"). Sie ist ein echter <button> und kein <div> mit einem
   Klickhandler: Nur so ist sie mit der Tastatur erreichbar, löst auf
   Eingabetaste aus und wird vom Vorlesegerät als Schaltfläche angesagt.

   Ein Knopf bringt seine eigene Zeichnung mit – mittig, grau, Systemschrift.
   Die drei Zeilen darunter nehmen sie zurück, damit er aussieht wie die
   Kachel daneben, die nur liest. Der Stift oben rechts ist der Unterschied,
   den man sieht, bevor man klickt. */
.kachel--tat {
  width: 100%;
  text-align: left;
  font: inherit;
  cursor: pointer;
}

.kachel--tat .geber {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--a2);
}

.kachel--tat:hover .geber { color: var(--akzent); }
.kachel--tat:focus-visible { outline: 3px solid var(--fokus); outline-offset: 2px; }

/* Eine Kachel über die ganze Reihe – für eine Angabe, die ein Satz ist und
   keine Zahl (die „nächste Handlung" im Antragsüberblick). */
.kachel--weit { grid-column: 1 / -1; }

/* ===== TEXTZEILEN – lange Texte stehen UNTEREINANDER ====================
   VORGABE MURAT, 21.08.2026: „Antragtextleri yan yana kutucuklar yerine alt
   alta büyüyüp küçülebilen textler olsun."

   Er hat recht, und der Grund ist die Textsorte: Eine Kachel ist für eine
   ANGABE gebaut – ein Name, ein Datum, ein Betrag. „Projektbeschreibung"
   ist keine Angabe, sondern ein Absatz. Nebeneinander bekommt jeder Absatz
   eine 220px-Spalte, wird nach drei Zeilen abgeschnitten, und sieben
   verschieden lange Texte ergeben ein zerrissenes Raster.

   Untereinander über die ganze Breite liest man sie wie das, was sie sind:
   den Antrag. Die Zeile wächst mit ihrem Inhalt und braucht keine feste
   Höhe – deshalb steht hier keine.

   ES IST DASSELBE BAUTEIL für Antragstext und Sachbericht. Zwei Listen, die
   gleich aussehen und getrennt gepflegt werden, laufen auseinander. */
.textzeilen { display: grid; gap: var(--a2); }

.textzeile {
  display: grid;
  grid-template-columns: 14rem minmax(0, 1fr) auto;
  gap: var(--a3) var(--a4);
  align-items: start;
  width: 100%;
  padding: var(--a3) var(--a4);
  border: 1px solid var(--linie);
  border-radius: var(--ecke-klein);
  background: var(--grund);
  color: var(--text);
  font: inherit;
  text-align: left;
}

.textzeile__name { font-weight: 600; }
.textzeile__text { min-width: 0; white-space: pre-line; }
.textzeile__text .hinweis { margin: 0; }
.textzeile .sym { color: var(--leise); }

/* Nur die bearbeitbare Zeile ist ein Griff. Ohne Änderungsrecht steht
   derselbe Inhalt als <div> da – gleiche Zeichnung, kein Zeigefinger.

   SEIT C18 IST DER GRIFF EIN LINK und kein Knopf mehr: Er führt in die
   Textwerkstatt, und ein Ziel mit eigener Adresse gehört in ein <a> – nur
   so funktionieren Mittelklick, „in neuem Tab öffnen" und der
   Zurück-Knopf. Die ZEICHNUNG bleibt dieselbe; ohne die
   `text-decoration`-Zeile trüge jede der sieben Zeilen einen
   Unterstrich über die ganze Breite (im Browser gesehen, 08.09.2026). */
a.textzeile,
button.textzeile { cursor: pointer; text-decoration: none; }
a.textzeile:hover,
button.textzeile:hover { border-color: var(--akzent); }
a.textzeile:hover .textzeile__name,
button.textzeile:hover .textzeile__name { color: var(--akzent); }
a.textzeile:focus-visible,
button.textzeile:focus-visible { outline: 3px solid var(--fokus); outline-offset: 2px; }

@media (max-width: 900px) {
  /* Am Telefon steht der Name ÜBER seinem Text; 14rem für die Beschriftung
     wären dort die halbe Breite. */
  .textzeile { grid-template-columns: minmax(0, 1fr) auto; }
  .textzeile__name { grid-column: 1 / -1; }
}

.balken {
  height: 6px;
  border-radius: var(--ecke-rund);
  background: var(--papier);
  overflow: hidden;
  margin: var(--a3) 0 var(--a2);
}

/* Die BREITE ist der einzige Wert im ganzen Gerüst, der aus einem Datensatz
   kommt und nicht aus einer Gestaltungsentscheidung. Sie wird deshalb als
   eigene Eigenschaft gesetzt – `style="--anteil: 78%"` – und nicht als
   vollständiger Inline-Stil. Farbe, Höhe und Rundung bleiben hier.
   Der Wächter lässt genau diese Form zu (DESIGN_SYSTEM.md §5.1). */
.balken span { display: block; height: 100%; width: var(--anteil, 0%); background: var(--akzent); }
.balken--warnung span { background: var(--warnung); }
.balken--schlecht span { background: var(--schlecht); }

.abschnittstitel { margin: 0 0 var(--a3); font-size: var(--s-h3); }

/* Kennzahlen: große Zahl, kleine Erklärung. Beträge immer mit .zahl. */
.kennzahlen {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
  gap: var(--a4);
  padding: var(--a4);
}

/* BEFUND MURAT, 21.08.2026 („Angefordert, eingegangen … öyle boktan olmuş"):
   Bei den Mittelabrufen klebte der Betrag am Wort – „0,00 €Angefordert".
   URSACHE: Die Regel stand nur an `b`, die Vorlagen schreiben aber
   `<strong>`. Zwei Namen für dasselbe, und die Zeichnung greift nur bei
   einem davon. Beide stehen jetzt hier – das ist der ganze Fehler. */
.kennzahl b, .kennzahl strong {
  display: block;
  font-size: var(--s-zahl);
  font-weight: 600;
  font-variant-numeric: tabular-nums;
}

/* Eine Zahl sagt mit ihrer FARBE, ob sie gut ist (Vorgabe Murat,
   21.08.2026: „rakamlar renkli olsun"). Nie nur die Farbe: Danebensteht
   immer das Wort, das dasselbe sagt (DESIGN_SYSTEM §3.2). */
.zahl--gut { color: var(--gut); }
.zahl--warnung { color: var(--warnung); }
.zahl--schlecht { color: var(--schlecht); }
.kennzahl span { color: var(--leise); font-size: var(--s-klein); }

/* ===========================================================================
   §7 DAS TAFELRASTER – ein Cockpit statt einer Spalte (08.09.2026)
   ===========================================================================
   VORGABE MURAT: „umarım grafiği alt alta yapmak yerine bölüm bölüm
   yapmışsındır" · „görsel olsun, text größesini küçült ki daha klas dursun,
   modern bir dashboard istiyorum."

   VORHER WAR DIE ÜBERSICHT EINE SPALTE: sieben Abschnitte untereinander.
   Auf einem 1440er Schirm blieb rechts die halbe Fläche leer, und wer die
   Projekte sehen wollte, rollte an allem anderen vorbei. Ein Cockpit, in dem
   man scrollt, ist keins.

   ZWÖLF SPALTEN, WEIL SICH DAMIT DRITTEL, VIERTEL UND HALBE TEILEN LASSEN:
   4×3 für die Kennzahlen, 7+5 für Geld und Aufgaben, 6+6 für die Listen. Ein
   Raster mit vier Spalten könnte kein Drittel, eines mit zehn kein Viertel.

   ZWEI HALTEPUNKTE UND NICHT FÜNF: über 1250 px das volle Raster, darunter
   sechs Spalten (also zwei Tafeln nebeneinander), am Telefon eine. Jeder
   weitere Haltepunkt ist eine Anordnung mehr, die jemand pflegen muss.

   `align-items: start`, DAMIT KEINE TAFEL AUF DIE HÖHE IHRER NACHBARIN
   GEZOGEN WIRD. Sonst hätte eine kurze Aufgabenliste unten einen leeren
   Streifen, nur weil daneben das Geld mehr Zeilen hat. */
.tafeln {
  display: grid;
  grid-template-columns: repeat(12, minmax(0, 1fr));
  align-items: start;
  gap: var(--a4);
}

.tafel {
  grid-column: span 12;
  min-width: 0;
  padding: var(--a4);
  border: 1px solid var(--linie);
  border-radius: var(--ecke-klein);
  background: var(--grund);
  /* DIE SCHRIFT IST HIER KLEINER ALS AUF EINER AKTENSEITE. Eine Aktenseite
     wird GELESEN, ein Cockpit wird ÜBERFLOGEN – Beschriftungen dürfen
     zurücktreten, damit die Zahlen vortreten. */
  font-size: var(--s-winzig);
}

/* Die Kennzahlreihe: VIER gleiche Kacheln und EIN Quadrat, volle Breite des
   Hauptrasters (Vorgabe Murat, 09.09.2026: „sadece neuer Antrag kutucuğunu
   kare yap, diğerleri aynı olsun").

   WARUM DIE LETZTE SPALTE EINE FESTE BREITE HAT: Die Haupthandlung trägt
   ein Zeichen und zwei Wörter, keine Zahl. Als fünftes Fünftel war sie so
   breit wie „laufende Förderprojekte" und stand halb leer da. Ihre Spalte
   ist jetzt genau so breit wie die Reihe hoch ist (6.5rem) – damit ist sie
   ein Quadrat, ohne dass irgendwo `aspect-ratio` die Zeilenhöhe umwirft. */
.tafelreihe {
  grid-column: span 12;
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr)) 6.5rem;
  gap: var(--a4);
}

/* Die Grundregel `.tafel { grid-column: span 12 }` gilt auch INNERHALB der
   Reihe – dort hat das Raster aber nur fünf Spalten, und jede Kachel nahm
   sich alle. Hier zurückgesetzt: In der Reihe entscheidet die Reihe. */
.tafelreihe > .tafel { grid-column: auto; }

.tafel--3 { grid-column: span 3; }
.tafel--5 { grid-column: span 5; }
.tafel--6 { grid-column: span 6; }
.tafel--7 { grid-column: span 7; }

/* FESTE HOEHEN FUER DIE GROSSEN TAFELN (Vorgabe Murat, 08.09.2026:
   „kutular sabit olsun" · „sayfa önünde olmalı").

   WARUM UEBERHAUPT FEST: Ein Raster, in dem jede Tafel so hoch ist wie ihr
   Inhalt, hat in jeder Reihe eine andere Kante. Das liest sich nicht als
   Cockpit, sondern als Stapel, der zufaellig nebeneinander liegt - und die
   Seite wird laenger als der Schirm, obwohl oben Platz ist.

   WAS DAS KOSTET, UND WIE ES BEZAHLT WIRD: Mehr Zeilen, als hineinpassen,
   muessten sonst abgeschnitten werden. Sie rollen stattdessen IM LEIB der
   Tafel (`.tafel__leib`) - der Kopf mit dem Weg zur ganzen Liste bleibt
   dabei stehen. Ein Rollbereich in einer Tafel ist ein Zugestaendnis; eine
   Tafel, die Zeilen verschluckt, waere ein Fehler. */
/* EIGENE KLASSE STATT `.tafel--5, .tafel--6, .tafel--7` - die Breite einer
   Tafel und ihre feste Hoehe sind zwei verschiedene Entscheidungen. Ein
   Bauteil zweimal zu definieren faengt `test_design_system` ab, und zwar zu
   Recht: Die spaetere Definition ueberschreibt Teile der frueheren an einer
   Stelle, die niemand sucht. */
.tafel--gross {
  display: flex;
  flex-direction: column;
  height: 19rem;
}

.tafel__leib {
  flex: 1 1 auto;
  min-height: 0;
  overflow-y: auto;
  /* Waagerecht wird hier NICHT gerollt: Die Tabellen dieser Tafeln haben
     zwei bis drei Spalten und passen. `overflow-x: hidden` schnitte sonst
     bei einem langen Titel still etwas ab. */
  overflow-x: hidden;
}

@media (max-width: 1250px) {
  .tafeln { grid-template-columns: repeat(6, minmax(0, 1fr)); }
  /* Die Reihe bleibt fuenfteilig: Vier Kacheln zu je rund 250 Punkten sind
     hier noch lesbar, und ein Umbruch nach der dritten liesse eine halbe
     Reihe leer stehen. */
  .tafelreihe { grid-column: span 6; }
  .tafel--3 { grid-column: span 3; }
  .tafel--5,
  .tafel--6,
  .tafel--7 { grid-column: span 6; }
}

@media (max-width: 760px) {
  /* ZWEI SPALTEN UND NICHT EINE. Vier Kennzahlen untereinander sind vier
     Bildschirmhoehen, bevor der erste Inhalt kommt – am Telefon genau das,
     was ein Cockpit nicht sein darf. Nebeneinander passen sie in einen
     Blick; alles Groessere nimmt weiterhin die volle Breite. */
  .tafeln { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .tafelreihe { grid-column: span 2;
                grid-template-columns: repeat(2, minmax(0, 1fr)); }
  /* Die Haupthandlung nimmt am Telefon die volle Breite: Sie ist der
     einzige Kasten dieser Reihe, den man DRUECKT. */
  .tafelreihe .tafel--tat { grid-column: span 2; min-height: 4rem; }
  /* Feste Hoehen sind am Telefon eine Fessel: Neben der Tafel ist kein
     Platz, den eine kuerzere Nachbarin verschenken koennte. */
  .tafel--gross { height: auto; max-height: 24rem; }
  .tafel--3 { grid-column: span 1; }
  .tafel--5,
  .tafel--6,
  .tafel--7 { grid-column: span 2; }
}

/* DER KOPF EINER TAFEL: links der Name, rechts der Weg zur ganzen Liste.
   KEIN `<h2>` IN SEINER ÜBLICHEN GRÖSSE – zwölf Überschriften in
   Aktengrösse auf einem Bildschirm sind zwölf Rufe. Klein, halbfett, mit
   Abstand darunter: Man sieht die Gliederung, ohne sie zu lesen. */
.tafel__kopf {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--a3);
  margin-bottom: var(--a3);
  padding-bottom: var(--a2);
  border-bottom: 1px solid var(--linie);
}

.tafel__kopf h2 {
  margin: 0;
  font-size: var(--s-klein);
  font-weight: 600;
  letter-spacing: .01em;
  color: var(--text);
}

.tafel__kopf a {
  font-size: var(--s-winzig);
  color: var(--leise);
  white-space: nowrap;
}

.tafel__kopf a:hover { color: var(--akzent); }

/* Eine Tafel enthält Tabellen und Listen, die ihre eigenen Ränder mitbringen
   – der letzte Abstand darunter wäre ein zweiter. */
.tafel > :last-child { margin-bottom: 0; }

/* ===== §7a DIE KENNZAHLTAFEL ============================================
   Die Zahl ist gross, das Wort ist klein, das Zeichen steht oben rechts und
   nicht vor der Zahl: Vor der Zahl stünde es in der Leserichtung IM WEG.

   SIE IST EIN WEG UND KEINE ANZEIGE. Wer „2 Projekte mit offenen Punkten"
   liest, suchte danach selbst – obwohl die Seite weiss, welche zwei. */
.tafel--zahl {
  position: relative;
  display: block;
  /* DIESELBE HOEHE FUER DIE GANZE REIHE - fuenf Kaesten in drei Hoehen
     sehen aus, als waere einer davon kaputt. */
  min-height: 6.5rem;
  color: inherit;
  text-decoration: none;
  transition: border-color .12s ease, box-shadow .12s ease;
}

.tafel--zahl:hover {
  border-color: var(--akzent);
  box-shadow: var(--schatten-kachel);
}

.tafel--zahl b {
  display: block;
  font-size: var(--s-zahl);
  font-weight: 600;
  line-height: 1.1;
  font-variant-numeric: tabular-nums;
  color: var(--text);
}

.tafel__wort {
  display: block;
  margin-top: var(--a1);
  color: var(--leise);
  font-size: var(--s-winzig);
}

.tafel__sym {
  position: absolute;
  top: var(--a3);
  right: var(--a3);
  color: var(--leise);
  opacity: .5;
}

/* DIE HAUPTHANDLUNG IN DER ZAHLENREIHE. Sie traegt die Akzentfarbe, weil
   sie die einzige Tafel ist, die etwas ANLEGT statt zu berichten - und weil
   es je Bildschirm genau eine Haupthandlung gibt (DESIGN_SYSTEM §5). */
.tafel--tat {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: var(--a2);
  border-color: var(--akzent);
  background: var(--akzent);
  color: var(--grund);
  text-align: center;
}

.tafel--tat:hover { background: var(--akzent-dunkel, var(--akzent)); }
.tafel--tat .tafel__wort { color: var(--grund); margin: 0; font-weight: 600; }
.tafel__plus .sym { width: 1.5rem; height: 1.5rem; }

.tafel--zahl:hover .tafel__sym { color: var(--akzent); opacity: 1; }

/* FARBE IST DIE ZUGABE, NIE DIE AUSKUNFT (DESIGN_SYSTEM §3.2). Die Zahl und
   das Wort stehen unverändert daneben. */
.tafel--warnung { border-left: 3px solid var(--warnung); }
.tafel--warnung b { color: var(--warnung); }
.tafel--warnung .tafel__sym { color: var(--warnung); opacity: 1; }

/* ===== §7b DIE SUMMENZEILE ÜBER DEM GELD ================================
   Vier Beträge nebeneinander, jeder mit seinem Wort darunter. Sie steht VOR
   den einzelnen Projekten, weil sie die Frage beantwortet, die man zuerst
   hat – und weil man danach weiss, wogegen man die Zeilen liest. */
.tafel__summe {
  display: flex;
  flex-wrap: wrap;
  gap: var(--a3) var(--a5);
  margin-bottom: var(--a4);
}

.tafel__summe span {
  display: flex;
  flex-direction: column;
  color: var(--leise);
  font-size: var(--s-winzig);
}

.tafel__summe b {
  font-size: var(--s-h2);
  font-weight: 600;
  color: var(--text);
  font-variant-numeric: tabular-nums;
  line-height: 1.2;
}

.tafel__summe .geldwort--zu b { color: var(--akzent); }
.tafel__summe .geldwort--aus b { color: var(--warnung); }

/* ===== §7b2 DIE GELDTAFEL: AUSWAHL, RING, ZAHLEN (08.09.2026) ===========
   Vorgabe Murat: „proje seçim kısmı olsun, oraya basınca o boxta o sayılar
   olsun grafiklerle beraber, yanında da Alle butonu."

   OHNE EIN EINZIGES ZEILCHEN JAVASCRIPT. Radioknöpfe und ein
   Geschwisterwähler schalten die Ansichten um. Das ist nicht Sparsamkeit,
   sondern Verlässlichkeit: Die Auswahl steht auch dann, wenn ein Skript
   nicht geladen hat, sie ist mit der Tastatur bedienbar, und sie kommt ohne
   die Sonderregel aus, die `style-src 'self'` für alles Dynamische
   verlangt. */
/* DER LEIB DER GELDTAFEL: LINKS DIE FRAGE, RECHTS DIE ANTWORT (Vorgabe
   Murat, 09.09.2026: „o proje kutucuğunu x ekseninde daralt, y ekseninde
   uzat, o geri kalanları da sağa doğru kaydır").

   VORHER STAND DIE LISTE UNTER DEM RING. Sie war damit breit und flach:
   zwei Zeilen sichtbar, der Rest im Rollbereich – bei einem Verein mit vier
   Projekten sah man die Hälfte. Als schmale, hohe Spalte links stehen alle
   Projekte auf einmal da, und rechts ist die Fläche frei, die Ring und
   Zahlen ohnehin brauchen.

   DIE LINKE SPALTE IST NACH OBEN BEGRENZT (11rem) und nicht anteilig: Eine
   anteilige Spalte wüchse mit der Tafelbreite, obwohl ein Projektname davon
   nichts hat – der Platz gehört den Zahlen. */
.geldbox__leib {
  display: grid;
  grid-template-columns: minmax(0, 11.5rem) minmax(0, 1fr);
  gap: var(--a4);
  flex: 1 1 auto;
  min-height: 0;
}

/* DIE AUSWAHL IST EINE LISTE IN EINEM KASTEN, keine Knopfreihe. Als Reihe
   standen die Projektnamen gekuerzt nebeneinander und brachen bei vier
   Projekten um; untereinander steht jeder Name ganz da. */
.geldwahl {
  display: flex;
  flex-direction: column;
  /* SIE STEHT LINKS NEBEN DER ANSICHT. Der Ring soll immer sichtbar sein -
     er ist die Antwort; die Liste ist die Frage. Deshalb rollt die LISTE,
     wenn ein Verein mehr Projekte hat als in die Tafel passen, und nicht
     der Ring aus dem Bild. */
  min-height: 0;
  overflow-y: auto;
  border: 1px solid var(--linie);
  border-radius: var(--ecke-klein);
}

/* Die Knöpfe selbst sind unsichtbar, aber NICHT `display: none` – sonst
   fielen sie aus dem Tabulatorlauf und die Auswahl wäre nur mit der Maus
   bedienbar. */
.geldwahl input {
  position: absolute;
  width: 1px;
  height: 1px;
  opacity: 0;
  pointer-events: none;
}

.geldwahl label {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--a3);
  padding: var(--a2) var(--a3);
  border-top: 1px solid var(--linie);
  background: var(--grund);
  color: var(--text);
  font-size: var(--s-winzig);
  cursor: pointer;
}

.geldwahl label:first-of-type { border-top: 0; }
/* Die Kante des gewaehlten Eintrags darf am gerundeten Kastenrand nicht
   ueberstehen - deshalb rundet der Kasten nicht, sondern seine Zeilen. */
.geldwahl label:first-of-type { border-radius: var(--ecke-klein) var(--ecke-klein) 0 0; }
.geldwahl label:last-of-type { border-radius: 0 0 var(--ecke-klein) var(--ecke-klein); }
.geldwahl label:hover { background: var(--papier); }

.geldwahl__name {
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.geldwahl__wert {
  color: var(--leise);
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
}

/* DER GEWAEHLTE EINTRAG TRAEGT EINE KANTE UND NICHT NUR EINE FARBE
   (DESIGN_SYSTEM §3.2): Wer Gruen nicht von Grau unterscheidet, sieht
   trotzdem, welche Zeile gilt. */
.geldwahl input:checked + label {
  background: var(--akzent-hell);
  box-shadow: inset 3px 0 0 var(--akzent);
  font-weight: 600;
}

.geldwahl input:checked + label .geldwahl__wert { color: var(--akzent); }

/* Der Fokusrahmen gehört an das LABEL, weil der Knopf unsichtbar ist. */
.geldwahl input:focus-visible + label {
  outline: 2px solid var(--akzent);
  outline-offset: 2px;
}

/* EINE ANSICHT JE PROJEKT, EINE SICHTBAR. Die Zuordnung läuft über die
   Reihenfolge: Der n-te Knopf zeigt die n-te Ansicht. Sechs Regeln decken
   `cockpit.LISTEN_GRENZE` samt „Alle Projekte" ab; wächst die Grenze, kommt
   hier eine Zeile dazu – das ist der Preis dafür, ohne Skript auszukommen,
   und er ist sichtbar statt versteckt. */
.geldbox:has(#geldwahl-1:checked) .geldsicht:nth-child(1),
.geldbox:has(#geldwahl-2:checked) .geldsicht:nth-child(2),
.geldbox:has(#geldwahl-3:checked) .geldsicht:nth-child(3),
.geldbox:has(#geldwahl-4:checked) .geldsicht:nth-child(4),
.geldbox:has(#geldwahl-5:checked) .geldsicht:nth-child(5),
.geldbox:has(#geldwahl-6:checked) .geldsicht:nth-child(6) {
  display: grid;
}

.geldsicht {
  display: none;
  grid-template-columns: auto minmax(0, 1fr);
  align-content: center;
  align-items: center;
  gap: var(--a4) var(--a5);
  min-width: 0;
}

/* DER RING MISST AUSGEGEBEN AM BEWILLIGTEN – die einzige Bezugsgrösse, die
   in einem Bescheid steht. Er heisst deshalb „ausgegeben" und nicht
   „Fortschritt": Ein Vorhaben kann 80 % seiner Mittel verbraucht und 20 %
   seiner Arbeit geleistet haben.

   ZWEI RINGE, WEIL ES ZWEI FRAGEN SIND: aussen, was ausgegeben ist; innen,
   was überhaupt eingegangen ist. In einen Ring gelegt sähen sie aus wie
   Abschnitte einer Menge, und der Betrachter addierte sie. */
.geldring { width: 8.5rem; height: 8.5rem; flex: 0 0 auto; }

/* `transform` am SVG und nicht am Kreis: Der Anfang eines Kreises liegt bei
   drei Uhr; oben ist die Stelle, an der ein Auge ihn zu lesen beginnt. */
.geldring circle {
  fill: none;
  stroke-width: 9;
  transform: rotate(-90deg);
  transform-origin: 50% 50%;
}

.geldring__spur { stroke: var(--linie); }
.geldring__aus { stroke: var(--warnung); stroke-linecap: round; }
.geldring__zu { stroke: var(--akzent); stroke-linecap: round; }

.geldring__zahl {
  fill: var(--text);
  font-size: 17px;
  font-weight: 600;
  text-anchor: middle;
}

.geldring__wort {
  fill: var(--leise);
  font-size: 8px;
  text-anchor: middle;
}

/* `.geldwerte` und nicht `.geldzahlen`: Den Namen gibt es in dieser Datei
   schon (die Kasse im Finanzblatt), und zwei Bauteile mit einem Namen sind
   ein Fehler, den man erst auf einer Seite bemerkt, an der niemand
   gearbeitet hat. */
.geldwerte { margin: 0; display: grid; gap: var(--a2); }
/* WORT UND ZAHL STEHEN NEBENEINANDER und werden nicht ueber die volle
   Breite auseinandergezogen (Vorgabe Murat, 09.09.2026: „bilgi satırlarını
   yanlarına yazsan burada daha süper olur, yerden kazanırız").

   `space-between` hatte das Wort links und die Zahl ganz rechts an der
   Tafelkante; dazwischen lagen bei einer breiten Tafel zehn Zentimeter
   Nichts, und das Auge musste die Zeile jedes Mal ueberqueren. Feste
   Wortspalte, Zahl direkt daneben: vier Zeilen, ein Blick. */
.geldwerte div {
  display: grid;
  grid-template-columns: 6.2rem auto;
  align-items: baseline;
  justify-content: start;
  gap: var(--a3);
}
.geldwerte dt { color: var(--leise); font-size: var(--s-winzig); }
.geldwerte dd {
  margin: 0;
  font-weight: 600;
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
}

.geldwerte .geldwort--zu dd { color: var(--akzent); }
.geldwerte .geldwort--aus dd { color: var(--warnung); }

.geldsicht__weg {
  grid-column: 1 / -1;
  font-size: var(--s-winzig);
  color: var(--leise);
}

.geldsicht__weg:hover { color: var(--akzent); }
.geldsicht__weg b { color: var(--warnung); }

/* DIE ENGEN FASSUNGEN DER GELDTAFEL STEHEN HIER UNTEN UND NICHT OBEN BEI
   DEN ANDEREN BREITENREGELN. Grund ist die Kaskade und nicht der Geschmack:
   Eine Regel in `@media` schlaegt eine gleich gewichtete Regel nur, wenn sie
   SPAETER im Text steht. Der Leib der Geldtafel wird ein paar Zeilen weiter
   oben definiert – eine Fassung davor waere still wirkungslos geblieben.
   (Gemessen am 09.09.2026: 184px 109px statt einer Spalte.) */
@media (max-width: 760px) {
  /* DIE GELDTAFEL HAT KEINEN `.tafel__leib`, der rollen koennte – Liste UND
     Ring liegen direkt in ihr. Mit einer Deckelung blieben untereinander
     beide halb sichtbar. Sie waechst stattdessen; am Telefon ist Hoehe das
     Einzige, was reichlich da ist. */
  .geldbox { height: auto; max-height: none; }
  .geldbox__leib { grid-template-columns: minmax(0, 1fr); }
  .geldwahl { overflow-y: visible; }
}

@media (max-width: 520px) {
  .geldsicht { grid-template-columns: 1fr; justify-items: center; }
  .geldwerte { width: 100%; }
}

/* ===== §7b3 EINE ZEILE, ZWEI AUSKUENFTE =================================
   Vorgabe Murat, 09.09.2026: „bilgi satırlarını yanlarına yazsan burada
   daha süper olur, yerden kazanırız."

   In den Listentafeln stand die Nebenauskunft (das Projekt einer Frist, der
   Geber einer Foerderung) mit `<br>` UNTER dem Namen. Zwei Zeilen je
   Eintrag heisst: halb so viele Eintraege in einer Tafel fester Hoehe.
   Nebeneinander passen doppelt so viele, und die Nebenauskunft ist genau
   das - sie weicht zuerst, wenn der Platz knapp wird. */
/* `width: 100%` ZUSAMMEN MIT `max-width: 0` ist kein Widerspruch, sondern
   der einzige Weg, in einer Tabelle mit automatischem Layout eine Zelle zu
   bekommen, die den ganzen Rest nimmt UND kuerzen darf: `max-width: 0`
   erlaubt das Kuerzen (ohne Obergrenze waechst die Zelle mit ihrem Inhalt
   und `text-overflow` greift nie), `width: 100%` gibt ihr danach den Platz,
   den die schmalen Nachbarspalten uebrig lassen. */
.zelle--eins {
  width: 100%;
  max-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

/* `.tabelle .zelle--eins` UND NICHT NUR `.zelle--eins`: Weiter unten in
   dieser Datei steht `.tabelle small { display: block }` – gleiche
   Gewichtung, spaeter im Text, also gewinnt sie. Zwei Klassen davor sind
   hier kein Trick, sondern die Aussage: In DIESER Zelle steht die
   Nebenauskunft daneben und nicht darunter. */
.tabelle .zelle--eins small {
  display: inline;
  margin: 0;
  font-size: var(--s-winzig);
  color: var(--leise);
}
.zelle--eins small::before { content: "· "; }

/* Die Nebenspalten einer Tafeltabelle brechen nicht um: Ein „Verwendungs-
   nachweis" ueber zwei Zeilen macht die ganze Zeile zwei Zeilen hoch, und
   dann hilft die gekuerzte Hauptspalte daneben nichts mehr. */
.tafel__leib .tabelle td { white-space: nowrap; }

/* ===== §7b4 DER ÜBERBLICK EINER AKTE ALS COCKPIT (v1.30.0) ==============
   Vorgabe Murat, 09.09.2026: „Überblick'te Übersicht gibi olmalı."

   ES SIND DIESELBEN TAFELN wie auf der Übersicht (§7) – dasselbe Raster,
   derselbe Kopf, derselbe Ring. Ein zweites Kastensystem für dieselbe Frage
   („wo stehe ich?") wäre die zweite Sprache, in der ein Verein dasselbe
   liest.

   WAS HIER DAZUKOMMT, sind drei Kleinigkeiten, die es auf der Übersicht
   nicht gibt: eine Nebenauskunft im Tafelkopf, ein Bearbeiten-Griff darin,
   und zwei Listen, die es nur in einer Akte gibt. */

/* Die Nebenauskunft im Tafelkopf – „2 dringend · 1 zu klären". Sie steht an
   der Stelle, an der auf der Übersicht der Weg zur ganzen Liste steht: Das
   ist derselbe Platz für dieselbe Art von Beiwerk. */
.tafel__zusatz { color: var(--leise); font-size: var(--s-winzig); text-align: right; }

/* Ein Griff im Tafelkopf. KEIN `.knopf--haupt`: Es gibt je Bildschirm eine
   Haupthandlung (DESIGN_SYSTEM §5), und auf dieser Seite ist es nicht das
   Bearbeiten von fünf Stammangaben. */
.tafel__griff {
  display: inline-flex;
  align-items: center;
  gap: var(--a1);
  padding: 0;
  border: 0;
  background: none;
  color: var(--leise);
  font: inherit;
  font-size: var(--s-winzig);
  cursor: pointer;
  white-space: nowrap;
}

.tafel__griff:hover { color: var(--akzent); }
.tafel__griff:focus-visible { outline: 2px solid var(--fokus); outline-offset: 2px; }

/* DIE FÜNF KACHELN SIND FÜNF ZEILEN GEWORDEN. Als Kacheln beantworteten sie
   dieselbe Frage fünfmal in fünf Kästen und kosteten eine halbe
   Bildschirmhöhe. Wort links, Angabe rechts – dieselbe Form wie `.geldwerte`
   und aus demselben Grund: In einer Tafel liest man Paare, keine Absätze. */
.blickliste { margin: 0; display: grid; gap: var(--a2); }

.blickliste div {
  display: grid;
  grid-template-columns: 9.5rem minmax(0, 1fr);
  align-items: baseline;
  gap: var(--a3);
  padding-bottom: var(--a2);
  border-bottom: 1px solid var(--linie);
}

.blickliste div:last-child { border-bottom: 0; padding-bottom: 0; }
.blickliste dt { color: var(--leise); font-size: var(--s-winzig); }
.blickliste dd { margin: 0; min-width: 0; color: var(--text); }

/* Die dringendste Frist: Ampel, Sache, Einordnung – in dieser Reihenfolge,
   weil die Ampel die Frage beantwortet, mit der man herkommt. */
.fristschau {
  display: grid;
  gap: var(--a2);
  justify-items: start;
  margin: 0;
}

.fristschau b { font-size: var(--s-h3); font-weight: 600; color: var(--text); }
.fristschau small { color: var(--leise); }

/* DIE GELDSICHT DER AKTE IST IMMER SICHTBAR. Auf der Übersicht gibt es eine
   je Projekt und ein Radioknopf schaltet um (`.geldsicht` ist deshalb
   `display: none`); in einer Akte gibt es genau ein Projekt. */
.geldsicht--fest { display: grid; }

/* In der Akte steht die Herkunft IN einer Tafel – ihr Abschnitt bringt
   seinen eigenen Kopf mit und braucht den der Tafel nicht. */
.tafel > .abschnitt { margin: 0; }
.tafel > .abschnitt > h2 {
  margin: 0 0 var(--a3);
  padding-bottom: var(--a2);
  border-bottom: 1px solid var(--linie);
  font-size: var(--s-klein);
  font-weight: 600;
}

@media (max-width: 620px) {
  .blickliste div { grid-template-columns: minmax(0, 1fr); gap: 0; }
}

/* ===== §7c EINE AUFGABE JE ZEILE ========================================
   ALS SCHMALE LISTE UND NICHT ALS KACHELWAND: Nebeneinander gelegt sahen
   fünf Aufgaben aus wie fünf gleich wichtige Angebote. Untereinander liest
   man sie in der Reihenfolge, in der sie drängen (§5.13). */
.tatliste { display: flex; flex-direction: column; }

.tat {
  display: flex;
  /* `baseline` und nicht `flex-start`: Zeichen, Titel und Zusatz stehen seit
     v1.27.0 in EINER Zeile – an der Oberkante ausgerichtet saessen sie auf
     drei verschiedenen Hoehen, weil ihre Schriftgroessen sich unterscheiden. */
  align-items: baseline;
  gap: var(--a3);
  padding: var(--a3) var(--a2);
  border-bottom: 1px solid var(--linie);
  color: inherit;
  text-decoration: none;
}

.tat:last-child { border-bottom: 0; }
.tat:hover { background: var(--papier); }

.tat__sym { flex: 0 0 auto; color: var(--leise); margin-top: .1em; }
.tat--rot .tat__sym { color: var(--schlecht); }
.tat--gelb .tat__sym { color: var(--warnung); }

/* EINE AUFGABE IST EINE ZEILE (Vorgabe Murat, 09.09.2026: „diğer
   kutucuklardaki satırlar inanılmaz satır harcıyor, her birini minimalist
   yap, tek satır olsunlar").

   VORHER ZWEI ZEILEN: Titel, darunter Projekt und Frist. Bei fuenf
   Aufgaben waren das zehn Zeilen in einer Tafel, die sechs zeigen kann –
   die Haelfte lag im Rollbereich. Nebeneinander gelesen steht dieselbe
   Auskunft in der halben Hoehe, und der Titel bekommt den Platz, den er
   braucht: Der Zusatz weicht (`text-overflow`), der Titel nicht. */
.tat__text {
  display: flex;
  align-items: baseline;
  gap: var(--a2);
  min-width: 0;
}
.tat__text b { font-weight: 600; font-size: var(--s-klein); white-space: nowrap; }
.tat__text small {
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  color: var(--leise);
}
/* Der Punkt trennt Titel und Zusatz, ohne dass er im Markup steht - so
   bleibt er weg, wenn der Zusatz fehlt. */
.tat__text small::before { content: "· "; }


/* ===== §7d KENNZAHL ALS GRIFF (08.09.2026) ===============================
   Vorgabe Murat: „Übersicht sayfasını daha mantıklı dizayn yapmalıyız."

   WAS DIE KACHEL VORHER WAR: eine Zahl mit einem Wort darunter, die
   nirgendwohin führte. Wer „2 Projekte mit offenen Punkten" las, suchte
   danach selbst – obwohl die Seite weiss, welche zwei.

   DAS ZEICHEN OBEN RECHTS und nicht vor der Zahl: Vor der Zahl stünde es
   in der Leserichtung IM WEG. Oben rechts ist es da, wo ein Auge es sucht,
   wenn es die Kachel schon erfasst hat – und es schiebt nichts. */
.kennzahl--griff {
  position: relative;
  display: block;
  padding: var(--a4);
  border: 1px solid var(--linie);
  border-radius: var(--ecke-klein);
  background: var(--grund);
  color: inherit;
  text-decoration: none;
  transition: border-color .12s ease, box-shadow .12s ease;
}

.kennzahl--griff:hover {
  border-color: var(--akzent);
  box-shadow: var(--schatten-kachel);
}

.kennzahl__sym {
  position: absolute;
  top: var(--a3);
  right: var(--a3);
  color: var(--leise);
  opacity: .55;
}

.kennzahl--griff:hover .kennzahl__sym { color: var(--akzent); opacity: 1; }

/* FARBE IST DIE ZUGABE, NIE DIE AUSKUNFT (DESIGN_SYSTEM §3.2). Die Zahl
   und das Wort stehen unverändert daneben. */
.kennzahl--warnung { border-left: 3px solid var(--warnung); }
.kennzahl--warnung b { color: var(--warnung); }
.kennzahl--warnung .kennzahl__sym { color: var(--warnung); opacity: 1; }

/* ===== §7b GELD IM BLICK (08.09.2026) ====================================
   DREI GRÖSSEN, ZWEI BALKEN, EIN BEZUG. Beide Balken messen am BEWILLIGTEN
   – der einzigen Bezugsgrösse, die in einem Bescheid steht. Zwei Spuren
   untereinander statt eines Balkens mit zwei Segmenten: „eingegangen" und
   „ausgegeben" sind nicht Teile derselben Menge, sondern zwei verschiedene
   Fragen an dieselbe Summe. In einen Balken gelegt sähen sie aus wie
   Abschnitte eines Weges, und der Betrachter addierte sie.

   DER BALKEN IST NICHT DIE AUSKUNFT, sondern ihre Form – jede Zahl steht
   als Text daneben. */
.geldliste { display: flex; flex-direction: column; gap: var(--a2); }

.geldzeile {
  display: grid;
  grid-template-columns: minmax(9rem, 1.1fr) minmax(6rem, 1fr) auto;
  align-items: center;
  gap: var(--a4);
  padding: var(--a3) var(--a4);
  border: 1px solid var(--linie);
  border-radius: var(--ecke-klein);
  background: var(--grund);
  color: inherit;
  text-decoration: none;
}

.geldzeile:hover { border-color: var(--akzent); }

.geldzeile__name { font-weight: 600; min-width: 0; }
.geldzeile__name small {
  display: block;
  font-weight: 400;
  color: var(--warnung);
  font-size: var(--s-klein);
}

/* ALS SVG, WEIL DIE CONTENT-SECURITY-POLICY KEINE STILE IM ATTRIBUT
   ERLAUBT (app.py: `style-src 'self'`). Der erste Versuch war
   `style="--anteil: 74%"` mit `width: var(--anteil)` hier – der Browser
   liess das Attribut im Dokument stehen und wandte es nicht an. Ergebnis:
   ein Balken von null Pixeln, ohne Meldung. Die BREITE kommt jetzt aus
   einem SVG-Präsentationsattribut, die FARBE aus dieser Datei.

   `width: 100%` am SVG und eine feste Höhe: Ohne `viewBox` rechnet der
   Browser die Prozente der Rechtecke gegen genau diesen Kasten. */
.geldbalken { display: block; width: 100%; min-width: 0; }

/* Die Spur muss sich vom Kartengrund abheben, sonst sieht ein Balken bei
   0 % aus wie gar kein Balken – und „nichts eingegangen" ist eine Auskunft,
   die man sehen soll. */
.geldbalken__spur { fill: var(--linie); }
.geldbalken__zu { fill: var(--akzent); }
.geldbalken__aus { fill: var(--warnung); }

.geldzeile__zahlen {
  display: flex;
  flex-direction: column;
  gap: 1px;
  text-align: right;
  font-size: var(--s-klein);
  color: var(--leise);
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
}

.geldzeile__zahlen b { color: var(--text); font-weight: 600; }
.geldwort--zu { color: var(--akzent); }
.geldwort--aus { color: var(--warnung); }

@media (max-width: 700px) {
  /* Am Telefon untereinander: Drei Spalten in 375 Punkten sind drei
     Spalten, in denen jede zu schmal ist. */
  .geldzeile { grid-template-columns: 1fr; gap: var(--a2); }
  .geldzeile__zahlen {
    flex-direction: row;
    flex-wrap: wrap;
    gap: var(--a3);
    text-align: left;
  }
}

/* ===== §8 TABELLEN =======================================================
   BEFUND MURAT, 15.08.2026: „kaydirma cubuklari ne alaka abi bu listeler
   saga sola kaydirilamlat okay?" – unter Listen, die bequem auf den Schirm
   passen, standen Rollbalken.

   URSACHE, und sie ist tückisch: `.tabellenhuelle` hatte `overflow-x: auto`.
   Nach CSS-Regel wird die ANDERE Achse damit automatisch von `visible` auf
   `auto` gehoben – die Hülle scrollt also auch senkrecht. Auf einem Rechner
   mit KLASSISCHEN (dauerhaft sichtbaren) Rollbalken nimmt der senkrechte
   Balken 15 px Breite weg, dadurch passt die Tabelle waagerecht nicht mehr,
   dadurch erscheint der waagerechte Balken, dadurch fehlt Höhe – die beiden
   halten sich gegenseitig am Leben. Auf einem Mac mit überlagernden Balken
   (Standard ohne Maus) sieht man davon nichts, deshalb fiel es hier nie auf.

   DIE LÖSUNG IST NICHT `overflow: hidden` (dann wäre der Inhalt am Telefon
   unerreichbar), sondern: AUF BREITEN SCHIRMEN GAR KEIN ROLLBEREICH. Die
   Fläche ist da, die Tabelle soll sie nehmen und ihre Spalten umbrechen.
   Waagerecht gerollt wird erst unterhalb der Telefonbreite, wo eine
   achtspaltige Tabelle wirklich nicht mehr hinpasst (§12). */
/* `position: relative` IST DER TEIL, DER DIE SEITE HEIL HÄLT (C28).

   BEFUND, im Browser gemessen: `/foerderungen` rollte bei 390 px um 471 px
   waagerecht, `/foerderungen` bei 768 px um 93 px – obwohl die Tabelle in
   ihrer Hülle sitzt und die Hülle `overflow-x: auto` trägt.

   URSACHE, und sie ist dieselbe Bauart wie der Befund oben, nur eine Achse
   weiter: In den Zellen der letzten Spalte stehen `.nur-vorlesen`-Spannen –
   1 px gross, absolut positioniert, für das Vorlesegerät. Ein absolut
   positioniertes Element wird NUR von einer Hülle beschnitten, deren Kasten
   sein Bezugsrahmen ist. Ohne `position` an der Hülle war ihr Bezugsrahmen
   `.arbeit` (§1, dort ausdrücklich `position: relative`) – also AUSSERHALB
   des Rollbereichs. Die Spannen standen bei x = 861 und zogen das Dokument
   auf 861 px, während die Hülle brav 358 px breit blieb.

   ES WAR NICHT DIE TABELLE. Die rollte korrekt in ihrem Kasten; sichtbar
   war nur, dass die ganze SEITE mitwanderte – der Befund aus Datei 05 §5
   („keine globale horizontale Scrollleiste bei 390 px").

   Deshalb steht `position: relative` an der HÜLLE und nicht an den Spannen:
   Es macht die Hülle zum Bezugsrahmen für alles, was in ihr liegt, und gilt
   damit auch für das nächste absolut positionierte Ding, das jemand in eine
   Tabellenzelle schreibt. */
.tabellenhuelle { overflow-x: visible; position: relative; }

/* AUSNAHME FÜR EXCEL-LISTEN: Wer eine Spalte breiter zieht, macht die Tabelle
   breiter als die Fläche – dann muss gerollt werden können. Die Falle von
   oben (zwei Rollbalken, die sich gegenseitig am Leben halten) greift hier
   nicht: `overflow-y: hidden` schliesst die senkrechte Achse ausdrücklich
   aus, und die Tabelle wächst nur waagerecht. */
.tabellenhuelle--roll { overflow-x: auto; overflow-y: hidden; }

.tabelle { width: 100%; border-collapse: collapse; font-size: var(--s-hinweis); }

.tabelle th {
  text-align: left;
  padding: var(--a2) var(--a4);
  border-bottom: 1px solid var(--linie);
  color: var(--leise);
  font-size: var(--s-klein);
  font-weight: 600;
  white-space: nowrap;
}

.tabelle td { padding: var(--a3) var(--a4); border-bottom: 1px solid var(--linie); }
.tabelle tr:last-child td { border-bottom: 0; }
.tabelle tbody tr:hover { background: var(--papier); }
.tabelle .zahl { text-align: right; }

/* Wechselnde Zeilenfarbe (Vorgabe Murat, 14.08.2026: „normalde beyaz acik
   gri diye devam eder ya, öyle"). Die Arbeitsfläche IST das Papier – die
   helle Zeile ist deshalb `--grund` und nicht ein neuer Grauton. Damit
   stimmt es in beiden Farbschemata, ohne dass jemand einen zweiten Wert
   pflegen muss.

   WOZU ÜBERHAUPT: Eine Liste mit sechs Spalten liest man WAAGERECHT. Ohne
   Wechsel verrutscht das Auge auf halber Strecke in die Nachbarzeile – bei
   „welche Rolle hat wer" ist das genau der Fehler, den man nicht bemerkt.

   Der Überfahr-Zustand ist deshalb NICHT mehr `--papier`: Auf den ungeraden
   Zeilen wäre er unsichtbar. Er nimmt die Akzentfläche und sagt damit „diese
   Zeile", nicht „irgendeine". */
/* ENGE ZEILEN (Vorgabe Murat, 20.08.2026: „kalin satirlar degil excel
   stitli"). Eine Liste, die man ueberfliegt, um EINE Zeile zu finden, will
   viele Zeilen auf einmal zeigen – nicht sechs grosszuegige. Waagerecht
   bleibt der Abstand, er trennt die Spalten; nur senkrecht wird es enger. */
.tabelle--eng td { padding: var(--a2) var(--a4); }
.tabelle--eng th { padding: var(--a1) var(--a4); }

.tabelle--zebra tbody tr:nth-child(odd) { background: var(--grund); }
.tabelle--zebra tbody tr:hover { background: var(--akzent-hell); }

/* ===== §8b DIE EXCEL-LISTE (v0.99.3, entschlackt in v0.99.5) ============
   VORGABE MURAT, 22.08.2026: „Excel listesi gibi olacak. incecik satirlar,
   süssüz. küçük yazilar, bir sayfada bütün sütunlari görebilecegim.
   sütunlarin büyüklügü küçüklügü ayarlanabilir olacak."

   NACHTRAG 23.08.2026, UND ER KORRIGIERT MICH: „bunlar çizgi çizgi. Excel
   gibi yap dedim ama tam bir Excel tablosu yapmışsın. Sadece başlıkların
   altında bir çizgi kalsın, bir de bunları ayıran çizgiler."

   ER HAT RECHT, UND DER FEHLER IST DERSELBE WIE ZWEIMAL VORHER: Ich habe
   das Vorbild nachgebaut statt den Zweck. „Wie Excel" hiess: eng, schlicht,
   viele Zeilen auf einmal. Was daraus wurde, war ein Gitternetz – Rahmen
   um die Tabelle, eine Linie zwischen JEDER Zelle, eine unter JEDER Zeile.
   Bei neun Spalten und zwanzig Zeilen sind das über zweihundert Striche
   auf einer Seite, und zweihundert Striche sind kein Raster mehr, sondern
   Rauschen (DESIGN_SYSTEM §1: „Ruhe trägt die Seite").

   WAS JETZT TRENNT, und mehr braucht es nicht:
     * EINE Linie unter dem Kopf. Sie sagt: hier fangen die Daten an.
     * Senkrechte Linien NUR IM KOPF, zwischen den Überschriften. Sie sagen,
       wo eine Spalte anfängt – und weil der Kopf über allen Zeilen steht,
       genügt die Auskunft dort ein einziges Mal.
     * Waagerecht führt die WECHSELNDE FLÄCHE statt einer Linie (weiss /
       sehr helles Grün, `--zeile-wechsel`). Eine Fläche trennt so gut wie
       ein Strich, kostet aber keinen Strich.

   DIE SPALTEN SIND PROZENTUAL (Befund Murat, 23.08.2026: „Verein kısmı
   yüzde 50-60'ını kaplıyor, küçülttüğümde yine uzuyor … sayfanın soluna ve
   sağına sabitle, büyüyüp küçülsünler"). Mit festen `rem`-Werten bekam die
   Namensspalte bei `table-layout: fixed` immer den REST – auf einem breiten
   Schirm also fast die halbe Seite, und beim Verkleinern gab sie als
   einzige nach. Prozente teilen jede Änderung auf alle Spalten auf.

   WAS DIESE KLASSE NICHT TUT: sortieren, filtern, Spalten ausblenden. Das
   kommt, wenn es gebraucht wird – eine Liste mit fünf Kunden braucht keinen
   Filter, und ein Griff, der nichts zu tun hat, ist Ballast.

   VERBUNDEN MIT: static/js/cockpit.js (§8, Spaltenbreiten),
   templates/betrieb/verwaltung.html (Kundenliste). */
.tabelle--excel {
  /* Feste Breiten sind die Voraussetzung dafür, dass sich eine Spalte
     überhaupt ziehen lässt: Ohne `fixed` rechnet der Browser die Breiten aus
     dem Inhalt und überschreibt jede gesetzte Angabe wieder. */
  table-layout: fixed;
  /* Kleiner als der Rest der Anwendung, und nur hier (index.css §2). */
  font-size: var(--s-winzig);
  line-height: 1.3;
  /* KEIN RAHMEN MEHR um die Tabelle. Der Arbeitsbereich IST schon die
     Fläche (DESIGN_SYSTEM §5.0) – ein Kasten darum wäre ein Kasten im
     Kasten. Unten schliesst eine Linie die Liste ab, damit die letzte
     Zeile nicht in der Fläche ausfranst. */
  border: 0;
  border-bottom: 1px solid var(--linie);
  /* Unterhalb dieser Breite wird gerollt (die Hülle trägt `--roll`) statt
     neun Spalten auf je ein paar Pixel zusammenzuquetschen. Darüber nimmt
     die Tabelle die ganze Fläche und wächst und schrumpft mit ihr.

     54 REM SEIT C13, VORHER 62 (08.09.2026 im Browser nachgemessen): Die
     alte Zahl galt für NEUN Spalten. Seit die Liste fünf inhaltliche trägt
     (Datei 02 §S02), war sie 56 px zu breit für den Arbeitsbereich bei
     1280 px – die Tabelle bekam einen Rollbalken, obwohl sie gepasst
     hätte. Die Begründung darunter gilt unverändert; nur die Zahl folgt
     der neuen Spaltenzahl.

     62 rem WAREN GEMESSEN, NICHT GEWÄHLT (23.08.2026): Unter 992 px fängt
     das Datumsfeld an, „tt.mm.jjjj" abzuschneiden – und ein Eingabefeld,
     dessen Form man nicht mehr lesen kann, ist der Punkt, an dem Rollen
     besser ist als Quetschen. Dazwischen kürzen die Überschriften mit „…“. */
  min-width: 54rem;
}

.tabelle--excel th,
.tabelle--excel td {
  /* Waagerecht Luft, senkrecht keine. Die Zeilenhöhe entsteht aus der
     Schrift, nicht aus Polstern – gemessen: 28 px statt 47 px, also
     zwanzig Zeilen auf dem Schirm statt zwölf. */
  padding: 0 var(--a2);
  height: 1.9rem;
  border: 0;
  /* Was nicht passt, wird abgeschnitten und nicht umgebrochen: Eine Zeile,
     die in einer Spalte zweizeilig wird, macht die GANZE Zeile doppelt hoch
     – bei zwanzig Zeilen ist das der halbe Bildschirm. Wer den vollen Text
     braucht, zieht die Spalte breiter. */
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

/* DER KOPF IST DAS EINZIGE GITTER. Eine Linie darunter, senkrechte Striche
   dazwischen – und ab da führt nur noch die Fläche. */
.tabelle--excel thead th {
  background: var(--papier);
  padding: 0 var(--a2);
  height: 1.8rem;
  font-size: var(--s-winzig);
  border-bottom: 1px solid var(--linie);
  border-right: 1px solid var(--linie);
  /* Bezugsrahmen für den Ziehgriff. `relative` und NICHT `sticky`: Ein
     mitlaufender Kopf braucht einen senkrechten Rollbereich, und den hat
     diese Hülle bewusst nicht (§8, die zwei Rollbalken, die sich
     gegenseitig am Leben hielten). */
  position: relative;
  user-select: none;
}

.tabelle--excel thead th:last-child { border-right: 0; }

/* DAS ZEBRA IST DIE WAAGERECHTE FÜHRUNG (Vorgabe Murat, 23.08.2026: weiss,
   darunter sehr helles Grün, dann wieder weiss). `--grund` ist das Weiss
   der Anwendung und `--zeile-wechsel` das Grün – beide sind benannte Werte,
   damit das dunkle Design mitkommt (index.css §2/§3). */
.tabelle--excel tbody tr { background: var(--grund); }
.tabelle--excel tbody tr:nth-child(even) { background: var(--zeile-wechsel); }
/* Der Überfahr-Zustand muss auf BEIDEN Zeilenfarben auffallen – deshalb
   der kräftigere Akzentgrund und nicht ein dritter Grünton. */
.tabelle--excel tbody tr:hover { background: var(--akzent-hell); }

/* Die Felder verschwinden IN der Zelle. Sichtbar werden sie erst beim
   Hineinklicken – dann aber deutlich, sonst weiss man nicht, wo man tippt. */
.tabelle--excel input[type="text"],
.tabelle--excel input[type="date"],
.tabelle--excel input[type="email"],
.tabelle--excel select {
  width: 100%;
  min-width: 0;
  margin: 0;
  padding: 1px 2px;
  border: 1px solid transparent;
  border-radius: 0;
  background: transparent;
  color: inherit;
  font: inherit;
  box-shadow: none;
  /* Sonst bringt das Feld die Mindesthöhe der Formularelemente mit und
     macht die Zeile wieder hoch. */
  min-height: 0;
  height: auto;
  line-height: 1.4;
}

/* DER KALENDERGRIFF WIRD KLEINER UND LEISER. Er bringt von sich aus einen
   Innenabstand mit, der in einer 1,9 rem hohen Zeile Platz kostet, den das
   Datum daneben braucht – gemessen 23.08.2026: Ohne diese Zeilen blieb von
   „tt.mm.jjjj" ein „tt.mm.jjj" übrig. Weggenommen wird er NICHT: Ein
   Datumsfeld ohne Kalender ist am Telefon ein Tippfeld. */
.tabelle--excel input[type="date"]::-webkit-calendar-picker-indicator {
  margin: 0;
  padding: 0;
  opacity: .45;
}

.tabelle--excel input:hover,
.tabelle--excel select:hover { border-color: var(--linie); }

.tabelle--excel input:focus,
.tabelle--excel select:focus {
  border-color: var(--akzent);
  background: var(--grund);
  outline: none;
}

/* ---- Handlungen in der Zeile: Zeichen ohne Knopfrahmen ------------------
   VORGABE MURAT, 23.08.2026: „tuş şeklinde değil minik ikon şeklinde olsun,
   etraflarını bir daire kare vs bir şeylerle çevirme."

   WARUM DAS MEHR IST ALS GESCHMACK: Ein Knopfrahmen verspricht eine
   HAUPTHANDLUNG. Vier Rahmen in jeder Zeile versprechen vier davon – bei
   zwanzig Zeilen achtzig Versprechen auf einem Bildschirm, und die Liste,
   um die es geht, verschwindet dahinter. Gemessen kostete jeder Rahmen
   ausserdem 8 px Polster; mit fünf Griffen lief die Spalte über, und die
   Zeichen lagen über der Nachbarspalte.

   FARBE ERST BEIM ANFASSEN: Ruhend sind alle vier `--leise`. Beim
   Überfahren nimmt der Griff den Akzent, der Mülleimer das Warnrot. So
   trägt die Zeile im Ruhezustand keine einzige Farbe, die etwas bedeuten
   könnte, ohne es zu tun. */
.zeilentat {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  flex: none;
  width: 1.4rem;
  height: 1.4rem;
  padding: 0;
  border: 0;
  border-radius: var(--ecke-klein);
  background: none;
  color: var(--leise);
  cursor: pointer;
  text-decoration: none;
}

.zeilentat .sym { width: 1rem; height: 1rem; }
.zeilentat:hover { color: var(--akzent); background: none; }
.zeilentat--warnung:hover { color: var(--schlecht); }
/* Der Tastaturweg braucht eine sichtbare Marke – ohne Rahmen gibt es sonst
   keine (DESIGN_SYSTEM §3.1, `--fokus`). */
.zeilentat:focus-visible { outline: 2px solid var(--fokus); outline-offset: 1px; }

/* Ein Ergebnis, das man auch anfassen kann: „3 Personen", „wartet". Es
   sieht aus wie Text und verhält sich wie ein Verweis – ein Knopfrahmen
   mitten in einer Datenspalte läse sich wie eine Handlung, und die
   Handlungen stehen am Zeilenende. */
.zellenwort {
  display: block;
  width: 100%;
  padding: 0;
  border: 0;
  background: none;
  color: var(--akzent);
  font: inherit;
  text-align: left;
  cursor: pointer;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.zellenwort:hover { text-decoration: underline; }
.zellenwort:focus-visible { outline: 2px solid var(--fokus); outline-offset: 1px; }

/* DIE HANDLUNGSSPALTE DARF NICHT ÜBERLAUFEN (Befund Murat, 22.08.2026:
   die Griffe lagen über der Spalte „Angelegt"). `overflow: visible` war der
   Fehler: Die Griffe passten nicht in ihre Breite und wanderten nach links
   über die Nachbarzelle – in einer Tabelle sieht das nicht nach „zu eng"
   aus, sondern nach kaputt. */
.tabelle--excel .spalte--handlung {
  display: flex;
  align-items: center;
  justify-content: flex-end;
  gap: 2px;
  overflow: hidden;
}

.tabelle--excel .spalte--handlung form { display: inline-flex; margin: 0; }
.tabelle--excel .mitte { text-align: center; }
.tabelle--excel .mitte .zeilentat { display: inline-flex; }

/* VORGABEBREITEN ALS KLASSEN und nicht als Stilattribut: `style-src 'self'`
   (app.py) sperrt jedes `style="…"` im HTML – ein Attribut sähe im Quelltext
   richtig aus und täte im Browser nichts. Es sind VORGABEN, keine Gesetze:
   Jede Spalte lässt sich am Kopf ziehen (cockpit.js §8).

   PROZENT STATT `rem` (Befund Murat, 23.08.2026, begründet im Kopf dieses
   Abschnitts). Die Summe der Angaben ist 69 % – die restlichen 31 %
   gehören der Namensspalte, die als einzige keine Angabe trägt. Damit
   wächst und schrumpft JEDE Spalte mit dem Fenster, statt dass eine
   einzelne den Ausgleich trägt. Unterhalb von 54 rem greift `min-width`
   und die Hülle rollt. */
/* IM BROWSER NACHGEMESSEN (23.08.2026, 1440 px Fenster, 1096 px Arbeits-
   fläche). Die Werte sind nicht gerundet, sondern das Ergebnis: Mit den
   ersten Prozenten blieb vom Kopf „Akte" ein „A…" und von „Projekte" ein
   „Proje…" übrig, und in das Datumsfeld passte „tt.mm.jjjj" nicht ganz.
   `.sp-fest` ist die Datumsspalte OHNE Eingabefeld – ein gedrucktes Datum
   braucht keinen Platz für den Kalendergriff. */
/* SORTIEREN AN DER SPALTENÜBERSCHRIFT (v0.99.6). Der Verweis füllt die
   ganze Kopfzelle, damit man die Überschrift trifft und nicht das Wort –
   eine Sortierung, bei der man zielen muss, benutzt niemand zweimal.
   Er sieht aus wie die Überschrift und nicht wie ein Verweis: In einem
   Tabellenkopf ist JEDE Zelle anklickbar, ein blaues Wort dazwischen sähe
   aus, als wäre nur dieses eine gemeint. */
.sortkopf {
  display: flex;
  align-items: center;
  /* Wort links, Pfeil rechts an der Spaltenkante. Beieinander sähe der
     Pfeil aus wie ein Teil des Wortes; an der Kante steht er über der
     Spalte, die er ordnet. */
  justify-content: space-between;
  gap: var(--a1);
  color: inherit;
  text-decoration: none;
}
.sortkopf:hover { color: var(--akzent); }

/* DER PFEIL STEHT IMMER DA – als „↕", solange nicht nach dieser Spalte
   sortiert wird. Ein Pfeil, der erst beim Zeigen erscheint, verrät nicht,
   dass man hier überhaupt sortieren kann. */
.sortkopf__pfeil { color: var(--linie); }
.sortkopf:hover .sortkopf__pfeil { color: var(--akzent); }

/* Der Zustand hängt an `aria-sort` und nicht an einer zweiten Klasse: Die
   Auszeichnung, die das Vorlesegerät ohnehin braucht, färbt damit gleich
   den Pfeil – und es gibt keine zwei Wahrheiten darüber, wonach sortiert
   ist. */
th[aria-sort="ascending"] .sortkopf,
th[aria-sort="descending"] .sortkopf { color: var(--text); }
th[aria-sort="ascending"] .sortkopf__pfeil,
th[aria-sort="descending"] .sortkopf__pfeil { color: var(--akzent); }
/* Die Kopfzelle gibt ihr Polster an den Verweis ab, damit er die ganze
   Fläche füllt. Als KLASSE und nicht als `:has(.sortkopf)`: Der Wähler
   wäre kürzer, aber eine Regel, die von der Anwesenheit eines Kindes
   abhängt, ist beim Lesen der Vorlage nicht zu sehen. */
.tabelle--excel thead th.sortbar { padding: 0; }
.tabelle--excel thead th.sortbar .sortkopf { padding: 0 var(--a2); height: 100%; }

/* „keine", „nicht genannt" – eine Auskunft, die es NICHT gibt, steht leiser
   als eine, die es gibt. Sonst liest sich eine Spalte voller „keine" wie
   eine Spalte voller Inhalt. */
.zellenleise { color: var(--leise); }

/* Das Merken ist ein Schalter und kein Weg – deshalb als einziges Zeichen
   in einer Zeile ein FARBIGER Ruhezustand, sobald es an ist. */
.zeilentat--an { color: var(--akzent); }

.tabelle--excel .sp-zeichen { width: 5%;    }
.tabelle--excel .sp-zahl    { width: 9%;    }
.tabelle--excel .sp-kurz    { width: 9.5%;  }
.tabelle--excel .sp-wort    { width: 9%;    }
.tabelle--excel .sp-datum   { width: 12.2%; }
.tabelle--excel .sp-fest    { width: 8.5%;  }
.tabelle--excel .sp-taten   { width: 10%;   }
/* Zwei weitere Vorgaben für die Radarliste (v0.99.6). Sie stehen bei den
   anderen und nicht in einem eigenen Abschnitt: Es sind Spaltenbreiten
   derselben Bauform, und eine zweite Liste von Breiten wäre der Anfang
   einer zweiten Tabelle. */
.tabelle--excel .sp-schmal  { width: 8.5%;  }
.tabelle--excel .sp-mittel  { width: 11%;   }
.tabelle--excel .sp-weit    { width: 12.5%; }
.tabelle--excel .sp-breit   { width: 14%;   }

/* Zwei Dinge in einer Zelle. Das Feld gibt nach, das Wort nicht: Ein
   abgeschnittener Zustand ist eine falsche Auskunft, ein schmaleres
   Datumsfeld nur ein schmaleres Feld. */
.tabelle--excel .zelle__paar { display: flex; align-items: center; gap: 2px; }
.tabelle--excel .zelle__paar > input { flex: 1 1 4rem; width: auto; min-width: 0; }
.tabelle--excel .ampel { padding: 0 var(--a1); font-size: var(--s-winzig); }

/* Der Griff zum Ziehen. Er liegt IM Kopf und ragt über die Trennlinie, damit
   man ihn trifft, ohne genau zu zielen – vier Pixel sind für eine Maus zu
   wenig. Er kann absolut liegen, weil die Kopfzelle `position: relative`
   trägt und damit selbst der Bezugsrahmen ist. */
.spaltengriff {
  position: absolute;
  top: 0;
  right: -3px;
  width: 7px;
  height: 100%;
  cursor: col-resize;
  z-index: 3;
}

.spaltengriff:hover { background: var(--akzent); opacity: .35; }

/* Während des Ziehens gilt der Zeiger für die ganze Seite: Sonst flackert er,
   sobald die Maus die schmale Griffzone verlässt – und sie verlässt sie
   sofort, weil die Spalte der Maus hinterherwandert. */
body.spalten-ziehen,
body.spalten-ziehen * { cursor: col-resize !important; user-select: none; }

/* ===== WAS IN DIESEN ZEILEN STEHT (v0.95.0) =============================
   VORGABE MURAT, 21.08.2026: „ya kutu kutu ekleme yapıyor … Excel tipi bir
   listeleme istiyorum. Her zaman Excel tipi."

   Er hat recht, und es war eine Doppelung im eigenen Baukasten: Für „viele
   gleichartige Zeilen" gab es die Tabelle (§8, auf seine Vorgabe vom
   20.08.2026 auf enge Zeilen umgestellt) UND `.ausgabekarte` – eine
   gerahmte Karte je Zeile. Zwölf Listen benutzten die Karte. Eine Liste aus
   gerahmten Karten zeigt auf einem Bildschirm sechs Einträge, wo die
   Tabelle zwanzig zeigt, und man liest die Rahmen statt der Zahlen.

   `.ausgabekarte` ist damit entfallen. Was die Karte konnte und die Tabelle
   brauchte, steht hier: eine zweite, leise Zeile in einer Zelle, und
   Knöpfe, die in der Zeile nicht umbrechen. */
.tabelle__zweit { display: block; color: var(--leise); font-size: var(--s-klein); }
.tabelle__taten { display: flex; gap: var(--a2); justify-content: flex-end; }
.tabelle td.rechts, .tabelle th.rechts { text-align: right; }
.tabelle .betrag { font-variant-numeric: tabular-nums; white-space: nowrap; }
.tabelle .ampel { white-space: nowrap; }
/* Erledigtes bleibt lesbar, tritt aber zurück. */
.tabelle tr.erledigt td:nth-child(2) { color: var(--leise); text-decoration: line-through; }

/* Ausgeschiedene bleiben in der Liste (organisation.team_liste) und sind an
   der Zeile zu erkennen, nicht an ihrem Ort. Zurückgenommen, aber lesbar:
   Wer nachschlägt, wer 2024 Zugang hatte, muss den Namen lesen können. */
.zeile--beendet td { color: var(--leise); }
.zeile--beendet b { font-weight: 400; }
.zeile__zweit { display: block; color: var(--leise); font-size: var(--s-klein); }

/* ---------------------------------------------------------------------
   ROLLEN AN DER ZEILE – Farbe UND Wort
   ---------------------------------------------------------------------
   BEFUND MURAT, 15.08.2026: „hangileri admin hangileri superadmin oldugunu
   nerden bilicez haci ya … admin sekmeleri farkli renkte super admin
   farkli renkte."

   Die Farbe kommt, das WORT bleibt daneben stehen (DESIGN_SYSTEM §3.2):
   Bei Rot-Grün-Schwäche und auf einem schlechten Bildschirm ist die Farbe
   allein keine Auskunft. Die Marke ist deshalb ein gefärbter Rahmen um den
   Rollennamen und kein Punkt ohne Text.

   DREI STUFEN, DREI FLÄCHEN – und keine vierte für den Betreiber: Er ist
   keine Rolle in einem Verein, sondern der Betrieb dieser Anwendung. Er
   steht als Satz unter der Liste (rechte.py, „DER BETREIBER – etwas
   anderes als eine Rolle"). */
.rolle {
  display: inline-block;
  padding: 1px var(--a2);
  border: 1px solid var(--linie);
  border-radius: var(--ecke-klein);
  font-size: var(--s-klein);
  font-weight: 600;
  white-space: nowrap;
}
.rolle--inhaber    { border-color: var(--akzent);  background: var(--akzent-hell);  color: var(--akzent); }
.rolle--verwaltung { border-color: var(--warnung); background: var(--warnung-hell); color: var(--warnung); }
.rolle--pruefer    { color: var(--leise); }

/* ---------------------------------------------------------------------
   DIE BEARBEITUNGSZEILE UNTER EINEM VEREIN (v0.50.0)
   ---------------------------------------------------------------------
   Sie ist zu, bis ihre eigene Adresse angesprungen wird (`:target`) – ohne
   JavaScript, verlinkbar, und der Zurück-Knopf schliesst sie wieder.

   WARUM KEINE ZWEITE SEITE UND KEIN FENSTER: Ein Dialog nimmt die Liste
   weg, und beim Setzen eines Nutzungszeitraums will man die Nachbarzeilen
   sehen. Eine eigene Seite kostet zwei Klicks und den Überblick. */
.zeile--bearbeiten { display: none; }
.zeile--bearbeiten:target { display: table-row; }
.zeile--bearbeiten > td { background: var(--papier); }

.bearbeiten {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(18rem, 1fr));
  gap: var(--a4) var(--a5);
  padding: var(--a3) 0;
}

/* Jedes der drei Formulare ist eine eigene Handlung mit eigenem Knopf –
   nebeneinander, damit man sieht, dass „Zeitraum speichern" die Stammdaten
   NICHT mitschickt. Ein gemeinsames Formular hätte genau die Verwechslung
   erzeugt, die man erst bemerkt, wenn ein Feld leer gespeichert wurde. */
.bearbeiten__form { display: flex; flex-wrap: wrap; align-items: end; gap: var(--a3); margin: 0; }
.bearbeiten__form .feld { flex: 1 1 10rem; margin-bottom: 0; }
.bearbeiten__form .knopf { flex: 0 0 auto; }

/* Kopfzeile eines Werkzeugs: Überschrift links, Gegenstück rechts aussen
   (Vorgabe Murat: „Verein anlegen … satirinin en sagina bir cöp kütusu"). */
.werkzeug__kopf {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--a4);
  margin-bottom: var(--a4);
}
.werkzeug__kopf h2 { margin: 0; }
.knopf__zahl { margin-left: var(--a1); color: var(--leise); font-weight: 400; }

/* Die Handlungsspalte steht weiter unten in EINEM Block (§21). Sie stand
   bis v0.99.5 zweimal in dieser Datei – hier mit `white-space` und
   `text-align`, 3300 Zeilen tiefer mit dem Raster. Beide zusammen ergaben
   das Richtige, aber nur zufällig: Die zweite überschrieb die erste nicht,
   sie ergänzte sie. Wer die spätere gelesen hätte, hätte die frühere nicht
   vermutet (test_jedes_bauteil_wird_genau_einmal_definiert). */
/* Das Rollenfeld in der Zeile bekommt eine Grenze: Ohne sie zieht der
   längste Rollenname („Inhaber / Administration") die Spalte auf 340px
   und die Tabelle über den Arbeitsbereich hinaus – gemessen 1136 zu
   1091px am 14.08.2026, der Beenden-Knopf lag ausserhalb. */
.zeilenformular select { max-width: 11rem; }

/* Die Rechteübersicht: ein Häkchen heisst ja, ein Strich heisst nein – und
   beide tragen zusätzlich ein vorgelesenes Wort. Ein Symbol allein ist für
   ein Vorleseprogramm nichts. */
/* Der Griff eines zugeklappten Abschnitts. Er stand nur an der
   Rechteübersicht; seit die Teamseite ihren Verlauf zuklappt (15.08.2026),
   gibt es drei davon – und drei Griffe, die verschieden aussehen, liest man
   als drei verschiedene Dinge. `.rechteliste` trägt `.abschnitt` mit und
   fällt damit unter dieselbe Regel. */
.abschnitt > summary { cursor: pointer; color: var(--akzent); font-weight: 600; }
.abschnitt > summary ~ * { margin-top: var(--a4); }
.rechteliste .tabellenhuelle { margin-top: var(--a4); }
.rechteliste .sym { color: var(--gut); }
.rechteliste__nein { color: var(--leise); }

/* ===== §9 BEGRÜNDUNG EINER AMPEL =========================================
   Was fehlt, warum es zählt, was zu tun ist – in dieser Reihenfolge
   (PLAN_FOERDERBUCH.md §5.B.3). Ohne den dritten Teil ist es eine Klage,
   keine Hilfe. */
.befund {
  padding: var(--a4);
  border-left: 3px solid var(--linie);
  background: var(--papier);
  border-radius: 0 var(--ecke-klein) var(--ecke-klein) 0;
}

.befund--schlecht { border-left-color: var(--schlecht); background: var(--schlecht-hell); }
.befund--warnung  { border-left-color: var(--warnung);  background: var(--warnung-hell); }
.befund h4 { margin: 0 0 var(--a1); font-size: var(--s-hinweis); }
.befund p  { margin: 0 0 var(--a3); font-size: var(--s-hinweis); }
.befund .quelle { color: var(--leise); font-size: var(--s-klein); font-style: italic; }

/* ===== §10 LEER, LADEN, FEHLER ===========================================
   Diese drei werden gebaut, nicht später ergänzt. Ein Leerzustand mit drei
   Vorschlägen ist keine Hilfe – es gibt GENAU eine nächste Handlung. */
.leer {
  padding: var(--a7) var(--a5);
  text-align: center;
  color: var(--leise);
}

.leer h3 { margin: 0 0 var(--a2); color: var(--text); }
.leer p { margin: 0 0 var(--a4); }

.platzhalter {
  background: var(--papier);
  border-radius: var(--ecke-klein);
  height: 1rem;
}

/* ===== §11 ANMELDUNG =====================================================
   Ruhig, mittig, ohne Werbetext. Wer hier ankommt, ist überzeugt – er will
   sich anmelden, nicht lesen.

   OHNE KASTEN (Vorgabe Murat, 15.08.2026: „o beyaz arkaplan olmadan ama
   biraz daha genis olarak arkaplandaki yere yerlestir"). Das ist dieselbe
   Regel wie im Arbeitsbereich (DESIGN_SYSTEM §5.0, „keine Kästen im
   Kasten"): Die Seite IST hier schon der Rahmen – sie enthält nichts
   ausser dieser einen Handlung. Ein weisses Rechteck darauf trennt nichts
   von nichts und lässt die Felder schmaler wirken, als sie sind.

   Die Eingabefelder behalten ihren hellen Grund. Damit sind sie jetzt das
   EINZIGE Weiss auf der Fläche – die Augen landen dort, wo getippt wird. */
.anmeldeseite {
  min-height: 100vh;
  display: grid;
  place-items: center;
  padding: var(--a5) var(--a4);
  background: var(--papier);
}

.anmeldekarte {
  width: 100%;
  max-width: 28rem;
  padding: 0;
}

/* Nur Höhe und Zentrierung – ob sie sichtbar ist, entscheiden die Regeln
   .wortmarke-dunkel / .wortmarke-hell in index.css. */
.anmeldekarte .marke-gestapelt {
  height: 54px;
  width: auto;
  margin: 0 auto var(--a5);
}

.feld { display: block; margin-bottom: var(--a4); }
.feld > span { display: block; margin-bottom: var(--a1); font-size: var(--s-hinweis); font-weight: 600; }
.feld__zeile { display: flex !important; justify-content: space-between; gap: var(--a2); }
.feld__zeile a { font-weight: 400; }

.feld input {
  width: 100%;
  padding: var(--a2) var(--a3);
  border: 1px solid var(--linie);
  border-radius: var(--ecke-klein);
  background: var(--grund);
  color: var(--text);
  font: inherit;
}

.feld input:focus-visible { border-color: var(--akzent); }
.knopf--breit { width: 100%; justify-content: center; }

/* ---------------------------------------------------------------------
   DAS MELDUNGSBAND – mit Zeichen, nicht nur mit Farbe
   ---------------------------------------------------------------------
   BEFUND MURAT, 14.08.2026: „biseyler onaylanirken böyle yesil bi satir
   cikiyo, o nedir?" Der Erbauer erkennt seine eigene Erfolgsmeldung nicht
   wieder – derselbe Schweregrad wie der Befund zu den Kopfzeilen-Menüs
   (DESIGN_SYSTEM §5.6a).

   URSACHE: ein farbiger Streifen ohne Zeichen. Er sagt „hier ist etwas
   anders", aber nicht WAS. Und Farbe ist nie das einzige Merkmal (§3.2) –
   bei Rot-Grün-Schwäche sahen Erfolg und Fehler bis hierher gleich aus.

   Gesetzt wird das Band ausschliesslich über `helfer.meldung()`, damit es
   EINEN Weg gibt. */
.meldung,
.erfolgsmeldung,
.fehlermeldung {
  display: flex;
  align-items: center;
  gap: var(--a3);
  margin: 0 0 var(--a5);
  padding: var(--a3) var(--a4);
  border: 1px solid var(--linie);
  border-left-width: 3px;
  border-radius: var(--ecke-klein);
  font-size: var(--s-hinweis);
}
.meldung .sym,
.erfolgsmeldung .sym,
.fehlermeldung .sym { flex: 0 0 auto; }

/* DIE ALTEN NAMEN SIND ZWEITNAMEN, KEINE ZWEITE BAUART (14.08.2026). Fünf
   Stellen setzen ihr Band von Hand mit einem Symbol darin und lassen sich
   nicht auf `meldung()` umstellen, ohne die Auszeichnung darin zu verlieren
   (`<b>`, mehrere Absätze). Sie bekommen deshalb dieselbe Regel statt einer
   eigenen – zwei Regeln für dasselbe Aussehen wären genau der Weg, auf dem
   die beiden nach einem halben Jahr verschieden aussehen.
   NEUE Meldungen werden über `helfer.meldung()` gesetzt. */
.meldung--gut, .erfolgsmeldung { border-color: var(--gut); background: var(--gut-hell); color: var(--gut); }
.meldung--fehler, .fehlermeldung { border-color: var(--schlecht); background: var(--schlecht-hell); color: var(--schlecht); }
.meldung--warnung { border-color: var(--warnung); background: var(--warnung-hell); color: var(--warnung); }

.anmeldekarte__text { color: var(--leise); font-size: var(--s-hinweis); }
.anmeldekarte > .meldung,
.anmeldekarte > .erfolgsmeldung { margin-bottom: var(--a4); }
.konto-seite { width: 100%; }
.konto-seite h2 { margin-top: 0; }
.konto-seite h2 + .bereich-einleitung { margin-top: var(--a2); }

/* Das erste Menue trennt die drei Konto-Bereiche in der Kopfzeile. Diese
   Karten sind die zweite, fachliche Ebene: Sie stehen nebeneinander und
   duerfen deshalb eine eigene Kante tragen (DESIGN_SYSTEM §5.0). Gezeigt
   wird darunter immer genau EIN Inhalt – kein neuer Stapel. */
.konto-auswahl {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: var(--a3);
  margin-bottom: var(--a6);
}
.konto-auswahl--zwei { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.konto-auswahl > a {
  display: flex;
  align-items: center;
  gap: var(--a3);
  min-width: 0;
  padding: var(--a4);
  border: 1px solid var(--linie);
  border-radius: var(--ecke-klein);
  color: var(--text);
  text-decoration: none;
}
.konto-auswahl > a:hover { border-color: var(--akzent); }
.konto-auswahl > a[aria-current="page"] {
  border-color: var(--akzent);
  background: var(--akzent-hell);
  color: var(--akzent);
}
.konto-auswahl svg { flex: 0 0 auto; }
.konto-auswahl span { min-width: 0; }
.konto-auswahl small { display: block; margin-top: var(--a1); color: var(--leise); }
.konto-panel .bereich-einleitung { max-width: 56ch; }
.konto-panel .hinweisband {
  max-width: 64ch;
  padding: var(--a3) var(--a4);
  border-left: 3px solid var(--akzent);
  background: var(--akzent-hell);
}

/* ---------------------------------------------------------------------
   DIE KONTOSEITEN BENUTZEN IHRE BREITE (14.08.2026)
   ---------------------------------------------------------------------
   BEFUND MURAT: „sola dayali sag bos yerlesim amatör" – ein Formular klebte
   links, rechts blieb auf einem 1450px-Schirm eine handbreit leere Fläche.
   Das ist derselbe Befund wie in DESIGN_SYSTEM §5.0, zweite Hälfte: *Nichts
   senkrecht Gestapeltes, wo es nebeneinander passt.*

   DIE ANTWORT IST NICHT, DIE SPALTE ZU ZENTRIEREN. Ein 32rem breites
   Formular mittig auf 1450px lässt links UND rechts leer – das sieht
   aufgeräumter aus und benutzt genauso wenig. `test_der_inhalt_wird_nicht_
   kuenstlich_eingeschnuert` hält genau das fest: „Die Fläche ist da – sie
   soll benutzt werden."

   DIE ANTWORT IST AUCH NICHT, DAS FORMULAR AUF 1450px ZU ZIEHEN. Ein
   Passwortfeld von einem Meter Breite ist schlechter zu treffen und schwerer
   zu lesen als eines von 30rem.

   Die Antwort ist ein ZWEITER INHALT daneben: links die Handlung, rechts
   das, was man währenddessen wissen will – und zwar ECHTE Angaben aus dem
   Konto, keine Fülltexte. Wer nichts Echtes danebenzustellen hat, nimmt
   `--voll` und lässt den Inhalt über die ganze Breite laufen. */
.konto-panel {
  display: grid;
  grid-template-columns: minmax(0, 1.35fr) minmax(0, 1fr);
  gap: var(--a6) var(--a7);
  align-items: start;
}
/* Wo es rechts nichts Echtes danebenzustellen gibt, läuft der Inhalt über
   die ganze Breite – und zwar als gewöhnlicher Fluss. Als einspaltiges
   Raster bekäme JEDER Absatz den Rasterabstand als Zeilenabstand; zwischen
   Überschrift und Einleitung klaffte dann eine Lücke von 2rem, wo eine von
   .5rem hingehört (gemessen 14.08.2026). */
.konto-panel--voll { display: block; }
.konto-panel__kopf { grid-column: 1 / -1; }
.konto-panel__haupt,
.konto-panel__neben { min-width: 0; }
.konto-panel__haupt > :first-child,
.konto-panel__neben > :first-child { margin-top: 0; }

/* Die Nebenspalte. Kein Kasten (DESIGN_SYSTEM §5.0) – EINE Linie links
   trennt so gut wie ein Rahmen und kostet keinen Innenabstand. Auf
   schmalen Schirmen wandert sie unter den Hauptteil und die Linie nach
   oben; sonst hinge eine senkrechte Linie neben nichts. */
.konto-panel__neben {
  padding-left: var(--a5);
  border-left: 1px solid var(--linie);
}
.konto-panel__neben h3 {
  margin: 0 0 var(--a3);
  font-size: var(--s-hinweis);
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: .04em;
  color: var(--leise);
}

/* Angabe und Wert, untereinander. `tabular-nums` steht schon im body – hier
   zählt, dass die Werte linksbündig auf EINER Kante beginnen, sonst liest
   man die Spalte nicht als Spalte. */
.fakten { margin: 0; }
.fakten div {
  display: flex;
  justify-content: space-between;
  gap: var(--a3);
  padding: var(--a2) 0;
  border-bottom: 1px solid var(--linie);
  font-size: var(--s-hinweis);
}
.fakten div:last-child { border-bottom: 0; }
.fakten dt { color: var(--leise); }
.fakten dd { margin: 0; text-align: right; font-weight: 600; }

/* Formulare in der Hauptspalte: kurze Felder nebeneinander statt drei
   Zeilen untereinander. Dieselbe Reihenklasse wie im Profil (§5.3), damit
   es nicht zwei Sorten Formularraster gibt. */
.konto-formular { max-width: 34rem; }
.konto-panel__haupt .konto-formular { max-width: none; }
.konto-formular--abstand { margin-top: var(--a5); }

/* Zwei gleichrangige Handlungen nebeneinander (etwa „neue Codes" und
   „abschalten"). Beide verlangen dasselbe Passwort und standen vorher
   untereinander – zwei fast gleiche Formulare in einer Kolonne liest
   niemand auseinander. */
.zweispalt {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(20rem, 100%), 1fr));
  gap: var(--a5) var(--a7);
  align-items: start;
}
.zweispalt > form { margin: 0; }
.zweispalt h3 { margin: 0 0 var(--a2); font-size: var(--s-h3); }
.zweispalt p { margin: 0 0 var(--a4); color: var(--leise); font-size: var(--s-hinweis); }

/* Wie jemand in Förderbuch erscheint – Bild, Name, Adresse, Verein. Steht
   im Profil neben dem Formular: Wer seinen Namen ändert, will sehen, was
   dabei herauskommt, und nicht raten. */
.identitaet {
  display: flex;
  align-items: center;
  gap: var(--a4);
  margin-bottom: var(--a4);
}
.identitaet__bild {
  display: grid;
  place-items: center;
  flex: 0 0 4.5rem;
  width: 4.5rem;
  height: 4.5rem;
  border: 1px solid var(--linie);
  border-radius: var(--ecke-rund);
  background: var(--akzent-hell);
  object-fit: cover;
  color: var(--akzent);
  font-size: var(--s-zahl);
  font-weight: 700;
}
.identitaet__text { min-width: 0; }
.identitaet__text b { display: block; }
.identitaet__text small {
  display: block;
  color: var(--leise);
  font-size: var(--s-klein);
  overflow-wrap: anywhere;
}

/* Ein Dateifeld ueber die volle Formularbreite sieht aus wie ein Textfeld,
   das nichts tut – gemessen 1225px breit im Profil (14.08.2026). Es ist ein
   Knopf mit einem Dateinamen daneben und bekommt deshalb die Breite, die
   ein Knopf braucht. */
.feld--datei { max-width: 34rem; }
.feld--datei input[type="file"] { padding: var(--a2); height: auto; }

@media (max-width: 64rem) {
  .konto-panel { grid-template-columns: minmax(0, 1fr); }
  .konto-panel__neben {
    padding: var(--a5) 0 0;
    border-left: 0;
    border-top: 1px solid var(--linie);
  }
}

/* Die Wahl zwischen den beiden Arten von zweitem Faktor. Zwei KARTEN und
   kein Stapel Formulare: Sie stehen nebeneinander und brauchen deshalb eine
   eigene Kante (DESIGN_SYSTEM §5.0 – `.block` ist genau dafür da). Wer sie
   untereinander legte, hätte wieder die lange Einstellungsseite, gegen die
   die Kontostruktur gebaut ist.

   Die aktive Karte trägt Akzentkante und Akzentfläche – dieselbe Sprache
   wie der ausgewählte Eintrag in `.konto-auswahl`. Zwei verschiedene Arten,
   „das hier gilt gerade" zu sagen, wären eine zu viel. */
.methodenwahl {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: var(--a4);
  margin: var(--a5) 0 var(--a6);
}
.methode {
  padding: var(--a4);
  border: 1px solid var(--linie);
  border-radius: var(--ecke);
  background: var(--grund);
}
.methode--aktiv { border-color: var(--akzent); background: var(--akzent-hell); }
.methode h3 {
  display: flex;
  align-items: center;
  gap: var(--a2);
  margin: 0;
  font-size: var(--s-h3);
}
/* Der Zustand ist die erste Auskunft, die jemand hier sucht – deshalb steht
   er direkt unter der Überschrift und nicht am Ende der Karte. Er trägt
   ZUSÄTZLICH ein Wort und nicht nur eine Farbe (DESIGN_SYSTEM §3.2). */
.methode__zustand {
  margin: var(--a2) 0 var(--a3);
  font-size: var(--s-klein);
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: .04em;
  color: var(--leise);
}
.methode--aktiv .methode__zustand { color: var(--akzent); }
.methode p { margin: 0 0 var(--a3); }
.methode p:last-child { margin-bottom: 0; }

/* Die beiden Wege, auf denen ein Passkey benutzt werden kann. Eine
   nummerierte Liste und keine zwei Absätze: Die Reihenfolge ist die
   Auskunft („der erste geht immer, der zweite muss man einschalten"). */
.wegliste { padding-left: var(--a5); }
.wegliste li + li { margin-top: var(--a2); }

/* Der zweite Schritt der Anmeldung: EIN Satz, EIN Bedienelement, darunter
   zugeklappt der Notausgang.

   BEFUND MURAT, 14.08.2026: „adam gibi dizayn et, her yer text" – die Seite
   war eine Textwand aus Erklärungen (wie Face ID heisst, wo der
   Fingerabdruck bleibt, dass jeder Code einmal gilt). Alles richtig, alles
   am falschen Ort: Wer hier steht, hat den Daumen über dem Knopf und liest
   nicht. Die Erklärungen stehen im Handbuch, hier steht die Handlung.
   DESIGN_SYSTEM §0a nennt Textwüsten ausdrücklich als Merkmal von „frisch
   zusammengetippt". */
.schritt {
  margin: 0 0 var(--a4);
  font-size: var(--s-h3);
}

/* Der Notausgang. `<details>` statt eigenem Klapp-Code – der Browser bringt
   Zustand, Tastatur und Vorlesbarkeit mit (DESIGN_SYSTEM §5.6). Zugeklappt,
   weil ihn die meisten nie brauchen; wer ihn braucht, findet EINEN Griff
   statt drei Absätze. Kann der Browser kein WebAuthn oder ging etwas schief,
   steht er offen – dann ist er nämlich der einzige Weg. */
.notausgang {
  margin-top: var(--a5);
  padding-top: var(--a4);
  border-top: 1px solid var(--linie);
  text-align: left;
}
.notausgang summary { cursor: pointer; color: var(--akzent); }
.notausgang > *:not(summary) { margin-top: var(--a4); }
.notausgang p { font-size: var(--s-hinweis); color: var(--leise); }
.notausgang form { margin: 0; }

/* Der leise Knopf: derselbe Rahmen, nur zurückgenommene Schrift. Für eine
   Handlung, die man anbieten muss, aber nicht empfiehlt – hier den Code per
   E-Mail. Ein zweiter ausgefüllter Knopf daneben hiesse „nimm mich", und
   genau das soll der Notausgang nicht sagen. */
.knopf--leise { color: var(--leise); font-weight: 400; }
.knopf--leise:hover { color: var(--text); }

.profilbild-auswahl {
  display: flex;
  align-items: center;
  gap: var(--a4);
  margin-bottom: var(--a5);
}
.konto-identitaet__bild {
  display: grid;
  place-items: center;
  flex: 0 0 5rem;
  width: 5rem;
  height: 5rem;
  border: 1px solid var(--linie);
  border-radius: var(--ecke-rund);
  object-fit: cover;
  font-size: var(--s-zahl);
  font-weight: 700;
}
.profilbild-auswahl__datei { flex: 1 1 24rem; margin-bottom: 0; }
.profilbild-auswahl__datei small,
.profil-formular .feld small { display: block; margin-top: var(--a1); color: var(--leise); font-size: var(--s-klein); }
.profilbild-entfernen { margin-top: var(--a3); }

/* ---------------------------------------------------------------------
   ZWEITER FAKTOR (ZP-03)
   --------------------------------------------------------------------- */
/* Der QR-Code bleibt SCHWARZ AUF WEISS, auch im dunklen Design. Das ist
   keine Nachlässigkeit: Ein invertierter QR-Code wird von einem Teil der
   Telefonkameras nicht gelesen, und ein Code, der bei jedem zweiten Verein
   nicht funktioniert, ist schlimmer als kein Code. Deshalb liegt er auf
   einer eigenen weissen Fläche statt auf der Arbeitsfläche. */
.qr-feld {
  display: inline-block;
  padding: var(--a3);
  margin-bottom: var(--a4);
  background: var(--qr-flaeche);
  border: 1px solid var(--linie);
  border-radius: var(--ecke-klein);
}
.qr-feld .qr { display: block; width: 13rem; height: 13rem; }

/* Der abzutippende Schlüssel und die Codes stehen dicktengleich: In einer
   Proportionalschrift sind 8 und B nebeneinander eine Zumutung. */
.geheimnis code,
.codeliste code {
  font-family: ui-monospace, "SF Mono", Menlo, Consolas, monospace;
  font-size: 1.05rem;
  letter-spacing: .06em;
  -webkit-user-select: all;
  user-select: all;
}
.geheimnis {
  padding: var(--a3);
  background: var(--grund);
  border: 1px solid var(--linie);
  border-radius: var(--ecke-klein);
  max-width: 32rem;
  overflow-wrap: anywhere;
}

/* Zwei Spalten, damit die zehn Codes auf einen Blick und auf ein Blatt
   passen; auf schmalen Geräten fällt es von selbst auf eine zurück. */
.codeliste {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(11rem, 1fr));
  gap: var(--a2) var(--a4);
  max-width: 32rem;
  margin: 0 0 var(--a5);
  padding-left: var(--a5);
}
.codeliste li { padding: var(--a1) 0; }

.warnhinweis {
  padding: var(--a3);
  margin-bottom: var(--a4);
  border: 1px solid var(--warnung);
  border-radius: var(--ecke-klein);
  background: var(--warnung-hell);
  color: var(--warnung);
  max-width: 42rem;
}
.hinweis-leise {
  color: var(--leise);
  font-size: var(--s-hinweis);
  max-width: 42rem;
}

/* ---------------------------------------------------------------------
   PASSKEYS (ZP-04)
   --------------------------------------------------------------------- */
/* Name links, Entfernen rechts. Der Entfernen-Knopf steht bewusst am
   Zeilenende und nicht als Symbol am Namen: Ein Zugangsweg, den man
   versehentlich abschaltet, ist ein Anruf beim Betreiber. */
/* Der Passkey-Knopf auf der Anmeldekarte steht UNTER dem Formular und
   braucht Luft dazwischen: Zwei Knöpfe ohne Abstand lesen sich als eine
   Gruppe, und dieser hier ist ein anderer Weg, keine zweite Schaltfläche
   desselben Formulars. */
/* DIE ERKLÄRZEILE DARUNTER IST AM 15.08.2026 ENTFALLEN (Vorgabe Murat).
   „Ohne Passwort – Sie bestätigen an Ihrem Gerät" erklärte den Knopf, auf
   dem das Wort Passkey schon steht. Wer nicht weiss, was ein Passkey ist,
   klickt ihn ohnehin nicht wegen einer Zeile Kleingedrucktem – das erklärt
   das Handbuch, nicht die Anmeldeseite. */
.anmeldekarte .passkey-knopf { margin-top: var(--a3); }

.passkey-liste {
  list-style: none;
  margin: 0 0 var(--a4);
  padding: 0;
  border: 1px solid var(--linie);
  border-radius: var(--ecke-klein);
}
.passkey-liste li {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--a3);
  padding: var(--a3);
}
.passkey-liste li + li { border-top: 1px solid var(--linie); }
.passkey-liste small { display: block; color: var(--leise); font-size: var(--s-klein); }
.passkey-liste form { margin: 0; flex: 0 0 auto; }
/* Der Namensteil darf schrumpfen, der Entfernen-Knopf nicht: Sonst wandert
   bei langen Namen genau der Knopf aus dem Bild, den man sucht.

   DER SELEKTOR NENNT `form` MIT ABSICHT, und das ist der eigentliche Befund
   vom 14.08.2026: Als `.passkey-liste__name` (0,1,0) verlor diese Regel
   gegen `.passkey-liste form` (0,1,1) eine Zeile weiter oben – der
   Namensteil bekam also `flex: 0 0 auto` und schrumpfte nicht. Gemessen:
   Die Zeile wuchs auf 913px in einem 670px breiten Eintrag, der
   Entfernen-Knopf lag ausserhalb des Arbeitsbereichs und der ganze Bereich
   scrollte waagerecht. Der Kommentar stand also da, die Regel wirkte nicht
   – genau die Sorte Fehler, gegen die DESIGN_SYSTEM §7 Wächter statt
   Kommentare verlangt. */
.passkey-liste form.passkey-liste__name {
  display: flex;
  flex: 1 1 auto;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--a2);
  min-width: 0;
}
.passkey-liste__name input { flex: 1 1 10rem; min-width: 0; }
/* `min-width: 0` gehört dazu: Ohne diese Angabe schrumpft ein Flex-Element
   nicht unter seinen längsten unumbrechbaren Inhalt. */
.passkey-liste__name small { flex: 1 1 100%; min-width: 0; }

/* Das Sicherheitsprotokoll: Datum links, Vorgang rechts. Eine Liste, in der
   die Daten nicht untereinander stehen, liest man nicht von oben nach
   unten, sondern sucht in jeder Zeile neu. */
.protokoll {
  list-style: none;
  margin: 0 0 var(--a4);
  padding: 0;
  font-size: var(--s-hinweis);
}
/* Drei Spalten statt einer Flucht: Datum links, Vorgang in der Mitte,
   Angabe rechtsbündig am Ende. Als Flexzeile hingen Vorgang und Angabe
   dicht beieinander links und liessen den Rest der Zeile leer – bei einer
   Liste, die man von oben nach unten überfliegt, ist eine ausgerichtete
   rechte Kante die halbe Lesbarkeit. */
.protokoll li {
  display: grid;
  grid-template-columns: 7rem minmax(0, 1fr) auto;
  align-items: baseline;
  gap: var(--a3);
  padding: var(--a2) 0;
}
.protokoll li + li { border-top: 1px solid var(--linie); }
.protokoll span { color: var(--leise); font-variant-numeric: tabular-nums; }
.protokoll b { font-weight: 400; }
.protokoll small { color: var(--leise); text-align: right; }

@media (max-width: 40rem) {
  .protokoll li { grid-template-columns: minmax(0, 1fr); gap: var(--a1); }
  .protokoll small { text-align: left; }
}

@media (max-width: 30rem) {
  .passkey-liste li { flex-wrap: wrap; }
  .konto-auswahl,
  .konto-auswahl--zwei,
  .methodenwahl { grid-template-columns: 1fr; }
  .profilbild-auswahl { align-items: flex-start; flex-direction: column; }
}

/* `auto-fit` statt vier fester Spalten (gemessen 14.08.2026): Die
   Mindestbreiten summierten sich auf 38rem und sprengten am Telefon die
   ganze Seite – nicht nur das Formular, sondern den Arbeitsbereich, so dass
   ALLES waagerecht scrollte. Mit `auto-fit` und `min(…, 100%)` fällt die
   Reihe von selbst auf eine Spalte, ohne eine zweite Bruchstelle zu pflegen. */
.team-einladen {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(13rem, 100%), 1fr));
  align-items: end;
  gap: var(--a3);
}
.team-einladen .feld { margin-bottom: 0; }
.team-einladen .knopf { align-self: end; }
.zeilenformular { display: flex; align-items: center; gap: var(--a2); }
.zeilenformular select { min-width: 8rem; }
.tabellen-hinweis { display: block; color: var(--leise); font-weight: 400; }
.linkzeile { display: flex; gap: var(--a2); max-width: 56rem; }
.linkzeile input { flex: 1; min-width: 0; }

/* Der frisch erzeugte Einladungslink steht DIREKT unter dem Formular, das
   ihn erzeugt hat (Vorgabe Murat, 15.08.2026) – er braucht dazu Luft nach
   oben, sonst klebt er am „Einladung senden". */
.linkzeile--frisch { margin-top: var(--a5); }

/* Breitere Karte für Formulare mit mehreren Feldern – die Anmeldung selbst
   bleibt schmal, dort sind es zwei. */
.anmeldekarte--breit { max-width: 36rem; }

.anmeldekarte__titel {
  margin: 0 0 var(--a2);
  font-size: var(--s-h2);
  text-align: center;
}

/* PLZ und Ort gehören in eine Zeile: Sie sind EINE Angabe, und getrennt
   untereinander sieht das Formular länger aus, als es ist. */
.feldpaar { display: grid; grid-template-columns: 1fr 2fr; gap: var(--a3); }

.anmeldekarte__hilfe {
  margin: var(--a4) 0 0;
  text-align: center;
  font-size: var(--s-hinweis);
}

.vertrauen {
  margin: var(--a5) 0 0;
  padding-top: var(--a4);
  border-top: 1px solid var(--linie);
  color: var(--leise);
  font-size: var(--s-klein);
  text-align: center;
}

/* ===== §12 SCHMALE SCHIRME ===============================================
   Am Telefon zählen drei Dinge (PLAN_FOERDERBUCH.md §6.0): Beleg hochladen,
   Frist abhaken, Ampel ansehen.

   DIE LEISTE IST HIER EINE SCHUBLADE, KEINE ZEILE (Vorgabe Murat,
   12.08.2026). Vorher wurde sie unter 900px zu einer waagerecht scrollenden
   Zeile über dem Inhalt. Das war ehrlich gemeint – die Navigation ganz
   auszublenden hatte vorher Leute festsitzen lassen –, aber gequetscht: Von
   sieben Einträgen sah man drei, den Rest musste man erwischen, und der
   Organisationsname war weg.

   Jetzt fährt sie von links herein, in voller Höhe, mit allem drin:
   Organisationsname, Bereiche, Person, Abmelden, Version. Geöffnet wird sie
   über den Griff in der Kopfzeile, geschlossen über denselben Griff oder
   einen Tipp auf den Schleier daneben.

   OHNE JAVASCRIPT (Begründung in huelle.html am Schalter). */
/* UNSICHTBAR, ABER NICHT WEG: `display: none` nähme das Ankreuzfeld aus dem
   Tabulatorlauf – dann liesse sich die Schublade mit der Maus öffnen und mit
   der Tastatur gar nicht. So bleibt es bedienbar und zeigt beim Anspringen
   den Rahmen am Griff. */
.leiste__schalter {
  position: absolute;
  width: 1px;
  height: 1px;
  opacity: 0;
  pointer-events: none;
}

.leiste__schleier { display: none; }
.leiste__knopf { display: none; }

@media (max-width: 900px) {
  /* Zurück in den normalen Fluss: Am Telefon soll die SEITE scrollen, nicht
     ein Kasten in der Seite. Ein eigener Scrollbereich schluckt dort die
     Wischgeste zum Aktualisieren und das Einklappen der Adressleiste. */
  .app { grid-template-columns: 1fr; height: auto; overflow: visible; }
  .arbeit { overflow: visible; }

  /* ERST HIER WIRD WAAGERECHT GEROLLT. Auf breiten Schirmen ist der
     Rollbereich weg (§8): Er erzeugte dort Balken unter Listen, die bequem
     hineinpassten. Am Telefon passt eine achtspaltige Tabelle wirklich
     nicht mehr, und ein Rollbalken ist dort die ehrlichere Antwort als
     eine Spalte, die aus dem Bild läuft. */
  .tabellenhuelle { overflow-x: auto; }

  .leiste {
    position: fixed;
    top: 0;
    bottom: 0;
    left: 0;
    z-index: 60;
    width: min(19rem, 84vw);
    height: 100%;
    padding: var(--a5) var(--a3);
    transform: translateX(-100%);
    transition: transform .25s ease;
    box-shadow: var(--schatten-schwebend);
  }

  .leiste__schalter:checked ~ .app .leiste { transform: none; }

  /* DER GRIFF ZUM EINKLAPPEN (§3a) IST HIER WEG. Am Telefon ist die Leiste
     eine Schublade: Sie liegt über dem Inhalt und kostet ihn keinen Punkt,
     solange sie zu ist. Ein Knopf, der etwas schmaler macht, das ohnehin
     nicht im Weg steht, wäre ein Bedienelement ohne Aufgabe – und er sässe
     ausgerechnet neben dem einen Griff, auf den es hier ankommt. */
  .leiste__falten { display: none; }

  /* Der Schleier liegt UNTER der Leiste und ÜBER dem Inhalt. Ohne ihn tippt
     man neben der Schublade auf einen Verweis, den man gar nicht sehen
     wollte. */
  .leiste__schalter:checked ~ .app .leiste__schleier {
    display: block;
    position: fixed;
    inset: 0;
    z-index: 55;
    background: var(--schleier);
  }

  /* Der Griff. Er ist ein <label> und sieht aus wie ein Knopf – deshalb
     bekommt er dieselbe Höhe wie alles andere, was man anfassen kann. */
  /* Am Telefon trägt die Kopfzeile den Griff zur Schublade – sie darf dort
     nicht wegfallen, auch nicht auf der Übersicht. */
  .kopfzeile--leer { display: flex; }

  .leiste__knopf {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: var(--bedienhoehe);
    height: var(--bedienhoehe);
    margin-right: var(--a1);
    border: 1px solid var(--linie);
    border-radius: var(--ecke-klein);
    color: var(--text);
    cursor: pointer;
  }

  .leiste__knopf:hover { border-color: var(--akzent); color: var(--akzent); }

  /* Der Fokus sitzt auf dem unsichtbaren Ankreuzfeld – gezeigt wird er am
     Griff. Ohne diese Zeile springt die Tastatur auf etwas, das man nicht
     sieht. */
  .leiste__schalter:focus-visible + .app .leiste__knopf {
    outline: 2px solid var(--fokus);
    outline-offset: 2px;
  }

  .kopfzeile, .inhalt { padding: var(--a4); }
  .kopfzeile__aktionen { margin-left: auto; }
  .knopf { width: 100%; justify-content: center; }
  .kopfzeile .knopf { width: auto; }
  /* NICHT IN EINER TABELLENZEILE (Befund Murat, 20.08.2026: „alta gecmesin
     bide yan yana kalsin"). Auf schmalen Bildschirmen ist ein Knopf ueber
     die volle Breite richtig – in einer Aktionsspalte aber stapeln sich
     dadurch zwei Symbole untereinander und fuellen die halbe Zeile. */
  .tabelle .knopf { width: auto; }
}


/* ===== §12a FORMULARE: EINE GRÖSSE, EINE REIHE ==========================
   REGEL (Vorgabe Murat, 12.08.2026): Bedienelemente, die untereinander oder
   nebeneinander stehen, sind GLEICH GROSS. Ein Auswahlfeld über die ganze
   Breite und darunter zwei halbe Eingabefelder sieht aus wie zwei
   verschiedene Formulare – und genau so hat es ausgesehen.

   Umgesetzt über EINE Reihenklasse statt über Sonderbreiten je Feld:
   `.feldreihe` verteilt gleichmässig, egal wie viele Felder drin stehen. Wer
   ein Feld ergänzt, bekommt automatisch dieselbe Grösse; wer eine Breite von
   Hand setzt, bricht die Regel sichtbar. */
.feldreihe {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
  gap: var(--a3);
  /* `end` STAND HIER UND WAR FALSCH (gemessen 14.08.2026): Trägt ein Feld
     einen Hinweis unter sich und das andere nicht, schiebt `end` das kürzere
     nach unten – dann stehen die beiden BESCHRIFTUNGEN versetzt, und genau
     die liest man zuerst. `start` richtet oben aus; die Bedienelemente
     bleiben trotzdem auf einer Linie, weil sie seit v0.9.0 dieselbe feste
     Höhe haben (`--bedienhoehe`, §5.3). Ein Hinweis darf nach unten
     hängen – eine Beschriftung nicht. */
  align-items: start;
}

/* Eingabefeld und Auswahlfeld MÜSSEN gleich hoch sein – und zwar genauso
   hoch wie der Knopf daneben. Alle drei holen sich dafür DENSELBEN Wert
   (--bedienhoehe in index.css §2).

   WARUM `min-height` NICHT GEREICHT HAT (Befund 12.08.2026, gemessen im
   Browser): Ein <select> mit `appearance: menulist` rechnet seine Höhe aus
   der Schrift des Betriebssystems und nimmt `min-height` je nach Browser
   nur als Untergrenze für den INHALT. Ergebnis war genau das, was auf dem
   Bildschirm zu sehen war: ein dünnes Auswahlfeld neben einem hohen Knopf.
   Deshalb wird die Zeichnung abgeschaltet (`appearance: none`), die Höhe
   fest gesetzt – und der Pfeil selbst gezeichnet.

   DER PFEIL IST ZWEI VERLÄUFE, KEIN BILD. Ein eingebettetes SVG bräuchte
   einen festen Farbwert; damit stünde eine Farbe ausserhalb von index.css
   und das dunkle Design hätte einen schwarzen Pfeil auf dunklem Grund.
   `currentColor` erbt dagegen die Textfarbe und stimmt in beiden Designs. */
/* DIESE REGEL HÄNGT AUSDRÜCKLICH NICHT AN `.feld` (Befund Murat, 13.08.2026,
   am dunklen Bildschirm): Das Feld „Grund" in der Stellenliste stand ohne
   umschliessendes `.feld` da – und leuchtete im dunklen Design als WEISSER
   Kasten. Kein Farbfehler: Ein Bedienelement ohne eigene Regel nimmt die
   Zeichnung des Browsers, und die kennt nur hell.

   DAS IST DIE GANZE PRÄMISSE DES DESIGN-SYSTEMS, an einem Beispiel: Ein
   Element, das durchrutscht, ist nicht ein bisschen anders – es hat ein
   Design weniger. Deshalb steht die Grundzeichnung an der ART des Elements
   und nicht an einer Klasse, die jemand vergessen kann.

   Ausgenommen bleiben Ankreuz- und Auswahlkästchen: Sie sind Schalter, keine
   Eingabefelder, und eine feste Höhe würde sie verzerren. */
input[type="text"],
input[type="search"],
input[type="url"],
input[type="email"],
input[type="password"],
input[type="date"],
input[type="number"],
input[type="tel"],
select {
  height: var(--bedienhoehe);
  padding: var(--a2) var(--a3);
  border: 1px solid var(--linie);
  border-radius: var(--ecke-klein);
  background-color: var(--grund);
  color: var(--text);
  font: inherit;
}

/* DAS MEHRZEILIGE FELD GEHOERT IN DIESELBE REGEL - nur ohne feste Hoehe,
   die waere hier das Gegenteil von mehrzeilig. Es steht getrennt und nicht
   in der Liste oben, damit `height` nicht mitkommt. Ohne diese Regel naehme
   es die Zeichnung des Browsers und leuchtete im dunklen Design als weisser
   Kasten - genau der Befund vom 13.08.2026 am Feld "Grund". */
textarea {
  width: 100%;
  padding: var(--a2) var(--a3);
  border: 1px solid var(--linie);
  border-radius: var(--ecke-klein);
  background-color: var(--grund);
  color: var(--text);
  font: inherit;
  resize: vertical;
}

/* Auch der Platzhalter bekommt einen benannten Wert. Ohne diese Zeile
   mischt ihn der Browser selbst aus der Textfarbe – in beiden Designs
   anders, und in keinem von beiden nachprüfbar. */
::placeholder { color: var(--leise); opacity: 1; }

/* Im `.feld` nimmt ein Bedienelement die ganze Breite – dort steht es unter
   seiner Beschriftung und nicht neben etwas anderem. */
.feld input,
.feld select {
  width: 100%;
  height: var(--bedienhoehe);
  padding: var(--a2) var(--a3);
  border: 1px solid var(--linie);
  border-radius: var(--ecke-klein);
  background-color: var(--grund);
  color: var(--text);
  font: inherit;
}

/* Mehrzeilige Felder dürfen wachsen – die feste Höhe gilt nur für die
   einzeiligen Bedienelemente. */
.feld input[type="checkbox"],
.feld input[type="radio"] { width: auto; height: auto; }

.feld select {
  appearance: none;
  -webkit-appearance: none;
  padding-right: var(--a6);
  background-image:
    linear-gradient(45deg, transparent 50%, currentColor 50%),
    linear-gradient(135deg, currentColor 50%, transparent 50%);
  background-position: right 1.05rem center, right var(--a3) center;
  background-size: .34rem .34rem;
  background-repeat: no-repeat;
}

/* ===== §12b AUFKLAPPBARE ABSCHNITTE =====================================
   <details>/<summary> statt eigener Klapp-Logik: Der Browser bringt Zustand,
   Tastaturbedienung und Vorlesbarkeit mit. Eigener Code dafür wäre mehr
   Zeilen und weniger Barrierefreiheit.

   HIER LIEGT DIE KLAPPE, UND ZWAR NUR HIER. In v0.30.0 ist danebenher eine
   ZWEITE `.klapp` entstanden (damals §14c), weil die Verwaltung „etwas zum
   Aufklappen in der Seite" brauchte – und niemand nachgesehen hat, dass das
   Förderprofil genau das seit Langem benutzt. Zwei Definitionen desselben
   Namens in einer Datei sind kein Schönheitsfehler: Die spätere überschreibt
   Teile der früheren (hier `margin-bottom`), und die Seite, die sich ändert,
   ist nicht die, an der man gearbeitet hat. `test_die_klappe_ist_ein_bauteil`
   hält fest, dass es bei einer Definition bleibt.

   WAS DIE VERWALTUNG WIRKLICH BRAUCHTE, war kein zweites Bauteil, sondern
   dieses hier – plus `.klapp__tat` für den einen Griff, der nichts
   aufklappt, sondern sofort losläuft. */
.klapp {
  background: var(--grund);
  border: 1px solid var(--linie);
  border-radius: var(--ecke);
  margin-bottom: var(--a4);
  overflow: hidden;
}

.klapp__kopf {
  display: flex;
  align-items: center;
  gap: var(--a3);
  padding: var(--a4);
  cursor: pointer;
  font-weight: 600;
  list-style: none;
}

.klapp__kopf::-webkit-details-marker { display: none; }
.klapp__kopf:hover { background: var(--papier); }
.klapp__kopf small { margin-left: auto; color: var(--leise); font-weight: 400; }
.klapp__pfeil { color: var(--leise); transition: transform .15s; }
.klapp[open] > .klapp__kopf > .klapp__pfeil { transform: rotate(90deg); }

.klapp__inhalt {
  padding: 0 var(--a4) var(--a4);
  border-top: 1px solid var(--linie);
  padding-top: var(--a4);
}

/* EIN GRIFF, DER NICHTS AUFKLAPPT, sondern nach einer Bestätigung sofort
   losläuft („Alle Fundstellen aktualisieren"). Er trägt dieselbe Zeilenform
   wie die Klappen daneben; Titel und Unterzeile erklären die Handlung. */
.klapp__tat {
  display: flex;
  align-items: center;
  gap: var(--a3);
  width: 100%;
  margin-bottom: var(--a4);
  padding: var(--a4);
  border: 1px solid var(--linie);
  border-radius: var(--ecke);
  background: var(--grund);
  color: var(--text);
  font: inherit;
  font-weight: 600;
  text-align: left;
  cursor: pointer;
}

.klapp__tat:hover { background: var(--papier); }

/* ===== DIE GRIFFE: KNÖPFE OBEN, GENAU EIN INHALT DARUNTER ================
   VORGABE MURAT (13.08.2026): „förderradar ayarlarini menü gibi üst
   kisimlara tus olarak koy, alt tarafta bastikca acilsinlar."

   Sechs Zeilen über die volle Breite waren eine Liste, obwohl es Werkzeuge
   sind – man greift eines heraus, man arbeitet sie nicht ab. Als Knopfreihe
   sieht man auf einen Blick, WAS es gibt; das Aufgeklappte gehört darunter,
   wo Platz ist.

   Die Grundform bleibt eine normale senkrechte <details>-Liste. Erst wenn
   cockpit.js die sichtbaren Ersatzgriffe gebaut hat, setzt
   `.mit-griffleiste` das eine offene Blatt unter die Leiste. Diese
   progressive Form ist absichtlich: Lädt das Skript nicht, bleibt jedes
   Feld erreichbar statt hinter wirkungslosen Knöpfen zu verschwinden. */
.griffleiste {
  display: flex;
  flex-wrap: wrap;
  align-items: stretch;
  gap: var(--a2);
  margin-bottom: var(--a2);
}

.griffleiste__knopf {
  display: flex;
  align-items: center;
  flex: 1 1 9rem;
  min-width: 0;
  min-height: var(--bedienhoehe);
  padding: var(--a3) var(--a4);
  border: 1px solid var(--linie);
  border-radius: var(--ecke-klein);
  background: var(--grund);
  color: var(--text);
  font: inherit;
  font-weight: 600;
  cursor: pointer;
}

.griffleiste__knopf:hover { background: var(--papier); }

.klapp__name {
  display: block;
  min-width: 0;
  text-align: left;
}

.klapp__titel {
  display: flex;
  align-items: center;
  gap: var(--a2);
}

.klapp__name small {
  display: block;
  margin-top: var(--a1);
  color: var(--leise);
  font-size: var(--s-klein);
  font-weight: 400;
  line-height: 1.25;
}

/* Auswahl wird mit Fläche UND Rahmen gezeigt, nicht nur mit Farbe. */
.griffleiste__knopf[aria-expanded="true"] {
  border-color: var(--akzent);
  background: var(--akzent-hell);
  color: var(--akzent);
}

.mit-griffleiste > .klapp { display: none; }
.mit-griffleiste > .klapp[open] {
  display: block;
  margin: 0;
  border: 0;
  border-radius: 0;
  background: transparent;
  overflow: visible;
}
.mit-griffleiste > .klapp > .klapp__kopf { display: none; }
.mit-griffleiste > .klapp > .klapp__inhalt {
  border-top: 0;
  padding: var(--a5) 0 0;
}

/* Die Tat („Alle Fundstellen aktualisieren") ist immer ein Knopf und wird
   nie zum Block – sie hat nichts aufzuklappen. */
.griffleiste > form { flex: 1 1 9rem; min-width: 0; margin: 0; }
.griffleiste .klapp__tat { width: 100%; height: 100%; margin: 0; }

/* Bestätigungen sind Entscheidungen, keine schwebenden Informationskarten.
   Das native <dialog> bringt Fokusfang, Escape und Vorlesbarkeit mit. */
/* GEGEN DEN ABGESCHNITTENEN TEXT (Befund Murat, 22.08.2026): Der Dialog lag
   in einer Tabellenzelle und übernahm deren `white-space: nowrap` – der Satz
   lief in EINER Zeile aus dem Kasten heraus, samt Rollbalken. Ein Dialog
   erbt hier nichts mehr; die Breite steht in FENSTERBREITEN und nicht in
   Prozent, weil ein modaler Dialog seinen Bezugsrahmen wechselt.

   BIS v0.99.5 STAND DAS IN EINEM ZWEITEN BLOCK direkt darunter – mit einer
   zweiten, widersprüchlichen `width`. Welche galt, entschied die
   Reihenfolge in der Datei und nicht eine Überlegung. */
.bestaetigung {
  width: min(34rem, calc(100vw - 2rem));
  padding: var(--a5);
  border: 1px solid var(--linie);
  border-radius: var(--ecke);
  background: var(--grund);
  color: var(--text);
  white-space: normal;
  overflow-wrap: anywhere;
  /* Auch die Ausrichtung wird geerbt: Im Papierkorb steht der Dialog in
     einer Tabellenzelle, und deren Zentrierung machte aus zwei Sätzen ein
     Gedicht. Ein Fliesstext liest sich links. */
  text-align: left;
}

.bestaetigung::backdrop { background: var(--schleier); }

/* Die Vorlagen benutzen BEIDE Namen. Statt drei Vorlagen umzubenennen (und
   die vierte zu vergessen) gilt die Regel für beide. */
.bestaetigung__aktionen {
  display: flex;
  justify-content: flex-end;
  gap: var(--a2);
  flex-wrap: wrap;
}
.bestaetigung h2 { margin: 0 0 var(--a3); font-size: var(--s-h2); }
.bestaetigung p { margin: 0 0 var(--a4); color: var(--leise); }
.bestaetigung__taten {
  display: flex;
  justify-content: flex-end;
  gap: var(--a2);
  flex-wrap: wrap;
}

/* ===== §12c ABGELEITETE ANGABEN =========================================
   Kreis, Bundesland und Gemeindeschlüssel werden aus der Postleitzahl
   ERMITTELT. Sie stehen als Anzeige da, nicht als Feld: Sie sollen
   nachvollziehbar sein („stimmt das?"), aber niemand soll sie eintippen
   müssen – kaum jemand kennt seinen Kreis. */
.standort { margin-bottom: var(--a4); }

.abgeleitet {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
  gap: var(--a3);
  margin-top: var(--a3);
  padding: var(--a3) var(--a4);
  background: var(--papier);
  border-radius: var(--ecke-klein);
}

.abgeleitet__wert span {
  display: block;
  color: var(--leise);
  font-size: var(--s-klein);
}

.abgeleitet__wert b { font-size: var(--s-hinweis); }

/* ===== §13 REITER, LEERZUSTAND, HINWEISBAND =============================
   Nachgetragen am 12.08.2026 nach dem ersten Durchsehen der Oberfläche.
   Der Befund war nicht „hässlich", sondern: Man sah nicht, WO die Projekte
   sind, WIE man eins anlegt und WO die alten bleiben. Diese drei Bauteile
   beantworten genau das. */

/* Reiter zeigen auch die Bereiche, in denen man gerade NICHT ist. Ein
   Auswahlfeld täte dasselbe und verstecke die Information hinter einem
   Klick – „Abgeschlossen (0)" zu sehen ist die halbe Antwort. */
/* KEIN ROLLBEREICH AUF BREITEN SCHIRMEN – dieselbe Falle wie bei den
   Tabellen (§8): `overflow-x: auto` hebt auch die senkrechte Achse auf
   `auto`, und mit klassischen Rollbalken halten sich die beiden Balken
   gegenseitig am Leben. Unter zwei Reitern stand deshalb ein Balken.
   Wird es wirklich eng, wird umbrochen – untereinander sind Reiter lesbar,
   halb abgeschnitten nicht. */
.reiter {
  display: flex;
  flex-wrap: wrap;
  gap: var(--a1);
  border-bottom: 1px solid var(--linie);
}

.reiter__eintrag {
  padding: var(--a2) var(--a4);
  border-bottom: 2px solid transparent;
  margin-bottom: -1px;
  color: var(--leise);
  text-decoration: none;
  font-size: var(--s-hinweis);
  font-weight: 600;
  white-space: nowrap;
}

.reiter__eintrag[aria-selected="true"] {
  color: var(--text);
  border-bottom-color: var(--akzent);
}

.reiter__zahl { color: var(--leise); font-weight: 400; }

/* DIE REITER IN DER KOPFZEILE. Sie nehmen die volle Breite und ROLLEN NICHT:
   Ein Rollbalken unter fünf Reitern (Befund Murat, 13.08.2026) schneidet den
   letzten an und sieht aus wie ein Fehler. In der Kopfzeile ist Platz – die
   Reiter müssen ihn nur nehmen dürfen.

   KEIN eigener Unterstrich: Die Kopfzeile bringt ihren eigenen mit, und zwei
   Linien im Abstand von zwei Pixeln liest man als Fehler, nicht als
   Gestaltung. Wird es wirklich eng, wird umbrochen – untereinander sind sie
   lesbar, halb abgeschnitten nicht. */
.reiter--kopf {
  flex: 1 1 100%;
  flex-wrap: wrap;
  border-bottom: 0;
  overflow: visible;
  gap: var(--a1) var(--a2);
}

.reiter--kopf .reiter__eintrag {
  padding: var(--a2) var(--a3);
  border-bottom: 0;
  margin-bottom: 0;
  border-radius: var(--ecke-klein);
  font-size: var(--s-text);
}

.reiter--kopf .reiter__eintrag:hover {
  color: var(--text);
  background: var(--papier);
}

/* Fläche UND Farbe, nicht nur Farbe: Ohne Unterstrich ist der Farbunterschied
   zwischen zwei Grautönen auf einem schlechten Bildschirm keiner
   (DESIGN_SYSTEM §3.2). */
.reiter--kopf .reiter__eintrag[aria-selected="true"] {
  color: var(--akzent);
  background: var(--akzent-hell);
}

.leer__sym { color: var(--leise); margin-bottom: var(--a3); }
.leer h2 { margin: 0 0 var(--a2); font-size: var(--s-h2); color: var(--text); }
.leer p { max-width: 34rem; margin: 0 auto var(--a5); }

/* Das Band über den Vorschauseiten. Es steht ÜBER dem Inhalt, nicht darunter:
   Wer eine Seite mit erfundenen Zahlen sieht, soll das erfahren, bevor er die
   Zahlen liest.

   SEIT C27 TRÄGT ES DER DEMOMANDANT, und zwar in der HÜLLE über jedem
   Inhalt (`organisationen.ist_demo`). Diese Definition stand hier schon und
   wurde von keiner Vorlage mehr benutzt; ein zweites Bauteil danebenzubauen
   hätte die erste an einer Stelle überschrieben, die niemand sucht – genau
   das, was `test_design_system` verhindert. Der Warnton bleibt: Ein Band,
   das in der Farbe des Hintergrunds gehalten ist, wird nach dem dritten
   Bildschirm nicht mehr gelesen, und wer einen Demobildschirm
   abfotografiert, hätte sonst eine Zusage in der Hand, die es nie gab. */
.demoband {
  display: flex;
  align-items: flex-start;
  gap: var(--a3);
  margin: 0 0 var(--a4);
  padding: var(--a3) var(--a4);
  border: 1px solid var(--linie);
  border-left: 3px solid var(--warnung);
  border-radius: 0 var(--ecke-klein) var(--ecke-klein) 0;
  background: var(--warnung-hell);
  color: var(--text);
  font-size: var(--s-hinweis);
}

.demoband .sym { color: var(--warnung); margin-top: .15em; }

/* Ankreuzfelder in Spalten: zwölf Themen untereinander wären eine Kolonne,
   die niemand ueberblickt. Nebeneinander sieht man die Auswahl als Ganzes.

   ALLE Ankreuzgruppen mehrspaltig, nicht nur die erste: Ein Block in zwei
   Spalten und der naechste in einer sieht aus, als haette jemand vergessen,
   ihn fertigzumachen.

   Das stand bis v0.30.1 in ZWEI `.haken`-Bloecken, 20 Zeilen auseinander –
   der zweite trug das Raster nach. Zusammengelegt, weil eine zweite
   Definition desselben Bauteils frueher oder spaeter die erste an einer
   Stelle ueberschreibt, die niemand sucht (test_design_system). */
.haken {
  border: 0;
  margin: 0 0 var(--a5);
  padding: 0;
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(230px, 1fr));
  gap: 0 var(--a4);
}

.haken legend {
  padding: 0;
  margin-bottom: var(--a2);
  font-size: var(--s-hinweis);
  font-weight: 600;
  grid-column: 1 / -1;
}

.haken__eintrag {
  display: flex;
  align-items: center;
  gap: var(--a2);
  padding: var(--a1) 0;
  font-size: var(--s-hinweis);
}

.fussnote {
  display: flex;
  align-items: flex-start;
  gap: var(--a3);
  margin: 0;
  color: var(--leise);
  font-size: var(--s-hinweis);
}

/* ===== §14 WERKZEUGE UND FUNDSTELLEN ====================================
   REGEL (Vorgabe Murat, 12.08.2026): KEINE KÄSTEN IM KASTEN und nichts
   senkrecht Gestapeltes, wo es nebeneinander passt.

   Vorher stand hier drei Mal `.block` – ein gerahmter Kasten je Abschnitt,
   untereinander, innerhalb des ohnehin schon abgesetzten Arbeitsbereichs.
   Das ergibt drei Rahmen für einen Gedanken und eine Seite, die man scrollen
   muss, um zwei Formulare zu sehen, die zusammengehören.

   Jetzt: die beiden Werkzeuge NEBENeinander, getrennt von genau einer Linie,
   flach auf der Seite. Die Linie trennt so gut wie ein Rahmen und kostet
   keinen Innenabstand. */
/* NICHT 1fr 1fr: Links steht ein Auswahlfeld und ein Knopf, rechts stehen
   vier Felder und ein Knopf. Zwei gleich breite Spalten bedeuten, dass die
   rechte umbricht, während die linke halb leer danebensteht. */
.werkzeuge {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 1.4fr);
  gap: var(--a6);
  padding-bottom: var(--a5);
  border-bottom: 1px solid var(--linie);
}

/* EIN EINZELNES WERKZEUG NIMMT BEIDE SPALTEN. Ohne diese Zeile stand es in
   der ersten von zwei Spalten (1fr von 2,4fr) – also auf 40 % der Breite,
   mit leerer Fläche daneben. Genau daran brach die Zeile „Verein ·
   Rechtsform · E-Mail · Name" auf zwei Reihen um, obwohl Platz da war
   (Befund Murat, 13.08.2026: „email name ye rechtsform kisminin sagina koy").

   `:only-child` statt einer Zusatzklasse: Eine Klasse müsste beim Ergänzen
   des zweiten Werkzeugs wieder entfernt werden, und das ist die Zeile, die
   man vergisst. Der Browser weiss selbst, ob eines oder zwei dastehen. */
.werkzeuge > .werkzeug:only-child { grid-column: 1 / -1; }

/* Die Trennlinie sitzt am ZWEITEN Feld, nicht als eigenes Element: Ein
   Trenner-<div> müsste bei jedem Umbruch mitgedacht werden, ein Rand
   verschwindet von selbst, sobald die Spalten untereinander stehen. */
.werkzeuge > .werkzeug + .werkzeug {
  padding-left: var(--a6);
  border-left: 1px solid var(--linie);
}

.werkzeug h2 { margin: 0 0 var(--a4); font-size: var(--s-h3); }
.werkzeug .fussnote { margin-bottom: var(--a4); }
.werkzeug form { margin: 0; }
.werkzeug .feldreihe { margin-bottom: var(--a3); }
.werkzeug .haken__eintrag { margin-bottom: var(--a3); }

/* DER KNOPF STEHT NEBEN DEM FELD, NICHT DARUNTER (Vorgabe Murat,
   12.08.2026). Ein Formular aus einem Auswahlfeld und einem Knopf ist EINE
   Zeile; untereinander sah es aus wie zwei Arbeitsschritte, von denen der
   zweite noch aussteht.

   `align-items: end` setzt den Knopf auf dieselbe Grundlinie wie das Feld –
   über ihm sitzt keine Beschriftung, ohne diese Zeile stünde er oben.
   `flex-wrap` ist der Rückfall für schmale Schirme: Dort bricht der Knopf um,
   statt das Feld auf zwei Zentimeter zu quetschen. */
.werkzeug__zeile {
  display: flex;
  flex-wrap: wrap;
  align-items: end;
  gap: var(--a3);
  margin-bottom: var(--a3);
}

.werkzeug__zeile:last-child { margin-bottom: 0; }
.werkzeug__zeile .feld { margin-bottom: 0; flex: 1 1 10rem; }
.werkzeug__zeile .feld--schmal { flex: 0 1 9.5rem; }
/* Das Gegenstueck: ein Feld, das den Rest der Zeile nimmt. Der Grund einer
   Einsicht ist ein SATZ – in 10rem sieht man davon vier Woerter, und was man
   nicht liest, prueft man auch nicht. */
.werkzeug__zeile .feld--breit { flex: 3 1 20rem; }
.werkzeug__zeile .knopf { flex: 0 0 auto; }

/* Das (i) neben einer Feldbeschriftung. Es öffnet auf Zeigen UND auf
   Tastaturfokus – eine Auskunft, die nur die Maus erreicht, ist für einen
   Teil der Leute gar nicht da.

   WARUM OHNE JAVASCRIPT: Ein Klapptext, der an einem Skript hängt, ist genau
   dann leer, wenn das Skript nicht geladen hat. `:hover`/`:focus-within`
   kostet vier Zeilen und kann nicht ausfallen. */
.hinweisblase {
  position: relative;
  display: inline-flex;
  vertical-align: middle;
  margin-left: var(--a1);
  cursor: help;
}

.hinweisblase__zeichen {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 1.05rem;
  height: 1.05rem;
  border: 1px solid var(--linie);
  border-radius: var(--ecke-klein);
  color: var(--leise);
  font-size: .7rem;
  font-weight: 700;
  font-style: normal;
}

.hinweisblase:hover .hinweisblase__zeichen,
.hinweisblase:focus-within .hinweisblase__zeichen {
  border-color: var(--akzent);
  color: var(--akzent);
}

.hinweisblase__inhalt {
  position: absolute;
  z-index: 20;
  top: calc(100% + var(--a2));
  left: -.5rem;
  display: none;
  width: min(30rem, 78vw);
  max-height: 22rem;
  overflow-y: auto;
  padding: var(--a4);
  border: 1px solid var(--linie);
  border-radius: var(--ecke);
  background: var(--grund);
  box-shadow: var(--schatten-schwebend);
  color: var(--leise);
  font-size: var(--s-hinweis);
  font-weight: 400;
  line-height: 1.5;
  white-space: normal;
}

.hinweisblase:hover .hinweisblase__inhalt,
.hinweisblase:focus-within .hinweisblase__inhalt { display: block; }

/* Vierunddreissig Namen als Fliesstext wären ein Absatz. Als Spalten sind sie
   eine Liste, in der man die eigene Behörde SUCHEN kann. */
.hinweisblase__liste {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(13rem, 1fr));
  gap: 2px var(--a4);
  margin: var(--a3) 0;
  color: var(--text);
  font-size: var(--s-klein);
}

.hinweisblase__liste em { color: var(--leise); font-style: normal; }

/* `.sortkopf` STAND BIS v0.99.6 HIER – ohne einen einzigen Benutzer in den
   Vorlagen. Sie ist zu §8b gewandert, dorthin, wo die Tabelle steht, zu der
   sie gehört. Ihre zwei guten Gedanken sind mitgegangen: der Pfeil steht
   IMMER da (auch als „nicht sortiert"), und der Zustand hängt an
   `aria-sort` am <th> statt an einer zweiten Klasse – die Auszeichnung, die
   das Vorlesegerät ohnehin braucht, färbt damit gleich den Pfeil. */

/* Das Blätterwerk unter der Liste. Zahlen, keine Pfeile: Wer auf Seite 6
   etwas gesehen hat, kommt mit „weiter/zurück" nur durch Zählen dorthin.

   DREI SPALTEN, DAMIT DIE ZAHLEN WIRKLICH MITTIG STEHEN (Vorgabe Murat,
   12.08.2026): Die Auskunft „7 von 54" sitzt rechts DANEBEN und nicht mehr
   als eigene Zeile darunter. Ohne den leeren Platzhalter links stünden die
   Ziffern in der Mitte des Restplatzes – also sichtbar zu weit links. */
.blaettern {
  display: grid;
  grid-template-columns: 1fr auto 1fr;
  align-items: center;
  gap: var(--a3);
  margin-top: var(--a4);
}

.blaetter {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: center;
  gap: var(--a1);
}

.blaetter__seite {
  min-width: 2.2rem;
  padding: var(--a1) var(--a2);
  border: 1px solid var(--linie);
  border-radius: var(--ecke-klein);
  color: var(--text);
  text-align: center;
  text-decoration: none;
  font-size: var(--s-hinweis);
  font-variant-numeric: tabular-nums;
}

.blaetter__seite:hover { border-color: var(--akzent); color: var(--akzent); }

.blaetter__seite--hier {
  background: var(--akzent);
  border-color: var(--akzent);
  color: var(--grund);
  font-weight: 600;
}

.blaetter__seite--hier:hover { color: var(--grund); }
.blaetter__luecke { color: var(--leise); padding: 0 var(--a1); }

/* „7 von 54" steht auch dann da, wenn es nur eine Seite gibt: Die Frage
   „sehe ich gerade alles?" stellt sich bei jeder gefilterten Liste. */
.blaetter__zahl {
  margin: 0;
  color: var(--leise);
  font-size: var(--s-hinweis);
  text-align: right;
}

/* DER FILTER KOSTET KEINE ZEILE MEHR (Vorgabe Murat, 12.08.2026).
   Vorher stand er als `.filterzeile` quer über die Seite: drei
   Bedienelemente, immer sichtbar, auch wenn gerade niemand filtert. Jetzt
   sitzt er als <details> in der Kopfzeile und klappt bei Bedarf auf – als
   Blatt ÜBER dem Inhalt, damit sich beim Öffnen nichts verschiebt. */
.filter,
.menue { position: relative; }

/* Die Auslösekante sieht aus wie ein Knopf (`.knopf` in der Vorlage); hier
   wird nur das Dreieck abgeschaltet, das <summary> von sich aus mitbringt. */
.filter > summary,
.menue > summary { list-style: none; user-select: none; }
.filter > summary::-webkit-details-marker,
.menue > summary::-webkit-details-marker { display: none; }
.filter[open] > summary,
.menue[open] > summary { border-color: var(--akzent); color: var(--akzent); }

/* Die Zahl am Griff eines Menues sagt, wie viel dahinter liegt; das rote
   Kleingedruckte, dass eine Entscheidung darunter ist (verworfene Stellen).
   Ein Menue, das seinen Inhalt verschweigt, wird nicht geoeffnet. */
.menue > summary small { color: var(--warnung); font-weight: 400; }

/* Die Zahl sagt, WIE VIELE Filter gerade greifen. Ein zugeklappter Filter,
   der still etwas wegfiltert, ist der sicherste Weg zu „wo sind meine Daten
   hin" (DESIGN_SYSTEM §13). */
.filter__zahl {
  min-width: 1.3rem;
  padding: 0 .3rem;
  border-radius: var(--ecke-klein);
  background: var(--akzent);
  color: var(--grund);
  font-size: var(--s-klein);
  text-align: center;
}

/* ===========================================================================
   DER FILTERSTREIFEN (Vorgabe Murat, 20.08.2026)
   ===========================================================================
   Er steht OFFEN ueber der Liste, statt als Blatt am Knopf zu haengen. Der
   Grund ist kein Geschmack: Das Blatt lief auf breiten Bildschirmen ueber
   den rechten Rand hinaus, und was rechts hinausragt, kann man nicht
   heranrollen - es ist einfach weg.

   EINE ZEILE, WENN SIE REICHT, sonst mehrere: `flex-wrap` statt fester
   Spalten. Ein Raster mit vier Spalten waere auf dem Telefon vier
   Guckloecher; so wird es dort untereinander und hier nebeneinander.

   `align-items: end` richtet die Felder an ihrer UNTERKANTE aus - die
   Beschriftungen darueber sind verschieden hoch, die Eingabefelder sollen
   trotzdem auf einer Linie stehen. */
.filterstreifen {
  display: flex;
  flex-wrap: wrap;
  align-items: end;
  gap: var(--a3) var(--a4);
  padding: var(--a4) 0 var(--a5);
  border-bottom: 1px solid var(--linie);
  margin-bottom: var(--a4);
}
/* Die Felder duerfen wachsen, aber nicht ausufern: Ein Suchfeld ueber die
   halbe Seite sieht aus wie das einzige Bedienelement der Seite. */
.filterstreifen .feld { flex: 1 1 14rem; max-width: 22rem; margin: 0; }
.filterstreifen .haken__eintrag { flex: 0 1 auto; padding-bottom: var(--a2); }
/* Die Knoepfe ganz nach rechts - sie schliessen den Streifen ab. */
.filterstreifen .filter__tat { margin-left: auto; display: flex;
                               gap: var(--a2); }

/* DAS BLATT SCHWEBT, ES SCHIEBT NICHT (Vorgabe Murat, 13.08.2026: „aber sie
   sollen sich nicht nach unten aufklappen"). Ein Abschnitt, der beim Oeffnen
   den Inhalt nach unten druckt, verschiebt genau die Zeile, die man gerade
   gelesen hat. Als absolut liegendes Blatt ueber der Seite bleibt darunter
   alles, wo es war - dieselbe Bauform wie beim Filter, nur breiter. */
.filter__blatt,
.menue__blatt {
  position: absolute;
  z-index: 30;
  top: calc(100% + var(--a2));
  right: 0;
  width: min(24rem, 90vw);
  padding: var(--a4);
  border: 1px solid var(--linie);
  border-radius: var(--ecke);
  background: var(--grund);
  box-shadow: var(--schatten-schwebend);
  text-align: left;
}

/* DIE GROSSEN MENUES: Werkzeuge, Stellen und Muster sind Tabellen und
   Formulare, keine drei Zeilen. In 24rem waeren sie ein Guckloch.
   `max-height` samt eigenem Rollbereich haelt sie trotzdem auf dem Schirm -
   ein Blatt, das laenger ist als das Fenster, hat kein Ende, das man
   erreicht. */
/* DAS BREITE BLATT HAENGT AN DER KOPFZEILE, NICHT AM KNOPF. Dafuer gibt das
   Menue selbst seinen Bezugsrahmen ab (`position: static`) - dann greift der
   naechste, und das ist die Kopfzeile. So liegt die rechte Kante immer am
   rechten Rand des Arbeitsbereichs, egal an welcher Stelle der Reihe der
   Knopf steht. */
.menue--breit { position: static; }

.menue__blatt--breit {
  right: var(--a6);
  width: min(66rem, calc(100% - 2 * var(--a6)));
  max-height: min(72vh, 44rem);
  overflow-y: auto;
}

/* Im Blatt braucht die Werkzeugreihe ihren eigenen Abschluss nicht mehr -
   den Rahmen bringt das Blatt mit. */
.menue__blatt .werkzeuge { padding-bottom: 0; border-bottom: 0; }

.filter__blatt .feld { margin-bottom: var(--a3); }
.filter__blatt .haken__eintrag { margin-bottom: var(--a4); }
.filter__blatt .hinweis { margin: 0 0 var(--a3); }
.filter__tat { display: flex; gap: var(--a2); }
.filter__tat .knopf { flex: 1 1 auto; }
.menue__blatt .hinweis { margin: 0 0 var(--a3); }
.menue__blatt .haken__eintrag { margin-bottom: var(--a4); }

/* ===== §14b DIE KOPFZEILE HAT ZWEI SEITEN ================================
   LINKS die Ansicht, RECHTS die Werkzeuge (Vorgabe Murat, 13.08.2026).

   DER BEFUND, DER DAZU FÜHRTE, war seiner und wiegt schwerer als er klingt:
   „ich konnte selbst nicht einschätzen, wozu die Menüs da sind." Wenn der
   Erbauer die eigene Leiste nicht lesen kann, liegt es nicht am Gedächtnis,
   sondern daran, dass in EINER Reihe zwei Sorten Knöpfe standen – vier, die
   Daten von fremden Servern holen, und einer, der nur die Ansicht filtert.
   Ein Zwischenraum sagt darüber mehr als jede Beschriftung.

   Die Ansicht steht direkt neben dem Titel, die Werkzeuge am rechten Rand
   (`.kopfzeile__aktionen` hat `margin-left: auto`). Der Abstand dazwischen
   ist die eigentliche Auskunft. */
.kopfzeile__ansicht {
  display: flex;
  gap: var(--a2);
  align-items: center;
}

/* Ein Blatt AN EINEM LINKEN KNOPF öffnet nach RECHTS. Die Grundregel oben
   setzt `right: 0`, weil dort alles am rechten Rand hängt; hier stünde das
   Blatt sonst links über der Kante des Arbeitsbereichs. */
.kopfzeile__ansicht .filter__blatt,
.kopfzeile__ansicht .menue__blatt { right: auto; left: 0; }

/* Ein Formular als Knopfträger in der Kopfzeile (v0.97.0). Der
   Aktualisieren-Knopf am Förderradar MUSS in einem Formular stecken – er
   löst einen POST aus, der fremde Server abruft, und das gehört hinter
   keinen Verweis (Vorschaufunktionen rufen Verweise ungefragt ab). Ohne
   diese zwei Zeilen bräche das Formular als Block die Reihe auf.

   `margin-left: auto` schiebt ihn und alles danach an den rechten Rand –
   Vorgabe Murat, 21.08.2026: „en üstte en sağa koyabiliriz". Links steht,
   WAS man sieht; rechts, was die Daten selbst verändert (§14b). */
.kopfform { display: flex; margin: 0 0 0 auto; }
.kopfform + .knopf { margin-left: var(--a2); }



/* ===== §14b DIE KOPFZEILE WEICHT ZURÜCK, STATT UMZUBRECHEN ===============
   BEFUND MURAT (13.08.2026): „radar cok sikik duruyo … daraldikca butonlar
   ve textlerde kücülsün, en son sigmazsa ikinci satir olmasin."

   Er beschreibt damit die richtige Reihenfolge, und sie ist nicht
   selbstverständlich: Die Vorgabe eines Browsers ist der UMBRUCH – und eine
   zweite Knopfreihe schiebt den Inhalt nach unten, jedes Mal wenn ein Knopf
   dazukommt. Deshalb hier drei Stufen, von harmlos nach spürbar:

     1. eng      Abstände und Schrift schrumpfen, alles bleibt lesbar
     2. enger    dasselbe, kleiner
     3. am engsten  die BESCHRIFTUNG fällt weg, das Symbol bleibt

   Stufe 3 ist der eigentliche Trick: Ein Knopf ohne Wort ist immer noch ein
   Knopf, eine zweite Zeile ist ein Sprung im Aufbau. Das Wort bleibt für das
   Vorlesegerät stehen (`.nur-vorlesen` greift, weil es nur optisch weicht) –
   und `title` trägt es für die Maus.

   `flex-wrap: nowrap` ist die Zusage, um die es geht: Was hier steht,
   bleibt in EINER Zeile. */
.kopfzeile__ansicht,
.kopfzeile__aktionen { flex-wrap: nowrap; min-width: 0; }

@media (max-width: 1100px) {
  .kopfzeile { gap: var(--a3); }
  .kopfzeile .knopf {
    padding: var(--a1) var(--a2);
    font-size: var(--s-klein);
  }
}

@media (max-width: 900px) {
  .kopfzeile { gap: var(--a2); }
  .kopfzeile .knopf { padding: var(--a1); gap: var(--a1); }
}

/* Ab hier trägt der Knopf nur noch sein Zeichen. Die Beschriftung wird
   NICHT gelöscht, sondern optisch weggenommen – sonst verlöre das
   Vorlesegerät den einzigen Hinweis darauf, was der Knopf tut. */
@media (max-width: 700px) {
  .kopfzeile .knopf__wort {
    position: absolute;
    width: 1px;
    height: 1px;
    overflow: hidden;
    clip-path: inset(50%);
    white-space: nowrap;
  }
  .kopfzeile .filter__zahl { margin-left: 0; }
}

/* ===== §14b2 KNOPF NUR ALS ZEICHEN (08.09.2026) ==========================
   Vorgabe Murat: „filter textini kaldır ikonu en sağa koy, çerçevesini
   kaldır · gemerkte textini sil kalp ikon kalsın".

   OHNE RAHMEN UND OHNE WORT, aber NICHT ohne Namen: `aria-label` und
   `title` tragen ihn weiter. Ein Zeichen ohne zugänglichen Namen ist für
   ein Vorleseprogramm ein leerer Knopf – das wäre kein aufgeräumter
   Bildschirm, sondern ein unbedienbarer.

   QUADRATISCH UND GLEICH GROSS wie ein normaler Knopf hoch ist: In einer
   Reihe mit „Mein Projektgebiet (…)" darf das Zeichen nicht kleiner
   wirken, sonst liest es sich als Beiwerk statt als Griff. */
.knopf--zeichen {
  width: 2.25rem;
  min-width: 2.25rem;
  height: 2.25rem;
  padding: 0;
  border-color: transparent;
  background: transparent;
  color: var(--leise);
}

.knopf--zeichen:hover {
  border-color: transparent;
  background: var(--papier);
  color: var(--text);
}

/* DER EINGESCHALTETE ZUSTAND IST NICHT NUR EINE FARBE (DESIGN_SYSTEM §3.2).

   BEIM UMBAU AM 08.09.2026 FAST FALSCH GEMACHT: Solange am Merkzettel das
   Wort stand („Gemerkte" / „Entdecken"), sagte der Text, in welcher Ansicht
   man ist. Ohne Wort blieb allein die Farbe des Zeichens übrig – und damit
   sähe für jemanden mit Rot-Grün-Schwäche eine gefilterte Liste aus wie
   eine vollständige. Das ist in dieser Anwendung kein Schönheitsfehler.

   Deshalb GRUND UND FARBE: Der gefüllte Kreis ist die Form, die man ohne
   Farbe sieht; `title` und `aria-label` sagen es in Worten. */
.knopf--zeichen[aria-current] {
  color: var(--akzent);
  background: var(--akzent-hell);
}

/* DIE ZAHL SITZT AM ZEICHEN, NICHT DANEBEN (Vorgabe Murat, 08.09.2026:
   „o sayılar ikonların sağ üstünde olsun, arka plansız, yeşil, kalın").

   OHNE GRUND UND OHNE KREIS. Ein gefüllter Punkt neben einem Knopf ist ein
   zweites Bedienelement neben einem, das schon eins ist; oben rechts am
   Zeichen ist die Zahl eine EIGENSCHAFT dieses Zeichens – so wie die Zahl
   an einem Briefkasten.

   `line-height: 1` und die kleine Schrift halten sie dort, wo sie hingehört:
   Sie soll ablesbar sein, nicht mitlesen. */
.knopf--zaehlend { position: relative; overflow: visible; }

.knopf__zahl {
  position: absolute;
  top: .1rem;
  right: .05rem;
  min-width: 0;
  padding: 0;
  border-radius: 0;
  background: none;
  color: var(--akzent);
  font-size: .68rem;
  font-weight: 700;
  line-height: 1;
  pointer-events: none;
}

/* ===== §14c DAS MERKEN ===================================================
   Ein Zeichen je Zeile, sonst nichts. Es ist ein Knopf und sieht nicht
   danach aus – mit Absicht: In einer Liste mit zwanzig Zeilen wären zwanzig
   gerahmte Knöpfe ein Gitter, und die Liste läse sich nicht mehr.

   AM 23.08.2026 IST `.merken` IN `.zeilentat` AUFGEGANGEN (§8b). Sie sagten
   dasselbe – „ein Zeichen ohne Knopfrahmen in einer Zeile" –, und seit der
   Förderradar eine Tabelle ist statt eines Kartenstapels, steht das Merken
   in derselben Bauform wie Speichern, Kündigen und Löschen. Zwei Klassen
   für dieselbe Form sind kein Baukasten, sondern eine Wette darauf, welche
   von beiden jemand später ändert.

   WAS AUS DER ALTEN KLASSE MITGEGANGEN IST, weil es die Regel und nicht die
   Form war: FARBE IST NICHT DAS EINZIGE MERKMAL (DESIGN_SYSTEM §3.2).
   Gemerkt trägt den HAKEN, ungemerkt das PLUS – wer keine Farben
   unterscheidet, sieht den Unterschied trotzdem. Dazu trägt der Knopf
   `aria-pressed`.

   DAS ZEICHEN IST EIN PLUS, DER HAKEN IST DIE QUITTUNG (Vorgabe Murat,
   13.08.2026). Das Herz sagte „gefällt mir" – gemeint ist „das nehmen wir
   auf die Liste". Kein Kreis um den Haken (Befund Murat: „zu kindisch"):
   Der Kreis macht aus einer Quittung einen Aufkleber. */

/* WARNFARBE FÜR FLIESSTEXT. Es gab sie zweimal, jeweils an eine Tabelle
   gebunden (`.tabelle--fund small.warnton`) – und damit nirgends, wo sonst
   eine Warnung steht. Dieselbe Sorte Loch wie bei `.tabelle small`: eine
   Zeichnung, die an einer Zusatzklasse hängt, fehlt überall dort, wo jemand
   die Zusatzklasse nicht kennt. Farbe ist dabei nie das einzige Merkmal –
   daneben steht ein Zeichen und ein Wort (DESIGN_SYSTEM §3.2). */
.warnton { color: var(--warnung); }

/* Die Dublette (FR-07). Sie steht als Fussnote am Namen und nicht als
   eigene Spalte: Sie betrifft gemessen ein Prozent der Zeilen, und eine
   Spalte, die in 99 von 100 Zeilen leer ist, ist keine Spalte. */
.dublette { display: block; margin-top: 2px; }
.dublette .sym { margin-right: var(--a1); }

/* ===== DIE BEWERTUNG EINER FUNDSTELLE (FR-06) ============================
   Sie steht IN der Programmspalte und nicht in einer eigenen: Eine eigene
   Spalte müsste die Begründung abschneiden, und eine Stufe ohne Begründung
   ist ein Orakel – man kann ihr weder widersprechen noch nachgehen.

   DER GRIFF IST ZU, nicht offen. Drei Gründe und sechs Lücken je Zeile
   ergäben bei zehn Zeilen eine Seite, die niemand mehr überfliegt; die
   Stufe und der erste Grund reichen zum Sortieren im Kopf, der Rest ist
   einen Klick entfernt (DESIGN_SYSTEM §5.6: Was man selten braucht, kostet
   keine Zeile). */
.bewertung { margin-top: var(--a2); }

.bewertung > small { display: block; margin-top: 2px; }

.bewertung__mehr > summary {
  display: inline-block;
  margin-top: var(--a1);
  color: var(--leise);
  font-size: var(--s-klein);
  cursor: pointer;
}

.bewertung__mehr > summary:hover { color: var(--akzent); }

.bewertung__titel {
  margin: var(--a2) 0 var(--a1);
  color: var(--leise);
  font-size: var(--s-klein);
  font-weight: 600;
}

.bewertung__liste {
  margin: var(--a1) 0;
  padding-left: var(--a4);
  color: var(--leise);
  font-size: var(--s-klein);
}

.bewertung__liste li { margin-bottom: 2px; }

/* Die Lücken tragen die Warnfarbe NICHT: Sie sind kein Fehler, sondern die
   ehrliche Auskunft "das steht dort nicht". Rot gefärbt läse sich eine
   vollständig normale Fundstelle wie ein Problem. */
.bewertung__liste--luecke { list-style: "– "; }

/* Ein Umgebungsname oder eine Adresse im Fliesstext. Ohne eigene Zeichnung
   nähme der Browser eine Systemschrift, die neben der Oberfläche steht. */
code {
  padding: 1px 4px;
  border-radius: var(--ecke-klein);
  background: var(--papier);
  font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
  font-size: .92em;
}

/* Der Kasten der KI-Antwort (v1.2.0).
   ABGESETZT UND AM RAND MARKIERT, weil er das einzige auf dieser Seite
   ist, das NICHT unmittelbar aus den Akten stammt: Der Satz darin ist
   geschrieben, die Zitate darunter sind geprüft. Wer die Seite überfliegt,
   soll auf den ersten Blick sehen, wo die Maschine gesprochen hat und wo
   das eigene Dokument. Keine neue Farbe – `--akzent` und `--papier` sind
   die vorhandenen Werte. */
.kasten--ki {
  padding: var(--a4);
  margin-bottom: var(--a4);
  border: 1px solid var(--linie);
  border-left: 3px solid var(--akzent);
  border-radius: var(--ecke);
  background: var(--papier);
}
.kasten--ki > h2 { margin: 0 0 var(--a3); font-size: var(--s-h3); }
.kasten--ki > h3 { margin: var(--a4) 0 var(--a2); font-size: var(--s-hinweis); }

/* Die Suchmaske über dem Aktenbestand (v1.1.0).
   FELD UND KNOPF IN EINER ZEILE, das Feld nimmt den Platz. Eine Suchmaske,
   deren Knopf unter dem Feld steht, sieht aus wie ein Formular mit zwei
   Schritten – gemeint ist eine Handlung. Auf schmalen Schirmen bricht sie
   um, weil ein Eingabefeld von 6 rem unbenutzbar ist. */
.suchform {
  display: flex;
  flex-wrap: wrap;
  align-items: flex-end;
  gap: var(--a3);
  margin-bottom: var(--a3);
}
.suchform .feld { flex: 1 1 18rem; margin-bottom: 0; }

/* Der Abonnement-Link des Fristenkalenders (v0.99.8).
   ER MUSS GANZ DASTEHEN UND UMBRECHEN DÜRFEN: Die Adresse trägt einen
   Schlüssel von rund 43 Zeichen. Als abgeschnittenes `code` inline wäre
   sie unbrauchbar – man soll sie markieren und kopieren können, und auf
   dem Telefon schiebt eine nicht umbrechende Zeile die ganze Seite zur
   Seite. `anywhere` statt `break-all`, damit an einem Schrägstrich
   getrennt wird, wenn es geht. */
.schluessel {
  display: block;
  padding: var(--a2) var(--a3);
  line-height: 1.5;
  overflow-wrap: anywhere;
  user-select: all;
}

.spalte--merken {
  width: 2.5rem;
  /* MITTIG, obwohl die übrige Zeile oben ausgerichtet ist (.tabelle--fund td).
     Der Knopf ist ein Punkt und kein Text; neben einem dreizeiligen Absatz
     gehört er auf dessen Mitte und nicht an dessen Anfang. */
  vertical-align: middle;
}

/* Die Fundstellenliste. `.tabelle` bringt die Grundform mit; hier steht nur,
   was diese Liste zusätzlich braucht: eine zweite Zeile unter dem Namen und
   Fristen, die nicht umbrechen. */
/* AN DER TABELLE, NICHT AN EINER IHRER SPIELARTEN. Die Regel hing an
   `.tabelle--fund`, und die Projektliste bekam sie deshalb nicht: Ihre Notiz
   stand als Fliesstext HINTER dem Titel in derselben Zeile (gesehen am
   13.08.2026). Dieselbe Sorte Loch wie beim Eingabefeld ohne `.feld` – eine
   Zeichnung, die an einer Zusatzklasse hängt, fehlt überall dort, wo jemand
   die Zusatzklasse nicht kennt. */
.tabelle small {
  display: block;
  margin-top: 2px;
  color: var(--leise);
  font-size: var(--s-klein);
}

.tabelle--fund td { vertical-align: top; }

/* SPALTENBREITEN, WEIL SIE SICH SONST FALSCH VERTEILEN: Ohne Vorgabe gibt
   der Browser jeder Spalte so viel Platz, wie ihr längster Inhalt braucht –
   und der längste Inhalt ist das Bedienfeld ganz rechts. Ergebnis war ein
   Programmname, der über acht Zeilen umbrach, neben einem breiten
   Eingabefeld. Der Name ist die Spalte, die man liest; sie bekommt den Platz.
   Die Liste scrollt dafür waagerecht (.tabellenhuelle) statt senkrecht zu
   zerfasern. */
.spalte--frist { white-space: nowrap; }
.spalte--frist b { font-variant-numeric: tabular-nums; }
.spalte--programm { min-width: 17rem; }
.spalte--thema { min-width: 9rem; }

/* Die Themen einer Fundstelle. Als Marken nebeneinander und nicht als
   Aufzählung: In einer Tabellenzeile ist eine Liste eine Zeile, die alle
   anderen auseinanderzieht – dieselbe Regel wie bei den Unterlagen. */
.marke {
  display: inline-block;
  margin: 0 var(--a1) var(--a1) 0;
  padding: 1px var(--a2);
  border-radius: var(--ecke-klein);
  background: var(--akzent-hell);
  color: var(--akzent);
  font-size: var(--s-klein);
  white-space: nowrap;
}

/* DIE BEDINGUNGEN EINER FUNDSTELLE (v0.98.0). Dieselbe Marke, andere Farbe:
   „Eigenanteil noetig" und „Nicht vorher anfangen" sind keine Themen,
   sondern Auflagen – wer sie uebersieht, verliert das Geld. Sie tragen
   deshalb den Warnton und nicht den Akzent. Die Farbe ist NIE das einzige
   Merkmal: Im Text steht, worum es geht (DESIGN_SYSTEM 3.2). */
.marke--achtung { background: var(--warnung-hell); color: var(--warnung); }

/* Der Lauf-Knopf steht in der Kopfzeile neben dem Filter und nicht als Block
   darunter – dort waere er eine dritte Zeile fuer eine einzige Handlung. */
.kopfzeile__lauf { margin: 0; }

/* Die Zeile, in der die Rechtsgrundlage FEHLT. Sie wird nicht gelesen, und
   das ist keine Kleinigkeit, die man in Grau danebenschreibt. */
.tabelle--fund small.warnton { color: var(--warnung); }

/* Der Programmname wird nicht gekürzt – er ist die Spalte, an der man
   erkennt, worum es geht. Lange Titel dürfen umbrechen; abgeschnitten wäre
   „Förderrichtlinie zur Unterstützung von …" in jeder zweiten Zeile
   dasselbe. `overflow-wrap` verhindert nur, dass ein einzelnes langes Wort
   die Spalte sprengt. */
.spalte--programm a { overflow-wrap: anywhere; }

/* Die angehängten Formulare und Richtlinien. Nebeneinander als kleine
   Marken, nicht untereinander als Liste: In einer Tabellenzeile ist eine
   Liste eine Zeile, die alle anderen auseinanderzieht. */
.unterlage {
  display: inline-flex;
  align-items: center;
  gap: var(--a1);
  margin: 0 var(--a1) var(--a1) 0;
  padding: 2px var(--a2);
  border: 1px solid var(--linie);
  border-radius: var(--ecke-klein);
  color: var(--text);
  text-decoration: none;
  font-size: var(--s-klein);
  white-space: nowrap;
}

.unterlage:hover { border-color: var(--akzent); color: var(--akzent); }

/* Nebeneinander ist keine Vorgabe fürs Telefon: Zwei Formulare in zwei
   Spalten auf 375px sind zwei unbenutzbare Formulare. */
@media (max-width: 900px) {
  .werkzeuge { grid-template-columns: 1fr; gap: var(--a5); }
  .werkzeuge > .werkzeug + .werkzeug {
    padding-left: 0;
    padding-top: var(--a5);
    border-left: 0;
    border-top: 1px solid var(--linie);
  }
  /* Nebeneinander bleibt am Telefon kein Platz: Die Zahlen rutschen unter
     die Auskunft, beide mittig. */
  .blaettern { grid-template-columns: 1fr; }
  /* Untereinander statt nebeneinander: Drei Spalten auf einem Telefon sind
     drei Spalten zu viel. Die Auswahl bleibt - sie ist Bedienung, keine
     Auskunft, und gerade am kleinen Schirm will man kuerzere Seiten. */
  .seitenlaenge { justify-content: center; }
  .blaetter__zahl { text-align: center; }
  /* Auf dem Telefon steht der Knopf unter dem Feld – daneben bliebe für
     beides zu wenig Platz. Er nimmt dann die volle Breite, damit er nicht
     wie ein abgeschnittener Rest aussieht. */
  .werkzeug__zeile .knopf { flex: 1 0 100%; }
  .werkzeug__zeile .feld--schmal { flex: 1 1 100%; }
  /* Die Blase hängt am linken Rand, statt aus der Seite herauszuragen. */
  .hinweisblase__inhalt { left: auto; right: -1rem; width: min(22rem, 88vw); }
  .einblender { left: var(--a4); right: var(--a4); transform: none; }
}

/* ===== §15 EINBLENDER UND LADEZUSTAND ===================================
   BEFUND (Murat, 12.08.2026), zwei Sachen, ein Abschnitt:

   1. DIE MELDUNG NACH EINEM LAUF ist drei Zeilen lang und stand als Band
      über dem Inhalt. Nach jedem Lauf sprang damit die ganze Seite nach
      unten, und beim nächsten Blick war unklar, ob die Meldung von eben
      stammt oder von vorhin. Als Einblender liegt sie ÜBER der Seite,
      verschiebt nichts und geht nach zwölf Sekunden von selbst. FEHLER
      bleiben stehen (cockpit.js liest `data-dauer="0"`) – was schiefging,
      verschwindet nicht von allein.

   2. „STARTQUELLEN LADEN" liest 34 fremde Seiten. Bis die Antwort kam, sah
      die Seite eingefroren aus, also drückte man erneut – und der Lauf
      begann von vorn. Der Knopf sagt jetzt, dass er arbeitet, und nimmt
      keinen zweiten Klick an.

   Beides ist Beiwerk: Ohne JavaScript bleibt die Meldung stehen und der
   Knopf arbeitet ganz normal. */
.einblender {
  position: fixed;
  z-index: 40;
  top: var(--a4);
  left: 50%;
  transform: translateX(-50%);
  width: min(52rem, calc(100vw - 2 * var(--a4)));
  transition: opacity .3s ease, transform .3s ease;
}

/* DER STAPEL. Ohne ihn liegen zwei Meldungen deckungsgleich übereinander –
   gesehen am 22.08.2026: Der Hinweis „Sie gehören keinem Verein an"
   verdeckte die Ablehnung des Löschens, also genau den Satz, der erklärte,
   warum nichts passiert ist. cockpit.js §1 hängt jede Blende hier hinein;
   die Blenden selbst geben ihre feste Lage dann ab. */
.einblender-stapel {
  position: fixed;
  z-index: 40;
  top: var(--a4);
  left: 50%;
  transform: translateX(-50%);
  width: min(52rem, calc(100vw - 2 * var(--a4)));
  display: flex;
  flex-direction: column;
  gap: var(--a2);
}

.einblender-stapel .einblender {
  position: static;
  transform: none;
  width: auto;
}

.einblender-stapel .einblender--weg { transform: translateY(-.5rem); }

/* Der Grund ist gedeckt und nicht durchsichtig: Die Meldung liegt über der
   Tabelle, und Text über Text ist kein Text mehr. */
.einblender .erfolgsmeldung,
.einblender .fehlermeldung {
  display: flex;
  gap: var(--a3);
  margin: 0;
  border: 1px solid var(--linie);
  border-left-width: 3px;
  border-radius: var(--ecke);
  background: var(--grund);
  box-shadow: var(--schatten-schwebend);
  align-items: flex-start;
}

.einblender .sym { flex: 0 0 auto; margin-top: .1em; }
.einblender span { flex: 1 1 auto; }

.einblender--weg {
  opacity: 0;
  transform: translateX(-50%) translateY(-.5rem);
  pointer-events: none;
}

/* Das Kreuz ist ein Knopf und kein Zeichen im Text: Es wird angeklickt, also
   muss es die Tastatur erreichen können. */
.einblender__zu {
  flex: 0 0 auto;
  border: 0;
  background: none;
  padding: 0 var(--a1);
  color: inherit;
  font: inherit;
  font-size: 1.2rem;
  line-height: 1;
  cursor: pointer;
  opacity: .6;
}

.einblender__zu:hover { opacity: 1; }

/* Der ablaufende Balken unter der Meldung. Er wird von cockpit.js erzeugt,
   nicht von der Vorlage: Ohne JavaScript verschwindet die Meldung gar nicht,
   und ein Balken, der eine Frist ankündigt, die niemand einhält, ist eine
   Lüge im Kleinen. `transform: scaleX` und nicht `width`, damit die
   Animation auf der Grafikkarte läuft und die Zeile nicht bei jedem Bild
   neu umbricht. */
.einblender__lauf {
  display: block;
  height: 3px;
  margin: -1px auto 0;
  width: calc(100% - 2px);
  border-radius: 0 0 var(--ecke) var(--ecke);
  background: var(--warnung);
  transform-origin: left center;
  animation-name: einblender-lauf;
  animation-timing-function: linear;
  animation-fill-mode: forwards;
}

@keyframes einblender-lauf {
  from { transform: scaleX(1); }
  to   { transform: scaleX(0); }
}

/* Der arbeitende Knopf. Der Kreis dreht sich; die Farbe bleibt die des
   Hauptknopfes, damit er nicht plötzlich wie gesperrt aussieht. Er ist
   NICHT `disabled` (Begründung in cockpit.js) – `pointer-events: none`
   verhindert den zweiten Klick, ohne den Knopf aus dem Formular zu nehmen. */
.knopf--laeuft {
  pointer-events: none;
  opacity: .85;
}

.knopf--laeuft::before {
  content: "";
  width: 1em;
  height: 1em;
  margin-right: var(--a2);
  border: 2px solid currentColor;
  border-top-color: transparent;
  border-radius: var(--ecke-klein);
  animation: kreisen .7s linear infinite;
}

@keyframes kreisen { to { transform: rotate(360deg); } }

/* Wer angegeben hat, dass Bewegung ihm schadet, bekommt keine. Der Knopf
   sagt dann mit Text, dass er arbeitet – das war ohnehin die Hauptsache. */
@media (prefers-reduced-motion: reduce) {
  .knopf--laeuft::before { animation: none; }
  .einblender { transition: none; }
  /* Der Balken bleibt stehen statt zu laufen. Die Meldung geht trotzdem
     nach ihrer Zeit – das erledigt cockpit.js, nicht die Animation. */
  .einblender__lauf { animation: none; }
}

/* ===== §16 DIE STELLEN (FR-02b) =========================================
   WARUM ES DIESE LISTE ÜBERHAUPT GIBT: Gemessen lieferte mkw.nrw allein 280
   Fundstellen. Ob die etwas taugen, ist keine Eigenschaft von 280 Zeilen,
   sondern eine Eigenschaft EINER Behörde. Diese Tabelle ist der Ort, an dem
   die Entscheidung einmal fällt statt 280 Mal.

   ZU, ABER NICHT VERSTECKT: Als <details> kostet sie keine Zeile, solange
   niemand sie braucht – und die Zahl am Griff sagt, dass es sie gibt
   (dieselbe Regel wie beim Filter, DESIGN_SYSTEM §13). Kein eigener
   Klapp-Code: der Browser bringt Zustand und Tastaturbedienung mit (§12b). */

.tabelle--stellen td { vertical-align: top; }

.tabelle--stellen small {
  display: block;
  margin-top: 2px;
  color: var(--leise);
  font-size: var(--s-klein);
}

.tabelle--stellen small.warnton { color: var(--warnung); }

/* EINE VERWORFENE STELLE BLEIBT LESBAR, nur leiser. Sie auszublenden hiesse,
   die eigene Entscheidung zu verstecken – und genau die will man
   wiederfinden, wenn eine Behörde plötzlich fehlt. Deshalb gedämpft und
   nicht weg; `opacity` allein, damit auch der Knopf zum Zurücknehmen
   bedienbar bleibt. */
.tabelle--stellen .zeile--verworfen { opacity: .6; }
.tabelle--stellen .zeile--verworfen:hover { opacity: 1; }

/* Grund und Knopf in EINER Zeile: Der Grund ist freiwillig, aber er gehört
   an die Handlung – als eigenes Formular darüber hätte ihn niemand
   ausgefüllt. Auf schmalen Schirmen bricht er um, statt den Knopf zu
   quetschen. */
.stellen__tat {
  display: flex;
  flex-wrap: wrap;
  gap: var(--a2);
  margin: 0;
}

.stellen__tat input[type="text"] { flex: 1 1 8rem; min-width: 0; }
.stellen__tat .knopf { flex: 0 0 auto; }

/* `.stellen__hinweis` ist am 23.08.2026 entfallen – das Band „Nur von
   <Stelle>" in der Kopfzeile des Förderradars. Es war eine DRITTE Anzeige
   für einen Filter, der im Filterblatt eingestellt und an der Zahl am
   Filterknopf gezählt wird (Befund Murat: „birbirini tekrar eden seyler").
   Die Auskunft ist nicht weg, sie steht nur nicht mehr dreimal. */

/* ===== §17 WIE LANG DIE LISTE IST =======================================
   Sie steht LINKS im Blätterwerk und füllt damit die Spalte, die vorher nur
   Gegengewicht war: links wie lang, in der Mitte welche Seite, rechts wie
   viele. Drei Auskünfte, drei Plätze.

   Das Feld bringt keinen eigenen Abstand mit – in einer Zeile mit einem
   Knopf wäre der untere Rand von `.feld` ein Versatz von vier Pixeln, den
   man sieht und nicht erklären kann. */
.seitenlaenge {
  display: flex;
  align-items: center;
  gap: var(--a2);
  margin: 0;
}

.seitenlaenge .feld { margin: 0; }
.seitenlaenge select { width: auto; }

/* ===== §15 HANDBUCH UND NEUIGKEITEN =======================================
   Zwei Seiten, die man LIEST statt bedient – die einzigen dieser Art in der
   Anwendung. Deshalb bekommen sie das Einzige, was Fliesstext wirklich
   braucht: eine begrenzte Zeilenlänge und Luft zwischen den Absätzen. Eine
   Zeile, die über 1200px läuft, findet mit dem Auge den Anfang der nächsten
   nicht mehr wieder.

   VERBUNDEN MIT: templates/anwendung/handbuch.html, .../neuigkeiten.html,
   neuigkeiten.py, qa/unit/test_handbuch.py */
/* ===== §15a FLACHE ABSCHNITTE – DIE REGEL, DIE ICH ZWEIMAL VERGESSEN HABE
   ==========================================================================
   REGEL (Vorgabe Murat, 12.08.2026, wiederholt am 13.08.2026):
   **KEINE KÄSTEN IM KASTEN.** Der Arbeitsbereich IST schon der Kasten. Was
   darin steht, steht FLACH auf der Fläche und nutzt ihre ganze Breite –
   getrennt von genau einer Linie, nicht von einem Rahmen.

   WAS FALSCH WAR (gesehen am 13.08.2026 auf /kontakt und /handbuch): Jeder
   Abschnitt steckte in einem `.block` – weisser Grund, Rahmen, runde Ecken –
   und der Inhalt darin war zusätzlich auf 62rem eingeschnürt. Ergebnis: ein
   Formular in einem Kasten in einem Kasten, mit 500px leerer Fläche daneben.
   Zwanzig solcher Kästen auf einer Seite (Handbuch) sind zwanzig Rahmen für
   einen Gedanken.

   WOFÜR `.block` NOCH DA IST: für eine KARTE – etwas, das neben anderen
   Karten steht und deshalb eine eigene Kante braucht (Kacheln, Leerzustand).
   NICHT für einen Abschnitt, der ohnehin die ganze Breite einnimmt.

   Ein Test hält das fest (qa/unit/test_design_system.py). Der Kommentar hier
   allein hat zweimal nicht gereicht – er stand in Paragraph 14, und wer eine
   neue Seite baut, liest Paragraph 14 nicht. */
.abschnitt {
  padding-bottom: var(--a5);
  border-bottom: 1px solid var(--linie);
}

/* Die letzte Linie ist eine Linie zu viel: Darunter kommt nichts mehr, was
   sie trennen könnte. */
.abschnitt:last-of-type { padding-bottom: 0; border-bottom: 0; }

/* ===== ALS NÄCHSTES (C26) ================================================
   Der erste Abschnitt des Abschlusses beantwortet die Frage, mit der man
   den Reiter öffnet: „Was mache ich jetzt?" Er trägt deshalb einen
   farbigen Rand statt einer eigenen Kachel – eine Kachel wäre ein zweites
   Bauteil für dieselbe Sache, der Rand nur eine Betonung. */
.naechstes {
  border-left: 3px solid var(--akzent);
  padding-left: var(--a4);
}
.naechstes > .abschnittkopf > div > p {
  color: var(--text);
  max-width: 62ch;
}

.abschnitt > h2 {
  margin: 0 0 var(--a4);
  font-size: var(--s-h3);
}

/* THEMA: Überschrift LINKS, Text rechts. Das ist die zweite Hälfte derselben
   Regel – „nichts senkrecht Gestapeltes, wo es nebeneinander passt". Auf
   einem 1500px breiten Schirm ist eine Überschrift, die eine ganze Zeile für
   sich beansprucht, verschenkte Fläche; daneben liest sie sich ausserdem wie
   ein Register. */
.thema {
  display: grid;
  grid-template-columns: 17rem minmax(0, 1fr);
  gap: var(--a4) var(--a6);
  margin-bottom: var(--a5);
}

.thema:last-child { margin-bottom: 0; }

.thema > h3 {
  display: flex;
  align-items: flex-start;
  gap: var(--a2);
  margin: 0;
  font-size: var(--s-hinweis);
  line-height: 1.4;
}

.thema__text > :first-child { margin-top: 0; }
.thema__text > :last-child { margin-bottom: 0; }
.thema__text p { margin: 0 0 var(--a3); }
.thema__text ul { margin: 0 0 var(--a3); padding-left: var(--a5); }
.thema__text li { margin-bottom: var(--a2); }

@media (max-width: 900px) {
  /* Am Telefon ist eine 17rem-Spalte keine Spalte mehr, sondern ein Rest. */
  .thema { grid-template-columns: 1fr; gap: var(--a2); }
}

/* Der Verlauf: links die Fassung, rechts was sie gebracht hat. Zwei Spalten
   und keine Aufzählung untereinander – so sieht man beim Überfliegen, WANN
   etwas kam, ohne jede Zeile zu lesen. */
.verlauf { margin: 0; padding: 0; list-style: none; }

.verlauf__stand {
  display: grid;
  grid-template-columns: 10rem minmax(0, 1fr);
  gap: var(--a4);
  padding: var(--a4);
  border-bottom: 1px solid var(--linie);
}

.verlauf__stand:last-child { border-bottom: 0; }
.verlauf__marke b { display: block; font-size: var(--s-h3); }
.verlauf__marke small { display: block; color: var(--leise); }
.verlauf__marke .ampel { margin-top: var(--a1); }
.verlauf__eintrag { margin-bottom: var(--a4); }
.verlauf__eintrag:last-child { margin-bottom: 0; }

.verlauf__eintrag h3 {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: var(--a2);
  margin: 0 0 var(--a1);
  font-size: var(--s-hinweis);
}

.verlauf__eintrag p { margin: 0; max-width: 52rem; }

@media (max-width: 900px) {
  /* Am Telefon steht die Fassung ÜBER ihrem Inhalt: Zehn Zentimeter für die
     Nummer und drei für den Text wären dort keine Aufteilung. */
  .verlauf__stand { grid-template-columns: 1fr; gap: var(--a2); }
  .verlauf__marke { display: flex; align-items: baseline; gap: var(--a2); }
}

/* ===== §16 INHALTSVERZEICHNIS UND KONTAKT =================================
   VERBUNDEN MIT: templates/anwendung/handbuch.html, .../kontakt.html,
   rueckmeldung.py, qa/unit/test_handbuch.py */

/* Das Kapitelverzeichnis des Handbuchs. Es ist kein Schmuck: Es sagt, WIE
   VIEL hier steht, bevor man scrollt (Befund Murat 13.08.2026 – „ohne
   Kategorien und Verzeichnis läuft die Seite auf"). */
.inhaltsverzeichnis ol {
  display: flex;
  flex-wrap: wrap;
  gap: var(--a2);
  margin: 0;
  padding: 0;
  list-style: none;
}

.inhaltsverzeichnis a {
  display: block;
  padding: var(--a2) var(--a3);
  border: 1px solid var(--linie);
  border-radius: var(--ecke-klein);
  background: var(--grund);
  color: var(--text);
  font-size: var(--s-hinweis);
  font-weight: 600;
  text-decoration: none;
}

.inhaltsverzeichnis a:hover { border-color: var(--akzent); color: var(--akzent); }

/* Beim Sprung soll die Kapitelüberschrift nicht unter der Kopfzeile kleben. */
.block[id] { scroll-margin-top: var(--a5); }

/* DIE ANLIEGEN ALS KNOPFREIHE, nicht als Auswahlliste (Vorgabe Murat,
   13.08.2026: „wichtig ist, dass man vorne auswählt, worum es geht").
   Vier sichtbare Möglichkeiten sagen, WOFÜR dieses Formular da ist; eine
   zugeklappte Liste sagt das erst nach dem Klick.

   Es sind echte Radiofelder mit angezogener Beschriftung – so funktioniert
   die Auswahl ohne JavaScript, ist tastaturbedienbar, und das Vorlesegerät
   kennt sie als Gruppe. Das Feld selbst bleibt sichtbar (nur klein), denn
   ein ausgeblendetes Ankreuzfeld verliert den Fokusrahmen. */
.anliegen { border: 0; margin: 0 0 var(--a5); padding: 0; }

.anliegen legend {
  padding: 0;
  margin-bottom: var(--a3);
  font-size: var(--s-hinweis);
  font-weight: 600;
}

.anliegen__wahl {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(15rem, 1fr));
  gap: var(--a3);
}

.anliegen__eintrag {
  display: flex;
  align-items: flex-start;
  gap: var(--a3);
  padding: var(--a3);
  border: 1px solid var(--linie);
  border-radius: var(--ecke-klein);
  background: var(--grund);
  cursor: pointer;
}

.anliegen__eintrag:hover { border-color: var(--akzent); }
.anliegen__eintrag b { display: block; font-size: var(--s-hinweis); }

.anliegen__eintrag small {
  display: block;
  margin-top: var(--a1);
  color: var(--leise);
}

/* Die gewählte Karte trägt Rahmen UND Fläche – Farbe allein wäre für
   Rot-Grün-Schwäche kein Unterschied (DESIGN_SYSTEM §3.2). Das Radiofeld
   selbst bleibt sichtbar und sagt es ein zweites Mal. */
.anliegen__eintrag:has(input:checked) {
  border-color: var(--akzent);
  background: var(--gut-hell);
}

/* DREI KURZE ANGABEN NEBENEINANDER, nicht drei Zeilen untereinander. Name,
   Adresse und Telefon sind je ein Wort breit – untereinander waeren sie drei
   Zeilen mit je einer Handbreit leerer Flaeche daneben. */
.kontakt__person {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(16rem, 1fr));
  gap: var(--a4);
}

/* „freiwillig" gehoert an die Beschriftung und nicht in einen Klammersatz,
   der die Zeile umbrechen laesst. */
.kontakt .feld span em {
  color: var(--leise);
  font-style: normal;
  font-weight: 400;
}

.kontakt .haken__eintrag { align-items: flex-start; margin-bottom: var(--a4); }
.kontakt .hinweis { margin: var(--a3) 0 0; }

/* Der Knopf und der Hinweis daneben – nicht untereinander: Ein Absenden-Knopf
   in voller Seitenbreite sieht aus, als waere er das Wichtigste der Seite.
   Er ist der letzte Schritt, nicht der erste. */
.kontakt__tat {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: var(--a4);
}

.kontakt__tat .knopf { flex: 0 0 auto; }
.kontakt__tat .hinweis { flex: 1 1 18rem; margin: 0; }

/* Die Anlegeformulare der Projekte. Dieselbe Bauform wie beim Kontakt: flach,
   ganze Breite, kurze Angaben nebeneinander. */
.anlegen .feld { margin-bottom: var(--a4); }

.anlegen__zeile {
  display: grid;
  grid-template-columns: minmax(0, 2fr) minmax(0, 1fr);
  gap: var(--a4);
}

@media (max-width: 900px) {
  .anlegen__zeile { grid-template-columns: 1fr; }
}


/* ---------------------------------------------------------------------
   DEMO-ANFRAGEN im Betriebsbereich (v0.43.0)
   --------------------------------------------------------------------- */
/* Erledigte bleiben stehen und werden nur leiser: Eine Anfrage, die beim
   Abhaken verschwindet, ist bei der naechsten Rueckfrage nicht mehr da. */
.anfrageliste {
  list-style: none;
  margin: 0;
  padding: 0;
  max-width: 52rem;
  border: 1px solid var(--linie);
  border-radius: var(--ecke-klein);
}
.anfrageliste li {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: var(--a3);
  padding: var(--a4);
}
.anfrageliste li + li { border-top: 1px solid var(--linie); }
.anfrageliste small { display: block; color: var(--leise); font-size: var(--s-klein); }
.anfrageliste p { margin: var(--a2) 0 0; white-space: pre-wrap; }
.anfrageliste form { margin: 0; flex: 0 0 auto; }
.anfrage--erledigt { opacity: .55; }

/* =====================================================================
   §17 LADEN – der Balken und der Vorhang
   =====================================================================
   BEFUND MURAT, 14.08.2026: „bekleme loading ekranlarinda yada beyaz ekran
   vermesin, Förderbuch ismi ciksin." Zwischen zwei Seitenaufrufen zeigte der
   Browser seinen eigenen weissen Grund. Auf Render kommt der Dienst aus dem
   Schlaf – dann sind das mehrere Sekunden weisses Nichts.

   DREI MASSNAHMEN, VON BILLIG NACH TEUER:
   1. `html { background: var(--papier) }` (index.css). Eine Zeile, und das
      weisse Blitzen ist weg – auch ohne JavaScript.
   2. Der Balken. Sofort da, beantwortet „ist der Klick angekommen?".
   3. Der Ladefunke am Zeiger. Erst nach 450 ms, sonst blitzt er bei jedem
      schnellen Klick auf.

   Warum das kein „Spinner in der Mitte" ist: Ein Rad ohne Namen sagt nur,
   dass etwas hängt. Blätterwerk sagt zusätzlich, WO man hängt – und das ist
   bei einer Anwendung, die Vereinsgeld verwaltet, die wichtigere Hälfte der
   Auskunft. Seit dem 09.09.2026 sagt es das am Zeiger statt über der ganzen
   Seite: Ein Vorhang nimmt das Bild weg, das man gerade gelesen hat. */
.ladebalken {
  position: fixed;
  top: 0;
  left: 0;
  z-index: 200;
  width: var(--fortschritt, 0%);
  height: 3px;
  background: var(--akzent);
  transition: width .24s ease-out;
}

/* ===== DER LADEFUNKE (09.09.2026) =========================================
   Vorgabe Murat: „o animasyonu ekranın ortasında değil de küçük mouse
   ucunda gösterelim, nereye kımıldatırsak o da mouse ile hareket etsin."

   VORHER LAG HIER EIN VORHANG ÜBER DER GANZEN SEITE. Sein Problem wächst
   mit seiner Grösse: Er nimmt das Bild weg, das man gerade gelesen hat. Der
   Funke lässt die Seite stehen und antwortet dort, wo das Auge ohnehin
   schon ist – beim Zeiger, der eben geklickt hat.

   ER FOLGT DEM ZEIGER ÜBER `--zeiger-x` / `--zeiger-y`, die `laden.js` bei
   jeder Bewegung setzt. `translate` und nicht `top`/`left`: Das läuft im
   Verbund des Browsers und löst kein neues Layout aus.

   OHNE ZEIGER (Tastatur, Telefon) greift `.ladefunke--ecke` – unten rechts,
   wo eine Anwendung Nebenbei-Meldungen erwartet. */
.ladefunke {
  position: fixed;
  top: 0;
  left: 0;
  z-index: 190;
  width: 5rem;
  height: 5rem;
  display: grid;
  place-items: center;
  /* Die halbe Kantenlänge zurück, damit der Funke AUF dem Zeiger sitzt und
     nicht mit seiner linken oberen Ecke daran klebt. */
  transform: translate(calc(var(--zeiger-x, 50vw) - 2.5rem),
                       calc(var(--zeiger-y, 50vh) - 2.5rem));
  border-radius: var(--ecke-rund);
  /* EIN EIGENER GRUND, WEIL ER AUF ALLEM LIEGEN KANN: über einer Tabelle,
     einem grünen Knopf, der dunklen Leiste. Ohne ihn wäre er auf der Hälfte
     der Anwendung unlesbar. */
  background: var(--grund);
  box-shadow: var(--schatten-kachel);
  opacity: 0;
  transition: opacity .18s ease-out;
  /* HÄLT NICHTS AUF: Die Seite darunter bleibt bedienbar, bis der Browser
     sie ersetzt – und der Funke sitzt unter dem Zeiger, wo ein Fänger von
     Klicks besonders teuer wäre. */
  pointer-events: none;
}

.ladefunke--da { opacity: 1; }

/* KEIN ZEIGER, KEINE VERFOLGUNG: unten rechts, mit Abstand zur Kante. */
.ladefunke--ecke {
  top: auto;
  left: auto;
  right: var(--a5);
  bottom: var(--a5);
  transform: none;
}

/* Der Rückfall, wenn `blaetterwerk.js` nicht geladen hat. */
.ladefunke__ring {
  width: 1.75rem;
  height: 1.75rem;
  border: 2px solid var(--linie);
  border-top-color: var(--akzent);
  border-radius: var(--ecke-rund);
  animation: ladefunke-dreh .8s linear infinite;
}

@keyframes ladefunke-dreh {
  to { transform: rotate(360deg); }
}

/* Ruhige Bewegung ist kein „gar keine Rückmeldung" (DESIGN_SYSTEM §6a): Der
   Funke erscheint weiterhin, nur ohne Drehung und ohne Überblendung. */
.ladefunke--ruhig { transition: none; }
.ladefunke--ruhig .ladefunke__ring { animation: none; }

/* ===== DIE LADEANIMATION „BLÄTTERWERK" (08.09.2026) =======================
   Der Renderer (blaetterwerk.js) baut ein <svg> mit `viewBox="0 0 720 480"`
   und ohne eigene Groesse hinein. Die Groesse steht deshalb hier.

   SIE FUELLT DEN FUNKEN GANZ. Der Logokoerper nimmt in der `viewBox` nur
   rund ein Drittel der Breite ein – der Rest ist die Bahn, auf der die
   Zeichen fliegen. Bei 5rem Funkenbreite ist das Buch damit rund 1.7rem
   gross: erkennbar als Foerderbuch, und die Zeichen fliegen weiterhin
   innerhalb des Kastens statt darueber hinaus.

   SIE HAT KEINEN EIGENEN GRUND (so gebaut). Der Funke darunter traegt die
   Flaeche. */
.ladebild {
  width: 100%;
  aspect-ratio: 3 / 2;
  display: grid;
  place-items: center;
}

.ladebild svg { width: 100%; height: 100%; display: block; }
/* Die gestapelte Fassung, weil der Vorhang hoch ist und nicht breit.
   `.wortmarke-hell`/`.wortmarke-dunkel` schalten nach Farbschema um – die
   Regel dafür steht bei den Marken-Klassen und wird hier nur benutzt. */
/* ===========================================================================
   DIE WORTMARKE, DIE SICH SCHREIBT (Vorgabe Murat, 20.08.2026)
   ===========================================================================
   „Förder" steht sofort, „buch" kommt Buchstabe fuer Buchstabe nach und
   wird am Ende markenblau. Der Versatz je Buchstabe steht im `style` der
   Buchstaben (laden.js) – vier Regeln fuer vier Buchstaben waeren vier
   Stellen, die man beim fuenften vergisst.

   ZWEI FARBEN, BEIDE AUS DER MARKE (index.css §1). Kein dritter Ton, kein
   Verlauf: Der Ladeschirm soll wiedererkennbar sein, nicht auffallen.

   `--ruhig` legt alles still (prefers-reduced-motion, laden.js). Dann steht
   das Wort einfach da – vollstaendig und in der Endfarbe, nicht halb
   animiert eingefroren. */
/* Rechtsbuendig – fuer Zahlen und fuer die Aktionsspalte am Zeilenende.
   EINE Definition, weil sie an drei Stellen gebraucht wird: Dokumentgroesse,
   Aktionsspalte der Projektliste, spaeter die Betraege (DESIGN_SYSTEM:
   Zahlen rechts, damit die Stellen untereinander stehen). */
.rechts { text-align: right; }

/* ===========================================================================
   DAS LADEFELD (Vorgabe Murat, 20.08.2026: „datei hochladen alani koy. o
   auswählen ikonunu büyüt")
   ===========================================================================
   WARUM EINE FLAECHE UND KEIN KNOPF: Der Dateiwaehler des Browsers ist ein
   winziges Bedienelement mit einem Text, den wir nicht setzen koennen
   („Keine Datei ausgewaehlt"). Ein <label> um ein verstecktes <input> macht
   daraus eine Zone, die man trifft, ohne zu zielen – auf dem Telefon der
   Unterschied zwischen „geht" und „geht nicht".

   DAS <input> IST NICHT `display:none`, sondern nur unsichtbar: Ein per
   `display:none` entferntes Feld ist fuer Tastatur und Vorleseprogramm gar
   nicht mehr da. So bleibt es bedienbar, ohne gesehen zu werden.

   OHNE JAVASCRIPT gibt es keinen Dateinamen unter der Flaeche – der steht
   im Browserdialog. Ein Skript dafuer waere ein Skript fuer eine Auskunft,
   die man zwei Sekunden spaeter in der Liste sieht. */
.ladefeld { display: flex; align-items: center; gap: var(--a4);
            flex-wrap: wrap; margin-top: var(--a4); }
.ladefeld__flaeche {
  display: flex;
  align-items: center;
  gap: var(--a3);
  padding: var(--a4) var(--a5);
  border: 2px dashed var(--linie);
  border-radius: var(--ecke);
  cursor: pointer;
  color: var(--leise);
}
.ladefeld__flaeche:hover { border-color: var(--akzent); color: var(--akzent); }
/* DAS GROSSE FELD (Vorgabe Murat, 21.08.2026: „bari kocaman yaparsın").
   Es steht in der Ablage einer Förderakte allein über der Liste und nimmt
   die Breite – ein Ziel, das man nicht suchen muss. */
.ladefeld--gross .ladefeld__flaeche {
  flex: 1 1 auto;
  justify-content: center;
  padding: var(--a6) var(--a5);
}

/* Dasselbe Feld IM DIALOG (Unterlage hinzufügen, v0.94.0). Dort steht es
   allein in einer Spalte statt neben einem Knopf – es nimmt die Breite und
   stellt seinen Inhalt in die Mitte, sonst klebt das Zeichen links an einer
   sonst leeren Fläche. */
.arbeitsdialog .ladefeld__flaeche { margin: var(--a3) 0; justify-content: center; }
.ladefeld__wort { font-weight: 600; }
/* Sichtbar fuer Tastatur und Vorleseprogramm, unsichtbar fuer das Auge. */
.ladefeld__flaeche input[type="file"] {
  position: absolute;
  width: 1px; height: 1px;
  opacity: 0;
}

/* Ein Formular MITTEN IN EINER TABELLENZEILE. Ohne diese Regel bricht das
   Block-Element die Zeile um, und aus einer Tabelle mit einem Knopf je Zeile
   wird eine Tabelle mit einer leeren Zeile je Knopf. */
.reihenform { display: inline; }

/* ===========================================================================
   DIE KASSE (Vorgabe Murat, 21.08.2026)
   ===========================================================================
   „en üstte kasa yesil toplam miktar büyük yaziyo … ekledikce yesil kasadan
   iniyo." Die eine Zahl, wegen der man die Seite oeffnet: Wie viel ist noch
   da. Sie steht GROSS, weil sie die Frage ist - alles andere darunter ist
   die Begruendung dieser Zahl.

   GRUEN, SOLANGE ETWAS DA IST; die Warnfarbe erst, wenn der Topf leer oder
   ueberzogen ist. Kein Verlauf, keine dritte Farbe: Eine Kasse, die drei
   Zustaende kennt, muss man lesen statt sehen. */
.kasse {
  display: flex;
  flex-direction: column;
  gap: var(--a3);
  padding: var(--a5) var(--a5) var(--a4);
  border-radius: var(--ecke);
  background: var(--akzent);
  color: var(--grund);
  margin-bottom: var(--a5);
}
.kasse--leer { background: var(--leise); }
.kasse__zahl { display: grid; gap: var(--a1); }
.kasse__wort { font-size: var(--s-klein); opacity: .85; }
.kasse__zahl strong {
  font-size: 2.4rem;
  line-height: 1.1;
  letter-spacing: -0.02em;
}
.kasse__klein { font-size: var(--s-klein); opacity: .85; }
/* Der Balken zeigt den ANTEIL der Ausgaben an der bewilligten Summe - er
   behauptet keinen Projektfortschritt. */
/* Ein `<progress>`: Der Wert steht im Element, die Gestaltung hier. Die
   drei Regeln sind dieselbe Flaeche fuer die drei Browserfamilien - ohne
   `appearance: none` zeichnet jeder seinen eigenen Balken. */
.kasse__balken {
  appearance: none;
  -webkit-appearance: none;
  display: block;
  width: 100%;
  height: .5rem;
  border: 0;
  border-radius: var(--ecke-rund);
  overflow: hidden;
  background: var(--kasse-spur);
  color: var(--grund);
}
.kasse__balken::-webkit-progress-bar { background: var(--kasse-spur); }
.kasse__balken::-webkit-progress-value { background: var(--grund); }
.kasse__balken::-moz-progress-bar { background: var(--grund); }

/* SPRUENGE: kurze Sprungziele statt eines Absatzes (Vorgabe Murat:
   „kutucuklar … oraya bastikca ilgili satira gider"). Ein Fliesstext ueber
   der Liste wird ueberflogen; ein Sprung ist ein Klick.

   NICHT `.marke` - die gibt es seit dem Foerderradar und sie ist etwas
   anderes: eine Themenmarke ohne Ziel. Zwei Bauteile mit einem Namen
   ueberschreiben sich gegenseitig, und das trifft Seiten, an denen niemand
   gearbeitet hat (test_jedes_bauteil_wird_genau_einmal_definiert). */
.spruenge { display: flex; flex-wrap: wrap; gap: var(--a2); margin: 0 0 var(--a4); }
.sprung {
  display: inline-flex;
  align-items: center;
  gap: var(--a2);
  padding: var(--a1) var(--a3);
  border-radius: var(--ecke-rund);
  border: 1px solid currentColor;
  font-size: var(--s-klein);
  font-weight: 600;
  text-decoration: none;
}
.sprung--rot { color: var(--schlecht); }
.sprung--gelb { color: var(--warnung); }
/* DIE ZAHL BRAUCHT EINE EIGENE SCHRIFTFARBE. `background: currentColor`
   allein faerbt Flaeche UND Schrift gleich - die Zahl war unsichtbar
   (gesehen 21.08.2026 im Browser, nicht im Test: Ein Test sieht keine
   Farben). */
/* DIE ZAHL BRAUCHT BEIDE FARBEN AUSDRUECKLICH. `background: currentColor`
   zusammen mit `color: …` in DERSELBEN Regel ist eine Falle: `currentColor`
   nimmt die neue Schriftfarbe, Flaeche und Schrift werden gleich, und die
   Zahl verschwindet. Zweimal im Browser gesehen und zweimal an derselben
   Stelle - deshalb steht es hier. */
.sprung__zahl {
  min-width: 1.2rem;
  padding: 0 .3rem;
  border-radius: var(--ecke-klein);
  color: var(--grund);
  text-align: center;
  font-variant-numeric: tabular-nums;
}
.sprung--rot .sprung__zahl { background: var(--schlecht); }
.sprung--gelb .sprung__zahl { background: var(--warnung); }

/* DER STAND ALS AUFKLAPPER: geschlossen ist er ein Wort, offen die
   Begruendung. Ist nichts offen, gibt es keinen Aufklapper - dann steht nur
   „Vollstaendig" da (Vorgabe Murat: „yükümlülükleri yerine getirince
   silinsin"). */
.stand > summary {
  list-style: none;
  cursor: pointer;
  display: inline-flex;
  align-items: center;
  gap: var(--a1);
  color: var(--leise);
  font-size: var(--s-klein);
  font-weight: 600;
}
.stand > summary:hover { color: var(--akzent); }
/* Das Zeichen dreht sich beim Oeffnen - die einzige Ruecklmeldung, die ein
   Aufklapper ohne Skript geben kann. */
.stand > summary .sym { transition: transform .15s ease-out; }
.stand[open] > summary .sym { transform: rotate(90deg); }
.stand > summary::-webkit-details-marker { display: none; }
.stand__zahl {
  margin-left: var(--a1);
  padding: 0 .3rem;
  border-radius: var(--ecke-klein);
  background: currentColor;
  color: var(--grund);
  font-size: var(--s-klein);
}
.stand__inhalt {
  margin-top: var(--a2);
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(20rem, 1fr));
  gap: var(--a4) var(--a5);
  padding-left: var(--a3);
  border-left: 2px solid var(--linie);
  font-size: var(--s-klein);
  color: var(--leise);
  max-width: 46rem;
}
.stand__inhalt p { margin: 0 0 var(--a2); }
.stand__spalte > form { margin-top: var(--a3); }
.stand__inhalt i { color: var(--akzent); font-style: normal; font-weight: 600; }

/* DIE BELEGE IN DER ZEILE. Das Blatt ist breiter als das Menue sonst, weil
   zwei Auswahlfelder und eine Liste darin stehen. */
.belegliste { list-style: none; margin: 0 0 var(--a3); padding: 0; }
.belegliste li {
  display: flex;
  align-items: center;
  gap: var(--a2);
  padding: var(--a1) 0;
  border-bottom: 1px solid var(--linie);
}
.belegliste li:last-child { border-bottom: 0; }
.belegliste a { flex: 1; overflow: hidden; text-overflow: ellipsis; }

/* Das Erfassungsformular OBEN - eine Reihe, keine Karte. */
.erfassen { margin: 0 0 var(--a4); }
.planblatt { padding-top: var(--a4); }

/* DIE BEGRUENDUNG UNTER DER ZEILE (P1-15). Sie gehoert optisch zur Zeile
   darueber, nicht daneben - deshalb kein eigener Kasten, sondern ein
   zurueckgenommener Block ohne Zebra-Wechsel. Ein Kasten waere ein zweites
   Element; das hier ist dieselbe Zeile, nur ausfuehrlicher. */
.tabelle tr.zeile--grund td {
  padding-top: 0;
  border-bottom: 1px solid var(--linie);
  color: var(--leise);
  font-size: var(--s-klein);
}
.tabelle--zebra tbody tr.zeile--grund { background: inherit; }
.zeile--grund p { margin: 0 0 var(--a2); }
.zeile--grund p:last-child { margin-bottom: 0; }
.zeile--grund i { color: var(--akzent); font-style: normal; font-weight: 600; }

/* Mehrere Aktionen in EINER Zeile, nebeneinander und rechtsbuendig.
   `inline` allein genuegt nicht: Ein <form> mit einem inline-flex-Knopf
   darin bricht um, sobald die Spalte schmal wird. */
.tabelle td.rechts { white-space: nowrap; }
.tabelle td.rechts .reihenform { display: inline-flex; margin-left: var(--a2); }
.tabelle td.rechts .reihenform:first-of-type { margin-left: 0; }

/* ===== GELD: EIN BLICK, EINGABEN IM DIALOG ============================== */
.geldseite { display: grid; gap: var(--a5); padding: var(--a5); }
/* Nur noch die Kasse – die zwei Knöpfe daneben stehen seit v0.95.0 am
   Abschnitt, den sie ändern (Vorgabe Murat, 21.08.2026). */
.geldkopf { display: grid; gap: var(--a4); }

/* ===== §17b GELD BUCHEN (v1.31.0) =======================================
   Vorgabe Murat, 09.09.2026: „o kutunun üst köşesinde + Rechnung."

   DIE ZEILE ÜBER DEM GELDKASTEN trägt den Namen und die eine Handlung. Sie
   ist kein `.abschnittkopf`: Der bringt eine Unterzeile und eigene
   Abstände mit, und hier steht nichts als ein Wort und ein Knopf. */
.geldkopf__zeile {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--a4);
  flex-wrap: wrap;
}

.geldkopf__zeile h2 { margin: 0; font-size: var(--s-h2); }

/* DIE ART-AUSWAHL IM DIALOG LÄUFT OHNE JAVASCRIPT – Radioknöpfe und
   `:has()`, dieselbe Mechanik wie die Projektwahl auf der Übersicht (§7b2).
   Das ist nicht Sparsamkeit, sondern Verlässlichkeit: Die Umschaltung steht
   auch dann, wenn ein Skript nicht geladen hat, und sie ist mit der
   Tastatur bedienbar, ohne dass jemand das nachbauen muss. */
.buchart {
  display: flex;
  flex-wrap: wrap;
  gap: var(--a2);
  margin-bottom: var(--a5);
  padding-bottom: var(--a4);
  border-bottom: 1px solid var(--linie);
}

/* Unsichtbar, aber NICHT `display: none` – sonst fielen sie aus dem
   Tabulatorlauf und die Auswahl wäre nur mit der Maus bedienbar. */
.buchart input {
  position: absolute;
  width: 1px;
  height: 1px;
  opacity: 0;
  pointer-events: none;
}

.buchart label {
  padding: var(--a2) var(--a4);
  border: 1px solid var(--linie);
  border-radius: var(--ecke-klein);
  background: var(--grund);
  color: var(--leise);
  font-size: var(--s-hinweis);
  font-weight: 600;
  cursor: pointer;
}

.buchart label:hover { color: var(--text); background: var(--papier); }

/* FLÄCHE UND KANTE, nicht nur Farbe (DESIGN_SYSTEM §3.2): Wer Grün nicht
   von Grau unterscheidet, sieht trotzdem, welche Art gewählt ist. */
.buchart input:checked + label {
  border-color: var(--akzent);
  background: var(--akzent-hell);
  color: var(--akzent);
}

.buchart input:focus-visible + label {
  outline: 2px solid var(--fokus);
  outline-offset: 2px;
}

/* EIN FORMULAR JE ART, EINES SICHTBAR. Die Zuordnung läuft über die
   Kennung des Knopfes – vier Regeln für vier Arten, sichtbar statt
   versteckt. */
.buchfeld { display: none; }
.buchdialog:has(#buchart-rechnung:checked) .buchfeld--rechnung,
.buchdialog:has(#buchart-zahlungseingang:checked) .buchfeld--zahlungseingang,
.buchdialog:has(#buchart-mittelabruf:checked) .buchfeld--mittelabruf,
.buchdialog:has(#buchart-rueckzahlung:checked) .buchfeld--rueckzahlung {
  display: block;
}

/* DIE ABLAGEN. Zwei bei einer Rechnung (Beleg und Zahlungsnachweis), eine
   bei allem anderen – die Prüfregeln unterscheiden die Rollen einzeln, eine
   gemeinsame Ablage müsste raten, was hochgeladen wurde. */
.ablagen {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: var(--a4);
  margin-top: var(--a5);
}

.ablagen--eine { grid-template-columns: minmax(0, 1fr); }

.ablage {
  display: grid;
  justify-items: start;
  gap: var(--a2);
  padding: var(--a4);
  /* GESTRICHELT, WEIL ES EINE ABLAGE IST UND KEIN KASTEN: Die gestrichelte
     Kante ist die eine Kontur, die überall „hier kann etwas hinein" heisst.
     Sie ist gelernt, und sie muss nicht erklärt werden. */
  border: 2px dashed var(--linie);
  border-radius: var(--ecke-klein);
  background: var(--papier);
}

.ablage__name {
  display: flex;
  align-items: center;
  gap: var(--a2);
  font-weight: 600;
  color: var(--text);
}

.ablage__satz { color: var(--leise); font-size: var(--s-klein); }

/* Der Dateiname erscheint erst, wenn eine Datei da ist (buchung.js). Leer
   nimmt er keinen Platz - ein leerer Kasten unter jeder Ablage sähe aus
   wie ein Feld, das man ausfüllen müsste. */
.ablage__datei:empty { display: none; }
.ablage__datei {
  max-width: 100%;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  color: var(--akzent);
  font-size: var(--s-klein);
  font-weight: 600;
}

.ablage--ueber { border-color: var(--akzent); background: var(--akzent-hell); }
.ablage--voll { border-style: solid; border-color: var(--akzent); }

/* Die Datei im Feld bleibt unsichtbar; bedient wird über das <label>, das
   wie ein Knopf aussieht - dieselbe Mechanik wie bei der Belegaufnahme. */
.ablage input[type="file"] {
  position: absolute;
  width: 1px;
  height: 1px;
  opacity: 0;
}

/* DAS SAMMELBAND ÜBER DER BUCHUNGSLISTE. „3 von 12 ohne Beleg" ist die
   Auskunft, mit der jemand die Seite öffnet; sie in zwölf Zeilen suchen zu
   lassen wäre die Arbeit, die diese Zeile abnimmt. */
.belegband {
  display: flex;
  align-items: baseline;
  gap: var(--a2);
  margin: 0;
  padding: var(--a3) var(--a4);
  border-left: 3px solid var(--linie);
  border-radius: var(--ecke-klein);
  background: var(--papier);
  font-size: var(--s-hinweis);
}

.belegband--schlecht { border-left-color: var(--schlecht); }
.belegband--gut { border-left-color: var(--gut); }
.belegband .sym { flex: 0 0 auto; }
.belegband--schlecht .sym { color: var(--schlecht); }
.belegband--gut .sym { color: var(--gut); }

/* ===== §17c DAS JOURNAL (v1.32.0) =======================================
   Die Filterzeile über dem Journal. Sie ist ein Formular mit `method="get"`
   – die Auswahl steht damit in der Adresse und ist weitergebbar. Als
   Zeile und nicht als Kasten: Sie ist Beiwerk zur Tabelle darunter und
   soll nicht aussehen wie ein zweiter Seitenanfang. */
.journalfilter {
  display: flex;
  flex-wrap: wrap;
  align-items: flex-end;
  gap: var(--a3);
  padding: var(--a3) var(--a4);
  border: 1px solid var(--linie);
  border-radius: var(--ecke-klein);
  background: var(--papier);
}

.journalfilter .feld { margin: 0; min-width: 9rem; flex: 0 1 12rem; }
.journalfilter__tat { display: flex; gap: var(--a2); margin-left: auto; }

@media (max-width: 620px) {
  .journalfilter .feld { flex: 1 1 100%; }
  .journalfilter__tat { margin-left: 0; flex: 1 1 100%; }
}

/* DIE GANZE ZEILE IST DER GRIFF (buchung.js). Der Zeiger sagt es, und
   `:focus-visible` zeigt sie auch dem, der mit der Tastatur kommt. */
.buchungen tr.buchung { cursor: pointer; }
.buchungen tr.buchung:focus-visible {
  outline: 2px solid var(--fokus);
  outline-offset: -2px;
}

.geldzahlen { display: grid; grid-template-columns: 1.5fr 1fr 1fr;
  gap: var(--a4); padding: var(--a5); border-radius: var(--ecke);
  background: var(--akzent); color: var(--grund); }
.geldzahlen--offen { grid-template-columns: minmax(0, 1fr) auto;
  align-items: center; background: var(--grund); color: var(--text);
  border: 1px solid var(--linie); }

/* DIE FLÄCHE WECHSELT DIE FARBE, WENN DAS GELD KNAPP WIRD (Vorgabe Murat,
   21.08.2026: „sıfıra yaklaşınca kırmızıya dönerse çok daha güzel olur").

   Das ist keine Dekoration, sondern die einzige Warnung, die man sieht,
   ohne zu rechnen: Wer 96 % ausgegeben hat, hat kein Problem mit einer
   Zahl, sondern mit dem Rest des Projekts. Die Stufen kommen aus
   `budget.kasse` (`stufe`), nicht aus der Vorlage – gerechnet wird an einer
   Stelle.

   FARBE IST NIE DAS EINZIGE MERKMAL: Über der Zahl steht weiterhin „Noch
   verfügbar", und bei Überschreitung sagt ein Satz darunter, was los ist. */
.geldzahlen--knapp { background: var(--warnung); }
.geldzahlen--kritisch { background: var(--schlecht); }

/* DIE HERKUNFTSZEILE ERBT DIE SCHRIFTFARBE DER FLÄCHE. Ohne diese Regel
   nimmt sie `--leise` (ein Grauton für den hellen Grund) und stand auf der
   gelben Fläche praktisch unlesbar da – gemessen am 21.08.2026. Dieselbe
   Falle wie überall, wo ein Bauteil auf einer eingefärbten Fläche landet:
   Die Farbe der Fläche ist bekannt, die des Textes wurde vergessen. */
.geldzahlen .kasse__quelle { color: inherit; opacity: .85; }
.geldzahlen .kasse__quelle a { color: inherit; }
.geldzahl { display: grid; align-content: center; gap: var(--a1); }
.geldzahl span, .geldzahl small { font-size: var(--s-klein); opacity: .85; }
.geldzahl strong { font-size: var(--s-h2); font-variant-numeric: tabular-nums; }
.geldzahl--haupt strong { font-size: 2.25rem; letter-spacing: -.02em; }
.geldzahl--haupt small { max-width: 34rem; }
.geldzahlen .kasse__balken { grid-column: 1 / -1; }
.offene-karten { display: flex; flex-wrap: wrap; gap: var(--a2); }
/* OHNE TRENNLINIE (Vorgabe Murat, 21.08.2026: „o kutucuğun üstündeki uzun
   çizgiyi kaldır. Her yeri çizgi çizgi bölmüşsün yani").

   Er hat recht, und es war eine Linie zu viel in einer Reihe von dreien: Der
   Abschnitt trägt seine eigene Trennlinie unten (§15a), das Reiterband trägt
   eine darüber – und dazwischen zog der Abschnittskopf eine dritte, keine
   drei Zentimeter entfernt. Was eine Überschrift von ihrem Inhalt trennt,
   ist der ABSTAND; eine Linie trennt einen Abschnitt vom nächsten. */
.abschnittkopf { display: flex; justify-content: space-between; align-items: end;
  gap: var(--a4); padding-bottom: var(--a3); }
.abschnittkopf h2, .abschnittkopf p { margin: 0; }
.abschnittkopf p { color: var(--leise); font-size: var(--s-klein); }
.abschnittkopf > strong { font-size: var(--s-h2); font-variant-numeric: tabular-nums; }
/* Woher die grosse Zahl stammt (PR-02) – leise, aber immer da. */
.kasse__quelle { grid-column: 1 / -1; color: var(--leise);
  font-size: var(--s-klein); }
/* Mehrere Knöpfe rechts im Abschnittskopf (AN-06). Auf schmalen Geräten
   brechen sie um, statt den Titel zu quetschen. */
.kopftaten { display: flex; flex-wrap: wrap; gap: var(--a2); align-items: center; }
/* `.ausgabenliste` UND `.ausgabekarte` SIND AM 21.08.2026 ENTFALLEN
   (Vorgabe Murat: „Excel tipi bir listeleme istiyorum. Her zaman Excel
   tipi."). Zwölf Listen benutzten sie – Ausgaben, Mittelabrufe, Fristen,
   Bescheide, Pakete, Nachweise, Nachforderungen, Entscheidungen,
   Einreichungen, Checkliste, Budgetpositionen und die Fristen der
   Übersicht. Alle stehen jetzt in `.tabelle` (§8), dem Bauteil, das für
   viele gleichartige Zeilen gebaut ist und seit dem 20.08.2026 auf seine
   Vorgabe hin enge Zeilen hat.

   ES WAR EINE DOPPELUNG IM EIGENEN BAUKASTEN: zwei Bauteile für „Liste von
   Datensätzen", eines davon mit Rahmen je Zeile. Was die Karte konnte und
   die Tabelle brauchte, steht als `.tabelle__zweit` und `.tabelle__taten`
   bei der Tabelle. */
.aufgabecheck { margin: 0; }
.aufgabecheck__knopf { display: grid; place-items: center; width: 1.5rem;
  height: 1.5rem; padding: 0; border: 1px solid var(--linie);
  border-radius: .25rem; background: var(--grund); cursor: pointer; }
.aufgabecheck__knopf:hover { border-color: var(--akzent); }
.aufgabecheck__knopf:focus-visible { outline: 3px solid var(--fokus); outline-offset: 2px; }
.aufgabecheck__knopf--erledigt { border-color: var(--akzent); background: var(--akzent); }
.aufgabecheck__knopf--erledigt::after { content: "✓"; color: var(--grund);
  font-size: .9rem; font-weight: 700; }
/* `.exportkarte` ist am 21.08.2026 entfallen: Der Ausschnitt „Unterlagen
   herunterladen" ist jetzt ein eigener TEIL des Geldblattes und damit ein
   normaler Abschnitt – eine gerahmte Karte mitten in einer Seite aus
   flachen Abschnitten war genau der Kasten im Kasten, den §15a verbietet. */

/* Ein Arbeitsdialog ist ein kurzer, abgeschlossener Vorgang. Kein Aufklapper
   verlaengert dafuer die Seite; der Hintergrund bleibt als Orientierung da. */
.arbeitsdialog { width: min(36rem, calc(100vw - 2rem)); max-height: calc(100vh - 2rem);
  padding: 0; border: 1px solid var(--linie); border-radius: var(--ecke);
  background: var(--grund); color: var(--text); }
.arbeitsdialog--breit { width: min(68rem, calc(100vw - 2rem)); }
.arbeitsdialog::backdrop { background: var(--schleier); }
.dialogkopf { position: sticky; top: 0; z-index: 1; display: flex;
  justify-content: space-between; gap: var(--a4); padding: var(--a4) var(--a5);
  border-bottom: 1px solid var(--linie); background: var(--grund); }
.dialogkopf h2, .dialogkopf p { margin: 0; }
.dialogkopf p { margin-top: var(--a1); color: var(--leise); font-size: var(--s-klein); }
.dialogzu { border: 0; background: none; color: var(--leise); font: inherit;
  font-size: 1.6rem; cursor: pointer; }
.arbeitsdialog > form, .dialoginhalt { padding: var(--a5); }
.dialograster { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--a3); }
.dialograster--plan { grid-template-columns: repeat(4, minmax(0, 1fr)); }
.dialograster .feld { margin: 0; max-width: none; }
.feld--breit { grid-column: 1 / -1; }
.dialogblock { padding-bottom: var(--a5); margin-bottom: var(--a5); border-bottom: 1px solid var(--linie); }
.dialogblock h3 { margin-top: 0; }
.dialogblock > .knopf { margin-top: var(--a3); }
.dialogtaten { position: sticky; bottom: 0; display: flex; justify-content: flex-end;
  gap: var(--a2); padding: var(--a3) var(--a5); border-top: 1px solid var(--linie);
  background: var(--grund); }
.dialogspalten { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--a5); }
.dialogspalten h3 { margin-top: 0; }
.pruefpunkt { padding: var(--a3); border-left: 3px solid var(--schlecht); background: var(--schlecht-hell); }
.pruefpunkt + .pruefpunkt { margin-top: var(--a2); }
.pruefpunkt p { margin: var(--a1) 0; color: var(--leise); }
.pruefpunkt strong { color: var(--akzent); font-size: var(--s-klein); }

/* ===== DER FINANZIERUNGSPLAN EINES ANTRAGS (v0.94.0) ====================
   BEFUND MURAT, 21.08.2026: „ne nedir, ne değil" – man sah drei Reihen
   Zahlen und keine Aussage darüber, wie sie zusammenhängen.

   DIE WAAGE OBEN ist die Aussage: Einnahmen minus Ausgaben ergibt die
   Differenz. Die Rechenzeichen stehen wirklich da – sie sind der Unterschied
   zwischen drei Zahlen nebeneinander und einer Rechnung. Für das
   Vorlesegerät sind sie `aria-hidden`: „minus" zwischen zwei Beträgen hilft
   dort nicht, die Beschriftungen tun es. */
/* DIE SEITE BEGINNT OBEN (Vorgabe Murat, 21.08.2026: „Finanzierungsplan'ı
   birkaç satır yukarı taşı, çok aralık var menüyle arasında"). `.geldseite`
   bringt für die Projektkasse einen eigenen Innenabstand mit; hier stand er
   zusätzlich zum Abstand der Arbeitsfläche und schob die Überschrift eine
   Zeile tief ins Bild. */
.finanzplanseite { padding: 0; gap: var(--a4); }

/* GLEICHMÄSSIG VERTEILT, NICHT ZWEI LINKS UND EINER RECHTS (Vorgabe Murat,
   21.08.2026: „biri solda biri sağda … onu yaymalıyız"). Die drei Glieder
   sind eine RECHNUNG und keine zwei Gruppen – sie stehen deshalb in
   gleichen Abständen über die Breite, mit den Rechenzeichen dazwischen. */
.planwaage {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: var(--a4);
  padding: var(--a4) var(--a5);
  border: 1px solid var(--linie);
  border-radius: var(--ecke);
  background: var(--grund);
}

.planwaage__seite { display: grid; gap: var(--a1); min-width: 9rem; flex: 1 1 0; }
.planwaage__seite strong {
  font-size: var(--s-h2);
  font-variant-numeric: tabular-nums;
}
.planwaage__seite .ampel { justify-self: start; }
.planwaage__zeichen { color: var(--leise); font-size: var(--s-h2); flex: 0 0 auto; }

/* ZWEI SPALTEN, ZWEI FRAGEN: woher und wofür. Nebeneinander sieht man, dass
   es zwei Seiten derselben Rechnung sind; untereinander wären es zwei
   Listen. */
.planspalten {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: var(--a5);
}

.planspalte { display: grid; gap: var(--a3); align-content: start; }
.planspalte h3 { margin: 0; font-size: var(--s-h3); }

/* Die Aufteilung der Einnahmen: eine Zeile je Quelle statt vier Kacheln, die
   aussehen wie die Kacheln daneben, aber etwas anderes bedeuten. */
.planquellen {
  display: grid;
  gap: var(--a1);
  padding: var(--a3) var(--a4);
  border: 1px solid var(--linie);
  border-radius: var(--ecke-klein);
}

.planquelle {
  display: flex;
  justify-content: space-between;
  gap: var(--a3);
  font-size: var(--s-hinweis);
}

.planquelle span { color: var(--leise); }
.planquelle b { font-variant-numeric: tabular-nums; }


@media (max-width: 900px) {
  .planspalten { grid-template-columns: 1fr; }
  .planwaage__zeichen { display: none; }
}

/* ===== FÖRDERRADAR: KARTEN STATT BREITER TEXTTABELLE =================== */
.arbeitsdialog--filter { width: min(48rem, calc(100vw - 2rem)); }
.arbeitsdialog--filter .haken__eintrag { align-self: center; padding: var(--a2) 0; }
.knopf--aktiv { border-color: var(--akzent); color: var(--akzent); }
/* DIE TREFFERZAHL UND DAS SORTIEREN STEHEN IN DER KOPFZEILE (Vorgabe Murat,
   21.08.2026). Sie waren ein Band ÜBER der Liste – also Bedienung an einer
   Stelle, an der Inhalt beginnen sollte. `.radarleiste` ist damit entfallen;
   was übrig bleibt, sind zwei Teile der Kopfzeile.

   Die Zahl gehört zum TITEL (links), das Sortieren zur ANSICHT (rechts) –
   dieselbe Aufteilung wie bei Filter und Merkzettel (§14b). */
.kopfzahl { margin: 0; color: var(--leise); font-size: var(--s-hinweis); }
.kopfzahl b { color: var(--text); font-size: var(--s-text); }
/* DIE RADARKARTEN SIND AM 23.08.2026 ZU ZEILEN GEWORDEN (Vorgabe Murat:
   „Förderradar satirlar seklinde göstermeli"). Mit ihnen entfallen
   `.radarkarten`, `.radarkarte*`, `.radarfakten` und `.kopfsortierung` –
   letztere, weil sortiert wird, wo sortiert gehört: an der
   Spaltenüberschrift (§8b, `.sortkopf`). Die Liste benutzt jetzt dieselbe
   Bauform wie die Kundenliste; eine zweite Listenform hätte nur bedeutet,
   dass beide auseinanderlaufen (DESIGN_SYSTEM §5.9).

   `.fristmarke--abgelaufen` bleibt: Es ist die einzige Regel der alten
   Karten, die in der Zeile weiterarbeitet. Ein rotes Datum ist nie das
   einzige Merkmal – daneben steht das Wort für das Vorlesegerät. */
.fristmarke--abgelaufen { color: var(--schlecht); font-weight: 600; }
.markenreihe { display: flex; flex-wrap: wrap; gap: var(--a1); }
.radardetails h3 { margin: var(--a4) 0 var(--a2); }
.radardetails h3:first-child { margin-top: 0; }
.radardetails ul { margin: 0; padding-left: var(--a5); color: var(--leise); }
.unterlagenliste { display: flex; flex-wrap: wrap; gap: var(--a2); }

@media (max-width: 900px) {
  .dialograster--plan { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (max-width: 620px) {
  .geldseite { padding: var(--a3); }
  .geldzahlen, .geldzahlen--offen { grid-template-columns: 1fr; }
  .geldzahlen .kasse__balken { grid-column: 1; }
  .dialograster, .dialograster--plan, .dialogspalten { grid-template-columns: 1fr; }
  /* Zwei Ablagen nebeneinander sind am Telefon zwei halbe Ablagen. */
  .ablagen { grid-template-columns: minmax(0, 1fr); }
}

@media (prefers-reduced-motion: reduce) {
  .ladebalken { transition: none; }
  .ladefunke { transition: none; }
  .ladefunke__ring { animation: none; }
}

/* ===== §16 DAS RECHNUNGSPAPIER (v0.52.0) =================================
   Eine Seite, die GEDRUCKT wird. Deshalb ist sie das einzige Stück dieser
   Anwendung ohne Navigation: Eine grüne Seitenleiste auf einer Rechnung ist
   Toner, den niemand bestellt hat.

   SIE BENUTZT DIESELBEN WERTE wie alles andere (Abstände, Linien, Schrift) –
   ein eigenes Wertepaar „nur fürs Papier" wäre die zweite Gestaltung, vor
   der DESIGN_SYSTEM §1 warnt. Was hier wirklich anders ist, ist nur die
   Breite: Ein Blatt ist 21 cm, und mehr als 18 cm Textbreite liest sich auf
   Papier schlecht. */
.papierseite { background: var(--papier); }

.papier {
  max-width: 18cm;
  margin: 0 auto;
  padding: var(--a6) var(--a5) var(--a7);
  background: var(--grund);
}

.papier__leiste {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--a4);
  margin-bottom: var(--a6);
}

.papier__kopf {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: var(--a5);
  padding-bottom: var(--a5);
  border-bottom: 1px solid var(--linie);
  color: var(--leise);
  font-size: var(--s-klein);
  line-height: 1.5;
}

.papier__marke { height: 40px; width: auto; }

/* Das Anschriftfeld sitzt dort, wo es in einem Fensterumschlag sichtbar
   wäre. Das ist kein Zierrat: Wer die Rechnung ausdruckt und eintütet,
   erwartet genau diese Stelle (DIN 5008). */
.papier__anschrift { margin: var(--a6) 0 var(--a7); white-space: pre-line; }

.papier__angaben h1 { margin: 0 0 var(--a4); font-size: var(--s-h2); }
.papier__angaben dl,
.papier__summe dl {
  display: grid;
  grid-template-columns: auto auto;
  justify-content: start;
  gap: var(--a1) var(--a5);
  margin: 0;
}
.papier__angaben dt { color: var(--leise); }
.papier__angaben dd, .papier__summe dd { margin: 0; }

.papier__posten { width: 100%; border-collapse: collapse; margin: var(--a5) 0; }
.papier__posten th {
  padding: var(--a2) var(--a3);
  border-bottom: 1px solid var(--linie);
  color: var(--leise);
  font-size: var(--s-klein);
  text-align: left;
}
.papier__posten td { padding: var(--a3); border-bottom: 1px solid var(--linie); }
.papier__posten .zahl, .papier__summe dd { text-align: right; }

/* Die Summe steht rechts – dorthin schaut man zuerst. */
.papier__summe { display: flex; justify-content: flex-end; }
.papier__summe dl { grid-template-columns: auto 7rem; }
.papier__gesamt {
  padding-top: var(--a2);
  border-top: 1px solid var(--linie);
  font-weight: 600;
}

.papier__hinweis { margin: var(--a5) 0 0; color: var(--leise); font-size: var(--s-hinweis); }

/* WAS NICHT AUFS PAPIER GEHÖRT. `.nicht-drucken` trägt jedes Bedienelement
   und der Verlauf: Der Verlauf ist UNSERE Nachvollziehbarkeit (GoBD), nicht
   die Auskunft an den Kunden – auf seinem Beleg hätte „festgeschrieben
   durch Murat" nichts zu suchen. */
@media print {
  .nicht-drucken { display: none !important; }
  .papierseite, .papier { background: var(--druck-grund); }
  .papier { max-width: none; padding: 0; }
}

/* Der Betreiber in der Mitgliederliste. Er ist KEINE Rolle des Vereins –
   deshalb eine eigene Farbe und ein eigener Platz (am Namen, nicht in der
   Rollenspalte). Vorgabe Murat, 15.08.2026: „hangileri admin hangileri
   superadmin oldugunu nerden bilicez haci ya." */
.rolle--betreiber {
  border-color: var(--text);
  background: var(--text);
  color: var(--grund);
}

/* ===== §17 DIE KUNDENAKTE (v0.55.0) ======================================
   Der Kopf steht auf JEDEM Blatt der Akte: Name, Zustand, die drei Zahlen.
   Wer auf dem Blatt „Rechnungen" steht, soll nicht zurückblättern müssen,
   um zu sehen, ob dieser Verein überhaupt noch aktiv ist. */
.aktenkopf {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  flex-wrap: wrap;
  gap: var(--a4);
  padding-bottom: var(--a5);
  margin-bottom: var(--a5);
  border-bottom: 1px solid var(--linie);
}

.aktenkopf h2 { margin: var(--a2) 0 var(--a1); }
.aktenkopf p { margin: 0; }

.aktenkopf__zahlen {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: var(--a4);
}

/* Zahl gross, Wort klein – dieselbe Bauart wie die Kennzahlen im Dashboard,
   nur waagerecht. Kein zweites Bauteil: `.kennzahl` steht in einem Raster
   und würde hier eine ganze Zeile für sich nehmen. */
.kennwert { color: var(--leise); font-size: var(--s-hinweis); }
.kennwert b { color: var(--text); font-size: var(--s-h2); margin-right: var(--a1); }

/* Der Anlegeblock über der Kundenliste. Er steht IMMER offen (Vorgabe
   Murat, 15.08.2026) – ein Klappelement, das man ohnehin immer aufmacht,
   ist keins. Was er braucht, ist Abstand nach unten: Ohne ihn klebt das
   Formular an der Liste, und beides liest sich als ein Block. */
/* MIT TRENNLINIE UND ABSTAND, ausdrücklich: `.abschnitt:last-of-type`
   nimmt die Linie weg, und dieser Block ist als einziges <section> in
   seinem Behälter zugleich das letzte seiner Art. Ohne diese zwei Zeilen
   klebt das Formular an der Liste, und beides liest sich als ein Block
   (Befund Murat, 15.08.2026: „alttaki listeyle biraz mesafe kalsin"). */
.anlegeblock {
  padding-bottom: var(--a5) !important;
  margin-bottom: var(--a6);
  border-bottom: 1px solid var(--linie) !important;
}
.anlegeblock > h2 { margin-top: 0; }

/* Überschrift links, seltene Griffe rechts (v0.97.0). Der Papierkorb ist
   kein Blatt mehr, sondern ein Knopf mit seiner Zahl – man sieht ihn selten
   an, und ein Reiter, den man einmal im Quartal öffnet, kostet in jeder
   anderen Sitzung Platz (DESIGN_SYSTEM §5.6).

   SEIT v0.99.5 `flex-end` UND NICHT MEHR `space-between`: Die Überschrift
   ist auf Vorgabe Murats aus dem Bild genommen (`.nur-vorlesen` in
   verwaltung.html). Eine vorlesbar-verborgene Überschrift nimmt im Raster
   keinen Platz mehr ein – mit `space-between` wäre der Papierkorb damit
   nach LINKS gewandert, an den Anfang der Zeile. */
.anlegeblock__kopf {
  display: flex;
  align-items: center;
  justify-content: flex-end;
  gap: var(--a3);
  flex-wrap: wrap;
}
.anlegeblock__kopf > h2 { margin: 0; }

/* Name und Angaben in EINER Zeile (Vorgabe Murat, 15.08.2026). Untereinander
   waren es zwei Zeilen für eine Auskunft, und die zweite las sich wie eine
   eigene Überschrift. */
.aktenkopf__name { display: flex; align-items: baseline; flex-wrap: wrap; gap: var(--a3); }
.aktenkopf__name small { color: var(--leise); font-size: var(--s-hinweis); font-weight: 400; }

/* Der erste Abschnitt der Akte braucht Abstand zum Kopf – ohne ihn beginnt
   „Stammdaten" unmittelbar unter der Trennlinie und liest sich wie deren
   Bildunterschrift (Befund Murat: „stammdaten niye birkac satir alttan
   baslamiy"). */
.aktenkopf + .abschnitt { padding-top: var(--a4); }


/* ===== §22 NACHRICHTEN IN DER SEITENLEISTE (v0.97.0) =====================
   Der Posteingang ist kein Reiter des Betriebs mehr, sondern ein Griff
   neben Kontakt (templates/teile/nachrichten.html, Kopf).

   ER IST EIN <button> UND KEIN <a>, weil dahinter keine Seite liegt,
   sondern ein Dialog. Ein Verweis auf „nichts" wäre für ein Vorlesegerät
   eine Lüge über die Bauform. Deshalb bekommt er hier das Aussehen der
   Verweise daneben – die Regeln stehen absichtlich NICHT doppelt, sondern
   der Knopf wird in die vorhandenen Selektoren aufgenommen (§ oben,
   `.navi a, .navi__knopf`). Was bleibt, sind die drei Eigenschaften, die
   ein <button> vom Browser mitbringt und die ein <a> nicht hat. */
.navi__knopf {
  width: 100%;
  border: 0;
  background: none;
  font-family: inherit;
  cursor: pointer;
  text-align: left;
}

/* Der Antwort-Aufklapper im Nachrichten-Dialog. Zugeklappt ist er ein Wort;
   offen wäre er ein leeres Textfeld je Nachricht – bei zwanzig Einträgen
   eine Wand aus Kästen, durch die man scrollt, um die eine zu finden, die
   man beantworten will. */
.antwort { margin-top: var(--a3); }
.antwort > summary { cursor: pointer; color: var(--akzent); font-weight: 600; }
.antwort textarea { width: 100%; }


/* ===== §23 DIE ZEILE IST DAS FORMULAR ====================================
   Vorgabe Murat, 21.08.2026: „tek bir satır olacak … Excel tarzı doldurmak
   istiyorum." Name, Rechtsform und Nutzungszeitraum standen zwar in der
   Kundenliste, ändern liessen sie sich aber eine Seite weiter – dort in
   ZWEI getrennten Formularen. Jetzt stehen die Felder in den Zellen.

   ======================================================================
   WAS AM 22.08.2026 GEÄNDERT WURDE UND WARUM (Befund Murat: „burda niye
   adam gibi durmuyor")
   ======================================================================
   Die erste Fassung liess die Felder im Ruhezustand RAHMENLOS und zeigte
   den Rahmen erst bei :hover. Der Gedanke war „es soll wie eine Liste
   aussehen, nicht wie ein Antragsformular". Das Ergebnis war schlechter
   als beides: Ein Textfeld ohne Rahmen sieht aus wie Text, ein
   Auswahlfeld bringt seinen Pfeil trotzdem mit – also stand in einer
   Zeile halb Text, halb Formular, und nichts lag auf einer Linie.

   Jetzt tragen alle Felder DENSELBEN leisen Rahmen, dauerhaft. Eine Zeile,
   in der man tippen kann, darf danach aussehen; was sie nicht darf, ist
   nach Antragsformular aussehen – dafür sorgen der helle Rahmen und die
   fehlende Fläche, nicht das Weglassen des Rahmens.

   Zweitens war die Zeile DREI Zeilen hoch: „Akte öffnen" stand unter dem
   Namen, der Lizenzzustand unter dem Datum. Beides steht jetzt NEBEN
   seinem Feld (`.zelle__paar`), und aus „Akte öffnen" ist ein Zeichen
   geworden. In einer Liste, die man überfliegt, ist das der Unterschied
   zwischen Tabelle und Zettelhaufen. */
/* ======================================================================
   AM 22.08.2026 IST DIESE KLASSE IN `.tabelle--excel` (§8b) AUFGEGANGEN.
   ======================================================================
   Die Regeln stehen nicht mehr hier, und das ist die eigentliche Reparatur:
   Beide Klassen hingen an DERSELBEN Tabelle und stritten sich Zeile für
   Zeile. `.tabelle--zeilenformular input { width: 100% }` gegen
   `.tabelle--excel input { width: 100% }` blieb harmlos – aber
   `input[name="vereinsname"] { min-width: 11rem }` machte jedes Feld
   unschrumpfbar, und dadurch lief der Zellinhalt über die Nachbarspalte.
   Gemessen: Zelle 118 px, Feld 176 px.

   Zwei Klassen, die dasselbe Element gestalten, sind kein Baukasten,
   sondern eine Wette darauf, welche Zeile weiter unten steht.

   WAS AUS DER ALTEN KLASSE ÜBERNOMMEN WURDE: die Felder in den Zellen
   (Vorgabe Murat, 21.08.2026: „tek bir satır olacak … Excel tarzı
   doldurmak istiyorum"), die einzeilige Zeile mit `.zelle__paar` statt
   dreier Zeilen, und der Griff in die Akte als Zeichen. Was NICHT
   übernommen wurde: der dauerhafte Rahmen um jedes Feld. Er war die
   Antwort auf „halb Text, halb Formular" – und wurde selbst zum Befund
   („her yer birbirine girmiş"). In der Excel-Liste ist die ZELLE der
   Rahmen; der Rand erscheint beim Überfahren und beim Hineinklicken.

   `.zelle__paar` und `.zeilengriff` weiter unten bleiben: Sie gehören zur
   Zeile, nicht zur Tabellenklasse. */

/* Feld und seine Beigabe auf EINER Linie: der Weg in die Akte neben dem
   Namen, der Lizenzzustand neben dem Enddatum. */
.zelle__paar {
  display: flex;
  align-items: center;
  gap: var(--a2);
  min-width: 0;
}
.zelle__paar > .ampel { flex: none; white-space: nowrap; }

/* Der Griff in die Akte. Er ist ein Zeichen und kein Knopf: Er führt
   woanders hin, statt etwas zu tun – ein Knopfrahmen würde ihn mit den
   Handlungen am Zeilenende verwechselbar machen. */
.zeilengriff {
  display: inline-flex;
  flex: none;
  align-items: center;
  padding: var(--a1);
  border-radius: var(--ecke-klein);
  color: var(--leise);
}
.zeilengriff:hover { background: var(--akzent-hell); color: var(--akzent); }

/* Derselbe Griff auch als KNOPF (der Papierkorb über der Kundenliste). Ein
   <button> bringt vom Browser Rahmen, Fläche und eigene Schrift mit – ohne
   dieses Zurücksetzen stünde neben der Überschrift wieder der graue Kasten,
   den Murat am 22.08.2026 ausdrücklich weghaben wollte („etrafındaki o buton
   şeyini kaldır"). */
button.zeilengriff {
  gap: var(--a1);
  border: 0;
  background: none;
  font: inherit;
  cursor: pointer;
}

/* Die Handlungen am Zeilenende stehen nebeneinander. `form` ist hier ein
   leerer Behälter für den Speichern-Knopf (seine Felder liegen in den
   Zellen davor und finden ihn über das `form`-Attribut) – als Block bräche
   er die Reihe auf. Die Regel gilt jetzt für jede Handlungsspalte und nicht
   nur für eine Tabellenklasse; die engere Fassung für die Excel-Liste steht
   in §8b. */
.spalte--handlung {
  display: flex;
  align-items: center;
  justify-content: flex-end;
  gap: var(--a1);
  /* Kein Umbruch: Ein Knopf, der auf zwei Zeilen steht, sieht aus wie zwei
     Knöpfe. (Stand bis v0.99.5 als zweite Wurzel weiter oben.) */
  white-space: nowrap;
  text-align: right;
}
.spalte--handlung form { display: inline-flex; margin: 0; }

/* `.filter__zahl--offen` ist am 23.08.2026 entfallen. Es war die Marke
   „wartet" am Zugangs-Knopf – den gibt es nicht mehr: Die Zugänge stehen
   jetzt als Wort in einer eigenen Spalte (`.zellenwort`, §8b), und „wartet"
   ist dort der Text selbst statt einer Marke daran. Eine Regel ohne
   Benutzer ist kein Vorrat, sondern das, woraus in zwei Jahren 5 357
   Farbwerte werden (DESIGN_SYSTEM §0). */

/* Die Suchzeile über der Rechnungsliste. Ein Formular mit GET, damit der
   Suchbegriff in der Adresse steht und sich verlinken lässt. */
.suchzeile {
  display: flex;
  align-items: flex-end;
  gap: var(--a2);
  margin-bottom: var(--a4);
  flex-wrap: wrap;
}
.suchzeile .feld { margin: 0; min-width: 14rem; }
.suchzeile .feld--schmal { min-width: 10rem; }

/* Auf schmalen Schirmen bekommt die Tabelle ihren waagerechten Rollbalken
   (`.tabellenhuelle`). Was hier bleibt, ist die Lesbarkeit: Die Felder
   werden nicht kleiner als die Fingerkuppe, die sie treffen soll. */
@media (max-width: 900px) {
  .spalte--handlung { flex-wrap: wrap; }
}

/* ===== DIE TEXTWERKSTATT (C18) ===========================================
   ZWEI SPALTEN, UND DIE RECHTE IST NICHT DEKORATION. Links schreibt man,
   rechts steht, was der Fördergeber verlangt. Beides gleichzeitig zu sehen
   ist der ganze Zweck der Seite: Anforderungen in einem zweiten Fenster
   darüber liest man einmal und danach nie wieder – man liest sie, WÄHREND
   man schreibt, oder gar nicht.

   DIE RECHTE SPALTE IST SCHMAL UND FEST (22rem). Sie trägt Fragen, keine
   Absätze; mitwachsen zu lassen hiesse, dem Text den Platz zu nehmen, um
   den es hier geht.

   UNTER 900 px WIRD ES EINE SPALTE, und das Danebenliegende wandert UNTER
   den Text – nicht weg. Auf 390 px ist die Reihenfolge damit: schreiben,
   dann nachlesen. Das ist die richtige Reihenfolge für ein Telefon; wer
   erst die Anforderungen sähe, müsste an ihnen vorbeirollen, um zu
   schreiben. */
.werkstatt {
  display: grid;
  grid-template-columns: minmax(0, 1fr) 22rem;
  gap: var(--a5);
  align-items: start;
}

.werkstatt__text { min-width: 0; }
.werkstatt__rand { min-width: 0; }
.werkstatt__rand .abschnitt { margin-bottom: var(--a4); }

/* Das Textfeld ist der Arbeitsplatz und darf deshalb wachsen. `resize:
   vertical` und nicht `both`: Waagerecht zu ziehen bricht das Raster, und
   der Gewinn wäre keiner – längere Zeilen liest man schlechter. */
.werkstatt__text textarea {
  min-height: 22rem;
  resize: vertical;
  line-height: 1.6;
}

/* DER VORSCHLAG DER KI, und ausdrücklich NICHT als `.thema`. `.thema` ist
   zweispaltig (Überschrift links, Text rechts) und für die volle Seite
   gebaut; in der schmaleren linken Spalte der Werkstatt blieben dem Text
   knapp 150 px, gemessen im Browser am 08.09.2026. Hier steht deshalb ein
   einspaltiger Kasten.

   DIE FARBE IST DIE DES AKZENTS UND NICHT DIE DER WARNUNG: Ein Vorschlag
   ist kein Fehler. Was gefährlich wäre, steht als `.hinweis` darin. */
.werkstatt__vorschlag {
  margin-top: var(--a5);
  padding: var(--a4);
  border: 1px solid var(--linie);
  border-left: 3px solid var(--akzent);
  border-radius: var(--ecke);
  background: var(--grund);
}

.werkstatt__vorschlag h3 { margin: 0 0 var(--a3); }

/* Die Absätze des Vorschlags bleiben Absätze. Ohne das stünde ein
   mehrteiliger Text als eine Wand da, und niemand vergliche ihn mit dem
   eigenen. */
.werkstatt__vorschlagtext { white-space: pre-wrap; margin: 0 0 var(--a3); }

/* DIE KNOPFREIHEN DER WERKSTATT SIND KEINE DIALOGFUSSLEISTE. `.dialogtaten`
   ist `position: sticky; bottom: 0` – gebaut für den rollenden Innenraum
   eines `<dialog>`. Auf einer gewöhnlichen Seite klebt sie am unteren
   Fensterrand und legt sich über den Text darunter. Gemessen im Browser am
   08.09.2026: Die Reihe „Abbrechen/Speichern" überlagerte den Vorschlag der
   KI. Hier steht deshalb dieselbe Anordnung ohne das Kleben. */
.werkstatt__taten {
  display: flex;
  justify-content: flex-end;
  gap: var(--a2);
  margin-top: var(--a4);
  flex-wrap: wrap;
}

@media (max-width: 900px) {
  .werkstatt { grid-template-columns: minmax(0, 1fr); }
  /* AUF DEM TELEFON IST DAS FELD KLEINER, und das ist kein Rückschritt:
     22 rem Textfeld sind dort zwei Bildschirmhöhen, und alles darunter –
     der Vorschlag der KI, die Anforderungen – läge hinter einer Rollstrecke,
     von der man nicht weiss, dass sie endet. Wachsen kann das Feld
     weiterhin, von Hand oder mit dem Text. */
  .werkstatt__text textarea { min-height: 12rem; height: 14rem; }
}

/* ===== DIE VOLLSTÄNDIGKEITSPRÜFUNG EINES ANTRAGS (C19) ===================
   JEDE REGEL MIT IHREM ERGEBNIS, auch die erfüllten. Eine Liste, die nur
   die Lücken nennt, lässt offen, WORAUF geschaut wurde – und „nichts
   gefunden" ist etwas anderes als „nicht gesucht".

   DREI ZUSTÄNDE, DREI FARBEN, UND DIE FARBE IST NIE DAS EINZIGE MERKMAL
   (DESIGN_SYSTEM §3.2): Der Randstreifen unterscheidet sie fürs Auge, der
   Text unterscheidet sie für alle anderen. „Nicht entscheidbar" trägt
   bewusst die stille Farbe und nicht die der Warnung – es ist kein Mangel
   des Vereins, sondern eine Frage, die wir nicht beantworten können. */
.pruefliste { list-style: none; margin: 0; padding: 0; display: grid;
  gap: var(--a2); }

.pruefliste__punkt {
  padding: var(--a3) var(--a4);
  border: 1px solid var(--linie);
  border-left: 3px solid var(--linie);
  border-radius: var(--ecke-klein);
  background: var(--grund);
}

.pruefliste__punkt b { display: block; }
.pruefliste__punkt span { color: var(--leise); font-size: var(--s-klein); }

/* DAS ZUSTANDSWORT NEBEN DEM NAMEN. Es trägt die Farbe der Regel, aber es
   IST auch ohne Farbe eine Auskunft – das ist der Unterschied zwischen
   einem Merkmal und einer Dekoration. */
.pruefliste__punkt b small { margin-left: var(--a2); font-weight: 400; }
.pruefliste__punkt--erfuellt b small { color: var(--gut); }
.pruefliste__punkt--nicht_erfuellt b small { color: var(--warnung); }
.pruefliste__punkt--unbekannt b small { color: var(--leise); }

.pruefliste__punkt--erfuellt { border-left-color: var(--gut); }
.pruefliste__punkt--nicht_erfuellt { border-left-color: var(--warnung); }
.pruefliste__punkt--unbekannt { border-left-color: var(--leise); }

/* ===== DER AUFNAHMEVORGANG: BELEG ALS DATEI ODER FOTO (C22) ==============
   EIN FELD FÜR BEIDE WEGE. `capture="environment"` öffnet am Telefon die
   Kamera und tut am Rechner nichts – dort erscheint der gewohnte
   Dateiauswahldialog. Ein zweiter Knopf „Foto machen" wäre auf dem
   Schreibtisch ein Griff ins Leere.

   DAS `<input type="file">` STECKT IM LABEL und ist unsichtbar: Ein
   Dateifeld lässt sich nicht wie ein Knopf zeichnen, ein Label darum herum
   schon. Es bleibt trotzdem bedienbar – Tastatur und Vorleseprogramm
   greifen auf das echte Feld zu, nicht auf eine Attrappe daneben. Deshalb
   `opacity: 0` und nicht `display: none`: ein ausgeblendetes Feld ist für
   beide unerreichbar. */
.belegaufnahme { margin: 0; display: inline-flex; }

.belegaufnahme > .knopf { position: relative; overflow: hidden; cursor: pointer; }

.belegaufnahme input[type="file"] {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  opacity: 0;
  cursor: pointer;
}

/* Die sekundären Wege einer Förderakte (C23): „Antrag und Entscheidung
   ansehen", „Verlauf ansehen". Sie stehen UNTER der Reiterreihe und in
   der stillen Farbe – sie beantworten Fragen, die man selten stellt.
   Als gleichrangige Reiter kosteten sie täglich Platz neben den fünf
   Bereichen, in denen wirklich gearbeitet wird. */
.nebenwege {
  margin: var(--a2) 0 0;
  color: var(--leise);
  font-size: var(--s-klein);
}

.nebenwege a { color: var(--leise); }
/* SIE STEHEN RECHTS IN DER REITERZEILE (v1.29.0) und nicht mehr darunter.
   `margin-left: auto` schiebt sie an den rechten Rand des Reiterbandes –
   dieselbe Mechanik wie bei `.kopfzeile__aktionen`. */
.kopfzeile__reiter .nebenwege { margin: 0 0 0 auto; white-space: nowrap; }

.nebenwege a:hover { color: var(--akzent); }
.nebenwege a[aria-current] { color: var(--akzent); font-weight: 600; }
