/* =========================================================================
   tafel.css — das Gerüst, das BEIDE Anwendungen tragen
   =========================================================================
   Ausgezogen aus praxis-portal/static/style.css am 04.08.2026, damit tillY
   Termine dieselbe Hülle bekommt: Kopfleiste oben, Kachelleiste links,
   Inhalt über die volle Restbreite.

   WARUM EINE EIGENE DATEI UND KEINE KOPIE
     Der Kalender lädt seine Stile inline aus basis.html und kennt style.css
     nicht. Eine Kopie der Regeln dort wäre nach der ersten Änderung
     verschieden -- dieselbe Begründung, aus der globale-suche.js seit dem
     29.07.2026 von beiden geladen wird.

   WER SIE LÄDT
     tillY          base.html (relativ)
     tillY Termine  basis.html mit absolutem Pfad /static/tafel.css --
                    beide liegen hinter nginx auf derselben Herkunft.

   DIE TOKENS
     Hier stehen die --farbe-*-Namen des Portals. Der Kalender benutzt kurze
     Namen (--akzent statt --farbe-akzent); die Zuordnung stand bis zum
     06.08.2026 in tilly-termine/static/touren.css und läuft seitdem in die
     andere Richtung: basis.html setzt die kurzen Namen als Alias auf die
     langen. Warum sie dort und nicht mehr hier steht, erklärt der Block am
     Kopf von touren.css — kurz: beides zusammen wäre ein Zyklus, und CSS
     löst den nicht auf, sondern lässt beide Farben ganz fallen.
   ========================================================================= */

/* ===========================================================================
   Tafel-Gerüst: Kachelleiste links, Inhalt über die volle Restbreite
   ===========================================================================
   Til, 04.08.2026. Neu für das Dashboard; die übrigen Backend-Seiten ziehen
   in einem eigenen Schritt nach.

   WARUM DIE HÖHE ÜBER FLEXBOX UND NICHT ÜBER calc(100vh - Npx)
     Der erste Entwurf rechnete calc(100vh - 41px). Die Kopfzeile ist 45px
     hoch — und mit "Große Schrift" (--schrift-skalierung: 1.35) wieder
     anders. Jede feste Zahl wäre hier eine Wette gegen die eigene
     Schriftskalierung, und sie ging schon beim ersten Messen verloren:
     die Seite scrollte um vier Pixel.

   WARUM DIE LEISTE FÜR SICH SCROLLT
     Admins haben zwölf Bereiche. Mit großer Schrift endet die letzte Kachel
     bei 1055px — auf einem 900px-Schirm liegen zwei darunter, am iPad quer
     drei. Die waagerechte Pillenleiste konnte umbrechen; eine senkrechte
     kann das nicht. Also scrollt sie selbst, und der Inhalt rechts bleibt
     stehen. Gemessen, nicht geschätzt.
   ------------------------------------------------------------------------ */
.tafel {
  height: 100vh;
  display: flex;
  flex-direction: column;
  overflow: hidden;
}
/* EIN RASTER UND KEINE FLEXZEILE (10.08.2026)
   ------------------------------------------------------------------------
   Vorher war die Leiste flex mit `gap: 16px` und 20 px Innenabstand links.
   Damit begann das Suchfeld dort, wo die Marke aufhoerte -- gemessen bei
   82 px (Schirm) und 66 px (Handy), also an keiner Linie der Nav-Spalte.
   Ein Rand am Suchfeld haette daran nichts geaendert: er addiert sich zur
   Breite der Marke, und die haengt an der Schriftgroesse.

   Als Raster ist die erste Spur genau --nav-breite. Die Marke sitzt darin,
   das Suchfeld beginnt an der Spurgrenze -- also exakt an der Kante zwischen
   Kachelleiste und Inhalt, in jeder Breite und unabhaengig davon, wie lang
   die Marke ist. */
.tafel-leiste {
  flex: none;
  display: grid;
  /* VIER Spuren, weil die Leiste VIER Kinder hat: Marke, Mitte (Suche),
     .rechts (Datum) und .leisten-rechts (Glocke + Profilkachel).
     Til, 10.08.2026: "die benachrichtigungsglocke ist auf einmal wieder in
     der zweiten zeile ... ebenso die Kachel mit dem Nutzerprofil."
     Genau das war es: mit drei Spuren setzt das Raster das vierte Kind
     selbsttaetig in ZEILE 2, SPALTE 1 -- gemessen x=0, y=52, Breite 104,
     also die Breite der Nav-Spalte. Ein Raster verschluckt ein Kind nicht,
     es haengt es unten an, und das sieht aus wie ein Umbruch. Wer hier ein
     Kind ergaenzt, ergaenzt eine Spur -- sonst wandert es nach unten.

     `grid-auto-flow: column` waere die andere Loesung und ist ausdruecklich
     NICHT gewaehlt: dann bekaeme jedes kuenftige Kind still eine Spur, und
     eine Spur mehr verschiebt die Fluchtung des Suchfelds -- der Fehler
     waere derselbe, nur unsichtbarer. */
  grid-template-columns: var(--nav-breite) minmax(0, 1fr) auto auto;
  align-items: center;
  /* KEIN gap: er sitzt zwischen den Spuren und haette das Suchfeld um genau
     diese 16 px hinter die Kante geschoben -- gemessen 120 statt 104. Der
     Abstand zur rechten Gruppe steht deshalb dort als eigenes Polster. */
  gap: 0;
  padding: 10px var(--abstand-4) 10px 0;
  background: var(--farbe-karte);
  border-bottom: 1px solid var(--farbe-flaeche-rand);
}
/* Die Marke behaelt ihren Einzug -- er ist jetzt ihr eigener, nicht der der
   ganzen Leiste. */
.tafel-leiste .marke { margin-bottom: 0; padding-left: var(--abstand-4); }
/* DIE MARKE VERLAESST IHRE SPUR NIE (Til, 14.08.2026: "in der mobilen
   Ansicht verdeckt das Suchsymbol das Logo").
   ------------------------------------------------------------------------
   GEMESSEN auf 412 px, vor dieser Regel:

       Kachelleiste (Spur 1)   0,0 – 44,0
       Marke (Behaelter)       0,0 – 44,0
       Wortmarke (Bild)       12,0 – 52,7   <- 8,7 px ausserhalb der Spur
       Lupe                   44,0 – 88,0   <- steht auf diesem Ueberstand

   Nicht die Lupe stand zu weit links: sie beginnt korrekt an der Spurgrenze,
   genau wie es der Block weiter oben verlangt. Zu breit war die Marke. Der
   Einzug (--abstand-3, 12 px) plus das Bild (40,7 px) ergibt 52,7 -- und die
   Spur ist am Handy nur --nav-breite = 44 breit. Ein Bild kuerzt nicht wie
   Text, es laeuft heraus.

   Dasselbe galt zwischen 701 und 900 px, nur leiser: dort ist die Spur 58
   und der Einzug --abstand-4 (20 px), macht 60,7 -- gemessen 2,7 px
   Ueberstand. Es war also nie ein reines Handy-Problem, es fiel dort nur auf.

   ZWEI URSACHEN, beide hier behoben:

     max-width  ist die Wache, unabhaengig von jeder Spurbreite: was in der
                Spur steht, bleibt in der Spur. Wer spaeter --nav-breite
                aendert oder ein breiteres Logo einsetzt, bekommt ein
                kleineres Bild -- nicht eines, das auf dem Nachbarn liegt.

     margin-right  stammt aus style.css und gilt dort zu Recht: auf den
                Anmeldeseiten steht hinter der Wortmarke noch ein Wort
                ("Praxisportal"), und das braucht Luft. In der Tafel-Leiste
                steht dort nichts -- die 5 px waren reiner Ueberhang und
                haben das Bild zusaetzlich aus der 44er-Spur gedrueckt.

   Ergebnis, gemessen auf 412 px: Wortmarke 1,6–42,3, erste Kachel darunter
   2,0–41,0. Sie fluchten. */
.tafel-leiste .marke-bild { max-width: 100%; margin-right: 0; }
/* Der Abstand, den vorher `gap` gemacht hat -- jetzt nur noch dort, wo er
   gebraucht wird: zwischen Suchfeld und rechter Gruppe. */
.tafel-leiste > .leisten-rechts,
.tafel-leiste > .rechts { padding-left: 16px; }
/* DATUM UND UHRZEIT: derselbe Block, andere Gewichtung (Briefing 9).
   ------------------------------------------------------------------------
   Nicht ein anderes Format je Bildschirm -- dasselbe, nur unterschiedlich
   laut. Am Handy tritt die Zeitangabe hinter den Inhalt zurueck; auf einem
   24- oder 27-Zoll-Schirm ist Platz da, und dort darf sie ihn nehmen.

   Die Groesse waechst in zwei Stufen (1400 / 1900), ab der zweiten kommt
   etwas Kontrast dazu. NUR Groesse und Gewicht -- der INHALT bleibt gleich:
   "Donnerstag, 07.08.2026" steht am Handy genauso da wie am 27-Zoeller, nur
   leiser. Das verlangt Briefing 9 ausdruecklich ("keine unterschiedlichen
   Formate oder Inhalte, nur unterschiedliche Groesse/Prominenz"), und es ist
   auch das Richtige: eine Angabe, die auf dem kleinen Schirm verschwindet,
   ist eine, die dort gefehlt hat.

   Die Stufen sind die Hausschwellen aus DESIGNSYSTEM.md, keine neuen. */
.tafel-leiste .rechts {
  margin-left: auto;
  font-size: var(--schrift-s);
  color: var(--farbe-text-gedaempft);
  /* Platz fuer den Hilfe-Knopf: der haengt fest oben rechts (position:fixed,
     right:14px, 34px breit) und lag im ersten Durchlauf ueber dem Datum --
     "Dienstag, 04.08.2" stand da, der Rest darunter. Auf den uebrigen Seiten
     faellt es nicht auf, weil dort oben rechts nichts steht. */
  padding-right: 44px;
}
.tafel-koerper { flex: 1; min-height: 0; display: flex; align-items: stretch; }
.tafel-inhalt { flex: 1; min-width: 0; overflow: auto; padding: 20px 22px 32px; }

/* --nav-breite: EIN Wert fuer zwei Regeln.
   Die Kopfzeile richtet ihr Suchfeld an dieser Kante aus (siehe
   .globale-suche-huelle weiter unten). Stuende die Zahl zweimal da, waere die
   Fluchtung nach der ersten Aenderung falsch -- und zwar unbemerkt, weil
   niemand die Kopfzeile prueft, wenn er die Leiste verschmaelert. */
:root { --nav-breite: 104px; }

.kachelnav {
  width: var(--nav-breite); flex: none;
  background: var(--farbe-flaeche);
  border-right: 1px solid var(--farbe-flaeche-rand);
  padding: 10px var(--abstand-2);
  display: flex; flex-direction: column; gap: 6px;
  overflow-y: auto;
  scrollbar-width: thin;
}
/* Die Kachel übernimmt die Sprache der .bereich-zeile von der Startseite:
   Symbol, kurzer Name, Zähler in --status-erinnerung. Til hat sie am
   03.08.2026 nach drei Entwürfen so entschieden. */
.kachelnav a {
  position: relative;
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  gap: var(--abstand-1);
  /* UNVERAENDERT gegenueber Paket 4, und das ist Absicht. Der erste Entwurf
     gab dem Strich mit `padding-left: calc(var(--abstand-1) + var(--strich))`
     eigenen Platz, damit die Beschriftung nicht aus der Mitte steht. Er hat
     die Kachel damit um drei Pixel verschmaelert, und in einer 104-px-Leiste
     entscheiden drei Pixel: aus einer zweizeiligen Beschriftung werden zwei
     ("Kartenzahlung" kommt zu "Vereinbarungen" dazu). Zurueckgenommen.

     Der Strich liegt jetzt UEBER dem linken Innenabstand. Die Beschriftung
     sitzt damit rechnerisch 1,5 px aus der Mitte -- das sieht niemand, ein
     zusaetzlicher Zeilenumbruch schon.

     NACHGEMESSEN AM 06.08.2026 (Paket 8a): die erste Messung nannte
     "Dashboard" und "Zahlungen" und stimmte nicht. Sie entstand, waehrend
     --schrift-xs wegen eines nicht geschlossenen Kommentars gar nicht
     aufloeste -- die Beschriftung erbte 15 px statt 11, und fuenf Kacheln
     brachen um. Die Entscheidung bleibt dieselbe, die Zahlen sind neu. */
  padding: 9px var(--abstand-1);
  /* 44 px ist die Tippgroesse, unter der ein Ziel am Touchgeraet unsicher
     wird -- und die Praxis arbeitet am iPad. Die Kachel kam mit 42 px
     knapp darunter, seit --schrift-xs am 06.08.2026 wieder aufloest und die
     Beschriftung von geerbten 15 px auf ihre 11 px zurueckging: die Kachel
     wurde durch die Reparatur vier Pixel FLACHER.
     min-height und nicht mehr Innenabstand: so steht die Zahl da, um die es
     geht, statt einer, aus der sie sich ergibt. */
  min-height: 44px;
  text-decoration: none;
  /* KEINE Flaechenfarbe im Ruhezustand (06.08.2026, Paket 6). Die Leiste
     liegt selbst auf --farbe-flaeche; eine Kachel in derselben Farbe hat
     keinen eigenen Umriss mehr und zeigt nur noch Strich, Zeichen und Name.
     Vorher war jede Kachel eine Karte auf einer Flaeche -- vierzehn Rahmen
     uebereinander, wo einer gereicht haette. */
  background: transparent; color: var(--farbe-text);
  /* transparent und nicht "kein Rand": sonst springt die Leiste beim Hover
     um zwei Pixel. */
  border: 1px solid transparent;
  border-radius: var(--radius);
  transition: border-color 0.15s ease, background 0.15s ease;
}

/* =========================================================================
   DER STRICH
   =========================================================================
   Til, 06.08.2026 (Paket 6). Otl Aicher: jeder Funktionsbereich traegt eine
   feste eigene Farbe, und die zieht sich unveraendert durch die ganze
   Anwendung. Farbe ORIENTIERT -- sie fordert nicht auf und schmueckt nicht.

   DURCHGEHEND SICHTBAR, NICHT NUR AKTIV (ausdrueckliche Vorgabe)
     Ein Strich, den nur die aktive Kachel traegt, sagt "hier stehst du" --
     das weiss man ohnehin. Erst wenn ihn ALLE tragen, wird die Leiste zur
     Karte: man lernt, dass Posteingang violett ist und Mahnwesen braun, und
     findet die Kachel danach ueber die Farbe statt ueber den Text. Genau
     deshalb aendert der Strich zwischen aktiv und inaktiv NICHTS -- nicht
     die Breite, nicht die Deckkraft.

     Die Deckkraft war der erste Entwurf und ist verworfen: vier der
     vierzehn Farben liegen unter 3:1 (Laborbelege 2,42:1). Sie halbiert
     haetten sie gar nicht mehr gezeigt -- ausgerechnet die vier, die es am
     noetigsten haben.

   WORAN MAN DANN DIE AKTIVE KACHEL ERKENNT
     An der FLAECHE, nicht am Strich: sie liegt auf --farbe-karte und hebt
     sich damit als einziges Feld aus der Leiste heraus, die Beschriftung
     traegt 600. Die uebrigen sind mit der Leiste eins. Ein Zustand, eine
     Auszeichnung.

   ::before UND NICHT border-left
     Ein linker Rand von 3 px neben 1 px an den anderen Seiten laesst die
     Ecken keilfoermig auslaufen, weil border-radius den Uebergang
     interpoliert. Das Pseudoelement liegt stattdessen ueber der Kontur bis
     an die Kante und bleibt oben wie unten gleich breit.

   --strich-farbe kommt aus [data-bereich="..."] in design-tokens.css, und
   das Attribut setzt globale-suche.js beim Bauen der Leiste (dataset.bereich,
   aus BACKEND_BEREICHE).

   WER KEINEN STRICH TRAEGT
     "Mehr" und die Hilfe. Beide sind <button> und keine <a>, greifen von
     dieser Regel also gar nicht erst -- und das ist richtig so: ein Strich
     bedeutet "Funktionsbereich", und ein Aufklapper ist keiner. Ebenso
     Profil und Einstellungen: die sitzen als .leisten-knopf in der
     Kopfzeile, nicht in der Leiste.

     Heute traegt damit JEDE .kachelnav a einen Bereich. Der Rueckfall im
     background steht trotzdem: wer eine Kachel ohne Bereich ergaenzt, soll
     eine Konturlinie sehen und nicht ein Loch, das aussieht wie ein
     Darstellungsfehler. pruefe_leiste_aufgeraeumt.py meldet ihn.
   ------------------------------------------------------------------------ */
.kachelnav a::before {
  content: "";
  position: absolute;
  left: -1px; top: -1px; bottom: -1px;
  width: var(--strich);
  background: var(--strich-farbe, var(--farbe-flaeche-rand));
  border-radius: var(--radius) 0 0 var(--radius);
}

.kachelnav a:hover { border-color: var(--farbe-akzent); }
.kachelnav a.aktiv {
  background: var(--farbe-karte);
  border-color: var(--farbe-flaeche-rand);
}
/* KEIN font-weight auf der aktiven Beschriftung -- ausprobiert und wieder
   ausgebaut. Halbfett ist breiter als normal, und in einer 104-px-Leiste
   kostet das eine Zeile: mit 600 bricht "Kartenzahlung" zusaetzlich um
   (gemessen 06.08.2026). Dieselbe Falle wie beim Innenabstand weiter oben --
   hier ist kein Platz fuer Auszeichnungen, die Breite brauchen.
   Die Flaeche allein sagt es: die aktive Kachel ist die einzige, die nicht
   mit der Leiste verschmilzt. */
/* Das Zeichen ist seit dem 06.08.2026 eine SVG-Zeichnung, kein Emoji mehr.
   Sie bringt Breite und Hoehe selbst mit (symbolElement), deshalb steht hier
   keine Schriftgroesse: sie haette auf ein <svg> ohnehin keine Wirkung.

   WARUM DIE ZEICHNUNG NICHT MITSKALIERT
     "Grosse Schrift" vergroessert Text, damit man ihn LIEST. Ein Symbol
     liest man nicht, man erkennt es -- und in einer 104 px breiten Leiste
     wuerde ein Zeichen bei Faktor 1,35 die Beschriftung darunter aus der
     Kachel druecken. Die Beschriftung waechst, das Zeichen bleibt: genau so
     herum ist es fuer jemanden mit schlechten Augen richtig. */
/* DIE ZEICHNUNG TRAEGT DIE FUNKTIONSFARBE -- umgekehrt zum 06.08.2026.

   Hier stand einen Tag lang: "KEINE eigene Farbe hier ... die Funktionsfarbe
   traegt der Strich, und sie traegt sie ALLEIN: ein zweites farbiges Element
   auf derselben Kachel machte aus der Orientierung eine Dekoration."

   Das war richtig fuer einen Satz duenner Strichzeichnungen. Tils
   Aicher-Entwurf vom 07.08.2026 macht das Piktogramm zur Farbflaeche selbst
   -- vollflaechig, mit ausgesparten Gegenformen, nach Muenchen 1972. Damit
   IST das Zeichen die Orientierung und nicht ihr Beiwerk.

   --strich-farbe erbt bis hierher (design-tokens.css), also braucht es
   keine zweite Zuordnungstabelle: EIN data-bereich an der Kachel faerbt
   Strich und Zeichnung aus derselben Quelle. Faellt der Wert aus, steht das
   Zeichen in Textfarbe -- sichtbar, nur ohne Orientierung.

   Wer das wieder auf ink zurueckstellt, nimmt dem Entwurf seinen Kern. */
.kachelnav .sym {
  display: flex; line-height: 1;
  color: var(--strich-farbe, var(--farbe-text));
}
.kachelnav .lab {
  font-size: var(--schrift-xs);
  line-height: 1.15; text-align: center;
  /* "Betroffenenrechte" ist ein Wort und breiter als die Kachel. Ohne diese
     Zeile steht es randlos bis an die Kante; mit Trennung bricht es sauber
     um. hyphens braucht lang="de" -- das steht in base.html. */
  overflow-wrap: anywhere; hyphens: auto;
}
.kachelnav .zaehler {
  position: absolute; top: 4px; right: 5px;
  background: var(--status-erinnerung); color: var(--farbe-karte);
  font-size: var(--schrift-xs); font-weight: 600;
  padding: 1px 6px; border-radius: var(--radius-gross); line-height: 1.4;
}
.kachelnav .zaehler[hidden] { display: none; }

/* Unter 900px bleibt für den Inhalt zu wenig übrig: 104px fest wegzunehmen
   ist auf 1194px quer vertretbar, auf 834px hochkant nicht. Dann nur noch
   Symbole, 56px breit. Der Name steht weiter im title-Attribut und wird
   vorgelesen — er verschwindet nur aus dem Bild, nicht aus der Seite. */
@media (max-width: 900px) {
  /* 58 und nicht 56: bei 56 blieben der Kachel 43 px Breite -- einen Pixel
     unter der Tippgroesse, und das faellt niemandem auf, der nicht misst
     (pruefe_ipad, 11-Zoll-iPad hochkant, 06.08.2026). */
  :root { --nav-breite: 58px; }
  .kachelnav { width: var(--nav-breite); padding: 8px 6px; }
  .kachelnav .lab { display: none; }
  /* Ab hier ist die Spur schmaler als der Einzug plus das Logo (20 + 40,7
     gegen 58). Statt das Bild zu verkleinern -- die Wache oben taete das --
     faellt der Einzug weg und die Marke rueckt in die Mitte ihrer Spur.
     Damit steht sie ueber den Piktogrammen der Kachelleiste, und die sind
     dort ebenfalls mittig: gemessen 10,5–32,5 in einer 44er-Spur, Mitte
     21,5 gegen 22. Der Einzug fluchtete am Handy ohnehin an nichts mehr --
     die Kacheln haben dort 2 px Polster, nicht 12. */
  .tafel-leiste .marke { padding: 0; justify-self: center; }
  .tafel-inhalt { padding: 16px 14px 28px; }
}
/* SCHMALER AM TELEFON (11.08.2026, Til: "die Knopfleiste mit der Navigation
   schmaeler in der mobilen Ansicht").
   44 px sind die Tippgrenze und damit die kleinste Breite, die ein Ziel haben
   darf -- schmaler waere nicht mehr zu treffen. Zwischen 700 und 900 px bleiben
   es 58: dort ist Platz, und ein Tablet hochkant soll nicht aussehen wie ein
   Telefon.

   NUR DIE ZWEI ZEILEN, DIE WIRKLICH ANDERS SIND. Beim ersten Versuch hatte ich
   den 900-px-Block hier aufgeteilt und dabei drei seiner Regeln mitgenommen --
   darunter `.kachelnav .lab { display: none }`. Folge: zwischen 701 und 900 px
   standen die Beschriftungen wieder da, die Kacheln wurden 41 px breit, und
   pruefe_ipad.py meldete auf dem 11-Zoll-iPad hochkant 8 von 27 Tippzielen
   unter 44 px -- vorher waren es 0. Til hatte ausdruecklich gesagt: am Schirm
   nichts aendern. Ein iPad hochkant ist kein Telefon.

   Das Suchfeld der Kopfleiste fluchtet weiter mit der Inhaltskante, denn beide
   nehmen dieselbe Variable (siehe .tafel-leiste). */
@media (max-width: 700px) {
  :root { --nav-breite: 44px; }
  .kachelnav { padding: 6px 2px; }
}

/* ---- Was in der Tafel-Leiste steht ---------------------------------------
   Systemschalter, globale Suche, Glocke, Profil und Zahnrad hingen bisher an
   der waagerechten Pillenleiste. In der Tafel gibt es die nicht mehr -- sie
   stehen jetzt oben. Ohne diese Regeln bringen sie ihre alten Abstände mit
   (der Schalter hat margin-bottom, die Suche max-width: 760px) und reißen
   die Leiste auseinander. */
/* DIE FLUCHTUNG DES SUCHFELDS (Til, 10.08.2026)
   ------------------------------------------------------------------------
   "Das Suchfeld muss im gleichen Spaltenraster stehen wie die
   Navigationsleiste darunter."

   GEMESSEN, WORAN ES VORHER FLUCHTETE: an nichts. Linke Kante bei 82 px
   (Schirm) und 66 px (Handy), waehrend die Nav-Spalte bei 0 beginnt, ihre
   Kacheln bei 8, die Piktogramme bei 41 und die Spalte bei 104 endet.

   WARUM 104 UND NICHT 41 (den Piktogrammen)
     Tils erste Wahl war die Senkrechte der Piktogramme. Gemessen liegt der
     Schriftzug "tillY" aber bei 20-66 px -- er deckt genau diese Linie zu.
     Das Suchfeld koennte dort nur beginnen, wenn die Marke aus der Zeile
     weicht; auf die Rueckfrage hat Til die Kante zwischen Nav-Spalte und
     Inhalt gewaehlt. Dort fluchtet das Feld mit der Ueberschrift darunter.

   Die Zahl kommt NICHT hierher als Literal: sie ist die Breite der
   Kachelleiste, und die steht in ihrer eigenen Regel. Aendert sie sich, muss
   die Fluchtung mitgehen -- deshalb dasselbe Token an beiden Stellen. */
.tafel-leiste .globale-suche-huelle {
  /* Kein eigener Rand mehr: die Fluchtung macht die erste Rasterspur
     darueber. `flex` bleibt fuer die Faelle stehen, in denen die Huelle in
     einer Flexzeile landet (Pillenleiste, alte Seiten). */
  margin: 0; max-width: 340px; flex: 1 1 220px;
}
.tafel-leiste .benachrichtigung-btn { margin: 0; width: auto; }

/* ---- Die Suche am Handy: eine Lupe, die aufklappt ------------------------
   WAS HIER VORHER PASSIERTE (Til, 04.08.2026, mit Bildschirmfoto)
       `flex: 1 1 220px` OHNE min-width heisst: das Feld darf bis auf NULL
       schrumpfen. Auf 412 px blieb neben Marke, Datum und Glocke nichts
       uebrig -- gemessen: Breite 0. Uebrig blieb der runde Rand des
       Suchfelds als leeres Oval ueber dem Datum. Es sah aus wie ein
       Schmuckelement ohne Funktion; in Wahrheit war es die Suche, und sie
       war am Handy nicht zu bedienen.

       Es gab dafuer keine einzige Medienregel. Die Leiste hat das Feld
       einfach zerdrueckt.

   WARUM LUPE UND NICHT AUSBLENDEN
       Ausblenden waere die einfachere Regel gewesen -- und haette am Handy
       die Patientensuche gekostet. Entscheidung Til: Lupe.

   Der Schwellwert ist 700px und nicht 900px wie bei der Kachelleiste: bis
   dahin traegt das Feld noch, gemessen an der Vorschau. */
.tafel-leiste { position: relative; }
.tafel-leiste .such-lupe { display: none; }

@media (max-width: 700px) {
  /* ---- Die Leiste lief schlicht ueber ---------------------------------
     Gemessen auf 412 px, VOR dieser Regel:

         Marke      20 – 85
         Lupe      101 – 137
         Datum     117 – 233   <- beginnt IM Lupenknopf
         Glocke    249 – 498   <- 86 px jenseits des Schirms

     Das Datum ueberlappte die Lupe, weil `.leisten-mitte` (die Huelle der
     Suche) auf Breite 0 zusammengedrueckt wurde und ihr Inhalt darueber
     hinausragte -- dasselbe Zusammendruecken, das vorher das Suchfeld zum
     Oval gemacht hat, nur eine Ebene hoeher.

     Deshalb zweierlei: die Mitte darf nicht mehr schrumpfen, und die Leiste
     darf umbrechen. Zwei Zeilen am Handy sind kein Schoenheitsfehler --
     eine Zeile, in der drei Dinge uebereinanderliegen, schon. */
  /* EINE Zeile, seit dem 07.08.2026.
     ---------------------------------------------------------------------
     Der Umbruch oben war richtig -- fuer die Elemente von damals. Til hat
     sie geaendert: das 256 px breite Banner "1 offener Vorgang" ist eine
     Glocke mit Zahl geworden, Zahnrad und Rollenabzeichen sind ins
     Avatar-Menue gewandert. Damit passt alles nebeneinander, und die
     Leiste darf wieder eine Zeile sein:

         Marke -- Lupe -- Datum -- Glocke -- Avatar

     `flex-wrap: nowrap` steht ausdruecklich da und nicht nur als Vorgabe:
     wer hier spaeter etwas hinzufuegt, soll es nicht wieder umbrechen
     lassen, sondern etwas anderes weglassen. */
  .tafel-leiste {
    /* gap: 0 und kein linkes Polster -- aus demselben Grund wie am Schirm:
       beides schiebt das Suchfeld hinter die Kante der Kachelleiste. Hier war
       es 12 px Polster plus 8 px gap, gemessen 78 statt 58. Der Einzug der
       Marke steht an der Marke, der Abstand zur rechten Gruppe an ihr. */
    flex-wrap: nowrap; gap: 0; padding: 4px 12px 4px 0;
    min-height: 56px;
  }
  .tafel-leiste .leisten-mitte { flex: none; }
  /* Hier stand bis zum 14.08.2026 `padding-left: var(--abstand-3)`. Genau
     dieser Einzug hat das Logo aus seiner 44 px breiten Spur geschoben, und
     die Lupe stand danach darauf. Die Regel aus dem 900er-Block gilt weiter:
     kein Einzug, mittig in der Spur. */
  /* Der Zuschlag galt dem fest stehenden Hilfe-Knopf oben rechts. Der steht
     nicht in dieser Zeile. */
  .tafel-leiste .rechts { margin-left: 0; padding-right: 0; }
  /* Das Datum gibt als Erstes nach, wenn es eng wird -- es ist die einzige
     Angabe hier, die man auch am Geraet selbst ablesen kann. */
  .tafel-leiste .rechts { min-width: 0; overflow: hidden; text-overflow: ellipsis;
                          white-space: nowrap; }
  .tafel-leiste .leisten-rechts { margin-left: auto; min-width: 0; }
  /* Die Marke bleibt, wie sie ist: 18px, MIT --schrift-skalierung (style.css).
     Hier stand kurz eine feste Zahl -- die haette die Sehhilfe ausgehebelt,
     und zwar genau an der Stelle, an der man sie zuerst sucht. */

  /* Nicht mehr dehnen: die Lupe ist so breit wie sie ist. */
  .tafel-leiste .globale-suche-huelle { flex: none; max-width: none; }
  .tafel-leiste .globale-suche-huelle #globale-suche { display: none; }
  .tafel-leiste .such-lupe {
    display: inline-flex; align-items: center; justify-content: center;
    /* Dieselbe Hoehe wie Glocke und Avatar daneben -- gemessen standen hier
       34 gegen 44. Aus den Tokens, nicht als Zahl. */
    width: auto; margin: 0; padding: var(--knopf-polster-sm);
    min-width: var(--knopf-hoehe-lg); min-height: var(--knopf-hoehe-lg);
    height: var(--knopf-hoehe-lg);
    border: 1px solid var(--farbe-flaeche-rand); border-radius: var(--radius-klein);
    background: var(--farbe-karte); color: var(--farbe-text-gedaempft); cursor: pointer;
  }
  .tafel-leiste .such-lupe:hover { border-color: var(--farbe-akzent); color: var(--farbe-akzent); }

  /* Aufgeklappt legt sich das Feld ueber die ganze Leiste. Absolut und nicht
     als zweite Zeile: eine Leiste, die beim Tippen hoeher wird, schiebt den
     Inhalt darunter weg -- und das ist genau der Moment, in dem man auf den
     Inhalt schaut. */
  .tafel-leiste .globale-suche-huelle.offen {
    /* right: 56px und nicht 12px -- der Hilfe-Knopf steht fest oben rechts
       (position:fixed, right:14px, 34px breit) und lag sonst auf der rechten
       Kante des Feldes. Dieselbe Ruecksicht, die das Datum als
       `padding-right: 44px` traegt; hier kommt der Abstand zwischen Knopf
       und Feld dazu. */
    position: absolute; left: 12px; right: 56px; top: 8px; z-index: 60;
    /* `width: auto` ist hier NICHT kosmetisch: die Huelle bringt aus
       style.css eine eigene Breite mit, und sind `left` UND `width` gesetzt,
       ignoriert der Browser `right`. Das Feld war dadurch so breit wie die
       ganze Leiste und ragte rechts darueber hinaus -- gemessen, nicht
       vermutet: Huelle 412 px statt 388. */
    width: auto;
  }
  .tafel-leiste .globale-suche-huelle.offen #globale-suche {
    display: block; width: 100%; margin: 0;
  }
  .tafel-leiste .globale-suche-huelle.offen .such-lupe { display: none; }
}
/* EINE HOEHE FUER DIE GANZE REIHE (10.08.2026).
   Vorher standen hier 34 px, waehrend der Vorgangsknopf daneben 44 und das
   Suchfeld 40 hatte -- drei Hoehen in einer Zeile, gemessen. Jetzt nimmt jedes
   Element der Kopfzeile --knopf-hoehe-lg, also die Tippgroesse, die diese
   Leiste am iPad ohnehin braucht. Die Sonderregel unter (pointer: coarse)
   darunter ist damit ueberfluessig geworden und entfallen.

   NACHGEPRUEFT AM 10.08.2026, weil ich diese Loeschung selbst in Zweifel
   gezogen hatte: sie war richtig. style.css:1280 setzt unter
   (pointer: coarse) fuer JEDEN Knopf min-height UND min-width auf 44 px, mit
   !important. Eine zweite Regel fuer dieselbe Zahl an derselben Stelle traegt
   nichts bei. pruefe_ipad.py bestaetigt es mit Finger: 0 von 27 Zielen im
   Kalender und 0 von 34 im Posteingang liegen unter 44 px. */
.tafel-leiste .leisten-knopf {
  flex: none; display: inline-flex; align-items: center; justify-content: center;
  min-width: var(--knopf-hoehe-lg); min-height: var(--knopf-hoehe-lg);
  height: var(--knopf-hoehe-lg); padding: var(--knopf-polster-sm);
  border: 1px solid var(--farbe-flaeche-rand); border-radius: var(--radius-klein);
  color: var(--farbe-text-gedaempft); text-decoration: none; background: var(--farbe-karte);
  transition: border-color 0.15s ease, color 0.15s ease;
}
.tafel-leiste .leisten-knopf:hover { border-color: var(--farbe-akzent); color: var(--farbe-akzent); }
/* Die Sonderregel fuer den Finger stand hier bis zum 10.08.2026: sie hob 36x34
   am Touchgeraet auf 44x44. Sie ist entfallen, weil die Regel darueber jetzt
   IMMER 44 nimmt -- am Finger wie an der Maus. Eine Groesse, die nur am iPad
   stimmt, ist eine Groesse, an die jemand denken muss. */
.tafel-leiste .leisten-knopf.aktiv {
  background: var(--farbe-aktion); border-color: var(--farbe-akzent); color: var(--farbe-karte);
}

/* Der Inhalt einer umgestellten Seite behält seine eigene Hülle (.home-karte,
   .backend-karte, …) -- nur die Vollbild-Höhe muss weg, die hat jetzt .tafel.
   Sonst stünde unter jeder Karte ein zweiter leerer Bildschirm. */
.tafel-inhalt > .backend-seite,
.tafel-inhalt > .seite {
  min-height: 0; height: auto; padding: 0; display: block;
}

/* Die drei Gruppen der Leiste. .rechts schiebt sich nach rechts und trennt
   damit Mitte von rechter Gruppe -- ohne margin-left:auto dort klebte alles
   links zusammen. Der Platz rechts ist für den fest positionierten
   Hilfe-Knopf; ohne ihn lief das Suchfeld darunter. */
.tafel-leiste { padding-right: 52px; }
.tafel-leiste .leisten-mitte { display: flex; align-items: center; gap: 10px; min-width: 0; }
.tafel-leiste .leisten-rechts { display: flex; align-items: center; gap: 6px; flex: none; }

/* Die Gruppe hinter "Mehr". Der Schalter sieht aus wie eine Kachel -- er ist
   an derselben Stelle und tut dasselbe (er führt weiter), nur eine Ebene
   tiefer. Ein andersartiges Element hier wäre ein Bruch in einer Leiste, die
   sonst aus lauter gleichen Kacheln besteht. */
.kachelnav .kachel-mehr-schalter {
  position: relative;
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  gap: var(--abstand-1); width: 100%; padding: 9px 4px;
  background: transparent; color: var(--farbe-text-gedaempft);
  border: 1px dashed var(--farbe-flaeche-rand); border-radius: var(--radius);
  font-family: var(--font-text); font-weight: 400; cursor: pointer;
  transition: border-color 0.15s ease, color 0.15s ease;
}
.kachelnav .kachel-mehr-schalter:hover {
  border-color: var(--farbe-akzent); color: var(--farbe-akzent);
}
.kachelnav .kachel-mehr {
  display: flex; flex-direction: column; gap: 6px;
}
.kachelnav .kachel-mehr[hidden] { display: none; }

/* ---- Die Schrift-Kachel (13.08.2026) --------------------------------------
   Til: „den Button für die größere Schrift können wir in der Praxisansicht
   gerne links unten in der Navigationsleiste verschwinden lassen, wo auch das ?
   für die Hilfe ist."

   Sie trägt dieselbe Bauart wie die Hilfe (`.kachel-hilfe`) — beide sind Helfer
   und keine Arbeitsbereiche. Hier stehen nur die zwei Unterschiede: das „Aa" ist
   Text und kein Symbol (der Zeichensatz hat keines für Schriftgröße), und im
   eingeschalteten Zustand ist die Kachel gefüllt, damit man von außen sieht,
   dass etwas an ist.

   DER SCHWEBENDE KNOPF VERSCHWINDET NUR HIER. `html.hat-hilfe-kachel` setzt
   globale-suche.js genau dann, wenn eine Kachelleiste gebaut wurde — also im
   Praxisportal. Die Patientenseiten laden dieselbe base.html und dieselbe
   tafel.css, haben aber keine Leiste; dort bleibt der Knopf, und ein
   Rundgangsschritt zeigt auf ihn (touren.js, Rundgang „/portal"). Eine
   pauschale Regel hätte ihn dort ersatzlos genommen. */
.kachelnav .kachel-hilfe .aa-symbol {
  font-family: var(--font-display);
  font-size: 17px;
  font-weight: 700;
  line-height: 1;
  letter-spacing: -.02em;
}
/* NUR DIE ERSTE KACHEL SCHIEBT. `.kachel-hilfe` hat `margin-top: auto`, und
   zwei solche Kacheln in einer Flex-Spalte TEILEN sich den freien Platz -- die
   Hilfe stand danach 50 px über der Schrift und beide nicht unten. Gemessen im
   Bild vom 13.08.2026. Die zweite nimmt den normalen Abstand der Leiste (6 px,
   `.kachelnav { gap }`), damit die beiden Helfer als Paar unten sitzen. */
.kachelnav #schrift-kachel { margin-top: 0; }
.kachelnav #schrift-kachel.aktiv {
  background: var(--farbe-text);
  color: var(--farbe-karte);
  border-color: var(--farbe-text);
}
/* DAS „Aa" MUSS MIT. Es stand nach dem Einschalten schwarz auf schwarz und war
   verschwunden: `.kachelnav .sym` setzt `color` ausdruecklich
   (`var(--strich-farbe, var(--farbe-text))`), und eine ausdrueckliche Farbe am
   Kind schlaegt die geerbte der gefuellten Kachel. Dieselbe Falle wie am
   09.08. in umgekehrter Richtung: WER EINE FUELLUNG AENDERT, AENDERT DIE
   SCHRIFTFARBE MIT -- und zwar jede, die einzeln gesetzt ist. */
.kachelnav #schrift-kachel.aktiv .sym { color: var(--farbe-karte); }
html.hat-hilfe-kachel .barrierefrei-umschalter { display: none; }

/* ---- Die Hilfe-Kachel ----------------------------------------------------
   Til, 04.08.2026: das Fragezeichen zieht aus der oberen rechten Ecke in die
   Kachelleiste, am Rechner wie am Handy.

   Sie sieht aus wie eine Bereichskachel und nicht wie der gestrichelte
   "Mehr"-Umschalter daneben: sie fuehrt zu etwas, sie klappt nichts auf.
   `margin-top: auto` schiebt sie ans untere Ende -- unter allen Bereichen,
   auch wenn die Leiste kurz ist. Sie ist kein Arbeitsbereich, sondern ein
   Helfer, und Helfer stehen unten. */
.kachelnav .kachel-hilfe {
  margin-top: auto;
  position: relative;
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  gap: var(--abstand-1); width: 100%; padding: 9px 4px;
  background: var(--farbe-karte); color: var(--farbe-text);
  border: 1px solid var(--farbe-flaeche-rand); border-radius: var(--radius);
  font-family: var(--font-text); font-weight: 400; cursor: pointer;
  transition: border-color 0.15s ease, background 0.15s ease;
}
.kachelnav .kachel-hilfe:hover {
  border-color: var(--farbe-akzent); background: var(--farbe-flaeche);
}
.kachelnav .kachel-hilfe .sym { display: flex; line-height: 1; }
.kachelnav .kachel-hilfe .lab {
  font-size: var(--schrift-xs); line-height: 1.15;
}
/* Am Handy zeigt die Leiste nur Symbole (siehe oben, max-width: 900px). Das
   Fragezeichen traegt sich selbst. */
@media (max-width: 900px) {
  .kachelnav .kachel-hilfe .lab { display: none; }
}

/* Die beiden alten, frei schwebenden Fragezeichen. Sie bleiben im Baum --
   die Kachel reicht ihren Klick an sie weiter, sie SIND ab jetzt der
   Mechanismus. Sichtbar sein sollen sie nicht mehr: zwei Wege zur selben
   Hilfe, die verschieden aussehen und woanders liegen, sind kein zweites
   Angebot, sondern eine zweite Stelle zum Suchen.

   NUR WO ES EINE KACHELLEISTE GIBT, und deshalb an einer Klasse, die
   tafelNavAufbauen setzt -- nicht pauschal.

   Der Grund ist eine Falle, in die ein `.hilfe-button { display: none }`
   geradewegs gelaufen waere: die PATIENTENSEITEN (/portal, /rechnungen,
   /kostenvoranschlaege …) laden dieselbe base.html und dieselbe tafel.css,
   haben aber keine Kachelleiste. Ihnen haette die Regel den Hilfe-Knopf
   ersatzlos genommen -- und drei gefuehrte Rundgaenge zeigen ausdruecklich
   auf ihn (touren.js, Zeilen 140/188/214). Ein Rundgang, der auf ein
   unsichtbares Element zeigt, bleibt stehen. */
html.hat-hilfe-kachel .hilfe-button,
html.hat-hilfe-kachel .hilfe-rund { display: none; }

/* ---- Der Aa-Knopf blendet sich weg ---------------------------------------
   Til, 04.08.2026: "Aa grosse Schrift wird nur kurz eingeblendet in der
   mobilen Ansicht und verschwindet dann."
   Til, 24.08.2026, auf den Befund aus dem UI-Audit: dasselbe am Rechner.

   Vorher stand er dauerhaft unten rechts (position: fixed, kein
   Ausblenden) und verdeckte auf 412 px ein Stueck der Seite -- im
   Bildschirmfoto lag er ueber der letzten Kachel der Nutzungsstatistik.
   Am Rechner tat er dasselbe, nur mit mehr Platz drumherum.

   AUSGEBLENDET HEISST HIER ZWEIERLEI
       opacity: 0 allein genuegt nicht: ein unsichtbarer Knopf, der noch
       Tippziele frisst, ist schlimmer als ein sichtbarer -- man tippt auf
       die Seite und loest etwas aus, das man nicht sieht. Deshalb
       zusaetzlich pointer-events: none.

   KEINE MEDIENABFRAGE MEHR
       Bis zum 24.08.2026 stand dieser Block in @media (max-width: 700px),
       und globale-suche.js fragte dieselbe Breite noch einmal per
       matchMedia. Jetzt gilt die Regel ueberall -- damit gibt es die Zahl
       nur noch an den Stellen, wo sie wirklich eine Aussage ist. */
.barrierefrei-umschalter {
  transition: opacity 0.4s ease;
}
.barrierefrei-umschalter.weggeblendet {
  opacity: 0;
  pointer-events: none;
}
/* Wer Bewegung abbestellt hat, bekommt den Wechsel ohne Uebergang -- nicht
   gar keinen. Das Ausblenden ist die Funktion, die Animation nur ihre
   Verpackung. */
@media (prefers-reduced-motion: reduce) {
  .barrierefrei-umschalter { transition: none; }
}

/* ===========================================================================
   Der Erklärtext und sein ⓘ
   ===========================================================================
   Til, 05.08.2026: "Das nimmt unnötig dauerhaften Platz ein, besonders auf
   Mobile." Sechs Backend-Seiten trugen einen Erklärtext von 123 bis 271
   Zeichen fest unter der Überschrift -- gelesen wird er einmal, dazustehen
   hatte er jeden Tag.

   WOHER DIESE REGELN KOMMEN
     Aus kalender.html, wo dasselbe am 05.08.2026 für die Kalender-Einführung
     gebaut wurde. Sie stehen jetzt hier, weil sieben Seiten in ZWEI
     Anwendungen sie brauchen -- eine Kopie je Vorlage wäre nach der ersten
     Änderung siebenmal verschieden.

   DIE TOKENS
     --farbe-*, also die Namen des Portals. Im Kalender stellt basis.html die
     kurzen Namen als Alias darauf bereit (--akzent: var(--farbe-akzent));
     die frühere Übersetzung in static/touren.css ist am 06.08.2026 entfallen.

   DAS ⓘ SITZT IN DER ÜBERSCHRIFT, NICHT DANEBEN
     So wandert es mit ihr, wenn die Zeile umbricht, und es ist ohne
     Nachdenken klar, worauf es sich bezieht.
   ------------------------------------------------------------------------ */
/* .mit-info und nicht h1.mit-info (06.08.2026, Paket 9): das ⓘ haengt nicht
   nur an Seitentiteln. Auf den Einstellungen traegt jeder Abschnitt seine
   eigene Ueberschrift als <p class="abschnitt-titel"> -- und genau dort steht
   der Hintergrundtext, der hinter das Zeichen gehoert. Die Regel beschreibt
   eine ZEILE MIT ZEICHEN DAHINTER, nicht ein Element.

   `nowrap` UND NICHT `wrap` (11.08.2026)
     Hier stand `flex-wrap: wrap`, damit das ⓘ "mitwandert". Es wanderte zu
     weit: der Text einer Ueberschrift ist ein anonymes Flex-Kind, und sobald
     er zweizeilig wird, nimmt er die ganze Zeile -- das ⓘ rutschte auf eine
     DRITTE Zeile und stand allein unter dem Titel. Gesehen am Handy auf
     "Stripe-Sammelueberweisungen aufschluesseln", nicht im Quelltext.

     Mit `nowrap` bricht der Text INNERHALB seines Kindes um, und das ⓘ bleibt
     daneben (senkrecht mittig). Gegengemessen auf allen elf Seiten mit einem
     ⓘ, bei 1500 und 412 px: nichts ragt aus dem Eltern-Element heraus, und die
     einzeiligen Titel bleiben bei ihren 26 px Hoehe. */
.mit-info { display: flex; align-items: center; gap: 8px; flex-wrap: nowrap; }
.info-knopf {
  width: auto; margin: 0; padding: 0;
  background: none; border: none; cursor: pointer;
  color: var(--farbe-text-gedaempft);
  /* Seit dem 07.08.2026 eine Zeichnung aus symbole.js und kein
     Unicode-ⓘ mehr. Der Grund ist derselbe wie bei den Emoji: das Zeichen
     wurde von der Schrift des Geraets gezeichnet, nicht von uns -- und auf
     einem Geraet ohne diese Glyphe stand dort ein leeres Kaestchen.
     Die Schriftgroesse bleibt trotzdem stehen: sie bemisst nicht mehr das
     Zeichen (das bringt seine 17 px selbst mit), sondern die Zeilenhoehe
     des Knopfes, an der die Ausrichtung im Titel haengt. */
  font-size: calc(17px * var(--schrift-skalierung, 1)); line-height: 1;
  /* 44 px Tippziel, ohne das Zeichen aufzublasen -- am Handy ist alles
     darunter ein Glücksspiel. Diese Zahl ist der Grund, warum die Regel
     überhaupt eine eigene Klasse hat; sie darf beim Aufräumen nicht
     "vereinfacht" werden. */
  min-width: 44px; min-height: 44px;
  display: inline-flex; align-items: center; justify-content: center;
}
.info-knopf:hover, .info-knopf[aria-expanded="true"] { color: var(--farbe-akzent); }

/* DER RUHEZUSTAND HAT GEWONNEN, DER BERUEHRTE NICHT (08.08.2026)
   ------------------------------------------------------------------------
   `background: none` steht oben in .info-knopf und schlaegt mit (0,1,0) den
   klassenlosen `button` aus knoepfe.css (0,0,1) -- im Ruhezustand. Beim
   Ueberfahren nicht: `button:hover` ist (0,1,1) und gewinnt. Das ⓘ wurde
   also unter der Maus zum gefuellten Ink-Knopf, 44 x 44 px, mit dem blauen
   Zeichen darin -- gemessen #2F5C8A auf #353534, ein Kontrast, bei dem man
   das Zeichen kaum noch findet. Auf allen sieben Seiten mit einem ⓘ.

   Es ist nicht aufgefallen, weil es NUR unter der Maus passiert: kein
   Screenshot zeigt es, kein Prueflauf misst einen Hover-Zustand, und am
   iPad gibt es ihn gar nicht.

   Also die Gegenregel mit (0,2,0). Die Rueckmeldung beim Ueberfahren
   leistet die Zeile darueber und ist damit dieselbe wie beim geoeffneten
   Text: das Zeichen wird akzentfarben. Ein Knopf ohne Flaeche braucht keine
   Flaeche, um zu antworten.

   DER DRUCKSCHATTEN GEHT MIT.
   Er ist laut knoepfe.css das Klick-Feedback des Hauses und soll heissen:
   die Flaeche gibt nach. Hier gibt es keine Flaeche, die nachgeben koennte
   -- ein `inset`-Schatten auf durchsichtigem Grund ist ein dunkler Fleck in
   der Luft. Der 1-px-Versatz bleibt: DAS ist hier das Nachgeben. */
.info-knopf:hover { background: none; }
.info-knopf:active:not(:disabled) { box-shadow: none; }

/* Der Text selbst. Mehrere Absätze sind vorgesehen -- deshalb Abstände auf
   den Kindern und nicht nur außen. */
.einfuehrung {
  color: var(--farbe-text-gedaempft);
  font-size: var(--schrift-m);
  line-height: 1.55;
  max-width: 76ch;
  margin: 0 0 18px;
}
.einfuehrung p { margin: 0 0 9px; }
.einfuehrung p:last-child { margin-bottom: 0; }
/* [hidden] muss gewinnen: display:flex/block aus einer anderen Regel würde
   das Standardverhalten des Attributs sonst still aushebeln. */
.einfuehrung[hidden] { display: none; }

/* ===========================================================================
   Flache Seiten: mehrere Abschnitte untereinander
   ===========================================================================
   Til, 06.08.2026: "Bitte systemweit auf FLACHEN Hintergrund als Standard
   umstellen." Sechs Seiten lagen bis dahin in einer weißen Karte mit 40 px
   Innenabstand. Gemessen auf 412 px: .tafel-inhalt gibt 14 px Rand, die
   Karte darin noch einmal 40 px -- für den Inhalt blieben 246 von 412 px.
   Vierzig Prozent der Bildschirmbreite gingen an verschachtelte Abstände.

   Was die Karte NEBEN dem Abstand geleistet hat, war die Trennung mehrerer
   Abschnitte auf derselben Seite (Zahlungsübersicht hat drei). Das leistet
   ab hier ein Abstand -- ohne Fläche, ohne Rahmen, ohne zweiten Rand.

   Nur ZWISCHEN Abschnitten, nicht vor dem ersten: sonst rutscht jede Seite
   um 28 px nach unten, und die Leiste steht plötzlich mit einer Lücke da.

   Die Karten je LISTENEINTRAG (.report-karte, .freigabe-karte,
   .beleg-karte …) bleiben, was sie sind. Sie grenzen Einträge gegeneinander
   ab, nicht die Seite gegen ihren Hintergrund -- und genau dafür ist eine
   Karte das richtige Mittel.
   ------------------------------------------------------------------------ */
.liste-container + .liste-container { margin-top: 28px; }

/* =========================================================================
   Der Kopf einer Tafelseite
   =========================================================================
   Til, 06.08.2026 (Paket 8b). Diese vier Regeln standen im <style>-Block von
   backend_home.html -- also in der Vorlage EINER Seite, obwohl sie das
   Geruest beschreiben, das jede Tafelseite traegt. Wer eine zweite Seite auf
   die Tafel zieht, haette sie kopiert; die dritte haette dann eine eigene
   Fassung gehabt. Genau so ist .filter-zeile dreimal entstanden (Paket 8a).
   ------------------------------------------------------------------------ */
.tafel-kopf {
  display: flex; align-items: flex-start;
  gap: 16px;
  margin-bottom: 14px;
}
/* 21px wie im Kalender (basis.html), nicht --schrift-xl wie sonst im Portal.
   Til, 04.08.2026: das Designschema richtet sich nach tillY Termine. Deshalb
   steht hier eine eigene Zahl und keine Stufe -- sie folgt der ANDEREN
   Anwendung, und das soll man lesen koennen. */
.tafel-kopf h1 {
  font-size: calc(21px * var(--schrift-skalierung, 1));
  letter-spacing: -0.02em;
  margin: 0 0 2px;
}
.tafel-kopf .untertitel { margin: 0; }
.tafel-meldung { margin: var(--abstand-3) 0 0; }

/* ---- Die Zeitangabe: kurz am Handy, ausgeschrieben am Schirm ----------
   07.08.2026, Til: "kompaktes Datum (Fr., 07.08.)" am Handy,
   "Freitag, 07.08.2026" am Desktop.

   DAS AENDERT EINE FRUEHER FESTGELEGTE REGEL, und zwar bewusst.
   Der Kopf dieser Datei sagte bis heute: "NUR Groesse und Gewicht -- der
   INHALT bleibt gleich". Der Satz war fuer einen Schirm gedacht, auf dem
   Platz ist. Auf 390 px ist keiner: dort frass "Freitag, 07.08.2026" 118 px
   der Zeile, und die Leiste brach um. Ein Wochentag, der die Leiste
   sprengt, ist keine Auskunft mehr, sondern ein Platzproblem.

   Der Informationsblock bleibt derselbe -- es ist dasselbe Datum, nur
   dichter geschrieben. Das ist der Kern von "gleicher Block, andere
   Gewichtung" und nicht sein Gegenteil.

   Umgeschaltet wird per CSS, nicht per JavaScript: beide Fassungen stehen
   im Markup (kopfDatumSetzen in app.js). Sonst haengt die Anzeige an einer
   Fenstergroesse, die beim Drehen des Geraets eine andere ist. */
.tafel-leiste .datum-lang { display: none; }
@media (min-width: 1000px) {
  .tafel-leiste .datum-kurz { display: none; }
  .tafel-leiste .datum-lang { display: inline; }
  .tafel-leiste .rechts { font-size: var(--schrift-m); }
}
@media (min-width: 1900px) {
  .tafel-leiste .rechts {
    font-size: var(--schrift-titel);
    color: var(--farbe-text);
    font-weight: 500;
  }
}

/* ---- Die Hoehe der Leiste --------------------------------------------
   Drei Stufen, weil es drei Situationen gibt. Bis heute gab es zwei, und
   die zweite hoerte bei 1920 auf: gemessen am 07.08.2026 war die Leiste auf
   2560 px exakt so hoch wie auf 1920 (61 px). Der grosse Schirm bekam
   nichts dazu -- weder ausgehungert noch gequetscht heisst auch, dass er
   etwas davon haben soll.

   Handy    56 px   eine Zeile, Zeichen ohne Beschriftung
   Desktop  72 px   Suchfeld statt Lupe, Datum ausgeschrieben
   Gross    80 px   dazu die groessere Zeitangabe (Regel oben) */
@media (min-width: 1000px) {
  .tafel-leiste { min-height: 72px; padding-top: 8px; padding-bottom: 8px; }
}
@media (min-width: 1900px) {
  .tafel-leiste { min-height: 80px; }
}

/* ===========================================================================
   Die rechte Gruppe: Rolle, Konto, Zahnrad          (07.08.2026)
   ===========================================================================
   Til: "Zahnrad und ADMIN-Badge raus aus der Kopfzeile, wandern ins
   Avatar-Menue" -- und am Desktop "duerfen die Elemente, die mobil im
   Avatar-Menue versteckt sind, wieder einzeln auftauchen."

   Also derselbe Block, zwei Gewichtungen. Am Handy traegt die Leiste ein
   Zeichen und das Menue den Rest; ab 1000 px treten Rolle, Name und Zahnrad
   heraus. Umgeschaltet wird per CSS und nicht per JavaScript: sonst
   entscheidet sich die Leiste beim Drehen des Geraets neu, und der Nutzer
   sieht ein Flackern, wo er eine Leiste erwartet.

   Die Schwelle ist 1000 px -- dieselbe wie beim Wort an der Glocke und beim
   ausgeschriebenen Datum. Drei Dinge, eine Schwelle: ab hier ist die Leiste
   gesprächig. */
.tafel-leiste .rollen-marke,
.tafel-leiste .zahnrad-knopf,
.tafel-leiste .konto-name { display: none; }

@media (min-width: 1000px) {
  .tafel-leiste .rollen-marke {
    display: inline-block; flex: none;
    padding: 3px 9px; border-radius: var(--radius-klein);
    background: var(--farbe-flaeche); color: var(--farbe-text-gedaempft);
    font-size: var(--schrift-xs); font-weight: 600;
    letter-spacing: .04em; text-transform: uppercase;
    white-space: nowrap;
  }
  .tafel-leiste .zahnrad-knopf { display: inline-flex; }
  .tafel-leiste .konto-name {
    display: inline-block; max-width: 15ch;
    overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
    font-size: var(--schrift-s); font-weight: 500;
  }
  /* Mit Namen ist der Knopf kein Quadrat mehr. */
  .tafel-leiste .konto-knopf { gap: 7px; padding-right: 11px; }
}

.konto-huelle { position: relative; display: inline-flex; flex: none; }
.konto-knopf { cursor: pointer; font: inherit; }

/* Wie beim Glocken-Panel: an der Huelle, nicht am Fenster -- so haengt es
   unter dem Knopf, in welcher Leiste er auch steht. */
.konto-menue {
  position: absolute; top: calc(100% + 6px); right: 0; z-index: 70;
  min-width: 210px; max-width: min(300px, calc(100vw - 24px));
  padding: 6px;
  background: var(--farbe-karte);
  border: 1px solid var(--farbe-flaeche-rand);
  border-radius: var(--radius);
  box-shadow: var(--schatten);
  text-align: left;
}
/* Am Handy ist das Abzeichen daneben nicht sichtbar -- hier steht die Rolle
   dafuer. Ab 1000 px steht sie an beiden Stellen: das ist keine Doppelung,
   sondern dieselbe Angabe einmal im Blick und einmal im Zusammenhang. */
.konto-menue .konto-rolle {
  margin: 2px 8px 6px; padding-bottom: 7px;
  border-bottom: 1px solid var(--farbe-flaeche-rand);
  font-size: var(--schrift-xs); font-weight: 600;
  letter-spacing: .04em; text-transform: uppercase;
  color: var(--farbe-text-gedaempft);
}
.konto-menue .menue-punkt {
  display: block; width: 100%; box-sizing: border-box;
  padding: 10px 8px; border: 0; border-radius: var(--radius-klein);
  background: none; text-align: left; cursor: pointer;
  font-size: var(--schrift-m); font-weight: 500; font-family: inherit;
  color: var(--farbe-text); text-decoration: none;
}
.konto-menue .menue-punkt:hover { background: var(--farbe-flaeche); }
.konto-menue .menue-punkt[aria-current="page"] { font-weight: 700; }
/* Abmelden steht abgesetzt: es ist die einzige Handlung hier, die etwas
   beendet. Ohne Trennung liegt sie im selben Rhythmus wie "Mein Profil" --
   und der letzte Punkt einer Liste wird am ehesten daneben getroffen. */
.konto-menue .menue-abmelden {
  margin-top: 4px; padding-top: 11px;
  border-top: 1px solid var(--farbe-flaeche-rand);
  border-radius: 0;
}

/* EIN Knopf, zwei Gewichtungen (07.08.2026)
   ------------------------------------------------------------------------
   Am Handy: Zeichen und Zahl. Ab Desktop tritt das Wort daneben. Der Knopf
   war vorher ein 256 px breites Dauer-Banner ("1 offener Vorgang") und der
   Grund, warum die Kopfleiste auf 390 px in zwei Zeilen umbrach -- 97 px
   statt einer schlanken Leiste, gemessen.

   Das Wort wird per CSS ausgeblendet, nicht per JavaScript: sonst haengt die
   Anzeige an einer Fenstergroesse, die beim Drehen des Geraets eine andere
   ist -- und ein Knopf, der sich beim Kippen neu entscheidet, flackert. */
.glocke-huelle { position: relative; display: inline-flex; flex: none; }
.benachrichtigung-btn {
  display: inline-flex; align-items: center; gap: 6px; text-decoration: none;
  padding: var(--abstand-2) 10px; border-radius: var(--radius-klein);
  font-size: var(--schrift-m); font-weight: 600; cursor: pointer;
  color: var(--status-erinnerung); background: var(--status-erinnerung-bg);
  border: 1px solid var(--status-erinnerung);
}
.benachrichtigung-btn:hover {
  background: var(--status-erinnerung); color: var(--farbe-karte);
}
.glocke-zahl { font-variant-numeric: tabular-nums; }
/* Bis 999px nur die Zahl. Die Schwelle liegt bewusst UEBER der 700er des
   Suchfelds: das Wort ist entbehrlicher als die Suche und darf frueher
   gehen. */
.glocke-wort { display: none; }
@media (min-width: 1000px) { .glocke-wort { display: inline; } }

/* Das Panel haengt an der Huelle, nicht am Fenster: so steht es unter dem
   Knopf, egal ob der in der Tafel-Leiste, in einer .kopf-zeile oder neben
   der alten Pillenreihe sitzt. Drei Orte, eine Regel. */
.glocke-panel {
  position: absolute; top: calc(100% + 6px); right: 0; z-index: 70;
  min-width: 260px; max-width: min(360px, calc(100vw - 24px));
  padding: 10px 12px;
  background: var(--farbe-karte);
  border: 1px solid var(--farbe-flaeche-rand);
  border-radius: var(--radius);
  box-shadow: var(--schatten);
  text-align: left;
}
.glocke-zeile {
  display: flex; flex-direction: column; gap: 1px;
  padding: 7px 0; border-bottom: 1px solid var(--farbe-flaeche-rand);
}
.glocke-zeile:last-of-type { border-bottom: 0; }
.glocke-zeile .wer {
  font-size: var(--schrift-m); font-weight: 600; color: var(--farbe-text);
  overflow-wrap: anywhere;
}
.glocke-zeile .was {
  font-size: var(--schrift-s); font-weight: 400;
  color: var(--farbe-text-gedaempft);
}
.glocke-rest {
  margin: 6px 0 0; font-size: var(--schrift-s); font-weight: 400;
  color: var(--farbe-text-gedaempft);
}
/* Der eine Weg hinein. Die Zeilen darueber sind bewusst KEINE Links: es gibt
   keinen Weg zu einem einzelnen Vorgang, und sechs Links auf dieselbe Seite
   behaupten sechs Ziele. */
.glocke-weg {
  display: block; margin-top: 10px; padding-top: 9px;
  border-top: 1px solid var(--farbe-flaeche-rand);
  font-size: var(--schrift-m); font-weight: 600;
  color: var(--farbe-text);
}

/* ==========================================================================
   Verschiebe-Modus der Kachelleiste (09.08.2026)
   ========================================================================== */

/* Die einmalige Drehung beim Aktivieren. Der Versatz je Kachel kommt aus dem
   JavaScript (--dreh-versatz, 0-150 ms zufaellig): ohne ihn drehen sich alle
   wie ein Block, und das sieht nach Maschine aus.

   cubic-bezier(.34,1.56,.64,1) ist ein ease-out-back -- die Kachel schiesst
   am Ende leicht ueber und faellt zurueck. Genau deshalb steht in `to` volle
   360deg und nicht 359: bei einem Ueberschwinger darf der Endwert nicht
   dieselbe Drehung wie der Startwert sein, sonst rechnet der Browser den
   kuerzesten Weg und dreht gar nicht. */
@keyframes kachel-dreht {
  from { transform: rotate(0deg); }
  to   { transform: rotate(360deg); }
}
.kachelnav a.dreht {
  animation: kachel-dreht 500ms cubic-bezier(.34, 1.56, .64, 1) both;
  animation-delay: var(--dreh-versatz, 0ms);
}

/* ---- UND DANN WEITER, LANGSAM -------------------------------------------
   Til, 09.08.2026: "ich fände es gut, wenn sich die Kacheln weiter drehen,
   langsam aber sichtbar, damit man merkt, dass man im Modus ist."

   Bis heute Mittag hoerte die Drehung nach einmal 360 Grad auf, und die
   Begruendung dafuer steht in PROGRESS.md: Bewegung, die nicht aufhoert,
   sitzt am Bildschirmrand neben dem Behandlungsstuhl. Die Entscheidung ist
   umgedreht, und sie ist Tils. Was bleibt, ist sie so zu bauen, dass sie so
   wenig Aufmerksamkeit kostet wie moeglich:

   ZWEI STUFEN, NICHT EINE
     Der Auftakt bleibt die schnelle halbe Sekunde mit dem Ueberschwinger --
     sie SAGT "jetzt bist du drin". Erst danach uebernimmt die langsame
     Runde. Eine einzige langsame Animation von Anfang an haette den Auftakt
     verschluckt: neun Sekunden fuer die erste Umdrehung merkt niemand als
     Ansage. Den Wechsel macht JavaScript am `animationend` -- zwei
     Animationen auf derselben Eigenschaft streiten sich sonst um den
     Endwert, und wer gewinnt, haengt an der Reihenfolge im Regelsatz.

   NEUN SEKUNDEN
     40 Grad in der Sekunde. Langsam genug, dass es nicht zappelt, schnell
     genug, dass man es aus dem Augenwinkel sieht. `linear` und nicht ease:
     eine Runde ohne Anfang und Ende darf nicht ruckeln.

   WER NICHT MITDREHT
     Die gezogene Kachel (.zieht). Nicht aus Geschmack, sondern weil es sonst
     BRICHT: die Animation setzt `transform`, und `.zieht` setzt
     `transform: scale(1.06)`. Zwei Regeln auf einer Eigenschaft -- die
     laufende Animation gewinnt, und die gezogene Kachel verliert ihre
     Hervorhebung. Dazu dreht sich die Trefferflaeche mit, und
     `document.elementFromPoint` entschiede damit auf einem gekippten
     Rechteck, wohin einsortiert wird. Wer zieht, zieht ein stehendes Feld.

   EIN PENDELN UND KEINE GANZE RUNDE -- und das ist eine Abweichung von der
   Vorgabe, die BEGRUENDET WERDEN MUSS.
     Gebaut war zuerst genau das Verlangte: 360 Grad, endlos, neun Sekunden.
     Im Bildschirmfoto stand "Dashboard" senkrecht, "Nachrichten" auf dem Kopf,
     und die Farbstriche lagen als lange Linien quer in den Nachbarkacheln. Der
     Grund ist die Form: die Kachel ist 86 x 44 px, ein BREITES Rechteck. Ein
     Quadrat vertraegt eine ganze Umdrehung, ein Rechteck mit zwei Zeilen Text
     nicht -- es ueberstreicht dabei seine Nachbarn und ist die halbe Zeit
     unlesbar.

     Was bleibt, ist die Absicht: langsam, sichtbar, "man merkt, dass man im
     Modus ist". Vier Grad hin und her, 2,4 Sekunden je Runde. Bei acht
     Kacheln ausser Takt ist die Leiste erkennbar in Bewegung, und jedes Wort
     bleibt lesbar. Es ist ausserdem das Zeichen, das man von iOS kennt.

     Wer die ganze Runde doch will: `--dreh-weit: 360deg` und `--dreh-dauer: 9s`
     setzen, dann dreht sie durch. Die Bilder von beidem liegen in
     tilly-werkzeuge/bilder (dreht_*.png). */
@keyframes kachel-dreht-weiter {
  0%   { transform: rotate(calc(var(--dreh-weit, 4deg) * -1)); }
  50%  { transform: rotate(var(--dreh-weit, 4deg)); }
  100% { transform: rotate(calc(var(--dreh-weit, 4deg) * -1)); }
}
.kachelnav a.dreht-weiter {
  animation: kachel-dreht-weiter var(--dreh-dauer, 2.4s) ease-in-out infinite;
  /* EIN EIGENER TAKT, NICHT --dreh-versatz.
     Der Versatz der Ansage ist 0-150 ms -- gemessen am 09.08.2026 richtig fuer
     eine halbe Sekunde und viel zu klein fuer 2,4 s: sechs Prozent vom Takt,
     und die acht Kacheln pendelten als Block (alle zwischen -2,9 und -0,6
     Grad). --dreh-takt ist NEGATIV und ueber die ganze Runde gestreut; eine
     negative Verzoegerung setzt die Animation mitten hinein statt zu warten.
     Damit hat jede Kachel ihren eigenen Stand, ohne dass eine spaeter
     anfaengt. */
  animation-delay: var(--dreh-takt, 0ms);
}
.kachelnav a.zieht.dreht-weiter { animation: none; }

/* Im Modus ist die Kachel ein Griff, kein Weg. `grab` sagt das, und
   `touch-action: none` ist NICHT Schmuck: ohne sie nimmt der Browser einen
   Fingerzug als Scrollen und die Kachel bewegt sich nie. Genau das ist der
   Unterschied zwischen "geht am Rechner" und "geht am iPad". */
.kachelnav.verschiebe-modus a {
  cursor: grab;
  touch-action: none;
  -webkit-user-select: none;
  user-select: none;
}
.kachelnav.verschiebe-modus a:active { cursor: grabbing; }

/* Die gezogene Kachel hebt sich ab -- sonst sieht man beim Umsortieren nicht,
   welche man in der Hand hat. */
.kachelnav.verschiebe-modus a.zieht {
  opacity: .65;
  transform: scale(1.06);
  box-shadow: 0 4px 14px rgba(0, 0, 0, .18);
  /* Ueber den Nachbarn, damit der Schatten nicht unter ihnen verschwindet. */
  position: relative; z-index: 2;
}

/* Ein ruhiger Rahmen sagt: die Leiste ist gerade in einem anderen Zustand.
   Ohne ihn ist nach der Drehung nicht mehr zu sehen, dass der Modus laeuft --
   und das ist genau der Preis der einmaligen Drehung gegenueber dem
   Dauerwackeln. */
.kachelnav.verschiebe-modus {
  background: var(--farbe-flaeche);
  box-shadow: inset 0 0 0 2px var(--farbe-akzent);
}

.vm-schluss {
  flex: none; align-self: center;
  width: 30px; height: 30px; margin-bottom: 4px; padding: 0;
  border: 1px solid var(--farbe-flaeche-rand); border-radius: 50%;
  background: var(--farbe-karte); color: var(--farbe-text-gedaempft);
  font-size: 18px; line-height: 1; cursor: pointer;
}
.vm-schluss:hover { border-color: var(--farbe-akzent); color: var(--farbe-akzent); }
.vm-schluss:focus-visible { outline: 2px solid var(--farbe-fokus); outline-offset: 2px; }

/* Wer Bewegung reduziert haben will, bekommt keine. Das Verschieben selbst
   bleibt: die Animation ist die Rueckmeldung, nicht die Funktion -- und der
   Rahmen oben sagt auch ohne Drehung, dass der Modus laeuft. */
@media (prefers-reduced-motion: reduce) {
  /* Auch die dauerhafte Runde faellt hier weg -- eine Animation ohne Ende ist
     genau die, die bei Bewegungsempfindlichkeit Beschwerden macht.
     WER DANN SAGT, DASS DER MODUS AN IST: der Akzentring um die Leiste und
     der X-Knopf. Beide sind unbewegt und beide stehen immer da, nicht nur
     hier -- deshalb bleibt der Modus ohne die Drehung erkennbar. */
  .kachelnav a.dreht,
  .kachelnav a.dreht-weiter { animation: none; }
  .kachelnav.verschiebe-modus a.zieht { transform: none; }
}

/* =========================================================================
   Anrufhinweis und Anrufstreifen — 13.08.2026
   =========================================================================
   Steht in DIESEM Blatt, weil beides auf jeder Backend-Seite erscheinen kann:
   tafel.css wird immer geladen, die Seitenblätter nur je Seite.

   Hier stand bis heute `.anruf-pop`, der Kasten des alten Screen-Pops. Der
   Sprung in die Akte ist entfallen (Til, 12.08.2026: „sonst wird man ja immer
   unterbrochen in seiner Arbeit"), und mit ihm der Kasten, der ihn ankündigte.

   Die Funktionsfarbe ist seit dem 13.08.2026 die EIGENE der Telefonie
   (`--bereich-telefon`, Unterfunktion von Kommunikation — wie Recall und
   Fehlermeldungen). Vorher war das Orange des Posteingangs geliehen. Sie trägt
   hier nur den Balken und den Strich am Mikro-Label, keinen Text: weiße Schrift
   auf ihr hält nur 3,63:1 (siehe design-tokens.css).
   ------------------------------------------------------------------------ */

/* ---- Der Kasten: meldet, springt nicht --------------------------------- */
.anruf-hinweis {
  position: fixed;
  right: var(--abstand-4);
  /* WIEDER UNTEN, WEIL DER GRUND WEGGEFALLEN IST (13.08.2026).
     Hier stand `bottom: 66px` — gerechnet gegen den schwebenden
     Schriftgrößen-Schalter (44 px hoch, 14 px vom Rand, z-index 1000), der
     genau dort saß und die Knöpfe im Kasten verdeckte. Der Schalter ist in die
     Kachelleiste gezogen; die Ecke ist frei, und eine Zahl, die gegen etwas
     gerechnet war, das es nicht mehr gibt, ist eine Falle für den Nächsten. */
  bottom: var(--abstand-4);
  z-index: 900;
  width: min(300px, calc(100vw - 2 * var(--abstand-4)));
  background: var(--farbe-karte);
  border: 1px solid var(--farbe-flaeche-rand);
  /* Ein Schatten, der eine Kante ist -- wie überall seit dem Redesign, nur
     zusätzlich abgesetzt, weil dieser Kasten ÜBER der Seite liegt. */
  box-shadow: 0 2px 0 rgba(26, 26, 24, .10);
}
/* Der Balken sagt, aus welchem Bereich die Meldung kommt -- dieselbe Sprache
   wie die Mikro-Label mit dem Farbstrich davor. */
.anruf-balken { height: 3px; background: var(--bereich-telefon); }
.anruf-inhalt { padding: var(--abstand-3) var(--abstand-4) var(--abstand-4); }
.anruf-marke {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--abstand-2);
  font-size: 10px;
  font-weight: 700;
  letter-spacing: .08em;
  text-transform: uppercase;
  color: var(--farbe-text-gedaempft);
}
.anruf-zu {
  width: var(--knopf-hoehe-sm);
  height: var(--knopf-hoehe-sm);
  min-height: 0;
  padding: 0;
  background: none;
  border: 0;
  color: var(--farbe-text-gedaempft);
  font-size: 16px;
  line-height: 1;
}
.anruf-zu:hover { background: none; color: var(--farbe-text); }
/* Die Nummer in Ziffernbreite: man liest sie vor, und dann zählt jede Stelle. */
.anruf-nummer {
  margin-top: 2px;
  font-size: 15px;
  font-weight: 600;
  font-variant-numeric: tabular-nums;
  letter-spacing: .02em;
}
.anruf-wer { margin-top: 2px; font-size: 15px; font-weight: 700; }
.anruf-meta {
  margin-top: 1px;
  font-size: var(--schrift-s);
  color: var(--farbe-text-gedaempft);
}
.anruf-zeile {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--abstand-2);
  margin-top: var(--abstand-3);
}
.anruf-zeile > button {
  width: max-content;
  height: var(--knopf-hoehe-md);
  min-height: var(--knopf-hoehe-md);
  padding: var(--knopf-polster-md);
  font-size: 13px;
}
/* „Nicht jetzt" nimmt die Füllung weg UND die weiße Schrift mit. Ohne die
   zweite Zeile stünde weißer Text auf weißem Grund -- am 10.08. beim
   Kartentitel und am 13.08. im Mockup schon zweimal passiert. */
.anruf-zeile > button.anruf-leise {
  background: none;
  border: 0;
  border-bottom: 1px solid var(--farbe-text);
  color: var(--farbe-text);
  height: auto;
  min-height: 0;
  padding: 0 0 1px;
  font-size: var(--schrift-s);
}
.anruf-zeile > button.anruf-leise:hover {
  background: none;
  color: var(--farbe-akzent);
  border-color: var(--farbe-akzent);
}
.anruf-uebernommen {
  margin-top: var(--abstand-2);
  font-size: var(--schrift-s);
  color: var(--status-bezahlt);
}

/* ---- Der Streifen: über der Seite, nicht anstelle von ihr -------------- */
.anruf-streifen {
  position: fixed;
  /* UNTER DER KOPFLEISTE. Sie trägt Glocke und Konto -- also genau die
     Stellen, an denen man sieht, was sonst noch wartet. Dieselbe Rechnung wie
     bei der Tagesliste im Kalender, mit derselben Variablen; ohne sie der
     gemessene Rückfall von 72 px. */
  top: calc(var(--leisten-hoehe, 72px));
  right: 0;
  bottom: 0;
  /* ÜBER dem Schriftgrößen-Schalter (1000). Er verschwindet, solange der
     Streifen offen ist -- und das ist die richtige Rangfolge: der Streifen
     gehört zu einem Anruf, der jetzt läuft, die Schriftgröße stellt man einmal
     ein. Ohne diese Zeile lag der Schalter über den Knöpfen „Anruf notieren"
     und „Akte öffnen" -- gesehen im Bild, nicht im Quelltext. */
  z-index: 1050;
  width: min(340px, 100vw);
  display: flex;
  flex-direction: column;
  background: var(--farbe-karte);
  border-left: 1px solid var(--farbe-flaeche-rand);
  box-shadow: -2px 0 0 rgba(26, 26, 24, .08);
}
.anruf-streifen-kopf {
  padding: var(--abstand-3) var(--abstand-4);
  background: var(--farbe-hintergrund);
  border-bottom: 2px solid var(--farbe-text);
}
.anruf-streifen-rumpf {
  flex: 1;
  overflow-y: auto;
  padding: var(--abstand-4);
  display: flex;
  flex-direction: column;
  gap: var(--abstand-4);
}
.anruf-streifen-fuss {
  border-top: 1px solid var(--farbe-flaeche-rand);
  padding: var(--abstand-3) var(--abstand-4);
  display: flex;
  flex-wrap: wrap;
  gap: var(--abstand-2);
}
.anruf-streifen-fuss > button {
  width: max-content;
  height: var(--knopf-hoehe-md);
  min-height: var(--knopf-hoehe-md);
  padding: var(--knopf-polster-md);
  font-size: 13px;
}
.anruf-gruppe { display: flex; flex-direction: column; gap: 6px; }
.anruf-label {
  display: flex;
  align-items: center;
  gap: 7px;
  font-size: 10.5px;
  font-weight: 700;
  letter-spacing: .08em;
  text-transform: uppercase;
}
.anruf-label::before {
  content: "";
  width: 14px;
  height: 2px;
  background: var(--bereich-telefon);
  flex: none;
}
/* Die kritischen Angaben sind der einzige Punkt, an dem ein Anruf medizinisch
   etwas ändert. Deshalb oben, deshalb hervorgehoben -- in der Fehlerfarbe des
   Hauses und nicht in einer neuen. */
.anruf-warnung {
  border-left: var(--strich) solid var(--farbe-fehler);
  background: var(--farbe-fehler-sanft);
  padding: var(--abstand-2) var(--abstand-3);
  font-size: var(--schrift-m);
  line-height: 1.5;
}
.anruf-blick { padding-top: 0; border-top: 0; }
.anruf-offen { color: var(--farbe-fehler); font-weight: 700; }
.anruf-verlauf {
  font-size: 12px;
  line-height: 1.5;
  padding: 6px 0;
  border-bottom: 1px solid var(--farbe-flaeche-rand);
}
.anruf-verlauf:last-child { border-bottom: 0; }
.anruf-zeit { color: var(--farbe-text-gedaempft); }
.anruf-verpasst { color: var(--farbe-fehler); font-weight: 600; }
.anruf-fussnote {
  margin: 6px 0 0;
  font-size: 12px;
  line-height: 1.55;
  color: var(--farbe-text-gedaempft);
}
/* Eine Wahl ist eine ganze Zeile: dort IST die Zeile die Handlung. */
.anruf-wahlen { display: flex; flex-direction: column; gap: 6px; margin-top: var(--abstand-2); }
.anruf-wahl {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--abstand-2);
  width: 100%;
  min-height: var(--knopf-hoehe-lg);
  padding: 6px 10px;
  text-align: left;
  background: var(--farbe-hintergrund);
  color: var(--farbe-text);
  border: 1px solid var(--farbe-flaeche-rand);
  font-size: 13px;
  font-weight: 600;
}
.anruf-wahl:hover { background: var(--farbe-flaeche); border-color: var(--farbe-akzent); }
.anruf-geb {
  font-weight: 400;
  font-size: 11.5px;
  color: var(--farbe-text-gedaempft);
  font-variant-numeric: tabular-nums;
}
/* Notieren im Streifen: der Grund ist frisch, solange das Gespräch läuft. */
.anruf-notiz {
  border-top: 1px solid var(--farbe-flaeche-rand);
  padding: var(--abstand-3) var(--abstand-4);
  display: flex;
  flex-direction: column;
  gap: 6px;
}
.anruf-notiz textarea { width: 100%; font-size: 13px; }
.anruf-grund {
  display: flex;
  align-items: center;
  gap: 8px;
  min-height: var(--knopf-hoehe-lg);
  margin: 0;
  font-size: 13px;
  font-weight: 400;
  text-transform: none;
  letter-spacing: 0;
  color: var(--farbe-text);
  cursor: pointer;
}
.anruf-grund input { margin: 0; }

@media (max-width: 700px) {
  /* Am Handy nimmt der Streifen die Breite, die da ist -- ein Streifen von
     340 px neben 72 px Rest wäre keine Ansicht, sondern ein Rand. */
  .anruf-streifen { width: 100vw; border-left: 0; }
}
