/* SchlauStart – Haupt-Styles der App (aus templates/index.html ausgelagert,
   Refactor A1). Cache-Busting laeuft ueber asset_url() in app.py. */

  :root{
    --paper:#F1F2F6; --card:#FFFFFF; --ink:#1B2230; --muted:#6A7384; --line:#E4E7EE;
    --pf-sent:#5063D6;      /* Akzent (Haken, Zitat-Rand, Fokus) */
    --pf-sent-bg:#E6EAFF;   /* eigene Chat-Blase: PASTELL-Lavendel (weich) */
    --pf-sent-ink:#2B3358;  /* dunkler Text auf der Pastell-Blase (lesbar) */
    --ok:#15A05A; --ok-soft:#E4F6EC; --bad:#E2483D; --bad-soft:#FCE9E7; --amber:#F5A623; --amber-soft:#FFF6E6; --amber-line:#FFE3B0;
    /* DIE WARTEFARBEN (v2.314.0). Sie standen als feste Werte im Rumpf von
       `.ld-dots` - solange es EINE Wartekette gab, war das in Ordnung. Seit
       die Ladekarte eine eigene Welle aus neun Punkten hat, gibt es zwei
       Stellen, und zwei Stellen mit derselben Palette laufen auseinander.
       Sie sind bewusst KEINE Zustandsfarben: --ok und --bad bedeuten
       "richtig" und "falsch", eine Wartekette bedeutet gar nichts. Wer sie
       dorthin umhaengt, faerbt eine Animation nach einer Bedeutung, die sie
       nicht hat - und aendert beim naechsten Kontrast-Feinschliff an den
       Zustandsfarben unbemerkt das Warten mit.
       SEIT v2.737.2 GIBT ES KEINE PUNKTREIHE MEHR (gewartet wird mit dem
       Reigen-Logo). Die Variablen bleiben: --ld-4 fuellt den Profilweg
       (.sl-profil-weg-bahn), und die naechste Kette braucht sie wieder. */
    --ld-1:#2E5BFF; --ld-2:#E0463E; --ld-3:#15A05A; --ld-4:#F5A623;
    --ld-5:#9B51E0; --ld-6:#00B8D9; --ld-7:#FF66A5;
    --radius:18px; --shadow:0 1px 2px rgba(27,34,48,.06), 0 8px 24px rgba(27,34,48,.07);
    /* Flaeche hinter Leiste und Panel. BEWUSST eine EIGENE Variable und nicht
       --paper: --paper wird an ueber 90 Stellen als Fuellfarbe benutzt (Kaesten,
       Eingabefelder, dunkles Design). Wuerde die Wunschfarbe der Lehrkraft dort
       ueberall durchschlagen, faerbte ein "Salbei" auch Eingabefelder gruen.
       --shell-bg faerbt NUR html/body. */
    --shell-bg:#E7F0E8;
  }

  /* ===== Flaechenfarbe (Wunsch Murat 29.07.2026, Vorbild Gmail) =====
     Seit 2.60.0 hat die Seitenleiste keinen eigenen Hintergrund mehr; weiss ist
     nur noch das Inhaltspanel. Damit wird die Flaeche dahinter sichtbar - und
     die darf die Lehrkraft waehlen (Einstellungen -> Darstellung).
     WIE ES ZUSAMMENHAENGT: users.shell_farbe (db.py, BEIDE Zweige) -> /auth/me
     -> AUTH.shellFarbe -> applyShellFarbe() setzt <html data-flaeche="..."> ->
     diese Regeln. Erlaubte Schluessel stehen in SHELL_FARBEN (sso.py) - Liste
     und Palette hier muessen deckungsgleich bleiben, das prueft
     qa/unit/test_shell_farbe.py.
     WARUM nur diese Toene: die Schrift der Leiste steht jetzt direkt auf dieser
     Flaeche. Alle Werte sind hell genug, dass var(--ink) sicher lesbar bleibt -
     auch die 9.5px kleinen Mini-Labels der eingeklappten Leiste. */
  /* Der Standard ("") hat bewusst KEINE Regel - dann gilt der Grundwert oben. */
  html[data-flaeche="stein"]   { --shell-bg:#E8EAEF; }
  html[data-flaeche="himmel"]  { --shell-bg:#E6EEFA; }
  html[data-flaeche="salbei"]  { --shell-bg:#E7F0E8; }
  html[data-flaeche="lavendel"]{ --shell-bg:#ECEAF7; }
  html[data-flaeche="sand"]    { --shell-bg:#F4EFE5; }
  html[data-flaeche="rose"]    { --shell-bg:#F8EBEE; }
  html[data-flaeche="minze"]   { --shell-bg:#E4F1EF; }
  /* Freie Wunschfarben (seit 2.81.0) haben hier ABSICHTLICH keine Regel: sie
     kommen als aufgehelltes Hex direkt per style="--shell-bg:…" ans <html>
     (applyShellFarbe). Eine Regel pro Farbe waere sonst unendlich lang. */
  /* Im dunklen Design bleibt die dunkle Flaeche: ein helles Salbei waere dort
     ein Blitz, und der Sinn des dunklen Designs ist genau das Gegenteil. Die
     Auswahl wird deshalb im Konto ausgegraut (kbFlaecheDots) - der gespeicherte
     Wert bleibt erhalten und greift wieder, sobald hell aktiv ist.
     Das !important ist die zweite Sicherung fuer freie Wunschfarben: die stehen
     als Inline-Wert am <html> und wuerden dieses Stylesheet sonst schlagen.
     applyShellFarbe setzt sie im Dunkeln schon gar nicht erst - beides zusammen
     haelt das dunkle Design auch dann dunkel, wenn ein Weg mal ausfaellt. */
  html[data-theme="dark"]{ --shell-bg:var(--paper) !important; }
  *{box-sizing:border-box;-webkit-tap-highlight-color:transparent;}
  /* Scrollbalken: normalerweise UNSICHTBAR (liegen sonst über Inhalten).
     Innere Bereiche zeigen einen hauchdünnen Daumen erst, wenn die Maus über
     dem Bereich ist (macOS-Gefühl). Haupt-Scrollbalken der Seite: ganz aus.
     Scrollen per Rad/Touch funktioniert unverändert. */
  *{scrollbar-width:thin;scrollbar-color:transparent transparent;}
  *:hover{scrollbar-color:rgba(106,115,132,.35) transparent;}
  html, html:hover, body, body:hover{scrollbar-width:none;scrollbar-color:transparent transparent;}
  ::-webkit-scrollbar{width:5px;height:5px;background:transparent;}
  ::-webkit-scrollbar-track{background:transparent;}
  ::-webkit-scrollbar-thumb{background:transparent;border-radius:99px;}
  *:hover::-webkit-scrollbar-thumb{background:rgba(106,115,132,.32);}
  ::-webkit-scrollbar-thumb:hover{background:rgba(106,115,132,.55);}
  ::-webkit-scrollbar-corner{background:transparent;}
  html::-webkit-scrollbar, body::-webkit-scrollbar{width:0;height:0;display:none;}
  html{overscroll-behavior:none;background:var(--shell-bg);touch-action:pan-x pan-y;}
  body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",system-ui,Roboto,Arial,sans-serif;
    background:var(--shell-bg);color:var(--ink);line-height:1.5;-webkit-font-smoothing:antialiased;overscroll-behavior:none;}

  /* ===== iOS-Rotationsfix (quer -> hoch bleibt Layout "haengen") =====
     Symptom: nach dem Drehen ins Querformat und zurueck ins Hochformat behaelt
     iOS die BREITERE Layout-Breite bei -> Inhalt ragt rechts raus, Panel sitzt
     nicht mehr, Text wird abgeschnitten. Drei Ursachen, drei Gegenmittel:
     1) -webkit-text-size-adjust: iOS skaliert nach dem Drehen Schriftgroessen
        automatisch neu ("Text Autosizing") -> auf 100% festnageln.
     2) Ein einziges horizontal ueberlaufendes Element friert die Layout-Breite
        ein -> overflow-x:hidden + max-width:100% auf html/body.
     3) Layout-Breite hart an die Geraetebreite binden (nicht an den Inhalt). */
  html{ -webkit-text-size-adjust:100%; text-size-adjust:100%; }
  html, body{ width:100%; max-width:100%; overflow-x:hidden; }
  .wrap{max-width:720px;margin:0 auto;padding:max(calc(20px + env(safe-area-inset-top)), 28px) calc(16px + env(safe-area-inset-right)) calc(80px + env(safe-area-inset-bottom)) calc(16px + env(safe-area-inset-left));}
  /* gap: 4px ile yazıyı logoya yaklaştırdık, margin ile de genel üst/alt boşluğu daralttık */
  .topbar { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin: 6px 0 22px; min-height: 48px; }
  /* Begrüßung: bleibt mittig zwischen Logo und Profil, einzeilig, weiche moderne Schrift.
     Bei langen Namen wird die Schrift automatisch kleiner (clamp). */
  .greeting{
    flex:1 1 auto; min-width:0; text-align:center;
    font-family:"Inter",-apple-system,BlinkMacSystemFont,"Segoe UI",system-ui,sans-serif;
    font-weight:600; line-height:1.2; letter-spacing:-0.015em;
    color:var(--ink);
    font-size:clamp(13px, 2.7vw, 17px);
    white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
    padding:0 8px;
  }
  .greeting.empty{ display:none; }
  .card{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);padding:22px;box-shadow:var(--shadow);margin-bottom:16px;}
  h2{font-size:22px;letter-spacing:-.5px;margin:0 0 6px;}
  .lead{color:var(--muted);font-size:var(--fs-md);margin:0 0 18px;}
  label{display:block;font-size:13px;font-weight:600;margin:0 0 7px;}
  input[type=text],input[type=number],input[type=password],textarea{width:100%;padding:13px 14px;border:1.5px solid var(--line);border-radius:12px;font-size:16px;font-family:inherit;color:var(--ink);background:#fff;}
  textarea{resize:vertical;min-height:120px;}
  /* Ghost-Autocomplete: Mirror-Div hinter dem Textfeld zeigt die graue Fortsetzung */
  #manual-ghost-wrap{position:relative;}
  #manual-ghost-wrap textarea{position:relative;background:transparent;z-index:2;line-height:1.5;}
  #manual-ghost{position:absolute;inset:0;z-index:1;pointer-events:none;overflow:hidden;
    width:100%;padding:13px 14px;border:1.5px solid transparent;border-radius:12px;
    font-size:16px;font-family:inherit;line-height:1.5;white-space:pre-wrap;word-break:break-word;
    color:transparent;background:#fff;}
  #manual-ghost .ghost-rest{color:var(--muted);opacity:.55;}
  html[data-theme="dark"] #manual-ghost, html:not([data-theme="light"]) #manual-ghost{background:transparent;}
  input:focus,textarea:focus{outline:none;border-color:var(--brand);box-shadow:none;}
  select{width:100%;padding:11px 12px;border:1.5px solid var(--line);border-radius:11px;font-size:15px;font-family:inherit;background:#fff;color:var(--ink);}
  .btn{appearance:none;border:none;cursor:pointer;font-family:inherit;font-weight:700;font-size:16px;padding:14px 18px;border-radius:13px;background:var(--brand);color:#fff;width:100%;transition:transform .08s ease,background .15s ease;}
  .btn:hover{background:var(--brand-dk);} .btn:active{transform:scale(.985);} .btn:disabled{background:#B9C0D4;cursor:not-allowed;}
  .btn.ghost{background:#fff;color:var(--brand);border:1.5px solid var(--line);} .btn.ghost:hover{border-color:var(--brand);background:var(--brand-soft);}
  .btn.sub{background:var(--ink);} .btn.sub:hover{background:#000;}
  .btn.ok{background:var(--ok);} .btn.ok:hover{background:#0e7a43;}
  .ed-acc{border:1px solid var(--line);border-radius:12px;margin:18px 0;overflow:hidden;}
  .ed-acc-head{display:flex;align-items:center;justify-content:space-between;padding:13px 15px;cursor:pointer;background:var(--brand-soft,#eef2ff);font-weight:700;font-size:var(--fs-md);}
  .ed-acc-arrow{font-size:13px;color:var(--muted);font-weight:600;}
  .ed-acc-body{padding:15px;border-top:1px solid var(--line);}

  /* ===== DER BLOCKEDITOR FUER DEN INFOTEXT (PLAN_INFOBLOECKE.md Faz 2b) ====
     KEINE EIGENE FARBWELT: alles kommt aus den Tokens des Design-Systems
     (--line, --card, --muted, --brand-soft). Wer hier eine feste Farbe
     einsetzt, macht qa/unit/test_design_system.py rot - und zwar zu Recht,
     denn der Editor soll aussehen wie der Rest der Karte und nicht wie ein
     zweites Produkt. */
  .ed-acc-opt{font-size:11px;font-weight:600;color:var(--muted);
    border:1px solid var(--line);border-radius:99px;padding:1px 7px;
    margin-left:7px;vertical-align:1px;background:var(--card);}
  /* Die Reihe der fertigen Blaetter: Gruppenmarke und Hinweis (Faz A1/A3).
     Beide aus den Tokens - eine eigene Farbwelt macht den Waechter des
     Design-Systems rot, und zwar zu Recht. */
  .mat-vor-gruppe{flex:none;align-self:center;font-size:11px;font-weight:700;
    letter-spacing:.04em;text-transform:uppercase;color:var(--muted);
    writing-mode:vertical-rl;transform:rotate(180deg);padding:2px 0;
    margin:0 2px;border-left:1px solid var(--line);}
  .mat-vor-hinweis{font-size:12.5px;color:var(--muted);line-height:1.5;
    margin:0 0 8px;}
  .ed-bl-modus{display:flex;justify-content:flex-end;margin:-4px 0 9px;}
  .ed-bl-hilfe{font-size:11.5px;color:var(--muted);line-height:1.5;
    margin-top:9px;}
  /* DEUTLICHERE KANTEN (Befund Murat 30.08.2026: „infomateryal ve
     fragelerin box sinirlarini daha belirgin yap ki görünevilsin").
     Der Hintergrund kommt seit den Blattfarben aus dem Thema und kann
     hell sein; eine Kante in `--line` verschwand darauf. `--line-kraeftig`
     faellt auf den Ersatzwert zurueck, wo es die Variable nicht gibt. */
  /* DIESELBE KANTE FUER DIE BEIDEN GROSSEN KAESTEN des Editors - der
     Infotext-Kasten und die Fragenkarten. Der Hintergrund kommt seit den
     Blattfarben aus dem Thema; auf einem hellen Rosa verschwand eine Kante
     in `--line` vollstaendig, und man sah nicht mehr, wo ein Kasten
     aufhoert (Befund Murat 30.08.2026). */
  #screen-editor .ed-acc,
  #screen-editor .ed-karte{border-color:var(--line-kraeftig);}
  .ed-bl{border:1px solid var(--line-kraeftig);border-radius:10px;margin-bottom:8px;
    background:var(--card);overflow:hidden;}
  .ed-bl--offen{border-color:var(--brand);}
  .ed-bl-kopf{display:flex;align-items:center;gap:9px;padding:9px 10px;
    cursor:pointer;min-width:0;}
  .ed-bl--bild .ed-bl-kopf{cursor:default;}
  /* Der Typ ist die Beschriftung, nach der man sucht - er darf nie
     schrumpfen, auch wenn der Vorschautext lang ist. */
  .ed-bl-typ{flex:none;font-size:11.5px;font-weight:700;letter-spacing:.02em;
    text-transform:uppercase;color:var(--muted);min-width:104px;}
  .ed-bl-vor{flex:1;min-width:0;font-size:13px;color:var(--ink);
    white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
  .ed-bl-akt{flex:none;display:flex;gap:2px;}
  .ed-bl-knopf{width:28px;height:28px;display:inline-flex;align-items:center;
    justify-content:center;border:1px solid transparent;border-radius:8px;
    background:none;color:var(--muted);cursor:pointer;padding:0;
    transition:border-color .12s,color .12s;}
  .ed-bl-knopf:hover{border-color:var(--line);color:var(--ink);}
  /* SIGMA IST DIE EINZIGE HANDLUNG IN DIESER REIHE, DIE IN DEN BLOCK
     SCHREIBT - die vier anderen verwalten ihn. Die Farbe sagt das, ohne
     dass jemand die Beschriftung lesen muss. `--warn` statt einer festen
     Farbe: das Woerterbuch kennt Rot, und der Dunkelmodus auch
     (DESIGN_SYSTEM.md). */
  /* ===== DAS SIGMA AM FRAGEFELD (v2.565.0) ============================
     Fest an der unteren rechten Ecke des Feldes - nicht schwebend. Eine
     Textflaeche fuellt sich von oben, unten rechts ist fast immer leer,
     und der Anfasser zum Groesserziehen sitzt dort nur wenige Pixel breit.
     `pointer-events` bleibt an, `bottom`/`right` klein genug, dass beide
     nebeneinander passen. */
  /* SIGMA IN DER KOPFZEILE DER FRAGE, rechts neben der Artwahl (v2.566.2).
     Vorher sass es im Schreibfeld - dort, wo man gerade tippt, und je nach
     Fragenart an einer anderen Stelle. Hier hat es immer denselben Platz,
     auf- wie zugeklappt, und steht neben der anderen Entscheidung ueber
     diese Frage. Dieselbe Anordnung wie im Infoblock. */
  .ed-head-sigma{flex:none;width:24px;height:24px;display:inline-flex;
    align-items:center;justify-content:center;border:1px solid transparent;
    border-radius:7px;background:none;color:var(--bad-ink);cursor:pointer;
    padding:0;transition:border-color .12s;}
  .ed-head-sigma:hover{border-color:var(--bad-ink);}
  .ed-head-sigma svg{width:14px;height:14px;fill:none;stroke:currentColor;
    stroke-width:2;stroke-linecap:round;stroke-linejoin:round;}
  .ed-bl-sigma{color:var(--bad-ink);}
  .ed-bl-sigma:hover{border-color:var(--bad-ink);color:var(--bad-ink);}
  .ed-bl-knopf svg{width:15px;height:15px;fill:none;stroke:currentColor;
    stroke-width:2;stroke-linecap:round;stroke-linejoin:round;}
  .ed-bl-body{padding:0 10px 11px;display:flex;flex-direction:column;gap:8px;}
  .ed-bl-art{font-size:12px;color:var(--muted);display:flex;align-items:center;
    gap:7px;}
  .ed-bl-art select{font-size:13px;padding:5px 8px;border:1px solid var(--line);
    border-radius:8px;background:var(--card);color:var(--ink);}
  .ed-bl-text{width:100%;box-sizing:border-box;min-height:88px;resize:vertical;}
  .ed-bl-bildvor{padding:0 10px 6px;text-align:center;}
  .ed-bl-bildvor img{max-height:150px;}
  .ed-bl-fest{padding:0 10px 10px;font-size:11.5px;color:var(--muted);}
  .ed-bl-leer{font-size:13px;color:var(--muted);line-height:1.55;
    padding:10px 2px 14px;}
  .ed-bl-neu{display:flex;align-items:center;gap:10px;flex-wrap:wrap;
    margin-top:4px;}
  .ed-bl-neu .btn{width:auto;font-size:13px;padding:8px 14px;}
  .ed-bl-neu-art{font-size:12px;color:var(--muted);display:flex;
    align-items:center;gap:6px;}
  .ed-bl-neu-art select{font-size:13px;padding:6px 8px;
    border:1px solid var(--line);border-radius:8px;background:var(--card);
    color:var(--ink);}

  /* NUR AM TELEFON (CLAUDE.md: schmal aendern heisst SCHMAL aendern - am
     Tablet und am Rechner war nichts kaputt). Der Kopf einer Blockzeile
     traegt dort Typ, Kurzfassung und vier Knoepfe; die feste Breite des Typs
     draengte die Kurzfassung auf zwei Zeichen. Also faellt die feste Breite
     weg und die Knoepfe ruecken zusammen - die Zeile bleibt EINE Zeile. */
  @media (max-width:640px){
    .ed-bl-typ{min-width:0;font-size:10.5px;}
    .ed-bl-kopf{gap:6px;padding:8px;}
    .ed-bl-knopf{width:26px;height:26px;}
    .ed-bl-neu{gap:7px;}
    .ed-bl-neu .btn{flex:1;min-width:150px;}
  }
  .ed-section-label{font-size:13px;font-weight:800;color:var(--muted);letter-spacing:.04em;margin:20px 0 10px;}
  .ed-mini-toggle{appearance:none;border:1px solid var(--line);background:var(--card);color:var(--muted);font-family:inherit;font-size:11px;font-weight:700;padding:4px 9px;border-radius:8px;cursor:pointer;letter-spacing:0;}
  .ed-mini-toggle:hover{border-color:var(--brand);color:var(--brand);}
  /* ===== FAZ 4: LINKS DIE FRAGEN, RECHTS DAS BLATT (v2.536.0) ==========
     Der Bildschirm heisst „Vorschau & Bearbeiten" und zeigte keine Vorschau.

     ZWEI SPALTEN ERST AB 1080 px, und darunter das BLATT ZUERST: am Telefon
     will man sehen, was man hat, bevor man es aendert. Der Wechselpunkt ist
     nicht 640 px, weil das Blatt in einer Spalte unter 400 px so klein
     waere, dass man daran nichts mehr pruefen kann - dann ist eine Spalte
     ehrlicher als zwei.

     `position:sticky` an der rechten Spalte: die Fragenliste ist lang, das
     Blatt soll beim Blaettern stehen bleiben. Sonst muesste man scrollen,
     um die Wirkung einer Aenderung zu sehen, die man gerade gemacht hat. */
  /* DIE SEITE WIRD BREITER - ABER NUR DIESE (v2.537.0, Befund Murat
     29.08.2026: „o pencereyi beyaz olan kisimi genislet, bi sürü yer var").
     `.wrap` ist ueberall 720 px breit; das passt fuer eine Spalte Text und
     ist zu eng, sobald rechts ein A4-Blatt danebensteht. Geaendert wird
     deshalb NICHT die Grundregel, sondern nur der Editor-Bildschirm -
     `body[data-screen="editor"]` gibt es dafuer schon (die Kopfleiste haengt
     seit laengerem daran). Auf jedem anderen Bildschirm bleibt alles, wie
     es war. */
  /* SEIT v2.540.0 IST ES 1560 px UND NICHT MEHR 1240 (Befund Murat
     29.08.2026: „enini artirmalisin … eni daha büyük olsun burda nav yok
     yani"). Der Hinweis am Ende ist der ganze Grund: dieser Bildschirm ist
     eine Vollbild-Ansicht OHNE Seitenleiste (`hideOn` in index-app.js) -
     die 1240 px stammen aus der einheitlichen Textbreite, und dort, wo
     links keine Leiste steht, kostet sie beidseitig eine Handbreit Leere.
     1560 px ist dieselbe Zahl, die die Administration schon hat. */
  body[data-screen="editor"] .wrap{max-width:1560px;}

  .ed-buehne{display:block;}
  .ed-sp-rechts{margin:0 0 18px;}
  /* Der Griff zwischen den Spalten. Auf schmalen Schirmen gibt es keine
     zwei Spalten und deshalb auch nichts zu ziehen. */
  .ed-griff{display:none;}
  .ed-vorschau{border:1px solid var(--line);border-radius:var(--r-control);
    background:var(--card);padding:10px;}
  .ed-vor-kopf{display:flex;align-items:baseline;justify-content:space-between;
    gap:8px;margin-bottom:8px;flex-wrap:wrap;}
  .ed-vor-kopf b{font-size:13px;font-weight:800;}
  .ed-vor-seiten{font-size:11.5px;color:var(--muted);}
  .ed-vor-rahmen{overflow:hidden;border:1px solid var(--line);
    border-radius:8px;background:var(--paper);}
  .ed-vor-buehne{width:760px;transform-origin:top left;}
  .ed-vor-buehne iframe{display:block;width:760px;height:1074px;border:0;
    background:var(--paper);}
  .ed-vor-leer{font-size:12px;color:var(--muted);padding:14px 4px;}
  /* ===== DIE BLATTVORLAGE-WAHL (Faz 7, v2.540.0) =======================
     Vier Knoepfe ueber der Vorschau, zwei je Zeile. KEINE Miniaturen: die
     Spalte ist rund 460 px breit, vier Kacheln waeren je 100 px - ein
     Blatt im Massstab 0,13, in dem drei verschiedene Designs tatsaechlich
     gleich aussehen. Genau diese Taeuschung war der Anlass fuer Plan §2j.
     Die echte Vorschau steht darunter, in voller Groesse.
     Name FETT, Wirkung darunter grau - dieselbe Zweiteilung wie bei den
     „Fertigen Blaettern" (.mat-vor), damit zwei Auswahlen, die dasselbe
     tun, auch gleich aussehen. */
  /* ===== DIE BLATTVORLAGE: EIN KNOPF (Faz A4) ==========================
     Vorher acht dauerhaft offene Karten in zwei Spalten - ueber einer
     Vorschau, die dasselbe zeigt, nur richtig. Jetzt eine Zeile.
     Alle Farben aus den Tokens; eine feste Farbe hier macht den Waechter
     des Design-Systems rot, und zwar zu Recht. */
  .ed-dz{margin-bottom:10px;}
  .ed-dz-zeile{display:flex;align-items:center;gap:10px;flex-wrap:wrap;}
  .ed-dz-ttl{font-size:11px;font-weight:800;letter-spacing:.05em;
    text-transform:uppercase;color:var(--muted);flex:none;}
  .ed-dz-wahl{position:relative;flex:1;min-width:160px;}
  .ed-dz-knopf{display:flex;align-items:center;gap:8px;cursor:pointer;
    list-style:none;padding:7px 10px;border:1px solid var(--line);
    border-radius:var(--r-control);background:var(--card);color:var(--ink);
    font-size:13px;font-weight:600;transition:border-color .12s;}
  .ed-dz-knopf::-webkit-details-marker{display:none;}
  .ed-dz-knopf:hover{border-color:var(--brand);}
  .ed-dz-wahl[open] .ed-dz-knopf{border-color:var(--brand);}
  .ed-dz-name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;
    white-space:nowrap;}
  .ed-dz-pfeil{flex:none;color:var(--muted);font-size:11px;}
  .ed-dz-wahl[open] .ed-dz-pfeil{transform:rotate(180deg);}
  /* Das Menue SCHWEBT: es soll die Vorschau darunter nicht wegschieben.
     Ein Aufklapper, der das halbe Blatt verrueckt, ist derselbe Platzfresser
     wie die Kartenwand vorher, nur mit einem Klick davor. */
  .ed-dz-menu{position:absolute;z-index:30;top:calc(100% + 4px);left:0;
    right:0;max-height:min(58vh,340px);overflow:auto;padding:4px;
    border:1px solid var(--line);border-radius:var(--r-control);
    background:var(--card);box-shadow:var(--sh-2,0 8px 26px rgba(20,26,40,.16));}
  .ed-dz-opt{appearance:none;cursor:pointer;font:inherit;text-align:left;
    width:100%;display:flex;align-items:center;gap:9px;padding:7px 8px;
    border:0;border-radius:8px;background:none;color:var(--ink);}
  .ed-dz-opt:hover{background:var(--brand-soft);}
  .ed-dz-opt.an{background:var(--brand-soft);}
  .ed-dz-txt{flex:1;min-width:0;display:flex;flex-direction:column;}
  .ed-dz-opt b{font-size:12.5px;font-weight:700;}
  .ed-dz-opt small{font-size:10.5px;color:var(--muted);line-height:1.3;}
  .ed-dz-hak{flex:none;width:14px;color:var(--brand);font-weight:800;}
  /* ===== DIE FARBE: EIN ZWEITER KNOPF NEBEN DER VORLAGE (Faz A5) =======
     Struktur und Farbe sind getrennt gespeichert, also stehen sie auch
     getrennt da. Der Tupfen zeigt die Farbe selbst - eine Beschriftung
     allein ("Ocker") sagt niemandem, wie das Blatt aussieht. */
  .ed-dz-wahl--farbe{flex:0 1 auto;min-width:130px;}
  /* ===== DIE WAHLEN AM BLATT (v2.976.0, PLAN_BLATTVORLAGEN) ==========
     Loesungswort und Kopierer sind Schalter in derselben Zeile wie Vorlage
     und Farbe; der Begleiter ist ein kleiner Knopf wie die Farbe. Nur Tokens,
     keine feste Farbe (Design-Waechter). Die Bildvorlagen zeigen im Menue
     ihr Bild aus der Bibliothek statt eines Strukturzeichens. */
  .ed-dz-schalter{appearance:none;cursor:pointer;font:inherit;font-size:12.5px;
    font-weight:600;padding:7px 11px;border:1px solid var(--line);
    border-radius:var(--r-control);background:var(--card);color:var(--muted);
    transition:border-color .12s;}
  .ed-dz-schalter:hover{border-color:var(--brand);}
  .ed-dz-schalter.an{background:var(--brand-soft);border-color:var(--brand);
    color:var(--ink);}
  .ed-dz-wahl--klein{flex:0 1 auto;min-width:120px;}
  .ed-dz-mini--bild{border:0;background:none;object-fit:contain;width:24px;height:24px;}
  .ed-dz-tupf{flex:none;width:16px;height:16px;border-radius:50%;
    border:1px solid var(--line);background:var(--paper);}
  /* ===== DAS FARBMENUE BEKOMMT SEINE EIGENE BREITE (v2.567.0) =========
     Befund Murat 30.08.2026: „sag üstteki renk kutucugu niye böyle
     sikilmis gibi duruyor" - die Farbtupfen waren OVAL statt rund.

     ZWEI URSACHEN, die zusammen wirkten:
     1. `.ed-dz-menu` klebt mit `left:0;right:0` an der Breite seines
        Knopfes. Das ist bei der Vorlagenwahl richtig (lange Namen, breiter
        Knopf) und bei der Farbwahl falsch: der Knopf ist schmal
        (`min-width:130px`), das Gitter darin hat aber fuenf Spalten.
     2. Der Tupfen ist ein Flex-Kind und durfte SCHRUMPFEN. Breite gab
        nach, Hoehe nicht - daraus wird ein Oval.

     Deshalb: das Farbmenue loest sich von der Knopfbreite und richtet
     sich rechts aus (dort steht der Knopf, dort soll es aufgehen), und
     der Tupfen schrumpft nicht mehr. */
  .ed-dz-wahl--farbe .ed-dz-menu{left:auto;right:0;width:max-content;
    min-width:180px;}
  .ed-fb-gitter{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));
    gap:4px;padding:2px;}
  .ed-fb{appearance:none;cursor:pointer;padding:3px;border:1px solid transparent;
    border-radius:8px;background:none;display:flex;align-items:center;
    justify-content:center;}
  .ed-fb:hover{border-color:var(--line);}
  .ed-fb.an{border-color:var(--brand);background:var(--brand-soft);}
  /* `flex:none` - siehe oben: ein schrumpfender Kreis ist ein Oval. */
  .ed-fb-tupf{width:22px;height:22px;flex:none;border-radius:50%;
    border:1px solid var(--line);display:block;}
  /* „Wie die Vorlage" ist keine Farbe, sondern der Weg zurueck - deshalb
     kein Tupfen, sondern ein durchgestrichenes Feld. */
  .ed-fb-tupf--aus{background:var(--paper);position:relative;overflow:hidden;}
  .ed-fb-tupf--aus::after{content:"";position:absolute;left:-2px;right:-2px;
    top:9px;height:1px;background:var(--muted);transform:rotate(-45deg);}
  /* Die eigene Farbe: der letzte Tupfen im Gitter (v2.555.0). Vorher ein
     abgetrennter Streifen mit einem nackten `<input type="color">` darin -
     ein eckiger Farbklotz unter runden Tupfen, in der Groesse und Farbe des
     Betriebssystems. Der `<input>` liegt jetzt unsichtbar UEBER dem Tupfen:
     der Systemwaehler bleibt (Pipette, Tastatur, zuletzt benutzte Farben),
     nur sein Aussehen ist unseres. `opacity:0` statt `display:none`, sonst
     ist er nicht mehr anklickbar und nicht mehr mit der Tastatur zu
     erreichen. Der Ring wird aus HSL gemischt, nicht aus festen Farbwerten -
     eine Farbskala, die alle Farbtoene meint, gehoert nicht ins
     Farbwoerterbuch (DESIGN_SYSTEM.md §9). */
  .ed-fb--eigen{position:relative;}
  .ed-fb--eigen input[type=color]{position:absolute;inset:0;width:100%;
    height:100%;opacity:0;padding:0;border:0;cursor:pointer;}
  .ed-fb-tupf--frei{background:conic-gradient(from .25turn,
    hsl(0 72% 55%), hsl(45 85% 52%), hsl(95 55% 42%), hsl(160 60% 40%),
    hsl(205 75% 50%), hsl(255 65% 60%), hsl(310 62% 55%), hsl(0 72% 55%));}

  /* ===== DAS STRUKTURZEICHEN JE VORLAGE ================================
     Es zeigt, WIE dicht das Blatt gesetzt ist - dafuer gibt es in keiner
     Icon-Sammlung ein Zeichen, also wird es hier gezeichnet: ein Kaestchen
     mit waagerechten Linien aus `repeating-linear-gradient`. Je Vorlage
     aendert sich Abstand, Staerke oder Richtung, und das ist genau die
     Eigenschaft, die man an der Vorlage wiedererkennt. */
  .ed-dz-mini{flex:none;width:20px;height:26px;border:1px solid var(--line);
    border-radius:3px;background:var(--paper);position:relative;
    overflow:hidden;}
  .ed-dz-mini::after{content:"";position:absolute;inset:3px;
    background:repeating-linear-gradient(to bottom,
      var(--line) 0 1px, transparent 1px 4px);}
  .ed-dz-mini--klar-v1::after{background:repeating-linear-gradient(to bottom,
      var(--line) 0 1px, transparent 1px 7px);}
  .ed-dz-mini--mission-v1::after{background:repeating-linear-gradient(to bottom,
      var(--line) 0 3px, transparent 3px 8px);}
  .ed-dz-mini--labor-v1::after{background:
      repeating-linear-gradient(to bottom, var(--line) 0 1px, transparent 1px 4px),
      repeating-linear-gradient(to right, var(--line) 0 1px, transparent 1px 4px);}
  .ed-dz-mini--rechenheft-v1::after{background:
      repeating-linear-gradient(to bottom, var(--line) 0 1px, transparent 1px 3px),
      repeating-linear-gradient(to right, var(--line) 0 1px, transparent 1px 3px);}
  .ed-dz-mini--lesewerk-v1::after{background:repeating-linear-gradient(to bottom,
      var(--line) 0 1px, transparent 1px 6px);inset:3px 2px;}
  .ed-dz-mini--pruefung-v1::after{background:repeating-linear-gradient(to bottom,
      var(--line) 0 1px, transparent 1px 2px);}
  .ed-dz-mini--gross-v1::after{background:repeating-linear-gradient(to bottom,
      var(--line) 0 2px, transparent 2px 9px);}
  /* Faz A6 - die fuenf neuen. Zwei Spalten, Quellenkasten, grosse Felder,
     Stufenleiste, Haarlinien: jedes Zeichen zeigt genau das, was die
     Vorlage anders macht. */
  .ed-dz-mini--doppelspur-v1::after{background:
      repeating-linear-gradient(to bottom, var(--line) 0 1px, transparent 1px 4px);
    inset:3px 3px 3px 3px;border-left:0;
    box-shadow:inset 9px 0 0 -8px var(--line);}
  .ed-dz-mini--quelle-v1::after{background:
      linear-gradient(var(--line),var(--line)) top/100% 7px no-repeat,
      repeating-linear-gradient(to bottom, transparent 0 9px,
        var(--line) 9px 10px, transparent 10px 14px);}
  .ed-dz-mini--werkstatt-v1::after{background:repeating-linear-gradient(to bottom,
      var(--line) 0 1px, transparent 1px 8px);}
  .ed-dz-mini--lernweg-v1::after{background:
      linear-gradient(var(--line),var(--line)) left/1px 100% no-repeat,
      repeating-linear-gradient(to bottom, transparent 0 3px,
        var(--line) 3px 4px, transparent 4px 7px);}
  .ed-dz-mini--minimal-v1::after{background:repeating-linear-gradient(to bottom,
      var(--line) 0 1px, transparent 1px 3px);opacity:.65;}
  .ed-vor-lupe{margin-top:8px;width:100%;font-size:13px;padding:9px 12px;}
  @media (min-width:1080px){
    /* DIE BREITE DER RECHTEN SPALTE IST ZIEHBAR (Wunsch Murat 29.08.2026:
       „o sagdaki so sieht das blatt aus kismi ve soldaki yer arasinda
       büyütme kücültme yapabileyim tutup sag sol yaptikca").

       Sie steht als CSS-Variable am Raster, nicht als feste Zahl - so
       genuegt EIN Wert, den der Griff schiebt, und die Spalte, das Blatt
       und der Massstab folgen von selbst. Gemerkt wird sie in
       `localStorage`: eine Breite, die man bei jedem Oeffnen neu einstellen
       muss, ist keine Einstellung. */
    /* Die Vorgabebreite ist mit v2.540.0 von 340 auf 460 px gewachsen -
       zusammen mit der Seite. Sie bleibt nur eine VORGABE: wer den Griff
       einmal gezogen hat, hat seinen Wert im `localStorage`, und der
       gewinnt. */
    .ed-buehne{display:grid;
      grid-template-columns:minmax(320px,1fr) 6px var(--ed-vor-breite,460px);
      gap:16px;align-items:start;}
    .ed-sp-links{min-width:0;}
    .ed-sp-rechts{margin:0;position:sticky;top:16px;min-width:0;}
    /* `--vh100` statt `100vh` - ARCHITEKTUR §4b: auf iOS meldet `100vh` die
       Hoehe OHNE die eingeblendete Adressleiste und ist damit zu gross. Die
       Projektvariable wird von JavaScript nachgefuehrt. */
    .ed-griff{display:block;align-self:stretch;min-height:120px;
      position:sticky;top:16px;height:calc(var(--vh100) - 40px);
      cursor:col-resize;border-radius:3px;background:var(--line);
      transition:background .12s;touch-action:none;}
    /* Breite Trefferfläche, schmale sichtbare Linie. */
    .ed-griff::before{content:"";position:absolute;inset:0 -10px;}
    .ed-griff:hover,.ed-griff.zieht{background:var(--brand);}
    /* Waehrend des Ziehens NICHTS markieren - sonst faerbt sich die halbe
       Seite blau, sobald der Zeiger ueber Text laeuft. */
    body.ed-zieht{user-select:none;cursor:col-resize;}
    body.ed-zieht #ed-vorschau iframe{pointer-events:none;}

    /* ===== DIE FESTE SHELL - DIESELBE WIE IM COCKPIT (v2.540.0) ========
       WUNSCH MURAT 29.08.2026: „boyu tam olarak sabit olmali yani ayni
       cocupitin sigdigi bizim beyaz boximiz var ya ordaki yükseklik
       mantigi olmali."

       Er meint die Bauform, die in dieser Anwendung ueberall gilt, wo eine
       Seitenleiste steht: das weisse Panel ist GENAU einen Bildschirm hoch,
       die Kopfzeile bleibt stehen, und gerollt wird INNEN. Der Editor war
       der letzte grosse Bildschirm ohne sie - seine Karte wuchs mit der
       Fragenliste, die Seite rollte als Ganzes, und dabei wanderte das
       Blatt rechts mit nach oben aus dem Bild. Genau dagegen war die
       `sticky`-Spalte gedacht; sie hilft aber nur, solange die Karte
       kuerzer ist als der Bildschirm.

       JETZT ROLLEN DIE ZWEI SPALTEN GETRENNT - Fragen links, Blatt rechts.
       Das ist derselbe Aufbau wie bei der Aufgabenliste (dort seit
       v2.94.x) und er loest dasselbe Problem: eine lange Liste darf die
       feste Anzeige daneben nicht wegschieben. `position:static` an der
       rechten Spalte gehoert deshalb dazu - in dieser Bauform gibt es
       nichts mehr, woran sie kleben muesste, und `sticky` in einem
       rollenden Kasten klebt ohnehin am falschen Rand.

       WARUM NICHT `--shell-top`/`--shell-bot` wie bei den Nav-Seiten: die
       beiden Variablen entstehen im `body.has-sidebar`-Block, und diesen
       Bildschirm gibt es dort nicht (er steht in `hideOn`, index-app.js).
       Ein `var(--shell-top, 16px)` haette hier immer den Ersatzwert
       genommen - eine Rechnung, die so tut, als haenge sie an etwas.

       ERST AB 1080 px, also genau dort, wo es ueberhaupt zwei Spalten gibt.
       Am Telefon bleibt die Seite eine rollende Spalte: eine feste Hoehe
       waere dort zwei Rollbereiche uebereinander. */
    body[data-screen="editor"] .wrap{
      height:var(--vh100);
      max-height:var(--vh100);
      padding-top:16px; padding-bottom:max(8px,env(safe-area-inset-bottom));
      overflow:hidden; display:flex; flex-direction:column;}
    body[data-screen="editor"] .wrap > #screen-editor{
      flex:1 1 auto; min-height:0; display:flex; flex-direction:column;}
    /* ===== DIE WEISSE KARTE FAELLT WEG (v2.560.7) =====================
       Anweisung Murat 30.08.2026: „O beyaz sayfayı iptal edip bütün
       içeriği ben arka sayfaya yaymak istiyorum … küçücük bir kutuya
       hapsolmuş şekilde duruyor."

       Er hat recht, und es ist keine Geschmacksfrage: Dieser Bildschirm
       stellt ein FORMULAR neben ein A4-BLATT. Jede Handbreit, die der
       Rahmen frisst, geht von der Blattvorschau ab - und die ist der
       einzige Grund, warum der Bildschirm „Vorschau & Bearbeiten" heisst.
       Der Rahmen kostete beidseitig 22 px Innenabstand plus Rand, dazu
       eine Erhebung, die nichts gruppiert: was drinnen liegt, trägt seine
       eigenen Kaesten (Infotext-Block, Fragenzeilen, Blattvorschau).
       Zwei Erhebungen uebereinander sind eine zu viel (DESIGN_SYSTEM.md).

       NUR AB 1080 px - also genau dort, wo es zwei Spalten gibt. Am
       Telefon ist die Karte die einzige Flaeche, die den Inhalt vom
       Hintergrund trennt, und dort war nichts kaputt. Das ist dieselbe
       Regel wie in CLAUDE.md, nur andersherum gelesen: breit aendern
       heisst BREIT aendern. */
    body[data-screen="editor"] .wrap{max-width:1760px;}
    body[data-screen="editor"] #screen-editor > .card{
      flex:1 1 auto; min-height:0; margin:0;
      background:transparent; border:0; box-shadow:none;
      padding:0; border-radius:0;
      display:flex; flex-direction:column; overflow:hidden;}
    body[data-screen="editor"] .ed-buehne{
      flex:1 1 auto; min-height:0; align-items:stretch;}
    /* Beide Spalten rollen intern und OHNE sichtbaren Balken - wie ueberall
       in dieser Anwendung; zwei Balken nebeneinander sahen nach Fehler aus. */
    body[data-screen="editor"] .ed-sp-links,
    body[data-screen="editor"] .ed-sp-rechts{
      min-height:0; overflow-y:auto; scrollbar-width:none;
      overscroll-behavior-y:contain;}
    body[data-screen="editor"] .ed-sp-links::-webkit-scrollbar,
    body[data-screen="editor"] .ed-sp-rechts::-webkit-scrollbar{display:none;}
    body[data-screen="editor"] .ed-sp-links{padding-right:6px;}
    /* ===== DIE VORSCHAU FUELLT IHRE SPALTE (v2.564.0) =================
       Befund Murat 30.08.2026: „sagdaki kisimda pdf in oturdugu box var
       ya oranin tamamina otursun pdf" - und: „Gross ansehen yok cünki
       teee asagilarda".

       Beides ist dieselbe Ursache. Die rechte Spalte rollte als Ganzes,
       das Blatt sass als Kasten IN ihr, und der Knopf darunter rutschte
       aus dem Bild. Jetzt ist die Spalte eine Saeule: Kopf (Vorlage,
       Farbe) und Fuss (Gross ansehen) STEHEN, und nur das Blatt in der
       Mitte rollt. Damit ist der Rahmen immer sichtbar und das Blatt
       nutzt jeden Pixel, der uebrig ist. */
    body[data-screen="editor"] .ed-sp-rechts{position:static;top:auto;
      display:flex;flex-direction:column;overflow:hidden;}
    /* NUR DAS BLATT ROLLT - NICHT DIE GANZE SPALTE (v2.566.2).
       v2.564.0 hat `.ed-vorschau` als Ganzes rollen lassen. Damit rollte
       auch der Knopf "Gross ansehen" mit nach unten aus dem Bild - genau
       der Befund, der behoben werden sollte. Er liegt naemlich INNERHALB
       dieses Kastens, nicht daneben (edVorschauZeichnen baut Kopf, Rahmen
       und Knopf in denselben Wirt).

       Also eine Saeule: `.ed-vorschau` ist der Behaelter, Kopf und Knopf
       STEHEN, und `.ed-vor-rahmen` in der Mitte rollt. Damit ist der
       Rahmen immer sichtbar und das Blatt nutzt jeden Pixel dazwischen. */
    body[data-screen="editor"] .ed-sp-rechts > .ed-vorschau{
      flex:1 1 auto;min-height:0;display:flex;flex-direction:column;
      overflow:hidden;}
    body[data-screen="editor"] .ed-vorschau > .ed-vor-rahmen{
      flex:1 1 auto;min-height:0;overflow:auto;
      scrollbar-width:none;-ms-overflow-style:none;}
    body[data-screen="editor"] .ed-vorschau > .ed-vor-rahmen::-webkit-scrollbar{
      display:none;}
    /* Kopf, Designwahl und Knopf sind die festen Enden der Saeule. */
    body[data-screen="editor"] .ed-vorschau > .ed-vor-kopf,
    body[data-screen="editor"] .ed-vorschau > .ed-vor-lupe,
    body[data-screen="editor"] .ed-vorschau > .ed-dz{flex:none;}
    body[data-screen="editor"] .ed-griff{
      position:relative;top:auto;height:auto;min-height:0;}
    /* Der Veroeffentlichen-Knopf steht damit IMMER unten im Bild und nicht
       mehr am Ende einer langen Liste - er ist der Ausgang dieses
       Bildschirms, und ein Ausgang, den man suchen muss, ist keiner. */
    body[data-screen="editor"] .ed-actions{flex:none;display:flex;flex-wrap:wrap;}

    /* ===== DIE ABSCHLUSSKNOEPFE RUECKEN IN DIE KOPFZEILE ================
       WUNSCH MURAT 30.08.2026 (PLAN_EDITOR_BEDIENUNG.md §3.2): „yerden
       kazanmamiz sart burada … dikeyde kullanalim bosluklari yataydada
       aslinda."

       Die zwei Knoepfe standen unter der Buehne und kosteten dort rund
       80 px Hoehe - Hoehe, die dem Blatt und der Fragenliste fehlte,
       obwohl NEBEN der Ueberschrift „Vorschau & Bearbeiten" eine halbe
       Bildschirmbreite leer stand. Der Platz war also da, nur in der
       falschen Richtung.

       DER DOM BLEIBT, WIE ER IST - die Knoepfe stehen weiter als LETZTES
       im Markup. Verschoben wird nur die Darstellung, und zwar mit einem
       Raster auf der Karte: Kopfzeile links oben, Aktionen rechts oben,
       Buehne ueber beide Spalten darunter. Das ist die einzige Bauform, in
       der die schmale Fassung UNANGETASTET bleibt (CLAUDE.md, Mobil:
       „schmal aendern heisst SCHMAL aendern" - hier umgekehrt). Unter
       1080 px gibt es dieses Raster nicht, dort stehen die Knoepfe genau
       wie bisher unten.

       `minmax(0,1fr)` in der zweiten Zeile ist die Zeile, die den
       gewonnenen Platz auch wirklich weitergibt: ohne sie behielte die
       Buehne ihre Inhaltshoehe und der Gewinn waere Leerraum. */
    body[data-screen="editor"] #screen-editor > .card{
      display:grid; grid-template-columns:minmax(0,1fr) auto;
      grid-template-rows:auto minmax(0,1fr);}
    body[data-screen="editor"] #screen-editor > .card > .ed-kopf{
      grid-column:1; grid-row:1;}
    /* `min-height:0` UND `align-self:stretch`: ohne das erste waechst die
       Buehne ueber die Zeile hinaus (die Fragenliste ist beliebig lang),
       ohne das zweite bliebe sie auf ihrer Inhaltshoehe stehen - und der
       gewonnene Platz waere Leere statt Blatt. */
    body[data-screen="editor"] #screen-editor > .card > .ed-buehne{
      grid-column:1 / -1; grid-row:2; align-self:stretch; min-height:0;}
    body[data-screen="editor"] #screen-editor > .card > .ed-actions{
      grid-column:2; grid-row:1; align-self:center;
      margin:0 0 18px; padding-top:0; border-top:0;
      flex-wrap:nowrap; max-width:min(52vw,620px);}
    /* In einer Kopfzeile ist der grosse Aufruf zu gross. Kleiner, aber
       nicht anders: Farbe, Verlauf und Bewegung bleiben - er soll weiter
       der eine Knopf sein, den man findet. */
    body[data-screen="editor"] .ed-actions > .ed-publish-hero{
      flex:0 1 auto; padding:11px 16px; font-size:var(--fs-sm);
      border-radius:12px; gap:8px;}
    body[data-screen="editor"] .ed-actions > #ed-eb-anschluss{
      flex:0 1 auto;}
  }

  .ed-actions{margin-top:22px;padding-top:18px;border-top:1px solid var(--line);
    display:flex;flex-wrap:wrap;align-items:stretch;gap:11px;}
  .ed-actions > .ed-publish-hero{flex:1 1 340px;width:auto;}
  .ed-actions > #ed-eb-anschluss{flex:0 1 300px;display:flex;}
  .ed-actions > #ed-eb-anschluss:empty{display:none;}
  .ed-actions > #ed-eb-anschluss .btn{margin:0;width:100%;}
  @media (max-width:720px){
    .ed-actions{flex-direction:column;}
    .ed-actions > .ed-publish-hero,
    .ed-actions > #ed-eb-anschluss{flex:1 1 auto;width:100%;}
  }
  /* Lebendiger Haupt-CTA zum Veröffentlichen */
  .ed-publish-hero{position:relative;overflow:hidden;display:flex;align-items:center;justify-content:center;gap:11px;
    width:100%;border:none;cursor:pointer;font-family:inherit;font-weight:800;font-size:var(--fs-base);color:#fff;
    padding:17px 22px;border-radius:16px;letter-spacing:.01em;
    background:linear-gradient(120deg,#2E5BFF,#5B4BE8 45%,#7A5AF8 70%,#15A05A);background-size:200% 100%;
    box-shadow:0 12px 30px rgba(46,91,255,.34),0 2px 6px rgba(46,91,255,.2);
    animation:ephFlow 6s ease infinite;transition:transform .12s ease,box-shadow .2s ease;}
  .ed-publish-hero:hover{transform:translateY(-2px);box-shadow:0 18px 40px rgba(46,91,255,.42),0 3px 8px rgba(46,91,255,.24);}
  .ed-publish-hero:active{transform:translateY(0) scale(.99);}
  .ed-publish-hero:disabled{opacity:.65;cursor:default;animation:none;transform:none;}
  @keyframes ephFlow{0%,100%{background-position:0% 50%;}50%{background-position:100% 50%;}}
  .ed-publish-hero .eph-ico{width:22px;height:22px;flex:none;fill:none;stroke:#fff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;}
  .ed-publish-hero .eph-arr{width:20px;height:20px;flex:none;fill:none;stroke:#fff;stroke-width:2.4;stroke-linecap:round;stroke-linejoin:round;transition:transform .2s ease;}
  .ed-publish-hero:hover .eph-arr{transform:translateX(4px);}
  .ed-publish-hero .eph-txt{white-space:nowrap;}
  /* Glanz-Streifen, der langsam über den Button wandert */
  .ed-publish-hero .eph-shine{position:absolute;top:0;left:-40%;width:32%;height:100%;pointer-events:none;
    background:linear-gradient(100deg,transparent,rgba(255,255,255,.34),transparent);transform:skewX(-18deg);
    animation:ephShine 3.4s ease-in-out infinite;}
  @keyframes ephShine{0%{left:-45%;}55%{left:130%;}100%{left:130%;}}
  @media (max-width:430px){ .ed-publish-hero{font-size:15px;padding:16px 16px;gap:9px;} .ed-publish-hero .eph-txt{white-space:normal;} }
  @media (prefers-reduced-motion: reduce){ .ed-publish-hero,.ed-publish-hero .eph-shine{animation:none;} }
  .bic{width:18px;height:18px;flex-shrink:0;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;vertical-align:-3px;margin-right:8px;}
  .btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;}
  /* EIN SYMBOL IN EINEM `.btn` BRAUCHT EIN MASS - sonst ist es 300 x 150 px.
     Ein <svg> mit viewBox und ohne Breite/Hoehe hat keine eigene Groesse;
     der Browser nimmt dann seine Ersatzmasse. In einem Knopf mit voller
     Breite wird daraus ein handflaechengrosser Klotz.

     DAS IST DER DRITTE FUND DESSELBEN FEHLERS: `.eb-akt .btn svg` (Stift im
     Erklaerblatt), `.eb-lb-akt .btn svg` - und am 29.08.2026 meldete Murat
     den naechsten: „kocaman Erklärblatt dazu erstellen … berbat bi durum",
     ein blaues Rechteck ueber die halbe Seite unter dem Veroeffentlichen-
     Knopf (`#ed-eb-anschluss`). Dreimal derselbe Fehler an drei Stellen
     heisst: die Stelle war nie das Problem, die fehlende Grundregel war es.

     `:where()` ZAEHLT NICHT ZUR SPEZIFITAET - diese Regel wiegt so viel wie
     `.btn` allein. Jede vorhandene Regel (`.eb-akt .btn svg`,
     `.dash-new-btn svg`, die Knoepfe der Werkzeugleiste) gewinnt weiterhin.
     Es ist ein Auffangnetz, kein Eingriff: sie aendert nur dort etwas, wo
     bisher GAR nichts stand - und dort stand ein Klotz. */
  .btn :where(svg){width:17px;height:17px;flex:none;fill:none;
    stroke:currentColor;stroke-width:2.2;stroke-linecap:round;
    stroke-linejoin:round;}
  .field{margin-bottom:16px;}
  /* PLANUNGSFORMULARE (Entwurf/Reihe), v2.325.0. Drei Bausteine statt sieben
     inline-Angaben - die Schulform-, Niveau- und Ganztag-Felder wiederholen
     sich in beiden Formularen, und der Hinweis darunter ein drittes Mal in
     der Klassenarbeit. Als Klasse steht die Angabe EINMAL da (DESIGN_SYSTEM
     §2: Bausteine bekommen eine Klasse, keinen eigenen style). */
  .plan-wahl{width:100%;}
  .plan-hint{font-size:12px;color:var(--muted);line-height:1.45;}
  .plan-haken{width:18px;height:18px;accent-color:var(--brand);}
  .plan-haken-zeile{display:flex;align-items:center;gap:9px;cursor:pointer;}
  .note{font-size:13px;background:var(--brand-soft);color:var(--brand-dk);padding:11px 13px;border-radius:11px;margin-top:14px;}
  .err{font-size:13.5px;background:var(--bad-soft);color:#B0271D;padding:11px 13px;border-radius:11px;margin-top:14px;}
  .hidden{display:none!important;} .center{text-align:center;}
  /* Anti-Flackern beim Laden/Refresh: Bevor das JS entscheidet, welcher Screen
     gezeigt wird, ist KEIN Screen sichtbar (sonst blitzt kurz der Upload-Screen
     auf). go() setzt danach .app-booted und zeigt den richtigen Screen. */
  body:not(.app-booted) section[id^="screen-"]{ display:none !important; }
  .badge{display:inline-block;font-size:12px;font-weight:700;padding:4px 10px;border-radius:99px;background:var(--brand-soft);color:var(--brand-dk);margin-bottom:10px;}
  .seg{display:flex;border:1.5px solid var(--line);border-radius:12px;overflow:hidden;}
  .seg button{flex:1;padding:12px 6px;border:none;background:#fff;font-family:inherit;font-weight:700;font-size:13px;cursor:pointer;color:var(--muted);white-space:nowrap;}
  .seg button.on{background:var(--brand);color:#fff;}
  .seg-wrap{flex-wrap:wrap;gap:5px;border:none;}
  /* FIX 2026-07 (Rueckmeldung Murat): vorher stand hier flex:1 1 0 + min-width:0.
     Damit bekam JEDER Knopf dieselbe Breite, unabhaengig vom Text – bei
     #seg-schulform wurde "Hauptschule"/"Gesamtschule"/"Gymnasium" deshalb
     abgeschnitten ("Hauptschul", "Gymnasiun"), weil .seg button zusaetzlich
     white-space:nowrap setzt. Jetzt: flex-basis:auto (Startbreite = Textbreite)
     und white-space:normal, und min-width:0 ist ABSICHTLICH weg. Dadurch gilt
     wieder die automatische Mindestbreite min-width:auto = min-content, also
     die Breite des laengsten Wortes – der Knopf kann gar nicht mehr unter
     "Gesamtschule" schrumpfen, die Zeile bricht stattdessen um. */
  .seg-wrap button{flex:1 1 auto;white-space:normal;border:1.5px solid var(--line);border-radius:9px;padding:10px 12px;font-size:13px;line-height:1.25;}
  .seg-wrap button.on{border-color:var(--brand);}
  @media(max-width:520px){ .seg-wrap{gap:4px;} .seg-wrap button{padding:9px 10px;font-size:12px;} }
  .grid2{display:grid;grid-template-columns:1fr 1fr;gap:12px;}
  @media(max-width:520px){ .grid2{grid-template-columns:1fr;} }
  /* ===== Unterrichtsplanung: moderne Seiten-Navigation (Topbar, Verlauf, Papierkorb) ===== */
  /* padding-top: Platz für das kleine Zähler-Badge oben am Icon (sonst schneidet
     der scrollende Panel-Rand die Zahl oben ab). */
  .pl-topbar{display:flex;align-items:center;justify-content:space-between;gap:10px;min-height:34px;padding-top:8px;}
  .pl-topbar .back-link{margin:0;cursor:pointer;}
  /* Kopfzeile und Kontingent-Platz der drei Planungsseiten (Fahrplan,
     Entwurf, Reihe). Vorher stand beides dreimal als inline-style in
     index.html - dieselbe Angabe an drei Stellen, die auseinander
     laufen koennen (DESIGN_SYSTEM §2). */
  .pl-screen-h2{margin:8px 0 16px;}
  .pl-quota{margin-bottom:14px;}
  /* Aktionen (Verlauf/Papierkorb) IMMER rechts – auch wenn der Zurück-Pfeil
     ausgeblendet ist (Haupt-Editor). */
  .pl-actions{display:flex;gap:6px;flex:none;margin-left:auto;}
  .pl-iconbtn{position:relative;display:inline-flex;align-items:center;justify-content:center;width:36px;height:36px;border:1px solid var(--line);border-radius:11px;background:var(--card);color:var(--muted);cursor:pointer;transition:border-color .15s,color .15s;padding:0;}
  .pl-iconbtn:hover{border-color:var(--brand);color:var(--brand);}
  .pl-iconbtn-danger{color:#D64545;}
  .pl-iconbtn-danger:hover{border-color:#D64545;color:#D64545;background:#D6454510;}
  .pl-count{position:absolute;top:-5px;right:-5px;min-width:16px;height:16px;line-height:16px;font-size:10px;font-weight:700;color:#fff;background:var(--brand);border-radius:999px;padding:0 4px;text-align:center;}
  .pl-navcard{display:flex;align-items:center;gap:12px;border:1px solid var(--line);border-radius:16px;padding:14px 16px;cursor:pointer;background:var(--card);transition:border-color .15s,box-shadow .15s,transform .15s;}
  .pl-navcard:hover{border-color:var(--brand);box-shadow:0 4px 14px rgba(0,0,0,.06);transform:translateY(-1px);}
  .pl-navcard-ico{display:inline-flex;align-items:center;justify-content:center;width:38px;height:38px;border-radius:11px;background:var(--brand-soft);color:var(--brand);flex:none;}
  .pl-sec{margin-top:24px;}
  .pl-sec:first-of-type{margin-top:0;}
  .pl-sec-title{font-size:15.5px;font-weight:800;margin:0 0 3px;}
  .pl-sec-sub{font-size:12.5px;color:var(--muted);margin:0 0 12px;line-height:1.4;}
  .pl-steps{display:grid;grid-template-columns:1fr;gap:8px;position:relative;}
  .pl-step{display:flex;align-items:center;gap:12px;border:1px solid var(--line);border-radius:16px;padding:13px 15px;cursor:pointer;background:var(--card);transition:border-color .15s,box-shadow .15s,transform .15s;}
  .pl-step:hover{border-color:var(--brand);box-shadow:0 4px 14px rgba(0,0,0,.06);transform:translateY(-1px);}
  .pl-step-num{display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;border-radius:999px;background:var(--brand-soft);color:var(--brand);font-size:12.5px;font-weight:800;flex:none;}
  .pl-step-ico{display:inline-flex;color:var(--brand);flex:none;}
  @media(max-width:560px){ .pl-step-ico{display:none;} }
  .pl-item{display:flex;align-items:center;gap:12px;border:1px solid var(--line);border-radius:13px;padding:12px 14px;margin-bottom:9px;background:var(--card);transition:border-color .15s;}
  .pl-item:hover{border-color:var(--brand);}
  .pl-item-main{min-width:0;flex:1;cursor:pointer;}
  .pl-item-title{font-weight:650;font-size:13.5px;line-height:1.35;word-break:break-word;}
  .pl-item-meta{font-size:11px;color:var(--muted);margin-top:3px;}
  .pl-item-btn{flex:none;display:inline-flex;align-items:center;gap:5px;font-size:12px;font-weight:600;background:none;border:1px solid var(--line);border-radius:9px;padding:7px 10px;color:var(--muted);cursor:pointer;transition:border-color .15s,color .15s;}
  .pl-item-btn:hover{border-color:var(--brand);color:var(--brand);}
  .pl-item-btn.danger:hover{border-color:#D64545;color:#D64545;}
  /* ===== Karten statt Zeilen (2.329.9) =====
     Wunsch Murat 18.08.2026: "kartlar seklinde yap ... satiri kaplamasin
     yani her satirda 2 ser 3 er kart olsun". auto-fill mit einer Mindest-
     breite loest das ohne Bruchpunkte: am Rechner drei, auf dem Tablet zwei,
     auf dem Handy eine Spalte - ohne eine einzige Media-Regel.
     SEIT v2.956.0 TRAEGT DIE KARTE DIE FARBE DER OBERFLAECHE (Murat
     05.10.2026: „şu sayfa thema renginden beslenmiyor"): Streifen und
     Fachname in --brand. Das Fach (--fach-farbe, gesetzt am Element) bleibt
     als kleiner Punkt vor seinem Namen - Mathematik und Physik bleiben
     unterscheidbar (Wunsch 18.08.2026), ohne der Seite eine zweite Farbe zu
     geben. */
  .pl-cards{display:grid;grid-template-columns:repeat(auto-fill,minmax(230px,1fr));gap:12px;margin-bottom:8px;}
  .pl-card{position:relative;display:flex;flex-direction:column;gap:5px;border:1px solid var(--line);border-radius:14px;padding:14px 14px 12px;background:var(--card);cursor:pointer;transition:border-color .15s,box-shadow .15s;overflow:hidden;}
  .pl-card:hover{border-color:var(--brand);box-shadow:0 2px 10px rgba(20,28,42,.06);}
  .pl-card::before{content:"";position:absolute;left:0;right:0;top:0;height:3px;background:var(--brand);}
  .pl-card-fach{display:inline-flex;align-items:center;gap:6px;font-size:11px;font-weight:750;letter-spacing:.02em;color:var(--brand);}
  .pl-card-fach::before{content:"";flex:none;width:7px;height:7px;border-radius:50%;background:var(--fach-farbe,var(--brand));}
  .pl-card-title{font-weight:650;font-size:13.5px;line-height:1.35;word-break:break-word;}
  .pl-card-info{font-size:11.5px;color:var(--muted);}
  .pl-card-datum{font-size:11px;color:var(--muted);margin-top:auto;padding-top:6px;}
  .pl-card-x{position:absolute;top:9px;right:9px;display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;border:none;background:none;border-radius:8px;color:var(--muted);cursor:pointer;opacity:0;transition:opacity .15s,color .15s,background .15s;}
  .pl-card:hover .pl-card-x{opacity:1;}
  .pl-card-x:hover{background:var(--line);color:var(--bad);}
  /* Die Neu-Karte: gestrichelt, damit sie als Platzhalter lesbar ist. */
  .pl-card.neu{align-items:center;justify-content:center;text-align:center;border-style:dashed;color:var(--brand);font-weight:700;font-size:13.5px;min-height:104px;gap:7px;}
  .pl-card.neu::before{display:none;}
  /* Das Formular als Fenster ueber der Liste. */
  .pl-fenster .modal-card{max-width:720px;width:100%;max-height:86vh;overflow:auto;padding:18px;}
  @media (max-width:640px){
    .pl-cards{grid-template-columns:1fr;}
  }
  .pl-section-label{font-size:12px;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:var(--muted);margin-bottom:10px;}
  /* ===== Phasen-Formular: kompakt & horizontal (Apple-Ruhe, alles auf einen Blick) ===== */
  .ph-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:10px;margin-bottom:14px;}
  .ph-field label{display:block;font-size:11.5px;font-weight:650;letter-spacing:.01em;color:var(--muted);margin-bottom:5px;}
  .ph-in{width:100%;box-sizing:border-box;padding:9px 12px;border:1px solid var(--line);border-radius:10px;background:var(--card);color:var(--ink);font-size:13.5px;transition:border-color .15s,box-shadow .15s;}
  .ph-in:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 3px var(--brand-soft);}
  .ph-field.ph-wide{grid-column:1 / -1;}
  .ph-sec-label{display:block;font-size:11.5px;font-weight:650;letter-spacing:.01em;color:var(--muted);margin:2px 0 7px;}
  .ph-methods{display:grid;grid-template-columns:repeat(auto-fill,minmax(330px,1fr));gap:6px;}
  .ph-m{display:flex;align-items:center;gap:9px;min-width:0;border:1px solid var(--line);border-radius:10px;padding:8px 12px;cursor:pointer;background:var(--card);transition:border-color .13s,background .13s;}
  .ph-m:hover{border-color:var(--brand);}
  .ph-m-t{flex:none;font-weight:650;font-size:12.5px;color:var(--ink);white-space:nowrap;}
  .ph-m-d{flex:1;min-width:0;font-size:11.5px;color:var(--muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
  .ph-m-chk{flex:none;display:inline-flex;align-items:center;justify-content:center;width:16px;height:16px;border:1.5px solid var(--line);border-radius:999px;color:transparent;transition:all .13s;}
  .ph-m-chk svg{width:10px;height:10px;}
  .ph-m.on{border-color:var(--brand);background:var(--brand-soft);}
  .ph-m.on .ph-m-chk{border-color:var(--brand);background:var(--brand);color:#fff;}
  .ph-ctxbar{display:flex;align-items:center;gap:8px;border:1px dashed var(--line);border-radius:10px;padding:7px 10px;margin-bottom:12px;}
  .ph-ctxbar svg{flex:none;color:var(--brand);}
  .ph-ctxbar select{flex:1;min-width:0;padding:7px 10px;border:1px solid var(--line);border-radius:9px;background:var(--card);color:var(--ink);font-size:12.5px;}
  .ph-ctxbar button{flex:none;font-size:12px;font-weight:600;color:var(--brand);background:none;border:1px solid var(--brand);border-radius:9px;padding:7px 12px;cursor:pointer;transition:background .13s,color .13s;}
  .ph-ctxbar button:hover{background:var(--brand);color:#fff;}
  @media(max-width:560px){
    .pl-two-col{grid-template-columns:1fr !important;}
    #phase-methoden{grid-template-columns:1fr !important;}
    .ph-m-t{white-space:normal;}
    .pl-item{flex-wrap:wrap;}
    .pl-item-btn{padding:8px 12px;}
  }
  /* Unterrichtsentwurf als Tabelle (wie die schriftliche Planung) */
  .ent-doc-title{font-weight:800;font-size:16px;margin:6px 0 8px;}
  .ent-table{width:100%;border-collapse:collapse;font-size:12.5px;}
  .ent-table th,.ent-table td{border:1px solid var(--line);padding:6px 8px;vertical-align:top;text-align:left;}
  .ent-kopf th{width:34%;background:var(--paper);font-weight:700;color:var(--ink);}
  .ent-kopf-in{width:100%;border:none;background:transparent;font:inherit;color:var(--ink);padding:2px 0;outline:none;}
  .ent-kopf-in::placeholder{color:#bbb;}
  .ent-kopf-ta{width:100%;border:none;background:transparent;font:inherit;color:var(--ink);resize:vertical;outline:none;}
  .ent-verlauf-tbl th{background:var(--paper);font-weight:700;font-size:11.5px;}
  .ent-verlauf-tbl td{padding:0;}
  .ent-cell{min-height:34px;padding:6px 8px;font-size:12px;line-height:1.4;outline:none;white-space:pre-wrap;}
  .ent-cell:focus{background:transparent;}
  .ent-verlauf-tbl{min-width:760px;}
  /* Fach-Akkordeon (Unterrichtsfächer + Börse) */
  .fach-acc{border:1.5px solid var(--line);border-radius:14px;margin-bottom:10px;overflow:hidden;}
  /* Im Aufgaben-Dashboard darf das Kebab-Menü über den Rand hinausragen */
  .fach-acc.has-actions{overflow:visible;}
  .fach-acc.has-actions .fach-acc-head{border-radius:14px;}
  /* Börse-Admin: kleine Aktions-Icons oben rechts auf der Karte */
  .quiz-card{position:relative;}
  .boerse-admin-row{position:absolute;top:8px;right:8px;display:flex;gap:5px;z-index:2;}
  .boerse-admin-row .icon-act{width:28px;height:28px;background:rgba(255,255,255,.92);}
  .boerse-admin-row .icon-act svg{width:14px;height:14px;}
  .folder-edit-btn{appearance:none;border:1px solid var(--line);background:var(--card);color:var(--muted);width:26px;height:26px;border-radius:8px;cursor:pointer;font-size:13px;line-height:1;display:flex;align-items:center;justify-content:center;}
  .folder-edit-btn:hover{border-color:var(--brand);color:var(--brand);}
  .fach-acc-head{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:13px 14px;cursor:pointer;user-select:none;}
  .fach-acc-head:hover{background:rgba(127,127,127,.04);}
  .fach-ico{width:40px;height:40px;border-radius:11px;flex:none;display:flex;align-items:center;justify-content:center;}
  .fach-ico svg{width:21px;height:21px;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;}
  .fach-name{font-weight:800;font-size:var(--fs-md);color:var(--ink);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
  .fach-sub{font-size:12px;color:var(--muted);font-weight:600;margin-top:1px;}
  .fach-arr{width:18px;height:18px;flex:none;fill:none;stroke:var(--muted);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;transition:transform .15s;}
  .fach-arr.open{transform:rotate(90deg);}
  .fach-acc-body{padding:0 14px 12px;border-top:1px solid var(--line);}
  /* ===== HORIZONTALE FACH-LEISTE (Aufgaben-Dashboard) ===== */
  .fachbar-wrap{position:relative;margin:14px 0 6px;}
  .fachbar{display:flex;flex-wrap:nowrap;align-items:center;gap:9px;overflow-x:auto;scroll-behavior:smooth;padding:2px 2px 8px;touch-action:pan-x;overscroll-behavior-x:contain;
           -ms-overflow-style:none;scrollbar-width:none;scroll-snap-type:x proximity;}
  .fachbar::-webkit-scrollbar{display:none;}
  .fachbar,.cockpit-recent,.nav-scroll{cursor:grab;}
  .fachbar.dragging-scroll,.cockpit-recent.dragging-scroll,.nav-scroll.dragging-scroll{cursor:grabbing;scroll-behavior:auto;}
  /* Sanfter Fade an den Raendern signalisiert „weiter scrollbar“ */
  .fachbar-wrap::before,.fachbar-wrap::after{content:"";position:absolute;top:0;bottom:8px;width:26px;
           pointer-events:none;z-index:3;transition:opacity .15s;}
  .fachbar-wrap::before{left:0;background:linear-gradient(90deg,var(--card),transparent);opacity:0;}
  .fachbar-wrap::after{right:0;background:linear-gradient(270deg,var(--card),transparent);opacity:0;}
  .fachbar-wrap.fade-l::before{opacity:1;}
  .fachbar-wrap.fade-r::after{opacity:1;}
  .fach-chip{appearance:none;flex:none;scroll-snap-align:start;display:inline-flex;align-items:center;gap:9px;
           padding:9px 14px;border:1.5px solid var(--line);background:var(--card);border-radius:13px;
           cursor:pointer;font-family:inherit;font-weight:700;font-size:14px;color:var(--ink);
           white-space:nowrap;transition:border-color .12s,background .12s,transform .08s,box-shadow .12s;}
  .fach-chip:hover{border-color:var(--brand);}
  .fach-chip:active{transform:scale(.97);}
  .fach-chip .fc-ico{width:26px;height:26px;border-radius:8px;flex:none;display:flex;align-items:center;justify-content:center;}
  .fach-chip .fc-ico svg{width:16px;height:16px;fill:none;stroke-width:2.1;stroke-linecap:round;stroke-linejoin:round;}
  .fach-chip .fc-count{font-size:11.5px;font-weight:800;padding:1px 8px;border-radius:99px;background:rgba(127,127,127,.12);color:var(--muted);}
  .fach-chip.active{color:#fff;border-color:transparent;box-shadow:0 4px 14px rgba(46,91,255,.18);}
  .fach-chip.active .fc-ico{background:rgba(255,255,255,.22)!important;}
  .fach-chip.active .fc-ico svg{stroke:#fff!important;}
  .fach-chip.active .fc-count{background:rgba(255,255,255,.25);color:#fff;}
  .fach-chip.dragging{opacity:.45;}
  .fach-chip.add-chip{border-style:dashed;color:var(--muted);font-weight:800;}
  .fach-chip.add-chip:hover{color:var(--brand);border-color:var(--brand);}
  .fach-chip.manage-chip{color:var(--muted);}
  .fach-chip.manage-chip svg{width:17px;height:17px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;}
  /* Fach-Verwaltungsliste (Reorder/Umbenennen/Ausblenden/Entfernen) */
  .fm-row{display:flex;align-items:center;gap:10px;padding:11px 12px;border:1.5px solid var(--line);border-radius:12px;margin-bottom:8px;background:var(--card);}
  .fm-row.dragging{opacity:.5;border-style:dashed;}
  .fm-grip{cursor:grab;color:var(--muted);flex:none;display:flex;}
  .fm-grip svg{width:18px;height:18px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;}
  /* Sortier-Pfeile (statt Drag) – garantiert touch-tauglich */
  .fm-move{flex:none;display:flex;flex-direction:column;gap:2px;}
  .fm-move button{appearance:none;border:1.5px solid var(--line);background:var(--card);color:var(--muted);
                  width:30px;height:22px;border-radius:7px;display:flex;align-items:center;justify-content:center;cursor:pointer;padding:0;}
  .fm-move button:hover:not(:disabled){border-color:var(--brand);color:var(--brand);}
  .fm-move button:active:not(:disabled){transform:scale(.93);}
  .fm-move button:disabled{opacity:.28;cursor:default;}
  .fm-move button svg{width:15px;height:15px;fill:none;stroke:currentColor;stroke-width:2.4;stroke-linecap:round;stroke-linejoin:round;}
  .fm-name{flex:1;font-weight:700;font-size:14px;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
  .fm-name.hidden-fach{color:var(--muted);text-decoration:line-through;}
  .fm-cnt{font-size:11.5px;font-weight:700;color:var(--muted);flex:none;}
  /* Kurs-Editor: feste 3er-Quadrat-Buttons, immer nebeneinander */
  .ke-add-row{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;margin-top:10px;}
  .ke-add-sq{appearance:none;border:1.5px solid var(--line);background:var(--card);border-radius:14px;cursor:pointer;
             min-height:86px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:5px;
             font-family:inherit;font-weight:800;font-size:12.5px;color:var(--ink);transition:transform .1s,box-shadow .12s,border-color .12s;padding:10px 6px;}
  .ke-add-sq:hover{transform:translateY(-2px);box-shadow:0 5px 14px rgba(0,0,0,.07);}
  .ke-add-sq:active{transform:scale(.96);}
  .ke-add-sq .ke-add-ic{font-size:21px;line-height:1;}
  .ke-add-sq .ke-add-lb{text-align:center;line-height:1.1;}
  /* Aufgabe-Untermenü: kleinere Kacheln, alle in Aufgabe-Blau */
  #ke-aufgabe-menu .ke-add-sq{min-height:62px;font-size:11.5px;border-radius:12px;padding:7px 5px;}
  #ke-aufgabe-menu .ke-add-sq .ke-add-ic{font-size:17px;}
  /* Hauptaktionen – je eine Farbe */
  .ke-add-aufgabe{border-color:#2E5BFF55;background:#2E5BFF14;color:#2E5BFF;}
  .ke-add-spiel{border-color:#16A05A55;background:#16A05A14;color:#0E7C44;}
  .ke-add-info{border-color:#E0962955;background:#E0962914;color:#9A6512;}
  /* Aufgabe-Untermenü – alle in Aufgabe-Blau (gehören zusammen) */
  .ke-sub-wählen,.ke-sub-ki,.ke-sub-selbst{border-color:#2E5BFF55;background:#2E5BFF14;color:#2E5BFF;}
  .drop{border:2px dashed #C8CFDE;border-radius:14px;padding:30px 18px;text-align:center;background:#FAFBFE;cursor:pointer;transition:.15s;}
  .drop.hot{border-color:var(--brand);background:var(--brand-soft);}
  /* Das Vorlage-Kaestchen unter dem Datei-Status (v2.690.0, F1). Es steht
     mittig unter der Ablageflaeche und erscheint erst, wenn Text eingelesen
     wurde - die Sichtbarkeit steuert `vorlageWahlZeigen()`, nicht das CSS. */
  #vorlage-wahl{margin:10px auto 0;max-width:340px;}
  /* Zwei gleichwertige Wege zur Datei (v2.690.1): waehlen oder scannen.
     Vorher stand hier das rohe <input type="file"> und darunter, durch ein
     "— oder —" getrennt, ein richtiger Knopf - zwei Erscheinungsbilder fuer
     dieselbe Handlung. */
  .drop-knoepfe{display:flex;gap:10px;justify-content:center;flex-wrap:wrap;margin-top:14px;}
  .drop-knoepfe .btn{margin:0;width:auto;display:inline-flex;align-items:center;gap:8px;}
  /* Der Rueckweg zum Textfeld - eine Zeile, kein Kasten. Er steht unter dem
     jeweiligen Reiter und traegt keine eigene Flaeche, damit er nicht mit den
     beiden Knoepfen darueber um Aufmerksamkeit streitet. */
  .mat-zurueck{display:block;margin:10px auto 2px;border:0;background:transparent;
    color:var(--muted);font:inherit;font-size:12.5px;text-decoration:underline;
    text-underline-offset:3px;cursor:pointer;padding:4px 8px;border-radius:8px;}
  .mat-zurueck:hover{color:var(--brand);}
  .spinner{width:34px;height:34px;border:3.5px solid var(--brand-soft);border-top-color:var(--brand);border-radius:50%;animation:spin .8s linear infinite;margin:6px auto 14px;}
  /* ===== WARTEN = DAS REIGEN-LOGO (v2.737.2) ================================
     Hier stand `.ld-dots`, die Reihe aus sieben bunten Punkten mit Welle.
     Ansage Murat 15.09.2026: „sil onu en bastakini koy heryere" - wo
     gewartet wird, laeuft jetzt die Animation vom Start. Die Kopien setzt
     ssLaderEinsetzen() (index-app.js); Groesse und Bewegung bringt das Logo
     selbst mit (.ssp-logo im Template), hier stehen nur Platz und die kleine
     Fassung fuer Karten. Wer die Punkte zurueckholt, liest vorher die Ansage. */
  .ss-lader{display:flex;justify-content:center;align-items:center;margin:10px auto 16px;}
  .ss-lader-klein .ssp-logo{width:min(56vw,200px);}
  /* Das Logo-Stylesheet haelt nach dem Start ALLE .ssp-logo-Animationen an
     (body.app-booted … paused) - gedacht fuer das versteckte Startbild. Die
     Wartestellen laufen erst danach; diese Regel ist staerker (0,4,1 gegen
     0,3,1) und laesst sie laufen. Reduzierte Bewegung gewinnt trotzdem: dort
     steht im Logo `animation:none!important`. */
  body.app-booted .ssp-logo.ssp-lader .ssp-part{animation-play-state:running;}
  /* Globaler dünner Fortschrittsbalken oben (app-like Navigations-Cue). */
  #top-progress{position:fixed;top:0;left:0;height:3px;width:0;z-index:100000;
    background:linear-gradient(90deg,#2E5BFF,#7C5CFF,#15A05A);
    box-shadow:0 0 8px rgba(46,91,255,.5);opacity:0;transition:width .2s ease,opacity .3s ease;pointer-events:none;}
  #top-progress.on{opacity:1;}
  .load-steps{max-width:340px;margin:18px auto 0;text-align:left;display:flex;flex-direction:column;gap:11px;}
  .load-step{display:flex;align-items:center;gap:11px;font-size:var(--fs-md);color:var(--muted);transition:color .25s;}
  .load-step .ls-ico{flex:none;width:24px;height:24px;border-radius:50%;border:2px solid var(--line);display:flex;align-items:center;justify-content:center;font-size:13px;transition:all .25s;}
  .load-step.active{color:var(--ink);font-weight:700;}
  .load-step.active .ls-ico{border-color:var(--brand);color:var(--brand);}
  .load-step.done{color:var(--ink);}
  .load-step.done .ls-ico{background:var(--ok);border-color:var(--ok);color:#fff;}
  .load-step.active .ls-ico .ls-dot{width:8px;height:8px;border-radius:50%;background:var(--brand);animation:pulse 1s ease-in-out infinite;}
  @keyframes pulse{0%,100%{opacity:1;transform:scale(1);}50%{opacity:.4;transform:scale(.7);}}
  .load-reassure{margin-top:18px;font-size:13px;color:var(--muted);}
  @keyframes spin{to{transform:rotate(360deg);}}
  .progressbar{height:8px;background:var(--line);border-radius:99px;overflow:hidden;margin-bottom:8px;}
  .progressbar i{display:block;height:100%;background:var(--brand);border-radius:99px;transition:width .3s ease;}
  .qmeta{display:flex;justify-content:space-between;font-size:12.5px;color:var(--muted);font-weight:600;margin-bottom:18px;}
  /* Quiz-Kopfleiste: Fragenzähler-Pill, Sterne, Timer, Score */
  /* Aussen: Inhalt | ✕. Innen bricht um, das ✕ bleibt rechts (v2.856.0,
     Begruendung am Markup in templates/index.html). */
  .quiz-topbar{display:flex;align-items:center;gap:10px;margin-bottom:16px;}
  .quiz-topbar-inhalt{flex:1;min-width:0;display:flex;align-items:center;gap:8px;flex-wrap:wrap;}
  /* Das rote ✕: fett, ohne Rahmen, auf einem Hauch Rot. Die Flaeche kommt
     aus --bad mit Transparenz - so steht sie auf Weiss und in jedem
     Quiz-Design (Neon, Ozean …) gleich ruhig. */
  #qabort{flex:none;display:inline-flex;align-items:center;justify-content:center;
    width:38px;height:38px;padding:0;margin:0;border:0;border-radius:11px;cursor:pointer;
    background:color-mix(in srgb,var(--bad) 13%,transparent);color:var(--bad);
    transition:background .12s,transform .12s;}
  #qabort svg{width:21px;height:21px;fill:none;stroke:currentColor;stroke-width:3.2;
    stroke-linecap:round;stroke-linejoin:round;margin:0;}
  #qabort:hover{background:color-mix(in srgb,var(--bad) 24%,transparent);}
  #qabort:active{transform:scale(.94);}
  .quiz-top-spacer{flex:1;}
  /* Die Huelle um die Escape-Schalter (C15) zaehlt im normalen Quiz nicht mit;
     im Escape-Modus wird sie zur Gruppe (body.has-escape .esc-topgruppe). */
  .quiz-topbar .esc-topgruppe{display:contents;}
  .q-pill{display:inline-flex;align-items:center;font-size:13px;font-weight:800;color:#fff;
    background:linear-gradient(135deg,#2E5BFF,#5B4BE8);padding:5px 13px;border-radius:999px;letter-spacing:.02em;
    box-shadow:0 4px 12px rgba(46,91,255,.28);white-space:nowrap;}
  .q-score{font-size:12.5px;font-weight:700;color:var(--muted);white-space:nowrap;}
  .q-stars{display:inline-flex;align-items:center;gap:8px;font-size:22px;font-weight:900;color:#E6A700;line-height:1;
    background:var(--amber-soft);border:2px solid #F6D98A;padding:8px 16px 8px 13px;border-radius:999px;white-space:nowrap;transition:transform .12s;
    box-shadow:0 4px 14px rgba(245,166,35,.28);}
  html[data-theme="dark"] .q-stars, html:not([data-theme="light"]) .q-stars{background:#3A3320;border-color:#6b5a2a;}
  .q-stars .q-star-ico{width:26px;height:26px;fill:#F5A623;stroke:#E6A700;stroke-width:1;flex:none;transition:transform .2s;}
  .q-stars.pop{animation:qStarPop .5s cubic-bezier(.2,.9,.3,1.4);}
  .q-stars.pop .q-star-ico{animation:qStarSpin .6s ease;}
  @keyframes qStarPop{0%{transform:scale(1);}40%{transform:scale(1.28);}100%{transform:scale(1);}}
  @keyframes qStarSpin{0%{transform:rotate(0) scale(1);}50%{transform:rotate(20deg) scale(1.35);}100%{transform:rotate(0) scale(1);}}
  /* Fliegender Stern von der richtigen Antwort zur Sterne-Anzeige */
  .q-fly-star{position:fixed;z-index:1500;width:22px;height:22px;pointer-events:none;fill:#F5A623;stroke:#E6A700;stroke-width:1;
    filter:drop-shadow(0 2px 5px rgba(245,166,35,.6));transition:transform .7s cubic-bezier(.4,0,.2,1),opacity .7s ease;}
  @media (prefers-reduced-motion: reduce){ .q-stars.pop,.q-stars.pop .q-star-ico{animation:none;} .q-fly-star{transition:opacity .3s;} }
  .qtag{font-size:11px;font-weight:700;color:var(--brand-dk);background:var(--brand-soft);padding:3px 8px;border-radius:8px;display:inline-block;margin-bottom:12px;}
  /* Frage-Rahmen: eigene "Bühne" für die Frage, klar getrennt von den Antworten.
     Farbiger Akzentstreifen links, dezenter Hintergrund, viel Innenabstand. */
  .q-frame{position:relative;background:var(--paper);border:2px solid var(--line);border-radius:16px;
    padding:18px 20px 16px 22px;margin:6px 0 22px;overflow:hidden;}
  .q-frame::before{content:"";position:absolute;left:0;top:0;bottom:0;width:5px;
    background:linear-gradient(180deg,var(--brand),#5B4BE8);border-radius:0 4px 4px 0;}
  .qtext{font-size:20px;font-weight:700;letter-spacing:-.3px;margin:0;line-height:1.45;}
  /* Die zwei Handlungsknöpfe („Antwort prüfen" / „Weiter") als EIN Kasten.
     Hier steht nur der Abstand, den die beiden vorher als Inline-Stil
     trugen; das Kleben am unteren Rand kommt weiter unten und gilt nur für
     den freistehenden Quiz-Bildschirm - im Arbeitsplatz-Rahmen
     (`.student-embedded`) gibt es keine Fensterhöhe, an der etwas kleben
     könnte. */
  .quiz-tasten{margin-top:12px;}
  .opt{display:flex;align-items:center;gap:12px;width:100%;text-align:left;padding:16px 18px;border:2px solid var(--line);border-radius:13px;background:var(--card);font-family:inherit;font-size:16px;font-weight:600;color:var(--ink);cursor:pointer;margin-bottom:12px;transition:.12s;}
  .opt .k{width:26px;height:26px;border-radius:8px;background:var(--paper);display:grid;place-items:center;font-size:13px;font-weight:800;color:var(--muted);flex:none;border:1.5px solid var(--line);transition:.12s;}
  .opt:hover{border-color:var(--brand);}
  /* Ausgewählt: dicker Rahmen + kräftige Füllung + Buchstabe in Markenfarbe.
     Funktioniert in Light UND Dark gut sichtbar. */
  .opt.sel{border-color:var(--brand);border-width:2px;background:var(--brand-soft);background:color-mix(in srgb, var(--brand) 16%, var(--card));box-shadow:0 0 0 1.5px var(--brand) inset;}
  .opt.sel .k{background:var(--brand);color:#fff;border-color:var(--brand);}
  .opt{position:relative;}
  .opt.sel::after{content:"✓";margin-left:auto;color:var(--brand);font-weight:900;font-size:18px;flex:none;}
  .opt.correct::after{content:"✓";margin-left:auto;color:var(--ok);font-weight:900;font-size:18px;flex:none;}
  .opt.wrong::after{content:"✕";margin-left:auto;color:var(--bad);font-weight:900;font-size:18px;flex:none;}
  .opt.correct{border-color:var(--ok);border-width:2px;background:var(--ok-soft);background:color-mix(in srgb, var(--ok) 18%, var(--card));} .opt.correct .k{background:var(--ok);color:#fff;border-color:var(--ok);}
  .opt.wrong{border-color:var(--bad);border-width:2px;background:var(--bad-soft);background:color-mix(in srgb, var(--bad) 18%, var(--card));} .opt.wrong .k{background:var(--bad);color:#fff;border-color:var(--bad);}
  /* ===== QUIZ-DESIGNS (Schüler-Ansicht, von der Lehrkraft wählbar) ==========
     Wirken auf Quiz- UND Willkommens-Screen. Richtig/Falsch-Farben bleiben. */
  body.qt-neon{ --qbg:linear-gradient(160deg,#12061f,#1b0b3a 55%,#06122b); --qcard:#170b2e; --qink:#F2ECFF; --qmut:#B9A9E6; --qopt:#241247; --qbd:#8A5CFF; --qacc:#C6A2FF; --qglow:0 0 16px rgba(138,92,255,.45); }
  body.qt-ozean{ --qbg:linear-gradient(160deg,#062a44,#083a5e 55%,#0a4f6b); --qcard:#0b3550; --qink:#EAF7FF; --qmut:#A9D4E8; --qopt:#0f4767; --qbd:#38BDF8; --qacc:#7DD3FC; --qglow:0 0 16px rgba(56,189,248,.4); }
  body.qt-sonnenuntergang{ --qbg:linear-gradient(160deg,#3a0f2a,#6b1f3a 50%,#8a3b1f); --qcard:#4a1730; --qink:#FFF0EC; --qmut:#F3C6BE; --qopt:#66203f; --qbd:#FF7A59; --qacc:#FFB08A; --qglow:0 0 16px rgba(255,122,89,.4); }
  body.qt-wald{ --qbg:linear-gradient(160deg,#0c2a1a,#123b25 55%,#1c4a2a); --qcard:#0f3320; --qink:#EAFBEF; --qmut:#AEDDBE; --qopt:#154029; --qbd:#34D07A; --qacc:#86EFAC; --qglow:0 0 16px rgba(52,208,122,.38); }
  body.qt-candy{ --qbg:linear-gradient(160deg,#3a1146,#5e1a63 50%,#7a1f52); --qcard:#4a1554; --qink:#FFEFFB; --qmut:#F1C2E8; --qopt:#661f6e; --qbd:#F472B6; --qacc:#FBB6E0; --qglow:0 0 16px rgba(244,114,182,.4); }
  body.qt-dark{ --qbg:linear-gradient(160deg,#15181f,#1c2029 55%,#12151b); --qcard:#1b1f28; --qink:#EDF1F7; --qmut:#AEB6C2; --qopt:#252b36; --qbd:#5B6472; --qacc:#93A0B4; --qglow:0 0 0 rgba(0,0,0,0); }
  /* ACHT WEITERE DESIGNS (v2.857.0, Wunsch Murat: „farklı designlarda
     ekleyelim"). Bis hierher war nur „Standard" hell - alle anderen sechs
     dunkel. Dazu kommen fuenf HELLE (Pastell, Minze, Himmel, Karopapier,
     Strand) und drei dunkle mit eigenem Grund (Weltall mit Sternen, Tafel,
     Vulkan). Zwei davon tragen ein MUSTER statt eines Verlaufs: Karopapier
     (das Rechenheft) und die Sterne im Weltall - beides reines CSS im
     `--qbg`, keine Bilddatei.
     REGELN, DIE HIER GELTEN:
       · hsl() statt #hex - der Design-Waechter zaehlt #hex in dieser Datei
         und laesst die Zahl nicht wachsen (DESIGN_SYSTEM.md §9).
       · `--qbd`/`--qacc` tragen die weisse Schrift der Fragen-Pille
         (.q-pill) - sie bleiben deshalb auch in den hellen Designs kraeftig.
       · Helle Designs setzen `--qschatten`: der dunkle Schlagschatten der
         Karte (0 18px 50px schwarz 35 %) wirkt auf hellem Grund wie Russ.
     Neue Designs: hier eine Zeile, in index-app.js `QUIZ_THEME_LIST` eine,
     in app.py `QUIZ_THEMES` den Schluessel. Mehr nicht - die Klassen raeumt
     `quizThemeAus()` selbst ab. */
  body.qt-pastell{ --qbg:linear-gradient(160deg,hsl(262 90% 94%),hsl(330 85% 93%) 55%,hsl(28 95% 91%)); --qcard:hsl(270 60% 99%); --qink:hsl(258 35% 22%); --qmut:hsl(258 15% 42%); --qopt:hsl(0 0% 100%); --qbd:hsl(262 62% 58%); --qacc:hsl(330 70% 60%); --qglow:0 4px 14px hsl(262 60% 50% / .12); --qschatten:0 14px 40px hsl(262 50% 40% / .14); }
  body.qt-minze{ --qbg:linear-gradient(160deg,hsl(160 60% 90%),hsl(175 55% 86%) 55%,hsl(195 60% 88%)); --qcard:hsl(160 40% 98%); --qink:hsl(175 45% 16%); --qmut:hsl(175 18% 36%); --qopt:hsl(0 0% 100%); --qbd:hsl(168 65% 34%); --qacc:hsl(186 70% 38%); --qglow:0 4px 14px hsl(170 60% 30% / .12); --qschatten:0 14px 40px hsl(170 50% 25% / .14); }
  body.qt-himmel{ --qbg:radial-gradient(ellipse 34% 16% at 18% 16%,hsl(0 0% 100% / .85),transparent 70%),radial-gradient(ellipse 28% 12% at 82% 34%,hsl(0 0% 100% / .7),transparent 70%),linear-gradient(180deg,hsl(205 90% 78%),hsl(200 85% 89%) 60%,hsl(195 80% 95%)); --qcard:hsl(0 0% 100%); --qink:hsl(212 50% 20%); --qmut:hsl(212 20% 40%); --qopt:hsl(205 80% 97%); --qbd:hsl(208 80% 48%); --qacc:hsl(195 85% 40%); --qglow:0 4px 14px hsl(208 80% 40% / .12); --qschatten:0 14px 40px hsl(208 60% 30% / .16); }
  body.qt-karopapier{ --qbg:linear-gradient(hsl(210 60% 86%) 1px,transparent 1px) 0 0/22px 22px,linear-gradient(90deg,hsl(210 60% 86%) 1px,transparent 1px) 0 0/22px 22px,hsl(0 0% 99%); --qcard:hsl(0 0% 100%); --qink:hsl(220 40% 18%); --qmut:hsl(220 15% 40%); --qopt:hsl(210 60% 98%); --qbd:hsl(220 72% 50%); --qacc:hsl(0 70% 52%); --qglow:0 3px 10px hsl(220 50% 30% / .1); --qschatten:0 10px 30px hsl(220 40% 30% / .14); }
  body.qt-strand{ --qbg:linear-gradient(180deg,hsl(196 75% 78%),hsl(190 70% 86%) 42%,hsl(42 75% 87%) 58%,hsl(36 70% 80%)); --qcard:hsl(40 60% 98%); --qink:hsl(28 45% 18%); --qmut:hsl(28 20% 38%); --qopt:hsl(0 0% 100%); --qbd:hsl(192 75% 34%); --qacc:hsl(24 85% 50%); --qglow:0 4px 14px hsl(28 60% 30% / .12); --qschatten:0 14px 40px hsl(28 50% 25% / .15); }
  body.qt-weltall{ --qbg:radial-gradient(circle at 25% 35%,hsl(0 0% 100% / .85) 0 1px,transparent 1.6px) 0 0/90px 90px,radial-gradient(circle at 70% 75%,hsl(55 100% 85% / .7) 0 1px,transparent 1.6px) 0 0/130px 130px,radial-gradient(circle at 50% 50%,hsl(0 0% 100% / .45) 0 .8px,transparent 1.3px) 0 0/60px 60px,radial-gradient(ellipse at 75% 15%,hsl(265 70% 28%),transparent 60%),linear-gradient(170deg,hsl(235 55% 9%),hsl(245 50% 14%) 55%,hsl(220 60% 10%)); --qcard:hsl(238 45% 13%); --qink:hsl(220 60% 96%); --qmut:hsl(225 30% 76%); --qopt:hsl(240 40% 18%); --qbd:hsl(190 85% 42%); --qacc:hsl(265 80% 62%); --qglow:0 0 16px hsl(190 90% 55% / .35); }
  body.qt-tafel{ --qbg:radial-gradient(ellipse at 30% 20%,hsl(150 18% 27%),transparent 60%),linear-gradient(160deg,hsl(155 22% 16%),hsl(150 20% 21%) 55%,hsl(160 22% 14%)); --qcard:hsl(152 20% 19%); --qink:hsl(60 25% 95%); --qmut:hsl(90 12% 76%); --qopt:hsl(150 18% 24%); --qbd:hsl(200 50% 44%); --qacc:hsl(340 50% 55%); --qglow:0 0 0 hsl(0 0% 0% / 0); }
  body.qt-vulkan{ --qbg:radial-gradient(ellipse at 50% 112%,hsl(18 95% 40% / .6),transparent 55%),linear-gradient(170deg,hsl(10 15% 10%),hsl(5 20% 13%) 60%,hsl(15 30% 12%)); --qcard:hsl(8 18% 13%); --qink:hsl(30 60% 95%); --qmut:hsl(25 25% 74%); --qopt:hsl(8 18% 18%); --qbd:hsl(14 90% 50%); --qacc:hsl(34 95% 52%); --qglow:0 0 16px hsl(16 95% 55% / .38); }

  /* Vollflächiger Theme-Hintergrund über fixiertes Pseudo-Element (iOS-sicher). */
  body.has-qtheme[data-screen="quiz"]::before,
  body.has-qtheme[data-screen="student-welcome"]::before{
    content:""; position:fixed; inset:0; z-index:0; pointer-events:none; background:var(--qbg); }
  body.has-qtheme[data-screen="quiz"] .wrap,
  body.has-qtheme[data-screen="student-welcome"] .wrap{ position:relative; z-index:1; }
  /* Übung füllt den ganzen Bildschirm (kein weißer Rand unten). */
  body.has-qtheme[data-screen="quiz"] #screen-quiz,
  body.has-qtheme[data-screen="student-welcome"] #screen-student-welcome{ min-height:100dvh; display:flex; flex-direction:column; }
  body.has-qtheme #screen-quiz, body.has-qtheme #screen-student-welcome{
    position:relative; z-index:1;
    background:var(--qcard) !important; color:var(--qink) !important;
    border:1.5px solid color-mix(in srgb, var(--qbd) 45%, transparent); box-shadow:var(--qschatten, 0 18px 50px rgba(0,0,0,.35)), var(--qglow); }
  body.has-qtheme #screen-quiz .qtext, body.has-qtheme #screen-student-welcome h2,
  body.has-qtheme #screen-quiz .q-score{ color:var(--qink) !important; }
  body.has-qtheme #screen-student-welcome .lead, body.has-qtheme #screen-quiz .q-score{ color:var(--qmut) !important; }
  body.has-qtheme #screen-quiz .q-pill{ background:linear-gradient(135deg,var(--qbd),var(--qacc)); box-shadow:var(--qglow); }
  body.has-qtheme #screen-quiz .qtag{ background:color-mix(in srgb,var(--qbd) 22%, transparent); color:var(--qacc); }
  body.has-qtheme #screen-quiz .q-frame{ background:color-mix(in srgb,var(--qopt) 55%, var(--qcard));
    border-color:color-mix(in srgb,var(--qbd) 45%, transparent); }
  body.has-qtheme #screen-quiz .q-frame::before{ background:linear-gradient(180deg,var(--qbd),var(--qacc)); }
  body.has-qtheme #screen-quiz .progressbar{ background:color-mix(in srgb,var(--qbd) 20%, transparent); }
  body.has-qtheme #screen-quiz .progressbar i{ background:linear-gradient(90deg,var(--qbd),var(--qacc)); box-shadow:var(--qglow); }
  /* Optionen (nur unbeantwortet): getönt + Glow. Richtig/Falsch behalten Grün/Rot. */
  body.has-qtheme #screen-quiz .opt:not(.correct):not(.wrong):not(.sel){
    background:var(--qopt) !important; color:var(--qink) !important;
    border-color:color-mix(in srgb,var(--qbd) 55%, transparent) !important; box-shadow:var(--qglow); }
  body.has-qtheme #screen-quiz .opt:not(.correct):not(.wrong) .k{
    background:color-mix(in srgb,var(--qbd) 30%, transparent); color:var(--qink); border-color:var(--qbd); }
  body.has-qtheme #screen-quiz .opt:not(.correct):not(.wrong):hover{ border-color:var(--qacc) !important; }
  body.has-qtheme #screen-student-welcome #st-select,
  body.has-qtheme #screen-student-welcome #st-name{ background:var(--qopt); color:var(--qink); border-color:color-mix(in srgb,var(--qbd) 45%, transparent); }

  /* Start-Sperre: Warte-Overlay für Schüler (Aufgaben noch nicht freigegeben).
     DECKKRAFT IST HIER EINE FUNKTION, KEIN GESCHMACK (gemeldet 29.07.2026):
     bis 2.65.0 lag nur ein halbtransparenter Schleier (.55) darüber. Titel,
     Infotext und die ersten Aufgaben blieben lesbar – und wer das Gerät
     kippte, las mit. Das Gate ist aber genau dafür da, dass die Klasse noch
     NICHTS sieht, bis die Lehrkraft freigibt.
     SEIT v2.848.0 EINE SZENE ÜBER DEN GANZEN SCHIRM (docs/PLAN_KINDER_
     WARTEPLAETZE.md): die Kulisse deckt ganz ab, darunter liegt ein deckender
     Grund für die Augenblicke, bevor sie steht. Deshalb gibt es keinen
     Schleier und KEIN backdrop-filter mehr – die Unschärfe war das Einzige
     hier, was am iPad ruckeln konnte (DESIGN_SYSTEM §5). */
  #wait-gate{position:fixed;inset:0;z-index:1400;display:none;overflow:hidden;
    background:rgba(16,22,40,1);text-align:center;}
  #wait-gate.show{display:block;}
  /* Kein Mitscrollen und kein Tab-Sprung in die verdeckte Seite. */
  body.wg-an{overflow:hidden;}
  /* Der 3-2-1 auf dem Kindergeraet. Dieselbe Ziffernsprache wie auf der
     Buehne der Lehrkraft - beide zaehlen denselben Serverwert. In der Szene
     steht die Zahl gross ueber der Figur, der Satz darunter im Streifen. */
  /* fixed, nicht absolute: die Zahl steht im Textstreifen (#wg-count), soll
     aber ueber der Figur stehen - bezogen auf den Schirm, nicht den Streifen. */
  .wg-count-zahl{position:fixed;left:0;right:0;top:12%;font-size:clamp(88px,30vmin,190px);
    font-weight:800;line-height:1;letter-spacing:-.03em;color:rgb(255,255,255);
    text-shadow:0 8px 30px rgba(0,0,0,.45);}
  .wp-ton-hell .wg-count-zahl{color:var(--brand);text-shadow:0 8px 26px rgba(255,255,255,.85);}
  .wg-count-zahl.an{animation:wgZaehl .9s ease-out;}
  @keyframes wgZaehl{from{opacity:0;transform:scale(1.6);}60%{opacity:1;}to{opacity:1;transform:scale(1);}}
  /* Der Platz-Schirm zwischen letzter Frage und Bericht. */
  .rp-ico{font-size:56px;line-height:1;margin-bottom:6px;}
  .rp-ico:empty{display:none;}
  .rp-platz{font-size:clamp(48px,16vw,84px);font-weight:800;line-height:1;
    letter-spacing:-.03em;color:var(--brand);margin:2px 0 10px;}
  @media (prefers-reduced-motion: reduce){ .wg-count-zahl.an{animation:none;} }
  /* Dieselbe Warteanimation wie beim Laden (.ss-lader, das Reigen-Logo) – aber
     nur, wenn keine Figur in der Szene steht: nie zwei Figuren auf einer
     Warteflaeche (Plan §4). Laedt die Figur nicht, kommt der Reigen zurueck. */
  #wait-gate .ss-lader{margin:14px auto 0;}
  .wp-an:not(.wp-ohne-figur) .wp-text .ss-lader{display:none;}

  /* ===== DIE FIGUR FUERS RENNEN (v2.851.0, Katalog v2.853.0) =============
     Auf dem Willkommensschirm, solange eine Renn-Lobby offen ist: eine Karte
     „So siehst du im Rennen aus" mit der Figur, antippen oeffnet seit
     v2.854.0 DASSELBE Figurenfenster wie im Arbeitsplatz (.sl-av-*, weiter
     unten; „tek figür her yerde"). Gilt nur fuer dieses Rennen (RAM, app.py
     `_rennen_figur_wunsch`).

     SCHARF ODER GEGLAETTET entscheidet der PFAD (scripts/rennfiguren.py):
     Pixelkunst liegt unter …/pixel/ und bleibt beim Vergroessern scharf,
     alles andere (renn/glatt/, gezeichnete Figuren) wird geglaettet - sonst
     zerfallen duenne Linien in Treppen. Dieselbe Regel im Rennmotor
     (bildHolen) und am Warteplatz (.wp-bild). */
  /* Die Karte (v2.853.0, Anweisung Murat: „arkaplansiz figür … tam ortada
     büyük … sag üstte düzenle butonu … telefonda güzel görünsün"): Titel
     oben links, „Ändern" oben rechts, die Figur frei in der Mitte - kein
     Kreis hinter ihr, nur ein Schatten unter den Fuessen wie am Warteplatz.
     Die Buehne waechst mit dem Schirm (clamp), am Telefon gut 150 px. */
  .st-rennfigur{margin:4px 0 16px;}
  /* PIN zuerst, der Name als zweiter Weg darunter (v2.978.1). */
  .st-oder{display:flex;align-items:center;gap:var(--s-2);margin:var(--s-3) 0 var(--s-2);
    color:var(--muted);font-size:var(--fs-xs);font-weight:700;text-transform:uppercase;letter-spacing:.06em;}
  .st-oder::before,.st-oder::after{content:"";flex:1;height:1px;background:var(--line);}
  .st-name-weg{width:100%;margin:0;}
  .st-rennfigur-knopf{position:relative;display:flex;flex-direction:column;align-items:center;width:100%;
    padding:14px 14px 16px;border:1.5px solid var(--line);border-radius:var(--r-lg,18px);
    background:var(--brand-soft);color:var(--ink);font:inherit;text-align:center;cursor:pointer;}
  .st-rennfigur-knopf:hover{border-color:var(--brand);}
  .st-rennfigur-knopf:focus-visible{outline:3px solid var(--brand);outline-offset:2px;}
  .st-rennfigur-titel{align-self:flex-start;padding-right:104px;text-align:left;
    font-size:var(--fs-md,15px);font-weight:800;line-height:1.3;}
  .st-rennfigur-aendern{position:absolute;top:10px;right:10px;display:inline-flex;align-items:center;gap:6px;
    min-height:36px;padding:6px 14px;border:1.5px solid var(--brand);border-radius:999px;
    background:var(--card);color:var(--brand);font-size:var(--fs-sm,13px);font-weight:800;}
  .st-rennfigur-ic svg{display:block;width:16px;height:16px;fill:none;stroke:currentColor;stroke-width:2.2;
    stroke-linecap:round;stroke-linejoin:round;}
  .st-rennfigur-buehne{position:relative;display:flex;align-items:flex-end;justify-content:center;
    width:clamp(132px,42vw,180px);aspect-ratio:1/1;margin-top:10px;}
  .st-rennfigur-bild{position:relative;z-index:1;display:block;width:100%;height:auto;aspect-ratio:1/1;
    object-fit:contain;object-position:50% 100%;image-rendering:pixelated;}
  .st-rennfigur-bild:not([src*="/pixel/"]){image-rendering:auto;}
  .st-rennfigur-schatten{position:absolute;left:24%;right:24%;bottom:-4px;height:8%;border-radius:50%;
    background:rgba(10,20,40,.16);}
  /* Noch keine Wahl: ein Fragezeichen im gestrichelten Rahmen, so gross wie
     die Figur spaeter - die Karte springt beim Waehlen nicht. */
  .st-rennfigur-frage{position:absolute;inset:6%;display:flex;align-items:center;justify-content:center;
    border:2px dashed var(--brand);border-radius:var(--r-lg,18px);color:var(--brand);
    font-size:clamp(44px,14vw,64px);font-weight:800;line-height:1;}
  .st-rennfigur-frage:not(.hidden) ~ .st-rennfigur-schatten{display:none;}
  /* Hier stand bis v2.853.0 die eigene Auswahl (.st-figurwahl-*). Seit dem
     einen Figurenfenster steht alles unter .sl-av-* - auch das Telefon-Mass
     der Reiter (eine Zeile, Anweisung Murat „iki satir olamaz"). */

  /* ===== DIE WARTEPLAETZE ALS SZENE (static/js/warteplatz.js) ============
     docs/PLAN_KINDER_WARTEPLAETZE.md. Drei Schichten: .wp-szene (die
     Kulisse - Leinwand der Escape-Buehne oder der Rennmotor im Modus kind),
     .wp-buehne (die Figur, ein Bild, bewegt NUR hier im CSS) und .wp-text
     (der Streifen). Gilt fuer #wait-gate (W1-W3) und #screen-rennplatz (W4).

     ZWEI MASSE SIND MIT DEM RENNMOTOR VERABREDET (templates/spiele/rennen/
     index.html, Abschnitt 13b): die Fuesse stehen bei 78 % der Hoehe
     (bottom:22 %, dort KIND_FUSS = 0.78), und die Figur ist
     clamp(96px,24vmin,210px) breit (dort kindHalb()). Nur so steht sie auf
     der Bahn und die Linie knapp neben ihr. qa/unit/test_warteplatz.py
     vergleicht beide Stellen - wer eine aendert, aendert beide.

     KEINE FESTE #HEX-FARBE (Design-Waechter): die Streifen sind rgba(), der
     Text auf hellem Streifen ist bewusst KEIN var(--ink) - im dunklen Modus
     wuerde der hell, und hell auf hell ist unlesbar. */
  .wp-szene{position:absolute;inset:0;overflow:hidden;pointer-events:none;}
  .wp-szene canvas,.wp-szene iframe{position:absolute;inset:0;width:100%;height:100%;border:0;display:block;}
  .wp-buehne{position:absolute;left:0;right:0;bottom:22%;display:none;justify-content:center;pointer-events:none;}
  .wp-an .wp-buehne{display:flex;}
  .wp-an.wp-ohne-figur .wp-buehne{display:none;}
  .wp-figur{position:relative;width:clamp(96px,24vmin,210px);}
  .wp-bild{display:block;width:100%;height:auto;aspect-ratio:1/1;image-rendering:pixelated;
    transform-origin:50% 100%;position:relative;z-index:1;}
  .wp-bild:not([src*="/pixel/"]){image-rendering:auto;}
  .wp-schatten{position:absolute;left:22%;right:22%;bottom:-4px;height:9%;border-radius:50%;
    background:rgba(0,0,0,.30);}
  /* Nur im Gate und in einer offenen Szene - ohne .wp-an bleibt der
     Platz-Schirm die Karte von vorher, und dort waere weisse Schrift unten
     am Rand ein Fehler. */
  /* Die Farbe steht NICHT hier: `#wait-gate .wp-text` schlaegt mit seiner Id
     jede Ton-Regel (.wp-an.wp-ton-hell .wp-text) - weisse Schrift auf dem
     hellen Streifen. Weiss erbt der Streifen vom Gate, der Ton setzt ihn um. */
  #wait-gate{color:rgb(255,255,255);}
  #wait-gate .wp-text,.wp-an .wp-text{position:absolute;left:0;right:0;bottom:0;z-index:2;
    padding:34px 22px calc(26px + env(safe-area-inset-bottom));}
  #wait-gate .wp-text h3,.wp-an .wp-text h2,.wp-an .wp-text h3{margin:0 0 6px;font-size:var(--fs-xl,24px);
    line-height:1.25;font-weight:800;}
  #wait-gate .wp-text p,.wp-an .wp-text p{margin:0 auto;max-width:34em;font-size:var(--fs-md,15px);line-height:1.5;}
  .wp-an.wp-ton-hell .wp-text{color:rgb(27,34,48);
    background:linear-gradient(180deg,rgba(255,255,255,0),rgba(255,255,255,.86) 34%,rgba(255,255,255,.96));}
  .wp-an.wp-ton-hell .wp-text p{color:rgb(77,86,102);}
  .wp-an.wp-ton-dunkel .wp-text{color:rgb(255,255,255);
    background:linear-gradient(180deg,rgba(8,18,32,0),rgba(8,18,32,.74) 34%,rgba(8,18,32,.93));}
  .wp-an.wp-ton-dunkel .wp-text p{color:rgba(255,255,255,.86);}
  /* Bewegung: wippen beim Warten, in die Knie bei jeder Zahl, weg beim Start,
     jubeln im Ziel. Alles nur transform/opacity - das rechnet der Browser
     ausserhalb des Hauptfadens, auch auf dreissig Tablets. */
  .wp-an .wp-bild{animation:wpWippen 1.7s ease-in-out infinite;}
  .wp-an .wp-schatten{animation:wpSchatten 1.7s ease-in-out infinite;}
  @keyframes wpWippen{0%,100%{transform:translateY(0);}50%{transform:translateY(-6%);}}
  @keyframes wpSchatten{0%,100%{transform:scaleX(1);opacity:1;}50%{transform:scaleX(.84);opacity:.7;}}
  .wp-an.wp-kauern .wp-bild{animation:wpKauern .5s ease-out;}
  @keyframes wpKauern{0%{transform:none;}30%{transform:translateY(4%) scale(1.07,.86);}100%{transform:none;}}
  .wp-an.wp-los .wp-bild{animation:wpLos .65s cubic-bezier(.55,0,.75,.3) forwards;}
  .wp-an.wp-los .wp-schatten{animation:none;opacity:0;transition:opacity .3s;}
  @keyframes wpLos{0%{transform:translateY(4%) scale(1.07,.86);}20%{transform:translateX(-8%) scale(1.04,.9);}
    100%{transform:translateX(75vw);opacity:0;}}
  .wp-an.wp-los{transition:opacity .45s ease .2s;opacity:0;}
  .wp-an.wp-ziel .wp-bild{animation:wpJubel 1.1s cubic-bezier(.3,.7,.4,1) infinite;}
  @keyframes wpJubel{0%,100%{transform:translateY(0) scale(1.05,.93);}15%{transform:translateY(0) scale(.97,1.05);}
    45%{transform:translateY(-20%) scale(1);}78%{transform:translateY(0) scale(1.03,.96);}}
  .wp-konfetti{position:absolute;inset:0;overflow:hidden;pointer-events:none;z-index:1;}
  .wp-konfetti i{position:absolute;top:-12px;width:8px;height:12px;border-radius:1px;
    animation:wpFallen 2.4s linear forwards;}
  .wp-konfetti .wp-k0{background:hsl(45 95% 55%);} .wp-konfetti .wp-k1{background:hsl(228 90% 60%);}
  .wp-konfetti .wp-k2{background:hsl(150 70% 42%);} .wp-konfetti .wp-k3{background:hsl(10 85% 58%);}
  .wp-konfetti .wp-k4{background:hsl(290 70% 60%);}
  @keyframes wpFallen{from{transform:translateY(0) rotate(var(--wp-dreh,0deg));}
    to{transform:translateY(105vh) rotate(calc(var(--wp-dreh,0deg) + 540deg));opacity:.3;}}
  /* „Bewegung reduzieren": die Szene steht, die Figur auch - der Schirm
     bleibt trotzdem ganz bedeckt (Plan §4). */
  @media (prefers-reduced-motion: reduce){
    .wp-an .wp-bild,.wp-an .wp-schatten,.wp-an.wp-kauern .wp-bild,.wp-an.wp-ziel .wp-bild{animation:none;}
    .wp-konfetti{display:none;}
  }
  /* W4 im Ziel: der Platz-Schirm wird zur Szene ueber den ganzen Schirm.
     Ohne .wp-an bleibt er die Karte von vorher. */
  #screen-rennplatz.wp-an{position:fixed;inset:0;z-index:1300;margin:0;max-width:none;width:auto;
    border:0;border-radius:0;box-shadow:none;padding:0;overflow:hidden;background:rgba(16,22,40,1);}
  #screen-rennplatz.wp-an .wp-text .lead{margin:0 auto;}
  /* Medaille und Platz stehen OBEN ueber der Figur, wie die 3-2-1 - im
     Streifen wuerden sie ihn so hoch machen, dass er die Figur zudeckt. */
  #screen-rennplatz.wp-an .rp-ico{position:fixed;left:0;right:0;top:5%;margin:0;
    font-size:clamp(40px,9vmin,72px);}
  #screen-rennplatz.wp-an .rp-platz{position:fixed;left:0;right:0;margin:0;
    top:calc(5% + clamp(46px,10vmin,82px));font-size:clamp(80px,26vmin,170px);
    color:rgb(255,255,255);text-shadow:0 8px 30px rgba(0,0,0,.45);}
  #screen-rennplatz.wp-an.wp-ton-hell .rp-platz{color:var(--brand);text-shadow:0 8px 26px rgba(255,255,255,.85);}
  #screen-rennplatz.wp-an #rp-weiter{margin-top:14px;width:auto;min-width:220px;padding-left:26px;padding-right:26px;}
  #wg-count p{font-size:var(--fs-lg,19px);font-weight:700;}
  /* Die eigene Gruppe an der Startlinie: ein Punkt in ihrer Farbe (vom
     Server, --gruppe), damit das Kind seine Blase am Beamer wiederfindet. */
  .wg-gruppe{display:inline-flex;align-items:center;gap:8px;margin-top:10px !important;
    padding:6px 14px;border-radius:999px;background:rgba(255,255,255,.16);font-weight:700;}
  .wp-ton-hell .wg-gruppe{background:rgba(27,34,48,.07);}
  .wg-gruppe i{width:14px;height:14px;border-radius:50%;background:var(--gruppe,currentColor);
    box-shadow:0 0 0 2px rgba(255,255,255,.8);}
  #screen-rennplatz:not(.wp-an) .wp-szene,#screen-rennplatz:not(.wp-an) .wp-konfetti{display:none;}
  /* Kurze Schirme (Telefon quer): kleinere Figur, knapperer Streifen - sonst
     stuende der Text auf ihren Fuessen. */
  @media (max-height:480px){
    #wait-gate .wp-text,.wp-an .wp-text{padding:22px 18px calc(14px + env(safe-area-inset-bottom));}
    #wait-gate .wp-text h3,.wp-an .wp-text h2,.wp-an .wp-text h3{font-size:var(--fs-lg,19px);}
    .wg-count-zahl{top:6%;}
  }

  /* Auge-Umschalter (Start-Sperre). Steht seit v2.323.0 mit Beschriftung
     UNTER dem Code (.qh-werkzeuge) statt als nacktes Icon in der Ecke -
     Masse und Position kommen von dort, hier bleiben nur die Zustände. */
  .qr-lock{z-index:4;display:inline-flex;align-items:center;justify-content:center;
    border:1.5px solid var(--line);background:var(--card);cursor:pointer;color:var(--muted);box-shadow:0 2px 8px rgba(20,30,60,.08);}
  .qr-lock svg{width:20px;height:20px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;}
  .qr-lock.locked{border-color:var(--bad);color:var(--bad);background:var(--bad-soft,#FCE9E7);}
  .qr-lock.open{border-color:var(--ok);color:var(--ok);background:var(--ok-soft,#E4F6EC);}
  /* GESPERRT: der Code muss UNLESBAR sein, nicht nur „weich".
     blur(11px) auf einem 340-px-Code liess das Muster stehen - eine Kamera
     kam damit noch durch, und seit v2.323.0 ist gesperrt der ZUSTAND, in dem
     eine neue Aufgabe startet. Also kraeftiger unscharf, entsaettigt und
     heruntergedimmt; drei Mittel, weil jedes einzelne umkehrbar aussieht. */
  .qh-code{position:relative;display:inline-block;}
  .qh-frame{position:relative;transition:filter .25s, opacity .25s;}
  .qr-hero.locked .qh-frame{filter:blur(20px) saturate(.25);opacity:.5;}
  .qh-sperre{position:absolute;inset:0;display:none;flex-direction:column;
    align-items:center;justify-content:center;gap:var(--s-1);text-align:center;padding:0 var(--s-4);}
  .qr-hero.locked .qh-sperre{display:flex;}
  .qh-sperre svg{width:26px;height:26px;fill:none;stroke:var(--bad);stroke-width:2;
    stroke-linecap:round;stroke-linejoin:round;}
  .qh-sperre b{font-size:var(--fs-lg);font-weight:800;color:var(--bad-ink);letter-spacing:.02em;}
  .qh-sperre span{font-size:var(--fs-sm);font-weight:600;color:var(--muted);line-height:1.3;}

  /* Quiz auf dem Handy: mehr Breite, größere Tippflächen, nichts verrutscht/scrollt. */
  @media (max-width:600px){
    body[data-screen="quiz"] .wrap{ padding-left:calc(10px + env(safe-area-inset-left)); padding-right:calc(10px + env(safe-area-inset-right)); padding-top:max(calc(12px + env(safe-area-inset-top)),16px); }
    body[data-screen="quiz"] #screen-quiz.card{ padding:16px 14px; border-radius:16px; }
    #screen-quiz .qtext{ font-size:18px; }
    #screen-quiz .q-frame{ padding:14px 14px 13px 17px; margin-bottom:18px; }
    #screen-quiz .opt{ padding:16px 15px; font-size:16px; }
    #screen-quiz .opt .k{ width:28px; height:28px; }
  }
  #screen-quiz .qtext, #screen-quiz .opt{ overflow-wrap:anywhere; }
  /* Mehr Luft zwischen Fortschrittsbalken und Frage-Rahmen (nur im Quiz). */
  #screen-quiz .progressbar{ margin-bottom:16px; }

  /* =======================================================================
     DER SCHUELER-BILDSCHIRM IST EINE BUEHNE, KEINE SEITE MIT EINEM KASTEN
     =======================================================================
     Befund Murat 16.08.2026: „o arkada beyaz sayfa var ya onu kaldirsakta
     direkt sayfaya yerlestirsek … zaten kalan acilan araclarin kendi
     kutulari var. su kutu kutu olayi can sikici."

     Er hat recht, und zwar zweifach:

     1. ES WAREN KAESTEN IN EINEM KASTEN. Frage-Rahmen und Antworten bringen
        ihre eigene Form mit (`.q-frame`, `.opt` - Rahmen, Fuellung, Radius).
        Die weisse `.card` darum war eine zweite Umrandung ohne Aufgabe: sie
        trennte nichts, sie machte nur den Rand schmaler.
     2. ES KLEBTE OBEN. Eine Frage mit drei Antworten fuellt keinen halben
        Bildschirm; sie stand trotzdem am oberen Rand, darunter Leere. Ein
        Kind schaut auf die Mitte.

     GELTUNGSBEREICH - hier steht bewusst KEINE Media-Regel (Entscheidung
     Murat 16.08.2026, Frage nach dem Umfang: „dört görünümde de"). Diese
     zwei Bildschirme sehen NUR Kinder; die Lehrkraft arbeitet nie darin.
     Die Regel aus CLAUDE.md („schmal aendern heisst SCHMAL aendern")
     schuetzt die Arbeitsflaeche der Lehrkraft - die ist hier nicht beruehrt,
     und auf dem Klassentablet sitzt dasselbe Kind vor demselben Quiz.

     ZWEI AUSNAHMEN, die mitgedacht sind:
     * `.has-qtheme` - waehlt die Lehrkraft ein Design (Neon, Ozean …), IST
       die Karte das Design: sie traegt `--qcard`, Rahmen und Schein. Dort
       bleibt alles, wie es war.
     * `.student-embedded` - im Arbeitsplatz-Rahmen gibt es keine
       Bildschirmhoehe, an der man etwas ausrichten koennte; die Regeln dort
       setzen `min-height:0!important` und gewinnen ohnehin.

     MITTIG OHNE ABSCHNEIDEN: `margin:auto 0` am Element, NICHT
     `justify-content:center` am Behaelter. Beim Zentrieren per
     justify-content ragt langer Inhalt oben aus dem Rollbereich heraus und
     ist nicht mehr erreichbar - eine Frage mit Infotext und acht Antworten
     waere oben abgeschnitten. Auto-Raender schieben nur, solange Platz da
     ist, und geben ihn beim ersten Ueberlaufen wieder her. */
  body:not(.has-qtheme):not(.student-embedded)[data-screen="quiz"] .wrap,
  body:not(.has-qtheme):not(.student-embedded)[data-screen="student-welcome"] .wrap{
    min-height:100dvh; display:flex; flex-direction:column; }
  body:not(.has-qtheme):not(.student-embedded)[data-screen="quiz"] #screen-quiz,
  body:not(.has-qtheme):not(.student-embedded)[data-screen="student-welcome"] #screen-student-welcome{
    background:transparent; border:0; box-shadow:none; padding:0; margin:auto 0; }

  /* =======================================================================
     DIE FRAGE BLEIBT STEHEN, DIE ANTWORTEN ROLLEN (v2.316.0)
     =======================================================================
     Wunsch Murat 16.08.2026: „o basligi yildizlarin oldu ve sorunun yazildigi
     ekrani sabit tutsak icerige göre büyüyüp kücülse nasil olur? … bu
     quizduell deki gibi olsun istiyorum aslinda."

     DAS PROBLEM, das er beschreibt: der Bildschirm war EINE lange Spalte.
     Bei acht Antworten - oder bei einer Frage mit Grafik - scrollte die Frage
     nach oben aus dem Bild, und ein Kind waehlte zwischen Antworten, ohne die
     Frage noch zu sehen. Dasselbe gilt fuer Sterne und Fortschritt: die
     Belohnung, fuer die es arbeitet, war beim Antworten unsichtbar.

     DIE LOESUNG hat drei Teile, und alle drei sind noetig:
       1. Der Bildschirm ist genau so hoch wie das Fenster (`100dvh`, NICHT
          `100vh` - auf dem Telefon zaehlt vh die Adressleiste mit, das Quiz
          waere dort dauerhaft zu hoch).
       2. `.quiz-kopf` steht still (`flex:none`) - er WAECHST aber mit seinem
          Inhalt. Eine feste Kopfhoehe haette bei einer kurzen Frage ein Loch
          gelassen und eine lange abgeschnitten.
       3. `.quiz-koerper` bekommt den Rest und rollt (`flex:1; overflow:auto`).
          `min-height:0` ist dabei die Zeile, die man vergisst: ohne sie
          weigert sich ein Flex-Kind zu schrumpfen, das Rollen landet wieder
          am Fenster und der Kopf wandert doch aus dem Bild.

     NACHGEZOGEN AM 01.09.2026 (v2.579.1) - WAS IM KOPF STEHT UND WAS NICHT:
     Die FRAGE steht nicht mehr im Kopf, sondern im Rollbereich. Im Kopf
     bleibt nur, was klein ist und immer passt: Zaehler, Sterne, Zeit, Punkte,
     Fortschritt. Damit gibt es GENAU EINEN Rollbereich auf dem Bildschirm.
     Vorher waren es zwei ineinanderliegende (die Frage hatte ihren eigenen),
     beide ohne sichtbaren Balken - ein Wisch ueber der Frage bewegte die
     Frage, nicht die Antworten. Der Kern des Wunsches von oben bleibt
     erfuellt: Sterne und Fortschritt sind beim Antworten weiter zu sehen.
     Was NICHT mehr gilt: bei einer sehr langen Frage rollt sie beim
     Antworten weg. Das laesst sich nicht beides haben - eine Frage, die
     allein den halben Bildschirm fuellt, kann nicht stehenbleiben UND die
     Antworten sichtbar lassen. Erreichbarkeit schlaegt Stehenbleiben.

     KURZE ANTWORTLISTEN STEHEN MITTIG im verbleibenden Raum (`margin:auto 0`
     am Inhalt, nicht `justify-content:center` am Behaelter) - dieselbe
     Begruendung wie bei der Buehne oben: beim Zentrieren per justify-content
     ragt zu langer Inhalt oben aus dem Rollbereich und ist nicht erreichbar.

     DIE BILDSCHIRMTASTATUR ist der Grund, warum der Koerper rollt und nicht
     der Kopf: bei Lueckentext und Rechenaufgaben schiebt sie das Fenster
     zusammen. Weil `100dvh` mitschrumpft und nur der Koerper rollt, bleibt
     das Eingabefeld erreichbar - und die Frage steht seit v2.579.1 im
     selben Rollbereich direkt darueber, ist also mit derselben Bewegung
     wieder da.

     GILT FUER ALLE VIER ERSCHEINUNGSFORMEN (Handy, Tablet, Rechner, PWA) -
     dieselbe Begruendung wie bei der Buehne: diesen Bildschirm sehen nur
     Kinder. Ausgenommen bleibt `.student-embedded`: im Arbeitsplatz-Rahmen
     gibt es keine Fensterhoehe, an der man etwas ausrichten koennte. */
  /* DIE HOEHE GEHOERT DEM `.wrap`, NICHT DER SECTION - und das ist die
     Zeile, an der es beim ersten Versuch scheiterte: `#screen-quiz` bekam
     `height:100dvh`, sass aber INNERHALB des `.wrap` mit seinen 28px oben
     und 80px unten. Macht 108px mehr als das Fenster hoch ist; die Seite
     rollte also zusaetzlich zum Koerper, und der Kopf wanderte beim Wischen
     doch aus dem Bild. Im Browser nachgemessen, nicht ueberlegt.
     Jetzt ist der `.wrap` genau fensterhoch, und die Section nimmt sich mit
     `flex:1; min-height:0` den Rest. Der Fussabstand faellt klein aus - die
     80px sind fuer eine rollende Seite gedacht, hier rollt nichts. */
  body:not(.student-embedded)[data-screen="quiz"] .wrap{
    /* `display:flex` STEHT HIER UND NICHT NUR IN DER BUEHNEN-REGEL - das war
       der schlimmste der drei Fehler (Befund Murat 01.09.2026). Die
       Buehnen-Regel weiter oben nimmt `.has-qtheme` ausdruecklich aus; sie
       ist es aber, die den `.wrap` zum Flex-Behaelter machte. Waehlte die
       Lehrkraft ein Quiz-Design, galt hier `height:100dvh; overflow:hidden`
       OHNE Flex - `#screen-quiz` mit `flex:1 1 auto` war dann gar kein
       Flex-Kind, behielt seine volle Inhaltshoehe (gemessen: 1054px in einem
       667px hohen Fenster) und alles darunter war ABGESCHNITTEN: die letzten
       Antworten, die Rueckmeldung, „Antwort pruefen"/„Weiter" und „Quiz
       abbrechen". Gerollt werden konnte nirgends, weil `.quiz-koerper` seine
       volle Hoehe bekam und deshalb nichts zu rollen hatte. Ein Kind mit
       Design kam aus einer langen Frage nicht mehr heraus. */
    height:100dvh; min-height:0; overflow:hidden;
    display:flex; flex-direction:column;
    padding-top:max(calc(10px + env(safe-area-inset-top)), 14px);
    padding-bottom:max(calc(10px + env(safe-area-inset-bottom)), 14px); }
  body:not(.student-embedded)[data-screen="quiz"] #screen-quiz{
    flex:1 1 auto; min-height:0; display:flex; flex-direction:column;
    margin:0; overflow:hidden; }
  body:not(.student-embedded)[data-screen="quiz"] #screen-quiz .quiz-kopf{
    flex:none; }
  body:not(.student-embedded)[data-screen="quiz"] #screen-quiz .quiz-koerper{
    flex:1 1 auto; min-height:0; overflow-y:auto;
    display:flex; flex-direction:column;
    /* Die Rollleiste ausblenden: sie wuerde am Rand der Antworten kleben und
       ist auf Beruehrgeraeten ohnehin unsichtbar. Gerollt wird trotzdem. */
    scrollbar-width:none; }
  body:not(.student-embedded)[data-screen="quiz"] #screen-quiz .quiz-koerper::-webkit-scrollbar{ display:none; }
  /* DIE ANTWORTEN STEHEN DIREKT UNTER DER FRAGE, nicht in der Mitte des
     Restes. Beim Bauen zuerst mit Auto-Raendern zentriert - im Browser
     angesehen und verworfen: bei drei Antworten klaffte eine Handbreit
     Leere zwischen Frage und erster Antwort, und die beiden gehoeren
     zusammen. Der leere Platz gehoert nach UNTEN; dort steht er niemandem
     im Weg (so macht es auch das Vorbild, auf das Murat gezeigt hat).
     „Quiz abbrechen" stand bis v2.855.x hier am Ende; seit v2.856.0 ist es
     das rote ✕ oben rechts in der Kopfleiste. */
  /* DER FRAGE-RAHMEN IST KEIN EIGENER ROLLBEREICH MEHR (v2.579.1)
     =======================================================================
     Hier stand `max-height:52dvh; overflow-y:auto`. Gut gemeint: eine lange
     Frage sollte den Antworten nicht den Platz wegnehmen. Praktisch waren es
     damit ZWEI ineinanderliegende Rollbereiche auf einem Kinder-Bildschirm,
     und beide ohne sichtbaren Balken (die Regeln am Dateianfang blenden ihn
     ueberall aus). Wer ueber der Frage wischte - und die Frage ist die
     groesste Flaeche des Bildschirms -, rollte die FRAGE; die Antworten
     bewegten sich nicht. Genau das meldet Murat mit „o ekran asagi dogru
     kaymiyor".

     Gemessen auf 375x667: Kopf 451px (davon 343px Frage), fuer Antworten,
     Rueckmeldung und Knoepfe blieben 188px bei 532px Inhalt - anderthalb von
     vier Antworten sichtbar.

     Die Frage steht seit v2.579.1 IM Rollbereich (templates/index.html) und
     rollt mit den Antworten. `flex:none` ist dabei die Zeile, die man
     vergisst: `.quiz-koerper` ist eine Flex-Spalte, und ein Flex-Kind mit
     `overflow:hidden` - das hat der Rahmen wegen seiner runden Ecken -
     verliert seine automatische Mindestgroesse und wird bis auf den
     Innenabstand zusammengedrueckt. Im Browser gesehen: aus 586px wurden
     33px, die Frage war ein leerer Streifen. */
  body:not(.student-embedded)[data-screen="quiz"] #screen-quiz .q-frame{
    flex:none; }
  /* DER WEG NACH VORN IST IMMER SICHTBAR (v2.540.0)
     =======================================================================
     BEFUND MURAT 29.08.2026: „uzun sorularda asagidaki sonraki soruya gecme
     tuslarini göremiyorum."

     Nachgestellt: eine lange Frage füllt ihre erlaubten 52dvh, darunter ein
     Schreibfeld und die Rückmeldung („Fast. …") - und „Weiter" lag unter der
     Rollkante. Das Kind sah keinen Weg weiter; dass man wischen kann, weiss
     man nur, wenn man weiss, dass da noch etwas ist.

     DIE FRAGE BLEIBT, WIE SIE IST. Nicht der Kopf wird gekürzt (er rollt
     schon innen), sondern der Knopf KLEBT am unteren Rand des Rollbereichs.
     Das ist die kleinere Änderung und die ehrlichere: das Kind verliert
     nichts von der Aufgabe und hat den Ausgang trotzdem im Blick.

     OHNE EIGENEN GRUND, und das ist kein Sparen: es ist immer nur EIN Knopf
     sichtbar (`showCheck` zeigt „Antwort prüfen", `lockExplain` tauscht ihn
     gegen „Weiter"), und ein `.btn` ist voll breit und deckend. Ein
     Verlaufsstreifen dahinter wäre in den Quiz-Designs (`.has-qtheme`) eine
     Farbe, die dort nicht hingehört - dieselbe Falle wie beim Frage-Rahmen.

     `z-index` gehört dazu: ohne ihn liegen später gezeichnete Geschwister
     (die Rückmeldung) über dem klebenden Knopf. */
  body:not(.student-embedded)[data-screen="quiz"] #screen-quiz .quiz-tasten{
    position:sticky; bottom:0; z-index:2; margin-top:12px; flex:none; }
  /* Im Design-Modus traegt die Karte die Farbe - sie darf dann NICHT
     transparent sein, aber die Aufteilung oben/unten gilt genauso. Die
     Alt-Regel setzte `min-height:100dvh` auf dieselbe Karte; das steht dem
     festen Kopf im Weg und wird hier ueberschrieben. */
  body.has-qtheme:not(.student-embedded)[data-screen="quiz"] #screen-quiz{
    min-height:0; padding:16px; }
  /* Der Frage-Rahmen wird WEISS. Er stand auf `--paper` - derselben Farbe
     wie der Seitengrund. Solange die weisse Karte darunter lag, hob er sich
     davon ab; ohne sie waere die Frage ein Kasten in Grundfarbe auf
     Grundfarbe, also gar kein Kasten mehr. Die Antworten darunter sind
     ohnehin `--card`. */
  body:not(.has-qtheme):not(.student-embedded)[data-screen="quiz"] .q-frame{
    background:var(--card); }
  /* DER GOLDENE SCHEIN BEI EINER SERIE (`ss-onfire`) LAG AUF DER KARTE.
     Ohne Karte waere er ein leuchtendes Rechteck um nichts - die Belohnung
     fuer drei richtige Antworten haette man nicht mehr gesehen. Er haengt
     jetzt am Frage-Rahmen, dem einzigen Kasten, der noch dasteht, und sitzt
     damit sogar naeher an dem, worum es geht. Dieselben Werte wie vorher,
     keine neue Farbe. */
  body:not(.has-qtheme):not(.student-embedded)[data-screen="quiz"] #screen-quiz.ss-onfire .q-frame{
    box-shadow:0 0 0 3px rgba(245,166,35,.55),0 0 26px rgba(245,166,35,.32);
    border-color:rgba(245,166,35,.75); }
  @media (prefers-reduced-motion: reduce){
    body:not(.has-qtheme):not(.student-embedded)[data-screen="quiz"] #screen-quiz.ss-onfire .q-frame{
      box-shadow:none; }
  }

  /* =======================================================================
     KLASSENBUCH - MIGRIERT MIT SCHRITT 7 (v2.279.0, DESIGN_SYSTEM.md §10)
     =======================================================================
     "Ende der Kette Material -> Ergebnis". Der Abschnitt ist nicht EIN Block,
     sondern liegt in 14 Bereichen der Datei verstreut und benutzt VIER
     Vorsilben: .kb- .kbx- .kbz- .kbr- (dazu .kbp-, .kbu-, .kbv-). Das ist
     der Grund, warum hier mehr steht als bei Cockpit und Aufgabenzentrale:
     wer den Bildschirm sucht, findet ihn sonst nicht.

     GEZOGEN: 64 Schriftgroessen, 47 Ecken, 64 Abstaende, 16 feste Farben.

     14 TOTE RUECKFALLWERTE - derselbe Fund wie im Cockpit (v2.270.0), und
     wieder waren die meisten FALSCH: var(--bad,#D33C3C) und var(--bad,#E0463E)
     gegen --bad #E2483D, var(--paper,#F4F5F9) gegen #F1F2F6,
     var(--muted,#6b7280) gegen #6A7384, var(--line,#e2e5ec) gegen #E4E7EE.
     Solange die Token existieren, sieht man davon nichts - wer einen umbenennt,
     bekommt schlagartig vier verschiedene Grautoene zu sehen.

     ZWEI TOTE REGELN: `body.dark .kb-aufbew` (+ .akut). Die Klasse wird
     NIRGENDS gesetzt - applyTheme() schreibt data-theme ans <html>, nie eine
     Klasse an den Body. Der Dunkelmodus lief hier also schon vorher nicht.

     WAS ABSICHTLICH STEHENBLEIBT:
     * Die KATEGORIEFARBEN der Reflexions-Ansicht (.acc-zeit / .acc-fach /
       .acc-schueler, je Rand + Kopf + Abzeichen). Eine Kategoriefarbe sagt
       "dieses, nicht jenes" - nicht "gut" oder "gefaehrlich" (§9.1, dieselbe
       Begruendung wie beim Cockpit).
     * Der Verlauf #2E5BFF -> #7A5AF8 -> #D4537E ist eine ZEICHNUNG (Schrift
       mit background-clip), kein Bauteil.
     * `border-radius:5px` an .kbr-stbox: das Kaestchen ist 16px gross,
       8px waeren dort ein Kreis und kein Kaestchen mehr.
     * Die zwei Dunkelmodus-Zeilen der Zebra-Streifen (#1F2739) - sie gehoeren
       zum Dunkelmodus-Umbau (docs/DUNKEL_BEFUND.md), nicht hierher.

     ZWEI TOENE OHNE NAMEN WERDEN GERECHNET statt erfunden (Muster v2.270.0):
     der Zebra-Streifen und die geoeffnete Zeile waren #FAFBFE und #F3F6FF -
     beides "ein Hauch Markenblau auf Weiss". Jetzt color-mix auf var(--brand);
     aendert sich das Blau, ziehen sie mit.
     ======================================================================= */

  /* ===== FACH-LEISTE mit Pfeil-Scroll (statt Scrollbar) ===== */
  .kb-fachwrap{ display:flex; align-items:center; gap:var(--s-1); margin-bottom:var(--s-3); }
  .kb-fachscroll{ display:flex; gap:var(--s-1); flex-wrap:nowrap; overflow-x:auto; scroll-behavior:smooth;
    flex:1; min-width:0; padding:1px; scrollbar-width:none; -ms-overflow-style:none; }
  .kb-fachscroll::-webkit-scrollbar{ display:none; height:0; }
  .kb-facharrow{ flex:none; width:26px; height:26px; border-radius:50%; border:1.5px solid var(--line);
    background:var(--card); color:var(--ink); cursor:pointer; display:none; align-items:center;
    justify-content:center; font-size:var(--fs-sm); line-height:1; padding:0; }
  .kb-facharrow.show{ display:inline-flex; }
  .kb-facharrow:active{ transform:scale(.92); }
  .kb-fachchip{ flex:none; padding:var(--s-1) var(--s-3); border-radius:var(--r-pill); font:inherit; font-size:var(--fs-sm);
    font-weight:600; cursor:pointer; white-space:nowrap; border:1.5px solid var(--line);
    background:var(--card); color:var(--ink); }
  .kb-fachchip.on{ border-color:var(--brand); background:var(--brand); color:var(--card); }

  /* ===== KOMPAKTE AKTIONSLEISTE (Klassenansicht) ===== */
  .kb-actbar{ display:flex; gap:var(--s-1); align-items:stretch; justify-content:center;
    flex-wrap:nowrap; margin-bottom:var(--s-3); }
  .kb-actbtn{ flex:1 1 0; min-width:0; display:flex; flex-direction:column; align-items:center;
    justify-content:center; gap:3px; padding:var(--s-2) var(--s-1); border:1.5px solid var(--line);
    border-radius:var(--r-control); background:var(--card); color:var(--ink); cursor:pointer;
    font:inherit; font-size:var(--fs-2xs); font-weight:600; line-height:1.1; transition:border-color .12s,transform .08s; }
  .kb-actbtn:hover{ border-color:var(--brand); }
  .kb-actbtn:active{ transform:scale(.96); }
  .kb-actbtn svg{ width:19px; height:19px; fill:none; stroke:currentColor; stroke-width:2;
    stroke-linecap:round; stroke-linejoin:round; }
  .kb-actbtn.accent{ background:var(--brand); border-color:var(--brand); color:var(--card); }
  /* Kurzzeitiges Highlight, solange die zugehörige Aktion (Popup/Prompt) offen ist. */
  .kb-actbtn.on{ border-color:var(--brand); box-shadow:0 0 0 2px var(--brand-weak,rgba(124,92,246,.22)) inset; }
  .kb-actbtn .kb-actlbl{ white-space:nowrap; overflow:hidden; text-overflow:ellipsis; max-width:100%; }
  .kb-actbtn.more{ flex:0 0 44px; }
  @media (max-width:560px){
    .kb-actbtn .kb-actlbl{ display:none; }   /* eng/mobil: nur Icons */
    .kb-actbtn{ flex:1 1 0; padding:var(--s-3) var(--s-1); }
    .kb-actbtn.more{ flex:0 0 44px; }
  }

  /* ===== NEUE KLASSEN-ANSICHT (kbx): Kopfzeile + Fach-Matrix + Fokus-Blur =====
     Kopf: Klassen-Chip (Dropdown) + Kennzahlen inline + Icon-Aktionen, die sich
     bei Hover/Aktiv wie die Sidebar-Nav mit Label + eigener Farbe ausklappen. */
  .kbx-head{ display:flex; align-items:center; gap:var(--s-3); flex-wrap:wrap; margin-bottom:var(--s-3); }
  .kbx-chip{ display:inline-flex; align-items:center; gap:var(--s-2); border:none; border-radius:var(--r-control);
    padding:var(--s-2) var(--s-4); font:inherit; font-size:var(--fs-base); font-weight:800; cursor:pointer;
    background:var(--brand-soft); color:var(--brand-dk); box-shadow:0 1px 2px rgba(27,34,48,.08);
    transition:transform .1s, box-shadow .12s; }
  .kbx-chip:hover{ box-shadow:0 3px 8px rgba(27,34,48,.14); }
  .kbx-chip:active{ transform:scale(.96); }
  .kbx-chip svg{ width:16px; height:16px; fill:none; stroke:currentColor; stroke-width:2.8;
    stroke-linecap:round; stroke-linejoin:round; }
  /* Klassen-Chip + Kennzahlen sitzen auf Desktop OBEN in der Kopfzeile neben
     dem Seitentitel (linksbündig, vertikal zentriert); mobil in der Karte. */
  /* KEIN `overflow:hidden` MEHR (Befund Murat 05.08.2026: „klasse secmeye
     calisinca kesiliyo soldan kutu"). Es beschnitt den Klassen-Chip an der
     Seite – sichtbar an seinem Schatten und beim Antippen (`:active` skaliert
     ihn). Das Abschneiden langer Kennzahlen braucht es hier nicht: `.kbx-kpi`
     bringt sein eigenes `overflow:hidden` mit `text-overflow:ellipsis` mit.
     Etwas mehr Luft (`gap`), weil in dieser Zeile jetzt drei Dinge stehen. */
  #kbx-tb{ flex:1 1 auto; min-width:0; display:flex; align-items:center; gap:16px;
    margin-left:18px; overflow:visible; }
  #kbx-tb .kbx-kpi{ white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
  .kbx-head-ck{ display:none; align-items:center; gap:var(--s-3); min-width:0; }
  @media (max-width:899px){
    #kbx-tb{ display:none; }
    .kbx-head-ck{ display:flex; flex:1 1 auto; flex-wrap:wrap; }
  }
  /* MOBIL GEHOERT DER KLASSENNAME NACH OBEN (v2.143.0, Wunsch Murat
     05.08.2026: „mobilde 10 a var ya klassenbuchun yaninda olsun,
     klassenbuch textini kücült").
     WELCHE KLASSE ist auf einem schmalen Schirm die wichtigste Angabe der
     Seite - wichtiger als das Wort „Klassenbuch", das ohnehin schon in der
     Seitenleiste steht. Genau dieselbe Abwaegung wurde beim Kalender-Zeitraum
     (`#kal-tb`, 2.93.0) getroffen; dort steht die Begruendung ausfuehrlich.
     NUR der Chip wandert mit - die Kennzahlen bleiben mobil verborgen, sonst
     draengen sie Postfach und Profil aus der Zeile.
     Wichtig: `.kbx-head-ck` muss hier AUS, sonst steht der Chip zweimal auf
     dem Bildschirm (oben und in der Karte). */
  @media (max-width:640px){
    /* Der Titel darf NICHT abgeschnitten werden (Befund Murat 05.08.2026:
       „yukarda klassenbuch yazisini sigdir demistim, ne demek bu"). Aus
       „Klassenbuch" wurde „Klassenb…", weil der Titel mit `flex:1 1 auto` und
       `text-overflow:ellipsis` der nachgiebige Teil der Zeile war.
       Jetzt umgekehrt: der Titel ist `flex:0 0 auto` (gibt nicht nach) und
       wird so weit verkleinert, dass er ganz hineinpasst; nachgeben darf der
       Chip-Bereich daneben. `#kbx-tb` braucht dafuer `overflow:visible` -
       das geerbte `overflow:hidden` hat die Klassen-Auswahl an der Seite
       beschnitten („klasse secim kutusuda kesik yandan"). */
    #kbx-tb{ display:flex; flex:1 1 auto; min-width:0; margin-left:8px; gap:8px;
      overflow:visible; }
    #kbx-tb .kbx-kpi{ display:none; }
    #kbx-tb .kbx-chip{ flex:none; font-size:var(--fs-sm); padding:var(--s-1) var(--s-3); border-radius:var(--r-control);
      box-shadow:none; }
    #kbx-tb .kbx-chip svg{ width:12px; height:12px; }
    .kbx-head-ck{ display:none; }
    /* DER TITEL GIBT NACH, NICHT DAS PROFILBILD (v2.415.0). `clip` und
       `overflow:visible` hiessen: der Titel behaelt seine volle Breite und
       was hinten nicht mehr passt, wird aus dem Bild geschoben - und hinten
       stehen Postfach, Schule und Profil. Jetzt darf er kuerzen; „Klassenb…"
       sagt immer noch, wo man ist, ein halbes Profilbild sagt nichts. */
    .app-topbar:has(#kbx-tb) .at-title{ flex:0 1 auto; min-width:0;
      font-size:clamp(13px,3.8vw,16px);
      overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
  }
  /* Nur Desktop: Titel gibt Platz für den Chip frei. Mobil behält der Titel
     flex:1, damit Postfach + Profil rechts außen bleiben. */
  @media (min-width:900px){
    .app-topbar:has(#kbx-tb) .at-title{ flex:0 0 auto; }
  }
  /* Derselbe Handgriff fuer den Kalender-Zeitraum (2.93.0): er haengt neben
     "Kalender" und braucht denselben Platz-Verzicht des Titels. Anders als
     der Klassen-Chip bleibt er AUCH mobil stehen - "welche Woche sehe ich"
     ist dort die wichtigste Angabe der ganzen Seite, und die eigene Zeile
     dafuer ist gerade weggefallen. */
  .app-topbar:has(#kal-tb) .at-title{ flex:0 1 auto; min-width:0;
    overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
  #kal-tb{ margin-left:12px; }
  .kbx-kpi{ font-size:var(--fs-sm); color:var(--muted); min-width:0; }
  .kbx-acts{ margin-left:auto; display:flex; gap:var(--s-1); flex-wrap:wrap; }

  /* ===== ZEITRAUM-WAEHLER – EIN KASTEN (v2.331.0, vorher v2.144.0) =========
     BIS v2.330.0 STANDEN HIER ZWEI FASSUNGEN: `.kbz-band` (ab 641 px: Jahr,
     zwei Reiter, "Gesamt" nebeneinander) und `.kbz-kasten` (bis 640 px: EIN
     Knopf). Sie sind zu EINER geworden – der Kasten gilt jetzt auf jeder
     Breite, das Band ist ersatzlos weg (Wunsch Murat 18.08.2026: „tek acilir
     kutu"). Damit entfaellt auch die Umschaltregel in der schmalen
     Media-Regel; wer sie wieder einbaut, blendet den einzigen Waehler aus.

     `.kbz-jahr` / `.kbz-reiter` / `.kbz-ges` leben weiter, aber INNERHALB des
     Menues (.kbz-menu): Jahr oben als Chip-Reihe, darunter die drei
     Zeitraeume als volle Zeilen mit ihrer Datumsspanne. */
  .kbz-kasten{ display:flex; flex:none; align-items:center; min-width:0; }
  .kbz-kbtn{ display:inline-flex; align-items:center; gap:var(--s-1); flex:none; font:inherit;
    font-size:var(--fs-xs); font-weight:800; cursor:pointer; border-radius:var(--r-control); padding:var(--s-1) var(--s-3);
    border:1px solid var(--zc,var(--brand)); background:var(--brand-soft);
    color:var(--brand); }
  .kbz-kbtn svg{ width:12px; height:12px; fill:none; stroke:currentColor; stroke-width:2.6;
    stroke-linecap:round; stroke-linejoin:round; }
  /* Das Menue selbst. `position`/`left`/`top` setzt das JS beim Oeffnen -
     hier steht nur, wie es aussieht und wie breit es hoechstens wird. */
  .kbz-menu{ position:fixed; z-index:9500; background:var(--card); border:1px solid var(--line);
    border-radius:var(--r-card); box-shadow:var(--e-2);
    padding:var(--s-2); min-width:246px; max-width:88vw;
    max-height:min(72vh,540px); overflow-y:auto; }
  .kbz-menu-t{ font-size:var(--fs-2xs); font-weight:800; color:var(--muted); letter-spacing:.05em;
    text-transform:uppercase; padding:var(--s-1) var(--s-2) var(--s-1); }
  .kbz-menu-jahre{ display:flex; flex-wrap:wrap; gap:var(--s-1); padding:0 var(--s-1) var(--s-2); }
  .kbz-menu-zr{ display:flex; flex-direction:column; gap:var(--s-1); padding:0 var(--s-1) var(--s-1); }
  .kbz-jahr, .kbz-reiter, .kbz-ges{ font:inherit; font-size:var(--fs-sm);
    font-weight:700; cursor:pointer; border-radius:var(--r-control); padding:var(--s-1) var(--s-3);
    border:1px solid var(--line); background:var(--card); color:var(--muted);
    transition:background .12s, color .12s, border-color .12s; }
  .kbz-jahr{ display:inline-flex; align-items:center; gap:var(--s-1); font-size:var(--fs-xs); flex:none; }
  .kbz-jahr:hover, .kbz-reiter:hover, .kbz-ges:hover{ color:var(--ink); border-color:var(--ink); }
  /* Das gewaehlte JAHR ist ein Filter im Menue, noch keine Ansicht - deshalb
     traegt es nur einen kraeftigen Rand, keine gefuellte Flaeche. Gefuellt
     ist unten nur der Zeitraum, der wirklich auf dem Bildschirm steht. */
  .kbz-jahr.an{ color:var(--ink); border-color:var(--zc,var(--brand));
    box-shadow:0 0 0 1px var(--zc,var(--brand)) inset; }
  /* Die Zeitraum-Zeilen: Name oben, Datumsspanne darunter. Ohne die Spanne
     laesst sich nicht pruefen, ob die Grenzen richtig liegen. */
  .kbz-reiter, .kbz-ges{ display:flex; flex-direction:column; align-items:flex-start;
    gap:1px; text-align:left; padding:var(--s-2) var(--s-3); }
  .kbz-reiter b, .kbz-ges b{ font-size:var(--fs-sm); font-weight:700; }
  .kbz-reiter small, .kbz-ges small{ font-size:var(--fs-2xs); font-weight:600; opacity:.8; }
  /* Der aktive Zeitraum traegt die KLASSENFARBE (--zc, aus kbClassColor). Eine
     eigene Farbe fuer Zeitraeume waere eine zweite Bedeutung und wuerde die
     erste entwerten. */
  .kbz-reiter.an{ background:var(--zc,var(--brand)); border-color:var(--zc,var(--brand));
    color:var(--card); }
  .kbz-reiter.an:hover{ color:var(--card); }
  /* "Gesamt" ist KEIN Halbjahr, sondern die Aufhebung der Grenze im Jahr -
     deshalb gestrichelt und nicht wie ein Reiter geformt. */
  .kbz-ges{ border-style:dashed; font-weight:600; }
  .kbz-ges.an{ border-style:solid; background:var(--brand-soft);
    color:var(--brand); border-color:transparent; }
  /* Im Verwalten-Schubfach steht die Gruppe "Im Unterricht" nur auf schmalen
     Schirmen - auf Tablet und Computer sind dieselben Knoepfe oben (v2.56.0). */
  .kbv-grp.kbv-nurschmal{ display:none; }
  /* Seit v2.355.0 auch je EINTRAG: die Gruppe „Im Unterricht" ist überall
     sichtbar (wegen „Namen kurz/voll"), ihre drei anderen Einträge stehen
     aber oben in der Kopfzeile und dürfen hier nicht doppelt erscheinen. */
  .kbv-item.kbv-nurschmal{ display:none; }

  /* Ein Punkt am Zeitraum sagt „hier ist noch nichts" - ohne einen Satz in den
     Arbeitsbereich zu legen (v2.146.0). Er ist bewusst KEIN Rot: es ist
     nichts kaputt, es ist nur nichts da. */
  .kbz-leerpunkt{ display:inline-block; width:5px; height:5px; border-radius:50%;
    background:currentColor; opacity:.45; margin-left:6px; vertical-align:2px; }
  .kbz-reiter.an .kbz-leerpunkt{ opacity:.7; }

  /* ===== DIE SPERRE (v2.331.0) ============================================
     Sie erscheint, wenn jemand in einem vergangenen oder kuenftigen Zeitraum
     etwas eintragen will. MITTE DES BILDSCHIRMS, nicht unten am Rand: Eine
     Meldung, die eine Handlung verhindert, muss dort stehen, wo man gerade
     hinsieht, und warten, bis man sie weggeklickt hat. Der Vorgaenger war
     ein `toast` – unten, sechs Sekunden, und das Fenster ging trotzdem auf.
     MIT WEM: kbZeitraumSperreZeigen (index-app.js). */
  .kbz-sperre{ position:fixed; inset:0; z-index:9600; display:flex;
    align-items:center; justify-content:center; padding:var(--s-4);
    background:rgba(20,28,45,.55); }
  .kbz-sperre-box{ background:var(--card); border-radius:var(--r-card);
    box-shadow:var(--e-3); padding:var(--s-5); max-width:420px; width:100%; }
  .kbz-sperre-t{ font-size:var(--fs-lg); font-weight:800; color:var(--ink);
    margin-bottom:var(--s-2); }
  .kbz-sperre-tx{ font-size:var(--fs-sm); color:var(--muted); line-height:1.55;
    margin:0 0 var(--s-4); }
  .kbz-sperre-tx b{ color:var(--ink); }
  .kbz-sperre-btns{ display:flex; gap:var(--s-2); }
  .kbz-sperre-btns .btn{ flex:1; margin:0; }
  /* "Schüler hinzufügen" bei einer noch leeren Klasse - derselbe Knopf wie
     unter der Liste, nur ohne Tabelle darueber. */
  .kbx-leeradd{ margin-top:var(--s-3); }
  .kbx-leeradd .kbx-addbtn{ width:auto; border:1px dashed var(--line);
    border-radius:var(--r-control); padding:var(--s-2) var(--s-4); }
  .kbx-act{ display:inline-flex; align-items:center; height:34px; padding:0 var(--s-2);
    border:1.5px solid var(--line); border-radius:var(--r-control); background:var(--card); color:var(--muted);
    cursor:pointer; font:inherit; font-size:var(--fs-xs); font-weight:700; overflow:hidden;
    transition:border-color .15s, color .15s, box-shadow .15s; }
  .kbx-act svg{ width:17px; height:17px; flex:none; fill:none; stroke:currentColor; stroke-width:2;
    stroke-linecap:round; stroke-linejoin:round; }
  /* DIE BESCHRIFTUNG BLEIBT STEHEN (v2.355.0, Anweisung Murat 20.08.2026:
     „diger kalanlarida text olarak yaz ya. su an ne oldugu anlasilmiyo …
     acik kalsin hep").
     Bis hierher klappte sie erst bei Hover auf. Das hat zwei Dinge kaputt
     gemacht, die man nicht sieht, wenn man die Knöpfe selbst gebaut hat:
     Am TABLET gibt es kein Hover - dort blieben es sieben namenlose Zeichen,
     dauerhaft. Und am Computer musste man jeden Knopf einzeln anfahren, um
     die Leiste zu LESEN; das ist Suchen, nicht Bedienen.
     Damit die Zeile trotzdem passt, sind „Gewichtung" und „Namen kurz/voll"
     ins Schubfach gewandert (kbxHeadBar). */
  .kbx-act .kbx-actlbl{ white-space:nowrap; margin-left:6px; }
  .kbx-act:hover, .kbx-act:focus-visible, .kbx-act.on{ border-color:var(--ac,var(--brand));
    color:var(--ac,var(--brand)); box-shadow:0 0 0 1px var(--ac,var(--brand)) inset; }
  .kbx-act:active{ transform:scale(.95); }
  /* Analyse-Knopf (v2.226.0): `kbx-an` = Karte ist offen, sieht aus wie
     gedrückt. `kbx-punkt` ersetzt den Text „Noten geändert – veraltet", der
     im alten breiten Balken rechts abgeschnitten wurde - der Punkt kann das
     nicht, weil er im Knopf sitzt. */
  .kbx-act.kbx-an{ border-color:var(--ac,var(--brand)); color:var(--ac,var(--brand));
    box-shadow:0 0 0 1px var(--ac,var(--brand)) inset; }
  .kbx-act .kbx-punkt{ width:7px; height:7px; border-radius:var(--r-pill); flex:none;
    background:var(--amber); margin-left:5px; }

  .kbx-tablewrap{ overflow-x:auto; -webkit-overflow-scrolling:touch; margin-top:2px; }
  .kbx-table{ width:100%; border-collapse:separate; border-spacing:0; }
  .kbx-table th{ font-size:var(--fs-2xs); font-weight:700; color:var(--muted); text-align:left;
    padding:var(--s-2) var(--s-2); border-bottom:1px solid var(--line); white-space:nowrap; }
  .kbx-table td{ padding:var(--s-2); font-size:var(--fs-sm); border-bottom:1px solid var(--line); white-space:nowrap; }
  .kbx-table tr:last-child td{ border-bottom:none; }
  .kbx-row{ cursor:pointer; transition:filter .2s ease, opacity .2s ease, background .15s; }
  /* ZEBRASTREIFEN (v2.142.0): jede zweite Zeile bekommt einen Hauch Themenfarbe.
     DREI DINGE, DIE HIER NICHT ZUFAELLIG SO SIND:
     1) REIHENFOLGE. Diese Regel steht ABSICHTLICH VOR `:hover` und `.open` -
        alle drei haben dieselbe Spezifitaet (0,2,1), also entscheidet die
        Position in der Datei. Waer sie weiter unten, gaebe es auf jeder
        zweiten Zeile keine Hover-Anzeige mehr.
     2) NICHT `nth-child`. Zwischen den Schuelerzeilen steht bei geoeffneter
        Zeile ein `.kbx-panelrow` - `nth-child` wuerde ab da falsch zaehlen und
        das Muster beim Aufklappen springen lassen. Die Klasse setzt deshalb
        das JS aus dem SCHUELER-Index (kbxClassTable).
     3) EIGENE TOENE STATT `--paper`. `--paper` ist die Hover-Farbe; als
        Zebraton waere der Unterschied weg. Hell: eine Spur kuehler als Weiss.
        Dunkel: eine Spur heller als `--card` (#1B2230) - im dunklen Design
        ist `--paper` DUNKLER als die Karte, ein "helleres Grau" gibt es dort
        also nicht zu erben. */
  /* Grundtoene ohne Flaechenfarbe. Waehlt die Lehrkraft eine, ueberschreibt
     der Abschnitt „Akzent aus der Flaechenfarbe" am Dateiende beide Zeilen -
     dort steht die vollstaendige Liste, hier nur der Rueckfall. */
  .kbx-row.kbx-zebra td{ background:color-mix(in srgb, var(--brand) 3%, var(--card)); }
  html[data-theme="dark"] .kbx-row.kbx-zebra td{ background:#1F2739; }
  @media (prefers-color-scheme: dark){
    html:not([data-theme="light"]) .kbx-row.kbx-zebra td{ background:#1F2739; }
  }
  /* ===== SCHUELERPROFIL: DIE REITER (N4, v2.160.0) ======================
     Aufbau des Profils von oben: Kopf, Noten-Trend, diese vier Reiter.
     Gebaut in kbBuildProfilReiter() (static/js/index-app.js).

     DIE FACH-KARTEN `.kbp-fachchip*` UND IHR KASTEN `.kbp-fachueber` SIND
     WEG (v2.357.0). Sie zeigten „Gewichtete Endnote je Fach" unter dem
     Trend - dieselbe Fach-Liste, die als `.kb-fachchip` ohnehin ganz oben
     im Profil steht und dort auch die Navigation ist. Zwei Fach-Listen
     uebereinander, und die untere wiederholte die obere.

     WARUM DIE FARBEN INLINE KOMMEN UND NICHT HIER STEHEN: Der Rechenweg
     traegt die Farbe SEINER Note (zensurFarbe). Eine Klasse je Note waere
     eine zweite Notenfarben-Tabelle neben der in JavaScript - und die
     beiden liefen bei der naechsten Aenderung auseinander. Hier steht nur,
     was unabhaengig von der Note gilt: Form, Abstand, Schrift. */
  .kbp-tabs{ display:flex; gap:var(--s-1); border-bottom:1px solid var(--line); margin-bottom:var(--s-3); }
  .kbp-tab{ flex:1 1 0; min-width:0; border:0; background:none; font:inherit; font-size:var(--fs-sm);
    font-weight:700; color:var(--muted); padding:var(--s-2) var(--s-2); cursor:pointer;
    border-bottom:2.5px solid transparent; white-space:nowrap; border-radius:var(--r-control) var(--r-control) 0 0;
    overflow:hidden; text-overflow:ellipsis; }
  .kbp-tab:hover{ background:var(--paper); color:var(--text); }
  .kbp-tab.an{ color:var(--brand); border-bottom-color:var(--brand); background:var(--paper); }
  .kbp-rechenweg{ margin-top:var(--s-3); border:1px solid var(--line); background:none; font:inherit;
    font-size:var(--fs-xs); font-weight:700; border-radius:var(--r-control); padding:var(--s-1) var(--s-3); cursor:pointer; }
  @media (max-width:640px){
    /* Vier Reiter passen auf einem Handy nicht nebeneinander. Sie brechen
       aber NICHT um (dann waechst das Profil nach unten), sondern werden zu
       einer schiebbaren Spur - der einzige Fall, in dem Schieben richtig
       ist: Es ist ein Bedienelement in EINER Zeile, keine Kopfzeile mit
       Knoepfen (vgl. v2.99.7, .foerder-head). */
    .kbp-tabs{ overflow-x:auto; -webkit-overflow-scrolling:touch; scrollbar-width:none; }
    .kbp-tabs::-webkit-scrollbar{ display:none; }
    .kbp-tab{ flex:0 0 auto; font-size:var(--fs-sm); padding:var(--s-2) var(--s-3); }
  }
  .kbx-row:hover td{ background:var(--paper); }
  .kbx-row.open td{ background:color-mix(in srgb, var(--brand) 6%, var(--card)); border-bottom-color:transparent; }
  .kbx-row.open td:first-child{ border-top-left-radius:14px; }
  .kbx-row.open td:last-child{ border-top-right-radius:14px; }
  .kbx-row.blur{ filter:blur(1.6px); opacity:.5; }
  .kbx-panelrow td{ background:color-mix(in srgb, var(--brand) 6%, var(--card)); white-space:normal;
    border-bottom-left-radius:14px; border-bottom-right-radius:14px; }
  /* "+ Schüler hinzufügen" als LETZTE Zeile der Liste (v2.142.0). Der Weg
     ueber "Verwalten" bleibt - das hier ist ein zweiter Zugang an der Stelle,
     an der man den Wunsch hat: unter dem letzten Kind. Bewusst leise
     (gestrichelt, grau), damit es die Namen nicht ueberstrahlt. */
  .kbx-addrow td{ padding:0; border-bottom:none; }
  .kbx-addbtn{ display:flex; align-items:center; gap:var(--s-2); width:100%; border:none;
    background:none; font:inherit; font-size:var(--fs-sm); font-weight:700; color:var(--muted);
    padding:var(--s-2) var(--s-2); cursor:pointer;
    transition:color .15s, background .15s; }
  .kbx-addbtn:hover{ color:var(--brand); background:var(--paper); }
  .kbx-addbtn svg{ width:15px; height:15px; flex:none; fill:none; stroke:currentColor;
    stroke-width:2.6; stroke-linecap:round; }
  @keyframes kbxSlide{ from{ opacity:0; transform:translateY(-7px); } to{ opacity:1; transform:none; } }
  .kbx-panel{ animation:kbxSlide .24s ease; }
  .kbx-num{ display:inline-block; min-width:20px; color:var(--muted); font-weight:700; font-size:var(--fs-2xs); }
  /* Auge hinter einem gekürzten Namen (§6.13): deckt GENAU diesen Namen auf.
     Bewusst blass und klein – in einer 28-Zeilen-Liste darf es kein Schaltpult
     werden. Auf Touch-Geräten bleibt es sichtbar (kein Hover), deshalb wird die
     Deckkraft nur beim Hover erhöht, nie auf 0 gesetzt. */
  .name-auge{ display:inline-flex; align-items:center; justify-content:center;
    vertical-align:middle; margin-left:5px; padding:1px; border:0; background:none;
    color:var(--muted); opacity:.42; cursor:pointer; line-height:0; border-radius:5px; }
  .name-auge:hover{ opacity:1; color:var(--brand); background:var(--paper); }
  .name-auge:focus-visible{ opacity:1; outline:2px solid var(--brand); outline-offset:1px; }
  @media print{ .name-auge{ display:none !important; } }
  .kbx-starpill{ display:inline-flex; align-items:center; gap:3px; background:var(--amber-soft);
    border:1px solid var(--amber-line); color:var(--amber-ink); border-radius:var(--r-pill); padding:2px var(--s-2);
    font-size:var(--fs-2xs); font-weight:800; cursor:pointer; }
  .kbx-starpill:hover{ border-color:var(--amber); }
  .kbx-act.primary{ background:var(--brand); border-color:var(--brand); color:var(--card); }
  .kbx-act.primary:hover{ background:var(--brand-dk); border-color:var(--brand-dk); color:var(--card); box-shadow:none; }
  /* Mobil: alles muss OHNE Seitwärts-Scrollen passen – 3. Fach-Spalte, "+N"
     und Sterne-Spalte ausblenden, Abstände/Schrift kompakter. */
  @media (max-width:600px){
    .kbx-table{ min-width:0; }
    .kbx-table th, .kbx-table td{ padding:var(--s-2) var(--s-1); font-size:var(--fs-xs); }
    .kbx-c3, .kbx-cplus, .kbx-cstar{ display:none; }
    .kbx-note{ min-width:18px; height:18px; font-size:var(--fs-3xs); }
    .kbx-panel{ padding:var(--s-2) var(--s-3); gap:var(--s-2); }
    .kbx-head{ gap:var(--s-2); }
    .kbx-chip{ padding:var(--s-1) var(--s-3); font-size:var(--fs-sm); }
    .kbx-kpi{ font-size:var(--fs-2xs); }
    .kbx-act{ height:31px; padding:0 var(--s-2); }
    .kbx-act svg{ width:15px; height:15px; }
    .kbx-acts{ gap:var(--s-1); }
  }
  .kbx-note{ display:inline-flex; align-items:center; justify-content:center; min-width:20px; height:20px;
    color:var(--card); border-radius:var(--r-control); font-weight:800; font-size:var(--fs-2xs); padding:0 var(--s-1); }
  /* Fach-Spalten mittig – gleichmäßig verteilt, wächst sauber mit jedem neuen Fach.
     Name-Spalte bleibt links, Sterne rechts. */
  .kbx-table th.kbx-cfach, .kbx-table td.kbx-cfach{ text-align:center; }
  .kbx-table th.kbx-cstar, .kbx-table td.kbx-cstar{ text-align:right; }
  .kbx-table th:first-child, .kbx-table td:first-child{ text-align:left; }
  /* Viele Fach-Spalten: kompakter, aber ALLE sichtbar (nie verstecken). */
  .kbx-table.kbx-many th, .kbx-table.kbx-many td{ font-size:var(--fs-2xs); padding:var(--s-2) var(--s-1); }
  .kbx-table.kbx-many .kbx-note{ min-width:17px; height:17px; font-size:var(--fs-3xs); padding:0 var(--s-1); }
  /* Kritische Fach-Zellen: kein roter Hintergrund mehr – die rote Noten-
     Plakette (5/6) reicht als Signal. */
  .kbx-crit{ background:transparent; }
  /* Profil-Karte im Fokus-Panel: DER Blickfang rechts (statt Sterne-Karte). */
  .kbx-profcard{ flex:none; display:flex; flex-direction:column; align-items:center; gap:3px;
    padding:var(--s-3) var(--s-4); border-radius:var(--r-card); cursor:pointer; font:inherit;
    border:1.5px solid transparent;
    background:linear-gradient(var(--card),var(--card)) padding-box,
      linear-gradient(135deg,#2E5BFF,#7A5AF8,#D4537E) border-box;
    transition:transform .13s ease, box-shadow .13s ease; }
  .kbx-profcard:hover{ transform:translateY(-2px); box-shadow:0 8px 20px rgba(46,91,255,.20); }
  .kbx-profcard:active{ transform:scale(.97); }
  .kbx-profcard .kbx-pem{ font-size:var(--fs-2xl); line-height:1; filter:drop-shadow(0 2px 3px rgba(0,0,0,.20)); }
  .kbx-profcard .kbx-plb{ display:flex; align-items:center; gap:var(--s-1); font-size:var(--fs-xs); font-weight:800;
    background:linear-gradient(90deg,#2E5BFF,#7A5AF8); -webkit-background-clip:text;
    background-clip:text; color:transparent; white-space:nowrap; }
  /* Schmale Ansicht: Panel-Inhalte stapeln sich -> Aktions-Icons und die
     Profil-Karte MITTIG zeigen. Ab Tablet/Desktop (Karte sitzt rechts)
     bleibt das bisherige Layout unverändert. */
  @media (max-width:760px){
    .kbx-actrow{ justify-content:center; }
    .kbx-profcard{ margin-left:auto; margin-right:auto; }
  }
  .kbx-kichip{ display:inline-flex; align-items:center; gap:var(--s-1); border-radius:var(--r-pill);
    padding:2px var(--s-2); font-size:var(--fs-2xs); font-weight:800; margin:var(--s-1) var(--s-1) 0 0; }
  .kbx-plusfach{ color:var(--brand) !important; cursor:pointer; }
  .kbx-plusfach:hover{ text-decoration:underline; }
  .kbx-stars{ color:var(--amber-ink); font-weight:800; text-align:right; }
  .kbx-panel{ background:var(--card); border:1px solid var(--line); border-radius:var(--r-control);
    padding:var(--s-3) var(--s-3); display:flex; gap:var(--s-3); align-items:center; flex-wrap:wrap; cursor:default; }
  .kbx-qa{ display:inline-flex; align-items:center; gap:var(--s-1); border:1px solid var(--line);
    border-radius:var(--r-control); padding:var(--s-1) var(--s-3); font:inherit; font-size:var(--fs-xs); font-weight:600;
    color:var(--ink); background:var(--card); cursor:pointer; }
  .kbx-qa svg{ width:14px; height:14px; fill:none; stroke:currentColor; stroke-width:2;
    stroke-linecap:round; stroke-linejoin:round; }
  .kbx-qa:hover{ border-color:var(--brand); color:var(--brand); }
  .kbx-starcard{ flex:none; background:var(--amber-soft); border:1px solid var(--amber-line); border-radius:var(--r-control);
    padding:var(--s-2) var(--s-3); text-align:center; min-width:96px; }
  /* Erweiterte Aktionen (Excel/Fächer/Freigeben/Umbenennen): nur Desktop sichtbar,
     mobil wandern sie ins "…"-Menü, damit die Kopfzeile nicht umbricht. */
  @media (max-width:760px){ .kbx-act.kbx-ext{ display:none; } }
  .kbx-fbrow{ display:flex; align-items:center; gap:var(--s-2); font-size:var(--fs-2xs); margin-bottom:var(--s-1); }
  /* Fachname: NIE abschneiden – breitere Spalte, lange Namen brechen um. */
  .kbx-fbrow .kbx-fbname{ width:90px; flex:none; color:var(--muted); font-weight:600;
    white-space:normal; line-height:1.2; overflow-wrap:anywhere; hyphens:auto; }
  .kbx-fbtrack{ flex:1; height:7px; background:var(--paper); border-radius:var(--r-pill); overflow:hidden; }
  .kbx-fbfill{ height:100%; border-radius:var(--r-pill); }
  .kbx-fbpct{ width:34px; flex:none; text-align:right; font-weight:800; }

  /* ===== SCHÜLER-KACHELRASTER (Klassenansicht) ===== */
  .kb-stud-grid{ display:grid; grid-template-columns:repeat(auto-fill, minmax(96px, 1fr));
    gap:var(--s-2); margin-top:var(--s-1); }
  .kb-stud-tile{ display:flex; flex-direction:column; align-items:center; gap:var(--s-1);
    padding:var(--s-3) var(--s-1); border:1.5px solid var(--line); border-radius:var(--r-card); background:var(--card);
    cursor:pointer; text-align:center; transition:border-color .12s, transform .08s; }
  .kb-stud-tile:hover{ border-color:var(--brand); }
  .kb-stud-tile:active{ transform:scale(.97); }
  .kb-stud-ava{ width:42px; height:42px; border-radius:50%; color:var(--card); font-weight:800;
    font-size:var(--fs-md); display:flex; align-items:center; justify-content:center; flex:none; }
  .kb-stud-name{ font-weight:700; font-size:var(--fs-sm); line-height:1.15; max-width:100%;
    overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
  .kb-stud-stat{ font-size:var(--fs-2xs); color:var(--muted); line-height:1.2; }
  @media (max-width:480px){
    .kb-stud-grid{ grid-template-columns:repeat(auto-fill, minmax(82px, 1fr)); gap:var(--s-1); }
    .kb-stud-ava{ width:38px; height:38px; font-size:var(--fs-sm); }
    .kb-stud-name{ font-size:var(--fs-2xs); }
  }

  /* ---- Klassenbericht-Modal: Akkordeons + Schüler-Auswahl ---- */
  .kbr-acc{ border:1px solid var(--line); border-radius:var(--r-card); overflow:hidden; margin-bottom:var(--s-3); background:var(--card); }
  /* Solange das Zeitraum-Menü offen ist: nicht abschneiden (overflow:hidden
     würde das Dropdown im kleinen Akkordeon kappen). */
  .kbr-acc.menu-open{ overflow:visible; }
  .kbr-acc.acc-zeit{ border-color:#D7E0FF; }
  .kbr-acc.acc-fach{ border-color:#FFE1C2; }
  .kbr-acc.acc-schueler{ border-color:#CFEBDD; }
  .kbr-acc-head{ display:flex; align-items:center; gap:var(--s-3); width:100%; border:none; background:transparent;
    padding:var(--s-4) var(--s-4); cursor:pointer; font-family:inherit; font-weight:700; font-size:var(--fs-md); color:var(--ink); text-align:left; }
  .acc-zeit .kbr-acc-head{ background:#F3F6FF; }
  .acc-fach .kbr-acc-head{ background:#FFF6EE; }
  .acc-schueler .kbr-acc-head{ background:#F0FAF4; }
  .kbr-acc-head .kbr-chev{ margin-left:auto; transition:transform .18s ease; color:var(--muted); flex:none; }
  .kbr-acc.open .kbr-chev{ transform:rotate(180deg); }
  .kbr-acc-badge{ font-size:var(--fs-2xs); font-weight:700; color:var(--card); border-radius:var(--r-pill); padding:2px var(--s-2); flex:none; }
  .acc-zeit .kbr-acc-badge{ background:#3B62F6; }
  .acc-fach .kbr-acc-badge{ background:#E8890C; }
  .acc-schueler .kbr-acc-badge{ background:#17A05A; }
  .kbr-acc-body{ display:none; padding:var(--s-4) var(--s-4) var(--s-4); }
  .kbr-acc.open .kbr-acc-body{ display:block; }
  /* Zeitraum-Auswahl (Dropdown-Pill) */
  .kbr-zsel{ position:relative; z-index:1; }
  /* Menü offen -> ganzer Auswahlbereich über die Datumsfelder heben
     (native <input type=date> erzeugen sonst einen eigenen Stacking-
     Context und verdecken das Dropdown). */
  .kbr-zsel.menu-open{ z-index:60; }
  /* Solange das Zeitraum-Menü offen ist, werden die darunterliegenden Felder
     (Von/Bis-Datum, Eigener-Text) ausgeblendet. Native <input type=date>
     erzeugen sonst einen eigenen Stacking-Context und überdecken das Dropdown
     trotz hohem z-index. Beim Schließen werden sie sofort wieder sichtbar. */
  .kbr-menu-open-below #kbr-daterow,
  .kbr-menu-open-below #kbr-zfrei{ visibility:hidden; }
  .kbr-zpill{ display:inline-flex; align-items:center; gap:var(--s-2); border:1.5px solid var(--line); background:var(--card);
    border-radius:var(--r-pill); padding:var(--s-2) var(--s-4); font:inherit; font-weight:700; font-size:var(--fs-sm); color:var(--ink); cursor:pointer; }
  .kbr-zpill:hover{ border-color:var(--brand); }
  /* Kompakt: enge Zeilen + kleine Schrift, damit das Menü auch im kleinen
     Akkordeon-Bereich vollständig sichtbar bleibt. */
  .kbr-zmenu{ display:none; position:absolute; top:calc(100% + 4px); left:0; z-index:60; background:var(--card);
    border:1px solid var(--line); border-radius:var(--r-control); box-shadow:0 12px 34px rgba(20,28,45,.16); padding:3px; min-width:170px; }
  .kbr-zmenu.open{ display:block; }
  .kbr-zopt{ display:block; width:100%; text-align:left; border:none; background:transparent; font:inherit; font-size:var(--fs-sm);
    padding:var(--s-1) var(--s-2); border-radius:var(--r-control); cursor:pointer; color:var(--ink); line-height:1.35; }
  .kbr-zopt:hover{ background:var(--brand-soft); }
  .kbr-zopt.sel{ background:var(--brand-soft); font-weight:700; }
  /* Schüler-Grid: 4 pro Reihe, responsiv kleiner, bei Enge untereinander */
  .kbr-stgrid{ display:grid; grid-template-columns:repeat(4, minmax(0,1fr)); gap:var(--s-2); }
  @media (max-width:560px){ .kbr-stgrid{ grid-template-columns:repeat(3, minmax(0,1fr)); } }
  @media (max-width:420px){ .kbr-stgrid{ grid-template-columns:repeat(2, minmax(0,1fr)); } }
  .kbr-stchip{ display:flex; align-items:center; gap:var(--s-2); border:1.5px solid var(--line); border-radius:var(--r-control);
    padding:var(--s-2) var(--s-2); cursor:pointer; background:var(--card); font-size:var(--fs-sm); color:var(--ink); min-width:0; transition:border-color .12s, background .12s; }
  .kbr-stchip:hover{ border-color:color-mix(in srgb, var(--brand) 45%, var(--card)); }
  .kbr-stchip.sel{ border-color:var(--ok); background:var(--ok-soft); }
  .kbr-stchip .kbr-stname{ overflow:hidden; text-overflow:ellipsis; white-space:nowrap; font-weight:600; min-width:0; }
  .kbr-stchip .kbr-stbox{ width:16px; height:16px; border-radius:5px; border:1.6px solid color-mix(in srgb, var(--muted) 45%, var(--card)); flex:none;
    display:flex; align-items:center; justify-content:center; }
  .kbr-stchip.sel .kbr-stbox{ background:var(--ok); border-color:var(--ok); }
  .kbr-stchip.sel .kbr-stbox svg{ display:block; }
  .kbr-stchip .kbr-stbox svg{ display:none; width:11px; height:11px; }

  /* Klassenüberblick + Fragen-Statistik: breite Ansicht nebeneinander, mobil untereinander */
  .kb-two-col{ display:grid; grid-template-columns:1fr; gap:var(--s-3); align-items:start; margin-bottom:var(--s-3); }
  .kb-two-col > div{ margin-bottom:0 !important; }
  @media (min-width:900px){ .kb-two-col{ grid-template-columns:repeat(2, minmax(0,1fr)); } }

  /* ===== BELOHNUNGSTAFEL (Sterne-System) ===== */
  #belohnung-ov{position:fixed;inset:0;z-index:600;background:rgba(20,28,48,.5);display:none;overflow-y:auto;padding:0;}
  #belohnung-ov.show{display:block;}
  .bel-sheet{max-width:1180px;margin:0 auto;min-height:100%;background:linear-gradient(160deg,#FFF9EC,#FFF3F6 60%,#F0F7FF);}
  .bel-top{position:sticky;top:0;z-index:2;background:rgba(255,255,255,.86);backdrop-filter:blur(8px);border-bottom:1px solid var(--line);
    display:flex;align-items:center;gap:12px;padding:14px 18px;padding-top:calc(14px + env(safe-area-inset-top,0px));}
  .bel-top h2{margin:0;font-size:18px;font-weight:850;flex:1;}
  .bel-x{width:38px;height:38px;border-radius:11px;border:1px solid var(--line);background:var(--card);cursor:pointer;display:flex;align-items:center;justify-content:center;}
  .bel-x svg{width:18px;height:18px;stroke:var(--ink);fill:none;stroke-width:2;stroke-linecap:round;}
  .bel-body{padding:16px 16px 60px;}
  /* Pizza-Kasse: Pizza-Bild als Hintergrund links, große Sterne, Beutel-Spalte rechts */
  .bel-pizza{border-radius:18px;padding:18px;margin-bottom:16px;position:relative;overflow:hidden;box-shadow:0 8px 24px rgba(245,166,35,.22);
    background-image:url('/static/images/pizza.png'),linear-gradient(135deg,#FFE8B0,#FFD27A);
    background-repeat:no-repeat,no-repeat;background-position:left 7% center,center;background-size:130px auto,cover;
    min-height:170px;}
  .bel-pizza.party{background-image:url('/static/images/pizza.png'),linear-gradient(135deg,#B6F7C1,#7BE0A0);}
  .bel-pizza h3{margin:0 0 4px;font-size:16px;font-weight:850;color:#7a4a00;}
  .bel-pizza .bp-stars{display:flex;gap:6px;flex-wrap:wrap;justify-content:center;}
  .bel-pizza .bp-stars svg{width:38px;height:38px;filter:drop-shadow(0 2px 4px rgba(122,74,0,.25));}
  .bel-pizza-main{display:flex;align-items:center;gap:12px;padding:8px 52px 8px 190px;min-height:150px;}
  .bel-beutel-col{display:flex;flex-direction:column;gap:7px;align-items:stretch;flex:none;}
  .bel-beutel-btn{display:flex;align-items:center;gap:9px;border-radius:12px;padding:5px 11px;cursor:pointer;font:inherit;font-weight:800;font-size:12.5px;background:rgba(255,255,255,.82);}
  .bel-beutel-btn:hover{background:#fff;}
  .bel-beutel-btn svg{width:15px;height:15px;fill:#F5A623;stroke:#E6A700;stroke-width:1;flex:none;}
  .bel-ico-btn{position:absolute;width:42px;height:42px;border-radius:12px;border:1px solid rgba(122,74,0,.28);background:rgba(255,255,255,.78);cursor:pointer;display:flex;align-items:center;justify-content:center;padding:0;z-index:2;}
  .bel-ico-btn:hover{background:#fff;}
  .bel-ico-btn svg{width:24px;height:24px;stroke:#7a4a00;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;}
  @media (max-width:600px){
    .bel-pizza{background-size:88px auto,cover;background-position:left 12px center,center;}
    .bel-pizza-main{padding:8px 8px 8px 104px;}
    .bel-pizza .bp-stars svg{width:28px;height:28px;}
  }
  .bel-legend{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:14px;align-items:center;}
  .bel-beutel{display:inline-flex;align-items:center;gap:6px;background:var(--card);border:1.5px solid var(--line);border-radius:12px;padding:7px 12px;font-size:13px;font-weight:800;}
  .bel-beutel svg{width:20px;height:20px;}
  .bel-cfg-btn{margin-left:auto;border:1px solid var(--line);background:var(--card);border-radius:10px;padding:7px 12px;font:inherit;font-weight:700;font-size:12.5px;cursor:pointer;color:var(--brand);}
  .bel-row{display:flex;align-items:center;gap:12px;background:var(--card);border:1px solid var(--line);border-radius:14px;padding:11px 13px;margin-bottom:9px;box-shadow:0 1px 3px rgba(20,30,60,.04);}
  .bel-ava{width:44px;height:44px;border-radius:12px;display:flex;align-items:center;justify-content:center;font-weight:800;color:#fff;flex:none;font-size:16px;}
  .bel-name{font-weight:800;font-size:15px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
  .bel-sub{font-size:11.5px;color:var(--muted);margin-top:1px;}
  .bel-starbig{display:inline-flex;align-items:center;gap:5px;font-weight:900;font-size:20px;color:#E6A700;}
  .bel-starbig svg{width:22px;height:22px;fill:#F5A623;stroke:#E6A700;stroke-width:1;}
  .bel-pm{display:flex;gap:6px;flex:none;}
  .bel-pm button{width:38px;height:38px;border-radius:11px;border:1.5px solid var(--line);background:var(--card);font-size:20px;font-weight:800;cursor:pointer;line-height:1;color:var(--ink);}
  .bel-pm button.plus{border-color:var(--ok);color:var(--ok);background:var(--ok-soft,#E4F6EC);}
  .bel-pm button.minus{border-color:var(--bad);color:var(--bad);}
  .bel-badge{display:inline-flex;align-items:center;gap:3px;font-size:10.5px;font-weight:800;border-radius:999px;padding:1px 8px;margin-left:6px;}
  /* Sterne-Akkordeon unter jeder Schülerzeile */
  .bel-acc{border:1px solid var(--line);border-top:none;border-radius:0 0 14px 14px;background:var(--paper);padding:2px 14px 10px;}
  .bel-acc .bel-starbig svg{width:16px;height:16px;}
  /* Schüler als 4er-Kachel-Raster (statt langer Zeilenliste). Klick auf eine
     Karte öffnet ein Popup mit den Sterne-Details (früherer Akkordeon-Inhalt). */
  .bel-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:10px;}
  @media(max-width:900px){.bel-grid{grid-template-columns:repeat(3,1fr);}}
  @media(max-width:640px){.bel-grid{grid-template-columns:repeat(2,1fr);}}
  @media(max-width:380px){.bel-grid{grid-template-columns:1fr;}}
  .bel-card{display:flex;flex-direction:column;min-width:0;text-align:left;
    background:var(--card);border:1px solid var(--line);border-radius:13px;padding:9px 11px 8px;cursor:pointer;
    box-shadow:0 1px 3px rgba(20,30,60,.04);transition:border-color .12s,box-shadow .12s,transform .08s;}
  .bel-card:hover{border-color:var(--brand);box-shadow:0 4px 14px rgba(46,91,255,.08);}
  .bel-card:active{transform:scale(.985);}
  .bel-card .bel-name{font-size:13.5px;}
  .bel-card .bel-starbig{font-size:16px;}
  .bel-card .bel-starbig svg{width:17px;height:17px;}
  .bel-pm.bel-pm-sm button{width:29px;height:29px;border-radius:9px;font-size:16px;}
  /* Raster (Runden x Schüler) */
  .bel-raster-wrap{margin-top:18px;overflow-x:auto;border:1px solid var(--line);border-radius:14px;background:var(--card);}
  .bel-raster{border-collapse:collapse;min-width:100%;font-size:12.5px;}
  .bel-raster th,.bel-raster td{border:1px solid var(--line);padding:7px 9px;text-align:center;white-space:nowrap;}
  .bel-raster th.n,.bel-raster td.n{position:sticky;left:0;background:var(--card);text-align:left;font-weight:700;z-index:1;}
  /* Vertikale Schülernamen im Raster-Popup (30er-Klassen bleiben kompakt) */
  .bel-raster th.vert{writing-mode:vertical-rl;transform:rotate(180deg);white-space:nowrap;max-height:140px;height:120px;padding:8px 4px;font-size:11.5px;font-weight:700;text-align:left;vertical-align:bottom;}
  .bel-raster thead th{background:var(--paper);font-weight:800;}
  .bel-raster .cell-on{color:#F5A623;font-size:15px;}
  .bel-raster .cell-off{color:var(--line);}

  /* KI-Klassenanalyse: aufklappbare Detail-Abschnitte */
  .kb-ana details{ border:1px solid var(--line); border-radius:var(--r-control); background:var(--card); margin-bottom:var(--s-2); overflow:hidden; }
  .kb-ana summary{ cursor:pointer; padding:var(--s-3) var(--s-3); font-weight:700; font-size:var(--fs-sm); list-style:none; display:flex; align-items:center; gap:var(--s-2); user-select:none; }
  .kb-ana summary::-webkit-details-marker{ display:none; }
  .kb-ana summary .ana-chev{ margin-left:auto; transition:transform .15s; color:var(--muted); flex:none; }
  .kb-ana details[open] summary .ana-chev{ transform:rotate(90deg); }
  .kb-ana .ana-inner{ padding:2px var(--s-3) var(--s-3); border-top:1px solid var(--line); }
  .kb-ana .ana-item{ background:var(--paper); border-radius:var(--r-control); padding:var(--s-2) var(--s-3); margin-top:var(--s-2); font-size:var(--fs-sm); line-height:1.5; }
     Dezent, kurz, ohne den Lernfluss zu stören. Respektiert reduzierte Bewegung. */
  @keyframes ssShake{ 0%,100%{transform:translateX(0);} 20%{transform:translateX(-7px);}
    40%{transform:translateX(6px);} 60%{transform:translateX(-4px);} 80%{transform:translateX(3px);} }
  @keyframes ssGlow{ 0%{box-shadow:0 0 0 0 rgba(21,160,90,0);} 30%{box-shadow:0 0 0 4px rgba(21,160,90,.28);}
    100%{box-shadow:0 0 0 0 rgba(21,160,90,0);} }
  @keyframes ssPop{ 0%{transform:scale(.7);opacity:0;} 50%{transform:scale(1.15);opacity:1;} 100%{transform:scale(1);opacity:1;} }
  @keyframes ssConfettiFall{ 0%{transform:translateY(-12vh) rotate(0);opacity:1;}
    100%{transform:translateY(105vh) rotate(540deg);opacity:.9;} }
  .ss-shake{ animation:ssShake .4s ease; }
  .ss-glow{ animation:ssGlow .7s ease; }
  /* Streak-Badge (3+ richtig in Folge) */
  #ss-streak{ position:fixed; top:14px; left:50%; transform:translateX(-50%); z-index:8000;
    display:none; align-items:center; gap:7px; padding:7px 15px; border-radius:999px;
    background:linear-gradient(95deg,#F5A623,#E0552E); color:#fff; font-weight:800; font-size:14px;
    box-shadow:0 6px 20px rgba(224,85,46,.35); pointer-events:none; }
  #ss-streak.show{ display:inline-flex; animation:ssPop .45s ease; }
  /* Bonus-Variante: Regenbogen-Verlauf + Schimmer-Lauf (3er-Serie -> +1 Stern) */
  #ss-streak.bonus{ background:linear-gradient(95deg,#F5A623,#E0552E,#9C27B0,#2E5BFF,#15A05A);
    background-size:300% 100%; animation:ssPop .45s ease, ssRainbowSlide 1.8s linear infinite; }
  @keyframes ssRainbowSlide{ 0%{background-position:0% 0;} 100%{background-position:300% 0;} }
  /* Goldener Rahmen ums Quiz bei aktivem Streak */
  #screen-quiz.ss-onfire{ box-shadow:0 0 0 3px rgba(245,166,35,.55),0 0 26px rgba(245,166,35,.32); }
  .ss-confetti-piece{ position:fixed; top:0; width:9px; height:14px; z-index:7999;
    pointer-events:none; will-change:transform; animation:ssConfettiFall linear forwards; }
  /* Funken der Bonus-Explosion (ssSparkleBurst) */
  .ss-sparkle{ position:fixed; width:10px; height:10px; border-radius:50%; z-index:8001;
    pointer-events:none; will-change:transform,opacity;
    animation:ssSparkleFly 1.1s cubic-bezier(.2,.7,.3,1) forwards; }
  .ss-sparkle.star-shape{ border-radius:0;
    clip-path:polygon(50% 0%,61% 35%,98% 35%,68% 57%,79% 91%,50% 70%,21% 91%,32% 57%,2% 35%,39% 35%); }
  @keyframes ssSparkleFly{
    0%{ transform:translate(-50%,-50%) scale(.4) rotate(0deg); opacity:1; }
    70%{ opacity:1; }
    100%{ transform:translate(calc(-50% + var(--sx)), calc(-50% + var(--sy))) scale(1.15) rotate(240deg); opacity:0; } }
  /* 🏆 "Neuer Rekord"-Banner (Berichts-Screen) */
  #ss-rekord{ position:fixed; top:16px; left:50%; transform:translateX(-50%) scale(.7); z-index:8002;
    display:none; align-items:center; gap:12px; padding:12px 20px; border-radius:16px;
    background:linear-gradient(120deg,#B8860B,#F5A623 45%,#FFD54F); color:#3a2a00;
    font-weight:800; font-size:15px; box-shadow:0 10px 32px rgba(245,166,35,.5); pointer-events:none;
    opacity:0; transition:opacity .35s, transform .35s cubic-bezier(.2,.9,.3,1.4); }
  #ss-rekord.show{ display:inline-flex; opacity:1; transform:translateX(-50%) scale(1); }
  #ss-rekord .rk-cup{ font-size:30px; filter:drop-shadow(0 2px 4px rgba(122,74,0,.4)); animation:rkWobble 1.1s ease infinite; }
  #ss-rekord .rk-sub{ display:block; font-weight:600; font-size:12.5px; opacity:.85; margin-top:2px; }
  @keyframes rkWobble{ 0%,100%{transform:rotate(-8deg) scale(1);} 50%{transform:rotate(8deg) scale(1.12);} }
  @media (prefers-reduced-motion: reduce){ #ss-rekord .rk-cup{ animation:none; } }
  /* Sterne-Anzeige leuchtet kurz in Regenbogenfarben beim Bonus */
  .q-stars.rainbow{ animation:qStarsRainbow 1.8s ease; }
  @keyframes qStarsRainbow{
    0%{ box-shadow:0 0 0 0 rgba(245,166,35,0); }
    25%{ box-shadow:0 0 14px 4px rgba(245,166,35,.65); }
    50%{ box-shadow:0 0 14px 4px rgba(156,39,176,.55); }
    75%{ box-shadow:0 0 14px 4px rgba(46,91,255,.55); }
    100%{ box-shadow:0 0 0 0 rgba(21,160,90,0); } }
  @media (prefers-reduced-motion: reduce){
    .ss-shake,.ss-glow,#ss-streak.show{ animation:none !important; }
    .ss-confetti-piece,.ss-sparkle{ display:none !important; }
    #ss-streak.bonus{ animation:none !important; }
    .q-stars.rainbow{ animation:none !important; }
    #screen-quiz.ss-onfire{ box-shadow:none; }
  }
  .opt:disabled{cursor:default;}
  /* Antwort-Feedback für Eingabefelder (Lueckentext/Rechnen/Offen/Zuordnung).
     Tema-bewusst: funktioniert in Hell- UND Dunkelmodus, Text bleibt lesbar. */
  .ans-ok{border-color:var(--ok)!important;border-width:2px!important;color:var(--ink)!important;
    background:var(--ok-soft)!important;background:color-mix(in srgb, var(--ok) 16%, var(--card))!important;}
  .ans-bad{border-color:var(--bad)!important;border-width:2px!important;color:var(--ink)!important;
    background:var(--bad-soft)!important;background:color-mix(in srgb, var(--bad) 16%, var(--card))!important;}
  .matchrow{display:flex;align-items:center;gap:10px;margin-bottom:10px;}
  .matchrow .lhs{flex:1;font-weight:600;font-size:15px;} .matchrow .rhs{flex:1;}
  .matchrow .arrow{color:var(--muted);font-weight:800;}
  .explain{font-size:13.5px;color:var(--muted);background:var(--paper);border-radius:11px;padding:12px 14px;margin-top:4px;}
  .explain b{color:var(--ink);}
  .ring{display:block;margin:4px auto 10px;}
  .scorelabel{text-align:center;font-size:14px;color:var(--muted);margin:0 0 18px;font-weight:600;}
  .resitem{display:flex;gap:12px;padding:13px 0;border-top:1px solid var(--line);font-size:14px;}
  .resitem:first-of-type{border-top:none;}
  .resitem .mark{width:24px;height:24px;border-radius:7px;flex:none;display:grid;place-items:center;font-size:14px;color:#fff;}
  .mark.y{background:var(--ok); } .mark.n{background:var(--bad);}
  .footernote{text-align:center;font-size:12.5px;color:var(--muted);margin-top:32px;line-height:1.6;border-top:1px solid var(--line);padding-top:16px;}
  .qr-box{text-align:center;margin:20px 0;padding:15px;background:#fff;border:1px solid var(--line);border-radius:12px;}
  .qr-box img{margin-top:10px;border:1px solid var(--line);padding:5px;background:#fff;}
  /* Gekürzter Teilen-Link mit Kopier-Button */
  .share-link-wrap{display:flex;align-items:center;gap:8px;justify-content:center;margin-bottom:12px;}
  .share-link-short{font-weight:700;color:var(--brand);font-size:14px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:62%;direction:rtl;text-align:left;}
  .mini-btn.share-copy{flex:none;display:inline-flex;align-items:center;gap:5px;}
  /* Minimal-Icon-Buttons (nebeneinander) */
  .icon-row{display:flex;gap:10px;margin-top:18px;}
  .lern-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:10px;}
  @media(max-width:520px){
    .lern-grid{grid-template-columns:repeat(3,1fr);gap:7px;}
    .lern-btn{padding:11px 9px;align-items:center;text-align:center;}
    .lern-btn span{font-size:12.5px;}
    .lern-btn small{display:none;}
  }
  .lern-btn{display:flex;flex-direction:column;align-items:flex-start;gap:3px;padding:13px 14px;border:1.5px solid var(--line);border-radius:14px;background:var(--card);color:var(--ink);font-family:inherit;cursor:pointer;text-align:left;transition:border-color .15s,background .15s,transform .08s;}
  .lern-btn:hover{border-color:var(--brand);background:var(--brand-soft);transform:translateY(-1px);}
  .lern-btn svg{width:22px;height:22px;fill:none;stroke:var(--brand);stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round;margin-bottom:4px;}
  .lern-btn span{font-weight:700;font-size:14px;}
  .lern-btn small{color:var(--muted);font-size:11.5px;}
  .icon-btn{flex:1;display:flex;flex-direction:column;align-items:center;gap:6px;padding:14px 8px;border:1.5px solid var(--line);border-radius:14px;background:var(--card);color:var(--ink);font-family:inherit;font-weight:700;font-size:13.5px;cursor:pointer;transition:transform .08s ease,border-color .15s ease,background .15s ease;}

  /* ===== QR-Seite (share) & Ergebnisse: Vollbild ohne Kopfzeile ===== */
  body[data-screen="share"] .topbar, body[data-screen="share"] .app-topbar,
  body[data-screen="results"] .topbar, body[data-screen="results"] .app-topbar{ display:none !important; }
  /* Logo-Kopf auf Editor-Seite ausblenden (aufgeräumter Fokus) */
  body[data-screen="editor"] .topbar{ display:none !important; }

  /* ===== LADE-BILDSCHIRM: SIEHT AUS WIE DAS STARTBILD (v2.737.2) =====
     Kein Kasten, kein Popup. Das Reigen-Logo + EIN Satz mittig, auf dem Grund
     des Startbilds (--paper = #F1F2F6, wie #ss-splash). Hier lag bis v2.737.1
     ein weichgezeichneter, wandernder Farbverlauf mit sieben bunten Punkten -
     Ansage Murat 15.09.2026: „en bastakini koy heryere". Zwei verschiedene
     Warteseiten hintereinander sahen aus wie zwei verschiedene Apps. */
  body[data-screen="loading"] .topbar,
  body[data-screen="loading"] .app-topbar,
  body[data-screen="loading"] #main-nav{ display:none !important; }
  body[data-screen="loading"] .wrap{ max-width:none; padding:0; }
  body[data-screen="loading"]{ background:var(--paper); }
  #screen-loading{ position:relative; z-index:1; min-height:100dvh; display:flex; align-items:center; justify-content:center;
    background:transparent; border:none; box-shadow:none; padding:24px; margin:0; }
  .load-center{ display:flex; flex-direction:column; align-items:center; gap:22px; text-align:center; max-width:min(90vw,760px); }
  #screen-loading .ss-lader{ margin:0; }
  /* Ruhigere Typografie (v2.72.0): 30 px waren fuer eine Wartemeldung eine
     Ansage. Der Vollbild-Screen bleibt fuer die Schueler-/Boot-Fluesse, aber
     er muss nicht schreien - die Lehrkraft-Erstellung laeuft ohnehin in der
     kompakten Karte (.ss-lade). */
  .load-oneline{ font-size:clamp(15px,2.4vw,21px); font-weight:850; letter-spacing:-.02em; line-height:1.3;
    color:var(--ink); text-align:center; white-space:nowrap; max-width:96vw;
    min-height:1.4em; display:flex; align-items:center; justify-content:center;
    opacity:0; transform:translateY(10px); transition:opacity .6s ease,transform .6s ease; }
  .load-oneline.show{ opacity:1; transform:none; }
  /* ===== LADEKARTE (v2.72.0) ===============================================
     Ersetzt fuer die Lehrkraft-Erstellung den Vollbild-Lade-Screen: das
     Formular bleibt sichtbar (nur abgedunkelt), die Karte steht darueber.
     Warum, steht ausfuehrlich im Block "LADEKARTE + FERTIG-BAND" in
     static/js/index-app.js. Der Vollbild-Screen darunter bleibt fuer die
     Schueler-Fluesse bestehen - dort gibt es keine Seite im Hintergrund,
     eine schwebende Karte ueber Leere waere schlechter. */
  /* ===== DIE KARTE IST KEINE KARTE MEHR (v2.540.0) ======================
     BEFUND MURAT 29.08.2026: „aufgaben yükleme sayfasi avr ya söyle olsun,
     sonucta arkaplan flu - yani o beyaz kücük sayfadan kutucuktan
     kurtulalim."

     Er hat recht, und es ist derselbe Fund wie beim Quiz-Bildschirm
     (v2.316.0, „kutu kutu olayi can sikici"): ein weisser Kasten auf einem
     ohnehin unscharfen Grund trennt nichts - er verkleinert nur die Figur,
     um die es geht. Weg ist deshalb der KASTEN, nicht der Inhalt: Titel,
     Bestellung, Maskottchen, Sprechblase und Zeit stehen unveraendert da, jetzt
     frei auf der weichgezeichneten Seite.

     DAFUER MUSS DER GRUND MEHR TRAGEN. Ohne Kasten steht der Text direkt
     auf dem Formular darunter; 2 px Unschaerfe reichten dafuer nicht. Jetzt
     14 px und etwas mehr Deckung - das Formular bleibt als Form erkennbar
     (man sieht, wo man ist), aber kein Wort davon liest mit.
     `saturate` gehoert dazu: ohne sie wirkt der Grund unter der Unschaerfe
     grau statt durchscheinend - dieselbe Begruendung wie bei der
     Fertig-Kapsel. */
  .ss-lade{ position:fixed; inset:0; z-index:9000; display:flex; align-items:center; justify-content:center;
    background:rgba(245,247,251,.62); -webkit-backdrop-filter:blur(14px) saturate(1.08);
    backdrop-filter:blur(14px) saturate(1.08); padding:20px; }
  /* Ohne Unschaerfe traegt die Deckung allein - sonst laese das Formular
     durch den Titel hindurch. Dieselbe Vorsichtsmassnahme wie bei der
     Fertig-Kapsel, und sie kostet nichts, wo die Unschaerfe da ist. */
  @supports not ((backdrop-filter:blur(2px)) or (-webkit-backdrop-filter:blur(2px))){
    .ss-lade{ background:rgba(245,247,251,.97); }
  }
  /* DAS X SCHWEBT (Wunsch Murat: „hava da yüzüyo gibi olacak").
     Es haengt am OVERLAY, nicht am Inhalt - sonst waere es an die Breite der
     Buehne gebunden und stuende bei einer kurzen Bestellung mitten im Bild.
     Oben rechts, mit Abstand zur Systemleiste (safe-area) - in der
     Store-Huelle liegt dort sonst die Uhrzeit darueber. */
  .ss-lade-x{ position:absolute; top:max(calc(14px + env(safe-area-inset-top)), 18px);
    right:max(calc(14px + env(safe-area-inset-right)), 18px);
    width:42px; height:42px; padding:0; border-radius:50%;
    border:1px solid var(--line); background:var(--card); color:var(--muted);
    font:inherit; font-size:24px; line-height:1; cursor:pointer;
    display:inline-flex; align-items:center; justify-content:center;
    box-shadow:0 6px 18px rgba(27,34,48,.14); transition:color .12s,border-color .12s; }
  .ss-lade-x:hover{ color:var(--ink); border-color:var(--ink); }
  /* GROESSER GEWORDEN - IN DREI SCHRITTEN.
     v2.314.0: 336 -> 420px („cük kadar bir ekran var ve hic klas durmuyor").
     v2.316.0: 420 -> 480px, und vor allem wuchs der INHALT mit („bu popupi
     büyütebilirsin icindekilerle cok kücük yani zor okunuyor su an"). Eine
     breitere Karte allein hatte das Problem nicht geloest: der Text stand
     danach genauso klein in mehr Weiss.
     v2.540.0: 480 -> 560px, weil der Kasten weg ist. Was vorher die Kante
     der Karte war, ist jetzt nur noch die Breite, auf der die Sprechblase
     wandern kann - und die darf grosszuegig sein.
     GRUND, RAHMEN UND SCHATTEN SIND BEWUSST WEG. `.ss-lade-karte` ist nur
     noch die Buehne; wer sie wieder weiss macht, holt den Kasten zurueck. */
  .ss-lade-karte{ background:none; border:0; box-shadow:none; padding:6px 4px 0;
    width:min(92vw,560px); text-align:center; }
  /* HIER STAND DIE WELLE `.ss-welle` (entfernt in v2.316.0).
     Neun Punkte in gedrueckter Tiefe - handwerklich in Ordnung, aber sie
     sagten dasselbe wie die Figur darunter, nur abstrakt. Zwei Warte-Zeichen
     uebereinander sind eines zu viel; das schwaechere geht.
     Die Farbvariablen `--ld-1…--ld-7` in :root bleiben; die Punktreihe
     `.ld-dots` ist seit v2.737.2 ebenfalls weg (Reigen-Logo, `.ss-lader`). */
  /* ===== DAS WARTENDE MATERIAL-MASKOTTCHEN ================================
     Seit v2.585.2 sitzt hier wieder der bewaehrte Rechner-Kater.
     Der Kasten ist LEER, bis `ssMaskottchenStarten()` ihn fuellt - ohne Inhalt hat
     er keine Hoehe, die Karte bleibt also klein, wenn die Figur (etwa bei
     reduzierter Bewegung) gar nicht kommt. */
  /* Der Kasten hatte Radius und `overflow:hidden`, weil die Figur einen
     eigenen, cremefarbenen Hintergrund mitbrachte (1080x1080-Rechteck in der
     Lottie-Datei). Dieser Layer ist in v2.316.0 aus der Datei ENTFERNT
     worden - nicht per CSS ueberdeckt, sondern wirklich raus, sonst haette
     er weiter mitgezeichnet. Das Maskottchen sitzt direkt auf der Seite;
     ein Radius haette nichts mehr zu beschneiden.
     SIE IST SCHMALER ALS DIE BUEHNE (72 %), und das ist kein Geschmack: die
     Sprechblase wandert an den Raendern entlang, und ohne diesen Streifen
     laege sie dauerhaft auf der Figur. */
  /* SEIT v2.591.0 VOLLE BREITE. Die 72 % waren der Platz fuer die wandernde
     Sprechblase; die ist entfallen ("sunu yaptim bunu yaptim yazilari …
     onlari kaldir artik", 02.09.2026). Ohne sie darf Robi die ganze Karte
     als Laufstrecke benutzen - und je breiter die Strecke, desto groesser
     zeichnet robi-warten.js ihn. */
  .ss-lade-maskottchen{ width:100%; margin:2px auto 0; }
  .ss-lade-titel{ font-size:20px; font-weight:800; color:var(--ink); line-height:1.28; letter-spacing:-.015em; }
  .ss-lade-best{ font-size:14.5px; color:var(--muted); margin-top:7px; line-height:1.45; }
  /* ===== DIE BUEHNE UND DIE WANDERNDE BLASE (v2.540.0) ==================
     WUNSCH MURAT 29.08.2026: „alttaki hani kedinin konusma baloncuklari bi
     sagda bi solda bi altta bi orda bi burda görünsün. daha güzel durur
     burda bekliyoz cünki. komik olsun yani biraz deyislerde."

     Bis hierher stand die Blase IMMER an derselben Stelle unter der Figur.
     Bei einer Erstellung von zwei Minuten sind das vierzig Saetze an
     derselben Koordinate - die Bewegung, die das Warten kurz macht, fehlte
     ausgerechnet der Sprache.

     WIE: fuenf feste Plaetze rund um die Figur, die `loadRotate()` der
     Reihe nach durchgeht. Feste Plaetze und kein Zufall, weil ein Zufall
     dieselbe Ecke zweimal hintereinander treffen kann - und dann sieht es
     nach einem Fehler aus statt nach Absicht.
     DER ZIPFEL ZEIGT IMMER ZUR FIGUR. Steht die Blase oben, zeigt er nach
     unten; steht sie unten, nach oben. Eine Sprechblase, deren Zipfel ins
     Leere weist, gehoert niemandem. */
  .ss-lade-buehne{ position:relative; }
  .ss-lade-stand{ position:absolute; inset:0; pointer-events:none; }
  /* Die Sprechblase ist in v2.591.0 entfallen - siehe loadRotate() in
     index-app.js. Der Platz gehoert jetzt der Figur. */
  .ss-lade-zeit{ font-size:12.5px; color:var(--muted); opacity:.6; flex:none;
    font-variant-numeric:tabular-nums; }
  /* ZEIT UND ZUSICHERUNG STEHEN UNTEREINANDER, MITTIG (v2.316.0: „anzeige
     ausbleinden kismini ortala ve yanindaki aciklamayi alta al ortala").
     Nebeneinander lasen sie sich wie eine Zeile mit zwei gleichwertigen
     Angeboten. Die Trennlinie ist mit dem Kasten gegangen - sie trennte
     zwei Bereiche einer Karte, die es nicht mehr gibt. */
  .ss-lade-fuss{ margin-top:10px;
    display:flex; flex-direction:column; align-items:center; gap:2px; }
  .ss-lade-hinw{ font-size:12px; color:var(--muted); opacity:.7; }

  /* ===== FERTIG-PILLE =====================================================
     VORBILD: die iOS-Verbindungsmeldung ("AirPods · Verbunden"), die oben
     mittig als schwebende, milchige Kapsel einfaehrt (Wunsch Murat
     30.07.2026 mit Screenshot: "aynisi yani transperenzliginden tut yazi
     tipi herseyine kadar"). Bis 2.72.0 war das hier ein vollbreites,
     kraeftig blaues Band - technisch dasselbe, optisch das Gegenteil von
     zurueckhaltend.

     WAS DIESE OPTIK AUSMACHT - die vier Dinge, ohne die es "billig" aussieht:
       1. VOLLE RUNDUNG (border-radius:999px) und eine Breite, die sich dem
          Inhalt anpasst - keine Leiste, eine Kapsel.
       2. ECHTE MILCHIGKEIT: halbdurchsichtiger Grund PLUS backdrop-filter mit
          blur UND saturate. Das saturate ist der Trick, an dem es sonst
          scheitert: ohne es wirkt der Hintergrund hinter der Kapsel grau
          statt lebendig durchscheinend.
       3. Ein hauchduenner heller Innenrand (inset-Schatten) - so sitzt die
          Kapsel auf dem Bild statt darin zu kleben.
       4. SYSTEMSCHRIFT, nicht die App-Schrift Inter. Die Meldung soll wie
          eine Meldung des Geraets wirken; deshalb hier bewusst -apple-system
          zuerst (auf Apple-Geraeten "SF Pro"), damit sie sich einreiht.
     Fallback ohne backdrop-filter (aeltere Browser): der Grund ist dann
     schlicht deckender - die Kapsel bleibt lesbar, nur ohne Milchglas.

     Die GANZE Kapsel ist der Knopf - wie beim Vorbild. Deshalb gibt es keinen
     eigenen "Ansehen"-Button mehr. Ein Schliessen-X gibt es weiterhin nicht;
     warum, steht bei ssFertigZeigen in index-app.js. */
  .ss-fertig{ position:fixed; z-index:9100; top:calc(9px + env(safe-area-inset-top));
    left:50%; display:flex; align-items:center; gap:11px;
    max-width:min(90vw,330px); padding:8px 20px 8px 11px; border-radius:999px; border:0;
    background:rgba(247,247,250,.70);
    -webkit-backdrop-filter:blur(26px) saturate(180%); backdrop-filter:blur(26px) saturate(180%);
    box-shadow:0 10px 30px rgba(0,0,0,.20), inset 0 0 0 .5px rgba(255,255,255,.62);
    font-family:-apple-system,BlinkMacSystemFont,"SF Pro Text","Segoe UI",system-ui,Roboto,sans-serif;
    color:#1c1c1e; text-align:left; cursor:pointer; opacity:0;
    transform:translateX(-50%) translateY(-150%);
    transition:transform .46s cubic-bezier(.28,1.12,.4,1), opacity .28s ease; }
  .ss-fertig.da{ opacity:1; transform:translateX(-50%) translateY(0); }
  .ss-fertig:active{ transform:translateX(-50%) translateY(0) scale(.975); }
  .ss-fertig-ic{ display:inline-flex; align-items:center; justify-content:center; flex:none;
    width:27px; height:27px; border-radius:50%; background:#30B14A; color:#fff;
    font-size:14px; font-weight:700; line-height:1; }
  .ss-fertig.fehler .ss-fertig-ic{ background:#E0463E; }
  /* display:block ist hier KEIN Schoenheitsfehler-Fix, sondern der Kern des
     Aufbaus: beide Zeilen sind <span>, also von Haus aus inline - ohne diese
     Angabe stehen Titel und Nebenzeile NEBENEINANDER statt untereinander
     (gemeldet 30.07.2026). Wer die Kapsel umbaut, laesst sie stehen. */
  .ss-fertig-txtbox{ min-width:0; }
  .ss-fertig-txt{ display:block; font-size:14px; font-weight:600; letter-spacing:-.01em;
    line-height:1.25; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
  .ss-fertig-det{ display:block; font-size:12.5px; color:#6b6b70; line-height:1.25;
    margin-top:1px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
  @media (prefers-color-scheme: dark){
    .ss-fertig{ background:rgba(44,44,48,.72); color:#f2f2f5;
      box-shadow:0 10px 30px rgba(0,0,0,.44), inset 0 0 0 .5px rgba(255,255,255,.14); }
    .ss-fertig-det{ color:#a9a9b0; }
  }
  @supports not ((backdrop-filter:blur(2px)) or (-webkit-backdrop-filter:blur(2px))){
    .ss-fertig{ background:rgba(247,247,250,.97); }
    @media (prefers-color-scheme: dark){ .ss-fertig{ background:rgba(44,44,48,.97); } }
  }
  @media (prefers-reduced-motion: reduce){
    .ss-fertig{ transition:opacity .2s ease; transform:translateX(-50%) translateY(0); }
  }

  #screen-loading #load-title{ font-size:clamp(18px,2.6vw,23px); color:var(--ink); margin:0; }
  #screen-loading #load-sub{ color:var(--muted); margin:6px 0 0; }
  @media (prefers-reduced-motion: reduce){ .load-oneline{ transition:opacity .2s; } }
  body[data-screen="share"] .wrap, body[data-screen="results"] .wrap{
    padding-top:max(calc(10px + env(safe-area-inset-top)), 14px);
  }

  /* DIE WEISSE SEITE HINTER DER QR-SEITE IST WEG (Wunsch Murat 16.08.2026).
     `#screen-share` ist eine `.card` wie jeder andere Bildschirm - also
     weisse Flaeche, Rand, Schatten. Hier trug sie nichts: der Hero bringt
     seinen eigenen Rahmen mit, und darueber standen nur drei Zeilen. Zwei
     Kaesten ineinander, der aeussere leer - das ist der Rand, den man
     sieht, ohne sagen zu koennen, was er umschliesst.
     NUR HIER. `.card` traegt die halbe Anwendung; die Regel haengt deshalb
     am Bildschirm, nicht an der Klasse. */
  #screen-share.card{background:none;border:none;box-shadow:none;padding:0;}

  /* QR-Hero: großer, freundlicher QR-Block */
  .qr-hero{position:relative;text-align:center;margin:14px 0 16px;padding:24px 16px 20px;border-radius:20px;
    background:linear-gradient(160deg,#F4F7FF 0%,#FDF6EF 55%,#F1FBF4 100%);
    border:1px solid var(--line);overflow:hidden;}
  .qr-hero::before{content:"";position:absolute;top:0;left:0;right:0;height:5px;
    background:linear-gradient(90deg,#2E5BFF,#7A5AF8,#15A05A,#F5A623);}
  .qr-hero .qh-dot{position:absolute;border-radius:50%;opacity:.14;pointer-events:none;}
  /* KEINE WEISSE KACHEL MEHR HINTER DEM CODE (Wunsch Murat 16.08.2026, zum
     zweiten Mal - beim ersten Mal blieb sie stehen). Der Code steht jetzt
     direkt auf dem Hero-Verlauf.
     DAS `padding` BLEIBT UND IST KEIN SCHMUCK: ein QR-Code braucht eine
     ruhige Zone von vier Modulen um sich herum, sonst lesen ihn manche
     Kameras nicht mehr. Vorher lieferte die weisse Kachel sie, jetzt der
     helle Verlauf. `background:transparent` erst zusammen mit dem
     durchsichtigen Hellton des Codes selbst (qrInto, colorLight) - eine
     Haelfte allein haette nur die Kachel gegen ein weisses Quadrat
     getauscht. */
  .qr-hero .qh-frame{display:inline-block;background:transparent;padding:14px;border-radius:18px;}
  .qr-hero .qh-frame img{display:block;width:min(64vw,320px);height:auto;border:none;padding:0;margin:0;border-radius:6px;}
  .qr-hero .qh-scanhint{display:flex;align-items:center;justify-content:center;gap:7px;margin-top:12px;
    font-size:13px;font-weight:600;color:var(--muted);}
  .qr-hero .qh-scanhint svg{width:16px;height:16px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;}
  .qr-hero .share-link-wrap{justify-content:center;}
  /* Wie beim Auge: seit v2.323.0 in der Werkzeugzeile unter dem Code. */
  .qr-copy-corner{z-index:3;display:inline-flex;align-items:center;justify-content:center;gap:6px;
    background:var(--card,#fff);border:1px solid var(--line);
    color:var(--ink);cursor:pointer;font-weight:700;box-shadow:0 2px 8px rgba(20,30,60,.08);transition:all .15s;}
  .qr-copy-corner:hover{border-color:var(--brand);color:var(--brand);}
  .qr-copy-corner svg{width:16px;height:16px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;flex:none;}
  .qr-copy-corner.copied{border-color:var(--ok,#22a06b);color:var(--ok,#22a06b);}
  html[data-theme="dark"] .qr-copy-corner{background:#232633;border-color:#39415A;}
  /* IM DUNKELN BRAUCHT DER CODE SEINE HELLE FLÄCHE ZURÜCK. Die Module sind
     schwarz; auf dem dunklen Hero waeren sie schwarz auf dunkel und keine
     Kamera fände sie mehr. Das ist keine Ausnahme vom Wunsch „weg mit der
     weissen Kachel", sondern seine Grenze: hell wird sie nur dort, wo der
     Code sonst nicht mehr funktioniert. `--on-brand` ist das Wörterbuch-Wort
     für Weiss - es traegt in BEIDEN Aussehen #FFFFFF, anders als `--card`. */
  html[data-theme="dark"] .qr-hero .qh-frame{background:var(--on-brand);}
  @media (prefers-color-scheme: dark){
    html:not([data-theme="light"]) .qr-hero .qh-frame{background:var(--on-brand);}
  }
  html[data-theme="dark"] .qr-hero{background:linear-gradient(160deg,#1E2433 0%,#232633 55%,#1F2B26 100%);border-color:#39415A;}
  @media (prefers-color-scheme: dark){
    html:not([data-theme="light"]) .qr-hero{background:linear-gradient(160deg,#1E2433 0%,#232633 55%,#1F2B26 100%);border-color:#39415A;}
  }

  /* ============================================================
     DIE EINSTELLUNGEN OEFFNEN ALS FENSTER, NICHT NACH UNTEN
     ============================================================
     Anweisung Murat 02.09.2026: „yani alt kisma artik hicbisey inmasin bu
     tuslardan. hatta aynilari yukarida 5 tus icinde yapalim klassenrennen
     haric."  Bis v2.586.1 klappte jedes Panel UNTER der Seite auf; der Blick
     musste dann scrollen, und der QR-Code - das Einzige, was die Klasse
     gerade braucht - rutschte aus dem Bild.

     WARUM DER KNOTEN NICHT VERSCHOBEN WIRD: das Panel bleibt an seiner
     Stelle im Dokument und bekommt nur eine Klasse. Ein Umhaengen in einen
     Dialog waere die naheliegende Loesung und genau die falsche - es laedt
     jedes eingebettete Iframe neu (dieselbe Falle wie bei #krnn-buehne).

     AUSGENOMMEN IST DAS KLASSENRENNEN. Es ist kein Formular, das man einmal
     ausfuellt, sondern eine Buehne, die waehrend der Stunde offen bleibt -
     es steht weiter unter dem Code. */
  #share-pop-bg{position:fixed;inset:0;z-index:1999;background:rgba(12,18,32,.55);
    backdrop-filter:blur(2px);-webkit-backdrop-filter:blur(2px);}
  #share-pop-zu{position:fixed;top:max(14px,env(safe-area-inset-top));right:14px;z-index:2001;
    display:flex;align-items:center;justify-content:center;width:40px;height:40px;
    border:none;border-radius:50%;background:var(--card);color:var(--ink);
    box-shadow:0 4px 16px rgba(10,20,40,.28);cursor:pointer;}
  #share-pop-zu svg{width:20px;height:20px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;}
  /* `overflow:auto !important` IST KEIN SCHMUCK (Befund Murat 26.09.2026:
     „belohnungspieli onaylayamiyorum"). Die vier Panels tragen im HTML ein
     `overflow:hidden` fuer ihr Akkordeon-Aussehen - und ein Inline-Stil
     schlaegt jede Klasse. Das Fenster liess sich damit nicht rollen, und was
     unter 86vh lag (beim Belohnungsspiel der Speichern-Knopf), war nicht zu
     erreichen. */
  .share-pop{position:fixed;z-index:2000;top:50%;left:50%;transform:translate(-50%,-50%);
    width:min(680px,94vw);max-height:86vh;overflow:auto !important;-webkit-overflow-scrolling:touch;
    margin:0 !important;background:var(--card);border:1px solid var(--line);
    border-radius:var(--r-lg,18px);box-shadow:0 24px 64px rgba(10,20,40,.34);
    padding:var(--s-4,16px);}
  @media(max-width:520px){
    .share-pop{width:100vw;max-width:100vw;max-height:92vh;top:auto;bottom:0;left:0;
      transform:none;border-radius:18px 18px 0 0;
      padding-bottom:calc(var(--s-4,16px) + env(safe-area-inset-bottom));}
  }
  /* DAS BELOHNUNGSSPIEL AUF EINEN BLICK (Anweisung Murat 26.09.2026:
     „popupi genislet tek bakita hersey görünür olsun"): im Fenster breit
     und mit so vielen Spalten, wie hineinpassen - sechsundzwanzig Spiele in
     zwei Spalten waren dreizehn Zeilen und mehr als ein Bildschirm. Der
     Speichern-Knopf klebt unten und ist immer zu sehen. */
  .bl-spiele{display:grid;grid-template-columns:repeat(2,1fr);gap:8px;}
  .bl-fuss{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin-top:14px;}
  .bl-fuss .btn{margin:0;width:auto;min-width:240px;}
  #belohnung-panel.share-pop{width:min(1120px,96vw);}
  #belohnung-panel.share-pop .bl-spiele{grid-template-columns:repeat(auto-fill,minmax(190px,1fr));gap:6px;}
  #belohnung-panel.share-pop .bl-fuss{position:sticky;bottom:calc(var(--s-4,16px) * -1);z-index:2;
    margin:14px calc(var(--s-4,16px) * -1) calc(var(--s-4,16px) * -1);
    padding:12px var(--s-4,16px) calc(12px + env(safe-area-inset-bottom));
    background:var(--card);border-top:1px solid var(--line);}
  /* Die zweite Satellitenspalte (Selbst testen / Ergebnisse / Export).
     Sie traegt bewusst dieselbe Zeilenform wie die Einstellungen links -
     und eine feine Trennlinie, weil links EINGESTELLT und rechts GEHANDELT
     wird. Auf schmalen Schirmen faellt die Linie weg, dort stehen die
     Spalten ohnehin untereinander. */
  .qh-sat-tun{border-left:1px solid var(--line);padding-left:var(--s-4,16px);}
  /* Die Farben der drei Aktionen stehen HIER, nicht als Inline-Stil am Knopf.
     Die aelteren Satelliten tragen sie noch im `style`-Attribut; neue Bausteine
     bekommen eine Klasse (DESIGN_SYSTEM §6), und es werden ausschliesslich
     Woerterbuch-Werte benutzt - kein einziger neuer Farbwert. */
  #sat-test{--sat:var(--ok);--sat-soft:var(--ok-soft);}
  #sat-ergebnisse{--sat:var(--brand);--sat-soft:var(--brand-soft);}
  #share-tile-export{--sat:var(--violett);--sat-soft:var(--violett-soft);}
  @media(max-width:520px){ .qh-sat-tun{border-left:none;padding-left:0;} }

  /* QR-Satelliten: bunte Orbit-Buttons, fest am QR-Rahmen verankert.
     Der Orbit (weißer Rahmen + Satelliten) sitzt IMMER exakt mittig im Hero
     und skaliert mit der Bildschirmbreite mit. */
  .qr-hero.with-sats{padding:22px 12px 18px;}
  /* DIE BÜHNE: Code links, Einstellungen rechts, beide auf der Mittellinie
     (`align-items:center` - der Wunsch „y düzleminde ortali"). Vorher hing
     der Block oben und die Satellitenspalten trugen Höhenversätze von
     -14px/+22px, die ihn zusätzlich schief aussehen liessen. */
  .qh-buehne{display:flex;align-items:center;justify-content:center;gap:var(--s-6);}
  .qh-links{display:flex;flex-direction:column;align-items:center;gap:var(--s-3);}
  /* EINE Spalte statt fünf verstreuter Kreise. Jeder Eintrag ist eine Zeile
     aus Kreis + Wort, damit die Spalte wie ein Menü liest und nicht wie ein
     Muster - die Wörter stehen dann untereinander an derselben Kante. */
  .qh-sat-col{display:flex;flex-direction:column;justify-content:center;gap:var(--s-2);}
  .qh-bg{position:fixed;inset:0;z-index:-1;background-position:center top;background-repeat:repeat;background-size:480px auto;opacity:.16;pointer-events:none;}
  /* Zeile statt Säule: Kreis links, Wort rechts. Die Zeile ist der Knopf -
     so trifft man sie auch mit dem Daumen, nicht nur den 48-px-Kreis. */
  .qr-sat{z-index:4;display:flex;flex-direction:row;align-items:center;gap:var(--s-2);
    width:100%;min-width:172px;padding:var(--s-1) var(--s-2) var(--s-1) var(--s-1);
    background:none;border:1.5px solid transparent;border-radius:var(--r-pill);
    cursor:pointer;font-family:inherit;text-align:left;transition:background .15s ease,border-color .15s ease;}
  .qr-sat:hover{background:var(--card);border-color:var(--line);}
  .qr-sat.active{background:var(--card);border-color:var(--sat);}
  /* `flex:none` ist Pflicht, seit der Satellit eine ZEILE ist: als Flex-Kind
     neben einem Wort wird der Kreis sonst gestaucht und ist ein Ei. */
  .qr-sat-dot{position:relative;display:flex;flex:none;align-items:center;justify-content:center;width:48px;height:48px;border-radius:50%;background:var(--card,#fff);border:1.5px solid var(--line);box-shadow:0 3px 12px rgba(20,30,60,.12);color:var(--sat,#5A6172);transition:transform .1s ease,border-color .15s ease,background .15s ease;}
  .qr-sat-dot svg{width:22px;height:22px;fill:none;stroke:currentColor;stroke-width:1.9;stroke-linecap:round;stroke-linejoin:round;}
  .qr-sat-lbl{flex:1 1 auto;min-width:0;font-size:var(--fs-sm);font-weight:700;line-height:1.2;
    color:var(--ink);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
  .qr-sat:hover .qr-sat-dot{transform:translateY(-1px) scale(1.05);border-color:var(--sat);}
  .qr-sat:active .qr-sat-dot{transform:scale(.94);}
  .qr-sat.on .qr-sat-dot{background:var(--sat-soft,#EEF3FF);border-color:var(--sat);}
  .qr-sat.on .qr-sat-lbl{color:var(--sat);}
  .qr-sat.active .qr-sat-dot{box-shadow:0 0 0 3px var(--sat-soft,#EEF3FF),0 3px 12px rgba(20,30,60,.12);border-color:var(--sat);}
  .qr-sat-count{position:absolute;top:-5px;right:-7px;min-width:18px;height:18px;padding:0 5px;border-radius:9px;background:var(--sat,#15A05A);color:#fff;font-size:10.5px;font-weight:800;display:flex;align-items:center;justify-content:center;}
  html[data-theme="dark"] .qr-sat-dot{background:#232633;border-color:#39415A;}
  /* Werkzeugzeile unter dem Code: Auge (Start-Sperre) und Link kopieren.
     Sie tragen jetzt ein WORT, nicht nur ein Zeichen - in der Ecke war das
     Auge ein Rätsel, und gerade dieser Knopf entscheidet, ob die Klasse
     loslaufen kann. */
  .qh-werkzeuge{display:flex;align-items:center;justify-content:center;gap:var(--s-2);}
  .qh-wz{position:static;display:inline-flex;align-items:center;gap:var(--s-2);
    height:38px;padding:0 var(--s-3);border-radius:var(--r-pill);
    font-size:var(--fs-sm);font-weight:700;cursor:pointer;font-family:inherit;}
  .qh-wz svg{width:17px;height:17px;flex:none;}
  @media(max-width:600px){
    .qr-hero.with-sats .qh-frame img{width:min(52vw,230px);}
    .qh-buehne{gap:var(--s-4);}
    .qr-sat{min-width:0;}
    .qr-sat-lbl{font-size:var(--fs-xs);}
  }
  /* SCHMAL: nebeneinander bleibt kein Platz für beides. Der Code rückt nach
     oben, die Einstellungen darunter - in zwei Spalten, damit fünf Zeilen
     nicht die halbe Seite fressen. */
  @media(max-width:520px){
    .qh-buehne{flex-direction:column;gap:var(--s-4);}
    .qh-sat-col{display:grid;grid-template-columns:1fr 1fr;width:100%;gap:var(--s-2);}
    /* Der Kreis wird kleiner, damit das WORT bleibt. Zwei Spalten lassen je
       rund 140px; mit dem 48-px-Kreis blieb davon „K.." uebrig - und ein
       Knopf, dessen Beschriftung abgeschnitten ist, ist ein Rätsel mit
       Symbol. */
    .qr-sat{min-width:0;padding:var(--s-1);}
    .qr-sat-dot{width:36px;height:36px;}
    .qr-sat-dot svg{width:18px;height:18px;}
    .qr-sat-lbl{font-size:var(--fs-xs);}
  }
  /* DIESER BLOCK GEHOERTE ZUR ALTEN ORBIT-FASSUNG und hat nach dem Umbau auf
     die Bühne (v2.323.0) noch dagegen gearbeitet: er zwang den Satelliten
     auf `width:56px` und die Beschriftung auf 9.5px mit `max-width:56px` -
     bei 375px stand deshalb „K.." statt „Klasse", obwohl die Spalte 275px
     breit war. Er steht NACH dem 520er-Block und gewann damit jedes Mal.
     Geblieben ist nur, was hier wirklich schmal werden muss. */
  @media(max-width:430px){
    .qr-hero.with-sats{padding:16px 6px 16px;}
    .qr-hero.with-sats .qh-frame img{width:min(62vw,230px);}
    .qh-sperre b{font-size:var(--fs-md);}
    .qh-sperre span{font-size:var(--fs-xs);}
  }

  /* Ergebnisse als Popup (Modal) auf der Teilen-Seite */
  .erg-modal-card{max-width:660px;width:100%;padding:16px 18px 18px;}
  .erg-modal-card #screen-results{display:block;}
  .erg-modal-card .res-topbar{margin-top:0;position:sticky;top:0;background:var(--card,#fff);z-index:2;padding-bottom:6px;}
  html[data-theme="dark"] .erg-modal-card .res-topbar{background:#232633;}

  /* Ergebnisse: schlanke Kopfleiste (Apple-artig) */
  .res-topbar{display:flex;align-items:center;justify-content:space-between;gap:10px;margin:2px 0 14px;}
  .res-back{display:flex;align-items:center;justify-content:center;width:38px;height:38px;flex:none;
    border:1px solid var(--line);border-radius:50%;background:var(--card,#fff);color:var(--ink);cursor:pointer;
    transition:background .15s ease, transform .08s ease;}
  .res-back svg{width:19px;height:19px;fill:none;stroke:currentColor;stroke-width:2.2;stroke-linecap:round;stroke-linejoin:round;}
  .res-back:hover{background:var(--brand-soft,#EEF3FF);}
  .res-back:active{transform:scale(.94);}
  .res-top-actions{display:flex;gap:8px;}
  .res-sq{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;width:64px;min-height:56px;
    padding:7px 2px;border:1.5px solid var(--line);border-radius:12px;background:var(--card,#fff);color:var(--brand);
    font-family:inherit;font-weight:600;font-size:10.5px;line-height:1.1;cursor:pointer;
    transition:transform .08s ease,border-color .15s ease,background .15s ease;}
  .res-sq svg{width:18px;height:18px;fill:none;stroke:currentColor;stroke-width:1.9;stroke-linecap:round;stroke-linejoin:round;}
  .res-sq:hover{transform:translateY(-1px);background:var(--brand-soft,#EEF3FF);}
  .res-sq:active{transform:scale(.95);}
  @media(max-width:430px){ .res-sq{width:56px;min-height:52px;font-size:9.5px;} .res-sq svg{width:16px;height:16px;} }

  /* Verlauf-Banner (wenn ein alter Tag angezeigt wird) */
  .res-verlauf-banner{display:flex;align-items:center;gap:8px;background:#FFF7E8;border:1px solid #F0D9A8;
    color:#8A6116;border-radius:12px;padding:9px 12px;font-size:13px;font-weight:600;margin:0 0 12px;}
  .res-verlauf-banner button{margin-left:auto;flex:none;border:none;background:transparent;color:inherit;
    font-weight:800;font-size:12.5px;cursor:pointer;text-decoration:underline;font-family:inherit;}

  /* Verlauf-Popup Zeilen */
  .vh-row{display:flex;align-items:center;gap:10px;padding:11px 2px;border-bottom:1px solid var(--line);}
  .vh-row:last-child{border-bottom:none;}
  .vh-date{font-weight:700;font-size:14px;}
  .vh-meta{font-size:12px;color:var(--muted);margin-top:1px;}
  .vh-acts{display:flex;gap:6px;margin-left:auto;flex:none;}
  .vh-act{display:flex;align-items:center;justify-content:center;width:34px;height:34px;border:1px solid var(--line);
    border-radius:10px;background:var(--card,#fff);color:var(--brand);cursor:pointer;transition:background .15s ease;}
  .vh-act svg{width:16px;height:16px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;}
  .vh-act:hover{background:var(--brand-soft,#EEF3FF);}
  .icon-btn:hover{border-color:var(--brand);background:var(--brand-soft);}
  .icon-btn:active{transform:scale(.97);}
  .icon-btn svg{width:22px;height:22px;fill:none;stroke:var(--brand);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;}
  .timer-badge{font-size:13px;font-weight:700;color:var(--amber);background:#FEF6E9;padding:4px 10px;border-radius:8px;}
  .countdown-badge{font-size:13px;font-weight:700;color:#1d4ed8;background:#E8EEFF;padding:4px 10px;border-radius:8px;font-variant-numeric:tabular-nums;}
  .countdown-badge.warn{color:#E2483D;background:#FDECEA;}
  /* ALTER Browser-Tab-Look (Chrome-Lasche mit SVG-Silhouette) – auf Wunsch
     ausgemustert, aber als Kommentar aufgehoben (vielleicht spaeter wieder).
     Gehoert zusammen mit drawTabShape() in index-app.js (dort ebenfalls
     stillgelegt). Zum Reaktivieren: diesen Block einkommentieren, den neuen
     Pill-Block darunter entfernen und drawTabShape() wieder scharf schalten.
  .tabs{display:flex;justify-content:center;align-items:flex-end;gap:18px;margin-bottom:18px;border-bottom:2px solid rgba(109,91,255,.85);box-shadow:none;}
  .tab-btn{position:relative;flex:none;padding:11px 20px 12px;background:none;border:none;margin-bottom:-2px;font-weight:700;font-size:14px;color:var(--muted);opacity:.55;cursor:pointer;transition:opacity .18s,color .18s;font-family:inherit;box-shadow:none;}
  .tab-btn:hover{opacity:.85;color:var(--ink);}
  .tab-btn.active{opacity:1;color:#6D5BFF;background:none;box-shadow:none;z-index:1;}
  .tab-btn .tab-shape{position:absolute;left:-14px;top:0;width:calc(100% + 28px);height:100%;display:none;pointer-events:none;z-index:-1;overflow:visible;}
  .tab-btn.active .tab-shape{display:block;}
  @media(max-width:560px){
    .tabs{gap:8px;}
    .tab-btn{padding:9px 10px 10px;font-size:12.5px;}
  }
  */
  /* NEU: Material-Tabs im Sidebar-Nav-Stil - ruhige Pills. Hover hebt sanft
     hervor, der aktive Tab bekommt die brand-soft-Fuellung wie ein aktiver
     Nav-Eintrag. Die .tab-shape-SVGs bleiben im Markup, werden aber nicht
     mehr gezeichnet (drawTabShape ist stillgelegt). */
  .tabs{display:flex;justify-content:center;align-items:center;gap:8px;margin-bottom:18px;}
  .tab-btn{position:relative;flex:none;padding:9px 18px;background:none;border:none;border-radius:11px;
    font-weight:700;font-size:14px;color:var(--muted);cursor:pointer;font-family:inherit;
    transition:background .15s ease,color .15s ease;}
  .tab-btn:hover{background:rgba(127,127,127,.10);color:var(--ink);}
  .tab-btn.active{background:var(--brand-soft);color:var(--brand);}
  .tab-btn .tab-shape{display:none !important;}
  @media(max-width:560px){
    .tabs{gap:5px;}
    .tab-btn{padding:8px 11px;font-size:12.5px;}
  }
  /* Fach/Thema/Klasse/Anzahl: vier Boxen, Label klein IN der Box (mobil 2×2) */
  /* SCHMAL UND OHNE KASTEN (v2.324.5, Auftrag Murat 17.08.2026:
     „kutucuklari daraltsan birde kutu gibi görünmese sanki text boxun
     parcasiymis gibi görünse“).
     `max-content` statt `1fr`: die Felder sind so breit, wie ihr Inhalt sie
     braucht, und dehnen sich nicht mehr ueber die ganze Zeile. Die
     Untergrenze verhindert, dass „Klasse“ vor der ersten Auswahl zu einem
     Stummel zusammenfaellt. */
  .fach-pick-row{display:grid;grid-template-columns:repeat(4,minmax(92px,max-content));gap:18px;}
  @media(max-width:640px){ .fach-pick-row{grid-template-columns:1fr 1fr;gap:12px;} }
  /* Der Rand bleibt als DURCHSICHTIGE Linie stehen: er traegt keine Optik
     mehr, aber .fpk-fehlt kann ihn einfaerben, und beim Einfaerben springt
     nichts, weil die Breite schon da ist. Die Flaeche zeigt sich erst beim
     Zeigen/Fokussieren – vorher soll das Feld wie ein Teil des Textbereichs
     aussehen, nicht wie ein Kasten darin. */
  .fpk{display:block;position:relative;border:1.5px solid transparent;border-radius:10px;background:transparent;padding:4px 8px;cursor:pointer;transition:border-color .15s,background .15s;min-width:0;}
  .fpk:hover{background:var(--surface-subtle,#F7F8FA);}
  .fpk:focus-within{border-color:var(--brand);background:var(--surface-subtle,#F7F8FA);}
  .fpk>span{display:block;font-size:9.5px;font-weight:800;letter-spacing:.05em;text-transform:uppercase;color:var(--muted);margin-bottom:2px;}
  .fpk select,.fpk input{width:100%;border:none !important;background:transparent !important;padding:1px 0 !important;margin:0;font:inherit;font-size:13.5px;font-weight:600;color:var(--ink);appearance:none;-webkit-appearance:none;box-sizing:border-box;border-radius:0;}
  .fpk select{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%237A8194' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E") !important;background-repeat:no-repeat !important;background-position:right 0 center !important;background-size:15px !important;padding-right:20px !important;cursor:pointer;}
  .fpk select:focus,.fpk input:focus{outline:none;box-shadow:none;}
  .res-row{display:flex;align-items:center;gap:12px;padding:12px 0;border-top:1px solid var(--line);}
  .res-row:first-of-type{border-top:none;}
  .res-rank{width:28px;height:28px;border-radius:8px;flex:none;display:grid;place-items:center;font-size:12px;font-weight:800;color:#fff;}
  .res-avg{display:flex;justify-content:space-between;font-weight:700;font-size:15px;border-top:2px solid var(--line);margin-top:12px;padding-top:12px;}
/* EKLENEN YENİ KODLAR BURADA BAŞLIYOR */
  .main-logo {
    height: 52px;
    width: auto;
    flex: none;
    object-fit: contain;
    cursor: pointer;
    transition: transform 0.2s ease;
  }
  .main-logo:hover {
    transform: scale(1.03); 
  }

  /* === HEADER: Anmelden-Button + Avatar-Dropdown === */
  .anmelden-btn {
    appearance:none; border:none; cursor:pointer;
    font-family:inherit; font-weight:700; font-size:14px;
    color:#fff; padding:10px 20px; border-radius:999px;
    background: rgba(46, 91, 255, 0.92);
    box-shadow: 0 2px 10px rgba(46,91,255,0.25);
    transition: background .15s ease, transform .1s ease;
  }
  .anmelden-btn:hover { background: rgba(30, 63, 204, 1); }
  .anmelden-btn:active { transform: scale(0.97); }

  .avatar-wrap { position: relative; }
  /* === POSTFACH: Zarf-Button im Header (links neben dem Avatar) === */
  #authbar{ display:flex; align-items:center; gap:8px; }
  /* WEICHE TIEFE AUCH IN DER KOPFZEILE (v2.288.0, Wunsch Murat 15.08.2026):
     Zarf und Profil sprechen jetzt dieselbe Sprache wie die Leiste links -
     zwei Schatten statt einer Fuellfarbe, beim Beruehren liegen sie INNEN
     (eingedrueckt). Die Betraege kommen aus --sb-tief/--sb-hoch, also aus
     denselben rgba-Variablen; feste Grautoene waeren hier genauso falsch wie
     dort (qa/unit/test_seitenleiste.py, Zusage 1).

     DER PUNKT, AN DEM ES SONST SCHEITERT - und warum hier --paper steht:
     Die Kopfzeile sitzt IM weissen Panel, nicht auf der Schale. Auf Weiss ist
     die helle Haelfte des Schattenpaars unsichtbar; es wirkte nur die dunkle,
     und aus der Mulde wuerde ein einseitiger Schmutzrand. Genau das hat die
     mobile Schublade schon gelernt (Zusage 3 desselben Tests, dort wird der
     helle Anteil abgeschaltet). Statt die Tiefe auch hier zu daempfen, bekommen
     die zwei Bauteile eine eigene, leicht getoente Flaeche (--paper) - dann hat
     die helle Kante wieder etwas, wovon sie sich abheben kann, und das Paar
     stimmt ohne Sonderwerte. Wer --paper hier durch --card ersetzt, macht die
     halbe Tiefe unsichtbar. */
  /* NUR DAS ZEICHEN, KEINE SCHEIBE (v2.355.0, Anweisung Murat 20.08.2026:
     „mesaj ikonunun arkasindaki yuvarlagida kaldir … bunlari kalin yap ikon
     sonucta, yada birazcik büyüt").
     Die weiche Scheibe dahinter war Gestaltung ohne Aufgabe: In der Kopfzeile
     stehen nur noch drei Dinge nebeneinander (Postfach, Schulverwaltung,
     Profil), und zwei davon trugen einen Kreis, den man nicht anklickt - man
     klickt das Zeichen. Ohne Kreis hat das Zeichen Platz, groesser und
     kraeftiger zu werden, und genau das macht es lesbar.
     DIE KLICKFLAECHE BLEIBT 40px - sie ist nur unsichtbar. Wer das Feld
     verkleinert, macht den Knopf auf dem Handy untreffbar (44px ist die
     Fingerregel, DESIGN_SYSTEM.md §4). */
  .pf-btn{ position:relative; appearance:none; border:none; cursor:pointer; width:40px; height:40px;
    border-radius:50%; background:transparent; display:flex; align-items:center;
    justify-content:center; color:var(--ink); flex:none; box-shadow:none;
    transition:color .16s, transform .1s ease; }
  .pf-btn:hover{ color:var(--brand); box-shadow:none; }
  /* Kurz nachgeben beim Druecken - derselbe Betrag wie an den Leisten-Eintraegen.
     Der fruehere Sprung auf .94 war noetig, solange nur die Fuellfarbe wechselte;
     jetzt zeigt die Mulde den Druck, ein zweites starkes Signal waere zu viel. */
  .pf-btn:active{ transform:scale(.985); }
  /* Sanftes, SELTENES Zarf-Wackeln bei Ungelesenem (Klasse "hat-neu",
     pfBadgeSync in index-app.js): pro 11s-Zyklus bewegt sich der Umschlag nur
     in den ersten ~0,9s (kleine Rotation mit weichem Ausklang), danach Ruhe -
     praesent, aber nie nervoes. Nur das SVG dreht (der rote Zaehler bleibt
     still), :active-Scale des Buttons bleibt unberuehrt. */
  .pf-btn.hat-neu svg{ animation:pfZarfWackeln 11s ease-in-out infinite; transform-origin:50% 22%; }
  @keyframes pfZarfWackeln{
    0%{ transform:rotate(0); }
    2%{ transform:rotate(-9deg); }
    4%{ transform:rotate(7deg); }
    6%{ transform:rotate(-4deg); }
    8%{ transform:rotate(2deg); }
    9.5%{ transform:rotate(0); }
    100%{ transform:rotate(0); }
  }
  @media (prefers-reduced-motion: reduce){ .pf-btn.hat-neu svg{ animation:none; } }
  .pf-btn svg{ width:24px; height:24px; fill:none; stroke:currentColor; stroke-width:2.3;
    stroke-linecap:round; stroke-linejoin:round; }
  /* --- Nachrichten-Zentrale: Vollbild-Screen (kein Popup), WhatsApp-artig ---
     KEIN KASTEN IM KASTEN (v2.909.0, Befund Murat 01.10.2026: „kutu üstünde
     kutu olmasın … bu kutudan çıkar arkadaki sayfaya yay"). Bis v2.908.0 war
     die Zentrale eine eigene Karte mit Rand, Rundung und Schatten IM weissen
     Panel, der Chat darin noch einmal grau unterlegt. Jetzt liegen Liste und
     Chat direkt auf dem Panel; was sie trennt, ist EINE Linie, und die laesst
     sich ziehen (.pf-trenner unten, pfTrenner* in index-app.js). Die Liste
     ist --pf-links breit (Standard 340 px, je Geraet gemerkt).
     Mobil (<=720px): Shell liegt fix ueber allem, Liste <-> Chat gleiten -
     dort bekommt sie ihre deckende Flaeche im schmalen Block zurueck. */
  .pf-shell{ display:flex; overflow:hidden; position:relative;
    height:calc(var(--vh100) - 175px); min-height:460px; }
  .pf-left{ width:var(--pf-links, 340px); flex:none;
    display:flex; flex-direction:column; min-height:0; }
  .pf-right{ flex:1; display:flex; flex-direction:column; min-width:0; min-height:0; }
  /* DIE LINIE ZWISCHEN LISTE UND CHAT (v2.909.0, Wunsch Murat: „yazı yazılan
     kısımla sol taraftaki kısmın arasında bir çizgi var ya, büyütüp
     küçültebileyim"). Sichtbar ist 1 px; gegriffen wird ein 11 px breiter
     Streifen darueber (negativer Rand), damit Maus, Finger und Stift ihn
     treffen. `touch-action:none` ist Pflicht: ohne sie rollt auf dem iPad
     die Liste, statt dass die Linie wandert. Die Farbe beim Zeigen und
     Ziehen steht im Akzent-Abschnitt (Nr. 12). */
  .pf-trenner{ flex:none; width:11px; margin:0 -5px; position:relative; z-index:5;
    cursor:col-resize; touch-action:none; }
  .pf-trenner::before{ content:""; position:absolute; top:0; bottom:0; left:5px; width:1px;
    background:var(--line); transition:left .15s ease, width .15s ease, background .15s ease; }
  .pf-trenner:hover::before, .pf-trenner.zieht::before, .pf-trenner:focus-visible::before{
    left:4px; width:3px; border-radius:2px; }
  .pf-trenner:focus{ outline:none; }
  .pf-shell.trennt{ cursor:col-resize; user-select:none; -webkit-user-select:none; }
  .pf-shell.chat .pf-right{ animation:pfEin .22s ease; }
  @keyframes pfEin{ from{ opacity:0; transform:translateX(14px); } to{ opacity:1; transform:none; } }
  .pf-mobiletop{ display:none; }
  /* Die Zeichen der festen Kopfzeilen (Zurueck, Lupe, Plus) stehen nicht als
     Pfad im HTML, sondern werden beim Oeffnen aus Lucide eingesetzt
     (pfZeichenEinsetzen, index-app.js) - `data-pf-ico` nennt das Icon. */
  .pf-ic{ display:flex; flex:none; }
  /* Suche, Ton, Neuer Chat. WEICHE KNOEPFE (v2.909.0, „daha yumuşak daha
     güzel düğmeler"): keine Rahmen, keine leuchtenden Schatten, kein Kreis,
     der kleiner wird und wieder waechst - ein Feld auf zartem Grau und
     abgerundete Quadrate. Gefuellt ist genau EIN Knopf, „Neuer Chat", in
     der Flaechenfarbe (Akzent-Abschnitt Nr. 12). */
  .pf-searchrow{ display:flex; align-items:center; gap:6px; padding:14px 12px 8px; }
  .pf-search{ flex:1; display:flex; align-items:center; gap:8px; background:var(--paper);
    border:1.5px solid transparent; border-radius:12px; padding:7px 12px; min-width:0;
    transition:border-color .18s ease, background .18s ease; }
  .pf-search:focus-within{ border-color:var(--brand); background:var(--card); }
  .pf-search .ic{ color:var(--muted); }
  .pf-search input{ flex:1; border:none; background:transparent; font:inherit; font-size:14px;
    outline:none; color:var(--ink); min-width:0; padding:0; }
  .pf-plus{ width:38px; height:38px; border-radius:12px; border:none; background:var(--brand);
    color:var(--on-brand); display:flex; align-items:center; justify-content:center;
    cursor:pointer; flex:none; transition:transform .12s ease, background .15s ease; }
  .pf-plus:active{ transform:scale(.94); }
  /* Die Filter: ruhige Reiter statt umrandeter Pillen. Nur der gewaehlte
     traegt eine Flaeche (Hauch der Flaechenfarbe, Akzent-Abschnitt). */
  .pf-filters{ display:flex; gap:4px; padding:2px 12px 10px; flex-wrap:wrap; }
  .pf-fchip{ appearance:none; font:inherit; font-size:12.5px; font-weight:700; border-radius:999px;
    padding:5px 12px; background:transparent; border:none; color:var(--muted);
    cursor:pointer; display:inline-flex; align-items:center; gap:5px;
    transition:color .15s ease, background .15s ease; }
  .pf-fchip:hover{ background:var(--paper); color:var(--ink); }
  .pf-fchip.on{ background:var(--brand-soft); color:var(--brand); }
  /* DER CHIP "ASSISTENT" IST WEG (v2.514.0). Er sass hier zwischen drei
     Filtern und war in Violett gehalten, damit man ihn nicht fuer einen
     vierten Filter haelt - das war der richtige Umgang mit einer falschen
     Stelle. Seit dem Umzug hat der Assistent ein eigenes Fenster und einen
     eigenen Eingang (.asst-mk weiter unten); die Filter sind wieder das, was
     sie aussehen. */
  .pf-dot{ width:6px; height:6px; border-radius:50%; background:var(--bad); display:inline-block; }
  /* Die Leiste beim Auswaehlen: zwei kleine Knoepfe, kein Strich darunter.
     Loeschen traegt die Bedeutungsfarbe (rot = es geht etwas weg), nicht den
     Akzent - genau die Ausnahme, die der Akzent-Abschnitt beschreibt. */
  .pf-lhead{ display:flex; align-items:center; gap:8px; padding:0 12px 10px; flex:none; }
  .pf-lknopf{ appearance:none; display:inline-flex; align-items:center; gap:6px; height:32px;
    padding:0 12px; border:none; border-radius:10px; background:var(--paper); color:var(--ink);
    font:inherit; font-size:12.5px; font-weight:700; cursor:pointer;
    transition:background .15s ease, color .15s ease; }
  .pf-lknopf:hover{ background:var(--line); }
  .pf-lknopf.weg{ background:var(--bad-soft); color:var(--bad-ink); }
  .pf-lknopf.weg:hover{ background:var(--bad); color:var(--on-brand); }
  .pf-lhead-akt{ margin-left:auto; display:flex; gap:8px; }
  .pf-convs{ overflow-y:auto; flex:1; padding:2px 8px 14px; }
  .pf-leer{ color:var(--muted); font-size:13px; padding:26px 14px; text-align:center; line-height:1.6; }
  /* Schreibflaeche fuer die Mitteilung an das Kollegium (v2.291.0).
     Ein Feld, ein Satz, ein Knopf - eine Mitteilung an alle ist kein Gespraech,
     also braucht sie auch keine Chat-Leiste. Der Hinweis darueber ist EIN Satz
     (CLAUDE.md: Erklaerungen gehoeren ins Handbuch, nicht auf den Bildschirm). */
  .pf-form{ padding:16px 14px; display:flex; flex-direction:column; gap:10px; }
  .pf-form-hint{ font-size:12.5px; color:var(--muted); line-height:1.5; }
  .pf-form-area{ width:100%; box-sizing:border-box; resize:vertical; min-height:110px;
    font:inherit; font-size:14px; line-height:1.5; color:var(--ink);
    background:var(--card); border:1.5px solid var(--line); border-radius:var(--r-card);
    padding:11px 13px; }
  .pf-form-area:focus{ outline:none; border-color:var(--brand); }
  .pf-form-fuss{ display:flex; align-items:center; gap:10px; justify-content:flex-end; }
  .pf-form-status{ flex:1; min-width:0; font-size:12.5px; color:var(--muted); }
  .pf-conv{ display:flex; align-items:center; gap:12px; padding:9px 10px; border-radius:var(--r-card);
    cursor:pointer; transition:background .14s ease; position:relative; }
  .pf-conv:hover{ background:var(--paper); }
  .pf-conv.active{ background:var(--brand-soft); }
  /* DAS KAESTCHEN SITZT UEBER DEM BILD (v2.909.0). Es stand als blasses
     Quadrat vor JEDER Zeile - Unruhe ohne Aufgabe, solange man nichts
     loeschen will. Mit Zeiger erscheint es jetzt beim Zeigen ueber dem Bild
     (wie in Gmail), und sobald etwas angehakt ist (`.pf-shell.waehlt`,
     pfLHead) an allen Zeilen. Ohne Zeiger (Tablet) bleibt es vor der Zeile
     stehen - dort gibt es kein Zeigen, das es hervorholen koennte.
     `.pick` sind die Auswahllisten (Neue Gruppe, Mitglieder): dort IST das
     Kaestchen die Bedienung und bleibt immer sichtbar. */
  .pf-conv-check{ width:16px; height:16px; flex:none; margin:0; accent-color:var(--brand); cursor:pointer; }
  .pf-conv:not(.pick) > .pf-conv-check{ opacity:.45; transition:opacity .15s ease; }
  .pf-conv:not(.pick) > .pf-conv-check:checked,
  .pf-shell.waehlt .pf-conv:not(.pick) > .pf-conv-check{ opacity:1; }
  @media (hover:hover){
    .pf-conv:not(.pick) > .pf-conv-check{ position:absolute; left:32px; top:50%; z-index:1;
      width:20px; height:20px; margin:-10px 0 0 -10px; opacity:0; }
    .pf-conv:not(.pick):hover > .pf-conv-check,
    .pf-conv:not(.pick) > .pf-conv-check:focus-visible{ opacity:1; }
    .pf-conv:not(.pick):hover > .pf-ava, .pf-conv:not(.pick):hover > .pf-gava,
    .pf-shell.waehlt .pf-conv:not(.pick) > .pf-ava,
    .pf-shell.waehlt .pf-conv:not(.pick) > .pf-gava{ opacity:.12; }
  }
  /* Das Bild einer Person. Mit Foto das Foto, sonst die Anfangsbuchstaben auf
     dem Hauch der Flaechenfarbe (Akzent-Abschnitt Nr. 12). Bis v2.908.0 nahm
     JEDER Kreis die Avatarfarbe der ANGEMELDETEN Lehrkraft an (avatarColor()
     liefert sie zuerst) - deshalb waren in der Liste alle Kreise gleich blau.
     Die Groesse kommt je Aufruf (pfAvatarHtml), die Farbe nur von hier. */
  .pf-ava{ border-radius:50%; flex:none; display:flex; align-items:center; justify-content:center;
    font-weight:800; overflow:hidden; background-size:cover; background-position:center;
    transition:opacity .15s ease; }
  .pf-ava-ini{ background:var(--brand-soft); color:var(--brand); }
  .pf-ava-platz{ width:30px; flex:none; }
  .pf-conv-main{ flex:1; min-width:0; }
  .pf-conv-name{ font-weight:800; font-size:14px; overflow:hidden; text-overflow:ellipsis;
    white-space:nowrap; display:flex; align-items:center; gap:6px; }
  /* Der Name kuerzt sich mit „…" - im Flex-Kasten selbst tut text-overflow
     nichts, deshalb steckt er in einem eigenen Element (v2.909.0). Das
     Etikett „Gruppe" stand bis v2.908.0 dahinter und quetschte lange Namen
     zusammen; die Gruppe erkennt man am Doppelkreis und am Filter. */
  .pf-conv-n{ overflow:hidden; text-overflow:ellipsis; white-space:nowrap; min-width:0; }
  .pf-gtag{ font-size:9px; font-weight:800; letter-spacing:.5px; text-transform:uppercase;
    color:var(--muted); border:1px solid var(--line); border-radius:6px; padding:1px 5px;
    background:var(--card); flex:none; }
  .pf-conv-prev{ font-size:12.5px; color:var(--muted); overflow:hidden; text-overflow:ellipsis;
    white-space:nowrap; margin-top:2px; }
  .pf-conv-meta{ display:flex; flex-direction:column; align-items:flex-end; gap:4px; flex:none; }
  .pf-conv-date{ font-size:10.5px; color:var(--muted); }
  .pf-conv-date.neu{ color:var(--brand); font-weight:700; }
  .pf-conv-unread{ min-width:18px; height:18px; padding:0 5px; border-radius:9px; background:var(--brand);
    color:#fff; font-size:10.5px; font-weight:800; display:flex; align-items:center; justify-content:center; }
  /* Gruppen-Avatar: zwei ueberlappende runde Mini-Avatare - der hintere im
     Hauch, der vordere gefuellt, beide in der Flaechenfarbe (Akzent-Abschnitt). */
  .pf-gava{ position:relative; flex:none; display:inline-block; transition:opacity .15s ease; }
  .pf-gava .g1,.pf-gava .g2{ position:absolute; border-radius:50%; font-weight:800;
    display:flex; align-items:center; justify-content:center; border:2px solid var(--card); }
  .pf-gava .g1{ left:0; top:0; z-index:1; background:var(--brand-soft); color:var(--brand); }
  .pf-gava .g2{ right:0; bottom:0; z-index:2; background:var(--brand); color:var(--on-brand); }
  /* Chat-Kopf: klickbarer Titel -> Details/Einstellungen. Keine eigene
     Flaeche mehr - er liegt wie alles hier auf dem Panel. */
  .pf-chead{ display:flex; align-items:center; gap:4px; padding:10px 12px;
    border-bottom:1px solid var(--line); flex:none; min-height:62px; box-sizing:border-box; }
  .pf-chead:empty{ display:none; }
  .pf-chead-titel{ font-weight:800; font-size:14px; padding:0 4px; }
  .pf-chead-id{ display:flex; align-items:center; gap:10px; min-width:0; cursor:pointer;
    border-radius:12px; padding:4px 10px 4px 4px; margin-right:auto; transition:background .15s ease; }
  .pf-chead-id:hover{ background:var(--paper); }
  .pf-chead-tx{ min-width:0; display:flex; flex-direction:column; }
  .pf-chead-tx b{ font-size:14px; font-weight:800; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
  .pf-chead-tx span{ font-size:11px; color:var(--muted); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
  /* Gruener Punkt vor "gerade aktiv" (pfAktivText, index-app.js). */
  .pf-live{ display:inline-block; width:7px; height:7px; border-radius:50%;
    background:var(--ok,#1E9E52); margin-right:5px; vertical-align:1px; }
  .pf-asst-ava{ width:38px; height:38px; border-radius:50%; flex:none; display:flex; align-items:center;
    justify-content:center; background:linear-gradient(135deg,#2E5BFF,#7A5AF8); color:#fff; }
  .pf-asst-ava.big{ width:76px; height:76px; }
  .pf-msgs{ flex:1; overflow-y:auto; padding:16px 14px 8px; min-height:0;
    overscroll-behavior:contain; -webkit-overflow-scrolling:touch; }
  /* Leerer Chat-Bereich: ein Zeichen und EIN Satz, mittig - statt eines
     grauen Satzes oben in der Kopfzeile (v2.909.0). */
  .pf-leer-chat{ height:100%; display:flex; flex-direction:column; align-items:center;
    justify-content:center; gap:12px; color:var(--muted); font-size:13.5px; text-align:center;
    padding:24px; box-sizing:border-box; }
  .pf-leer-chat .pf-leer-ico{ width:56px; height:56px; border-radius:18px; display:flex;
    align-items:center; justify-content:center; background:var(--brand-soft); color:var(--brand); }
  .pf-mrow{ display:flex; gap:8px; margin-bottom:12px; align-items:flex-end; }
  /* FOLGEN WERDEN GEBUENDELT (v2.909.0): schreibt dieselbe Seite mehrmals
     hintereinander, stehen die Blasen dicht und nur die LETZTE traegt Bild
     und Spitze - wie in jedem Messenger. Vorher stand vor jeder einzelnen
     Systemnachricht derselbe Kreis („HA HA HA …"). pfMsgsRender setzt
     `.folgt` an jede Zeile, auf die noch eine desselben Absenders folgt. */
  .pf-mrow.folgt{ margin-bottom:4px; }
  .pf-mrow.me{ justify-content:flex-end; }
  .pf-mcol{ max-width:min(78%,460px); display:flex; flex-direction:column; }
  .pf-mrow.me .pf-mcol{ align-items:flex-end; }
  /* Chat-Blasen (v2.909.0): die empfangene liegt als zartes Grau auf dem
     Panel - ohne Rand und Schatten, die Blase ist selbst die Flaeche. Die
     eigene traegt den Hauch der Flaechenfarbe (Akzent-Abschnitt Nr. 12);
     ohne Wahl und im Dunkeln das ruhige Lavendel aus --pf-sent-bg. */
  .pf-bubble{ padding:9px 13px; border-radius:18px; font-size:13.5px; line-height:1.5;
    white-space:pre-wrap; word-break:break-word; background:var(--paper); color:var(--ink); }
  .pf-mrow:not(.folgt) .pf-bubble{ border-bottom-left-radius:6px; }
  .pf-mrow.me .pf-bubble{ background:var(--pf-sent-bg,#E6EAFF); color:var(--pf-sent-ink,#2B3358);
    border-bottom-left-radius:18px; }
  .pf-mrow.me:not(.folgt) .pf-bubble{ border-bottom-right-radius:6px; }
  .pf-absender{ font-size:11px; font-weight:700; color:var(--brand); margin:0 0 3px 2px; }
  /* Deep-Link-Button in Systemnachrichten („Bewerten & beenden", „Ticket
     öffnen", „Gespräch öffnen") - Fuellung im Akzent-Abschnitt. */
  .pf-deeplink{ display:inline-flex; align-items:center; gap:7px; margin-top:9px; padding:8px 14px;
    background:var(--brand); color:var(--on-brand); border:none; border-radius:10px; cursor:pointer;
    font:inherit; font-size:13px; font-weight:700; line-height:1; transition:background .15s ease; }
  .pf-deeplink-zeile{ margin-top:8px; }
  .pf-mtime{ font-size:10px; color:var(--muted); margin-top:3px; padding:0 4px; }
  .pf-bubble img{ max-width:220px; max-height:220px; border-radius:12px; display:block; cursor:pointer; }
  .pf-pdfchip{ display:flex; align-items:center; gap:7px; cursor:pointer; font-weight:700; font-size:12.5px; }
  /* Composer im Claude-Stil (2026-07-21): KEINE weisse Leiste + Trennlinie mehr,
     sondern EINE weiche, abgerundete Box, die frei ueber dem Chat schwebt.
     .pf-comp ist nur noch der transparente Rahmen (Abstand rundum), die
     eigentliche Box ist .pf-compbar. */
  .pf-comp{ display:flex; flex-direction:column; gap:6px; padding:8px 12px 12px;
    border-top:none; flex:none; background:transparent;
    position:relative; /* Anker fuer den @Mention-Picker (.pf-mention-menue) */ }
  .pf-compbar{ display:flex; align-items:flex-end; gap:4px; position:relative;
    background:var(--card); border:1.5px solid var(--line); border-radius:16px;
    padding:4px 5px 4px 6px; transition:border-color .18s ease, box-shadow .18s ease; }
  .pf-compbar:focus-within{ border-color:var(--brand); }
  /* Die Zeile unter einem Systemchat: es gibt nichts zu schreiben, also auch
     kein Feld - nur der eine Satz, warum. */
  .pf-comp-hinweis{ flex:1; text-align:center; font-size:12.5px; color:var(--muted); padding:4px 8px; }
  .pf-comp textarea{ flex:1; resize:none; border:none; border-radius:0;
    padding:9px 4px; font-size:13.5px; font-family:inherit; background:transparent; color:var(--ink);
    max-height:120px; box-sizing:border-box; min-height:38px; outline:none; }
  .pf-comp textarea:focus{ border:none; background:transparent; }
  /* DIE ZEICHEN-KNOEPFE (v2.909.0, „daha yumuşak daha güzel düğmeler"): in
     Ruhe nur das Zeichen, ohne die grauen Kreise dahinter; beim Zeigen ein
     abgerundetes Quadrat im Hauch der Flaechenfarbe (Akzent-Abschnitt).
     Groesse und Strich des Zeichens kommen aus .ic-* (pfIco). */
  .pf-icobtn{ appearance:none; border:none; cursor:pointer; width:38px; height:38px; flex:none;
    border-radius:12px; background:transparent; color:var(--muted);
    display:flex; align-items:center; justify-content:center;
    transition:background .15s ease, color .15s ease, transform .12s ease; }
  .pf-icobtn:hover{ background:var(--paper); color:var(--ink); }
  .pf-icobtn:active{ transform:scale(.92); }
  /* Senden: KEIN Kreis dahinter – das dunkle Flieger-Symbol (Wunsch: „mavi
     arkaplani kaldir, ucak siyah kalsin"). Beim Zeigen derselbe Hauch wie
     jeder Zeichen-Knopf. */
  .pf-icobtn.send{ color:var(--ink); }
  .pf-back{ display:none; }
  /* Assistent-Bereich (nutzt die bekannten .asst-* Klassen) */
  /* .pf-asst gibt es nicht mehr (v2.514.0): der Assistent war ein Bereich
     DIESES Screens und ist in ein eigenes Fenster gezogen. Die Regeln dafuer
     stehen bei .asst-widget weiter unten. */
  /* Info-/Einstellungs-Blatt (Klick auf den Chat-Kopf) */
  .pf-info{ position:absolute; inset:0; background:rgba(15,20,35,.38); z-index:30;
    display:flex; align-items:center; justify-content:center; padding:18px; animation:pfFade .18s ease; }
  .pf-info.hidden{ display:none; }
  /* `max-height` + Rollen (v2.909.0): eine Gruppe mit Mitgliederliste ist
     hoeher als der Chat - ohne beides war der Kopf der Karte oben
     abgeschnitten und nicht zu erreichen. */
  .pf-info-card{ position:relative; width:min(360px,100%); background:var(--card); border-radius:22px;
    box-shadow:0 18px 50px rgba(27,34,48,.25); padding:26px 20px 14px;
    max-height:100%; overflow-y:auto; box-sizing:border-box;
    animation:pfPop .2s cubic-bezier(.34,1.4,.64,1); }
  .pf-info-x{ position:absolute; top:10px; right:10px; }
  .pf-info-head{ display:flex; flex-direction:column; align-items:center; text-align:center;
    gap:9px; margin-bottom:16px; padding:0 6px; }
  .pf-info-head b{ font-size:var(--fs-base); }
  .pf-info-head span{ font-size:12.5px; color:var(--muted); line-height:1.55; }
  .pf-info-acts{ display:flex; flex-direction:column; gap:4px; }
  .pf-info-act{ display:flex; align-items:center; gap:11px; width:100%; text-align:left; background:none;
    border:none; font:inherit; font-size:13.5px; font-weight:700; color:var(--ink); cursor:pointer;
    padding:11px 12px; border-radius:14px; transition:background .14s ease; }
  .pf-info-act:hover{ background:var(--paper); }
  .pf-info-act.rot{ color:var(--bad); }
  .pf-info-act svg{ flex:none; }
  .pf-info-mehr{ position:absolute; top:10px; left:10px; }
  .pf-info-abschnitt{ font-size:11.5px; font-weight:800; letter-spacing:.05em; text-transform:uppercase;
    color:var(--muted); margin:4px 2px 6px; }
  /* Die kleinen Aufklapp-Menues der Zentrale („⋯" im Info-Blatt, Anhaengen
     im Eingabefeld) - Klassen statt Inline-Stil und onmouseover (v2.909.0). */
  .pf-menue{ position:absolute; z-index:80; background:var(--card); border:1px solid var(--line);
    border-radius:var(--r-card); box-shadow:var(--e-2); min-width:210px; padding:5px; }
  #pf-info-menue{ top:46px; left:12px; }
  #pf-anhang-menue{ left:0; bottom:52px; }
  .pf-menue-zeile{ display:flex; align-items:center; gap:10px; width:100%; border:0; background:none;
    padding:9px 10px; border-radius:10px; cursor:pointer; font:inherit; font-size:13.5px;
    font-weight:600; color:var(--ink); text-align:left; }
  .pf-menue-zeile:hover{ background:var(--paper); }
  .pf-menue-zeile .ic{ color:var(--muted); }
  .pf-menue-tx{ display:flex; flex-direction:column; }
  .pf-menue-tx b{ font-size:13px; }
  .pf-menue-tx span{ font-size:11px; color:var(--muted); font-weight:500; }
  .pf-icobtn.pf-klein{ width:28px; height:28px; border-radius:9px; }
  .pf-reply-ico, .pf-med-ico, .pf-anhang-ico, .pf-chev{ display:flex; flex:none; }
  .pf-anhang-ico, .pf-chev{ color:var(--muted); }
  .pf-chev .ic{ transition:transform .15s ease; }
  .pf-chev.offen .ic{ transform:rotate(90deg); }
  .pf-abschnitt{ font-size:12.5px; font-weight:700; color:var(--muted); margin:12px 2px 6px; }
  .pf-abschnitt:first-child{ margin-top:2px; }
  .pf-cico-38{ width:38px; height:38px; }
  .pf-chead-id.pf-ohne-info{ cursor:default; }
  .pf-chead-id.pf-ohne-info:hover{ background:transparent; }
  .pf-du{ color:var(--muted); font-weight:500; }
  .pf-pdfchip .ic{ flex:none; }
  /* Neue Gruppe / Gruppen-Einstellungen */
  .pf-cico{ width:40px; height:40px; border-radius:50%; background:var(--brand-soft); color:var(--brand);
    display:flex; align-items:center; justify-content:center; flex:none; }
  .pf-conv.pick{ cursor:pointer; }
  .pf-conv.pick .pf-conv-check{ opacity:1; }
  /* ===== "Neue Gruppe" im WhatsApp-Stil (2026-07): schmale mittige Karte,
     Avatar + Unterstrich-Namensfeld, schlanke Mitgliederliste, EIN kompakter
     Knopf. Mobil (<=720px, s. Media-Block unten) volle Breite. ===== */
  .pf-gn{ display:flex; flex-direction:column; gap:4px; width:100%; max-width:400px;
    margin:6px auto 0; background:var(--card); border:1.5px solid var(--line);
    border-radius:20px; padding:20px 18px 16px; box-sizing:border-box; }
  .pf-gn-kopf{ display:flex; align-items:center; gap:12px; margin-bottom:10px; }
  .pf-gn-ava{ width:52px; height:52px; border-radius:50%; flex:none; display:flex;
    align-items:center; justify-content:center; background:var(--brand-soft); color:var(--brand); }
  .pf-gn-kopf input[type="text"]{ flex:1; min-width:0; border:none !important;
    border-bottom:2px solid var(--line) !important; border-radius:0 !important;
    padding:8px 2px !important; font-size:16px; font-weight:600; background:transparent; }
  .pf-gn-kopf input[type="text"]:focus{ border-bottom-color:var(--brand) !important; outline:none; }
  .pf-gn-liste{ max-height:46vh; overflow-y:auto; margin:0 -6px; }
  .pf-gn .pf-conv{ padding:8px 10px; }
  .pf-gn .pf-gn-go{ align-self:center; margin-top:14px; padding:10px 26px; border-radius:999px; }
  .pf-gn input[type="text"]{ border:1.5px solid var(--line); border-radius:14px; padding:11px 14px;
    font:inherit; font-size:var(--fs-md); background:var(--card); outline:none; margin-bottom:8px;
    transition:border-color .18s ease; }
  .pf-gn input[type="text"]:focus{ border-color:var(--brand); }
  .pf-gn-hint{ font-size:12.5px; font-weight:700; color:var(--muted); margin:2px 0 4px; }
  .pf-gn-go{ margin-top:12px; }
  .pf-gn-err{ color:var(--bad); font-size:12.5px; min-height:16px; margin-top:6px; }
  /* KLASSENWAHL FUER DIE DURCHSAGE (v2.242.0). "kare kare" (Murat 10.08.2026):
     ein Klassenname ist zwei Zeichen lang - eine volle Zeile je Klasse waere
     verschenkte Flaeche und laesst 8 Klassen wie eine lange Liste aussehen.
     `auto-fill` statt fester Spaltenzahl, damit dieselbe Regel im schmalen
     Bereich zwei Kacheln zeigt und am Computer vier. */
  .pf-klwahl{ display:grid; gap:10px; padding:14px 4px;
    grid-template-columns:repeat(auto-fill, minmax(132px, 1fr)); }
  .pf-klkachel{ appearance:none; display:flex; flex-direction:column; align-items:center;
    gap:6px; padding:16px 10px; border:1.5px solid var(--line); border-radius:16px;
    background:var(--card); cursor:pointer; font:inherit; text-align:center;
    transition:border-color .15s ease, box-shadow .15s ease, transform .1s ease; }
  .pf-klkachel:hover{ border-color:var(--brand); box-shadow:0 4px 14px rgba(27,34,48,.08); }
  .pf-klkachel:active{ transform:scale(.98); }
  .pf-klkachel-ico{ display:flex; align-items:center; justify-content:center;
    width:44px; height:44px; border-radius:50%; background:var(--brand-soft); color:var(--brand); }
  .pf-klkachel b{ font-size:15px; }
  .pf-klkachel span:last-child{ font-size:11.5px; color:var(--muted); line-height:1.3; }
  /* Gueltigkeit im Eingabefeld der Durchsage - steht dort, wo im Chat die
     Bueroklammer sitzt. Eine Durchsage hat keinen Anhang, aber eine Frist.
     `width:auto` ist hier KEIN Schoenheitsfehler, sondern der ganze Punkt:
     ganz oben in dieser Datei steht `select{ width:100%; ... }` fuer die
     Formulare der App. Ohne die Ueberschreibung nimmt dieses eine Feld die
     volle Breite der Leiste, und Textfeld und Senden-Knopf werden auf null
     gequetscht - genau der Befund Murat 10.08.2026 ("yazma gönderme cubugu
     yok"). Die Leiste sah dabei voellig normal aus; nur schreiben konnte man
     nicht. Wer hier ein weiteres <select> einbaut, denkt an diese Zeile.
     Abgesichert von qa/unit/test_durchsage_bedienung.py. */
  .pf-ds-days{ width:auto; flex:none; align-self:center; border:none;
    background:var(--paper); border-radius:999px; padding:6px 26px 6px 10px;
    font:inherit; font-size:12px; font-weight:700; color:var(--muted);
    cursor:pointer; outline:none; }
  .pf-compbar textarea{ min-width:0; }
  .pf-gm-list{ max-height:260px; overflow-y:auto; margin-bottom:10px; }
  .pf-gm{ display:flex; align-items:center; gap:10px; padding:7px 6px; border-radius:12px; }
  .pf-gm.pick{ cursor:pointer; }
  .pf-gm.pick:hover{ background:var(--paper); }
  .pf-gm-n{ flex:1; min-width:0; font-weight:700; font-size:13.5px; display:flex; align-items:center;
    gap:6px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
  .pf-gm-x{ width:30px; height:30px; }
  /* Blaettern: aeltere Nachrichten */
  .pf-mehr-btn{ align-self:center; display:block; margin:0 auto 12px; appearance:none; border:1px solid var(--line);
    background:var(--card); color:var(--brand); font:inherit; font-size:12.5px; font-weight:700;
    border-radius:999px; padding:7px 16px; cursor:pointer; transition:border-color .15s ease, background .15s ease; }
  .pf-mehr-btn:hover{ border-color:var(--brand); background:var(--brand-soft); }
  .pf-mehr-btn:disabled{ opacity:.5; cursor:default; }
  @keyframes pfFade{ from{ opacity:0; } to{ opacity:1; } }
  @keyframes pfPop{ from{ opacity:0; transform:scale(.92); } to{ opacity:1; transform:none; } }

  /* ===== CHAT-FUNKTIONEN (2026-07): Antworten, Haken, Reaktionen, @Mentions,
     Suche im Chat, Pin/Stumm. JS-Gegenstuecke: pfMsgsRender/pfMsgMenue/
     pfReaktToggle/pfMentionTippen/pfChatSucheToggle/pfMarkToggle (index-app.js),
     Server: /api/postfach/reaktion|markierung|suche (app.py). ===== */
  /* Zitat-Block oben in der Blase (denormalisierte Vorschau vom Server). */
  .pf-quote{ border-left:3px solid var(--pf-sent,#5063D6); background:rgba(80,99,214,.09);
    border-radius:8px; padding:5px 9px; margin-bottom:6px; font-size:12px;
    color:var(--ink); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
  /* Zitat INNERHALB der eigenen (Pastell-)Blase: dunkler Text auf hellem Grund
     (die Blase ist jetzt pastell, nicht mehr kraeftig blau -> dunkel = lesbar). */
  .pf-mrow.me .pf-quote{ border-left-color:var(--pf-sent,#5063D6);
    background:rgba(80,99,214,.12); color:var(--pf-sent-ink,#2B3358); }
  /* Haken neben der Uhrzeit: EIN Haken, zwei Zustaende (2026-07).
     grau = gesendet/zugestellt · gruen = die andere Seite hat gelesen. */
  .pf-ticks{ display:inline-flex; margin-left:4px; color:var(--muted); vertical-align:-2px; }
  .pf-ticks.gelesen{ color:var(--ok,#1E9E52); }
  /* Alt-Klasse aus 2.x: falls irgendwo noch "blau" gerendert wird, sieht es
     wie der neue Gelesen-Zustand aus, statt unsichtbar zu bleiben. */
  .pf-ticks.blau{ color:var(--ok,#1E9E52); }
  /* Reaktions-Chips unter der Blase; eigene Reaktion = blauer Rand. */
  .pf-reakt{ display:flex; gap:4px; flex-wrap:wrap; margin-top:3px; }
  .pf-rchip{ appearance:none; border:1px solid var(--line); background:var(--card);
    border-radius:999px; padding:1.5px 8px; font-size:13px; cursor:pointer; line-height:1.5; }
  .pf-rchip b{ font-size:11px; color:var(--muted); font-weight:700; }
  .pf-rchip.mir{ border-color:var(--brand); background:var(--brand-soft); }
  /* ⌄-Knopf an der Blase (Antworten/Reagieren): dezent, auf Beruehr-Geraeten
     immer leicht sichtbar, mit Maus erst beim Hover. */
  /* Menue-Knopf an der Blase: NUR ein schlichtes Pfeil-/Chevron-Symbol, KEINE
     (halbtransparente) Kreisflaeche mehr (wirkte "aufgeklebt"). */
  /* Mit Zeiger erscheint er erst beim Zeigen auf die Blase (v2.909.0) - an
     jeder Blase ein Pfeil war Unruhe ohne Anlass. */
  .pf-mact{ position:absolute; top:3px; right:5px; width:16px; height:16px; border:none;
    border-radius:0; background:transparent; color:var(--muted); cursor:pointer;
    display:flex; align-items:center; justify-content:center; opacity:0;
    box-shadow:none; padding:0; transition:opacity .15s ease; }
  .pf-mrow.me .pf-mact{ color:var(--pf-sent,#5063D6); }
  .pf-bubble{ position:relative; }
  .pf-bubble:hover .pf-mact, .pf-mact:focus-visible{ opacity:1; }
  @media (hover:none){ .pf-mact{ opacity:.6; } }
  /* Kontextmenue an der Blase: Emoji-Leiste + "Antworten". */
  #pf-msg-menue{ position:absolute; z-index:70; background:var(--card);
    border:1.5px solid var(--line); border-radius:14px; box-shadow:0 10px 28px rgba(0,0,0,.16);
    padding:7px; min-width:230px; animation:pfPop .14s ease; }
  .pf-mm-emojis{ display:flex; gap:2px; justify-content:space-between; margin-bottom:5px; }
  .pf-mm-emoji{ appearance:none; border:none; background:none; font-size:19px;
    padding:4px 6px; border-radius:9px; cursor:pointer; }
  .pf-mm-emoji:hover{ background:var(--paper); }
  .pf-mm-act{ display:flex; align-items:center; gap:8px; width:100%; border:none;
    background:none; padding:8px 9px; border-radius:9px; cursor:pointer; font:inherit;
    font-size:13px; font-weight:600; color:var(--ink); }
  .pf-mm-act:hover{ background:var(--paper); }
  /* Reply-Leiste ueber dem Composer. */
  .pf-reply-prev{ display:flex; align-items:center; gap:8px; padding:6px 9px;
    border-left:3px solid var(--brand); background:var(--brand-soft); border-radius:10px; }
  .pf-reply-tx{ flex:1; min-width:0; font-size:12.5px; color:var(--muted);
    overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
  /* @Mention-Hervorhebung im Text + Picker ueber dem Composer. */
  .pf-mention{ color:var(--brand); font-weight:700; }
  .pf-mrow.erwaehnt .pf-bubble{ box-shadow:inset 0 0 0 1.5px var(--brand-soft),
    0 0 0 1.5px rgba(46,91,255,.25); }
  .pf-mention-menue{ position:absolute; bottom:100%; left:12px; right:12px; z-index:65;
    background:var(--card); border:1.5px solid var(--line); border-radius:14px;
    box-shadow:0 -6px 24px rgba(0,0,0,.12); padding:5px; max-height:220px; overflow-y:auto; }
  .pf-mention-row{ display:flex; align-items:center; gap:9px; width:100%; border:none;
    background:none; padding:7px 9px; border-radius:9px; cursor:pointer; font:inherit;
    font-size:13.5px; font-weight:600; text-align:left; }
  .pf-mention-row:hover{ background:var(--paper); }
  /* Suche INNERHALB der Konversation (unter dem Chat-Kopf). */
  #pf-csuche{ display:flex; align-items:center; gap:7px; padding:8px 12px;
    border-bottom:1px solid var(--line); background:var(--card); position:relative; flex:none; }
  #pf-csuche-erg{ position:absolute; top:100%; left:10px; right:10px; z-index:75;
    background:var(--card); border:1.5px solid var(--line); border-radius:0 0 14px 14px;
    box-shadow:0 12px 28px rgba(0,0,0,.14); max-height:300px; overflow-y:auto; }
  #pf-csuche-erg:empty{ display:none; }
  .pf-cs-row{ display:flex; flex-direction:column; gap:2px; width:100%; border:none;
    background:none; padding:9px 12px; cursor:pointer; font:inherit; text-align:left;
    border-bottom:1px solid var(--line); }
  .pf-cs-row:last-child{ border-bottom:none; }
  .pf-cs-row:hover{ background:var(--paper); }
  .pf-cs-meta{ font-size:11px; font-weight:700; color:var(--muted); }
  .pf-cs-tx{ font-size:12.5px; color:var(--ink); overflow:hidden; text-overflow:ellipsis;
    white-space:nowrap; }
  .pf-cs-leer{ padding:10px 12px; font-size:12.5px; color:var(--muted); }
  /* Suchtreffer kurz hervorheben. */
  .pf-bubble.pf-blink{ animation:pfBlink 1.5s ease; }
  @keyframes pfBlink{ 0%,60%{ box-shadow:0 0 0 2.5px var(--brand); } 100%{ box-shadow:none; } }
  /* Listen-Status: Pin/Stumm-Icons, @-Markierung, stummer (grauer) Zaehler. */
  .pf-conv-ico{ display:inline-flex; color:var(--muted); }
  .pf-conv-at{ min-width:18px; height:18px; border-radius:9px; background:var(--brand);
    color:#fff; font-size:11px; font-weight:800; display:inline-flex; align-items:center;
    justify-content:center; padding:0 4px; }
  .pf-conv-unread.stumm{ background:var(--muted); }
  @media (max-width:720px){
    /* Shell liegt fix ueber der App (eigener Mini-Kopf mit Zurueck-Pfeil).
       WICHTIG (Fix 2026-07-21): EXPLIZITE Hoehe statt nur inset:0. Grund: die
       Shell ist zugleich ein Flex-Container (display:flex aus der Basisregel).
       Bei `position:fixed` + `display:flex` + `height:auto` streckt iOS/Safari
       die Box NICHT zwischen top:0 und bottom:0 – sie fiel auf CONTENT-Hoehe
       zusammen: nur Kopf/Suche/eine Konversationszeile sichtbar, darunter grau
       (die eigentliche Beschwerde „Nachrichten wird abgeschnitten"). Desktop-
       Browser strecken korrekt, iOS nicht. Mit fester Hoehe (var(--vh100) =
       gemessene sichtbare Hoehe, dvh als Fallback) füllt die Shell zuverlässig
       den Bildschirm; die Liste (.pf-convs, flex:1) scrollt dann intern.
       pfViewportApply (index-app.js) überschreibt die Höhe nur bei OFFENER
       Tastatur mit dem kleineren visualViewport-Wert. */
    /* iOS-SICHERER VOLLBILD-OVERLAY (Neuaufbau 2026-07-21):
       Die Shell ist NICHT mehr display:flex. Grund: Bei position:fixed +
       display:flex + height:auto streckt iOS/Safari die Box nicht zwischen
       top:0 und bottom:0 -> sie fiel auf Content-Hoehe zusammen (Liste
       abgeschnitten, darunter grau). Ein NICHT-Flex fixed-Element mit inset:0
       fuellt den Viewport dagegen zuverlaessig. Die eigentlichen Spalten
       (.pf-left / .pf-right) liegen ABSOLUT mit inset:0 IM Overlay - absolute
       Fuellung ist auf iOS robust (kein Flex-Auto-Hoehen-Problem). Sie sind
       selbst Flex-Spalten (display:flex;flex-direction:column aus der Basis),
       damit die Liste (.pf-convs, flex:1) intern scrollt.
       height per JS (pfViewportApply) zusaetzlich als konkreter px-Wert -
       Guertel und Hosentraeger. */
    /* Die DECKENDE Flaeche gehoert hierher (v2.909.0): am Rechner liegt die
       Zentrale ohne eigene Flaeche auf dem Panel, hier liegt sie als Blatt
       ueber der ganzen App - durchsichtig schiene die Seite darunter durch.
       Die Linie zum Ziehen gibt es nur, wo Liste und Chat nebeneinander
       stehen. */
    .pf-shell{ position:fixed; inset:0; z-index:9000; min-height:0;
      height:100dvh; /* ueberschreibt die Basisregel height:calc(vh-175px);
        JS (pfViewportApply) setzt zusaetzlich eine exakte px-Hoehe */
      display:block; border:none; border-radius:0; background:var(--card); }
    .pf-trenner{ display:none; }
    .pf-left, .pf-right{ position:absolute; inset:0; width:auto; height:auto;
      min-height:0; border-right:none; background:var(--card); }
    .pf-mobiletop{ display:flex; align-items:center; gap:8px;
      padding:calc(8px + env(safe-area-inset-top)) 12px 2px; }
    .pf-mtitle{ font-weight:800; font-size:17px; }
    .pf-chead{ padding-top:calc(9px + env(safe-area-inset-top));
      min-height:calc(58px + env(safe-area-inset-top)); }
    /* 16px verhindert den automatischen iOS-Zoom beim Fokussieren */
    .pf-comp textarea{ font-size:16px; }
    /* Eingabebox moeglichst weit unten "anlehnen": nur die Safe-Area (Home-
     Indicator) als Abstand, kein extra Luft (Wunsch: unten angelehnt). */
    .pf-comp{ padding:6px 8px calc(6px + env(safe-area-inset-bottom)); }
    .pf-search input{ font-size:16px; }
    .asst-input input{ font-size:16px; }
    .asst-input{ padding-bottom:calc(11px + env(safe-area-inset-bottom)); }
    .pf-left{ width:100%; border-right:none; }
    .pf-right{ display:none; }
    /* "Neue Gruppe": mobil volle Breite, Karte ohne Rahmen (WhatsApp-Feeling). */
    .pf-gn{ max-width:none; border:none; border-radius:0; padding:10px 6px; margin:0; }
    .pf-gn-liste{ max-height:none; }
    .pf-shell.chat .pf-left{ display:none; }
    .pf-shell.chat .pf-right{ display:flex; }
    .pf-back{ display:flex; }
    .pf-info{ align-items:flex-end; padding:0; }
    .pf-info-card{ width:100%; border-radius:26px 26px 0 0; animation:pfUp .22s ease;
      padding-bottom:calc(14px + env(safe-area-inset-bottom)); }
    @keyframes pfUp{ from{ transform:translateY(46px); opacity:.4; } to{ transform:none; opacity:1; } }
  }
  /* Roter Benachrichtigungs-Punkt am Profil (offene Meldungen) */
  .avatar-badge{ position:absolute; top:-3px; right:-3px; min-width:18px; height:18px; padding:0 4px;
    background:#e23; color:#fff; font-size:10.5px; font-weight:800; text-align:center;
    border-radius:9px; border:2px solid var(--bg,#fff); box-sizing:border-box; pointer-events:none;
    display:flex; align-items:center; justify-content:center; line-height:1; }
  .am-alert{ display:flex; align-items:center; gap:8px; margin:2px 6px 6px; padding:9px 11px;
    background:rgba(226,51,51,.08); border:1px solid rgba(226,51,51,.25); border-radius:10px;
    color:#c41e1e; font-size:13px; font-weight:600; cursor:pointer; width:calc(100% - 12px); text-align:left; }
  .am-alert:hover{ background:rgba(226,51,51,.14); }
  .avatar-btn {
    display:flex; align-items:center; gap:7px;
    appearance:none; border:none; cursor:pointer; background:transparent;
    padding:3px; border-radius:999px;
    transition: background .15s ease;
  }
  .avatar-btn:hover { background: rgba(127,127,127,0.10); }
  /* `flex:none` ist kein Schmuck: die Kopfzeile ist ein Flex-Behaelter, und
     ohne diese Zeile drueckt ein langer Schulname das runde Bild zu einem Ei
     zusammen. Auf dem Computer faellt es kaum auf, am Telefon sofort. */
  .avatar-circle {
    width:40px; height:40px; border-radius:50%; flex:none;
    display:flex; align-items:center; justify-content:center;
    color:#fff; font-weight:700; font-size:15px; letter-spacing:.3px;
    box-shadow: 0 2px 8px rgba(27,34,48,0.18);
    user-select:none; overflow:hidden;
  }
  .avatar-caret { width:10px; height:10px; flex:none; transition: transform .2s ease; color: var(--muted); }
  .avatar-btn.open .avatar-caret { transform: rotate(180deg); }

  /* Schul-Kapsel (aktive Schule): Logo + voller Schulname (2 Zeilen) + Profil.
     TIEFE STATT RAHMEN (v2.288.0): Rand und Standardschatten sind raus, das
     Schattenpaar traegt die Form allein - genau wie an den Leisten-Eintraegen,
     die auch keinen Rahmen haben. Flaeche --paper, siehe die lange Begruendung
     bei .pf-btn (auf Weiss faellt die helle Haelfte aus). */
  .avatar-wrap.with-school{ display:flex; align-items:center; gap:10px;
    background:var(--paper); border:none; border-radius:999px;
    padding:4px 6px 4px 10px;
    box-shadow:3px 3px 7px var(--sb-tief), -3px -3px 7px var(--sb-hoch); }
  /* Ohne Schulzuordnung steht das Profil allein - es bekommt dieselbe Tiefe,
     sonst schwebte ein nacktes Foto neben einem erhabenen Zarf. */
  .avatar-wrap:not(.with-school) .avatar-btn{
    background:var(--paper);
    box-shadow:3px 3px 7px var(--sb-tief), -3px -3px 7px var(--sb-hoch);
    transition:box-shadow .18s var(--sb-weich); }
  .avatar-wrap:not(.with-school) .avatar-btn:hover{
    background:var(--paper);
    box-shadow:inset 2px 2px 5px var(--sb-tief), inset -2px -2px 5px var(--sb-hoch); }
  .avatar-wrap.with-school .avatar-btn{ padding:0; }
  .avatar-wrap.with-school .avatar-btn:hover{ background:transparent; }
  .av-school{ display:flex; align-items:center; gap:9px; min-width:0; }
  .av-school-logo{ width:32px; height:32px; border-radius:50%; flex:none;
    background-color:transparent; background-size:cover; background-repeat:no-repeat; background-position:center;
    padding:0;
    border:none; display:flex; align-items:center; justify-content:center; overflow:hidden; }
  .av-school-logo--brand{ background-color:var(--brand); border:none; box-shadow:0 2px 6px rgba(46,91,255,.28); }
  .av-school-logo svg{ width:18px; height:18px; fill:none; stroke:#fff; stroke-width:2;
    stroke-linecap:round; stroke-linejoin:round; }
  .av-school-name{ font-size:11.5px; font-weight:600; line-height:1.2; color:var(--ink);
    letter-spacing:-.01em; max-width:150px;
    display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden; }
  .av-school-div{ width:1px; height:28px; background:var(--line); flex:none; }
  /* Schulverwaltung (nur Schul-Admins): sitzt NEBEN der Schul-Kapsel, rechts
     vom Namen. Bewusst nur ein Icon-Knopf und kein Wort „Admin" - ein Wort
     neben dem Schulnamen liest sich als Zustandsangabe und wird nicht
     angeklickt.

     SEIT v2.353.0 IST ER DER EINZIGE EINSTIEG (Entscheidung Murat 20.08.2026:
     „sol taraftaki Verwaltung'u kaldiralim ... o admin seyini renkli yap").
     Daraus folgen die beiden Aenderungen an dieser Stelle:

     (a) ER TRAEGT FARBE. Vorher war er grau bis zur Beruehrung - richtig,
         solange die Seitenleiste denselben Weg noch einmal anbot. Als
         einziger Einstieg muss er von selbst als Knopf zu erkennen sein.
         SEIT v2.355.0 traegt die FARBE DAS ZEICHEN, nicht mehr eine Scheibe
         dahinter (Anweisung Murat 20.08.2026: „verwaltung girisinin
         arkasindaki mor yuvarlagi kaldir … ikonun kendisini mor yap").
         Der gefuellte Kreis war in einer Kopfzeile mit drei Elementen ein
         Fleck, der schwerer wog als das Schul-Logo daneben; das Zeichen
         selbst war darin nur 16px gross. Jetzt: kein Kreis, 24px, kraeftige
         Linie, violett. Die Klickflaeche bleibt 40px.
         VIOLETT UND NICHT ROT: Rot heisst in SchlauStart ueberall Gefahr
         (loeschen, Fehler, --bad). Ein Knopf, den ein Schul-Admin taeglich
         drueckt, in der Alarmfarbe waere die schnellste Art, Rot seine
         Warnwirkung zu nehmen. `--sv-verwaltung` ist die Farbe, die dieser
         Bereich in der Seitenleiste ohnehin trug (SB_FARBE.schule bis
         v2.352.0); sie ist mit dem Einstieg ins Woerterbuch umgezogen
         (design-tokens.css) - ein Ort, eine Farbe, EIN Hex-Wert. Weisses
         Icon darauf: 5.6:1, weit ueber den 3:1 fuer grafische Elemente
         (DESIGN_SYSTEM.md §3.3).
     (b) ER BLEIBT AM TELEFON STEHEN. Der 640px-Block unten blendet nur noch
         Schulname und Trennstrich aus. Wer ihn dort wieder mit ausblendet,
         sperrt jeden Schul-Admin am Handy, in der PWA und in beiden
         Store-Apps aus - unbemerkt, weil am Computer alles stimmt.
     MIT WEM: renderAuthbar() in static/js/index-app.js -> openSchulverwaltung(),
     qa/unit/test_schulverwaltung_einstieg.py. */
  /* ===== DAS KROENCHEN STATT EINES ZWEITEN KNOPFES (v2.414.0) ==========
     Der eigene Verwaltungs-Knopf (`.av-school-adm`) ist weg - Befund Murat
     24.08.2026: „yaninda admin girisi var ya onu kaldir … admin oldugunu
     belli eden bir tac ikonu ekleyelim." Die Kapsel selbst fuehrt jetzt in
     die Schulverwaltung; das Kroenchen sagt nur noch, DASS man Admin ist.

     Es sitzt am Logo und nicht daneben: ein Zustand gehoert an das Bild,
     zu dem er gehoert. Weisser Ring darum, damit es auf jedem Schullogo
     ablesbar bleibt - auch auf einem hellen.

     SEIT v2.419.0 IST ES EINE NACKTE GOLDENE KRONE (Anweisung Murat
     24.08.2026: „arkaplan koymadan baya bildigin sari tac ikonu ... sari
     olsun ama kronen iste"). Bis v2.418.0 sass ein weisses Glyph auf einer
     violetten Scheibe mit weissem Ring - fachlich richtig (--sv-verwaltung
     ist die Bereichsfarbe), aber es sah aus wie ein zweiter KNOPF am Logo,
     und genau den zweiten Knopf hat v2.414.0 abgeschafft. Ein Kroenchen ist
     ein Orden: es zeigt einen Zustand und ist nichts zum Druecken.

     DIE ZEICHNUNG KOMMT AUS LUCIDE (`crown`, v0.460.0 - dieselbe Fassung,
     die unter static/vendor/lucide.min.js liegt), nicht aus der freien Hand:
     DESIGN_SYSTEM.md §6.2. Sie ist hier GEFUELLT statt gestrichelt, und das
     ist der Sonderfall, nicht die neue Regel: bei 15px zeichnet eine
     Lucide-Linie rund 1.2px - in Gold auf einem unbekannten Schullogo ist
     das nichts mehr. Eine Flaeche mit dunkler Kante haelt sich dort.

     ZWEI TOENE (--krone / --krone-rand, design-tokens.css): Gold allein
     erreicht auf Weiss nur 1.9:1, die dunkle Kante bringt 5.9:1. Ohne diese
     Kante waere die Krone auf einem hellen Logo weg - und der Schul-Admin
     saehe dieselbe Kapsel wie jede andere Lehrkraft.

     ⛔ KEIN ROT. Rot heisst in SchlauStart ueberall Gefahr; ein Zeichen, das
     ein Schul-Admin taeglich sieht, nimmt Rot seine Warnwirkung. Und kein
     --amber: Bernstein heisst „Hinweis", eine Rolle ist kein Hinweis. */
  .av-school-logowrap{ position:relative; flex:none; display:flex; }
  .av-school-krone{
    position:absolute; right:-5px; bottom:-4px;
    width:15px; height:15px;
    display:flex; align-items:center; justify-content:center;
    background:none; border:0;
  }
  .av-school-krone svg{ width:15px; height:15px; fill:var(--krone);
    stroke:var(--krone-rand); stroke-width:1.7;
    stroke-linejoin:round; stroke-linecap:round; }
  .av-school.ist-admin:hover .av-school-name{ color:var(--sv-verwaltung); }

  /* ===== AM TELEFON BLEIBT DIE KAPSEL STEHEN (v2.414.0) ================
     Bis v2.413.0 stand hier `.av-school{display:none}` - der Schulname war
     am Handy weg, weil daneben noch der zweite Knopf Platz brauchte.
     Befund Murat: „eskiden burda benim okulum okulum ismi dururdu o gitmis."
     Mit nur noch EINEM Element ist der Platz da. Der Name wird schmal
     gekuerzt statt ausgeblendet: „Erich-Kaestner-Gesamtschule" braucht
     nicht ganz dazustehen, aber ganz zu fehlen ist etwas anderes.

     ⛔ NICHT WIEDER AUSBLENDEN: die Kapsel ist der einzige Weg in die
     Schulverwaltung (siehe renderAuthbar). Wer sie hier versteckt, sperrt
     jeden Schul-Admin am Handy aus - unbemerkt, weil am Computer alles
     stimmt. */
  /* ===== SCHMAL BLEIBT VOM SCHULNAMEN NUR DAS LOGO (v2.415.0) ==========
     NACHGERECHNET auf 402px (iPhone 16), Kopfzeile im Klassenbuch:
       Rand 28 + Hamburger 40 + Titel 118 + Klassen-Chip 74 + Zarf 34
       + Kapsel MIT Namen 96 + Profil 44 + Abstaende 30  =  464px.
     Also rund 70px zu viel - und weil der Seitentitel dort auf
     `text-overflow:clip` steht, schob der Ueberhang das Profilbild aus dem
     Bild. Genau das war Befund Murat 24.08.2026: „üstteki profil mesajlar
     klassede kalenderda üstüne binmis o kisimlarin."

     Der Name ist von allem hier das Entbehrlichste: an WELCHER Schule man
     arbeitet, aendert sich nicht von Seite zu Seite - es steht im Cockpit
     und ab 641px wieder in der Kopfzeile. Was bleiben MUSS, ist die Kapsel
     selbst samt Kroenchen: sie ist der einzige Weg in die Schulverwaltung
     (siehe renderAuthbar) und das einzige Zeichen der Rolle. */
  @media (max-width:640px){
    .av-school{ gap:6px; }
    .av-school-name{ display:none; }
    .av-school-div{ height:22px; margin:0 2px; }
    .av-school-logo{ width:28px; height:28px; }
    .av-school-logo svg{ width:16px; height:16px; }
    /* Schmal ist das Kroenchen das EINZIGE, was von der Rolle uebrig bleibt
       (der Schulname ist hier ausgeblendet) - es wird kleiner, aber nicht
       nennenswert: unter 13px verliert die Zackenreihe ihre Form und die
       Krone wird zu einem goldenen Fleck. */
    .av-school-krone{ width:13px; height:13px; right:-4px; bottom:-3px; }
    .av-school-krone svg{ width:13px; height:13px; stroke-width:1.9; }
  }


  /* z-index 500, NICHT 50 (Fehler 01.08.2026): das Profilmenue haengt in der
     Kopfzeile, die haftende Aufgaben-Leiste (.dash-toolbar) steht mit z-index 50
     WEITER UNTEN im Dokument. Bei gleichem z-index gewinnt das spaetere Element -
     also lag die Leiste ueber dem geoeffneten Menue und schnitt es durch.
     Wer hier eine Zahl aendert: sie muss ueber allen haftenden Leisten der
     Screens (50/60/80) und unter den Overlays/Modalen (>=4000) bleiben. */
  .avatar-menu {
    position:absolute; top:52px; right:0; z-index:500;
    min-width:250px; padding:7px;
    background: var(--card);
    border:1px solid var(--line); border-radius:16px;
    box-shadow: 0 16px 40px rgba(27,34,48,0.16);
    opacity:0; transform: translateY(-6px) scale(0.98);
    pointer-events:none; transition: opacity .15s ease, transform .15s ease;
  }
  .avatar-menu.open { opacity:1; transform: translateY(0) scale(1); pointer-events:auto; }
  /* Apple-klarer Kopf: Foto + Name + eine ruhige, dezente Unterzeile */
  .avatar-menu .am-head {
    display:flex; align-items:center; gap:11px;
    padding:9px 10px 12px; margin:2px 2px 6px;
    border-bottom:1px solid var(--line);
  }
  .avatar-menu .am-avatar {
    width:42px; height:42px; border-radius:50%; flex:none;
    display:flex; align-items:center; justify-content:center;
    color:#fff; font-weight:700; font-size:15px; letter-spacing:.3px;
    box-shadow: 0 2px 8px rgba(27,34,48,0.16); user-select:none;
  }
  .avatar-menu .am-head-tx { min-width:0; }
  .avatar-menu .am-name { font-weight:700; font-size:15px; color:var(--ink); white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
  .avatar-menu .am-sub { font-size:12.5px; color:var(--muted); margin-top:2px; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
  .avatar-menu button {
    display:flex; align-items:center; gap:10px; width:100%;
    appearance:none; border:none; background:transparent; cursor:pointer;
    font-family:inherit; font-size:var(--fs-md); font-weight:600; color:var(--ink);
    text-align:left; padding:11px 12px; border-radius:9px;
    transition: background .12s ease;
  }
  .avatar-menu button:hover { background: rgba(127,127,127,0.10); }
  .avatar-menu button.am-logout { color: var(--bad); }
  .avatar-menu button.am-logout:hover { background: rgba(216, 64, 64, 0.10); }
  /* Unterstützen: farblich hervorgehoben (Herz-Rot), damit es auffällt */
  .avatar-menu button.am-support { color:#E0463E; font-weight:700; }
  .avatar-menu button.am-support .am-ico { color:#E0463E; }
  .avatar-menu button.am-support:hover { background: rgba(224,70,62,0.10); }
  .avatar-menu .am-divider { height:1px; background:var(--line); margin:6px 4px; }
  .avatar-menu .am-label { font-size:10.5px; font-weight:800; letter-spacing:.05em; text-transform:uppercase; color:var(--muted); padding:8px 10px 3px; }
  .avatar-menu button svg.am-ico { width:18px; height:18px; flex:none; fill:none; stroke:currentColor; stroke-width:2; stroke-linecap:round; stroke-linejoin:round; opacity:.85; }
  .avatar-menu .am-section { padding:8px 12px 4px; font-size:11px; color:var(--muted); font-weight:700; letter-spacing:.04em; text-transform:uppercase; }
  /* === Konto verwalten: ANTON-Stil Liste + Profilkarte === */
  .kp-card{display:flex;align-items:center;gap:16px;padding:18px;border:1.5px solid var(--line);border-radius:16px;margin-bottom:18px;background:linear-gradient(180deg,var(--brand-soft,rgba(46,91,255,.05)),var(--card));}
  .kp-photo{width:72px;height:72px;border-radius:50%;flex:none;background-size:cover;background-position:center;display:flex;align-items:center;justify-content:center;font-size:28px;font-weight:800;color:#fff;position:relative;overflow:hidden;}
  .kp-photo .kp-edit{position:absolute;bottom:0;left:0;right:0;background:rgba(0,0,0,.45);color:#fff;font-size:10px;text-align:center;padding:2px 0;font-weight:700;}
  .kp-meta{min-width:0;}
  .kp-name{font-weight:800;font-size:18px;color:var(--ink);word-break:break-word;}
  .kp-mail{font-size:13px;color:var(--muted);word-break:break-word;margin-top:2px;}
  .kp-photo-actions{display:flex;gap:8px;margin-bottom:18px;flex-wrap:wrap;}
  .krow{display:flex;align-items:center;gap:4px;justify-content:space-between;cursor:pointer;padding:16px 4px;border-bottom:1px solid var(--line);user-select:none;}
  .krow:last-child{border-bottom:none;}
  .krow:hover{background:rgba(127,127,127,.04);}
  .krow-main{min-width:0;}
  .krow-title{font-weight:700;font-size:15.5px;color:var(--ink);}
  .krow-sub{font-size:13px;color:var(--muted);margin-top:2px;}
  .krow-arr{width:18px;height:18px;flex:none;fill:none;stroke:var(--muted);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;transition:transform .15s;}
  .krow.open .krow-arr{transform:rotate(90deg);}
  .krow-body{overflow:hidden;max-height:0;transition:max-height .2s ease;}
  .krow-body.open{max-height:none;padding:6px 4px 14px;}
  /* === Einstellungen (ANTON-Stil): Kopfzeile + Navigations-Liste + Unterseiten === */
  /* Auf dem Einstellungen-Screen: die alte Kopfzeile KOMPLETT ausblenden – nicht
     nur Logo/Begrüßung. Sonst bleibt die leere Leiste (min-height 48px + margin)
     als großer Freiraum über "Einstellungen" stehen. */
  body[data-screen="konto"] .topbar{display:none !important;}

  /* SSO-Invite-Bildschirm (neuer Lehrer per Google/IServ): ruhiger, zentrierter
     Kopf – nur ein großes, mittiges Logo statt der Begrüßungszeile. */
  body[data-screen="sso-invite"] .topbar{
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 0;
    margin: 26px 0 30px;
  }
  body[data-screen="sso-invite"] .topbar .greeting,
  body[data-screen="sso-invite"] .topbar #authbar-fallback{ display: none !important; }
  body[data-screen="sso-invite"] .main-logo{ height: 88px; cursor: default; }
  body[data-screen="sso-invite"] .app-topbar{ display: none !important; }
  /* Leere App-Kopfzeile (kein Seitentitel für Konto) reserviert sonst Platz –
     ausblenden, damit der Einstellungen-Inhalt bündig oben beginnt. */
  /* AUSNAHME (Faz 7, 2026-07-20): In der App-Shell BRAUCHT die Kopfzeile ihren
     Platz - dort steht links "Einstellungen" und rechts das Profil, genau wie
     im Cockpit. Nur OHNE Seitenleiste (Vollbild-Fallback) bleibt sie weg. */
  body[data-screen="konto"]:not(.has-sidebar) .app-topbar{display:none !important;}
  /* Oberen Innenabstand des Panels kürzen, damit die Liste weiter oben startet. */
  body[data-screen="konto"]:not(.has-sidebar) .wrap{padding-top:max(calc(12px + env(safe-area-inset-top)), 18px) !important;}
  .kset-head{margin:-2px 0 6px;}
  .kset-row1{display:flex;align-items:center;gap:10px;padding:2px 0;}
  .kset-x{appearance:none;border:none;background:transparent;cursor:pointer;padding:4px;margin-left:-4px;border-radius:8px;display:flex;align-items:center;color:var(--ink);}
  .kset-x:hover{background:rgba(127,127,127,.08);}
  .kset-x svg{width:20px;height:20px;fill:none;stroke:currentColor;stroke-width:2.2;stroke-linecap:round;}
  .kset-title{font-weight:800;font-size:17px;color:var(--ink);}
  .kset-head.sub .kset-row1 .kset-title{font-weight:600;font-size:var(--fs-md);color:var(--muted);}
  .kset-head.sub .kset-x{color:var(--muted);}
  .kset-row2{display:flex;align-items:center;gap:10px;padding:6px 0 2px;cursor:pointer;user-select:none;}
  .kset-row2:hover .kset-title2{color:var(--brand);}
  .kset-back{display:flex;align-items:center;padding:4px;margin-left:-4px;border-radius:8px;color:var(--ink);}
  .kset-row2:hover .kset-back{background:rgba(127,127,127,.08);}
  .kset-back svg{width:20px;height:20px;fill:none;stroke:currentColor;stroke-width:2.2;stroke-linecap:round;stroke-linejoin:round;}
  .kset-title2{font-weight:800;font-size:17px;color:var(--ink);}
  /* Navigations-Zeile: Titel links, Wert + Chevron rechts */
  .knav{display:flex;align-items:center;gap:10px;justify-content:space-between;cursor:pointer;padding:16px 4px;border-bottom:1px solid var(--line);user-select:none;}
  .knav:hover{background:rgba(127,127,127,.04);}
  .knav-main{min-width:0;flex:1;}
  .knav-title{font-weight:700;font-size:15.5px;color:var(--ink);}
  .knav-sub{font-size:13px;color:var(--muted);margin-top:2px;}
  /* Graue Versionszeile ganz unten in den Einstellungen (kein Knopf). */
  .konto-vfuss{ text-align:center; color:var(--muted); font-size:12.5px;
    padding:22px 0 30px; letter-spacing:.01em; user-select:none; }
  .knav-val{font-size:14px;color:var(--muted);text-align:right;max-width:46%;flex:none;line-height:1.45;}
  .knav-val .kv-badge{display:inline-flex;align-items:center;gap:6px;}
  .knav-arr{width:18px;height:18px;flex:none;fill:none;stroke:var(--muted);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;}
  /* Einstellungen im Apple-Account-Stil: gruppierte Karten + Icon-Kacheln.
     Gehoert zu kontoMainMenu()/kontoRowIco() in index-app.js. */
  /* PWA-Desktop (window-controls-overlay, manifest display_override):
     Die Titelleiste ist weg - dieser unsichtbare Streifen oben macht das
     Fenster wieder ZIEHBAR (Drag-Regionen muss die App selbst definieren).
     Er deckt nur die Titelbar-Zone ab (~30px, graue Randflaeche) und
     schluckt dort Klicks - Inhalte liegen tiefer. */
  @media (display-mode: window-controls-overlay){
    body::before{
      content:""; position:fixed; z-index:9990;
      left:env(titlebar-area-x, 0); top:env(titlebar-area-y, 0);
      width:env(titlebar-area-width, 100%); height:env(titlebar-area-height, 30px);
      -webkit-app-region:drag; app-region:drag;
    }
  }
  .kgroup{border:1px solid var(--line);border-radius:16px;overflow:hidden;margin:0 0 14px;background:var(--card,#fff);}
  .kgroup .knav{border-bottom:1px solid var(--line);padding:12px 14px;}
  .kgroup .knav:last-child{border-bottom:none;}
  .kico{width:30px;height:30px;border-radius:8px;display:flex;align-items:center;justify-content:center;flex:none;color:#fff;}
  .kico svg{width:17px;height:17px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;}
  .kprof{display:flex;align-items:center;gap:14px;padding:16px 14px;cursor:pointer;user-select:none;}
  .kprof:hover{background:rgba(127,127,127,.04);}
  .kprof-ava{width:58px;height:58px;border-radius:50%;flex:none;display:flex;align-items:center;justify-content:center;font-weight:800;color:#fff;font-size:20px;background-size:cover;background-position:center;}
  .kprof-name{font-weight:800;font-size:17px;color:var(--ink);}
  .kprof-sub{font-size:12.5px;color:var(--muted);margin-top:2px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}

  /* ===== EINSTELLUNGEN ZWEISPALTIG (macOS-Bauform, v2.253.0) ==============
     Auftrag Murat 10.08.2026: „ya ayni bu applein einstellungu gibi olsun ya."
     Die Systemeinstellungen von macOS koennen zwei Dinge, die hier gefehlt
     haben: die Kategorien bleiben SICHTBAR, waehrend man in einer davon
     arbeitet, und die aktive Zeile ist markiert – man weiss jederzeit, wo man
     ist, ohne zurueckzugehen.

     WIE UMGESCHALTET WIRD: `body[data-kset]` steht auf "main" (Liste) oder
     "sub" (eine Kategorie offen); gesetzt von renderKonto(). Ab 900px ist der
     Wert egal, weil BEIDE Spalten stehen – darunter entscheidet er, welche
     der beiden zu sehen ist. Die 900 steht spiegelbildlich in
     kontoZweispaltig() (index-app.js).

     FARBEN: die Auswahl nimmt `--flaeche-akzent-soft/-ink`, also den Ton der
     eingestellten Flaechenfarbe. Ein fester blauer Balken neben einem
     salbeigruenen Hintergrund sah aus wie ein Fremdkoerper. Die
     Rueckfallwerte sind Pflicht: im dunklen Design sind die Variablen
     bewusst ungesetzt (ssAkzentSetzen bricht dort ab). */
  #screen-konto > .card.kset-shell{display:block;}
  .kset-nav{min-width:0;}
  .kset-detail{min-width:0;}
  .kset-navkopf{display:flex;align-items:center;gap:10px;padding:2px 0 10px;}
  .kset-nav .kgroup{margin-bottom:10px;}
  .kset-nav .kgroup.stumm .kico{filter:saturate(.25);opacity:.85;}
  .kset-nav .knav.on{background:var(--brand-soft,#EEF2FF);}
  .kset-nav .knav.on .knav-title{color:var(--brand,#2E5BFF);}
  .kset-nav .kprof.on{background:var(--brand-soft,#EEF2FF);}
  @media(min-width:900px){
    #screen-konto > .card.kset-shell{
      display:flex; align-items:stretch; gap:0; flex-direction:row;
    }
    /* KLEINER UND BREITER (Befund Murat 10.08.2026: „cok büyük gereksiz yani
       gerekirse bir bakista görünür hem"). Die Spalte hatte die Schriftgroesse
       einer INHALTSliste (15.5px Titel, 13px Untertitel) – sie ist aber eine
       NAVIGATION. Bei 290 px Breite brachen dadurch drei von zwoelf
       Beschriftungen um; „Kompetenzen & Lehrplan" stand dreizeilig. Zwei
       Zeilen weniger Schrift und 34 px mehr Breite bringen alles auf eine
       Zeile – die ganze Liste passt ohne Rollen ins Bild, und genau das ist
       der Zweck der zweiten Spalte. */
    .kset-nav{
      flex:0 0 324px; max-width:324px; padding:2px 16px 18px 2px;
      border-right:1px solid var(--line); overflow-y:auto; scrollbar-width:none;
    }
    .kset-nav .kgroup .knav{padding:9px 12px;gap:9px;}
    .kset-nav .knav-title{font-size:13.5px;font-weight:650;line-height:1.3;}
    .kset-nav .knav-sub{font-size:11.5px;margin-top:1px;line-height:1.3;}
    .kset-nav .knav-val{font-size:12px;max-width:38%;}
    .kset-nav .kico{width:26px;height:26px;border-radius:7px;}
    .kset-nav .kico svg{width:15px;height:15px;}
    .kset-nav .knav-arr{width:15px;height:15px;}
    .kset-nav .kprof{padding:12px;gap:11px;}
    .kset-nav .kprof-ava{width:42px;height:42px;font-size:15px;}
    .kset-nav .kprof-name{font-size:var(--fs-md);}
    .kset-nav .kprof-sub{font-size:11.5px;}
    .kset-nav .kset-title{font-size:15.5px;}
    .kset-nav .konto-vfuss{font-size:11.5px;}
    .kset-nav::-webkit-scrollbar{display:none;}
    .kset-detail{flex:1 1 auto; padding:2px 2px 18px 24px; overflow-y:auto; scrollbar-width:none;}
    .kset-detail::-webkit-scrollbar{display:none;}
    /* Zweispaltig ist die Liste selbst die Navigation: die Zurueck-Zeile und
       das zweite "X" im Detailkopf waeren doppelt.
       EIGENER KLASSENNAME statt des vorhandenen `.nur-schmal` (Werkzeugbalken
       der Aufgabenliste): das dort heisst „nur unter 641px", hier „nur
       einspaltig". Zwei Bedeutungen unter einem Namen halten genau so lange,
       bis jemand eine globale Regel dafuer schreibt. */
    .kset-nur-schmal{display:none;}
    .kset-detail .kset-row2{cursor:default;}
    .kset-detail .kset-row2:hover .kset-title2{color:var(--ink);}
    /* KEIN `max-width` MEHR (Befund Murat 10.08.2026: „tam saga yayilmamis
       sagdaki kisim"). Bis v2.253.0 standen hier 720 px mit der Begruendung,
       Beschriftung und Feld duerften nicht meterweit auseinanderstehen. Das
       stimmt fuer eine EINSPALTIGE Formularseite – hier aber nimmt die
       Kategorienspalte links schon 324 px, und rechts blieb ein Streifen mit
       einer breiten leeren Flaeche daneben. Das sah nicht ruhig aus, sondern
       unfertig. Die Zeilenlaenge regeln jetzt die Bausteine selbst: das
       Namensraster ist zweispaltig, Textabsaetze bekommen `.kset-lesebreite`.
       Wer hier wieder eine feste Breite setzt, holt sich den Streifen zurueck. */
    .kset-detail > #konto-content{max-width:none;}
    .kset-detail > #konto-head{max-width:none;}
    /* Fuer reinen Fliesstext (Datenschutz, Newsletter, Sprachversion): eine
       Zeile ueber die volle Breite eines grossen Bildschirms liest sich nicht.
       Gilt NUR fuer Absaetze, nicht fuer Karten, Listen und Raster. */
    .kset-detail .kset-lesebreite{max-width:640px;}
  }
  @media(max-width:899.98px){
    /* Einspaltig: genau eine der beiden Spalten ist zu sehen. Fassung fuer
       den Fall OHNE Seitenleiste (schmales Fenster am Rechner); die Fassung
       mit `.has-sidebar` steht weiter unten und braucht dort mehr
       Spezifitaet. */
    body[data-kset="sub"] #screen-konto .kset-nav{display:none;}
    body[data-kset="main"] #screen-konto .kset-detail{display:none;}
  }

  /* ===== Name in Einzelteilen (v2.253.0) =====
     Fuenf Felder in einem Raster, darunter die Anzeigeform mit lebender
     Vorschau. Die Vorschau traegt den Akzentton – sie ist das Ergebnis, nicht
     eine weitere Beschriftung. */
  .kname-box{border:1px solid var(--line);border-radius:16px;background:var(--card,#fff);padding:16px;margin-top:14px;}
  .kname-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px 14px;}
  .kname-breit{grid-column:1 / -1;}
  .kname-lbl{display:block;font-size:12.5px;color:var(--muted);font-weight:700;margin-bottom:5px;}
  .kname-hint{font-weight:400;color:var(--muted);opacity:.85;margin-left:6px;}
  .kname-box input.kname-in,.kname-box select.kname-in{width:100%;margin:0;}
  .kname-trenn{height:1px;background:var(--line);margin:16px 0 14px;}
  .kname-wahl{display:flex;align-items:center;gap:12px;flex-wrap:wrap;}
  .kname-wahl select.kname-in{flex:0 1 280px;}
  .kname-vorschau{flex:1 1 180px;min-width:0;font-weight:800;font-size:16px;
    color:var(--brand,#2E5BFF);
    background:var(--brand-soft,#EEF2FF);
    border-radius:11px;padding:10px 14px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
  .kname-vorschau.leer{font-weight:600;font-size:13px;color:var(--bad);background:transparent;border:1px dashed var(--line);}
  .kname-erkl{font-size:12px;color:var(--muted);margin-top:9px;line-height:1.5;}
  .kname-fuss{margin-top:16px;}
  @media(max-width:560px){ .kname-grid{grid-template-columns:1fr;} }

  /* Sprachversion: Auswahl-Liste wie ANTON */
  .klang{display:block;padding:12px 4px;border-bottom:1px solid var(--line);cursor:pointer;user-select:none;}
  .klang:last-child{border-bottom:none;}
  .klang-h{display:flex;align-items:center;gap:9px;font-weight:700;font-size:15px;color:var(--ink);}
  .klang-h input{width:17px;height:17px;accent-color:var(--brand);margin:0;cursor:pointer;}
  .klang-d{font-size:12.5px;color:var(--muted);margin:3px 0 0 26px;line-height:1.5;}
  /* Umschalter (Ja/Nein) */
  .kswitch{position:relative;width:44px;height:26px;flex:none;}
  .kswitch input{opacity:0;width:0;height:0;}
  .kswitch .ksl{position:absolute;inset:0;background:var(--line);border-radius:999px;cursor:pointer;transition:background .15s;}
  .kswitch .ksl:before{content:"";position:absolute;left:3px;top:3px;width:20px;height:20px;border-radius:50%;background:#fff;transition:transform .15s;box-shadow:0 1px 3px rgba(0,0,0,.25);}
  .kswitch input:checked + .ksl{background:var(--brand);}
  .kswitch input:checked + .ksl:before{transform:translateX(18px);}
  /* Animationen reduzieren */
  html.reduce-motion *, html.reduce-motion *:before, html.reduce-motion *:after{animation:none !important;transition:none !important;}
  /* Google-Translate-Leiste verstecken (Übersetzung läuft im Hintergrund) */
  .goog-te-banner-frame, #goog-gt-tt, .goog-te-balloon-frame{display:none !important;}
  body{top:0 !important;}
  .goog-text-highlight{background:none !important;box-shadow:none !important;}
  #google_translate_element{display:none;}
  /* Zahnrad-Button neben dem Avatar */
  .gear-btn { appearance:none; border:none; cursor:pointer; background:transparent; padding:6px; border-radius:999px; color:var(--muted); display:flex; align-items:center; transition: background .15s ease, color .15s ease; }
  .gear-btn:hover { background: rgba(127,127,127,0.10); color:var(--ink); }
  .gear-btn svg { width:20px; height:20px; fill:none; stroke:currentColor; stroke-width:2; stroke-linecap:round; stroke-linejoin:round; }
  /* Rollen-Badges (wie die kleinen Status-Badges, abgerundet) */
  .role-badge{display:inline-block;font-size:11px;font-weight:800;padding:3px 10px;border-radius:999px;letter-spacing:.02em;}
  .role-teacher{background:var(--ok-soft);color:var(--ok);}
  .role-admin{background:var(--brand-soft);color:var(--brand-dk);}

  /* ===== GLAS-KNOEPFE - NUR NOCH OPTIK, KEINE FARBE MEHR (v2.373.0) ======
     HIER LAG DER GRUND, WARUM DIE KNOEPFE NIE ZUR GEWAEHLTEN FARBE PASSTEN
     (Befund Murat, mehrfach: „button renkleri arkaplandaki sectigim renkle
     ayni olmali, temaya uydurmalisin").

     Dieser Block stammt aus dem Glas-Versuch und schrieb hier ein FESTES Blau
     mit `!important` - damit schlug er die Regel im Akzent-Abschnitt am
     Dateiende (`.btn:not(.ghost):not(.sub):not(.ok)` mit dem Akzent-Ton der
     Flaechenfarbe), die genau das schon richtig machte. Jede
     Wunschfarbe lief also ins Leere, und zwar unbemerkt: die Seitenleiste war
     gruen, der Knopf blieb blau.

     DIE LOESUNG IST EIN WEGLASSEN, KEIN UEBERSCHREIBEN: die Zeile
     `background` ist hier ersatzlos raus. Damit greift wieder der
     Akzent-Abschnitt - er steht spaeter in der Datei und braucht deshalb
     nicht einmal `!important`. Die Glas-Optik (Blur, weicher Rand, Schatten)
     bleibt vollstaendig, sie sagt nichts ueber die Farbe.

     WER HIER WIEDER EIN `background` EINTRAEGT, macht den Fehler von neuem.
     Farben fuer Knoepfe gehoeren ausschliesslich in den Akzent-Abschnitt;
     `qa/unit/test_flaeche_akzent.py` zaehlt genau das mit. */
  .btn {
    backdrop-filter: blur(12px) !important;
    -webkit-backdrop-filter: blur(12px) !important;
    border: 1px solid color-mix(in srgb, var(--card) 20%, transparent) !important;
    box-shadow: 0 4px 16px rgba(27, 34, 48, 0.08) !important;
  }

  /* GHOST UND OK BLEIBEN BEIM MARKENBLAU BZW. GRUEN - das ist eine
     Entscheidung von 01.08.2026 und keine Nachlaessigkeit
     (qa/unit/test_flaeche_akzent.py): `--ok` gruen heisst „richtig", `--bad`
     rot heisst „falsch". Ein gruener Akzent neben einem gruenen „richtig"
     macht die Rueckmeldung mehrdeutig. Geaendert ist hier nur das feste
     Weiss: `--card` ist im dunklen Design die Kartenflaeche, das harte #fff
     war dort ein Leuchtfleck. */
  .btn.ghost {
    background: color-mix(in srgb, var(--card) 82%, transparent) !important;
    color: var(--brand) !important;
    border: 1px solid color-mix(in srgb, var(--brand) 20%, transparent) !important;
  }
  .btn.ghost:hover { background: color-mix(in srgb, var(--brand) 10%, var(--card)) !important; }

  .btn.ok { background: color-mix(in srgb, var(--ok) 78%, transparent) !important; }
  .btn.ok:hover { background: var(--ok-ink) !important; }
  
  .btn.sub { background: rgba(27, 34, 48, 0.75) !important; }
  /* EKLENEN YENİ KODLAR BURADA BİTİYOR */
  
  /* Cihaz karanlık moddaysa bu renkler devreye girer (auto / Standard) */
  @media (prefers-color-scheme: dark) {    
  /* Die weisse Notkachel hinter .main-logo ist entfallen (v2.100.3) - im
     Dunkelmodus wird jetzt das BILD getauscht (Block "LOGO IM DUNKELMODUS"
     am Dateiende). Ein weisses Rechteck in einer dunklen Oberflaeche war
     lesbar, aber sichtbar eine Notloesung. */
    /* DIE FLAECHENFARBE MUSS DEM DUNKELMODUS FOLGEN (Fund 03.08.2026).
       `html[data-flaeche="stein"]` & Co. setzen `--shell-bg` auf einen festen
       HELLEN Wert - ohne Ruecksicht auf den Dunkelmodus. Fuer die AUSDRUECKLICHE
       Wahl gab es das schon (`html[data-theme="dark"]{--shell-bg:...!important}`),
       fuer den AUTOMATISCHEN Dunkelmodus nicht. Wer also eine Flaeche gewaehlt
       hatte und dessen Telefon nachts umschaltet, bekam eine helle Grundflaeche
       unter dunklen Karten - und seit v2.100.3 waere darauf ausserdem das helle
       Logo der Seitenleiste unsichtbar gewesen.
       Das ist kein Zusatz zum Logo-Umbau, sondern ein alter Widerspruch:
       automatisch und ausdruecklich dunkel muessen dasselbe tun. */
    html:not([data-theme="light"])[data-flaeche]{ --shell-bg: var(--paper); }

    html:not([data-theme="light"]) {
      --paper: #121620; 
      --card: #1B2230; 
      --ink: #F1F2F6; 
      --muted: #A0ABC0; 
      --line: #2D3748;
      --brand-soft: #1A2754;
      --ok-soft: #133A24;
      --bad-soft: #4D1F1C;
      --amber-soft: #3A2E14; --amber-line: #5A4A1E;
      --shadow: 0 4px 12px rgba(0,0,0,0.3);
    }

    /* Beyaz olarak sabitlenmiş arkaplanları karanlık moda uyarlama */
    html:not([data-theme="light"]) input[type=text], html:not([data-theme="light"]) input[type=number],
    html:not([data-theme="light"]) input[type=password], html:not([data-theme="light"]) textarea,
    html:not([data-theme="light"]) select,
    html:not([data-theme="light"]) .seg button, html:not([data-theme="light"]) .opt,
    html:not([data-theme="light"]) .qr-box img {
      background: var(--card);
      color: var(--ink);
    }
    
    html:not([data-theme="light"]) .drop {
      background: var(--paper);
    }
    
    html:not([data-theme="light"]) .opt .k {
      background: var(--paper);
    }
    /* Fokus-Fix (Auto-Dark): kein weißer Hintergrund/unsichtbarer Rahmen beim Antippen. */
    html:not([data-theme="light"]) input[type=text]:focus, html:not([data-theme="light"]) input[type=number]:focus,
    html:not([data-theme="light"]) input[type=password]:focus, html:not([data-theme="light"]) textarea:focus,
    html:not([data-theme="light"]) select:focus {
      background: var(--card); color: var(--ink);
      border-color: var(--brand);
      box-shadow: 0 0 0 2px rgba(46,91,255,0.35);
    }
    html:not([data-theme="light"]) input::placeholder, html:not([data-theme="light"]) textarea::placeholder { color: var(--muted); }
    html:not([data-theme="light"]) input:-webkit-autofill, html:not([data-theme="light"]) textarea:-webkit-autofill {
      -webkit-text-fill-color: var(--ink);
      -webkit-box-shadow: 0 0 0 1000px var(--card) inset;
      caret-color: var(--ink);
    }
  }

  /* Manuell erzwungener Dark Mode (Profil-Einstellung), unabhängig vom Gerät */
  html[data-theme="dark"] {
    --paper: #121620;
    --card: #1B2230;
    --ink: #F1F2F6;
    --muted: #A0ABC0;
    --line: #2D3748;
    --brand-soft: #1A2754;
    --ok-soft: #133A24;
    --bad-soft: #4D1F1C;
    --amber-soft: #3A2E14; --amber-line: #5A4A1E;
    --shadow: 0 4px 12px rgba(0,0,0,0.3);
  }
  html[data-theme="dark"] input[type=text], html[data-theme="dark"] input[type=number],
  html[data-theme="dark"] input[type=password], html[data-theme="dark"] textarea,
  html[data-theme="dark"] select, html[data-theme="dark"] .seg button,
  html[data-theme="dark"] .opt, html[data-theme="dark"] .qr-box img {
    background: var(--card); color: var(--ink);
  }
  html[data-theme="dark"] .drop, html[data-theme="dark"] .opt .k { background: var(--paper); }
  html[data-theme="dark"] .mini-btn { background: var(--card); }
  /* Fokus-Fix (Dark): kein weißer Hintergrund/unsichtbarer Rahmen beim Antippen.
     Hintergrund bleibt dunkel, Rahmen wird klar sichtbar, Text bleibt hell. */
  html[data-theme="dark"] input[type=text]:focus, html[data-theme="dark"] input[type=number]:focus,
  html[data-theme="dark"] input[type=password]:focus, html[data-theme="dark"] textarea:focus,
  html[data-theme="dark"] select:focus {
    background: var(--card); color: var(--ink);
    border-color: var(--brand);
    box-shadow: 0 0 0 2px rgba(46,91,255,0.35);
  }
  html[data-theme="dark"] input::placeholder, html[data-theme="dark"] textarea::placeholder { color: var(--muted); }
  html[data-theme="dark"] input:-webkit-autofill, html[data-theme="dark"] textarea:-webkit-autofill {
    -webkit-text-fill-color: var(--ink);
    -webkit-box-shadow: 0 0 0 1000px var(--card) inset;
    caret-color: var(--ink);
  }
  /* EKLENEN YENİ KODLAR BURADA BİTİYOR */

  /* ===== GECE MODU DÜZELTMELERİ: sabit #fff/açık renkler dark'a uyarlanır =====
     Hem otomatik (prefers-color-scheme) hem manuel (data-theme=dark) için. */
  html[data-theme="dark"] .btn.ghost,
  html[data-theme="dark"] .seg button,
  html[data-theme="dark"] .opt,
  html[data-theme="dark"] .qr-box,
  html[data-theme="dark"] .qr-box img,
  html[data-theme="dark"] .modal-card,
  html[data-theme="dark"] .mini-btn,
  html[data-theme="dark"] .iconbtn-square,
  html[data-theme="dark"] .icon-act,
  html[data-theme="dark"] .kebab-btn,
  html[data-theme="dark"] .card,
  html[data-theme="dark"] .nav button,
  html[data-theme="dark"] .main-nav button.on,
  html[data-theme="dark"] .nav-dd > button.on{
    background: var(--card) !important;
    color: var(--ink);
    border-color: var(--line);
  }
  html[data-theme="dark"] .btn.ghost{ color: var(--brand); }
  html[data-theme="dark"] .mini-btn,
  html[data-theme="dark"] .iconbtn-square{ color: var(--brand); }
  html[data-theme="dark"] .icon-act,
  html[data-theme="dark"] .kebab-btn,
  html[data-theme="dark"] .seg button{ color: var(--muted); }
  html[data-theme="dark"] .main-nav{ background: #0E1220; }
  html[data-theme="dark"] .main-nav button.on{ box-shadow: 0 1px 4px rgba(0,0,0,.4); }
  html[data-theme="dark"] .main-nav button{ color: var(--muted); }
  html[data-theme="dark"] .tb-close{ background: var(--card); color: var(--ink); }
  html[data-theme="dark"] .nav button{ border-color: var(--line); }
  html[data-theme="dark"] .iconbtn-square:hover,
  html[data-theme="dark"] .icon-act:hover,
  html[data-theme="dark"] .mini-btn:hover,
  html[data-theme="dark"] .kebab-btn:hover{ background: rgba(255,255,255,.06); }

  @media (prefers-color-scheme: dark) {
    html:not([data-theme="light"]) .btn.ghost,
    html:not([data-theme="light"]) .seg button,
    html:not([data-theme="light"]) .opt,
    html:not([data-theme="light"]) .qr-box,
    html:not([data-theme="light"]) .qr-box img,
    html:not([data-theme="light"]) .modal-card,
    html:not([data-theme="light"]) .mini-btn,
    html:not([data-theme="light"]) .iconbtn-square,
    html:not([data-theme="light"]) .icon-act,
    html:not([data-theme="light"]) .kebab-btn,
    html:not([data-theme="light"]) .card,
    html:not([data-theme="light"]) .nav button,
    html:not([data-theme="light"]) .main-nav button.on,
    html:not([data-theme="light"]) .nav-dd > button.on{
      background: var(--card) !important;
      color: var(--ink);
      border-color: var(--line);
    }
    html:not([data-theme="light"]) .btn.ghost{ color: var(--brand); }
    html:not([data-theme="light"]) .mini-btn,
    html:not([data-theme="light"]) .iconbtn-square{ color: var(--brand); }
    html:not([data-theme="light"]) .icon-act,
    html:not([data-theme="light"]) .kebab-btn,
    html:not([data-theme="light"]) .seg button{ color: var(--muted); }
    html:not([data-theme="light"]) .main-nav{ background: #0E1220; }
    html:not([data-theme="light"]) .main-nav button.on{ box-shadow: 0 1px 4px rgba(0,0,0,.4); }
    html:not([data-theme="light"]) .main-nav button{ color: var(--muted); }
    html:not([data-theme="light"]) .tb-close{ background: var(--card); color: var(--ink); }
    html:not([data-theme="light"]) .nav button{ border-color: var(--line); }
    html:not([data-theme="light"]) .iconbtn-square:hover,
    html:not([data-theme="light"]) .icon-act:hover,
    html:not([data-theme="light"]) .mini-btn:hover,
    html:not([data-theme="light"]) .kebab-btn:hover{ background: rgba(255,255,255,.06); }
  }

  .authbar{display:flex;justify-content:center;align-items:center;gap:16px;font-size:13.5px;font-weight:600;margin:-6px 0 16px;flex-wrap:wrap;}
  /* Login: Passwort-Auge, Angemeldet bleiben, Passwort vergessen */
  .pw-wrap{position:relative;display:flex;align-items:center;}
  .pw-wrap input{flex:1;padding-right:46px;}
  .pw-eye{position:absolute;right:8px;top:50%;transform:translateY(-50%);background:none;border:none;cursor:pointer;color:var(--muted);padding:6px;border-radius:8px;display:flex;align-items:center;justify-content:center;}
  .pw-eye:hover{color:var(--ink);background:rgba(127,127,127,0.10);}
  .pw-eye svg{width:20px;height:20px;}
  .auth-row{display:flex;align-items:center;justify-content:space-between;gap:12px;margin:-2px 0 16px;flex-wrap:wrap;}
  .remember-me{display:flex;align-items:center;gap:8px;cursor:pointer;font-size:13.5px;color:var(--ink);font-weight:600;user-select:none;}
  .remember-me input{width:17px;height:17px;cursor:pointer;accent-color:var(--brand);margin:0;}
  .forgot-link{font-size:13.5px;color:var(--brand);font-weight:600;cursor:pointer;text-decoration:none;}
  .forgot-link:hover{text-decoration:underline;}
  /* SSO Buttons */
  .sso-divider{display:flex;align-items:center;gap:var(--s-3);margin:18px 0 14px;color:var(--muted);font-size:var(--fs-xs);}
  .sso-divider::before,.sso-divider::after{content:"";flex:1;height:1px;background:var(--line);}
  /* --- Login im WebUntis-Stil: linke Info-Spalte (grau) + weiße Login-Spalte --- */
  body[data-screen="auth"] .topbar{display:none !important;}
  body[data-screen="auth"] .app-topbar{display:none !important;}
  body[data-screen="auth"] .wrap{max-width:none;padding:0;}
  /* DIE AUSNAHME IST AUFGEHOBEN (v2.274.0) - UND SIE WAR VON ANFANG AN AUF
     EINER FALSCHEN ANNAHME GEBAUT.
     Hier stand bis v2.273.0: "es gibt keine helle Fassung" des Logos, und
     genau deshalb mussten diese drei Flaechen feste Werte tragen. Die helle
     Fassung liegt aber seit dem 03.08.2026 im Projekt: `logo-hell.png`,
     angelegt fuer denselben Zweck (v2.100.3), benutzt in Kopfzeile und
     Seitenleiste. Es fehlte nichts - es hat beim Schreiben der Ausnahme
     niemand nachgesehen.
     MERKSATZ, DER DEN AUFWAND WERT IST: eine Ausnahme, die mit "es gibt X
     nicht" begruendet wird, gehoert mit einem Blick ins Verzeichnis belegt.
     Sonst haelt sie sich, bis jemand zufaellig darueber stolpert - hier
     waren es drei Fassungen.

     Jetzt nimmt das Bild die Klasse `logo-tausch-marke` (der Mechanismus von
     v2.100.3, siehe weiter unten im Abschnitt LOGO IM DUNKELMODUS), und die
     drei Flaechen folgen den Tokens wie ueberall sonst.
     OHNE FARBAENDERUNG, und das ist kein Zufall: --card ist #FFFFFF, --paper
     ist #F1F2F6 - genau die zwei Werte, die vorher fest hier standen. Der
     helle Bildschirm sieht Pixel fuer Pixel aus wie vorher.
     Bewacht von qa/unit/test_seiten_icons.py. */
  body[data-screen="auth"]{background:var(--card);}
  body[data-screen="auth"] #feedback-fab{display:none !important;}
  .auth-shell{display:flex;min-height:100dvh;}
  /* FLAECHE STATT VERLAUF (Schritt 4, docs/DESIGN_SYSTEM.md §10 und §1
     "Weiss statt Verlauf"). Hier stand ein dreistufiger Verlauf
     #F1F3F8 -> #E7EAF2 -> #E2E6F0 - und genau daran merkte man beim Wechsel
     von der Startseite, dass man das Produkt gewechselt hat: die
     oeffentlichen Seiten kennen keinen einzigen Verlauf, ihr Test verbietet
     ihn sogar ausdruecklich (test_keine_verlaufsflaechen_im_hintergrund).
     --paper ist zugleich die Flaeche, auf der die Anwendung dahinter steht -
     Der Wert ist der Startton des alten Verlaufs, gerundet auf --paper der
     Anwendung - die Anmeldung ist damit optisch schon der Eingang und nicht
     mehr ein drittes Aussehen zwischen Seite und App.

     WARUM ALS FESTER WERT UND NICHT ALS var(--paper): dieselbe Ausnahme wie
     oben - die Anmeldung bleibt hell, auch wenn der Dunkelmodus kommt. Ein
     Token wuerde sie mitkippen und das schwarze Logo verschlucken. */
  .auth-side{flex:1 1 auto;min-width:0;background:var(--paper);padding:clamp(24px,4.5vh,56px) clamp(20px,3.5vw,46px) clamp(20px,4vh,46px);display:none;flex-direction:column;align-items:center;position:relative;overflow:hidden;}
  @media(min-width:880px){ .auth-side{display:flex;} }
  .auth-side-date{align-self:flex-start;font-size:var(--fs-sm);color:var(--muted);font-weight:700;letter-spacing:.01em;position:relative;z-index:1;}
  .auth-fact{margin:auto 0;max-width:min(360px,92%);width:100%;position:relative;z-index:1;}
  /* Kreide-Doodles: Formeln, Fachbegriffe & Skizzen erscheinen weich, werden
     "geschrieben" und verblassen wieder – JS-gesteuert, rein GPU-Animation. */
  .auth-chalk{position:absolute;inset:0;pointer-events:none;z-index:0;font-family:"Chalkboard SE","Comic Sans MS","Segoe Print",cursive;color:var(--ink);}
  .auth-chalk span,.auth-chalk div{position:absolute;white-space:nowrap;opacity:0;transform:translateY(10px) rotate(var(--rot,0deg));transition:opacity 1.8s ease,transform 1.8s ease;will-change:opacity,transform;}
  .auth-chalk .on{opacity:var(--o,.12);transform:translateY(0) rotate(var(--rot,0deg));}
  .auth-chalk svg{display:block;width:100%;height:auto;}
  @media (prefers-reduced-motion: reduce){ .auth-chalk span,.auth-chalk div{transition:opacity .4s ease;transform:none;} }
  .af-card{background:var(--card);border-radius:var(--r-card);padding:var(--s-5) var(--s-5) var(--s-5);box-shadow:var(--e-2);position:relative;}
  .af-h{font-size:var(--fs-md);font-weight:800;color:var(--ink);margin-bottom:14px;}
  .auth-fact-problem{font-size:var(--fs-sm);color:var(--ink);line-height:1.55;font-weight:650;}
  .auth-fact-solution{margin-top:var(--s-3);font-size:var(--fs-xs);color:var(--muted);line-height:1.55;border-left:3px solid var(--brand);padding-left:12px;border-radius:0;}
  /* A: Chat-Stil */
  .af-row{display:flex;gap:8px;align-items:flex-end;margin-bottom:10px;}
  .af-row.r{justify-content:flex-end;}
  .af-ava{width:30px;height:30px;border-radius:50%;flex:none;display:flex;align-items:center;justify-content:center;font-size:16px;background:var(--surface-subtle);}
  .af-bub{padding:var(--s-2) var(--s-3);font-size:var(--fs-xs);line-height:1.5;max-width:82%;}
  .af-bub-l{background:var(--surface-subtle);border-radius:var(--r-card) var(--r-card) var(--r-card) 4px;color:var(--ink);}
  .af-bub-r{background:var(--brand);border-radius:var(--r-card) var(--r-card) 4px var(--r-card);color:var(--card);}
  .af-pill{display:inline-block;background:var(--card);border:1.5px dashed var(--brand);border-radius:var(--r-pill);padding:var(--s-2) var(--s-4);font-size:var(--fs-xs);font-weight:600;color:var(--brand);line-height:1.4;}
  /* B: Sticker + Chips */
  .af-sticker{position:absolute;top:-16px;left:18px;width:38px;height:38px;border-radius:12px;background:#FAC775;display:flex;align-items:center;justify-content:center;font-size:20px;transform:rotate(-6deg);box-shadow:0 4px 10px rgba(30,41,80,.12);}
  .af-chip{display:inline-block;font-size:10px;font-weight:800;letter-spacing:.05em;border-radius:var(--r-pill);padding:2px 9px;}
  .af-sec{margin-bottom:10px;}
  .af-sec div{font-size:var(--fs-xs);line-height:1.5;margin-top:5px;}
  /* C: Zettel + Post-it */
  .af-paper{transform:rotate(-1deg);border-radius:4px;border:1px solid var(--line);}
  .af-tape{position:absolute;top:-9px;left:50%;transform:translateX(-50%) rotate(2deg);width:76px;height:18px;background:#CECBF6;opacity:.75;}
  .af-postit{background:#FAEEDA;padding:10px 12px;margin:14px -2px 0 10px;transform:rotate(1.5deg);font-size:11.5px;line-height:1.5;color:#633806;font-weight:600;}
  /* D: Emoji groß + Konfetti */
  .af-dot{position:absolute;border-radius:50%;}
  .af-bige{font-size:34px;line-height:1;margin-bottom:10px;}
  /* Erfolgston aus dem Woerterbuch: --ok-ink ist genau fuer SCHRIFT auf
     --ok-soft gemacht (§3.3). Vorher standen hier zwei eigene Gruentoene. */
  .af-sol{font-size:var(--fs-xs);line-height:1.55;color:var(--ok-ink);background:var(--ok-soft);border-radius:var(--r-control);padding:9px 11px;margin:var(--s-3) 0;}
  .af-tip{font-size:var(--fs-xs);color:var(--brand);font-weight:700;line-height:1.5;}
  .auth-main{flex:0 0 auto;width:560px;max-width:100%;margin:0 auto;background:var(--card);position:relative;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:44px 20px 76px;box-sizing:border-box;}
  .auth-box{width:100%;max-width:360px;position:relative;z-index:1;}
  .auth-brand-logo{display:block;margin:0 auto;height:150px;width:auto;}
  .auth-mode{display:flex;justify-content:center;align-items:center;gap:20px;margin:26px 0 26px;flex-wrap:wrap;}
  /* SCHUELER-REITER (v2.226.1): derselbe Baustein wie „Login"/„Registrieren",
     nur kleiner und mit Ranzen – er richtet sich an Kinder, soll aber die
     beiden Wege der Lehrkräfte nicht überstrahlen. */
  /* Der Schueler-Weg soll fuer ein Kind sichtbar sein, ohne die beiden Wege
     der Lehrkraefte zu ueberstrahlen: KEIN Emoji (Hausregel), sondern die
     Schrift selbst - ein wanderndes Farbband, das beim Anklicken kurz
     aufgeht. Wer `prefers-reduced-motion` gesetzt hat, bekommt dieselben
     Farben ohne Bewegung. */
  .auth-mode-btn.auth-mode-kid{font-size:19px;opacity:1;
    background-image:
      linear-gradient(108deg,transparent 42%,rgba(255,255,255,.85) 50%,transparent 58%),
      linear-gradient(100deg,#2E5BFF,#7A5AF8,#15A05A,#F5A623,#2E5BFF);
    background-size:220% 100%, 280% 100%;
    -webkit-background-clip:text;background-clip:text;
    color:transparent;-webkit-text-fill-color:transparent;
    animation:kidband 7s linear infinite;
    transition:transform .18s cubic-bezier(.2,1.4,.4,1),filter .18s;}
  .auth-mode-btn.auth-mode-kid:hover{transform:scale(1.06);}
  .auth-mode-btn.auth-mode-kid.active{transform:scale(1.16);
    filter:drop-shadow(0 0 12px rgba(122,90,248,.45));animation-duration:3.2s;}
  /* Erster Wert = Glanzstreifen (laeuft nach LINKS), zweiter = Farbband
     (laeuft nach rechts). Zwei Richtungen in einer Animation. */
  @keyframes kidband{
    0%  {background-position:220% 50%,   0% 50%;}
    100%{background-position:-60% 50%, 280% 50%;}
  }
  @media (prefers-reduced-motion: reduce){
    .auth-mode-btn.auth-mode-kid{animation:none;background-position:-60% 50%,40% 50%;}
    .auth-mode-btn.auth-mode-kid.active{transform:none;}
  }

  /* =======================================================================
     KATZENPFOTEN AUF DEM SCHUELER-REITER
     -----------------------------------------------------------------------
     Wenn ein Kind auf „Schüler" tippt, laeuft eine Katze von unten rechts
     nach oben links ueber die Tafel - sichtbar nur als Spur aus Pfoten, die
     nacheinander erscheinen und danach wieder verblassen.

     WARUM DAS HIER STEHEN DARF, obwohl die Seite sonst ruhig ist: es ist
     der EINZIGE Bildschirm, der sich an Kinder richtet, und er erscheint
     nur auf ausdruecklichen Klick. Eine Ueberraschung, die man selbst
     ausgeloest hat, stoert niemanden - eine, die von allein kommt, schon.

     GEZEICHNET, NICHT ANIMIERT: die Katze selbst ist nie zu sehen. Eine
     laufende Katze zu animieren hiesse, ein zweites Bildformat und eine
     Zeitachse einzufuehren; eine Spur aus acht Pfoten sagt dasselbe mit
     acht Kopien derselben Form.

     aria-hidden am Behaelter: fuer einen Screenreader ist das nichts.
     ======================================================================= */
  /* =======================================================================
     DIE KATZEN
     -----------------------------------------------------------------------
     WARUM SELBST GEZEICHNET UND NICHT oneko.js: oneko bringt eine fremde
     Sprite-Datei mit, deren Herkunft und Lizenz wir mitpflegen muessten -
     im Projekt gilt fuer Fremdmaterial dieselbe Regel wie bei den Spielen.
     Und oneko JAGT den Mauszeiger, waehrend die Katzen hier auf der X-Achse
     laufen und sich hinsetzen sollen.

     DIE PFOTENSPUR IST WEG (10.08.2026). Zwei Gruende: mit einer sichtbaren
     Katze braucht es sie nicht mehr, und sie war fehlerhaft - die Abdruecke
     stapelten sich an EINER Stelle, weil `style.left` waehrend einer
     laufenden Uebergang-Animation den ZIELWERT liefert und nicht die
     aktuelle Position. Man haette die Position pro Bild ausrechnen muessen:
     Aufwand fuer etwas, das die Katze ohnehin ueberfluessig macht.

     GEHEN OHNE DAUMENKINO (Befund "cok robotik"): vorher wurden zwei
     Beinstellungen im festen 220-ms-Takt getauscht - das ist ein Metronom,
     kein Gang. Jetzt hat JEDES Bein eine eigene, versetzte Schwingung, dazu
     ein Wippen des Koerpers in ANDERER Dauer und ein seltenes Ohrenzucken.
     Weil die Dauern nicht aufgehen, wiederholt sich das Muster erst nach
     vielen Sekunden - genau das unterscheidet Lebendigkeit von Mechanik.
     ======================================================================= */
  .katze{position:absolute;left:0;width:52px;height:37px;z-index:0;
    pointer-events:none;opacity:0;transition:opacity .6s ease;}
  .katze.da{opacity:var(--ko,.5);}
  .katze svg{width:100%;height:100%;display:block;overflow:visible;}
  .katze .fell{fill:var(--kf,#48586F);}
  .katze .hell{fill:var(--kh,#8E9BB0);}

  /* Gang: jedes Bein schwingt fuer sich, mit eigener Verzoegerung. */
  .katze .beine > *{transform-origin:50% 0%;}
  .katze .b1{animation:katzeBein .62s ease-in-out infinite;}
  .katze .b2{animation:katzeBein .62s ease-in-out infinite .31s;}
  .katze .b3{animation:katzeBein .62s ease-in-out infinite .16s;}
  .katze .b4{animation:katzeBein .62s ease-in-out infinite .47s;}
  @keyframes katzeBein{
    0%,100%{transform:translateX(0) rotate(0deg);}
    30%    {transform:translateX(1.6px) rotate(7deg);}
    70%    {transform:translateX(-1.4px) rotate(-6deg);}
  }
  .katze .koerper{animation:katzeWippe .53s ease-in-out infinite;}
  .katze .schwanz{transform-origin:14% 76%;animation:katzeSchwanz 2.35s ease-in-out infinite;}
  .katze .ohren{transform-origin:50% 100%;animation:katzeOhr 5.7s ease-in-out infinite;}
  @keyframes katzeWippe{0%,100%{transform:translateY(0);}50%{transform:translateY(-1.1px);}}
  @keyframes katzeSchwanz{0%,100%{transform:rotate(-8deg);}50%{transform:rotate(10deg);}}
  @keyframes katzeOhr{0%,92%,100%{transform:rotate(0);}95%{transform:rotate(-8deg);}97%{transform:rotate(5deg);}}

  /* Sitzen: Beine still, Schwanz langsamer, Koerper ruhig. */
  .katze.sitzt .koerper{animation:none;}
  .katze.sitzt .b1,.katze.sitzt .b2,.katze.sitzt .b3,.katze.sitzt .b4{animation:none;transform:none;}
  .katze.sitzt .schwanz{animation-duration:3.4s;}
  .katze .sitzbein{display:none;}
  .katze.sitzt .beine{display:none;}
  .katze.sitzt .sitzbein{display:block;}
  /* SCHAUT: im Sitzen dreht sich der Kopf zum Betrachter. Ein zweiter,
     kleiner Kopf von vorn - das ist der Moment, in dem aus einer Figur ein
     Blick wird, und dafuer lohnt die zweite Zeichnung. */
  .katze .vorn{display:none;}
  .katze.sitzt.schaut .kopf-seite{display:none;}
  .katze.sitzt.schaut .vorn{display:block;}
  @media (prefers-reduced-motion:reduce){ .katze{display:none;} }
  /* Der Behaelter fuer die Katzen. Er sitzt DIREKT ueber der Rechtszeile
     (.auth-footer, 16px Innenabstand + Zeile) - eine Katze, die auf dem
     Impressum steht, sieht nach Fehler aus. */
  .katzen{position:absolute;left:0;right:0;bottom:52px;height:44px;
    pointer-events:none;overflow:hidden;z-index:0;}
  /* Zwei Felder, ein Code: links nur Buchstaben, rechts nur Ziffern. Der
     Bindestrich steht fest dazwischen, damit ihn niemand tippen muss. */
  /* Werkzeugreihe im PIN-Fenster: als Klasse, nicht inline
     (qa/unit/test_landing_mobil.py verbietet die Inline-Fassung). */
  .anm-tools{display:flex;gap:8px;flex-wrap:wrap;}
  .sl-felder{display:flex;align-items:center;gap:var(--s-2);margin-bottom:var(--s-3);}
  .sl-in{flex:1;min-width:0;width:100%;box-sizing:border-box;font-family:inherit;
    font-size:var(--fs-2xl);font-weight:800;letter-spacing:4px;text-align:center;text-indent:4px;
    padding:var(--s-3) var(--s-1);border:2px solid var(--line);border-radius:var(--r-card);
    background:var(--card);color:var(--ink);outline:none;transition:border-color .15s;}
  .sl-in:focus{border-color:var(--brand);}
  .sl-in-a{text-transform:uppercase;}
  .sl-in-b{color:var(--brand);}
  .sl-in.sl-fehler{border-color:var(--bad);}
  .sl-strich{font-size:var(--fs-2xl);font-weight:800;color:var(--muted);flex:none;}
  .sl-status{font-size:var(--fs-xs);text-align:center;min-height:34px;line-height:1.4;
    color:var(--muted);}
  .sl-status.sl-fehler{color:var(--bad);font-weight:700;}
  .sl-hinweis{font-size:var(--fs-xs);color:var(--muted);text-align:center;margin-top:var(--s-3);line-height:1.45;}
  /* Weiche Übergänge beim Tab-Wechsel: Felder klappen sanft auf/zu statt hart umzuspringen. */
  .auth-box #auth-name-field,.auth-box #auth-invite-field,.auth-box #auth-consent-field,.auth-box #auth-login-extras{
    overflow:hidden;max-height:230px;opacity:1;transition:max-height .3s ease,opacity .22s ease,margin .3s ease;}
  .auth-box #auth-consent-field{max-height:300px;}
  .auth-box #auth-name-field.hidden,.auth-box #auth-invite-field.hidden,.auth-box #auth-consent-field.hidden,.auth-box #auth-login-extras.hidden{
    display:block !important;max-height:0;opacity:0;margin:0;pointer-events:none;}
  .auth-mode-btn{border:0;background:none;cursor:pointer;font-family:inherit;font-size:21px;font-weight:800;letter-spacing:-.01em;color:var(--muted);opacity:.4;padding:2px 4px;transition:opacity .15s,color .15s,text-shadow .15s;}
  /* DER BLAUE SCHEIN IST WEG (Schritt 4). Er lag als text-shadow unter dem
     aktiven Reiter und war Effekt ohne Bedeutung - §1: "Ruhe traegt die
     Seite, nicht Effekt". Was aktiv ist, sagen Farbe und Deckkraft bereits;
     ein Leuchten sagt dasselbe noch einmal, nur lauter. */
  .auth-mode-btn.active{color:var(--ink);opacity:1;}
  /* DER GEWAEHLTE REITER GEHT AUF WIE EIN BALLON (v2.928.2). Deckkraft
     allein reichte nicht, sobald der Schueler-Reiter mit seinem Farbband
     daneben stand - im Kartenweg sah es aus, als sei „Schüler" gewaehlt.
     Eine Linie darunter war Murat zu viel („alttaki cizgi cok fazla"): der
     gewaehlte Reiter wird stattdessen groesser, mit demselben federnden
     Uebergang wie der Schueler-Reiter (der seine eigene Hervorhebung
     behaelt). Kein Leuchten (test_der_aktive_reiter_leuchtet_nicht). */
  .auth-mode-btn:not(.auth-mode-kid){transition:opacity .15s,color .15s,transform .22s cubic-bezier(.2,1.4,.4,1);}
  .auth-mode-btn.active:not(.auth-mode-kid){transform:scale(1.14);}
  @media (prefers-reduced-motion:reduce){ .auth-mode-btn.active:not(.auth-mode-kid){transition:none;} }
  /* Im Kartenweg (index-app.js switchAuthTab) registriert sich eine
     Lehrkraft - das Farbband des Schueler-Reiters waere dort das Lauteste. */
  .auth-mode.im-kartenweg .auth-mode-kid{background-image:none;animation:none;filter:none;transform:none;
    color:var(--muted);-webkit-text-fill-color:currentColor;opacity:.4;}
  /* KNOEPFE MIT TIEFE (v2.928.2, Ansage Murat: wie auf der Startseite) -
     dieselbe Machart wie landing_neu `.btn-p` und kopf-oeffentlich.css
     `.kopf-btn-p` (v2.916.0): heller Saum oben innen, Abdunklung ins
     Violette unten innen, Schatten in der Markenfarbe; beim Zeigen 1px
     hoch, beim Druecken hinein. Der Saum nimmt `--on-brand` statt `--card`,
     sonst waere er im Dunkelmodus dunkel. Nur auf der Anmeldeseite. */
  /* `!important` nur an Rand und Schatten: der Glas-Block (GLAS-KNOEPFE,
     v2.373.0) setzt beide fuer JEDES .btn mit `!important`; ohne zoege
     hier der hoehere Selektor trotzdem den Kuerzeren. */
  #screen-auth .btn{border:1px solid color-mix(in srgb,var(--brand-dk) 75%,var(--ink)) !important;color:var(--on-brand);
    box-shadow:inset 0 1px 0 color-mix(in srgb,var(--on-brand) 34%,transparent),
               inset 0 -14px 20px -12px color-mix(in srgb,var(--violett) 70%,transparent),
               0 1px 2px color-mix(in srgb,var(--ink) 22%,transparent),
               0 10px 24px -8px color-mix(in srgb,var(--brand) 60%,transparent) !important;
    transition:transform .16s ease,box-shadow .16s ease,background .16s ease;}
  #screen-auth .btn:hover:not(:disabled){transform:translateY(-1px);
    background:color-mix(in srgb,var(--brand) 92%,var(--violett));
    box-shadow:inset 0 1px 0 color-mix(in srgb,var(--on-brand) 38%,transparent),
               inset 0 -14px 20px -12px color-mix(in srgb,var(--violett) 80%,transparent),
               0 2px 4px color-mix(in srgb,var(--ink) 22%,transparent),
               0 16px 32px -10px color-mix(in srgb,var(--brand) 70%,transparent) !important;}
  #screen-auth .btn:active:not(:disabled){transform:translateY(1px);
    box-shadow:inset 0 2px 6px color-mix(in srgb,var(--ink) 30%,transparent),
               0 1px 2px color-mix(in srgb,var(--ink) 20%,transparent) !important;}
  #screen-auth .btn:disabled{box-shadow:none !important;border-color:transparent !important;}
  @media (prefers-reduced-motion:reduce){
    #screen-auth .btn,#screen-auth .btn:hover,#screen-auth .btn:active{transform:none;}
  }
  .auth-box .field{margin-bottom:12px;}
  /* Das Feld liegt eine Spur TIEFER als die Flaeche (innerer Schatten), der
     Fokus legt einen weichen Ring in der Markenfarbe darum (v2.928.2). */
  .auth-box .field input[type="text"],.auth-box .field input[type="password"],.auth-box .field input[type="email"]{
    width:100%;background:var(--surface-subtle);border:1.5px solid transparent;border-radius:var(--r-control);padding:15px 14px;font:inherit;font-size:var(--fs-md);color:var(--ink);box-sizing:border-box;
    box-shadow:inset 0 1px 2px color-mix(in srgb,var(--ink) 7%,transparent);
    transition:border-color .15s ease,box-shadow .15s ease,background .15s ease;}
  .auth-box .field input:focus{outline:none;border-color:var(--brand);background:var(--card);
    box-shadow:0 0 0 4px var(--brand-soft);}
  /* KONTRASTKORREKTUR: der alte Platzhalterton (#8A90A0) erreichte auf der
     Feldflaeche nicht die 4.5:1 fuer Schrift - und ein Platzhalter IST die
     Beschriftung des Feldes, hier steht kein Label daneben. --muted ist der
     gemessene Ton (§3.2). */
  .auth-box .field input::placeholder{color:var(--muted);font-weight:600;}
  #auth-submit:disabled{opacity:.45;cursor:default;pointer-events:none;}
  .auth-forgot-row{text-align:center;margin-top:14px;}
  .sso-row{display:flex;justify-content:center;align-items:center;gap:28px;}
  .sso-logo{border:0;background:none;cursor:pointer;padding:6px;display:inline-flex;align-items:center;justify-content:center;transition:transform .12s;}
  .sso-logo:hover{transform:scale(1.12);}
  .sso-logo img,.sso-logo svg{height:34px;width:auto;object-fit:contain;}
  #sso-google svg{height:28px;width:28px;}
  #sso-iserv img{height:38px;}
  #sso-moodle img{height:34px;}
  .auth-footer{position:absolute;bottom:0;left:0;right:0;padding:16px 8px;font-size:12px;color:var(--muted);text-align:center;}
  .auth-footer a{color:var(--muted);text-decoration:none;margin:0 8px;}
  .auth-footer a:hover{color:var(--ink);text-decoration:underline;}
  /* Am Telefon passt die Rechtszeile in EINE Zeile (v2.928.2) - vorher
     stand „FAQ" allein darunter und der letzte Punkt am Zeilenende. */
  @media (max-width:640px){
    .auth-footer{font-size:11.5px;padding:16px 4px;}
    .auth-footer a{margin:0 4px;}
  }
  .sso-btn{display:flex;align-items:center;justify-content:center;gap:10px;width:100%;padding:12px;border:1.5px solid var(--line);background:var(--card);color:var(--ink);border-radius:12px;font-family:inherit;font-weight:700;font-size:var(--fs-md);cursor:pointer;margin-bottom:10px;transition:background .12s,border-color .12s;}
  .sso-btn:hover{background:rgba(127,127,127,0.05);border-color:rgba(127,127,127,0.3);}
  .sso-btn svg{flex:none;}
  /* ===== ADMINISTRATION: Sekmeli panel ===== */
  /* Admin = Arbeitsbereich des Betreibers: volle Breite (statt 720px),
     eigener schlanker Kopf. Beim Verlassen (data-screen wechselt) ist
     automatisch wieder alles normal. */
  body[data-screen="admin"] .topbar{display:none;}
  body[data-screen="admin"] .wrap{max-width:1560px;}
  .adm-header{position:relative;display:flex;align-items:center;justify-content:center;gap:14px;margin:4px 0 2px;min-height:34px;}
  .adm-header h1{font-size:23px;font-weight:850;margin:0;letter-spacing:.01em;color:var(--ink);text-align:center;}
  .adm-title span{display:inline-block;}
  .adm-header .back-link{margin:0;position:absolute;left:0;top:50%;transform:translateY(-50%);}
  .adm-tabs{display:flex;gap:2px;background:var(--paper);border:1px solid var(--line);border-radius:13px;padding:4px;margin:14px 0 18px;width:100%;}
  /* ===== SIEBEN REITER, EINE ZEILE (v2.414.0) ===========================
     Gegenstueck zur Reiterleiste in renderSchulverwaltung() - die Begruendung
     steht dort. Am Computer die Leiste, am Telefon dieses Auswahlfeld; beide
     stehen im HTML, hier wird getauscht.

     Es ist ein echtes <select>: das Telefon zeigt dafuer seinen eigenen
     Waehler, gross und mit dem Daumen bedienbar. Ein nachgebautes Menue
     muesste Tastatur, Zurueck-Taste und Bildschirmleser selbst mitbringen.

     `appearance:none` nimmt nur die Systemoptik, nicht das Verhalten - der
     Pfeil kommt als Hintergrundbild, damit das Feld wie die uebrigen
     Bedienelemente aussieht. */
  .ss-tabs-mob{ display:none; }
  .ss-tabs-mob select{
    width:100%; appearance:none; -webkit-appearance:none;
    font:inherit; font-size:14px; font-weight:750; color:var(--ink);
    background:var(--paper); border:1px solid var(--line); border-radius:13px;
    padding:12px 38px 12px 14px; margin:14px 0 16px; cursor:pointer;
    background-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%236B7280' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'><path d='M6 9l6 6 6-6'/></svg>");
    background-repeat:no-repeat; background-position:right 12px center;
    background-size:17px 17px;
  }
  .ss-tabs-mob select:focus-visible{ outline:2px solid var(--brand); outline-offset:2px; }
  /* Nur fuer den Bildschirmleser: das Feld sagt sonst nicht, WAS man waehlt. */
  .sr-only{ position:absolute; width:1px; height:1px; padding:0; margin:-1px;
    overflow:hidden; clip:rect(0 0 0 0); white-space:nowrap; border:0; }
  @media (max-width:640px){
    .adm-tabs.ss-tabs{ display:none; }
    .ss-tabs-mob{ display:block; }
  }
  .adm-tab{flex:1 1 0;min-width:0;position:relative;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:3px;border:none;background:none;cursor:pointer;font-family:inherit;font-weight:700;font-size:10px;color:var(--muted);padding:8px 2px;border-radius:10px;transition:background .12s,color .12s;overflow:hidden;}
  .adm-tab span{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
  .adm-tab svg{width:18px;height:18px;flex:none;}
  .adm-tab svg{width:20px;height:20px;}
  .adm-tab:hover{color:var(--ink);}
    .adm-tab.active{background:var(--card);color:var(--brand);box-shadow:0 1px 4px rgba(27,34,48,.10);}
  .adm-tab-badge{position:absolute;top:3px;right:50%;transform:translateX(18px);background:var(--brand);color:#fff;font-size:10px;font-weight:800;min-width:16px;height:16px;line-height:16px;text-align:center;border-radius:8px;padding:0 4px;}
  .adm-tab-badge.red{background:var(--bad);}
  .adm-pane{}
  /* Übersichts-Dashboard: Kachel-Raster */
  /* ===== Admin: linke Seitennavigation (statt Tabs oben) ===== */
  .adm-layout{display:flex;gap:20px;align-items:flex-start;margin-top:14px;}
  /* Linke Navigation im Stil der App-Navigationsleiste (main-nav): weiche Pillen,
     aktiver Eintrag als weiße Pille mit Schatten. */
  .adm-side{flex:none;width:216px;position:sticky;top:14px;display:flex;flex-direction:column;gap:4px;
    background:#EEF1F6;border-radius:14px;padding:6px;}
  html[data-theme="dark"] .adm-side{background:rgba(127,127,127,.12);}
  @media (prefers-color-scheme: dark){ html:not([data-theme="light"]) .adm-side{background:rgba(127,127,127,.12);} }
  .adm-side .adm-group{display:none;}
  .adm-side .adm-tab{flex:none;width:100%;flex-direction:row;justify-content:flex-start;gap:11px;
    font-size:13.5px;font-weight:700;padding:11px 12px;text-align:left;border-radius:10px;color:var(--muted);
    transition:background .14s,color .14s,box-shadow .14s;}
  .adm-side .adm-tab span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
  .adm-side .adm-tab svg{width:18px;height:18px;}
  .adm-side .adm-tab:hover:not(.active){color:var(--ink);}
  .adm-side .adm-tab.active{background:#fff;color:var(--ink);box-shadow:0 1px 4px rgba(27,34,48,.10);}
  html[data-theme="dark"] .adm-side .adm-tab.active{background:#283042;color:var(--ink);}
  @media (prefers-color-scheme: dark){ html:not([data-theme="light"]) .adm-side .adm-tab.active{background:#283042;color:var(--ink);} }
  .adm-side .adm-tab-badge{position:static;transform:none;margin-left:auto;}
  /* Rechte Fläche: feste Höhe -> Navigation und weißes Blatt bleiben stehen,
     NUR der Inhalt rechts scrollt in sich. Kein Springen mehr beim Blättern. */
  .adm-main{flex:1;min-width:0;min-height:0;}
  @media (min-width:761px){
    /* Das weiße Blatt hat eine FESTE Höhe (ganzer Bildschirm minus Rand) und
       ändert sich nie – egal welches Menü. Kein Seiten-Scrollbalken. Kopf und
       Navigation bleiben stehen; NUR die rechte Fläche scrollt in sich. */
    body[data-screen="admin"]{overflow:hidden;}
    /* Diese beiden Regeln gelten nur noch im Vollbild-Fallback OHNE
       Seitenleiste. In der App-Shell (Faz 7) bestimmt die generische
       Shell-Regel Breite und Hoehe - sonst kaempfen zwei feste Hoehen
       gegeneinander und das Panel ragt unten aus dem Bild. */
    body[data-screen="admin"]:not(.has-sidebar) .wrap{max-width:1560px;padding-top:20px;padding-bottom:20px;}
    body:not(.has-sidebar) #screen-admin > .card{height:calc(var(--vh100) - 40px);margin:0;display:flex;flex-direction:column;overflow:hidden;}
    #screen-admin > .card > .adm-header{flex:none;}
    .adm-layout{flex:1;min-height:0;overflow:hidden;margin-top:14px;}
    .adm-side{position:static;top:auto;align-self:flex-start;}
    .adm-main{height:100%;overflow-y:auto;padding-right:6px;}
    .adm-main::-webkit-scrollbar{width:5px;}
    .adm-main::-webkit-scrollbar-thumb{background:rgba(127,127,127,.22);border-radius:8px;}
    .adm-main::-webkit-scrollbar-track{background:transparent;}

    /* ===== ADMIN IN DER APP-SHELL (Faz 7, 2026-07-20) ====================
       Regel wie ueberall (ARCHITEKTUR.md): Kopfzeile oben fest (links Titel,
       rechts Profil - die gemeinsame .app-topbar), darunter das Panel exakt
       so hoch wie die Seitenleiste, gescrollt wird NUR innen.
       Der eigene Admin-Kopf (Zurueck-Link + regenbogenfarbener Titel) faellt
       damit weg: der Titel steht jetzt in der Kopfzeile (PAGE_TITLES.admin),
       zurueck fuehrt die normale Navigation. (Das Ausblenden des eigenen
       Kopfes steht bewusst AUSSERHALB dieser Media Query - auch mobil traegt
       die gemeinsame Kopfzeile den Titel.) */
    body.has-sidebar[data-screen="admin"] #screen-admin > .card{
      height:100%; margin:0; display:flex; flex-direction:column; overflow:hidden;
    }
    body.has-sidebar[data-screen="admin"] .adm-layout{margin-top:0;}
  }

  /* Eigener Admin-Kopf (Zurueck + Regenbogen-Titel) entfaellt in der Shell -
     der Titel steht in der gemeinsamen Kopfzeile (PAGE_TITLES.admin). */
  body.has-sidebar[data-screen="admin"] .adm-header{display:none;}

  /* Die Section selbst darf NICHT mitscrollen (sonst zwei Scrollbalken):
     die generische Shell-Regel macht sie scrollbar - hier zuruecknehmen,
     weil INNEN schon .adm-main scrollt. Gilt fuer beide Seiten. */
  body.has-sidebar[data-screen="admin"] .wrap > #screen-admin,
  body.has-sidebar[data-screen="konto"] .wrap > #screen-konto{
    overflow:hidden; display:flex; flex-direction:column;
  }
  body.has-sidebar[data-screen="konto"] #screen-konto > .card{
    flex:1 1 auto; min-height:0; display:flex; flex-direction:column; margin:0;
  }
  /* ZWEISPALTIG (v2.253.0): dieselbe Hoehen-Mechanik, nur eine Ebene tiefer.
     Die Karte legt jetzt die SPALTEN nebeneinander, und das Kopf/Inhalt-Paar
     (Kopf steht, Inhalt scrollt) sitzt in `.kset-detail`. Ohne diese
     Umleitung waeren `#konto-head` und `#konto-content` keine Flex-Kinder
     mehr – `flex:1 1 auto` liefe ins Leere und die Seite scrollte gar nicht.
     Die Selektoren stehen HIER und nicht im Block weiter oben, weil dort die
     Spezifitaet der Alt-Regel (body.has-sidebar[data-screen]) fehlt. */
  body.has-sidebar[data-screen="konto"] #screen-konto > .card.kset-shell{
    flex-direction:column;
  }
  body.has-sidebar[data-screen="konto"] .kset-detail{
    flex:1 1 auto; min-height:0; display:flex; flex-direction:column;
  }
  /* Einstellungen: die Inhaltsflaeche scrollt, der Kopf bleibt stehen. */
  body.has-sidebar[data-screen="konto"] #konto-head{flex:none;}
  body.has-sidebar[data-screen="konto"] #konto-content{
    flex:1 1 auto; min-height:0; overflow-y:auto; scrollbar-width:none;
  }
  body.has-sidebar[data-screen="konto"] #konto-content::-webkit-scrollbar{display:none;}
  @media(min-width:900px){
    body.has-sidebar[data-screen="konto"] #screen-konto > .card.kset-shell{
      flex-direction:row;
    }
    /* Nebeneinander scrollen BEIDE Spalten fuer sich – eine gemeinsame
       Bildlaufleiste wuerde die Kategorienliste mit wegschieben, und genau
       ihr Stehenbleiben ist der Sinn der zweiten Spalte. */
    body.has-sidebar[data-screen="konto"] .kset-nav{flex:0 0 290px; min-height:0;}
    /* BIS AN DIE PANELKANTE (v2.862.0, Begruendung am .wrap im 900er-Block
       der Seitenleiste). Einstellungen und Schulverwaltung rollen nicht als
       Ganzes, sondern innen - das untere Mass der generischen Shell stand
       deshalb als tote Flaeche unter beiden Spalten, und die Listen endeten
       rund 50 px ueber der Kante. Jetzt reicht der Bildschirm bis unten,
       und die Luft liegt IN den Spalten, die rollen. */
    body.has-sidebar[data-screen="konto"] .wrap > #screen-konto,
    body.has-sidebar[data-screen="admin"] .wrap > #screen-admin{ padding-bottom:0; }
    body.has-sidebar[data-screen="konto"] .kset-nav{ padding-bottom:var(--pl-unten, 18px); }
    body.has-sidebar[data-screen="konto"] .kset-detail{ padding-bottom:0; }
    body.has-sidebar[data-screen="konto"] #konto-content{ padding-bottom:var(--pl-unten, 18px); }
    body.has-sidebar[data-screen="admin"] .adm-main{ padding-bottom:var(--pl-unten, 0px); }
  }
  @media(max-width:899.98px){
    /* Einspaltig ist genau EINE der beiden Spalten zu sehen. Die Regel steht
       ein zweites Mal (die erste sitzt beim .kset-shell-Block oben), weil die
       Zeile `.kset-detail{display:flex}` direkt darueber sie sonst schlaegt –
       gleiche Spezifitaet, spaeter im Stylesheet. Wer eine der beiden
       Fassungen loescht, loescht die Umschaltung fuer eine Bildschirmklasse. */
    body.has-sidebar[data-kset="main"][data-screen="konto"] .kset-detail{display:none;}
    body.has-sidebar[data-kset="sub"][data-screen="konto"] .kset-nav{display:none;}
    /* Einspaltig scrollt die LISTE selbst – sonst haengt sie an der festen
       Shell-Hoehe und der letzte Eintrag ist unerreichbar. */
    body.has-sidebar[data-kset="main"][data-screen="konto"] .kset-nav{
      flex:1 1 auto; min-height:0; overflow-y:auto; scrollbar-width:none;
      padding-bottom:calc(12px + env(safe-area-inset-bottom, 0px));
    }
    body.has-sidebar[data-kset="main"][data-screen="konto"] .kset-nav::-webkit-scrollbar{display:none;}
  }
  /* ADMIN MOBIL SCROLL-FIX (2026-07-21, korrigiert): Mobil/Tablet-Hochkant gilt
     die FESTE App-Shell (@media max-width:899.98px, Zeile ~4481): .wrap hat
     feste Hoehe + overflow:hidden, und die generische Regel macht die aktive
     section zum Innen-Scroll (overflow-y:auto). NUR fuer Admin gewann aber die
     globale Regel #screen-admin{overflow:hidden} (hoehere Spezifitaet durch die
     ID) -> die Section scrollte NICHT, und .adm-main scrollt erst ab 761px ->
     auf dem Handy war NICHTS scrollbar (Inhalt unten abgeschnitten). Loesung:
     die Admin-Section SELBST zum Innen-Scroll machen (wie jede andere App-Seite),
     die Innenstruktur (.card/.adm-layout/.adm-main) natuerlich fliessen lassen.
     Frueherer Versuch "overflow:visible/Body-Scroll" scheiterte, weil .wrap
     (overflow:hidden, feste Hoehe) den ueberlaufenden Inhalt abschnitt. */
  @media (max-width:899.98px){
    body.has-sidebar[data-screen="admin"] .wrap > #screen-admin{
      overflow-y:auto; -webkit-overflow-scrolling:touch;
      flex:1 1 auto; min-height:0; display:block;
      padding-bottom:calc(16px + env(safe-area-inset-bottom, 0px)); }
    body.has-sidebar[data-screen="admin"] #screen-admin > .card{
      height:auto; overflow:visible; display:block; }
    body.has-sidebar[data-screen="admin"] .adm-layout{ height:auto; overflow:visible; }
    body.has-sidebar[data-screen="admin"] .adm-main{ height:auto; overflow:visible; }
  }
  @media (max-width:760px){
    .adm-layout{flex-direction:column;gap:12px;}
    .adm-side{position:static;width:100%;flex-direction:row;flex-wrap:wrap;}
    .adm-side .adm-tab{width:auto;flex:1 1 auto;justify-content:center;}
    .adm-main{min-height:0;}
    /* Mobil-Overflow-Fixes (Bugreport iPhone):
       1) Lehrkraefte-Tabelle ist breiter als der Schirm -> sie scrollt jetzt
          INTERN horizontal statt die ganze Seite aufzuziehen.
       2) Moodle-Tab: lange URLs/Client-IDs sind EIN Wort -> ohne Umbruch
          dehnten sie Karte + Seite. Jetzt duerfen sie ueberall brechen. */
    .adm-main{min-width:0;max-width:100%;}
    .adm-pane{min-width:0;}
    .adm-tbl-wrap{overflow-x:auto;-webkit-overflow-scrolling:touch;}
    .adm-tbl{min-width:560px;}
    #admpane-moodle{overflow-wrap:anywhere;word-break:break-word;}
    #admpane-moodle code{white-space:normal;}
  }
  /* ===== Admin: Inline-Detailansicht (statt Popup) mit Tabs ===== */
  .ad-detail{}
  .ad-dtop{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin-bottom:16px;}
  .ad-back{flex:none;display:inline-flex;align-items:center;gap:6px;background:var(--paper);border:1px solid var(--line);
    color:var(--ink);font:inherit;font-weight:700;font-size:13px;padding:8px 13px;border-radius:10px;cursor:pointer;transition:background .14s,border-color .14s;}
  .ad-back:hover{border-color:var(--brand);color:var(--brand);}
  .ad-back svg{width:16px;height:16px;fill:none;stroke:currentColor;stroke-width:2.2;stroke-linecap:round;stroke-linejoin:round;}
  .ad-dhead{display:flex;align-items:center;gap:13px;flex:1;min-width:200px;}
  .ad-davatar{width:46px;height:46px;border-radius:13px;flex:none;display:flex;align-items:center;justify-content:center;
    background:var(--brand);color:#fff;font-weight:800;font-size:19px;overflow:hidden;}
  .ad-davatar svg{width:24px;height:24px;fill:none;stroke:currentColor;stroke-width:1.9;stroke-linecap:round;stroke-linejoin:round;}
  .ad-dname{font-weight:800;font-size:18px;color:var(--ink);line-height:1.2;display:flex;align-items:center;flex-wrap:wrap;gap:6px;}
  .ad-dsub{font-size:12.5px;color:var(--muted);margin-top:2px;}
  .ad-dactions{flex:none;display:flex;gap:6px;align-items:center;margin-left:auto;}
  .ad-iaction{display:inline-flex;align-items:center;gap:6px;background:var(--paper);border:1px solid var(--line);
    color:var(--ink);font:inherit;font-weight:700;font-size:12.5px;padding:8px 12px;border-radius:9px;cursor:pointer;transition:background .14s,border-color .14s,color .14s;}
  .ad-iaction svg{width:15px;height:15px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;}
  .ad-iaction:hover{border-color:var(--brand);color:var(--brand);}
  .ad-iaction.primary{background:#DBEAFE;border-color:transparent;color:#1E40AF;}
  .ad-iaction.primary:hover{background:#c9ddfb;color:#1E40AF;}
  .ad-iaction.danger{color:var(--bad);}
  .ad-iaction.danger:hover{border-color:var(--bad);color:var(--bad);}
  /* Tab-Leiste innerhalb einer Detailansicht */
  .ad-tabs{display:flex;gap:4px;flex-wrap:wrap;border-bottom:1px solid var(--line);margin-bottom:16px;}
  .ad-tab{border:none;background:none;font:inherit;font-weight:700;font-size:13px;color:var(--muted);
    padding:9px 14px;border-radius:9px 9px 0 0;cursor:pointer;position:relative;top:1px;
    border-bottom:2px solid transparent;transition:color .14s,border-color .14s;}
  .ad-tab:hover{color:var(--ink);}
  .ad-tab.active{color:var(--brand);border-bottom-color:var(--brand);}
  .ad-tabpanel{display:none;}
  .ad-tabpanel.active{display:block;}
  .ad-svg{width:16px;height:16px;flex:none;}
  /* Profilblock unter der Aktionszeile */
  .ad-profile{display:flex;align-items:center;gap:16px;flex-wrap:wrap;margin:6px 0 16px;}
  .ad-pava{width:72px;height:72px;border-radius:18px;flex:none;display:flex;align-items:center;justify-content:center;
    background:var(--brand);color:#fff;font-weight:800;font-size:30px;overflow:hidden;}
  .ad-pava img{width:100%;height:100%;object-fit:cover;}
  /* E-Akte: großes Ordner-Icon ohne grauen Hintergrund */
  .ad-pava.ad-pava-icon{background:transparent;color:var(--brand);width:64px;height:64px;}
  .ad-pava.ad-pava-icon svg{width:56px;height:56px;stroke-width:1.5;}
  .ad-pinfo{min-width:0;flex:1;}
  .ad-pname{font-weight:800;font-size:20px;color:var(--ink);line-height:1.15;display:flex;align-items:center;flex-wrap:wrap;gap:7px;}
  .ad-pmeta{font-size:13px;color:var(--muted);margin-top:3px;display:flex;align-items:center;gap:8px;flex-wrap:wrap;}
  .ad-school{display:flex;align-items:center;gap:11px;flex:none;background:var(--paper);border:1px solid var(--line);border-radius:13px;padding:10px 14px;min-width:210px;}
  .ad-school-logo{width:38px;height:38px;border-radius:10px;flex:none;display:flex;align-items:center;justify-content:center;background:transparent;color:var(--muted);overflow:hidden;}
  .ad-school-logo img{width:100%;height:100%;object-fit:contain;}
  .ad-school-n{font-weight:800;font-size:14px;color:var(--ink);line-height:1.2;}
  .ad-school-s{font-size:11.5px;color:var(--muted);margin-top:1px;}
  /* Kompaktes Kachel-Raster für die Übersicht (statt langer Liste) */
  .ad-ovgrid{display:grid;grid-template-columns:repeat(2,1fr);gap:12px;}
  @media (max-width:820px){ .ad-ovgrid{grid-template-columns:1fr;} }
  .ad-obox{background:var(--paper);border:1px solid var(--line);border-radius:13px;padding:13px 15px;}
  .ad-obox.span2{grid-column:1 / -1;}
  .ad-obox h5{margin:0 0 9px;font-size:11px;font-weight:800;letter-spacing:.05em;text-transform:uppercase;color:var(--muted);}
  /* Admin-Freigaben: Zeile mit Schalter */
  .ad-permrow{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px 12px;border:1px solid var(--line);border-radius:10px;margin-bottom:7px;background:var(--card);}
  .ad-permrow .ap-l{min-width:0;}
  .ad-permrow .ap-t{font-weight:700;font-size:13.5px;color:var(--ink);}
  .ad-permrow .ap-d{font-size:11.5px;color:var(--muted);margin-top:1px;}
  .ad-permrow.off{opacity:.55;}
  /* Schalter (iOS-Stil) */
  .ad-switch{position:relative;flex:none;width:42px;height:24px;border-radius:99px;background:var(--line);border:none;cursor:pointer;transition:background .16s;padding:0;}
  .ad-switch::after{content:"";position:absolute;top:2px;left:2px;width:20px;height:20px;border-radius:50%;background:#fff;box-shadow:0 1px 3px rgba(0,0,0,.25);transition:transform .16s;}
  .ad-switch.on{background:var(--brand);}
  .ad-switch.on::after{transform:translateX(18px);}
  .ad-switch:disabled{cursor:not-allowed;opacity:.5;}
  /* Toolbar: Suche + Filter + Aktion nebeneinander */
  .adm-toolbar{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-top:2px;}
  .adm-filter{padding:11px 12px;border:1px solid var(--line);border-radius:11px;background:var(--paper);font:inherit;font-size:13.5px;color:var(--ink);cursor:pointer;min-width:150px;}
  /* Modernes Tabellen-Layout (Lehrkräfte-Liste) */
  .adm-tbl{width:100%;border-collapse:separate;border-spacing:0;font-size:13.5px;}
  .adm-tbl thead th{text-align:left;font-size:11px;font-weight:800;letter-spacing:.04em;text-transform:uppercase;color:var(--muted);padding:9px 12px;border-bottom:1px solid var(--line);white-space:nowrap;}
  .adm-tbl tbody td{padding:9px 12px;border-bottom:1px solid var(--line);vertical-align:middle;color:var(--ink);}
  .adm-tbl tbody tr{cursor:pointer;transition:background .12s;}
  .adm-tbl tbody tr:hover{background:var(--paper);}
  .adm-tbl tbody tr:last-child td{border-bottom:none;}
  .adm-trow-user{display:flex;align-items:center;gap:11px;min-width:0;}
  .adm-tavatar{position:relative;width:36px;height:36px;border-radius:50%;flex:none;overflow:hidden;display:flex;align-items:center;justify-content:center;font-weight:800;font-size:14px;color:#fff;background:linear-gradient(135deg,#2E5BFF,#7c5cf6);}
  .adm-tavatar img{width:100%;height:100%;object-fit:cover;}
  .adm-tonline{position:absolute;right:-1px;bottom:-1px;width:10px;height:10px;border-radius:50%;background:#15A05A;border:2px solid var(--card);}
  .adm-tname{font-weight:700;color:var(--ink);line-height:1.2;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
  .adm-temail{font-size:11.5px;color:var(--muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
  .adm-tnum{text-align:right;font-variant-numeric:tabular-nums;}
  .adm-tbl-wrap{border:1px solid var(--line);border-radius:14px;overflow:hidden;background:var(--card);}
  /* E-Akte: Dossier-Bausteine */
  .akte-sec{background:var(--paper);border-radius:13px;padding:12px 14px;margin-top:10px;}
  .akte-sec h4{margin:0 0 8px;font-size:12px;font-weight:800;color:var(--muted);letter-spacing:.04em;text-transform:uppercase;}
  .akte-kv{display:flex;justify-content:space-between;gap:10px;font-size:13px;padding:3px 0;}
  .akte-kv span{color:var(--muted);}
  .akte-doc{display:flex;align-items:center;gap:9px;flex-wrap:wrap;padding:8px 2px;border-bottom:1px solid var(--line);font-size:13px;}
  .akte-doc:last-child{border-bottom:none;}
  .akte-badge{border-radius:6px;padding:1px 7px;font-size:10.5px;font-weight:800;background:var(--brand-soft,#DBEAFE);color:var(--brand-dk,#1E40AF);flex:none;}
  .akte-badge.rot{background:#FEE2E2;color:#B91C1C;}
  .akte-badge.grau{background:var(--line);color:var(--muted);}
  .akte-badge.gruen{background:#DCFCE7;color:#15803D;}
  .adm-ovgrid{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:14px;margin-top:14px;}
  .adm-ovgrid2{display:grid;grid-template-columns:1fr 1fr;gap:14px;margin-top:14px;}
  @media (max-width:820px){ .adm-ovgrid2{grid-template-columns:1fr;} }
  .adm-box{background:var(--paper);border-radius:13px;padding:14px;min-width:0;}
  .adm-box h4{margin:0 0 10px;font-size:12.5px;font-weight:700;color:var(--muted);letter-spacing:.02em;}
  .adm-box-click{cursor:pointer;border:1px solid transparent;transition:border-color .12s,transform .12s;}
  .adm-box-click:hover{border-color:var(--brand);transform:translateY(-1px);}
  .adm-chip-row{display:flex;gap:5px;flex-wrap:wrap;margin-bottom:10px;}
  .adm-chip{border:1px solid var(--line);background:var(--card);color:var(--muted);border-radius:99px;
    padding:4px 11px;font-family:inherit;font-size:12px;font-weight:700;cursor:pointer;transition:all .12s;}
  .adm-chip.on{background:var(--brand);border-color:var(--brand);color:#fff;}
  .adm-kindbar{display:flex;align-items:center;gap:8px;padding:3px 0;font-size:12.5px;}
  .adm-kindbar .kb-l{width:86px;flex:none;color:var(--ink);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
  .adm-kindbar .kb-track{display:block;flex:1;height:8px;background:var(--line);border-radius:var(--r-pill);overflow:hidden;}
  .adm-kindbar .kb-fill{display:block;height:100%;background:var(--brand);border-radius:var(--r-pill);}
  .adm-kindbar .kb-n{width:44px;flex:none;text-align:right;font-weight:700;color:var(--muted);font-size:var(--fs-xs);}
  .adm-schooltab{width:100%;border-collapse:collapse;font-size:13px;}
  .adm-schooltab th{text-align:left;font-size:11px;color:var(--muted);font-weight:700;padding:4px 8px;border-bottom:1px solid var(--line);}
  .adm-schooltab td{padding:7px 8px;border-bottom:1px solid var(--line);}
  .adm-schooltab tr:last-child td{border-bottom:none;}
  .adm-schooltab .num{text-align:right;font-weight:700;}
  .adm-online-row{display:flex;align-items:center;gap:8px;padding:5px 0;font-size:13px;border-bottom:1px solid var(--line);}
  .adm-online-row:last-child{border-bottom:none;}
  .adm-online-dot{width:8px;height:8px;border-radius:50%;background:#15A05A;flex:none;animation:tmblink 1.4s infinite;}
  /* Schul-Karten-Raster */
  .sch-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(210px,1fr));gap:10px;}
  @media (min-width:1200px){ .sch-grid{grid-template-columns:repeat(4,1fr);} }
  .sch-card{background:var(--paper);border:1px solid var(--line);border-radius:12px;padding:12px;cursor:pointer;
    display:flex;flex-direction:column;gap:7px;min-width:0;transition:border-color .12s,transform .12s;}
  .sch-card:hover{border-color:var(--brand);transform:translateY(-1px);}
  @keyframes admfade{from{opacity:0;transform:translateY(4px);}to{opacity:1;transform:none;}}
  .adm-search{display:flex;align-items:center;gap:9px;background:var(--paper);border:1px solid var(--line);border-radius:11px;padding:0 12px;margin-top:4px;}
  .adm-search svg{width:18px;height:18px;color:var(--muted);flex:none;}
  .adm-search input{flex:1;border:none;background:none;padding:11px 0;font:inherit;color:var(--ink);outline:none;}
  /* Lehrkräfte: kompaktes Karten-Raster (max. 6 pro Zeile) mit Seiten-Navigation
     statt Scroll-im-Scroll. */
  /* Lehrkräfte werden jetzt als Tabelle gezeigt (siehe .adm-tbl). */
  .adm-ucard{background:var(--paper);border:1px solid var(--line);border-radius:12px;padding:12px;
    cursor:pointer;min-width:0;display:flex;flex-direction:column;gap:7px;transition:border-color .12s,transform .12s;}
  .adm-ucard:hover{border-color:var(--brand);transform:translateY(-1px);}
  .adm-ucard .uc-top{display:flex;align-items:center;gap:8px;min-width:0;}
  .adm-ucard .uc-ava{width:34px;height:34px;border-radius:10px;flex:none;display:flex;align-items:center;
    justify-content:center;font-weight:800;font-size:15px;color:#fff;background:linear-gradient(135deg,#2E5BFF,#7c5cf6);position:relative;}
  .adm-ucard .uc-online{position:absolute;right:-2px;bottom:-2px;width:10px;height:10px;border-radius:50%;
    background:#15A05A;border:2px solid var(--paper);}
  .adm-ucard .uc-name{font-weight:700;font-size:13px;line-height:1.25;overflow:hidden;text-overflow:ellipsis;
    display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;min-width:0;}
  .adm-ucard .uc-school{font-size:10.5px;color:var(--muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
  .adm-ucard .uc-badges{display:flex;gap:4px;flex-wrap:wrap;}
  .adm-ucard .uc-badge{font-size:9px;font-weight:800;border-radius:5px;padding:1px 6px;letter-spacing:.02em;}
  .adm-ucard .uc-usage{font-size:10.5px;color:var(--muted);display:flex;gap:7px;flex-wrap:wrap;}
  .adm-ucard .uc-usage b{color:var(--ink);font-weight:800;}
  #admin-users .adm-upage{grid-column:1/-1;}
  /* Segment-Schalter für Feature-Zustand: An / Schule (erben) / Aus */
  .tm-tri{display:inline-flex;border:1px solid var(--line);border-radius:8px;overflow:hidden;flex:none;}
  .tm-tri button{border:none;background:var(--card);color:var(--muted);font-family:inherit;font-size:11px;
    font-weight:700;padding:5px 9px;cursor:pointer;border-right:1px solid var(--line);}
  .tm-tri button:last-child{border-right:none;}
  .tm-tri button.on-an{background:#15A05A;color:#fff;}
  .tm-tri button.on-std{background:var(--brand);color:#fff;}
  .tm-tri button.on-aus{background:#E5484D;color:#fff;}

  /* ---- Funktionen & Limits als TABELLE ("Excel-Stil") ---------------------
     Befund Murat 09.09.2026: „bu halyile biraz zor yani cok var asagi in in
     bitmiyor." Die Bereiche standen als Akkordeon-Stapel da - je Funktion ein
     Kasten mit Kopf, Koerper und Pfeil. Wer den Stand von zwanzig Funktionen
     sehen wollte, musste zwanzig Kaesten oeffnen und dazwischen scrollen.
     Eine Zeile je Funktion zeigt alles auf einmal; die Erklaerung wandert in
     den title-Tooltip (CLAUDE.md: ein Satz am Bedienelement, der Rest ins
     Handbuch). Benutzt an ZWEI Stellen - Lehrkraft-Detail und Schulformular -
     und deshalb hier als Klasse und nicht zweimal als Inline-Stil. */
  .fl-wrap{overflow-x:auto;-webkit-overflow-scrolling:touch;border:1px solid var(--line);
    border-radius:var(--r-control);background:var(--card);}
  .fl-tab{width:100%;border-collapse:collapse;font-size:var(--fs-sm);min-width:430px;}
  .fl-tab th{position:sticky;top:0;z-index:1;background:var(--paper);color:var(--muted);
    font-size:var(--fs-2xs);font-weight:800;letter-spacing:.03em;text-transform:uppercase;
    text-align:left;padding:7px 10px;border-bottom:1px solid var(--line);white-space:nowrap;}
  .fl-tab td{padding:5px 10px;border-bottom:1px solid var(--hair);vertical-align:middle;}
  .fl-tab tbody tr:last-child td{border-bottom:none;}
  /* Zebra und Hover THEMENNEUTRAL (dieselbe Technik wie .adm-acc-head:hover):
     `--surface-subtle` und `--brand-soft` sind helle Flaechen und haben ihre
     Dunkelfassung nur unter html[data-theme="dark"] - eine Zeile, die sich
     darauf stuetzt, wird beim Umschalten weiss unter heller Schrift. Ein
     grauer Schleier funktioniert in beiden Richtungen. */
  .fl-tab tbody tr:nth-child(even){background:rgba(127,127,127,0.045);}
  .fl-tab tbody tr:hover{background:rgba(127,127,127,0.09);}
  .fl-tab .fl-name{font-weight:600;color:var(--ink);min-width:145px;}
  .fl-tab .fl-erbt{color:var(--muted);font-size:var(--fs-2xs);white-space:nowrap;}
  .fl-tab .fl-gilt{font-weight:700;color:var(--ink);white-space:nowrap;}
  .fl-tab .fl-act{white-space:nowrap;text-align:right;}
  .fl-tab .fl-act .tm-tri{vertical-align:middle;}
  /* Zwei Klassen tief, und das ist Absicht: die Grundregel fuer Eingabefelder
     ist `input[type="number"]{width:100%;padding:13px 14px;font-size:16px}` -
     eine Attributauswahl, die eine einzelne Klasse schlaegt. Ohne die
     zusaetzliche Ebene waere das Zahlenfeld in der Zeile 400px breit und
     schoebe die Knoepfe aus dem Bild. */
  .fl-tab .fl-num{width:64px;padding:4px 7px;border:1px solid var(--line);
    border-radius:var(--r-control);font-family:inherit;font-size:var(--fs-xs);
    background:var(--card);color:var(--ink);vertical-align:middle;}
  .fl-tab .fl-btn{border:1px solid var(--line);background:var(--card);color:var(--ink);
    font-family:inherit;font-size:var(--fs-2xs);font-weight:700;padding:5px 8px;
    border-radius:var(--r-control);cursor:pointer;vertical-align:middle;}
  .fl-tab .fl-btn:hover{border-color:var(--brand);}
  .fl-tab .fl-btn.prim{background:var(--brand);border-color:var(--brand);color:var(--on-brand);}
  .fl-tab .fl-btn.frei{background:var(--ok);border-color:var(--ok);color:var(--on-brand);}
  .fl-tit{font-size:var(--fs-xs);font-weight:800;color:var(--muted);margin:15px 0 7px;
    display:flex;align-items:center;gap:8px;flex-wrap:wrap;}
  .fl-tit:first-child{margin-top:0;}
  .fl-tit .fl-hint{font-weight:600;text-transform:none;letter-spacing:0;}
  /* Handy: die Beschreibungsspalte fliegt raus, damit die Schalter bleiben. */
  @media (max-width:640px){
    .fl-tab{min-width:330px;}
    .fl-tab .fl-weg{display:none;}
    .fl-tab th,.fl-tab td{padding:5px 7px;}
  }
  /* Aufklappbarer Abschnittskopf (z. B. „Neue Schule anlegen") */
  .adm-collapse-head{display:flex;align-items:center;gap:10px;width:100%;text-align:left;cursor:pointer;
    background:var(--paper);border:1px solid var(--line);border-radius:12px;padding:12px 14px;margin:10px 0 0;
    font-family:inherit;font-size:14px;font-weight:700;color:var(--ink);transition:background .12s,border-color .12s;}
  .adm-collapse-head:hover{border-color:var(--brand);background:var(--card);}
  .adm-collapse-head .acl-plus{width:18px;height:18px;color:var(--brand);flex:none;}
  .adm-collapse-head span{flex:1;}
  .adm-collapse-head .acl-chev{width:18px;height:18px;color:var(--muted);flex:none;transition:transform .18s;}
  .adm-collapse-head[aria-expanded="true"] .acl-chev{transform:rotate(90deg);}
  .adm-collapse-head[aria-expanded="true"] .acl-plus{display:none;}
  .adm-reqbanner{background:linear-gradient(135deg,rgba(46,91,255,.10),rgba(124,92,246,.10));border:1px solid rgba(46,91,255,.25);border-radius:13px;padding:13px 15px;margin-bottom:14px;}
  .adm-reqbanner .rb-title{font-weight:700;font-size:14px;color:var(--ink);display:flex;align-items:center;gap:8px;}
  html[data-theme="dark"] .adm-tab.active{background:#283042;}
  @media (prefers-color-scheme: dark){ html:not([data-theme="light"]) .adm-tab.active{background:#283042;} }
  .adm-acc{border:1px solid var(--line);border-radius:12px;overflow:hidden;}
  .adm-acc-head{width:100%;display:flex;align-items:center;justify-content:space-between;background:var(--card);border:none;padding:13px 15px;cursor:pointer;font-family:inherit;font-weight:700;font-size:var(--fs-md);color:var(--ink);}
  .adm-acc-head:hover{background:rgba(127,127,127,0.04);}
  .adm-acc-arr{width:18px;height:18px;transition:transform .2s;color:var(--muted);}
  .adm-acc-arr.open{transform:rotate(90deg);}
  .adm-acc-body{padding:4px 15px 12px;border-top:1px solid var(--line);}
  /* Abstand zwischen zwei gestapelten Aufklappern. Vorher stand er elfmal
     als style="margin-top:8px" im Markup - der Design-Waechter zaehlt das
     mit, und elf Kopien derselben Zahl sind elf Orte fuer denselben Fehler. */
  .adm-acc-sub{margin-top:8px;}
  /* Lehrkraft-Detail Modal */
  .tm-bg{position:fixed;inset:0;background:rgba(0,0,0,.45);display:none;align-items:flex-start;justify-content:center;z-index:10000;padding:20px;overflow-y:auto;}
  .tm-bg.show{display:flex;}
  .tm-card{background:var(--card);border-radius:18px;width:100%;max-width:440px;padding:22px;box-shadow:0 24px 60px rgba(0,0,0,.32);position:relative;margin:auto;animation:tmpop .18s ease;}
  /* Breites Lehrkraft-Detail: zwei Spalten auf Desktop */
  .tm-card--wide{max-width:940px;}
  .tm-cols{display:grid;grid-template-columns:1fr 1fr;gap:0 30px;align-items:start;}
  @media (max-width:760px){ .tm-cols{grid-template-columns:1fr;} }
  @keyframes tmpop{from{opacity:0;transform:translateY(10px) scale(.98);}to{opacity:1;transform:none;}}
  .tm-loading{text-align:center;color:var(--muted);padding:40px;}
  .tm-close{position:absolute;top:14px;right:14px;background:rgba(127,127,127,0.12);border:none;width:30px;height:30px;border-radius:50%;cursor:pointer;font-size:15px;color:var(--ink);line-height:1;}
  .tm-close:hover{background:rgba(127,127,127,0.22);}
  .tm-head{display:flex;align-items:center;gap:13px;margin-bottom:18px;padding-right:30px;}
  .tm-avatar{width:48px;height:48px;border-radius:14px;background:linear-gradient(135deg,#2E5BFF,#7c5cf6);color:#fff;display:flex;align-items:center;justify-content:center;font-size:22px;font-weight:800;flex:none;}
  .tm-name{font-size:17px;font-weight:800;color:var(--ink);}
  .tm-email{font-size:12.5px;color:var(--muted);margin-bottom:3px;}
  .tm-online{display:inline-flex;align-items:center;gap:5px;font-size:12px;font-weight:700;color:#15A05A;}
  .tm-dot{width:8px;height:8px;border-radius:50%;background:#15A05A;animation:tmblink 1.4s infinite;}
  @keyframes tmblink{0%,100%{opacity:1;}50%{opacity:.35;}}
  .tm-offline{font-size:11.5px;color:var(--muted);}
  .tm-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:8px;margin-bottom:16px;}
  .tm-stat{background:var(--paper);border-radius:11px;padding:11px 8px;text-align:center;}
  .tm-stat-lbl{font-size:10.5px;color:var(--muted);line-height:1.2;margin-bottom:3px;}
  .tm-stat-val{font-size:22px;font-weight:800;color:var(--ink);}
  .tm-section{border-top:1px solid var(--line);padding-top:13px;margin-top:13px;}
  .tm-sec-title{font-size:12px;font-weight:800;letter-spacing:.04em;text-transform:uppercase;color:var(--muted);margin-bottom:10px;}
  .tm-kv{display:flex;justify-content:space-between;align-items:center;gap:10px;padding:5px 0;font-size:13.5px;color:var(--ink);}
  .tm-kv b{font-weight:700;}
  .tm-muted{font-size:12.5px;color:var(--muted);font-style:italic;margin-top:4px;}
  .tm-fav{margin-top:8px;font-size:13px;color:var(--ink);background:rgba(224,153,46,0.10);padding:8px 11px;border-radius:9px;}
  .tm-chart{display:flex;align-items:flex-end;gap:5px;height:80px;}
  .tm-bar-col{flex:1;display:flex;flex-direction:column;align-items:center;gap:5px;height:100%;justify-content:flex-end;}
  .tm-bar-wrap{width:100%;height:62px;display:flex;align-items:flex-end;}
  .tm-bar{width:100%;background:linear-gradient(180deg,#2E5BFF,#7c5cf6);border-radius:5px 5px 0 0;min-height:4px;}
  .tm-bar-lbl{font-size:9px;color:var(--muted);}
  .main-nav{display:flex;align-items:center;gap:6px;background:#EEF1F6;border-radius:14px;padding:5px;margin:0 0 20px;overflow:visible;}
  /* Tabs füllen die Leiste gleichmäßig (kein Links-Stau) und schrumpfen gleich mit. */
  .nav-scroll{flex:1;min-width:0;display:flex;gap:4px;padding:1px;}
  .main-nav button{flex:1 1 0;min-width:0;border:none;background:transparent;font-family:inherit;font-weight:700;font-size:12.5px;color:var(--muted);cursor:pointer;padding:10px 8px;border-radius:10px;display:flex;align-items:center;justify-content:center;gap:7px;white-space:nowrap;transition:background .14s,color .14s,box-shadow .14s;}
  .main-nav button.on{background:#fff;color:var(--ink);box-shadow:0 1px 4px rgba(27,34,48,.10);}
  .main-nav button:hover:not(.on){color:var(--ink);}
  .main-nav button span{overflow:hidden;text-overflow:ellipsis;}
  @media(max-width:620px){
    .main-nav{gap:3px;padding:4px;}
    .main-nav button{padding:9px 6px;font-size:11px;gap:5px;border-radius:9px;}
    .main-nav button svg{width:18px;height:18px;}
    .main-nav button.on{box-shadow:0 1px 5px rgba(27,34,48,.14);}
    /* Platz sparen: nur der aktive Tab zeigt Text, der Rest nur Icon */
    .main-nav .nav-scroll button:not(.on) span{display:none;}
  }
  @media(max-width:380px){
    .main-nav .nav-scroll button.on span{font-size:10.5px;}
    .main-nav button{padding:8px 5px;}
  }
  /* Desktop: Tabs nicht mehr über die volle Breite strecken, sondern als
     kompaktes, zentriertes Cluster (Canva/Notion-Stil). Mobil bleibt wie bisher. */
  @media(min-width:900px){
    .main-nav .nav-scroll{justify-content:center;gap:6px;}
    .main-nav .nav-scroll button{flex:0 0 auto;padding:10px 22px;}
    .main-nav .nav-scroll .nav-icon-only{padding:10px 14px;gap:7px;}
  }
  /* Cockpit-Textlabel: nur ab Desktop (≥900px), sonst nur Icon */
  .main-nav .nav-ck-label{display:none;font-family:inherit;font-weight:700;font-size:12.5px;}
  @media(min-width:900px){ .main-nav .nav-ck-label{display:inline;} }
  /* Extra-Tabs (Klassenarbeiten/Kurse/Fächer): standardmäßig aus,
     erst auf breiten Desktops (≥1150px) in der Leiste sichtbar. */
  .main-nav .nav-scroll .nav-extra{display:none;}
  @media(min-width:1150px){
    .main-nav .nav-scroll .nav-extra{display:flex;flex:0 0 auto;padding:10px 18px;}
    /* Doppelung vermeiden: identische Einträge im Werkzeuge-Menü ausblenden */
    .nav-more-menu .nm-extra,.nav-more-menu .nm-extra-div{display:none;}
  }
  .main-nav button svg{width:17px;height:17px;flex:none;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;}
  .main-nav .nav-plus{flex:0 0 auto;width:42px;padding:10px 0;border:none;background:transparent;color:var(--muted);cursor:pointer;border-radius:10px;display:flex;align-items:center;justify-content:center;transition:background .14s,color .14s;}
  .main-nav .nav-plus:hover{background:#fff;color:var(--ink);}
  .main-nav .nav-plus svg{width:19px;height:19px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;}
  /* Cockpit: nur Icon (Text gespart), verhält sich wie ein normaler Tab */
  .main-nav .nav-icon-only{flex:0 0 auto;border:none;background:transparent;cursor:pointer;color:var(--muted);
    padding:10px;border-radius:10px;display:flex;align-items:center;justify-content:center;transition:background .14s,color .14s,box-shadow .14s;}
  .main-nav .nav-icon-only:hover:not(.on){color:var(--ink);}
  .main-nav .nav-icon-only.on{background:#fff;color:var(--ink);box-shadow:0 1px 4px rgba(27,34,48,.10);}
  .main-nav .nav-icon-only svg{width:18px;height:18px;flex:none;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;}
  /* "Werkzeuge"-Trigger: schlicht wie die anderen Tabs (kein Rahmen, nicht "aktiv") */
  .main-nav .nav-werkzeuge{width:auto;gap:3px;padding:10px;border:none;background:transparent;color:var(--muted);border-radius:10px;}
  .main-nav .nav-werkzeuge:hover{background:#fff;color:var(--ink);}
  .main-nav .nav-werkzeuge svg:first-child{width:19px;height:19px;}
  .main-nav .nav-werkzeuge .nw-caret{width:13px;height:13px;transition:transform .18s;}
  .main-nav .nav-werkzeuge.dd-open{background:#fff;color:var(--ink);}
  .main-nav .nav-werkzeuge.dd-open .nw-caret{transform:rotate(180deg);}
  @media(max-width:560px){
    .main-nav .nav-icon-only{padding:9px;}
    .main-nav .nav-werkzeuge{padding:9px 8px;}
  }
  /* ===== COCKPIT ===== */
  .cockpit-actions{display:grid;grid-template-columns:repeat(3,1fr);gap:11px;margin-bottom:18px;}
  @media(max-width:560px){
    .cockpit-actions{display:flex;flex-wrap:nowrap;overflow-x:auto;gap:10px;padding-bottom:6px;
      -ms-overflow-style:none;scrollbar-width:none;scroll-snap-type:x proximity;cursor:grab;}
    .cockpit-actions::-webkit-scrollbar{display:none;}
    .cockpit-actions.dragging-scroll{cursor:grabbing;}
    .cockpit-act{flex:0 0 auto;width:172px;scroll-snap-align:start;}
  }
  .cockpit-act{appearance:none;text-align:left;border:1.5px solid var(--line);background:var(--card);border-radius:16px;
    padding:16px;cursor:pointer;font-family:inherit;display:flex;flex-direction:column;gap:4px;transition:border-color .12s,transform .08s,box-shadow .12s;}
  .cockpit-act:hover{border-color:var(--brand);box-shadow:0 4px 16px rgba(46,91,255,.08);}
  .cockpit-act:active{transform:scale(.985);}
  .cockpit-act .ca-ico{width:42px;height:42px;border-radius:12px;display:flex;align-items:center;justify-content:center;margin-bottom:6px;}
  .cockpit-act .ca-ico svg{width:22px;height:22px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;}
  .cockpit-act .ca-t{font-weight:800;font-size:var(--fs-md);color:var(--ink);}
  .cockpit-act .ca-s{font-size:var(--fs-xs);color:var(--muted);}
  /* ===== DIE KACHEL-TÖNE (v2.409.0) =====================================
     BEFUND MURAT 24.08.2026: die Kennzahlen-Reihe und der Schnellzugriff
     waren fünf bzw. vierzehn WEISSE Kästen mit dünnem Rand und einem grauen
     Icon-Plättchen – „can sikici, anlamsiz". Man liest so eine Reihe nicht,
     weil nichts darin heraussticht.

     JETZT trägt jede Kachel eine FLÄCHE in ihrem Ton. Das sind vier Töne und
     kein Regenbogen, und sie sind nicht dekorativ:
       grün   = etwas ist eingegangen / etwas läuft gut
       blau   = Marke, neutrale Zahl, „Unterricht & Üben"
       bernstein = jemand braucht Aufmerksamkeit / „Bewerten & Planen"
       violett = Kategorie (Hausaufgaben, Verwaltung) – KEINE Bewertung
     Die Werte kommen ausnahmslos aus design-tokens.css; hier steht nur die
     Zuordnung. Wer einen fünften Ton braucht, legt erst ein Token an.

     WARUM ZWEI EIGENE EIGENSCHAFTEN und nicht direkt `background`: die
     Kennzahl-Kachel (.ck2-kpi) und die Schnellzugriff-Kachel (.lx-card) sind
     verschiedene Bausteine, sollen aber DIESELBE Sprache sprechen. Ein Ton
     wird einmal gesetzt und von beiden gelesen – so kann die Seite nicht in
     zwei Farbwelten auseinanderlaufen. Beim Schnellzugriff sitzt die Klasse
     auf der Hülle (.lx-slot), damit auch der Stern daneben den Ton kennt;
     eigene Eigenschaften vererben sich, `background` täte das nicht.

     MIT WEM VERBUNDEN: renderKpis() und launcherCard()/wzKatalog()
     (static/js/index-app.js), qa/unit/test_cockpit_kacheln.py. */
  .ck-ton-blau   { --kachel-flaeche:var(--brand-soft);   --kachel-schrift:var(--brand-dk);   }
  .ck-ton-gruen  { --kachel-flaeche:var(--ok-soft);      --kachel-schrift:var(--ok-ink);     }
  .ck-ton-amber  { --kachel-flaeche:var(--amber-soft);   --kachel-schrift:var(--amber-ink);  }
  .ck-ton-lila   { --kachel-flaeche:var(--violett-soft); --kachel-schrift:var(--violett-ink);}
  /* Das BILD auf der Kachel ist eine eigene Datei (v2.410.0) – weder SVG
     („svg kullanmiyoruz", Murat 24.08.2026) noch mehr ein Emoji („emoji cok
     ucuz duruyor", derselbe Tag). Ein Emoji zeichnet das Betriebssystem: auf
     dem iPad gemalt, auf Windows flacher, auf Android wieder anders – wir
     wussten also nicht, was eine Lehrkraft sieht. Die Dateien liegen unter
     static/images/kacheln/ und werden SELBST ausgeliefert; von einem CDN
     geholt wären sie eine Übermittlung der IP-Adresse (docs/RECHT_NRW.md §4).
     Das Bild liegt UNTEN RECHTS und läuft über die Kante hinaus; genau das
     unterscheidet „Fläche mit Bild darin" von „Kasten mit Icon daneben". Der
     Text steht links und wird davon nie berührt (max-width an .k-l/.lx-t).
     GRÖSSE STEHT NICHT HIER, sondern bei .k-ico/.lx-ico – eine Kennzahl-
     Kachel ist höher als eine Schnellzugriff-Kachel. `height:auto` hält die
     Bilder quadratisch, auch wenn eine Datei einmal nicht quadratisch ist.
     MIT WEM VERBUNDEN: ckBildHtml() in static/js/index-app.js. */
  /* ZURUECKHALTUNG IST DER NORMALZUSTAND (v2.411.0). BEFUND MURAT
     24.08.2026: „o ikonlar yani soluk sekilde durmaliydi üstüne gelince
     belirgin olmali ve ön plana cikmali." Er hat recht, und der Grund ist
     nicht Geschmack: 28 vollfarbige 3D-Bilder auf EINEM Bildschirm sind 28
     gleich laute Stimmen. Was zuerst gelesen werden soll, ist die ZAHL bzw.
     das WORT – das Bild sagt nur, worum es geht. Also steht es blass und
     entsaettigt da und wird erst unter dem Zeiger ganz es selbst.
     `opacity` UND `saturate` zusammen, nicht eines von beidem: nur blass
     bliebe es bunt und zoege den Blick weiter auf sich, nur entsaettigt
     waere es ein graues Bild in voller Staerke. */
  .ck-bild{position:absolute;z-index:0;pointer-events:none;
    height:auto;object-fit:contain;user-select:none;
    opacity:.42;filter:saturate(.5);
    transform:rotate(-6deg);
    transition:transform .18s,opacity .18s,filter .18s;}
  /* OHNE ZEIGER GIBT ES KEIN "DRUEBER" (Telefon, Tablet, Store-Apps). Dort
     bliebe das Bild fuer immer blass – also ist es dort von vornherein
     kraeftiger. `hover:hover` trennt das sauber, `pointer:fine` nicht: ein
     iPad mit Stift meldet fine, kann aber trotzdem nicht schweben. */
  @media (hover: none){
    .ck-bild{opacity:.78;filter:saturate(.85);}
  }

  /* === Werkzeug-Launcher (Variante A) === */
  #cockpit-launcher{margin-bottom:20px;}
  /* SIEBEN JE REIHE (v2.409.0, Befund Murat: „bir satira 6 7 tane
     sigdirabilirsin cünki bombos yani az text var ama yer cok tutuyo").
     Er hatte recht: die Karte trug ein Icon-Plättchen, einen Titel UND einen
     Halbsatz – vier Bauteile für ein Wort. Übrig bleibt Fläche, Wort, Bild;
     in dieselbe Breite passen damit sieben statt fünf. Am Telefon bleibt es
     bei fünf (Regel weiter unten) – dort ist die Breite die Grenze, nicht
     der Inhalt. */
  .lx-grid{display:grid;grid-template-columns:repeat(6,1fr);gap:10px;}
  /* Der Stern liegt NEBEN der Karte, nicht darin: die Karte ist ein <button>,
     und ein Knopf im Knopf ist ungueltiges HTML. Deshalb eine Huelle je
     Rasterfeld, in der beide nebeneinander liegen (v2.284.0). */
  .lx-slot{position:relative;display:flex;min-width:0;}
  /* MITTIG IN DER HÖHE (Anweisung Murat 24.08.2026: „tam ortalamak
     zorundasin y düzleminde"). Vorher lag der Inhalt oben und die Kachel
     füllte den Rest mit Luft – bei einem einzigen Wort sah das aus wie ein
     Fehler. `justify-content:center` bei fester Mindesthöhe stellt das Wort
     auf die Mittellinie, egal ob es ein- oder zweizeilig umbricht. */
  .lx-card{appearance:none;text-align:left;border:none;border-radius:14px;
    background:var(--kachel-flaeche);color:var(--kachel-schrift);
    padding:12px 13px;min-height:66px;cursor:pointer;font-family:inherit;
    display:flex;flex-direction:column;justify-content:center;gap:3px;min-width:0;flex:1;
    position:relative;overflow:hidden;transition:transform .15s,filter .15s;}
  .lx-card:hover{transform:translateY(-2px);filter:brightness(.97);}
  /* VOR DEM WORT, nicht dahinter: `z-index` hebt das Bild ueber den Text,
     und weil es dabei waechst, laeuft es weiter aus der Ecke heraus – das
     ist das „ön plana cikmali". Die Kachel behaelt ihr `overflow:hidden`;
     der Anschnitt IST die Kachelsprache, ohne ihn saehe es aus wie ein
     Aufkleber, der sich loest. */
  .lx-card:hover .lx-ico{opacity:1;filter:none;z-index:2;
    transform:rotate(-5deg) translate(-4px,-4px) scale(1.22);}
  /* MIT DER TASTATUR DASSELBE (die Kachel ist ein <button>): wer per Tab
     navigiert, sieht sonst nur blasse Bilder und verliert genau die
     Rueckmeldung, die der Zeiger bekommt. */
  .lx-card:focus-visible .lx-ico{opacity:1;filter:none;z-index:2;
    transform:rotate(-5deg) translate(-4px,-4px) scale(1.22);}
  .lx-card:active{transform:scale(.985);}
  .lx-pin{position:absolute;top:6px;right:6px;z-index:2;display:flex;align-items:center;justify-content:center;
    width:24px;height:24px;border-radius:8px;color:var(--muted);opacity:.55;cursor:pointer;
    transition:color .12s,opacity .12s,background .12s;}
  .lx-pin svg{width:14px;height:14px;fill:none;stroke:currentColor;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round;}
  .lx-pin:hover{color:var(--amber);background:var(--amber-soft);opacity:1;}
  .lx-pin:focus{outline:none;}
  .lx-pin:focus-visible{outline:2px solid var(--amber);outline-offset:1px;}
  .lx-pin.ist-an{color:var(--amber);opacity:1;}
  .lx-pin.ist-an svg{fill:currentColor;}
  /* Leerhinweis und Kachel „+" (bis v2.941.x) gibt es nicht mehr: ohne
     Angeheftetes zeigt der Schnellzugriff nichts, „Anheften" liegt im
     Bearbeiten-Modus bzw. am Telefon unter „Alles" (v2.942.0). */
  /* Das Bild sitzt in der unteren rechten Ecke und ragt über die Kante –
     Maße hier, gemeinsame Grundregel oben in .ck-bild. Etwas größer als das
     frühere 30px-Emoji: die 3D-Bilder haben rundum einen leeren Rand, das
     Motiv darin wäre sonst kleiner als vorher das Zeichen. */
  .lx-ico{right:-6px;bottom:-8px;width:38px;}
  /* .lx-s (der Halbsatz unter dem Namen) ist mit v2.409.0 ersatzlos weg.
     Bei sieben Kacheln je Reihe blieben davon ohnehin nur Pünktchen übrig,
     und was ein Werkzeug tut, steht auf der Werkzeugseite und im Handbuch
     (CLAUDE.md: Erklärungen gehören nicht auf den Bildschirm). Wer ihn
     zurückholt, bekommt die alte Kachelhöhe mit. */
  /* KEIN `hyphens:auto` und kein `word-break` mehr: bei 13px Fettschrift auf
     einer schmalen Kachel trennte das jeden langen deutschen Namen mitten im
     Wort („Aufgabenzen-trale"), und das liest sich wie ein Fehler.
     `overflow-wrap:break-word` greift nur noch als Notausgang, wenn ein
     einzelnes Wort wirklich breiter ist als die Kachel. */
  .lx-t{font-weight:800;font-size:var(--fs-sm);color:inherit;line-height:1.25;
    position:relative;z-index:1;max-width:88%;overflow-wrap:break-word;}
  /* Mobil: 4 in einer Reihe – kompakt (Icon + kurzes Label). NACH den Basisregeln, damit es greift. */
  @media(max-width:560px){
    /* FUENF je Reihe (v2.395.0, Anweisung Murat: „bir satirda 5 kutu").
       Vorher vier - dann standen Kennzahlen (5) und Schnellzugriff (4)
       untereinander in zwei verschiedenen Rastern, und genau solche
       Halbheiten machen den unruhigen Eindruck. */
    .lx-grid{grid-template-columns:repeat(5,1fr);gap:6px;}
    .lx-card{padding:9px 4px 8px;align-items:center;text-align:center;gap:2px;
      border-radius:12px;min-height:0;}
    /* Die Karte ist hier zentriert und nur rund 70px breit - der Stern muss
       in die Ecke rutschen, sonst liegt er auf dem Bild. */
    .lx-pin{top:1px;right:1px;width:20px;height:20px;border-radius:7px;}
    .lx-pin svg{width:12px;height:12px;}
    /* DAS BILD STEHT HIER OBEN, NICHT IN DER ECKE. Auf 70px Kachelbreite ist
       kein Platz für "Wort links, Bild rechts" - das Bild läge auf der
       Schrift. Also dieselbe Kachel, andere Anordnung: Bild, darunter das
       Wort, beides mittig. Deshalb `position:static` (die Grundregel in
       .ck-bild stellt es absolut) und keine Drehung. */
    /* `order:-1` DREHT DIE REIHENFOLGE, NICHT DAS MARKUP. Am Computer steht
       das Bild NACH dem Wort (es liegt in der Ecke, die Vorlese-Reihenfolge
       soll mit dem Namen anfangen). Hier oben stünde es sonst unter dem Wort -
       und der Stern oben rechts läge mitten im Namen. */
    .lx-ico{position:static;width:27px;transform:none;order:-1;}
    /* Voller Name, bricht bei Bedarf auf 2 Zeilen um – kein Abschneiden */
    .lx-t{font-size:10px;line-height:1.1;text-align:center;width:100%;max-width:100%;}
  }
  @media(max-width:380px){
    .lx-grid{gap:5px;}
    .lx-card{padding:8px 3px 7px;}
    .lx-ico{width:23px;}
    .lx-t{font-size:9.5px;}
  }
  .cockpit-status{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin-bottom:14px;padding:13px 15px;
    border:1.5px solid var(--line);border-radius:var(--r-card);background:linear-gradient(180deg,var(--brand-soft),var(--card));}
  .cockpit-status .cs-usage{flex:1;min-width:180px;display:flex;flex-direction:column;gap:6px;}
  .cockpit-status .cs-usage-h{font-size:var(--fs-xs);font-weight:800;color:var(--muted);text-transform:uppercase;letter-spacing:.04em;margin-bottom:1px;}
  .cockpit-status .cs-row{display:flex;align-items:center;gap:10px;}
  .cockpit-status .cs-row-l{flex:none;width:84px;font-size:var(--fs-xs);font-weight:700;color:var(--ink);}
  .cockpit-status .cs-row-bar{flex:1;min-width:50px;}
  .cockpit-status .cs-row-r{flex:none;font-size:var(--fs-xs);font-weight:600;color:var(--muted);white-space:nowrap;min-width:48px;text-align:right;}
  .cockpit-status .cs-row-r b{color:var(--ink);}
  .cockpit-status .cs-inf{font-size:var(--fs-md);font-weight:800;color:var(--ok);}
  /* Reflexion: Einstiegsbutton im Ergebnis + Vollbild-Overlay */
  .rfx-entry-btn{display:flex;align-items:center;gap:12px;width:100%;text-align:left;cursor:pointer;font-family:inherit;
    background:linear-gradient(135deg,#6D5BFF,#8B6CFF);color:var(--card);border:none;border-radius:16px;padding:15px 18px;
    box-shadow:0 8px 22px rgba(109,91,255,.28);transition:transform .12s,box-shadow .12s;}
  .rfx-entry-btn:hover{transform:translateY(-1px);box-shadow:0 12px 28px rgba(109,91,255,.34);}
  .rfx-overlay{position:fixed;inset:0;z-index:10050;background:rgba(20,22,35,.55);backdrop-filter:blur(6px);
    display:flex;align-items:center;justify-content:center;padding:18px;animation:rfxFade .2s ease;}
  @keyframes rfxFade{from{opacity:0;}to{opacity:1;}}
  .rfx-card{background:var(--card);border-radius:26px;max-width:430px;width:100%;padding:28px 24px 22px;
    box-shadow:0 30px 70px rgba(0,0,0,.35);max-height:92vh;overflow-y:auto;animation:rfxPopIn .28s cubic-bezier(.2,.9,.3,1.2);text-align:center;}
  @keyframes rfxPopIn{from{opacity:0;transform:scale(.9) translateY(14px);}to{opacity:1;transform:none;}}
  .rfx-emoji{font-size:46px;line-height:1;margin-bottom:6px;}
  .rfx-pop{animation:rfxPop .5s cubic-bezier(.2,.9,.3,1.4);}
  @keyframes rfxPop{0%{transform:scale(0);}60%{transform:scale(1.25);}100%{transform:scale(1);}}
  .rfx-title{font-size:23px;font-weight:800;margin:0 0 4px;color:var(--ink);}
  .rfx-sub{font-size:14px;color:var(--muted);margin:0 0 18px;}
  .rfx-q{font-size:var(--fs-md);font-weight:800;color:var(--ink);text-align:left;margin:14px 2px 9px;}
  .rfx-opts{display:flex;gap:9px;}
  .rfx-opt{flex:1;display:flex;flex-direction:column;align-items:center;gap:6px;cursor:pointer;font-family:inherit;
    background:var(--paper);border:2px solid transparent;border-radius:16px;padding:13px 6px;
    font-size:var(--fs-xs);font-weight:700;color:var(--ink);transition:transform .1s,border-color .12s,background .12s;}
  .rfx-opt:hover{transform:translateY(-2px);}
  .rfx-opt-emo{font-size:27px;line-height:1;}
  .rfx-opt.sel{border-color:var(--brand);background:var(--brand-soft);}
  .rfx-textlink{background:none;border:none;color:var(--brand);font-family:inherit;font-size:var(--fs-sm);font-weight:700;
    cursor:pointer;margin:18px auto 0;display:block;}
  .rfx-text{width:100%;margin-top:10px;border:1.5px solid var(--line);border-radius:12px;padding:11px;
    font-family:inherit;font-size:14px;resize:vertical;min-height:64px;box-sizing:border-box;}
  .rfx-send{width:100%;margin-top:18px;background:var(--brand);color:var(--card);border:none;border-radius:var(--r-card);
    padding:14px;font-family:inherit;font-size:var(--fs-base);font-weight:800;cursor:pointer;transition:filter .12s;}
  .rfx-send:hover{filter:brightness(1.06);}
  .rfx-skip{width:100%;margin-top:8px;background:none;border:none;color:var(--muted);font-family:inherit;
    font-size:var(--fs-sm);font-weight:600;cursor:pointer;padding:8px;}
  .cockpit-status .cs-utext{font-size:var(--fs-sm);font-weight:600;color:var(--ink);}
  .cockpit-status .cs-bar{height:7px;border-radius:99px;background:rgba(127,127,127,.16);overflow:hidden;}
  .cockpit-status .cs-bar-fill{height:100%;border-radius:99px;transition:width .3s;}
  .cockpit-status .cs-ubadge{font-weight:800;font-size:var(--fs-sm);padding:2px 10px;border-radius:99px;}
  .cockpit-status .cs-ubadge.ok{background:var(--ok-soft);color:var(--ok);}
  .cockpit-status .cs-school{display:inline-flex;align-items:center;gap:7px;font-weight:700;font-size:var(--fs-sm);color:var(--ok);
    background:var(--ok-soft);padding:7px 13px;border-radius:99px;white-space:nowrap;}
  .cockpit-status .cs-dot{width:8px;height:8px;border-radius:50%;background:var(--ok);}
  .cockpit-h{font-weight:800;font-size:var(--fs-md);color:var(--ink);margin:4px 0 10px;}
  /* Genug Innen-/Außenabstand, damit die unteren Kartenränder nie
     abgeschnitten wirken (1.5px-Border + Schatten brauchen Platz). */
  .cockpit-recent{display:flex;gap:11px;overflow-x:auto;align-items:stretch;padding:2px 2px 16px;scroll-behavior:smooth;-ms-overflow-style:none;scrollbar-width:none;margin-bottom:30px;}
  .cockpit-recent::-webkit-scrollbar{display:none;}
  .recent-card{appearance:none;flex:0 0 auto;width:186px;text-align:left;border:1.5px solid var(--line);background:var(--card);
    border-radius:13px;padding:12px 13px 11px;cursor:pointer;font-family:inherit;position:relative;overflow:hidden;
    display:flex;flex-direction:column;gap:5px;transition:border-color .12s,transform .08s,box-shadow .12s;}
  .recent-card:hover{border-color:var(--brand);box-shadow:0 4px 14px rgba(46,91,255,.08);}
  .recent-card:active{transform:scale(.98);}
  .recent-card .rc-bar{position:absolute;top:0;left:0;right:0;height:4px;}
  .recent-card .rc-fach{align-self:flex-start;font-size:11px;font-weight:800;padding:2px 8px;border-radius:99px;margin-top:4px;}
  .recent-card .rc-title{font-weight:700;font-size:14px;color:var(--ink);line-height:1.25;
    display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;}
  .recent-card .rc-meta{font-size:var(--fs-xs);color:var(--muted);margin-top:auto;}
  .cockpit-tipp{display:flex;gap:12px;align-items:flex-start;padding:14px 16px;border-radius:var(--r-card);
    background:var(--amber-soft);border:1.5px solid var(--amber-line);}
  .cockpit-tipp .ct-ico{flex:none;width:34px;height:34px;border-radius:10px;background:var(--amber);
    display:flex;align-items:center;justify-content:center;}
  .cockpit-tipp .ct-ico svg{width:19px;height:19px;fill:none;stroke:var(--card);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;}
  .cockpit-tipp .ct-h{font-weight:800;font-size:var(--fs-sm);color:var(--ink);margin-bottom:2px;}
  .cockpit-tipp .ct-b{font-size:var(--fs-sm);color:var(--ink);opacity:.85;line-height:1.45;}
  /* ===== Cockpit: Unterstützen-Karte (dezent, freundlich, nicht aufdringlich) ===== */
  .ck-support{display:flex;gap:13px;align-items:center;padding:15px 17px;border-radius:var(--r-card);
    background:var(--bad-soft);
    /* Der Rand ist ein ZWISCHENTON zwischen --bad-soft und --bad, und dafuer
       hat das Woerterbuch keinen Namen (§3.3 kennt Flaeche, Schrift und
       weiche Fuellung - keine farbige Linie). Statt einen vierten festen Rot
       ton zu erfinden, wird er aus --bad GERECHNET: aendert sich das Rot,
       zieht der Rand mit. Die erste Zeile ist der Rueckfall fuer aeltere
       WebViews ohne color-mix - dasselbe Muster wie beim oeffentlichen Kopf. */
    border:1.5px solid #FBD5D2;
    border:1.5px solid color-mix(in srgb, var(--bad) 28%, var(--card));
    margin:2px 0 4px;}
  .ck-support .cks-ico{flex:none;width:38px;height:38px;border-radius:11px;background:var(--bad);
    display:flex;align-items:center;justify-content:center;}
  .ck-support .cks-ico svg{width:21px;height:21px;fill:none;stroke:var(--card);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;}
  .ck-support .cks-txt{flex:1;min-width:0;}
  .ck-support .cks-h{font-weight:800;font-size:var(--fs-sm);color:var(--ink);margin-bottom:2px;}
  .ck-support .cks-b{font-size:var(--fs-xs);color:var(--ink);opacity:.82;line-height:1.45;}
  .ck-support .cks-btn{flex:none;border:none;cursor:pointer;font-family:inherit;font-weight:800;
    font-size:var(--fs-sm);color:var(--card);background:var(--bad);border-radius:10px;padding:10px 16px;white-space:nowrap;
    transition:background .14s,transform .06s;}
  /* Dunklere Fassung von --bad, ebenfalls gerechnet statt erfunden. */
  .ck-support .cks-btn:hover{background:#C93A32;
    background:color-mix(in srgb, var(--bad) 85%, var(--ink));}
  .ck-support .cks-btn:active{transform:scale(.97);}
  @media(max-width:560px){
    .ck-support{flex-wrap:wrap;}
    .ck-support .cks-btn{width:100%;}
  }
  /* ===== LERNHILFE (Schüler-Chat) ===== */
  .lh-card{display:flex;flex-direction:column;height:calc(var(--vh100) - 150px);min-height:440px;max-height:760px;padding:0;overflow:hidden;max-width:560px;margin:0 auto;width:100%;}
  /* Vollbild-Modus (mobil & Schüler): Karte füllt den sichtbaren Bereich,
     dvh reagiert auf die eingeblendete Tastatur -> Eingabe bleibt sichtbar. */
  body.lh-fullscreen #screen-lernhilfe{position:fixed;left:0;right:0;top:0;z-index:7000;padding:0;margin:0;max-width:none;background:var(--bg,#F4F6FB);display:flex;height:var(--lh-vh,100dvh);}
  body.lh-fullscreen #screen-lernhilfe .lh-card{height:var(--lh-vh,100dvh);max-height:none;min-height:0;width:100%;border-radius:0;border:none;flex:1;}
  body.lh-fullscreen .topbar,body.lh-fullscreen #main-nav,body.lh-fullscreen #feedback-fab{display:none !important;}
  .lh-head{display:flex;align-items:center;gap:11px;padding:14px 16px;background:var(--card);}
  body.lh-fullscreen .lh-head{padding-top:calc(14px + env(safe-area-inset-top));}
  .lh-bot-ava{flex:none;width:42px;height:42px;border-radius:13px;background:var(--brand);color:#fff;display:flex;align-items:center;justify-content:center;}
  .lh-bot-ava svg{width:24px;height:24px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;}
  .lh-bot-name{font-weight:800;font-size:16px;color:var(--ink);}
  .lh-bot-sub{font-size:12px;color:var(--muted);}
  .lh-hist-btn{flex:none;width:38px;height:38px;border-radius:11px;border:1.5px solid var(--line);background:var(--card);color:var(--muted);display:flex;align-items:center;justify-content:center;cursor:pointer;transition:border-color .12s,color .12s;}
  .lh-hist-btn:hover{border-color:var(--brand);color:var(--brand);}
  .lh-hist-btn svg{width:19px;height:19px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;}
  .lh-messages{flex:1;overflow-y:auto;padding:20px 16px 8px;display:flex;flex-direction:column;gap:16px;}
  body.lh-fullscreen .lh-messages{max-width:620px;width:100%;margin:0 auto;padding-left:16px;padding-right:16px;}
  body.lh-fullscreen .lh-inputbar{max-width:620px;width:100%;margin:0 auto;}
  .lh-msg{max-width:82%;padding:10px 14px;border-radius:18px;font-size:14px;line-height:1.55;white-space:pre-wrap;word-wrap:break-word;}
  /* Bot: balonsuz, düz metin (wie ChatGPT/Claude) – kein Hintergrund, kein Rahmen. */
  .lh-msg.bot{align-self:flex-start;max-width:100%;width:100%;background:transparent;color:var(--ink);border:none;padding:2px 2px 6px;border-radius:0;font-size:var(--fs-md);}
  .lh-char-label{font-size:11px;font-weight:800;color:var(--brand);margin-bottom:5px;opacity:.9;}
  /* Schüler: weiche Sprechblase mit gleichmäßig runden Ecken. */
  .lh-msg.me{align-self:flex-end;background:var(--brand);color:#fff;border-radius:20px;}
  .lh-msg.typing{align-self:flex-start;max-width:100%;background:transparent;color:var(--muted);font-style:italic;border:none;padding:2px;}
  /* DIE VERWEISKARTE ZUR THEMENSEITE (v2.470.0, die Themenbrücke).
     Sie steht bewusst NEBEN dem Gespräch und nicht darin: keine Sprechblase,
     kein Charakter-Name, ein ruhiger Kasten in der Markenfarbe. Das Kind soll
     sie als Angebot erkennen, nicht als weitere Äußerung des Lernbots.
     Farben ausschliesslich aus dem Wörterbuch (design-tokens.css) - deshalb
     trägt sie im dunklen Modus von selbst die richtigen Werte. */
  /* Selbst gewählte Übungen im Arbeitsplatz (v2.472.0): dieselbe Kachel wie
     eine Aufgabe, nur mit einem × zum Wegnehmen. Absichtlich KEINE eigene
     Farbwelt – der Unterschied steht in der Überschrift und im Etikett
     „Selbst gewählt“, nicht in einer zweiten Gestaltung. */
  .sl-uebung{position:relative;display:flex;}
  .sl-uebung > .sl-task{flex:1;}
  /* Masse aus dem Woerterbuch: der Arbeitsplatz des Kindes laesst keine
     festen Ecken und Schriftgroessen zu (qa/unit/test_schuelerarbeitsplatz_design.py). */
  .sl-uebung-weg{position:absolute;top:var(--s-2);right:var(--s-2);width:26px;height:26px;border:1.5px solid var(--line);background:var(--card);color:var(--muted);border-radius:var(--r-card);font-size:var(--fs-md);line-height:1;cursor:pointer;display:flex;align-items:center;justify-content:center;}
  .sl-uebung-weg:hover{border-color:var(--bad);color:var(--bad);}
  .lh-link{align-self:flex-start;max-width:100%;width:100%;background:var(--brand-soft);border:1.5px solid var(--brand);border-radius:16px;padding:12px 14px;display:flex;flex-direction:column;gap:9px;align-items:flex-start;}
  .lh-link-txt{font-size:var(--fs-sm);color:var(--ink);line-height:1.45;}
  .lh-link-btn{display:inline-block;background:var(--brand);color:var(--card);text-decoration:none;font-size:var(--fs-sm);font-weight:700;padding:9px 15px;border-radius:11px;transition:background .12s;}
  .lh-link-btn:hover{background:var(--brand-dk);}
  .lh-inputbar{display:flex;gap:8px;padding:10px 12px calc(10px + env(safe-area-inset-bottom));align-items:flex-end;background:var(--card);}
  .lh-inwrap{flex:1;display:flex;align-items:flex-end;gap:6px;border:1.5px solid var(--line);border-radius:24px;background:var(--card);padding:5px 6px 5px 8px;transition:border-color .12s,box-shadow .12s;box-shadow:0 1px 2px rgba(0,0,0,.04);}
  .lh-inwrap:focus-within{border-color:var(--ink);box-shadow:0 2px 10px rgba(0,0,0,.06);}
  /* font-size:16px verhindert das automatische Zoomen von iOS Safari beim Fokus. */
  .lh-inputbar textarea{flex:1;border:none;outline:none;resize:none;background:transparent;font:inherit;font-size:16px;line-height:1.4;color:var(--ink);padding:7px 0;max-height:120px;min-height:22px;}
  .lh-cam-btn{flex:none;width:38px;height:38px;border:none;border-radius:50%;background:transparent;color:var(--muted);cursor:pointer;display:flex;align-items:center;justify-content:center;transition:color .12s,background .12s;}
  .lh-cam-btn:hover{color:var(--brand);background:var(--brand-soft,#EEF1FB);}
  .lh-cam-btn svg{width:21px;height:21px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;}
  .lh-send-btn{flex:none;width:38px;height:38px;border:none;border-radius:50%;background:var(--ink);color:var(--card);cursor:pointer;display:flex;align-items:center;justify-content:center;transition:transform .08s,opacity .12s;}
  .lh-send-btn:hover{opacity:.85;}
  .lh-send-btn:active{transform:scale(.92);}
  .lh-send-btn:disabled{opacity:.4;cursor:default;}
  .lh-send-btn svg{width:19px;height:19px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;}
  .lh-note{text-align:center;font-size:11px;color:var(--muted);padding:0 14px 8px;}
  /* Quiz-Ergebnis: Hilfe-holen-Karte */
  #report-hilfe-card .rh-ico{width:48px;height:48px;border-radius:14px;background:var(--brand);color:#fff;display:flex;align-items:center;justify-content:center;margin:0 auto 10px;}
  .r-acc-toggle{appearance:none;width:100%;display:flex;align-items:center;justify-content:space-between;gap:10px;background:var(--card,#fff);border:1.5px solid var(--line);border-radius:12px;padding:12px 15px;font:inherit;font-size:var(--fs-md);font-weight:700;color:var(--ink);cursor:pointer;margin:4px 0 0;transition:border-color .12s;}
  .r-acc-toggle:hover{border-color:var(--brand);}
  .r-acc-toggle .r-acc-chev{width:20px;height:20px;flex:none;fill:none;stroke:currentColor;stroke-width:2.2;stroke-linecap:round;stroke-linejoin:round;transition:transform .18s;}
  .r-acc-toggle[aria-expanded="true"] .r-acc-chev{transform:rotate(180deg);}
  #toast-wrap{position:fixed;left:0;right:0;bottom:calc(20px + env(safe-area-inset-bottom));display:flex;flex-direction:column;align-items:center;gap:8px;z-index:99999;pointer-events:none;padding:0 16px;}
  /* RUHIGER, NICHT LAUTER (Wunsch Murat 05.08.2026: „siyah background
     üstünde beyaz yazi … adam gibi minimal bir sekilde yap").
     Ein schwarzer Kasten mit weisser Schrift ist die Optik einer WARNUNG -
     die meisten Meldungen sind aber nur eine Auskunft. Jetzt eine Karte in
     den Farben der App: heller Grund, normale Schrift, feine Linie. Die
     Bedeutungsfarben `ok`/`bad` bleiben unveraendert - dort IST die Farbe
     die Aussage. */
  /* TEXT MITTIG IM KASTEN (Wunsch Murat 05.08.2026). Eine Meldung ist EIN
     Satz, keine Liste - linksbuendig sah sie mit dem Umbruch aus wie ein
     angefangener Absatz. `text-align:center` reicht dafuer nicht allein: der
     Kasten ist ein Flex-Behaelter, deshalb zentriert `justify-content` auch
     die Zeile mitsamt Symbol. */
  .toast{pointer-events:auto;max-width:440px;width:fit-content;background:var(--card);color:var(--ink);font-size:13.5px;font-weight:600;padding:11px 15px;border-radius:12px;border:1px solid var(--line);box-shadow:0 6px 22px rgba(16,24,40,.13);display:flex;align-items:center;justify-content:center;text-align:center;gap:9px;opacity:0;transform:translateY(12px);transition:opacity .22s,transform .22s;}
  .toast.show{opacity:1;transform:translateY(0);}
  /* Hinweise zum gerade Angetippten stehen OBEN (toast(..., oben), v2.802.4). */
  #toast-wrap-oben{position:fixed;left:0;right:0;top:calc(16px + env(safe-area-inset-top));display:flex;flex-direction:column;align-items:center;gap:8px;z-index:99999;pointer-events:none;padding:0 16px;}
  #toast-wrap-oben .toast{transform:translateY(-12px);}
  #toast-wrap-oben .toast.show{transform:translateY(0);}
  /* Jede Meldung laesst sich wegtippen (v2.146.0) – wer gelesen hat, soll
     nicht warten muessen. Der Zeiger sagt das, bevor man es probiert. */
  .toast{cursor:pointer;}
  .toast:hover{transform:translateY(-1px);}
  .toast.ok{background:var(--ok,#15A05A);color:#fff;border-color:transparent;}
  .toast.bad{background:var(--bad);color:#fff;border-color:transparent;}
  .toast svg{width:18px;height:18px;flex:none;fill:none;stroke:currentColor;stroke-width:2.4;stroke-linecap:round;stroke-linejoin:round;}
  /* ===== LERNBERICHT: DER BLAUE BELOHNUNGS-BLOCK (v2.315.0) ==============
     Hier standen `.report-actions` und `.ra-card` in fuenf Spielarten
     (Teilen, PDF, Spiel). Teilen und PDF sind entfallen; uebrig bleiben die
     zwei Dinge, die ein Kind an dieser Stelle wirklich will - spielen, wenn
     es sich das verdient hat, und fragen, wenn es etwas nicht verstanden hat.
     Sie stehen jetzt zusammen in EINEM blauen Block statt verstreut auf der
     Seite (Wunsch Murat 16.08.2026).

     `.ra-card` bleibt als Grundform bestehen: der Kurs-Bildschirm benutzt sie
     ebenfalls. Was weg ist, sind die Spielarten `.ra-share` und `.ra-pdf`. */
  .rp-bel{ background:linear-gradient(150deg, var(--brand), #5B4BE8);
    border-radius:18px; padding:16px 16px 18px; margin:18px 0 14px; text-align:left; }
  .rp-bel-kopf{ color:#fff; font-weight:800; font-size:15px; letter-spacing:-.01em;
    margin:0 0 12px; opacity:.95; }
  .rp-bel-reihe{ display:grid; grid-template-columns:repeat(auto-fit,minmax(140px,1fr)); gap:10px; }
  /* Die Kacheln stehen auf Blau, also weiss statt --card: die Karte darunter
     ist ebenfalls weiss, und `--card` waere im dunklen Design fast der
     Blauton selbst. */
  .rp-bel-kachel{ appearance:none; display:flex; align-items:center; gap:11px;
    width:100%; text-align:left; padding:13px 14px; border:0; border-radius:13px;
    background:rgba(255,255,255,.96); color:var(--ink); font:inherit; cursor:pointer;
    transition:transform .08s, box-shadow .12s; }
  .rp-bel-kachel:hover{ box-shadow:0 6px 18px rgba(10,20,60,.22); }
  .rp-bel-kachel:active{ transform:scale(.98); }
  .rp-bel-kachel svg{ width:22px; height:22px; flex:none; fill:none; stroke:var(--brand);
    stroke-width:2; stroke-linecap:round; stroke-linejoin:round; }
  .rp-bel-kachel b{ display:block; font-size:14px; font-weight:800; line-height:1.2; }
  .rp-bel-kachel small{ display:block; font-size:11.5px; color:var(--muted); margin-top:2px; }
  .rp-bel-kachel.spiel svg{ stroke:var(--ok); }
  /* Kein Spiel verdient: dieselbe Kachel, aber ohne Knopf-Charakter - sie
     sagt, was fehlt, statt zu locken. */
  .rp-bel-kachel.zu{ background:rgba(255,255,255,.22); color:#fff; cursor:default; }
  .rp-bel-kachel.zu svg{ stroke:#fff; }
  .rp-bel-kachel.zu small{ color:rgba(255,255,255,.85); }
  .rp-bel-kachel.zu:hover{ box-shadow:none; }
  .rp-bel-kachel.zu:active{ transform:none; }
  /* ===== DER STERN =======================================================
     Er ERSETZT den Ring (`.ring`, `.ring-track`, `.ring-pct`, `.ring-frac`) -
     Wunsch Murat 16.08.2026: „böyle koca yildiz basta. daha görünümsel yani".
     Er fuellt sich aber von unten mit dem Ergebnis; ein Stern, der bei 20 %
     aussieht wie bei 100 %, waere reine Verzierung. */
  .rp-stern{ width:132px; margin:6px auto 2px; }
  .rp-stern svg{ display:block; width:100%; height:auto; overflow:visible; }
  .rp-stern-spur{ fill:var(--line); }
  .rp-stern-voll{ fill:var(--brand); transition:fill .3s ease; }
  .rp-stern.gut .rp-stern-voll{ fill:var(--ok); }
  .rp-stern.mittel .rp-stern-voll{ fill:var(--brand); }
  .rp-stern.schwach .rp-stern-voll{ fill:var(--amber); }
  #rp-stern-fuell{ transition:y .8s cubic-bezier(.2,.8,.3,1), height .8s cubic-bezier(.2,.8,.3,1); }
  @media (prefers-reduced-motion: reduce){ #rp-stern-fuell{ transition:none; } }
  .rp-zahl{ text-align:center; font-size:34px; font-weight:800; letter-spacing:-.03em;
    color:var(--ink); line-height:1.1; }
  .rp-frac{ text-align:center; font-size:13px; color:var(--muted); margin:2px 0 10px; }
  /* DIE SENDEMELDUNG GANZ UNTEN - klein, grau, am Ende der Karte.
     Sie darf nicht verschwinden (Art. 12/13 DSGVO: das Kind erfaehrt nur
     hier, dass sein Ergebnis bei der Lehrkraft landet), aber sie ist auch
     keine Nachricht, auf die jemand wartet. 10px und nicht kleiner: darunter
     ist sie auf einem Telefon nicht mehr lesbar, und eine Information, die
     niemand entziffern kann, ist keine Information mehr - dann waere das
     Verkleinern nur eine elegantere Art, sie wegzulassen. */
  .rp-fuss{ margin-top:20px; padding-top:12px; border-top:1px solid var(--line);
    font-size:10px; line-height:1.5; color:var(--muted); opacity:.75; text-align:center; }
  /* Beim FEHLER ist es keine Nebensache mehr: dann muss das Kind es lesen. */
  .rp-fuss.err{ font-size:13px; opacity:1; color:var(--bad); font-weight:700; }

  /* DIE FERTIG-LEISTE (v2.330.0) - der Lernbericht bleibt stehen, bis das
     Kind sie benutzt. Sie liegt FEST am unteren Rand und scrollt nicht mit:
     der Bericht ist laenger als ein Telefonschirm, und ein Knopf, den man
     erst suchen muss, ist derselbe Sackgassen-Fehler wie der alte Sprung
     nach 1,4 Sekunden. Der Abstand unten haengt an `-bottom` (CLAUDE.md:
     `-top` meldet in PWA und Huelle verschiedene Werte).
     `body.ha-fertig-an` haelt darunter Platz frei, damit die Leiste nicht
     die letzte Zeile des Berichts verdeckt. */
  .ha-fertig{ position:fixed; left:0; right:0; bottom:0; z-index:60;
    display:flex; align-items:center; justify-content:center; gap:var(--s-4);
    flex-wrap:wrap; text-align:center;
    padding:var(--s-3) var(--s-4) calc(var(--s-3) + env(safe-area-inset-bottom));
    background:var(--card); border-top:1px solid var(--line);
    box-shadow:0 -6px 24px rgba(20,28,50,.10); }
  .ha-fertig .btn{ width:auto; margin:0; padding:var(--s-3) var(--s-7); }
  .ha-fertig-uhr{ font-size:var(--fs-sm); color:var(--muted); }
  body.ha-fertig-an{ padding-bottom:var(--s-9); }
  @media(max-width:640px){
    /* Schmal: der Knopf traegt die Breite, die Uhr steht darunter. */
    .ha-fertig{ gap:var(--s-2); }
    .ha-fertig .btn{ width:100%; }
    .ha-fertig-uhr{ font-size:var(--fs-xs); }
  }
  .r-acc-body{margin-top:12px;}
  .shape-tb{appearance:none;border:1.5px solid var(--line);background:var(--card);color:var(--ink);border-radius:10px;padding:8px 12px;font:inherit;font-size:13.5px;font-weight:600;cursor:pointer;transition:all .12s;}
  .shape-tb:hover{border-color:var(--brand);}
  .shape-tb.on{background:var(--brand);color:#fff;border-color:var(--brand);}
  #shape-fields label{font-size:13px;color:var(--muted);display:block;margin-bottom:3px;}
  #shape-fields input[type=number],#shape-fields input[type=text]{width:100%;padding:9px 11px;border:1.5px solid var(--line);border-radius:9px;font:inherit;background:var(--card);color:var(--text);box-sizing:border-box;}
  #report-hilfe-card .rh-ico svg{width:28px;height:28px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;}
  #report-hilfe-card .rh-head{font-weight:800;font-size:16px;color:var(--ink);margin-bottom:4px;}
  #report-hilfe-card .rh-sub{font-size:13.5px;color:var(--muted);line-height:1.5;margin-bottom:6px;}
  /* ===== LERNHILFE Lehrer-Panel ===== */
  .lhl-wrap{display:grid;grid-template-columns:300px 1fr;gap:14px;margin-top:14px;align-items:start;}
  @media(max-width:680px){ .lhl-wrap{grid-template-columns:1fr;} }
  .lhl-list{display:flex;flex-direction:column;gap:6px;max-height:600px;overflow-y:auto;}
  .lhl-kid{display:flex;align-items:center;gap:10px;text-align:left;border:1.5px solid var(--line);background:var(--card);
    border-radius:12px;padding:10px 12px;cursor:pointer;font-family:inherit;transition:border-color .12s,background .12s;}
  .lhl-kid:hover{border-color:var(--brand);}
  .lhl-kid.active{border-color:var(--brand);background:var(--brand-soft);}
  .lhl-kid-alert{border-color:#E5484D55;background:#FDECEC55;}
  .lhl-kid-alert:hover{border-color:#E5484D;}
  .lhl-alert-dot{margin-left:6px;font-size:12px;}
  .lhl-kid-ava{flex:none;width:36px;height:36px;border-radius:50%;background:var(--brand);color:#fff;font-weight:800;font-size:13px;display:flex;align-items:center;justify-content:center;}
  .lhl-kid-info{min-width:0;}
  .lhl-kid-name{font-weight:700;font-size:14px;color:var(--ink);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
  .lhl-kid-kl{font-weight:600;font-size:11px;color:var(--muted);}
  .lhl-kid-sub{font-size:12px;color:var(--muted);}
  .lhl-detail{border:1.5px solid var(--line);border-radius:14px;padding:16px;min-height:240px;max-height:600px;overflow-y:auto;background:var(--card);}
  .lhl-empty{color:var(--muted);font-size:14px;text-align:center;padding:50px 14px;line-height:1.6;}
  .lhl-profil{border:1.5px solid var(--line);border-radius:12px;padding:14px;margin-bottom:16px;background:linear-gradient(180deg,var(--brand-soft),var(--card));}
  .lhl-profil-empty{color:var(--muted);font-size:13px;text-align:center;background:none;}
  .lhl-profil-h{display:flex;align-items:center;gap:7px;font-weight:800;font-size:14px;color:var(--ink);margin-bottom:10px;}
  .lhl-profil-h svg{width:18px;height:18px;fill:var(--amber,#F5A623);stroke:none;}
  .lhl-notiz{font-size:13.5px;color:var(--ink);background:var(--card);border-radius:9px;padding:10px 12px;margin-bottom:12px;line-height:1.5;border:1px solid var(--line);}
  .lhl-prow{display:flex;gap:10px;align-items:flex-start;padding:5px 0;font-size:13px;}
  .lhl-plabel{flex:0 0 120px;color:var(--muted);font-weight:600;}
  .lhl-chip{display:inline-block;background:var(--brand)14;color:var(--brand);font-size:12px;font-weight:700;padding:2px 9px;border-radius:99px;margin:2px 3px 2px 0;}
  .lhl-muted{color:var(--muted);}
  .lhl-disclaimer{font-size:11px;color:var(--muted);margin-top:10px;font-style:italic;}
  .lhl-convo-h{font-weight:800;font-size:13.5px;color:var(--ink);margin-bottom:8px;}
  .lhl-convo{display:flex;flex-direction:column;gap:8px;}
  .lhl-msg{max-width:85%;padding:9px 13px;border-radius:14px;font-size:13.5px;line-height:1.45;white-space:pre-wrap;word-wrap:break-word;}
  .lhl-msg.bot{align-self:flex-start;background:#EEF1F6;color:var(--ink);border-bottom-left-radius:4px;}
  .lhl-msg.me{align-self:flex-end;background:var(--brand);color:#fff;border-bottom-right-radius:4px;}
  .lhl-msg-char{font-size:10.5px;font-weight:800;color:var(--brand);margin-bottom:2px;opacity:.9;}
  /* Lernbot-Verlauf: Auswahl & Löschen */
  .lhl-listbar{display:flex;align-items:center;gap:6px;padding:2px 2px 8px;border-bottom:1px solid var(--line);margin-bottom:4px;}
  .lhl-tbtn{appearance:none;border:1px solid var(--line);background:var(--card);color:var(--ink);font-family:inherit;
    font-size:12px;font-weight:700;padding:5px 10px;border-radius:8px;cursor:pointer;display:inline-flex;align-items:center;transition:background .12s,border-color .12s,color .12s;}
  .lhl-tbtn:hover{border-color:var(--brand);color:var(--brand);}
  .lhl-tbtn.danger{color:#B42318;border-color:#E5484D55;}
  .lhl-tbtn.danger:hover{background:#FDECEC;border-color:#E5484D;color:#B42318;}
  .lhl-tbtn:disabled{opacity:.45;cursor:not-allowed;border-color:var(--line);color:var(--muted);background:var(--card);}
  .lhl-check{flex:none;width:20px;height:20px;border-radius:6px;border:2px solid var(--line);background:var(--card);
    display:flex;align-items:center;justify-content:center;transition:background .12s,border-color .12s;}
  .lhl-check.on{background:var(--brand);border-color:var(--brand);}
  .lhl-check svg{width:13px;height:13px;}
  .lhl-kid-sel{border-color:var(--brand);background:var(--brand-soft);}
  .lhl-kid-del{flex:none;width:30px;height:30px;border:none;background:transparent;color:var(--muted);border-radius:8px;
    cursor:pointer;display:flex;align-items:center;justify-content:center;opacity:0;transition:opacity .12s,background .12s,color .12s;}
  .lhl-kid:hover .lhl-kid-del{opacity:1;}
  .lhl-kid-del:hover{background:#FDECEC;color:#B42318;}
  .lhl-kid-del svg{width:16px;height:16px;}
  .lhl-convo-head{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:8px;flex-wrap:wrap;}
  .lhl-convo-tools{display:flex;gap:6px;align-items:center;}
  .lhl-msgrow{display:flex;align-items:flex-start;gap:8px;}
  .lhl-msgrow.bot{justify-content:flex-start;}
  .lhl-msgrow.me{justify-content:flex-end;}
  .lhl-msgrow .lhl-msg{align-self:auto;}
  .lhl-msgrow.me .lhl-msg-del{order:-1;}
  .lhl-msgrow.selectable{border-radius:12px;padding:4px;margin:-4px;transition:background .12s;}
  .lhl-msgrow.selectable:hover{background:rgba(127,127,127,.06);}
  .lhl-msgrow.sel{background:var(--brand-soft);}
  .lhl-msg-del{flex:none;align-self:center;width:28px;height:28px;border:none;background:transparent;color:var(--muted);
    border-radius:8px;cursor:pointer;display:flex;align-items:center;justify-content:center;opacity:0;transition:opacity .12s,background .12s,color .12s;}
  .lhl-msgrow:hover .lhl-msg-del{opacity:1;}
  .lhl-msg-del:hover{background:#FDECEC;color:#B42318;}
  .lhl-msg-del svg{width:15px;height:15px;}
  /* Löschkonzept: Countdown + Papierkorb */
  .lhl-retention-note{font-size:11.5px;color:var(--muted);background:var(--paper);border-radius:9px;padding:7px 11px;margin-bottom:10px;line-height:1.45;}

  /* --- Förderempfehlung --- */
  /* Breit wie die Fehlzeitenbriefe (nutzt das ganze Panel). */
  .foerder-card{max-width:none;margin:0 auto;}
  .foerder-head{display:flex;align-items:flex-start;justify-content:space-between;gap:14px;flex-wrap:wrap;margin-bottom:14px;}
  /* Knopfreihe im Kopf der Werkzeug-Seiten (Foerderempfehlung,
     Fehlzeitenbriefe, Blauer Brief). Bis v2.99.7 stand hier achtmal dasselbe
     `style="display:flex;gap:8px;flex-wrap:wrap;"` inline im JavaScript -
     und Inline schlaegt jedes Stylesheet. Damit war die Reihe von aussen
     nicht mehr zu beeinflussen; genau daran scheiterte der Versuch, sie auf
     dem Telefon in EINER Zeile zu halten. Jetzt EINE Klasse, EINE Stelle. */
  .fo-btnreihe{display:flex;gap:8px;flex-wrap:wrap;}
  /* Zwei Beschriftungen je Knopf, eine sichtbar (Muster wie .dtb-lang).
     GRUNDREGEL: der ausgeschriebene Text. Auf dem Telefon tauscht der
     640px-Block gegen die Kurzform - siehe dort. */
  .fo-lang{display:inline;}
  .fo-kurz{display:none;}
  .foerder-listbtn{display:inline-flex;align-items:center;gap:6px;border:1.5px solid var(--line);background:#fff;border-radius:10px;padding:8px 13px;font:inherit;font-size:13px;font-weight:600;color:var(--ink);cursor:pointer;flex:none;}
  .foerder-listbtn:hover{border-color:var(--brand);}
  .foerder-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:10px 14px;margin-bottom:14px;}
  .fo-field{display:flex;flex-direction:column;gap:4px;}
  .fo-lbl{font-size:12px;color:var(--muted);font-weight:600;}
  .fo-in{width:100%;box-sizing:border-box;padding:9px 11px;border:1.5px solid var(--line);border-radius:9px;font:inherit;font-size:14px;background:#fff;color:var(--ink);}
  .fo-in:focus{outline:none;border-color:var(--brand);}
  /* Select soll exakt so hoch sein wie die Text-Inputs (sonst wirkt "Fach" gedrückt). */
  select.fo-in{height:40px;line-height:1.2;-webkit-appearance:none;-moz-appearance:none;appearance:none;
    padding-right:32px;cursor:pointer;
    background-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%23888' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><polyline points='6 9 12 15 18 9'/></svg>");
    background-repeat:no-repeat;background-position:right 10px center;}
  input.fo-in{height:40px;}
  textarea.fo-in{resize:vertical;min-height:44px;}
  /* Kombi-Karte: Kästchen + zugehöriges Feld. Aktiv = hervorgehoben. */
  .fo-pair{display:flex;flex-direction:column;gap:9px;border:1.5px solid var(--line);border-radius:11px;padding:11px 13px;background:var(--card,#fff);transition:border-color .15s,background .15s;}
  .fo-pair.on{border-color:var(--brand);background:var(--brand-soft,#EEF4FF);}
  .fo-pair-head{display:flex;align-items:center;gap:10px;font-size:14px;font-weight:600;color:var(--ink);cursor:pointer;}
  .fo-pair-head input{width:18px;height:18px;flex:none;cursor:pointer;}
  .fo-pair-in:disabled{background:#F1F3F5;color:#AAB0B6;cursor:not-allowed;border-style:dashed;}
  /* Blauer Brief: Fächer als anklickbare Chips (Mehrfachauswahl). Gleiche
     Farbsprache wie .fo-pair, nur kompakt - es sind bis zu 18 Kästchen. */
  .bb-fach{display:inline-flex;align-items:center;gap:6px;border:1.5px solid var(--line);
    border-radius:999px;padding:5px 12px 5px 9px;font-size:13px;cursor:pointer;
    background:var(--card,#fff);user-select:none;transition:border-color .15s,background .15s;}
  .bb-fach.on{border-color:var(--brand);background:var(--brand-soft,#EEF4FF);font-weight:600;}
  .bb-fach input{width:15px;height:15px;flex:none;cursor:pointer;margin:0;}
  .bb-fachwrap{display:flex;flex-wrap:wrap;gap:6px;margin:0 0 10px;}
  .bb-faecher-info{font-size:12.5px;color:var(--ink,#1B2230);margin:0 0 12px;}
  /* Aufklappbarer Abschnitt: eigener Kasten mit Kopfzeile. Das Auf-/Zuklappen
     läuft ohne Neuzeichnen (Übergang auf max-height), damit es weich wirkt
     und der Cursor im Feld bleibt. */
  .bb-box{border:1px solid var(--line);border-radius:12px;background:var(--card,#fff);
    margin:0 0 10px;overflow:hidden;}
  .bb-box-h{display:flex;align-items:center;gap:9px;width:100%;background:var(--paper);
    border:none;border-bottom:1px solid var(--line);padding:10px 13px;font:inherit;
    font-size:13px;font-weight:700;color:var(--ink);cursor:pointer;text-align:left;}
  .bb-box-h>span{flex:none;}
  .bb-box-h>i{flex:1;font-size:12px;font-weight:400;color:var(--muted);font-style:normal;}
  .bb-box-c{flex:none;color:var(--muted);transition:transform .22s ease;}
  .bb-box.zu .bb-box-h{border-bottom-color:transparent;}
  .bb-box.zu .bb-box-c{transform:rotate(-90deg);}
  .bb-box-body{max-height:1600px;opacity:1;overflow:hidden;
    transition:max-height .28s ease, opacity .18s ease;}
  .bb-box.zu .bb-box-body{max-height:0;opacity:0;}
  .bb-box-inner{padding:12px 13px 4px;}
  .bb-box-inner .foerder-grid:last-child{margin-bottom:8px;}
  .bb-hint{font-size:12px;color:var(--muted);line-height:1.5;background:var(--paper);
    border:1px solid var(--line);border-radius:10px;padding:8px 11px;margin:0 0 12px;}
  .bb-lbl-klein{font-weight:400;color:var(--muted);}
  /* Kästchen-Reihe: drei kurze Optionen nebeneinander statt drei leere
     Label-Zeilen im Raster (das riss das Formular unnötig auseinander). */
  .bb-ckrow{display:flex;flex-wrap:wrap;gap:8px 18px;margin:2px 0 12px;}
  .bb-ckrow label{display:inline-flex;align-items:center;gap:8px;font-size:13.5px;cursor:pointer;}
  .bb-ckrow input{width:17px;height:17px;flex:none;cursor:pointer;margin:0;}
  .bb-bem-in{min-height:52px;}
  .bb-actions{display:flex;gap:8px;flex-wrap:wrap;align-items:center;margin-top:14px;
    padding-top:12px;border-top:1px solid var(--line);}
  .bb-seiten{font-size:12px;color:var(--muted);margin-left:auto;}
  .bb-seiten.warn{color:#B0533A;font-weight:600;}
  .bb-status{font-size:12.5px;color:#1D9E75;font-weight:600;}
  /* Schnellerfassung: EINE Klasse, viele Briefe. Bewusst breit und quer -
     die Lehrkraft soll alle Kinder gleichzeitig sehen, nicht acht Formulare
     nacheinander. Kopfzeile und Tabellenkopf bleiben stehen, nur die Zeilen
     scrollen. */
  .bb-blitz{color:var(--amber-ink);}
  .bbs-ov{position:fixed;inset:0;background:rgba(0,0,0,.45);z-index:9800;
    display:flex;align-items:center;justify-content:center;padding:18px;}
  .bbs-box{background:var(--card,#fff);border-radius:16px;width:min(1500px,97vw);
    max-height:92vh;display:flex;flex-direction:column;overflow:hidden;
    box-shadow:0 24px 60px rgba(0,0,0,.35);}
  .bbs-kopf{display:flex;align-items:center;gap:12px;padding:12px 16px;
    border-bottom:1px solid var(--line);background:var(--paper);flex-wrap:wrap;}
  .bbs-titel{display:flex;flex-direction:column;gap:2px;margin-right:auto;}
  .bbs-titel b{font-size:15px;}
  .bbs-titel span{font-size:12px;color:var(--muted);}
  .bbs-klasse{max-width:230px;}
  .bbs-akt{display:flex;align-items:center;gap:8px;}
  .bbs-x{border:none;background:transparent;font-size:18px;line-height:1;cursor:pointer;
    color:var(--muted);padding:6px 8px;}
  .bbs-scroll{overflow:auto;flex:1;}
  .bbs-tab{width:100%;border-collapse:separate;border-spacing:0;font-size:13px;}
  .bbs-tab th{position:sticky;top:0;z-index:2;background:var(--card,#fff);text-align:left;
    font-size:11.5px;font-weight:700;color:var(--muted);padding:8px 6px;
    border-bottom:1px solid var(--line);white-space:nowrap;}
  .bbs-tab td{padding:4px 6px;border-bottom:1px solid var(--line);vertical-align:middle;}
  .bbs-tab tr:hover td{background:rgba(127,127,127,.04);}
  .bbs-nr{color:var(--muted);font-size:11.5px;width:26px;text-align:right;}
  .bbs-in{width:100%;box-sizing:border-box;padding:6px 8px;border:1.5px solid var(--line);
    border-radius:8px;font:inherit;font-size:13px;background:#fff;color:var(--ink);height:34px;}
  .bbs-in:focus{outline:none;border-color:var(--brand);}
  /* "Übernommen" als FARBE statt Text: grüner Balken links an der Zeile.
     Der frühere Zusatztext machte die Tabelle unruhig und breiter. */
  .vws-zeile>td:first-child{border-left:3px solid transparent;}
  .vws-zeile.ok>td:first-child{border-left-color:#1D9E75;}
  .vws-zeile.ok .bbs-nr{color:#1D9E75;font-weight:700;}
  .vws-zeile.laedt>td:first-child{border-left-color:var(--line);}
  .vws-zeile.laedt .bbs-in{opacity:.6;}
  /* Roter Rand = in dieser Zeile fehlt eine Pflichtangabe. Lieber vorher
     sehen als 20 Dokumente mit Leerlinien drucken. */
  .vws-zeile.luecke>td:first-child{border-left-color:#E24B4A;}
  .vws-zeile.luecke .bbs-nr{color:#C0392B;font-weight:700;}
  .vws-luecke{font-size:12px;font-weight:700;color:#C0392B;
    background:#FCEBEB;border-radius:999px;padding:4px 11px;}
  /* Förderung: Fach + Bausteine direkt im Schnellerfassungs-Fenster.
     Eigene Klassen (vws-fo-*), damit sie nicht mit dem Formular dahinter
     kollidieren - dort heißen sie fo-*. */
  .vws-fo{border-bottom:1px solid var(--line);background:var(--paper);padding:10px 16px;}
  .vws-fo-zeile{display:flex;align-items:center;gap:12px;flex-wrap:wrap;}
  .vws-fo-lbl{font-size:12px;font-weight:700;color:var(--muted);}
  .vws-fo-ck{display:inline-flex;align-items:center;gap:8px;font-size:13px;cursor:pointer;}
  .vws-fo-ck input{width:17px;height:17px;cursor:pointer;margin:0;}
  .vws-fo-info{font-size:11.5px;color:var(--muted);}
  .vws-fo-hint{font-size:12.5px;color:var(--muted);margin-top:8px;line-height:1.5;}
  .vws-fo-baust{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-top:10px;}
  @media(max-width:820px){ .vws-fo-baust{grid-template-columns:1fr;} }
  .vws-fo-acc{border:1px solid var(--line);border-radius:10px;background:var(--card,#fff);overflow:hidden;}
  .vws-fo-acc-h{display:flex;align-items:center;gap:9px;width:100%;border:none;background:transparent;
    padding:8px 11px;font:inherit;font-size:13px;cursor:pointer;text-align:left;color:var(--ink);}
  .vws-fo-acc-h b{flex:none;font-weight:700;}
  .vws-fo-acc-h span{flex:1;color:var(--muted);font-size:12px;}
  .vws-fo-acc-h svg{flex:none;color:var(--muted);transition:transform .2s;}
  .vws-fo-acc.offen .vws-fo-acc-h svg{transform:rotate(180deg);}
  .vws-fo-acc-b{display:none;max-height:190px;overflow:auto;padding:0 8px 8px;}
  .vws-fo-acc.offen .vws-fo-acc-b{display:block;}
  .vws-fo-item{display:flex;align-items:flex-start;gap:8px;padding:5px 6px;border-radius:8px;
    font-size:12.5px;line-height:1.45;cursor:pointer;}
  .vws-fo-item:hover{background:rgba(127,127,127,.06);}
  .vws-fo-item.on{background:var(--brand-soft,#EEF4FF);}
  .vws-fo-item input{width:16px;height:16px;flex:none;margin-top:2px;cursor:pointer;}
  /* "Geht hier nicht"-Fenster statt alert (ein alert sieht aus wie ein Fehler) */
  .vws-sperre{display:flex;flex-direction:column;align-items:center;gap:12px;
    padding:26px 24px 28px;text-align:center;color:var(--ink);}
  .vws-sperre svg{color:var(--muted);}
  .vws-sperre p{margin:0;font-size:14px;line-height:1.6;max-width:460px;color:var(--muted);}
  .bbs-check{display:flex;align-items:center;justify-content:center;height:34px;cursor:pointer;}
  .bbs-check input{width:18px;height:18px;cursor:pointer;margin:0;}
  .bbs-tag{display:inline-block;margin-left:6px;font-size:10.5px;color:#1D9E75;}
  .bbs-weg button{border:none;background:transparent;color:var(--muted);cursor:pointer;padding:4px;}
  .bbs-weg button:hover{color:#C0392B;}
  .bbs-fuss{display:flex;align-items:center;gap:14px;padding:10px 16px;
    border-top:1px solid var(--line);background:var(--paper);flex-wrap:wrap;}
  .bbs-plus{display:inline-flex;align-items:center;gap:6px;border:1.5px dashed var(--line);
    background:#fff;border-radius:9px;padding:7px 13px;font:inherit;font-size:13px;cursor:pointer;}
  .bbs-plus:hover{border-color:var(--brand);color:var(--brand);}
  .bbs-hinweis{font-size:11.5px;color:var(--muted);line-height:1.45;flex:1;min-width:220px;}
  /* Aufbewahrungs-Warnung in "Meine Aufgaben": auffällig, aber nicht
     alarmistisch. Rot erst, wenn es wirklich knapp wird (<= 7 Tage). */
  .vw-ablauf{display:flex;align-items:center;gap:12px;margin:0 0 14px;padding:12px 14px;
    border:1.5px solid #EF9F27;background:#FAEEDA;border-radius:12px;color:#633806;}
  .vw-ablauf.rot{border-color:#E24B4A;background:#FCEBEB;color:#791F1F;}
  .vw-ablauf-ico{flex:none;display:flex;}
  .vw-ablauf-txt{display:flex;flex-direction:column;gap:2px;flex:1;min-width:0;font-size:13.5px;}
  .vw-ablauf-txt span{font-size:12px;opacity:.85;}
  .vw-ablauf-btn{flex:none;border:1.5px solid currentColor;background:#fff;color:inherit;
    border-radius:9px;padding:8px 14px;font:inherit;font-size:13px;font-weight:700;cursor:pointer;}
  .vw-ablauf-btn:hover{background:rgba(0,0,0,.04);}
  .vw-abl-modal{max-width:760px;width:100%;}
  .vw-abl-body{padding:16px;overflow-y:auto;max-height:70vh;}
  .vw-abl-info{font-size:13px;color:var(--muted);line-height:1.6;margin:0 0 14px;}
  .vw-abl-grp{border:1px solid var(--line);border-radius:12px;margin-bottom:12px;overflow:hidden;}
  .vw-abl-grp-h{display:flex;align-items:center;gap:10px;padding:10px 13px;background:var(--paper);
    border-bottom:1px solid var(--line);font-size:13.5px;}
  .vw-abl-grp-h span{color:var(--muted);font-size:12.5px;margin-right:auto;}
  .vw-abl-list{list-style:none;margin:0;padding:4px 13px 10px;}
  .vw-abl-list li{display:flex;align-items:center;gap:10px;padding:5px 0;font-size:13px;
    border-bottom:1px solid var(--line);}
  .vw-abl-list li:last-child{border-bottom:none;}
  .vw-abl-list li>span{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
  .vw-abl-list li>span i{color:var(--muted);font-style:normal;font-size:12px;}
  .vw-abl-list li>b{flex:none;color:var(--muted);font-weight:600;font-size:12.5px;}
  .vw-abl-list li>b.rot{color:#C0392B;}
  .vw-abl-mehr{color:var(--muted);font-size:12px;}
  .vw-sig-modal{max-width:520px;width:100%;}
  .vw-sig-erkl{font-size:13px;line-height:1.6;background:var(--paper);border:1px solid var(--line);
    border-radius:10px;padding:11px 13px;margin:0 0 12px;}
  .vw-sig-ck{display:flex;align-items:flex-start;gap:9px;font-size:13.5px;cursor:pointer;line-height:1.5;}
  .vw-sig-ck input{width:18px;height:18px;flex:none;margin-top:1px;cursor:pointer;}
  .vw-sig-konto{font-size:12px;color:var(--muted);margin-top:6px;line-height:1.5;}
  .vw-sig-fehler{display:none;margin-top:10px;font-size:13px;color:#C0392B;line-height:1.5;}
  /* Kind-Auswahl (Klasse -> Kind), gemeinsam für Förderung/Fehlzeiten/Brief */
  .vw-pick{margin-bottom:10px;}
  .vw-link{background:none;border:none;padding:0;font:inherit;font-size:12.5px;
    color:var(--brand);cursor:pointer;text-decoration:underline;}
  .fo-hint{font-size:13px;color:var(--muted);background:var(--paper);border-radius:9px;padding:12px 14px;margin:6px 0;}
  .fo-baust-hint{font-size:12.5px;color:var(--muted);margin:6px 0 10px;line-height:1.45;}
  .fo-block{margin:12px 0;}
  .fo-block-h{display:block;font-size:12px;color:var(--muted);font-weight:600;margin-bottom:5px;}
  .fo-acc{border:1px solid var(--line);border-radius:11px;margin-bottom:10px;overflow:hidden;}
  .fo-acc-head{display:flex;align-items:center;gap:10px;width:100%;background:var(--paper);border:none;padding:11px 14px;font:inherit;font-size:14px;font-weight:700;color:var(--ink);cursor:pointer;text-align:left;}
  .fo-acc-head>span:first-child{flex:1;}
  .fo-acc-count{font-size:12px;font-weight:600;color:var(--brand);background:#fff;border-radius:999px;padding:2px 9px;flex:none;}
  .fo-acc-caret{transition:transform .18s;flex:none;color:var(--muted);}
  .fo-acc.collapsed .fo-acc-caret{transform:rotate(-90deg);}
  .fo-acc-body{display:none;max-height:340px;overflow-y:auto;padding:6px;}
  .fo-acc-body.open{display:block;}
  .fo-grp{font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;color:var(--muted);padding:8px 8px 3px;}
  .fo-item{display:flex;gap:9px;align-items:flex-start;padding:7px 9px;border-radius:8px;cursor:pointer;font-size:13px;line-height:1.4;}
  .fo-item:hover{background:var(--paper);}
  .fo-item.on{background:color-mix(in srgb, var(--brand) 12%, #fff);}
  .fo-item input{margin-top:2px;flex:none;width:16px;height:16px;accent-color:var(--brand);}
  .fo-actions{margin-top:16px;}
  .fo-pagewarn{font-size:13px;border-radius:10px;padding:10px 13px;margin-bottom:10px;line-height:1.45;}
  .fo-pagewarn.warn{background:#FFF7ED;border:1.5px solid #E09629;color:#9A4B12;}
  .fo-btnrow{display:flex;gap:10px;flex-wrap:wrap;}
  .fo-haftung{margin-top:12px;font-size:11.5px;line-height:1.5;color:var(--muted);border-top:1px solid var(--line);padding-top:10px;}
  .fo-btn{display:inline-flex;align-items:center;gap:7px;background:var(--brand);color:#fff;border:none;border-radius:10px;padding:11px 18px;font:inherit;font-size:14px;font-weight:700;cursor:pointer;}
  .fo-btn:hover{filter:brightness(1.06);}
  .fo-btn.ghost{background:#fff;color:var(--ink);border:1.5px solid var(--line);}
  .fo-btn.ghost:hover{border-color:var(--brand);filter:none;}
  .fo-modal-ov{position:fixed;inset:0;background:rgba(15,20,35,.5);z-index:9400;display:flex;align-items:center;justify-content:center;padding:18px;}
  .fo-modal{background:#fff;border-radius:14px;max-width:520px;width:100%;max-height:80vh;overflow:hidden;display:flex;flex-direction:column;box-shadow:0 20px 60px rgba(0,0,0,.3);}
  .fo-modal-h{display:flex;align-items:center;justify-content:space-between;padding:14px 16px;border-bottom:1px solid var(--line);font-size:15px;}
  .fo-modal-x{border:none;background:transparent;font-size:18px;cursor:pointer;color:var(--muted);}
  .fo-list{overflow-y:auto;padding:8px;}
  .fo-list-row{display:flex;align-items:center;gap:8px;padding:4px;border-radius:9px;}
  .fo-list-row:hover{background:var(--paper);}
  .fo-list-main{flex:1;cursor:pointer;padding:8px 10px;}
  .fo-list-name{font-weight:600;font-size:14px;color:var(--ink);}
  .fo-list-meta{font-size:12px;color:var(--muted);margin-top:2px;}
  .fo-kind{display:inline-block;font-size:10px;font-weight:700;padding:1px 7px;border-radius:999px;vertical-align:middle;margin-left:4px;letter-spacing:.02em;}
  .fo-kind.einzel{background:#EEF2FF;color:#4457C7;}
  .fo-kind.sammel{background:#E8F5E9;color:#2E7D32;}
  .fo-segwrap{display:inline-flex;background:var(--paper);border:1.5px solid var(--line);border-radius:11px;padding:3px;gap:3px;}
  .fo-seg{display:flex;flex-direction:column;align-items:flex-start;gap:0;border:none;background:transparent;cursor:pointer;padding:6px 14px;border-radius:8px;color:var(--muted);transition:all .12s;}
  .fo-seg .fo-seg-t{font-size:14px;font-weight:600;line-height:1.15;}
  .fo-seg .fo-seg-s{font-size:11px;opacity:.75;line-height:1.1;}
  .fo-seg.on{background:var(--brand);color:#fff;box-shadow:0 1px 4px rgba(0,0,0,.12);}
  .fo-seg.on .fo-seg-s{opacity:.9;}
  .fo-darst{display:flex;align-items:center;flex-wrap:wrap;gap:10px;margin:4px 0 14px;padding:10px 12px;background:var(--paper);border-radius:10px;}
  .fo-darst-lbl{font-size:13px;font-weight:600;color:var(--muted);margin-right:2px;}
  .fo-radio{display:inline-flex;align-items:center;gap:6px;font-size:13.5px;padding:5px 11px;border:1.5px solid var(--line);border-radius:9px;background:#fff;cursor:pointer;}
  .fo-radio.on{border-color:var(--brand);background:#EEF2FF;color:var(--brand);font-weight:600;}
  .fo-radio input{accent-color:var(--brand);}
  .fo-fachcard{border:1.5px solid var(--line);border-radius:12px;margin-bottom:12px;overflow:hidden;}
  .fo-fachcard-h{display:flex;align-items:center;gap:10px;justify-content:space-between;padding:10px 12px;background:var(--paper);flex-wrap:wrap;}
  .fo-fachcard-t{font-size:15px;font-weight:700;color:var(--ink);display:flex;align-items:center;gap:8px;flex-wrap:wrap;}
  .fo-fachcard-cnt{font-size:11px;font-weight:600;color:var(--brand);background:#EEF2FF;padding:2px 8px;border-radius:999px;}
  .fo-fachcard-tools{display:flex;align-items:center;gap:8px;}
  .fo-fachsel{height:36px;min-width:160px;font-size:13px;padding:6px 28px 6px 10px;}
  .fo-fachdel{border:none;background:transparent;color:var(--muted);cursor:pointer;padding:7px;border-radius:8px;flex:none;}
  .fo-fachdel:hover{background:#FDECEC;color:#E5484D;}
  .fo-fachcard-b{padding:12px;}
  .fo-addfach{display:inline-flex;align-items:center;gap:6px;border:1.5px dashed var(--line);background:#fff;color:var(--brand);font-weight:600;font-size:14px;padding:10px 16px;border-radius:10px;cursor:pointer;width:100%;justify-content:center;margin-bottom:4px;}
  .fo-addfach:hover{border-color:var(--brand);background:#EEF2FF;}
  .fo-list-del{border:none;background:transparent;color:var(--muted);cursor:pointer;padding:8px;border-radius:8px;flex:none;}
  .fo-list-del:hover{background:#FDECEC;color:#E5484D;}
  .fo-dsgvo{display:flex;gap:8px;align-items:flex-start;margin:12px 14px 4px;padding:10px 12px;background:#FFF8E6;border:1px solid #F3E0A8;border-radius:10px;font-size:12px;line-height:1.45;color:#6B5A1E;}
  .fo-tage{flex:none;font-size:11px;font-weight:600;padding:3px 8px;border-radius:999px;background:var(--paper);color:var(--muted);white-space:nowrap;}
  .fo-tage.warn{background:#FFF3E0;color:#B4690E;}
  .fo-tage.crit{background:#FDECEC;color:#E5484D;}
  @media(max-width:640px){ .foerder-grid{grid-template-columns:1fr;} }
  /* Fehlzeiten nutzt die volle Breite (Hintergrundseite ist breit, das Panel
     war bisher schmal). Nur auf diesem Screen aufweiten. */
  body[data-screen="fehlzeiten"] .wrap,
  body[data-screen="blauerbrief"] .wrap{max-width:1240px;}
  body[data-screen="fehlzeiten"] .foerder-card,
  body[data-screen="blauerbrief"] .foerder-card{max-width:none;}
  /* Ab 1000px 3 Spalten (statt 2) -> die Kopf-Felder brauchen weniger Höhe,
     wirkt aufgeräumter. Gilt für Förderempfehlung, Fehlzeiten, Blauen Brief. */
  @media(min-width:1000px){
    body[data-screen="fehlzeiten"] .foerder-grid,
    body[data-screen="blauerbrief"] .foerder-grid,
    body[data-screen="foerder"] .foerder-grid{grid-template-columns:repeat(3,1fr);}
    /* Die Kind-Auswahl bleibt zweispaltig: Klasse und Kind gehören optisch
       zusammen, ein drittes leeres Feld daneben verwirrt. */
    body[data-screen="fehlzeiten"] .foerder-grid.vw-pick,
    body[data-screen="blauerbrief"] .foerder-grid.vw-pick,
    body[data-screen="foerder"] .foerder-grid.vw-pick{grid-template-columns:repeat(2,1fr);max-width:660px;}
  }
  /* Blauer Brief: enger als die Fehlzeiten (dort sind es lange Formulare mit
     wenigen Feldern, hier viele kurze) - weniger Luft zwischen den Zeilen. */
  body[data-screen="blauerbrief"] .foerder-grid{gap:8px 12px;margin-bottom:8px;}

  /* ===== DAS BRIEFFORMULAR WAR ZU HOCH (v2.381.0) =======================
     Befund Murat 23.08.2026: „asagi dogru cok kayiyor, yani ekleme ekleme cok
     fazla. yazi tiplerini kücültüp asagidaki tiklenebilir boxlari yan yana
     alsak olur mu?"

     Ja - und der Grund fuer die Hoehe waren die drei Ankreuz-Bloecke: jeder
     nahm mit `grid-column:1 / -1` die volle Breite, obwohl in ihm nur ein
     einzelnes Eingabefeld steht. Drei volle Zeilen fuer drei kurze Angaben,
     waehrend daneben die halbe Seite leer blieb. Jetzt stehen sie
     nebeneinander (`.fo-pair.fo-pair-schmal`), und die Schrift ist eine Stufe
     kleiner. Zusammen spart das etwa ein Drittel der Hoehe - man sieht das
     Formular ohne zu rollen, und genau darum ging es.

     AB 900 PX. Darunter bleibt es untereinander: drei Felder nebeneinander
     auf einem Telefon waeren je 100 Pixel breit, und in eines davon soll man
     „12.05., 13.05., 15.05." tippen. */
  body[data-screen="fehlzeiten"] .foerder-grid{gap:9px 12px;margin-bottom:10px;}
  body[data-screen="fehlzeiten"] .fo-lbl{font-size:12px;}
  body[data-screen="fehlzeiten"] .fo-in{font-size:13.5px;padding:9px 11px;}
  body[data-screen="fehlzeiten"] .fo-pair{padding:9px 11px;gap:7px;}
  body[data-screen="fehlzeiten"] .fo-pair-head{font-size:13px;}
  body[data-screen="fehlzeiten"] .fo-pair-head input{width:16px;height:16px;}
  @media(min-width:900px){
    body[data-screen="fehlzeiten"] .fo-pair.fo-pair-schmal{grid-column:auto;}
  }
  .lhl-msgwrap{display:flex;flex-direction:column;gap:3px;min-width:0;max-width:85%;}
  .lhl-msgrow.me .lhl-msgwrap{align-items:flex-end;}
  .lhl-msgwrap .lhl-msg{max-width:100%;}
  .lhl-cd{font-size:10px;font-weight:700;color:var(--muted);background:rgba(127,127,127,.10);border-radius:6px;padding:1px 7px;align-self:flex-start;white-space:nowrap;}
  .lhl-msgrow.me .lhl-cd{align-self:flex-end;}
  .lhl-cd.soon{color:#B42318;background:#FDECEC;}
  .lhl-trash{margin-top:16px;border:1px solid var(--line);border-radius:13px;overflow:hidden;}
  .lhl-trash-head{display:flex;align-items:center;gap:8px;padding:11px 13px;cursor:pointer;color:var(--ink);background:var(--paper);font-size:13.5px;user-select:none;}
  .lhl-trash-head:hover{background:rgba(127,127,127,.06);}
  .lhl-trash-badge{background:var(--muted);color:#fff;border-radius:20px;font-size:11px;font-weight:800;padding:1px 8px;min-width:20px;text-align:center;}
  .lhl-trash-tools{display:flex;align-items:center;gap:6px;flex-wrap:wrap;padding:10px 13px 4px;}
  .lhl-trash-list{padding:8px 13px 13px;}
  /* Cockpit Assistent-Hinweis */
  .cockpit-assist-btn{appearance:none;width:100%;text-align:left;display:flex;align-items:center;gap:11px;
    border:1.5px solid var(--ok);background:var(--ok-soft);border-radius:var(--r-card);padding:13px 15px;
    cursor:pointer;font-family:inherit;margin-bottom:18px;transition:transform .08s,box-shadow .12s;}
  .cockpit-assist-btn:hover{box-shadow:0 4px 14px rgba(21,160,90,.14);}
  .cockpit-assist-btn:active{transform:scale(.99);}
  .cockpit-assist-btn .ca2-ico{flex:none;width:34px;height:34px;border-radius:10px;background:var(--ok);display:flex;align-items:center;justify-content:center;}
  .cockpit-assist-btn .ca2-ico svg{width:19px;height:19px;fill:none;stroke:var(--card);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;}
  .cockpit-assist-btn .ca2-txt{flex:1;font-size:var(--fs-sm);color:var(--ink);}
  .cockpit-assist-btn .ca2-arr{flex:none;color:var(--ok);font-size:20px;font-weight:700;}
  /* Cockpit Mosaik (Podium links groß, rechts gestapelt) */
  /* Mobil: gestapelt (eine Spalte). Tablet: 2 Spalten. */
  .cockpit-mosaic{display:grid;grid-template-columns:1fr;gap:12px;margin-bottom:18px;align-items:stretch;}
  @media(min-width:620px) and (max-width:899.98px){ .cockpit-mosaic{grid-template-columns:1fr 1fr;} }
  /* Desktop: die drei Karten (Beste Schüler · Klassen-Check · Aktivität)
     gleich breit UND gleich hoch nebeneinander. */
  @media(min-width:900px){
    .cockpit-mosaic{align-items:stretch;}
    .cockpit-mosaic.ck-cols-3{grid-template-columns:repeat(3,minmax(0,1fr));}
    .cockpit-mosaic.ck-cols-2{grid-template-columns:repeat(2,minmax(0,1fr));}
    .cockpit-mosaic.ck-cols-1{grid-template-columns:minmax(0,420px);}
    .cm-podium .podium{max-width:100%;margin:0 auto;}
  }
  /* Desktop: Nutzungszeilen nebeneinander statt drei kurzer Zeilen in der Leere. */
  @media(min-width:900px){
    .cockpit-status .cs-usage{flex-direction:row;flex-wrap:wrap;align-items:center;column-gap:26px;row-gap:6px;}
    .cockpit-status .cs-usage-h{flex:0 0 100%;margin-bottom:2px;}
    .cockpit-status .cs-row{flex:1;min-width:170px;}
  }
  .cm-col{display:flex;flex-direction:column;gap:12px;min-width:0;}
  .cm-card{border:1.5px solid var(--line);border-radius:16px;padding:11px 14px;background:var(--card);min-width:0;overflow:hidden;}
  /* Sterne- & Fächer-Ranking: Karte als Spalte, Liste füllt die Resthöhe. */
  .cm-activity,.cm-fachrank{display:flex;flex-direction:column;}
  .ck-slist{flex:1;min-height:0;max-height:300px;overflow-y:auto;scrollbar-width:thin;scrollbar-color:var(--line) transparent;}
  .ck-slist::-webkit-scrollbar{width:5px;}
  .ck-slist::-webkit-scrollbar-thumb{background:var(--line);border-radius:99px;}
  .ck-slist::-webkit-scrollbar-track{background:transparent;}
  .cm-h{font-weight:800;font-size:var(--fs-md);color:var(--ink);margin-bottom:8px;}
  .pod-classbar{display:flex;gap:6px;overflow-x:auto;padding-bottom:8px;margin-bottom:4px;-webkit-overflow-scrolling:touch;scrollbar-width:none;}
  .pod-classbar::-webkit-scrollbar{display:none;}
  .pod-chip{flex:none;padding:5px 12px;border-radius:999px;border:1.5px solid var(--line);background:var(--card);color:var(--muted);font:inherit;font-size:12.5px;font-weight:700;cursor:pointer;white-space:nowrap;transition:all .12s;}
  .pod-chip:hover{border-color:var(--brand);}
  .pod-chip.on{background:var(--brand);border-color:var(--brand);color:#fff;}
  .cm-podium{background:linear-gradient(180deg,var(--amber-soft),var(--card));}
  /* Podium */
  .podium{display:flex;align-items:flex-end;justify-content:center;gap:6px;padding-top:8px;max-width:300px;margin:0 auto;}
  .pod-col{display:flex;flex-direction:column;align-items:center;gap:5px;width:auto;min-width:0;flex:1;max-width:96px;}
  .pod-ava{position:relative;display:flex;align-items:center;justify-content:center;flex:none;}
  /* Emoji wächst/schrumpft mit der Kartenbreite (responsive) – groß & präsent. */
  .pod-emoji{font-size:clamp(38px,6vw,50px);line-height:1;filter:drop-shadow(0 2px 3px rgba(0,0,0,.12));}
  .pod-rank{position:absolute;bottom:-2px;left:-9px;width:24px;height:24px;border-radius:50%;color:#fff;font-size:13px;font-weight:800;display:flex;align-items:center;justify-content:center;border:2px solid var(--card);}
  .pod-name{font-size:14px;font-weight:750;color:var(--ink);text-align:center;max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
  .pod-pct{font-size:14px;font-weight:800;color:var(--muted);}
  .pod-stand{width:100%;max-width:84px;border:1.5px solid;border-radius:11px 11px 0 0;display:flex;align-items:flex-start;justify-content:center;padding-top:8px;font-weight:900;font-size:18px;}
  /* Zeit gespart */
  .cm-saved{background:linear-gradient(180deg,var(--brand-soft),var(--card));}
  .saved-row{display:flex;align-items:center;gap:12px;}
  .saved-ico{flex:none;width:40px;height:40px;border-radius:12px;background:var(--brand);display:flex;align-items:center;justify-content:center;}
  .saved-ico svg{width:22px;height:22px;fill:#fff;stroke:none;}
  .saved-big{font-size:24px;font-weight:900;color:var(--ink);line-height:1.1;}
  .saved-big span{font-size:14px;font-weight:700;color:var(--muted);}
  .saved-sub{font-size:12px;color:var(--muted);margin-top:2px;}
  /* ===== Cockpit v2: Heute-Briefing, To-do, Klassen-Gesundheit, Skeleton ===== */
  .ck-hello{font-family:"Inter",-apple-system,BlinkMacSystemFont,"Segoe UI",system-ui,sans-serif;
    font-weight:800;letter-spacing:-.02em;color:var(--ink);line-height:1.15;
    font-size:clamp(22px,3.4vw,30px);margin:0 0 16px;}
  .ck-brief{position:relative;display:flex;align-items:flex-start;gap:12px;padding:14px 16px;margin-bottom:14px;
    border:1.5px solid var(--line);border-radius:16px;background:linear-gradient(135deg,var(--brand-soft),var(--card));}
  .ck-brief .ckb-ico{flex:none;width:40px;height:40px;border-radius:12px;background:var(--brand);
    display:flex;align-items:center;justify-content:center;}
  .ck-brief .ckb-ico svg{width:21px;height:21px;fill:none;stroke:var(--card);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;}
  .ck-brief .ckb-date{font-size:11px;font-weight:800;letter-spacing:.04em;text-transform:uppercase;color:var(--muted);margin-bottom:2px;}
  .ck-brief .ckb-line{font-size:14px;font-weight:600;color:var(--ink);line-height:1.45;}
  .ck-brief .ckb-line b{font-weight:800;}
  .ck-brief .ckb-saved{font-size:var(--fs-xs);color:var(--muted);margin-top:3px;}
  /* (Das Zahnrad .ckb-gear gibt es seit v2.289.0 nirgends mehr - weder hier
     noch in der Cockpit-Kopfzeile. Begruendung am Code, renderCockpit.) */
  /* Linkes Panel: neue Abgaben – groß & klar, mit Klassen-Aufschlüsselung */
  .ck-abg{flex:1;min-width:0;display:flex;flex-direction:column;justify-content:flex-start;gap:7px;
    border:1.5px solid var(--line);border-radius:var(--r-card);padding:13px 16px;
    background:var(--card);}
  /* "Heute zu erledigen": klickbare Aufgaben-Zeilen mit Deep-Links */
  .ckt-list{display:flex;flex-direction:column;gap:4px;}
  .ckt-item{display:flex;align-items:center;gap:10px;padding:8px 9px;border-radius:11px;cursor:pointer;
    transition:background .12s;}
  .ckt-item:hover{background:var(--paper);}
  .ckt-item .ckt-ico{flex:none;width:30px;height:30px;border-radius:9px;display:flex;align-items:center;justify-content:center;}
  .ckt-item .ckt-ico svg{width:16px;height:16px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;}
  .ckt-item .ckt-tx{flex:1;min-width:0;display:flex;flex-direction:column;gap:1px;}
  .ckt-item .ckt-tx b{font-size:var(--fs-sm);font-weight:800;color:var(--ink);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
  .ckt-item .ckt-tx small{font-size:var(--fs-xs);color:var(--muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
  .ckt-item .ckt-arr{flex:none;width:15px;height:15px;fill:none;stroke:var(--muted);stroke-width:2.2;
    stroke-linecap:round;stroke-linejoin:round;opacity:.6;}
  .ckt-empty{font-size:var(--fs-sm);color:var(--muted);padding:8px 2px;}
  .ck-abg.click{cursor:pointer;transition:border-color .12s,box-shadow .12s;}
  .ck-abg.click:hover{border-color:var(--ok);box-shadow:0 3px 12px rgba(21,160,90,.12);}
  .ck-abg .cka-h{font-size:var(--fs-xs);font-weight:800;letter-spacing:.04em;text-transform:uppercase;color:var(--muted);
    display:flex;align-items:center;gap:6px;}
  .ck-abg .cka-big{font-size:30px;font-weight:900;line-height:1;}
  .ck-abg .cka-big small{font-size:var(--fs-sm);font-weight:800;color:var(--muted);margin-left:7px;}
  .ck-abg .cka-chips{display:flex;flex-wrap:wrap;gap:6px;margin-top:1px;}
  .ck-abg .cka-chip{font-size:var(--fs-xs);font-weight:700;color:var(--ink);background:rgba(21,160,90,.13);
    border-radius:99px;padding:2px 9px;white-space:nowrap;}
  .ck-abg .cka-empty{font-size:var(--fs-xs);font-weight:600;color:var(--muted);}
  /* Mittleres Panel: 3 Nutzungszeilen (mit Text) untereinander */
  .ck-usage{flex:1;min-width:0;display:flex;flex-direction:column;justify-content:center;gap:9px;
    border:1.5px solid var(--line);border-radius:var(--r-card);padding:12px 14px;background:var(--card);}
  .ck-urow{display:flex;align-items:center;gap:9px;}
  .ck-urow .cku-ico{flex:none;width:26px;height:26px;border-radius:var(--r-control);display:flex;align-items:center;justify-content:center;}
  .ck-urow .cku-ico svg{width:15px;height:15px;fill:none;stroke:var(--card);stroke-width:2.2;stroke-linecap:round;stroke-linejoin:round;}
  .ck-urow .cku-lbl{flex:1;font-size:var(--fs-sm);font-weight:700;color:var(--ink);min-width:0;
    overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
  .ck-urow .cku-val{flex:none;font-size:14px;font-weight:900;color:var(--ink);}
  /* Welche Art traegt welches Plaettchen (v2.290.0). Die Toene stehen im
     Woerterbuch (--kont-*, design-tokens.css); hier steht nur die Zuordnung.
     Faellt eine Art heraus oder kommt eine neue dazu, greift der Standard
     darunter - eine unbekannte Art ist dann grau, aber nie unsichtbar. */
  .ck-urow .cku-ico{background:var(--muted);}
  .ck-urow .cku-ico[data-art="quiz"]{background:var(--kont-quiz);}
  .ck-urow .cku-ico[data-art="bild"]{background:var(--kont-bild);}
  .ck-urow .cku-ico[data-art="plan"]{background:var(--kont-plan);}
  .ck-urow .cku-ico[data-art="ab_ki"]{background:var(--kont-abki);}
  .ck-urow .cku-ico[data-art="kurs"]{background:var(--kont-kurs);}
  .ck-urow .cku-ico[data-art="chat"]{background:var(--kont-chat);}
  .ck-urow .cku-val .inf{color:var(--ok);}
  /* Knapper Rest (v2.290.0): die Zahl wird rot, sobald hoechstens 20 %
     bzw. zwei Einheiten uebrig sind. Farbe traegt hier BEDEUTUNG, nicht
     Schmuck (DESIGN_SYSTEM.md §3): es ist der letzte Moment, in dem sich
     eine Stunde noch umplanen laesst. --bad-ink statt --bad, weil die
     Zahl Text auf heller Flaeche ist und 4.5:1 braucht. Ohne Rueckfallwert:
     den Token gibt es immer, ein zweiter Ort fuer dieselbe Farbe waere nur eine
     zweite Stelle zum Vergessen (qa/unit/test_cockpit_design.py). */
  .ck-urow .cku-val .knapp{color:var(--bad-ink);}
  .ck-urow-link{display:block;margin:-2px 0 3px 31px;font-size:var(--fs-xs);font-weight:700;
    color:var(--brand);text-decoration:none;}
  .ck-urow-link:hover{text-decoration:underline;}
  .st-ki-box{margin:0 0 12px;padding:10px;border:1px solid rgba(22,133,106,.25);
    border-radius:12px;background:rgba(22,133,106,.055);}
  .st-ki-box>b{display:block;margin-bottom:8px;font-size:13px;color:#126b57;}
  .st-niveau{position:absolute;right:5px;top:3px;font-size:8pt;font-weight:800;color:#6b7280;}
  .st-selbst{display:flex;gap:9px;flex-wrap:wrap;margin-top:2mm;padding-top:1.5mm;
    border-top:.2mm solid #d1d5db;font-size:7pt;color:#4b5563;}
  .st-mathefeld{width:100%;height:100%;box-sizing:border-box;overflow:hidden;
    color:#222;font-size:9pt;display:flex;align-items:center;justify-content:center;}
  .st-mauer>div{display:flex;justify-content:center;margin-top:-.2mm;}
  .st-mauer span{display:flex;width:12mm;height:9mm;align-items:center;justify-content:center;
    border:.3mm solid #555;margin-left:-.3mm;background:#fff;clip-path:polygon(10% 0,90% 0,100% 100%,0 100%);}
  .st-rechenpaeckchen{display:block;padding:1mm 3mm;columns:2;column-gap:7mm;}
  .st-reihe{height:7mm;white-space:nowrap;break-inside:avoid;}
  .st-reihe b{display:inline-block;min-width:13mm;border-bottom:.25mm solid #555;}
  .st-vergleich{display:grid;grid-template-columns:1fr 12mm 1fr;align-items:center;text-align:center;
    width:100%;height:8mm;}
  .st-vergleich b{height:6mm;border:.25mm solid #777;border-radius:1mm;}
  .st-zstrahl{position:relative;width:92%;height:20mm;}
  .st-zstrahl>i{position:absolute;left:0;right:0;top:8mm;border-top:.4mm solid #333;}
  .st-zstrahl>span{position:absolute;top:6mm;transform:translateX(-50%);text-align:center;}
  .st-zstrahl>span b{display:block;height:5mm;border-left:.3mm solid #333;}
  .st-zstrahl>span em{font-style:normal;font-size:7pt;display:block;min-width:8mm;}
  .st-uhr{position:relative;width:34mm;height:34mm;border:.5mm solid #333;border-radius:50%;}
  .st-uhr:after{content:"";position:absolute;width:1.5mm;height:1.5mm;background:#333;border-radius:50%;left:50%;top:50%;transform:translate(-50%,-50%);}
  .st-uhr i,.st-uhr b{position:absolute;left:50%;bottom:50%;width:.5mm;background:#333;transform-origin:50% 100%;}
  .st-uhr i{height:10mm}.st-uhr b{height:14mm}.st-uhr span{position:absolute;left:50%;top:1mm;transform:translateX(-50%);font-size:7pt;}
  .st-digital{font:700 14pt ui-monospace,monospace;margin-left:4mm;border:.3mm solid #555;padding:2mm 3mm;}
  .st-zfeld{display:grid;border-left:.25mm solid #777;border-top:.25mm solid #777;width:100%;height:100%;}
  .st-zfeld.n10{grid-template-columns:repeat(5,1fr)}.st-zfeld.n20{grid-template-columns:repeat(10,1fr)}.st-zfeld.n100{grid-template-columns:repeat(10,1fr)}
  .st-zfeld span{display:flex;align-items:center;justify-content:center;border-right:.25mm solid #777;border-bottom:.25mm solid #777;font-size:7pt;}
  .st-zfeld span.mark{background:#ddd;font-weight:800;}
  .st-haus{width:42mm;text-align:center}.st-haus .dach{padding:3mm;border:.4mm solid #444;clip-path:polygon(50% 0,100% 100%,0 100%);background:#eee;font-weight:800;}
  .st-haus>div:not(.dach){display:grid;grid-template-columns:1fr 1fr;border:.3mm solid #555;border-top:0;}
  .st-haus>div:not(.dach) span{padding:1mm}.st-haus>div:not(.dach) span+span{border-left:.3mm solid #555;}
  .st-rechentabelle table{border-collapse:collapse;width:100%;height:100%;table-layout:fixed;}
  .st-rechentabelle th,.st-rechentabelle td{border:.3mm solid #555;text-align:center;padding:1mm;}
  .st-rechentabelle th{background:#eee;}
  .st-p4{width:100%;height:100%;box-sizing:border-box;overflow:hidden;display:flex;
    align-items:center;justify-content:center;color:#222;font-size:9pt;}
  .st-pfeile{display:grid;grid-template-columns:18mm 1fr 18mm;align-items:center;gap:2mm;width:100%;}
  .st-pfeile span,.st-pfeile b{border:.3mm solid #555;min-height:7mm;display:flex;align-items:center;justify-content:center;}
  .st-pfeile i{text-align:center;font-style:normal;font-size:8pt;}
  .st-kette{display:flex;align-items:center;width:95%;}.st-kette span{border:.3mm solid #555;padding:2mm 3mm;border-radius:50%;}.st-kette i{flex:1;border-top:.3mm solid #555;text-align:center;font-style:normal;}
  .st-rad{position:relative;width:42mm;height:42mm;border:.4mm solid #555;border-radius:50%;}.st-rad>b{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);font-size:15pt}.st-rad>span{position:absolute;left:50%;top:50%;transform-origin:0 0}.st-rad em,.st-rad i{display:block;font-style:normal;transform:rotate(var(--r,0deg));min-width:10mm;text-align:center}.st-rad i{border-bottom:.3mm solid #555;min-height:5mm}
  .st-dreieck{position:relative;width:48mm;height:40mm;clip-path:polygon(50% 0,100% 100%,0 100%);border-bottom:.5mm solid #555}.st-dreieck span{position:absolute;border:.3mm solid #555;border-radius:50%;padding:2mm;background:#fff}.st-dreieck span:nth-child(1){left:50%;top:1mm}.st-dreieck span:nth-child(2){left:2mm;bottom:1mm}.st-dreieck span:nth-child(3){right:2mm;bottom:1mm}.st-dreieck b{position:absolute;left:12mm;right:12mm;bottom:2mm;text-align:center}
  .st-magisch{display:grid;width:100%;height:100%;}.st-magisch.n3{grid-template-columns:repeat(3,1fr)}.st-magisch.n4{grid-template-columns:repeat(4,1fr)}.st-magisch.n5{grid-template-columns:repeat(5,1fr)}.st-magisch span{display:flex;align-items:center;justify-content:center;border:.25mm solid #555;}
  .st-schrift{display:grid;grid-template-columns:1fr;min-width:32mm;text-align:right;margin:2mm;border-bottom:.4mm solid #333}.st-schrift b{min-height:7mm}.st-schrift small{grid-column:1;font-size:7pt;color:#555}
  .st-geobrett{display:grid;width:90%;height:90%;}.st-geobrett.n3{grid-template-columns:repeat(3,1fr)}.st-geobrett.n4{grid-template-columns:repeat(4,1fr)}.st-geobrett.n5{grid-template-columns:repeat(5,1fr)}.st-geobrett.n6{grid-template-columns:repeat(6,1fr)}.st-geobrett i{width:2mm;height:2mm;border-radius:50%;background:#555;align-self:center;justify-self:center}.st-geobrett i.an{width:3mm;height:3mm;background:#16856a}
  .st-malifant{display:grid;grid-template-columns:1fr 1fr;gap:2mm 7mm;width:90%;}.st-malifant span{white-space:nowrap}.st-malifant b{display:inline-block;min-width:9mm;border-bottom:.25mm solid #555}
  .st-diagramm{display:flex;align-items:flex-end;gap:3mm;width:92%;height:90%;border-left:.3mm solid #444;border-bottom:.3mm solid #444}.st-diagramm>div{height:100%;flex:1;display:flex;flex-direction:column-reverse;align-items:center}.st-diagramm i{width:70%;background:#9ca3af}.st-diagramm span,.st-diagramm b{font-size:7pt}.st-diagramm.kreis{border:0;border-radius:50%;background:conic-gradient(#777 0 35%,#aaa 35% 70%,#ddd 70%)}
  .st-wortliste{display:grid;grid-template-columns:1fr 1fr;gap:3mm 8mm;width:95%;}.st-wortliste span{border-bottom:.25mm solid #777;padding:1mm}.st-silben{display:flex;flex-wrap:wrap;gap:5mm}.st-silben>span{display:flex;align-items:flex-end}.st-silben i{font-style:normal;padding:1mm}.st-silben i.f1{background:#ddd}.st-silben b{font-size:6pt;margin-left:1mm;color:#555}.st-such{display:grid;width:100%;height:85%;}.st-such span{display:flex;align-items:center;justify-content:center;border:.15mm solid #bbb;font-size:7pt}.st-wortsuche{flex-direction:column}.st-wortsuche small{font-size:6pt;margin-top:1mm}.st-fachtext{display:block;padding:2mm 3mm}.st-fachtext h3{margin:0 0 2mm}.st-fachtext p{line-height:1.45;margin:0 0 3mm}.st-fachtext b{display:block;border-top:.25mm solid #aaa;padding-top:2mm}
  .ck-todo{margin-bottom:16px;}
  .ck-todo .ckt-h{font-weight:800;font-size:var(--fs-sm);color:var(--ink);margin:0 0 8px;}
  .ckt-row{display:flex;gap:9px;flex-wrap:wrap;}
  .ck-todo-item{appearance:none;flex:1 1 260px;min-width:0;display:flex;align-items:center;gap:11px;text-align:left;
    padding:11px 13px;border:1.5px solid var(--line);border-radius:13px;background:var(--card);
    font:inherit;cursor:pointer;transition:border-color .12s,box-shadow .12s;}
  .ck-todo-item:hover{border-color:var(--brand);box-shadow:0 3px 12px rgba(46,91,255,.08);}
  .ck-todo-item:active{transform:scale(.995);}
  .ck-todo-item .cti-ico{flex:none;width:32px;height:32px;border-radius:9px;display:flex;align-items:center;justify-content:center;}
  .ck-todo-item .cti-ico svg{width:17px;height:17px;fill:none;stroke:var(--card);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;}
  .ck-todo-item .cti-txt{flex:1;font-size:var(--fs-sm);color:var(--ink);min-width:0;}
  .ck-todo-item .cti-txt b{font-weight:800;}
  .ck-todo-item .cti-arr{flex:none;color:var(--muted);font-size:18px;font-weight:700;}
  /* Klassen-Gesundheit */
  .cm-health{background:linear-gradient(180deg,var(--ok-soft),var(--card));}
  .ckh-row{display:flex;align-items:center;gap:8px;padding:8px 0;border-bottom:1px solid rgba(127,127,127,.1);}
  .ckh-row:last-child{border-bottom:none;}
  .ckh-name{flex:1;font-size:var(--fs-sm);font-weight:700;color:var(--ink);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0;}
  .ckh-avg{flex:none;font-size:var(--fs-sm);font-weight:800;color:var(--ink);}
  .ckh-delta{flex:none;font-size:var(--fs-xs);font-weight:800;padding:1px 7px;border-radius:99px;}
  .ckh-delta.up{color:var(--ok);background:var(--ok-soft);}
  .ckh-delta.down{color:var(--bad);background:rgba(224,70,62,.1);}
  .ckh-delta.flat{color:var(--muted);background:rgba(127,127,127,.1);}
  .ckh-risk{display:flex;align-items:center;gap:7px;margin-top:9px;padding:8px 10px;border-radius:10px;
    background:rgba(224,70,62,.07);border:1px solid rgba(224,70,62,.2);cursor:pointer;}
  .ckh-risk svg{flex:none;width:15px;height:15px;fill:none;stroke:var(--bad);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;}
  .ckh-risk span{font-size:var(--fs-xs);color:var(--ink);line-height:1.35;}
  .ckh-risk b{color:var(--bad);font-weight:800;}
  /* ===== Cockpit v3 "Kopfzeile": Header + KPI-Reihe + Hauptspalte/Rail ===== */
  /* ===== KOPFBEREICH v2.290.0 ============================================
     Die breite Kopfzeile (.ck2-head) ueber die ganze Seite gibt es nicht mehr.
     Ihre drei Teile sind zu Kacheln geworden und sitzen dort, wo sie
     hingehoeren: das Briefing als erste, breitere Kachel der linken Reihe -
     die Uhr als erste Karte der rechten Rail. Dadurch beginnen beide Spalten
     auf derselben Hoehe, und die Rail liest sich als EIN Bereich unter dem
     Profil (Wunsch Murat 15.08.2026).
     Die Briefing-Kachel ist eine .ck2-kpi wie die anderen - sie bekommt nur
     mehr Breite (siehe .ck2-kpis) und links keinen Icon-Kreis, weil sie
     einen SATZ traegt und keine Zahl. */
  /* Uhr-Kachel der Rail: Datum klein, Uhrzeit gross, Datenstand darunter. */
  /* Alles MITTIG (v2.291.0): die Kachel ist eine Uhr, kein Formular. Die
     Zeile "Stand: hh:mm" ist entfallen - siehe Begruendung am Code. */
  /* OHNE RAHMEN (Anweisung Murat 23.08.2026: „saat var ya onun cercevesini
     sil cercevesiz olsun orasi"). Sie ist die einzige Kachel, die keine
     Liste und keine Zahlreihe traegt, sondern EINE grosse Zahl - ein Kasten
     darum macht daraus ein Formularfeld. Ohne Rahmen liest sie sich als
     Ueberschrift der Zeile. Flaeche und Rand kommen deshalb weg, die
     Innenabstaende bleiben: sie halten die Uhr auf derselben Grundlinie wie
     die Kennzahlen daneben. */
  /* Doppelte Klasse mit Absicht: `.ck2-card` traegt Flaeche und Rand und
     steht WEITER UNTEN in dieser Datei - bei gleicher Spezifitaet gewaenne
     die spaetere Regel. `.ck2-card.ck2-uhr` gewinnt unabhaengig von der
     Reihenfolge. (Dieselbe Falle wie bei den Einstellungen, §4c 2.253.0.) */
  .ck2-card.ck2-uhr{background:transparent;border:none;box-shadow:none;
    justify-content:center;}
  /* KOMPAKT, DAMIT DIE ERSTE ZEILE NICHT AUFBLAEHT (v2.395.0): Die Uhr gibt
     die Hoehe der ganzen ersten Zeile vor - die Kennzahlen-Kacheln daneben
     wachsen mit. Bei den alten Massen wurde die Reihe 126 px hoch, und fuenf
     Kacheln mit einer zweistelligen Zahl darin sahen leer aus. Gemessen im
     Browser: mit diesen Werten sind es 92 px, und beides wirkt gefuellt.
     Wer die Uhr wieder groesser macht, blaeht die Kennzahlen mit auf. */
  .ck2-card.ck2-uhr{padding:6px 12px 8px;gap:1px;}
  .ck2-card.ck2-uhr .ck-uhr-zeit{font-size:29px;}
  .ck2-card.ck2-uhr .ck-uhr-timer{padding:6px 12px;font-size:12px;margin-top:4px;}
  .ck2-uhr{padding:14px 15px 12px;display:flex;flex-direction:column;gap:3px;
    align-items:center;text-align:center;cursor:pointer;}
  .ck2-uhr .ckb-date{font-size:10.5px;font-weight:800;letter-spacing:.05em;text-transform:uppercase;color:var(--muted);}
  .ck2-uhr .ck-uhr-zeit{font-size:34px;font-weight:800;letter-spacing:-.02em;color:var(--ink);
    line-height:1.05;font-variant-numeric:tabular-nums;}
  /* Der Doppelpunkt blinkt im Sekundentakt (Wunsch Murat 16.08.2026) - das
     ist es, was eine Uhr von einer Zahl unterscheidet: man sieht, dass sie
     LAEUFT. Bewusst nur `opacity`, kein `display`/`visibility`: die Breite
     bleibt stehen, sonst zappelten die Minuten bei jedem Blinken um zwei
     Pixel nach links. `steps(1)` gibt das harte Ein/Aus einer Digitaluhr,
     ein weicher Verlauf saehe nach Fehler aus. */
  .ck2-uhr .ck-uhr-pp{animation:ck-uhr-blink 1s steps(1) infinite;}
  @keyframes ck-uhr-blink{0%,50%{opacity:1;}50.01%,100%{opacity:.15;}}
  /* Wer Bewegung abbestellt hat, bekommt einen ruhigen Doppelpunkt - die
     Uhrzeit selbst bleibt vollstaendig lesbar. */
  @media (prefers-reduced-motion: reduce){
    .ck2-uhr .ck-uhr-pp{animation:none;}
  }
  /* DER EINSTIEG WAR NICHT ZU SEHEN (Befund Murat 16.08.2026): eine graue
     Schrift auf einer hellen Kachel mit weicher Kante liest sich als
     Beschriftung, nicht als Knopf - und wer den Timer nicht findet, hat ihn
     nicht. Jetzt traegt er die Markenfarbe und ist damit das einzige farbige
     Element der Rail: der Blick faellt genau dorthin. Der Rest der Kachel
     bleibt unveraendert die Uhr. */
  .ck2-uhr .ck-uhr-timer{
    margin-top:8px; appearance:none; border:none; cursor:pointer;
    display:inline-flex; align-items:center; gap:7px;
    background:var(--brand); color:var(--on-brand);
    font:inherit; font-size:12.5px; font-weight:800; padding:8px 15px;
    border-radius:var(--r-pill);
    /* KEIN SCHEIN MEHR UNTER DEM KNOPF (v2.414.0). Befund Murat 24.08.2026:
       „su stopuhr altinda yansima kesiliyor o yansimayi kaldir bence."
       Der Schein war ein 14px weicher Schatten in der Markenfarbe - und die
       Karte darueber hat `overflow:hidden`. Am Telefon endet er deshalb an
       der Kartenkante mit einer geraden Linie: es sieht aus wie ein
       Zeichenfehler, nicht wie Erhebung. Ein Knopf in voller Markenfarbe
       braucht ihn ohnehin nicht, um als Knopf gelesen zu werden. */
    transition:background .16s, transform .16s;
  }
  .ck2-uhr .ck-uhr-timer svg{width:15px;height:15px;fill:none;stroke:currentColor;
    stroke-width:2.55;stroke-linecap:round;stroke-linejoin:round;}
  .ck2-uhr .ck-uhr-timer:hover{background:var(--brand-dk);transform:translateY(-1px);}
  .ck2-uhr .ck-uhr-timer:active{transform:scale(.97);}
  /* Der eigene Zeitstempel (.ck2-stamp) ist mit v2.291.0 entfallen - neben
     einer laufenden Uhr war eine zweite, stehende Uhrzeit mehr Frage als
     Antwort. Nachladen von Hand: die Uhr-Kachel selbst (Begruendung am Code,
     cockpitRefreshNow). Waehrend des Abrufs blinkt sie kurz. */
  .ck2-uhr.busy{ opacity:.65; }
  @keyframes ck2pulse{0%,100%{opacity:1;}50%{opacity:.3;}}
  /* KPI-Kacheln: kleinere Mindestbreite (118 statt 148), damit alle vier auf
     Tablet-Hochkant in EINER Reihe bleiben statt 3+1 mit einsamem Umbruch. */
  /* Fuenf Kacheln in einer Reihe: die erste (Briefing) traegt einen Satz und
     bekommt deshalb rund die anderthalbfache Breite, die vier Kennzahlen
     teilen sich den Rest zu gleichen Teilen. Reicht der Platz nicht, faellt
     die Reihe auf das alte auto-fit zurueck (Regel im schmalen Block). */
  /* FUENF GLEICHE FELDER (v2.291.0). Vorher trug die erste Spalte eine
     breitere "Briefing"-Kachel - die aber unsichtbar war, weil renderKpis()
     das Raster komplett ueberschreibt. Uebrig blieb eine LEERE 1.5fr-Spalte,
     die den vier sichtbaren Kacheln die Breite nahm; daher standen dort
     "Ungelesene Nachri…" und "Laufende Hausauf…". Jetzt sind es fuenf echte,
     gleich breite Kacheln - die Reihe fuellt die Spalte und ist unten buendig
     mit den Karten darunter. */
  /* KEIN margin-bottom mehr: der Abstand ist der `gap` des Rasters. Ein
     zusaetzlicher Rand haette die erste Zeile gegen die Uhr daneben
     verschoben - genau die Unruhe, um die es ging. */
  .ck2-kpis{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));
    gap:10px;align-items:stretch;}
  /* DIE KACHEL IST DIE FLÄCHE (v2.409.0). Vorher: weisser Kasten, 1.5px-Rand,
     Icon-Plättchen mit 10%-Füllung, Zahl, Beschriftung – fünf davon
     nebeneinander ergaben eine graue Reihe, in der keine Zahl heraussticht,
     also liest man keine. Jetzt trägt jede Kachel den Ton ihrer Bedeutung
     (siehe .ck-ton-*), die Zahl steht gross darin und das Bild liegt
     angeschnitten in der Ecke.
     ALLES MITTIG IN DER HÖHE (Anweisung Murat 24.08.2026): die Zeilenhöhe
     gibt die Uhr daneben vor, der Inhalt ist kürzer – ohne
     `justify-content:center` klebte er oben und darunter stand Luft. */
  .ck2-kpi{position:relative;overflow:hidden;display:flex;flex-direction:column;
    justify-content:center;gap:1px;min-width:0;border:none;border-radius:14px;
    padding:11px 14px;background:var(--kachel-flaeche);color:var(--kachel-schrift);
    transition:transform .15s,filter .15s;}
  /* Anfassbar ist nur, was auch etwas öffnet – renderKpis setzt data-klick.
     Ohne diese Trennung fühlt sich eine Kachel wie ein Knopf an, der nichts
     tut, und das ist schlimmer als eine Kachel, die stillsteht. */
  .ck2-kpi[data-klick]{cursor:pointer;}
  .ck2-kpi[data-klick]:hover{transform:translateY(-2px);filter:brightness(.97);}
  .ck2-kpi[data-klick]:hover .k-ico{opacity:1;filter:none;z-index:2;
    transform:rotate(-6deg) translate(-4px,-4px) scale(1.18);}
  .ck2-kpi[data-klick]:active{transform:scale(.985);}
  .ck2-kpi .k-ico{right:-3px;bottom:-6px;width:48px;}
  .ck2-kpi .k-v{display:block;font-size:var(--fs-xl);font-weight:800;line-height:1.05;
    font-variant-numeric:tabular-nums;letter-spacing:-.02em;color:inherit;
    position:relative;z-index:1;}
  .ck2-kpi .k-v .inf{color:var(--ok,#15A05A);}
  /* ZWEI ZEILEN STATT DREI PUENKTCHEN (v2.395.0): Die Beschriftung war auf
     eine Zeile gezwungen, also stand auf 1280 px „Ungelesene Nachricht…" und
     „Laufende Hausaufgabe…" - abgeschnitten in der obersten Reihe der Seite.
     Seit die Zeile ihre Hoehe von der Uhr bekommt, ist der Platz da; sie darf
     ihn benutzen. Zwei Zeilen sind das Maximum (`line-clamp`), damit die
     Kachelhoehe nicht von der Wortlaenge abhaengt. */
  .ck2-kpi .k-l{display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;
    line-clamp:2;font-size:11px;font-weight:700;color:inherit;opacity:.85;margin-top:2px;
    line-height:1.25;overflow:hidden;position:relative;z-index:1;max-width:80%;}
  /* Schmale Screens (Handy/kleines Tablet): die 5 KPI-Kacheln bleiben als
     KOMPAKTE Reihe stehen (Überblick!), statt zu grossen 2x2-Klötzen zu werden.
     Kompaktstil: Icon oben, Zahl, Mini-Label – alles zentriert. */
  /* DIE LANGE BESCHRIFTUNG IST DER STANDARD - und diese Regel muss VOR dem
     schmalen Block stehen (Befund 24.08.2026, im Browser nachgemessen).
     Sie stand bis v2.408.2 DANACH, und weil beide Regeln dieselbe
     Spezifitaet haben, gewann die spaetere: `.k-kurz{display:none}` galt
     dann AUCH auf 375px. Ergebnis auf dem Telefon: die Kennzahl-Kacheln
     hatten GAR KEINE Beschriftung mehr - nur ein Icon und eine Zahl, und
     niemand konnte wissen, wofuer die 7 steht. Der Test in
     qa/unit/test_mobil_konfiguration.py prueft, dass es BEIDE Regeln gibt,
     nicht ihre Reihenfolge - deshalb ist es lautlos passiert.
     Dieselbe Falle wie bei der Mobil-Reihenfolge des Rasters
     (qa/unit/test_cockpit_raster.py). */
  .ck2-kpi .k-kurz{ display:none; }
  @media (max-width:640px){
    /* FUENF gleiche Spalten (v2.291.0). Zwischendurch waren es vier: die alte
       Kontingent-Kachel war weg (sie wiederholte die Karte daneben), die
       fuenfte Spalte gehoerte einer Briefing-Kachel, die renderKpis ohnehin
       ueberschrieb - also blieb sie LEER und nahm den anderen die Breite.
       Jetzt ist die fuenfte Kachel echt (Materialien diesen Monat) und alle
       sind gleich gross. */
    .ck2-kpis{ grid-template-columns:repeat(5,1fr); gap:6px; }
    .ck2-kpi{ flex-direction:column; align-items:center; justify-content:center;
      text-align:center; gap:2px; padding:8px 4px; }
    /* Wie beim Schnellzugriff: auf dieser Breite steht das Bild OBEN und
       nicht in der Ecke - dort läge es auf der Zahl. Grundregel .ck-bild
       stellt es absolut, hier kommt es zurück in den Fluss. */
    .ck2-kpi .k-ico{ position:static; width:25px; transform:none; order:-1; }
    .ck2-kpi .k-v{ font-size:16px; }
    .ck2-kpi .k-l{ font-size:9.5px; white-space:normal; line-height:1.15; max-width:100%;
      /* Sicherheitsnetz: ein einzelnes langes Wort wird umbrochen statt ueber
         den Rand geschoben. Sichtbar wurde das bei "Hausaufgaben" auf 402px. */
      overflow-wrap:anywhere; hyphens:auto; }
    /* Kurze Beschriftung zeigen, lange verbergen (Gegenstueck: kpi() in
       index-app.js schreibt beide ins HTML). Auf 402px bleiben je Kachel rund
       72px - "Ungelesene Nachrichten" passt da auch in 9px nicht. */
    .ck2-kpi .k-lang{ display:none; }
    .ck2-kpi .k-kurz{ display:inline; }

    /* (Hier stand bis v2.291.0 die Sonderregel fuer die Briefing-Kachel und
       davor die der alten Kopfzeile .ck2-head. Beide gibt es nicht mehr - die
       Reihe ist jetzt ueberall dasselbe Raster aus gleichen Feldern.) */
    .ck2-uhr .ck-uhr-zeit{ font-size:30px; }
  }
  /* ===== DAS COCKPIT-RASTER (v2.395.0) ==================================
     ANWEISUNG MURAT 23.08.2026: „üc satir gibi düsün, tüm o satira düsen
     kutular ayni yükseklikte ama asla göze batacak sekilde degil ... bu vibe
     coding hissiyati gitmeli, profesyonel bir görünüm olmali."

     VORHER WAREN ES ZWEI SAEULEN (.ck2-main | .ck2-rail), jede mit eigenem
     Flex-Fluss. Zwei Saeulen koennen sich nicht auf eine Zeilenhoehe
     einigen: „Meine Aufgaben" endete auf einer anderen Hoehe als
     „Tageskontingente", und alles, was oben dazukam, verschob NUR die eine
     Spalte. Ein Raster mit benannten Feldern entscheidet das an EINER
     Stelle:

         Zeile 1   kpi    | uhr      (Kennzahlen neben der Uhr)
         Zeile 2   todo   | kont     (Meine Aufgaben neben Tageskontingente)
         Zeile 3   check  | rec      (Klassen-Check neben Zuletzt bearbeitet)
         Zeile 4   quick quick       (Schnellzugriff ueber die ganze Breite)

     `align-items:stretch` (Vorgabe) macht die Kacheln EINER Zeile gleich
     hoch - deshalb muessen sie Geschwister sein. `grid-auto-rows:auto` und
     KEINE feste Hoehe: die hoehere Kachel bestimmt die Zeile, die andere
     waechst mit. Das ist der Unterschied zu „aufgeblasen": nichts wird auf
     ein Mass gezwungen, das der Inhalt nicht traegt.

     WER HIER ETWAS EINFUEGT, gibt ihm ein Feld - sonst legt der Browser eine
     neue Zeile an und die Ordnung ist wieder weg. */
  /* Die rechte Spalte ist seit v2.862.0 286 px breit (vorher 272): das
     Fach-Plaettchen in „Zuletzt bearbeitet" nimmt 14 px mehr als der alte
     Punkt, und genau so viel fehlte gemessen einem Titel wie „Terme
     vereinfachen und berechnen" (218 px Text, 210 px Platz). */
  .ck2-grid{display:grid;grid-template-columns:minmax(0,1fr) 286px;gap:14px;
    align-items:stretch;
    grid-template-areas:"kpi uhr" "todo rec" "check rec" "quick quick";}
  .ck2-grid > .ck2-kpis{grid-area:kpi;}
  .ck2-grid > .ck2-uhr{grid-area:uhr;}
  .ck2-grid > .ck2-todo{grid-area:todo;}
  .ck2-grid > .ck2-check{grid-area:check;}
  .ck2-grid > .ck2-rec{grid-area:rec;}
  .ck2-grid > .ck2-quick{grid-area:quick;min-width:0;}
  /* Die Karten fuellen ihr Feld - ohne diese Zeile stehen sie oben in einer
     zu hohen Zeile und die Ordnung ist nur halb sichtbar. */
  .ck2-grid > .ck2-card{height:100%;display:flex;flex-direction:column;}
  /* „Zuletzt bearbeitet" ist eine Liste: sie darf die Zeile nicht in die
     Laenge ziehen, sondern faellt in die Hoehe, die der Klassen-Check
     vorgibt. Laeuft sie ueber, rollt sie IN SICH (der Rest der Seite bleibt
     ruhig). */
  .ck2-grid > .ck2-rec #cockpit-recent{flex:1;min-height:0;overflow:auto;}
  /* SCHMAL: eine Spalte. Die Reihenfolge steht dann in der Mobil-Regel
     weiter unten - hier nur das Raster. */
  @media(max-width:919.98px){
    .ck2-grid{grid-template-columns:1fr;
      grid-template-areas:"kpi" "uhr" "todo" "check" "rec" "quick";}
  }
  /* ===== TABLET HOCHKANT (620-920px) ===================================
     BEFUND MURAT 24.08.2026 am Schul-Tablet: „saati yine yukaridaki satira
     sikistirabilirsin. klassencheck uzun olsun satiri kaplasin."

     Zwei Dinge stimmten hier nicht. Die UHR bekam eine eigene volle Zeile,
     obwohl sie nur aus Datum, Uhrzeit und einem Knopf besteht - auf einem
     hochkanten Schirm ist Hoehe das knappe Mass, und diese Zeile kostete
     rund 110px fuer drei Zeilen Text. Sie sitzt jetzt RECHTS NEBEN den
     Kennzahlen in derselben Zeile; beide gehoeren ohnehin zum „Stand der
     Dinge" und nicht zur Arbeit.

     Dafuer vier Spalten statt zwei: nur so laesst sich eine Zeile 3:1 teilen
     (Kennzahlen | Uhr) und die naechste 2:2 (Kontingente | Zuletzt). Mit
     zwei Spalten muesste die Uhr die Haelfte nehmen - dann waeren die fuenf
     Kennzahlen daneben nicht mehr lesbar.

     Der KLASSEN-CHECK nimmt die ganze Zeile ("check check check check") -
     er ist eine Tabelle mit Klasse, Schnitt, Balken und Trend, und in einer
     halben Zeile bricht der Balken auf Fingerbreite. */
  @media (min-width:620px) and (max-width:919.98px){
    .ck2-grid{grid-template-columns:repeat(4,minmax(0,1fr));
      grid-template-areas:"kpi kpi kpi uhr" "todo todo todo todo"
                          "rec rec rec rec"
                          "check check check check" "quick quick quick quick";}
    /* Die Uhr steht jetzt in einer Zeile mit den Kennzahlen und muss deren
       Hoehe halten - also enger gesetzt und ohne den grossen Zahlensprung. */
    .ck2-card.ck2-uhr{padding:8px 10px 10px;justify-content:center;}
    .ck2-uhr .ck-uhr-zeit{font-size:26px;}
    .ck2-uhr .ckb-date{font-size:9.5px;}
    .ck2-uhr .ck-uhr-timer{padding:5px 9px;font-size:11px;margin-top:5px;}
    .ck2-uhr .ck-uhr-timer svg{width:13px;height:13px;}
    /* Die Kennzahlen teilen sich jetzt drei Viertel der Zeile statt der
       ganzen - je Kachel bleiben auf 820px rund 115px statt 160px. Deshalb
       hier dieselbe kompakte Bauform wie am Telefon: Bild oben, Zahl
       darunter, KURZE Beschriftung. Beide Texte stehen ohnehin im HTML
       (`k-lang`/`k-kurz`, CLAUDE.md) - es wird nur umgeschaltet, nicht neu
       gezeichnet. Ohne das braeche "Materialien diesen Monat" auf drei
       Zeilen und riss die ganze Zeile in die Hoehe. */
    .ck2-kpis{gap:7px;}
    .ck2-kpi{flex-direction:column;align-items:center;justify-content:center;
      text-align:center;gap:2px;padding:9px 5px;}
    .ck2-kpi .k-ico{position:static;width:27px;transform:none;order:-1;}
    .ck2-kpi .k-v{font-size:18px;}
    .ck2-kpi .k-l{font-size:10px;white-space:normal;line-height:1.15;
      max-width:100%;overflow-wrap:anywhere;hyphens:auto;}
    .ck2-kpi .k-lang{display:none;}
    .ck2-kpi .k-kurz{display:inline;}
  }
  /* ===== DIE REIHENFOLGE AM TELEFON (v2.395.0) ==========================
     ANWEISUNG MURAT 23.08.2026: „mobilde cockpit acildiginda her zaman saat
     en üstte görünsün. sonra günlük kota durumu. sonra schnellzugriff minicik
     kutular halinde bir satirda 5 kutu. sonra aufgaben klassencheck sonra
     digerleri."

     WARUM DIESE UND KEINE ANDERE: Am Telefon steht die Lehrkraft VOR oder IN
     der Stunde - sie will die Zeit, ihr Kontingent und einen kurzen Weg zum
     Werkzeug. Am Computer sitzt sie davor und arbeitet; dort fuehren die
     Kennzahlen. Dieselbe Seite, eine andere Frage - deshalb nur eine andere
     Reihenfolge derselben Felder, kein zweites Markup.

     ⛔ DIESER BLOCK MUSS NACH DEM 920er-BLOCK STEHEN. Auf 375 px treffen
     BEIDE Regeln zu, die Spezifitaet ist gleich - dann gewinnt die spaetere.
     Genau daran ist die erste Fassung gescheitert (im Browser gemessen: die
     Kennzahlen standen weiter oben). */
  @media (max-width:640px){
    .ck2-grid{grid-template-columns:1fr;
      grid-template-areas:"kpi" "uhr" "quick" "todo" "check" "rec";
      gap:12px;}
    /* Die Uhr steht ganz oben und traegt keinen Kasten - dann darf sie auch
       keinen leeren Platz beanspruchen. */
    .ck2-card.ck2-uhr{padding:2px 0 6px;}
  }
  /* (.ck2-main / .ck2-rail sind mit v2.395.0 entfallen - das Raster braucht
     keine Wrapper-Spalten mehr, und mit ihnen konnten die Zeilen nie gleich
     hoch werden. Wer sie zurueckbaut, baut den alten Zustand zurueck.) */
  /* ===== EINE STRICHSTAERKE (v2.413.0, DESIGN_SYSTEM.md §6.2) ===========
     BEFUND MURAT 24.08.2026: „bi yerde lucida ikonlar bi yerde 3d ikonlar
     … sitedeki bütünlük kayboldu ya" – und dazu, dass die Zeichen selbst
     „basit" wirken.

     NACHGEMESSEN, und es war kein Gefuehl: die OPTISCHE Strichstaerke im
     Bestand reicht von 0.62px bis 3.50px – **Faktor 5.6**. Zwei Icons
     nebeneinander, das eine cılız, das andere kaba; das liest man als
     Unordnung, nicht als Vielfalt.

     WARUM DAS PASSIERT, obwohl ueberall „stroke-width:2" steht: die Zahl
     gilt im viewBox (24 Einheiten), nicht auf dem Schirm. Was man sieht,
     ist `stroke-width x Groesse / 24`. Dasselbe `2` ergibt bei 16px eine
     1.33px-Linie und bei 34px eine 2.83px-Linie. Wer nur die Zahl
     vereinheitlicht, vereinheitlicht nichts.

     DESHALB RECHNET DIE SKALA RUECKWAERTS: jede Stufe zielt auf **1.6px
     sichtbare Linie** (der Wert, den die Seitenleiste ohnehin hatte – so
     bleibt der haeufigste Anblick der Seite unveraendert und alles andere
     kommt zu ihm, nicht umgekehrt).

         sichtbar = stroke-width x px / 24  = 1.6

     UND ES IST AUSDRUECKLICH KEIN SPIELZEUG (Anweisung Murat: „kesinlikle
     oyunsal biseye dönmesin"): eine duennere, gleichmaessige Linie wirkt
     ruhig und erwachsen. Dicker waere es „Cartoon", duenner unlesbar. Wer
     die Skala aendert, aendert sie an EINER Stelle – das ist der Punkt.

     Die Regel steht schon in DESIGN_SYSTEM.md §6.2 („Größe und Strichstärke
     kommen aus der Klasse `.ic`, nie einzeln"); sie war nur nie gebaut.
     Bestehende Regeln werden Schritt fuer Schritt hierher gezogen –
     angefangen bei dem Bildschirm, um den es ging (Cockpit + Seitenleiste).

     MIT WEM VERBUNDEN: #app-sidebar .sb-item svg, .ck2-* (unten),
     docs/DESIGN_SYSTEM.md §6, qa/unit/test_icon_strichstaerke.py. */
  .ic{ flex:none; fill:none; stroke:currentColor;
       stroke-linecap:round; stroke-linejoin:round;
       width:var(--ic-px,21px); height:var(--ic-px,21px);
       stroke-width:var(--ic-sw,1.85); }
  .ic-xs{ --ic-px:14px; --ic-sw:2.75; }   /* 14 x 2.75 / 24 = 1.60 */
  .ic-sm{ --ic-px:17px; --ic-sw:2.25; }   /* 17 x 2.25 / 24 = 1.59 */
  .ic-md{ --ic-px:21px; --ic-sw:1.85; }   /* 21 x 1.85 / 24 = 1.62 */
  .ic-lg{ --ic-px:24px; --ic-sw:1.60; }   /* 24 x 1.60 / 24 = 1.60 */

  /* ===== EINE FLAECHENFAMILIE (v2.412.0) ================================
     BEFUND MURAT 24.08.2026: „bir bütün durmuyor yani … bloklar baya
     siritti." Er hat recht gehabt, und es war messbar: auf EINEM Bildschirm
     standen zwei Bausteinsprachen nebeneinander.

         vorher   .ck2-card   Rand 1.5px · Ecke 16 · weiss
                  .ck2-kpi    kein Rand  · Ecke 14 · Farbton
                  .lx-card    kein Rand  · Ecke 14 · Farbton

     Zwei von drei Bausteinen waren mit v2.409.0 auf die neue Sprache
     umgestellt, der dritte blieb stehen - das Auge liest so etwas als
     „halb fertig", nicht als Gliederung.

     JETZT: dieselbe Ecke, derselbe Rhythmus, EIN Unterschied - die Fuellung.
     Farbton = eine Flaeche, die zu etwas fuehrt (Kennzahl, Werkzeug).
     Neutral = eine Flaeche, die man liest (Aufgaben, Klassen-Check, Rail).
     Damit bleibt Farbe eine Aussage (Design-System §3) und wird nicht zur
     Tapete - genau deshalb bekommen diese Karten AUSDRUECKLICH keinen
     eigenen Farbton.

     UND DER RAND FAELLT WEG, NICHT NUR ZUR ZIER: `--card` (weiss) liegt auf
     `--paper` (hellgrau), im Dunkelmodus #1F2739 auf #161B26. Die Fuellung
     grenzt also selbst ab; die 1.5px-Linie darueber war eine zweite
     Abgrenzung fuer dieselbe Kante. Design-System §5 nennt `--e-0` „kein
     Schatten, 1px --line" - das gilt fuer eine Karte AUF gleichfarbigem
     Grund. Hier traegt die Fuellung den Kontrast, deshalb kein Rand und
     weiterhin kein Schatten. Wer den Rand zurueckholt, holt die zwei
     Sprachen zurueck. */
  /* NACHTRAG v2.414.0 - DER FEHLER AUS v2.412.0. Der Rand fiel weg mit der
     Begruendung „die Fuellung grenzt selbst ab". Das stimmt fuer eine Karte
     auf `--paper`. Das Cockpit liegt aber IN einem Panel (`.card`), und das
     ist selbst `--card` - also weiss auf weiss. Ergebnis am Telefon (Befund
     Murat 24.08.2026): „meine aufgaben baslangici sonu nerde klassencheck
     nerde filan anlasilmiyor." Genau so war es, und am Schreibtisch faellt
     es weniger auf, weil dort die Spalten die Kanten erahnen lassen.
     JETZT UMGEKEHRT: das Panel bleibt weiss, die Karte bekommt den ruhigen
     Grund. Damit grenzt die Fuellung wirklich ab - ohne Rand, ohne Schatten,
     ohne Farbton, und die Kachelsprache bleibt (gleiche Ecke, kein Rand).
     Im Dunkelmodus dreht sich das Verhaeltnis mit den Tokens von selbst
     (Panel #1F2739, Karte #161B26). */
  /* ===== NACHTRAG v2.646.0 - AUS DEM GRUND WIRD GLAS ====================
     BEFUND MURAT 04.09.2026: „meine aufgaben ve klassencheck …
     tageskontingente zuletzt bearbeitet kisimlari cok gri baya kötü
     duruyor." Stimmt, und der Grund steht im Absatz darueber: die Karte
     musste sich ohne Rand und ohne Schatten allein durch ihre FUELLUNG vom
     weissen Panel abheben. Wer nur ein Mittel hat, muss es laut benutzen -
     --paper (#F1F2F6) war so laut, dass fuenf Karten den Bildschirm grau
     machten.

     JETZT WIEDER DREI MITTEL, dafuer jedes leise: eine Fuellung von 2,2 %
     (statt rund 5,5 %), eine haarfeine Kante und ein tragender Schatten.
     Die 2,2 % sind der zweite Anlauf - 3,4 % waren Murat immer noch zu grau
     („griyi biraz daha mi acsak"). Weil die Fuellung damit fast nichts mehr
     traegt, ist die Kante im selben Zug von 5,5 % auf 7 % gegangen: was die
     eine abgibt, nimmt die andere auf.
     Die Zusage aus v2.414.0 - „die Karte MUSS sich vom Panel abheben" -
     bleibt damit erfuellt, sie wird nur nicht mehr von der Fuellung allein
     getragen. Sichtbarer ist die Kante dadurch sogar, denn vorher gab es
     ueberhaupt keine.

     KEIN backdrop-filter, und das ist Absicht: hinter der Karte liegt das
     weisse Panel. blur von Weiss ist Weiss, saturate eines neutralen Tons
     ist derselbe Ton - es waere eine GPU-Ebene je Karte fuer null
     Unterschied (ausfuehrlich bei --glas-*). Wer es „nachruestet", macht
     das Cockpit auf dem Tablet langsamer und sieht nichts davon.

     Der Ton bleibt neutral: die Zusage „keine Farbflaeche fuer Karten, die
     man LIEST" (Design-System §3) ist unberuehrt - --glas-karte mischt mit
     --ink, nicht mit einer Bedeutungsfarbe. */
  .ck2-card{background:var(--glas-karte);border:none;border-radius:14px;overflow:hidden;
    box-shadow:var(--glas-trage),inset 0 0 0 1px var(--glas-kante),inset 0 1px 0 var(--glas-licht);}
  .ck2-card .c-h{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap;padding:12px 16px 9px;}
  .ck2-card .c-h b{font-size:14px;font-weight:800;letter-spacing:-.01em;color:var(--ink);}
  .ck2-card .c-sub{font-size:12px;color:var(--muted);font-weight:650;}
  /* ===== DER AUFKLAPP-KNOPF (v2.413.0) =================================
     BEFUND MURAT 24.08.2026: „o kirmizinin yanindaki oku da büyük yap
     kücücük acilir kapanir oldugu belli degil."

     Dort stand ein `›` in Textgroesse, ohne Flaeche, in Grau - optisch ein
     Trennzeichen, kein Bedienelement. Deshalb hat kaum jemand entdeckt,
     dass unter der Zeile die ganze Klasse liegt. Jetzt ein Plaettchen mit
     eigener Flaeche, Chevron aus der Icon-Skala, und beim Oeffnen dreht es
     sich um 90 Grad.

     KEINE eigene Bewegung darueber hinaus (Anweisung: „kesinlikle oyunsal
     biseye dönmesin") - eine Drehung, die den Zustand ZEIGT, ist etwas
     anderes als eine, die nur huepft. */
  .ckh-arr{ display:inline-flex; align-items:center; justify-content:center;
    width:26px; height:26px; border-radius:8px; margin-right:6px;
    color:var(--muted); background:var(--paper); cursor:pointer;
    vertical-align:middle; flex:none;
    transition:background .14s, color .14s, transform .16s; }
  .ck2-tbl tr:hover .ckh-arr{ background:var(--brand-soft); color:var(--brand-dk); }
  .ckh-arr.auf{ transform:rotate(90deg); background:var(--brand-soft); color:var(--brand-dk); }
  @media (prefers-reduced-motion: reduce){ .ckh-arr{ transition:background .14s, color .14s; } }

  /* ===== DER AUFGEKLAPPTE KLASSEN-CHECK (v2.412.0) ======================
     Gegenstueck zu ckHealthDetail() in static/js/index-app.js - die Begruendung
     steht dort. Hier nur die Masse.

     ER SPRICHT DIE KACHELSPRACHE: keine Raender, Ecke 12/14, weiche
     Farbflaeche. Die Farbe IST hier die Aussage (gruen laeuft, bernstein
     beobachten, rot Hilfe noetig) - das ist Design-System §3 und nicht
     dagegen. Tabellenlinien gibt es keine: die Faerbung trennt schon. */
  .kc-ampel{display:grid;grid-template-columns:repeat(3,1fr);gap:10px;margin-bottom:15px;}
  .kc-a{border-radius:12px;padding:11px 13px;display:flex;flex-direction:column;}
  .kc-a .z{font-size:24px;font-weight:800;line-height:1;letter-spacing:-.02em;}
  .kc-a .l{font-size:12.5px;font-weight:750;margin-top:5px;}
  .kc-a .u{font-size:11.5px;margin-top:2px;opacity:.75;}
  .kc-a.gut{background:var(--ok-soft);color:var(--ok-ink);}
  .kc-a.mittel{background:var(--amber-soft);color:var(--amber-ink);}
  .kc-a.schwach{background:var(--bad-soft);color:var(--bad-ink);}
  /* EINE Spaltenaufteilung fuer Kopf und Zeilen. Stuenden sie doppelt, wuerde
     die eine beim naechsten Umbau nachgezogen und die andere nicht - und die
     Ueberschriften stuenden neben den falschen Zahlen. */
  .kc-kopf,.kc-z{display:grid;grid-template-columns:minmax(0,1fr) 62px minmax(110px,190px) 92px;
    gap:11px;align-items:center;}
  .kc-kopf{padding:0 12px 5px;font-size:10.5px;font-weight:800;letter-spacing:.05em;
    text-transform:uppercase;color:var(--muted);}
  .kc-liste{display:flex;flex-direction:column;gap:6px;}
  .kc-z{padding:8px 12px;border-radius:12px;}
  .kc-z.gut{background:var(--ok-soft);}
  .kc-z.mittel{background:var(--amber-soft);}
  .kc-z.schwach{background:var(--bad-soft);}
  .kc-n{min-width:0;}
  .kc-n .nm{font-weight:700;font-size:13.5px;color:var(--ink);
    overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block;}
  .kc-noten{font-size:13px;font-weight:700;color:var(--muted);font-variant-numeric:tabular-nums;}
  /* DIE ZAHL STEHT IM BALKEN, nicht daneben: sonst schaut man an zwei Orten
     fuer eine Aussage. `--card` als Bett, damit der Balken auf der weichen
     Flaeche ueberhaupt sichtbar ist. */
  .kc-bar{height:26px;border-radius:8px;background:var(--card);overflow:hidden;position:relative;}
  /* MINDESTBREITE, damit die Zahl IMMER auf der Farbe steht. Ohne sie
     rutscht die Beschriftung bei einem sehr schwachen Schnitt (5 %) aus dem
     Balken heraus - und weisse Schrift auf `--card` ist unlesbar. Genau der
     Fall, der im Alltag am seltensten vorkommt und deshalb erst auffaellt,
     wenn ein Kind wirklich so dasteht. */
  .kc-bar i{position:absolute;inset:0 auto 0 0;display:block;border-radius:8px;min-width:46px;}
  .kc-bar span{position:absolute;inset:0;display:flex;align-items:center;padding-left:10px;
    font-size:13px;font-weight:800;font-variant-numeric:tabular-nums;color:var(--on-brand);}
  .kc-z.gut .kc-bar i{background:var(--ok);}
  .kc-z.mittel .kc-bar i{background:var(--amber);}
  .kc-z.schwach .kc-bar i{background:var(--bad);}
  .kc-tr{font-size:12.5px;font-weight:800;font-variant-numeric:tabular-nums;}
  .kc-tr.up{color:var(--ok-ink);} .kc-tr.down{color:var(--bad-ink);} .kc-tr.flat{color:var(--muted);}
  .kc-fuss{display:flex;align-items:center;justify-content:space-between;gap:12px;
    flex-wrap:wrap;margin-top:13px;}
  .kc-faecher{display:flex;flex-wrap:wrap;gap:6px;min-width:0;}
  .kc-fach{display:inline-flex;align-items:center;gap:6px;background:var(--card);
    border-radius:999px;padding:4px 11px;font-size:12.5px;color:var(--ink);}
  .kc-leer{font-size:13px;color:var(--muted);}
  /* SCHMAL: die vier Spalten passen nicht. Name und Balken bleiben - die
     Notenzahl und der Abstand zum Schnitt wandern unter den Namen, statt
     dass alles zusammengequetscht wird. */
  /* SCHMAL: EINE ZEILE JE KIND (v2.414.0). Befund Murat 24.08.2026:
     „klasse aciyom 25 kisilik sinif satirlar cok büyük yani kalin olmus …
     biraz daha yazi boyutunu kücültüp daraltsak, en degil, boy."

     Die erste Fassung stellte Name/Trend ueber Balken/Noten - zwei Zeilen je
     Kind. Bei 25 Kindern sind das 25 Bloecke a rund 70px, also fast zwei
     Bildschirmlaengen fuer EINE Klasse. Jetzt drei Spalten in EINER Zeile:
     Name, Balken mit der Zahl, Abstand zum Schnitt.

     WAS DAFUER WEICHT: die Notenzahl. Sie ist die am wenigsten dringende der
     vier Angaben („wie viele Noten liegen zugrunde") und steht am Computer
     weiter da. Der Balken bleibt, weil er der einzige ist, den man ohne
     Lesen erfasst.

     Die Felder brauchen hier KEINE `grid-area` mehr - bei drei Spalten und
     drei Feldern legt der Browser sie ohnehin nebeneinander. Die Zuweisung
     wird ausdruecklich zurueckgenommen (`grid-area:auto`), sonst gilt noch
     die Zweizeilen-Anordnung der Grundregel. */
  /* DIE AUFGEKLAPPTE KLASSE IN EINER SCHMALEN KARTE (v2.862.0): am Tablet
     oder mit offener Seitenleiste ist die Karte 450-640 px breit. Der Balken
     nahm dort seine vollen 190 px und liess den Namen bei 49 px enden
     („Lina …"). Jetzt gibt er Breite ab, die vier Spalten bleiben.
     ⛔ Diese Regel steht VOR dem Telefon-Block darunter: am Telefon gelten
     beide, und dort muss die Einzeilen-Anordnung gewinnen. */
  @container kcheck (max-width:639.98px){
    /* 88 px fuer die letzte Spalte: „ZUM SCHNITT" braucht gemessen 83,4 px
       und brach bei 82 px auf zwei Zeilen um. */
    .kc-kopf,.kc-z{grid-template-columns:minmax(0,1fr) 46px minmax(80px,120px) 88px;gap:9px;}
  }
  /* Noch schmaler (unter 440 px - am Rechner nur mit offener Seitenleiste
     auf einem kleinen Fenster): dieselbe Einzeilen-Anordnung wie am Telefon.
     Gemessen bei 316 px: die vier Spalten liessen dem Namen 0 px, zu sehen
     waren nur noch Zahlen. Die Zeilen stehen hier ein zweites Mal, weil der
     Telefon-Block an der BILDSCHIRMbreite haengt und diese Karte nicht
     kennt - und aeltere iPads (ohne Container-Queries) den Telefon-Block
     weiter brauchen. */
  @container kcheck (max-width:439.98px){
    .kc-ampel{gap:6px;margin-bottom:10px;}
    .kc-a{padding:8px 10px;}
    .kc-a .z{font-size:18px;} .kc-a .l{font-size:10.5px;} .kc-a .u{display:none;}
    .kc-kopf{display:none;}
    .kc-liste{gap:4px;}
    .kc-z{gap:8px;padding:5px 10px;grid-template-columns:minmax(0,1fr) 84px 44px;}
    .kc-tr{text-align:right;font-size:11.5px;}
    .kc-noten{display:none;}
    .kc-n .nm{font-size:12.5px;}
    .kc-bar{height:20px;}
    .kc-bar span{font-size:11.5px;padding-left:7px;}
    .kc-bar i{min-width:38px;}
  }
  @media (max-width:640px){
    .kc-ampel{gap:6px;margin-bottom:10px;}
    .kc-a{padding:8px 10px;}
    .kc-a .z{font-size:18px;} .kc-a .l{font-size:10.5px;} .kc-a .u{display:none;}
    .kc-kopf{display:none;}
    .kc-liste{gap:4px;}
    .kc-z{grid-template-columns:minmax(0,1fr) 84px 44px;gap:8px;padding:5px 10px;}
    .kc-n    {grid-area:auto;}
    .kc-bar  {grid-area:auto;height:20px;}
    .kc-tr   {grid-area:auto;text-align:right;font-size:11.5px;}
    .kc-noten{display:none;}
    .kc-n .nm{font-size:12.5px;}
    .kc-bar span{font-size:11.5px;padding-left:7px;}
    .kc-bar i{min-width:38px;}
    .kc-fuss{margin-top:10px;}
    .kc-fach{font-size:11.5px;padding:3px 9px;}
  }

  /* To-do-Zeilen */
  .ck2-todo .t-row{display:flex;align-items:center;gap:12px;padding:10px 16px;border-top:1px solid rgba(127,127,127,.1);cursor:pointer;transition:background .1s;}
  /* `--paper` ist seit v2.414.0 der Kartengrund - als Hover waere es
     unsichtbar. `--card` hebt die Zeile jetzt HERAUS statt sie einzudunkeln. */
  .ck2-todo .t-row:hover{background:var(--card);}
  .ck2-todo .t-ico{flex:none;width:31px;height:31px;border-radius:9px;display:flex;align-items:center;justify-content:center;}
  /* 16px/2 waren optisch 1.33px - sichtbar duenner als die Seitenleiste
     daneben (1.62px). Jetzt .ic-sm: 17px/2.25 = 1.59px. */
  .ck2-todo .t-ico svg{width:17px;height:17px;fill:none;stroke:currentColor;stroke-width:2.25;stroke-linecap:round;stroke-linejoin:round;}
  .ck2-todo .t-tx{flex:1;min-width:0;}
  .ck2-todo .t-tx b{display:block;font-size:13.5px;font-weight:700;color:var(--ink);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
  .ck2-todo .t-tx small{display:block;font-size:12px;color:var(--muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-top:1px;}
  .ck2-due{font-size:11px;font-weight:750;border-radius:99px;padding:2px 9px;flex:none;}
  .ck2-due.today{background:rgba(224,70,62,.1);color:var(--bad);}
  .ck2-due.soon{background:var(--amber-soft);color:#B45309;}
  .ck2-due.later{background:rgba(127,127,127,.1);color:var(--muted);}
  .ck2-chev{flex:none;width:14px;height:14px;fill:none;stroke:var(--muted);stroke-width:2.2;stroke-linecap:round;stroke-linejoin:round;opacity:.6;}
  .ck2-empty{font-size:13px;color:var(--muted);padding:12px 16px;border-top:1px solid rgba(127,127,127,.1);}
  /* Gruppen-Ueberschrift in der Karte "Meine Aufgaben" (v2.58.0):
     trennt Handlung von Kenntnisnahme. Ohne sie sieht eine Tagesbilanz
     aus wie eine unbewertete Abgabe. */
  .ck2-todo .ck2-grp{font-size:10.5px;font-weight:800;color:var(--muted);
    text-transform:uppercase;letter-spacing:.06em;padding:11px 16px 4px;
    border-top:1px solid rgba(127,127,127,.1);}
  /* Klassen-Check als Tabelle */
  /* ===== DIE TABELLE PASST IN IHRE KARTE - AUF JEDER BREITE (v2.862.0) ====
     Befund Murat 26.09.2026: „klassen checki acinca … oraya sigmiyor …
     saga dogru kaymis kesilmis icerik. saga dogru gitmem lazim bakmak icin
     bunu da istemiyorum asla."

     GEMESSEN im Browser, bevor etwas geaendert wurde: bei 1024 px (iPad
     quer) war die Karte 568 px breit, die Tabelle 813 px - und zwar schon
     ZUGEKLAPPT. Drei Dinge hielten sie breit, keines davon war der
     aufgeklappte Bereich allein:
       1. `min-width:520px` an der Tabelle (nur am Telefon aufgehoben),
       2. `white-space:nowrap` an JEDER Zelle - auch an der Detailzeile,
          sodass alles darin ebenfalls nicht umbrechen durfte,
       3. feste Mindestbreiten per style-Attribut (Balken 110 px) und
          „Braucht Hilfe" mit langen Namen, die die Spalte aufzogen.
     Die v2.414.0-Regel darunter kannte nur die BILDSCHIRMbreite (640 px).
     Die Karte ist aber auch am Tablet und bei aufgeklappter Seitenleiste
     schmal - deshalb fragt die Tabelle jetzt ihre KARTE (Container-Query
     `kcheck`), nicht den Bildschirm:
         < 780 px   „Letzte Abgabe" faellt weg
         < 680 px   „Abgaben 14 T." faellt weg, Zellen enger
         < 550 px   „Braucht Hilfe" faellt weg - wie am Telefon
     Die Schwellen sind GERECHNET, nicht geschaetzt: je Stufe die
     Mindestbreite aller Spalten im schlimmsten Fall (Kursname in voller
     Laenge), im Browser nachgemessen von 320 bis 1100 px Kartenbreite.
     Nichts davon ist verloren: aufgeklappt steht jedes Kind einzeln da.
     „Braucht Hilfe" kuerzt vorher mit „…" (max-width:0 + Prozentbreite -
     der bekannte Weg, in einer automatischen Tabelle zu kuerzen), die vollen
     Namen stehen im Tooltip.
     OHNE Container-Queries (iPadOS 15 und aelter) bleiben alle Spalten
     stehen; die Tabelle ist dann eng, aber durch 2. und 3. trotzdem
     schmaler als vorher. Der Rollbalken bleibt nur als letztes Netz. */
  .ck2-check{container-type:inline-size;container-name:kcheck;}
  .ck2-tblwrap{overflow-x:auto;scrollbar-width:thin;}
  .ck2-tbl{width:100%;border-collapse:collapse;font-size:13px;}
  /* Die Grundregeln der Zellen stehen VOR den schmalen Regeln - bis v2.861.0
     standen sie danach und hoben bei gleicher Gewichtung die engeren
     Polster des Telefons (7px 10px) lautlos wieder auf. */
  .ck2-tbl th{text-align:left;font-size:10.5px;font-weight:800;text-transform:uppercase;letter-spacing:.05em;color:var(--muted);
    padding:8px 16px;border-top:1px solid var(--line);border-bottom:1px solid var(--line);white-space:nowrap;background:var(--paper);}
  /* Die drei Ueberschriften aus zwei Woertern duerfen umbrechen, wenn es
     eng wird („Abgaben / 14 T.") - „Ø / gesamt" darf es nicht, das liest
     sich wie zwei Spalten. */
  .ck2-tbl th:nth-child(n+5){white-space:normal;}
  .ck2-tbl td{padding:10px 16px;border-bottom:1px solid rgba(127,127,127,.1);white-space:nowrap;vertical-align:middle;font-variant-numeric:tabular-nums;}
  /* Die Detailzeile bricht um: sie traegt Kacheln, eine Liste und Chips,
     keine Tabellenzelle. Mit geerbtem `nowrap` rechnete die Tabelle ihre
     laengste Zeile als Mindestbreite. */
  .ck2-tbl td[colspan]{white-space:normal;}
  .ck2-tbl td.ck2-balken{min-width:110px;}
  .ck2-tbl td.ck2-hilfe{max-width:0;width:26%;overflow:hidden;text-overflow:ellipsis;}
  /* Ein Kursname („8ABC Mathematik E-Kurs") darf die erste Spalte nicht
     aufziehen: hoechstens 10em, und nie mehr als ein Fuenftel der Karte
     (cqw = Hundertstel der Kartenbreite). Die zweite Zeile verwirft, wer
     keine Container-Einheiten kennt - dann gilt die erste. */
  .ck2-kname{display:inline-block;max-width:10em;overflow:hidden;text-overflow:ellipsis;vertical-align:middle;}
  .ck2-kname{max-width:min(10em, 20cqw);}
  @container kcheck (max-width:779.98px){
    .ck2-tbl th:nth-child(7),
    .ck2-tbl td:not([colspan]):nth-child(7){display:none;}
  }
  @container kcheck (max-width:679.98px){
    .ck2-tbl th:nth-child(5),
    .ck2-tbl td:not([colspan]):nth-child(5){display:none;}
    .ck2-tbl th,.ck2-tbl td{padding-left:12px;padding-right:12px;}
    .ck2-tbl td.ck2-hilfe{width:34%;}
  }
  @container kcheck (max-width:549.98px){
    .ck2-tbl{font-size:12.5px;}
    .ck2-tbl th:nth-child(6),
    .ck2-tbl td:not([colspan]):nth-child(6){display:none;}
    .ck2-tbl th,.ck2-tbl td{padding:7px 10px;}
    /* Gemessen bei 344 px (iPhone 12-15): mit Kursnamen 18 px zu breit -
       Balken und Name geben je ein Stueck ab, dann passt es. */
    .ck2-tbl td.ck2-balken{min-width:0;}
    .ck2-tbl .ck2-bar{min-width:44px;}
    .ck2-kname{max-width:min(10em, 18cqw);}
  }
  /* Das kleinste Telefon (360 px, Karte 312 px) mit einem Kursnamen: noch
     einmal 18 px zu breit. Der Knopf wird dort so klein wie der Pfeil in
     der Detailzeile, der Name kuerzer - lesbar bleibt er im Tooltip und
     in der aufgeklappten Klasse. */
  @container kcheck (max-width:339.98px){
    .ck2-tbl .ckh-arr{width:22px;height:22px;margin-right:4px;}
    .ck2-kname{max-width:min(10em, 13cqw);}
  }
  /* SCHMAL PASST ALLES INS BILD (v2.414.0). Befund Murat 24.08.2026:
     „klassencheck tek bakista hepsi görünür olmali ilkesine uymuyor saga
     dogru kaymis icerik. oraya fit olmaliydi."

     Ursache war `min-width:520px`: auf 402px schob sich die Tabelle nach
     rechts aus dem Bild, und was rechts stand, hat niemand je gesehen - ein
     waagerechter Rollbalken IN einer Karte wird nicht gefunden.

     Also fallen schmal die drei Nebenspalten weg: „Abgaben 14 T.",
     „Braucht Hilfe" und „Letzte Abgabe". Sie sind nicht verloren - wer die
     Zeile aufklappt, sieht jedes Kind einzeln, und dorthin fuehrt die Frage
     „wer braucht Hilfe" ohnehin. Sichtbar bleibt, was man mit einem Blick
     vergleicht: Klasse, Schnitt, Balken, Trend.

     `td:not([colspan])` schuetzt die Detailzeile: sie hat nur EINE Zelle
     ueber sieben Spalten, und die darf nicht mitverschwinden. */
  @media (max-width:640px){
    .ck2-tbl{min-width:0;font-size:12.5px;}
    .ck2-tbl th:nth-child(n+5),
    .ck2-tbl td:not([colspan]):nth-child(n+5){display:none;}
    .ck2-tbl th{padding:7px 10px;}
    .ck2-tbl td{padding:7px 10px;}
    .ck2-tbl td.ck2-balken{min-width:0;}
    .ck2-tbl .ck2-bar{min-width:44px;}
  }
  .ck2-tbl tr:last-child td{border-bottom:none;}
  .ck2-tbl tbody tr{cursor:pointer;}
  .ck2-tbl tbody tr:hover td{background:var(--paper);}
  .ck2-dot{display:inline-block;width:8px;height:8px;border-radius:50%;flex:none;}
  .ck2-bar{display:inline-block;width:100%;min-width:64px;height:6px;border-radius:99px;background:rgba(127,127,127,.14);overflow:hidden;vertical-align:middle;}
  .ck2-bar i{display:block;height:100%;border-radius:99px;}
  .ck2-legend{display:flex;gap:11px;font-size:11px;font-weight:650;color:var(--muted);flex-wrap:wrap;align-items:center;}
  .ck2-legend span{display:inline-flex;align-items:center;gap:4px;white-space:nowrap;}
  /* Rechte Rail */
  /* Die Schul-Kachel (.ck2-logoBox) mit dem Bild und dem Knopf
     "Schulverwaltung" darauf ist mit v2.287.0 ersatzlos entfallen.
     WARUM sie ging und WOHIN der Knopf gewandert ist, steht am Code:
     renderCockpit() und renderAuthbar() in static/js/index-app.js. */
  /* ===== STUFENWAHL DER DIFFERENZIERUNG (v2.67.0) =========================
     Drei Schalter in der Druckreihenfolge leicht -> schwer. Der Stern ist die
     Hauptsache und steht deshalb gross und zuerst; das Wort darunter ist nur
     die Lesehilfe fuer die Lehrkraft (auf dem Kinderblatt erscheint es NIE,
     siehe abNiveauSternHtml). Das echte Auswahlfeld ist ein RADIO und liegt
     unsichtbar, aber fokussierbar in der Karte - Tastaturbedienung bleibt
     damit vollstaendig (Pfeiltasten wechseln die Stufe), :focus-within
     zeichnet den Rahmen. Der Zustand haengt an der Klasse .an, die nivStufe()
     setzt - NICHT an :has(), damit auch aeltere Browser die Auswahl zeigen.
     GENAU EINE Stufe ist aktiv, ★★ eingeschlossen: ein Kind bekommt EIN
     Blatt, zwei gleichzeitig gewaehlte Stufen waeren ein Widerspruch
     (gemeldet 30.07.2026). Dass ★★ nichts erzeugt, sagt der Knopf - nicht
     eine Karte, die sich nicht anklicken laesst und dadurch kaputt aussieht.
     MIT WEM: templates/index.html (#niv-body), nivStufe()/nivBtnText() und
     matNiveauErzeugen() in static/js/index-app.js. */
  .niv-stufen{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;margin-bottom:11px;}
  .niv-stufe{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:3px;
    padding:9px 6px;border:1.5px solid var(--line);border-radius:11px;background:var(--card);
    cursor:pointer;text-align:center;transition:border-color .15s, background .15s;}
  .niv-stufe input{position:absolute;opacity:0;width:1px;height:1px;pointer-events:none;}
  .niv-stufe .niv-st{font-size:15px;line-height:1.1;letter-spacing:1px;color:var(--ink);white-space:nowrap;}
  .niv-stufe .niv-nm{font-size:11.5px;font-weight:650;color:var(--muted);}
  .niv-stufe:hover{border-color:var(--brand);}
  .niv-stufe:focus-within{outline:2px solid var(--brand);outline-offset:2px;}
  .niv-stufe.an{border-color:var(--brand);background:rgba(46,91,255,.08);}
  .niv-stufe.an .niv-st{color:var(--brand);}
  .niv-stufe.an .niv-nm{color:var(--brand);}
  .niv-stufe input[type="radio"]{position:absolute;opacity:0;width:1px;height:1px;pointer-events:none;}
  /* Steht die Karte in einer hoeheren Zeile (der Klassen-Check daneben ist
     laenger), rutscht ihre Fusszeile an den unteren Rand statt in der Mitte
     zu haengen - so sieht die gleiche Hoehe gewollt aus und nicht gedehnt. */
  .ck2-grid > .ck2-todo .ck2-todo-foot{margin-top:auto;}
  .ck2-railcard{padding:13px 15px;}
  /* Tageskontingente: bewusst leise – graue Icons, keine Farbflaechen, kein Fett */
  .ck2-railcard .ck-urow .cku-ico{background:transparent !important;color:var(--muted);width:22px;height:22px;}
  /* Tageskontingente: leise, aber nicht duenner als der Rest - 15px
     brauchen 2.55, um dieselbe 1.6px-Linie zu zeichnen. */
  .ck2-railcard .ck-urow .cku-ico svg{stroke:currentColor;width:15px;height:15px;stroke-width:2.55;}
  .ck2-railcard .ck-urow .cku-lbl{font-weight:500;color:var(--ink);}
  .ck2-railcard .ck-urow .cku-val{font-weight:600;font-size:13px;}
  .ck2-railcard .h-mini{font-size:10.5px;font-weight:800;text-transform:uppercase;letter-spacing:.06em;color:var(--muted);margin-bottom:6px;}
  /* ===== „ZULETZT BEARBEITET" OHNE TRENNSTRICHE (v2.862.0) ============
     Gegenstueck zu renderCockpitRecent()/ckFachKuerzel() - die Begruendung
     steht dort. Die Zeilen tragen keine Linien mehr, sondern beim
     Ueberfahren eine weiche Flaeche; das Plaettchen sitzt in derselben
     Spalte wie die Symbole der Tageskontingente darueber. Die Liste ragt
     dafuer 6 px in das Kartenpolster hinein, damit die Flaeche beim
     Ueberfahren Luft um den Text hat - an der Liste und nicht an der
     Zeile, weil #cockpit-recent selbst rollt und einen negativen Rand der
     Zeile abschneiden wuerde.
     Die Zeilenhoehe (4 + 22 + 4 + 2 px) ist die alte (7 + 17 + 7 + 1 px):
     die Karte steht neben dem Klassen-Check, und eine hoehere Liste
     zoege dessen Zeile mit in die Laenge. */
  .ck2-rec #cockpit-recent{margin:0 -6px;display:flex;flex-direction:column;gap:2px;}
  .ck2-rec .r-row{display:flex;align-items:center;gap:10px;padding:4px 6px;border:none;border-radius:9px;
    cursor:pointer;background:none;width:100%;text-align:left;font:inherit;transition:background .14s;}
  .ck2-rec .r-row:hover{background:var(--paper);}
  .ck2-rec .r-row:focus-visible{outline:2px solid var(--brand);outline-offset:-2px;}
  /* Das Plaettchen: weiche Flaeche im Fachton, das Kuerzel dunkler darauf.
     Erst die Zeilen ohne color-mix (aeltere Safari/WebViews: graue Flaeche,
     Kuerzel im Fachton), danach die gemischten - wer color-mix nicht kennt,
     verwirft sie und behaelt die ersten. Gemischt wird mit --card bzw.
     --ink, damit der Dunkelmodus von selbst dunkel/hell mischt. */
  .ck2-rec .r-kz{flex:none;width:22px;height:22px;border-radius:7px;display:flex;align-items:center;justify-content:center;
    font-size:10px;font-weight:800;letter-spacing:-.01em;line-height:1;
    background:var(--paper);color:var(--fc,var(--muted));
    background:color-mix(in srgb, var(--fc,var(--muted)) 14%, var(--card));
    color:color-mix(in srgb, var(--fc,var(--muted)) 80%, var(--ink));}
  .ck2-rec .r-kz.ohne-fach{background:var(--paper);color:var(--muted);}
  /* Basis des Kontext-Chips. Im Cockpit-v4-Kopf sitzt er seit v2.924.14
     neben Weiterarbeiten; die scoped Regel unten hebt den Listenabstand auf. */
  .ck2-ctx{align-items:center;gap:4px;align-self:flex-start;margin-top:10px;
    font-size:12px;color:var(--muted);background:var(--paper);
    border:1px solid var(--line);border-radius:999px;padding:3px 10px;}
  .ck2-rec .r-row b{flex:1;min-width:0;font-size:13px;font-weight:500;color:var(--ink);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
  .ck2-rec .r-row small{font-size:11px;color:var(--muted);flex:none;}
  /* ===== Klassen-Check v2: breiter Zwei-Spalten-Block (visuell, Ampel) ===== */
  .ck-classcheck{border:1.5px solid var(--line);border-radius:16px;background:var(--card);padding:14px 16px;margin-bottom:18px;}
  .ck-classcheck .cc-head{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap;margin-bottom:12px;}
  .ck-classcheck .cc-title{font-weight:800;font-size:14px;color:var(--ink);display:flex;align-items:center;gap:8px;}
  .ck-classcheck .cc-legend{display:flex;gap:10px;font-size:11px;font-weight:700;color:var(--muted);flex-wrap:wrap;}
  .ck-classcheck .cc-legend span{display:inline-flex;align-items:center;gap:4px;white-space:nowrap;}
  .cc-grid{display:grid;grid-template-columns:1fr;gap:12px;}
  @media(min-width:760px){ .cc-grid{grid-template-columns:1.25fr 1fr;} }
  .cc-pane{border:1px solid var(--line);border-radius:13px;padding:11px 13px;background:var(--paper,#f7f8fb);min-width:0;}
  .cc-pane-h{font-size:11.5px;font-weight:800;text-transform:uppercase;letter-spacing:.04em;color:var(--muted);margin-bottom:8px;}
  .cc-class{display:flex;align-items:center;gap:9px;padding:8px 0;border-bottom:1px solid rgba(127,127,127,.1);}
  .cc-class:last-child{border-bottom:none;}
  .cc-emoji{flex:none;font-size:15px;line-height:1;}
  .cc-dot{flex:none;display:inline-block;width:10px;height:10px;border-radius:50%;vertical-align:middle;}
  .cc-legend .cc-dot{width:8px;height:8px;margin-right:3px;}
  /* Name fest, Balken fuellt die Zeile: keine leere Flaeche mehr rechts. */
  .cc-cname{flex:0 1 auto;max-width:42%;font-size:13.5px;font-weight:700;color:var(--ink);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0;}
  .cc-bar{flex:1;min-width:60px;height:7px;border-radius:99px;background:rgba(127,127,127,.16);overflow:hidden;}
  .cc-bar-fill{height:100%;border-radius:99px;transition:width .3s;}
  .cc-avg{flex:none;width:38px;text-align:right;font-size:13px;font-weight:800;color:var(--ink);}
  .cc-delta{flex:none;font-size:11px;font-weight:800;padding:1px 6px;border-radius:99px;min-width:46px;text-align:center;}
  .cc-delta.up{color:var(--ok,#15A05A);background:var(--ok-soft,#E3F7EC);}
  .cc-delta.down{color:var(--bad,#E0463E);background:rgba(224,70,62,.1);}
  .cc-delta.flat{color:var(--muted);background:rgba(127,127,127,.1);}
  .cc-risk{display:flex;align-items:center;gap:9px;padding:7px 0;border-bottom:1px solid rgba(127,127,127,.1);cursor:pointer;transition:background .12s;}
  .cc-risk:last-child{border-bottom:none;}
  .cc-risk:hover{background:rgba(224,70,62,.05);}
  .cc-risk-ava{flex:none;width:26px;height:26px;border-radius:8px;background:rgba(224,70,62,.12);display:flex;align-items:center;justify-content:center;font-size:14px;}
  .cc-risk-name{flex:0 1 auto;max-width:46%;font-size:13px;font-weight:700;color:var(--ink);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0;line-height:1.25;}
  .cc-risk-name small{display:block;font-weight:600;color:var(--muted);font-size:11px;}
  .cc-risk-bar{flex:1;min-width:50px;height:6px;border-radius:99px;background:rgba(127,127,127,.14);overflow:hidden;}
  .cc-risk-bar i{display:block;height:100%;border-radius:99px;background:var(--bad,#E0463E);}
  .cc-risk-pct{flex:none;font-size:12.5px;font-weight:800;color:var(--bad,#E0463E);white-space:nowrap;}
  .cc-empty{color:var(--muted);font-size:12.5px;padding:10px 2px;}
  .cc-allok{display:flex;align-items:flex-start;gap:8px;color:var(--ok,#15A05A);font-size:13px;font-weight:700;padding:8px 2px;line-height:1.4;}
  /* Skeleton-Loader (grauer Puls statt "Wird geladen...") */
  @keyframes ckSkelPulse{0%,100%{opacity:.55;}50%{opacity:1;}}
  .ck-skel{border-radius:10px;background:rgba(127,127,127,.14);animation:ckSkelPulse 1.3s ease-in-out infinite;}
  .ck-skel-line{height:13px;margin:7px 0;}
  .ck-skel-card{height:118px;border-radius:16px;}
  /* Das Popup "Cockpit anpassen" (#ck-prefs-pop) ist mit v2.289.0 entfallen -
     es enthielt genau einen Haken. Begruendung am Code (renderCockpit). */
  .nav-more-menu{position:absolute;top:calc(100% + 8px);right:0;min-width:240px;max-width:min(88vw,300px);background:var(--card,#fff);border:1.5px solid var(--line);border-radius:14px;box-shadow:0 12px 34px rgba(27,34,48,.16);padding:6px;z-index:60;display:none;}
  @media(max-width:560px){
    .nav-more-menu{position:fixed;left:12px;right:12px;top:118px;min-width:0;max-width:none;width:auto;}
  }
  .nav-more-menu.open{display:block;}
  .nav-more-menu .nm-label{font-size:10.5px;font-weight:800;letter-spacing:.05em;text-transform:uppercase;color:var(--muted);padding:8px 10px 4px;}
  .nav-more-menu button{display:flex;align-items:center;gap:12px;width:100%;text-align:left;justify-content:flex-start;background:none;border:none;padding:11px 12px;border-radius:9px;font-size:var(--fs-md);font-weight:600;color:var(--ink);cursor:pointer;font-family:inherit;}
  .nav-more-menu button:hover{background:var(--paper,#f3f4f6);}
  .nav-more-menu button svg{width:20px;height:20px;flex:0 0 20px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;color:var(--muted);}
  .nav-more-menu button span{flex:1;}
  .nav-more-menu .km-divider{height:1px;background:var(--line);margin:5px 10px;}
  .plan-dots{border:none;background:transparent;color:var(--muted);cursor:pointer;padding:6px;border-radius:8px;display:flex;align-items:center;justify-content:center;}
  .plan-dots:hover{background:var(--paper,#f3f4f6);color:var(--ink);}
  .plan-menu{position:absolute;top:calc(100% + 4px);right:0;min-width:184px;background:var(--card,#fff);border:1.5px solid var(--line);border-radius:12px;box-shadow:0 10px 28px rgba(27,34,48,.16);padding:5px;z-index:40;display:none;}
  .plan-menu.open{display:block;}
  .plan-menu button{display:block;width:100%;text-align:left;background:none;border:none;padding:10px 12px;border-radius:8px;font-size:13.5px;font-weight:600;color:var(--ink);cursor:pointer;font-family:inherit;}
  .plan-menu button:hover{background:var(--paper,#f3f4f6);}
  .plan-menu button.pm-del{color:var(--bad);}
  .sup-card .sup-body{display:none;}
  .sup-card.open .sup-body{display:block;}
  .sup-card.open .sup-chev{transform:rotate(180deg);}
  .sup-act{background:var(--paper,#f3f4f6);border:1px solid var(--line);color:var(--ink);border-radius:8px;padding:6px 11px;font-size:12.5px;font-weight:600;cursor:pointer;font-family:inherit;}
  .sup-act:hover{background:var(--card,#fff);}
  .sup-act.sup-del{color:var(--bad);margin-left:auto;}
  /* SchlauStart-Assistent (Chat-Widget) */
  /* `overscroll-behavior:contain` HAELT DEN FINGER IM FENSTER (v2.518.0).
     Befund Murat 28.08.2026: „robi ekraninda olmama ragmen arkayi
     kaydirabiliyorum cockpiti." Ist eine Flaeche am Ende angekommen, gibt
     der Browser die Bewegung an die Seite DAHINTER weiter - auf dem Handy
     heisst das: man wischt in Robis Fenster und das Cockpit fährt darunter
     weg. Am Rechner faellt es nicht auf, weil dort mit dem Rad gescrollt
     wird und der Zeiger im Fenster bleibt. */
  .asst-messages{flex:1 1 auto;min-height:0;overflow-y:auto;overscroll-behavior:contain;
    -webkit-overflow-scrolling:touch;
    padding:14px;display:flex;flex-direction:column;gap:10px;background:var(--asst-hauch);}
  /* ROBIS FENSTER IN DER FLAECHENFARBE (v2.963.0, Murat 05.10.2026: „tema
     rengine uyumlu … biraz daha kaliteli pencereler … konuşma baloncukları
     da"). Bis dahin war die eigene Blase fest blau (#2E5BFF) und Fenster,
     Kopf und Verlauf neutral grau – auf einer Salbei-Oberflaeche ein
     Fremdkoerper. Jetzt kommt jeder Ton aus `--brand`, und der folgt seit
     v2.930.0 dem Flaechenakzent (design-tokens.css): die eigene Blase ist
     der Akzent mit weisser Schrift (ssAkzentSetzen rechnet ihn auf 4.5:1),
     Robis Blase eine Karte mit getoenter Kante, die Flaechen dahinter ein
     Hauch desselben Tons. Die Mischungen stehen EINMAL als Variablen am
     Fenster; Kopf, Verlauf und Schleier lesen dieselben. Im dunklen Design
     ist `--brand` hell – dort traegt die eigene Blase den dunklen
     Markenhauch mit heller Schrift (Regel weiter unten). Bedeutungsfarbe
     bleibt Bedeutungsfarbe: die sensible Antwort ist Bernstein, nie Akzent.
     VERBUNDEN MIT: .asst-widget (Variablen), ROBI GROSS/ROBIS GESPRAECHE
     (unten), qa/unit/test_robi_fenster_farbe.py. */
  .asst-msg{max-width:82%;padding:9px 13px;border-radius:16px;font-size:13.5px;line-height:1.5;white-space:pre-wrap;word-break:break-word;}
  .asst-msg.bot{align-self:flex-start;background:var(--card);border:1px solid var(--asst-kante);border-bottom-left-radius:5px;
    box-shadow:0 1px 2px var(--asst-schatten);}
  .asst-msg.user{align-self:flex-end;background:var(--brand);color:var(--on-brand);border-bottom-right-radius:5px;
    box-shadow:0 3px 10px -4px var(--asst-glanz);}
  html[data-theme="dark"] .asst-msg.user{background:var(--brand-soft);color:var(--ink);}
  .asst-msg.bot hr{border:0;border-top:1px solid var(--asst-kante);margin:6px 0;}
  .asst-msg.sensibel{background:var(--amber-soft);border:1px solid color-mix(in srgb,var(--amber) 45%,transparent);color:var(--amber-ink);}
  .asst-typing{align-self:flex-start;color:var(--muted);font-size:13px;padding:4px 6px;}
  /* DICHTER (v2.518.0). Befund Murat 28.08.2026: „o sorulari daha sik yap …
     cokta yer kapliyolar yani." Vier Karten mit 11-px-Polster, 1,5-px-Rand,
     34-px-Scheibe und 14-px-Radius fuellten das halbe Fenster - auf dem Handy
     blieb fuer die Antwort daneben kaum etwas uebrig. Es ist dieselbe Liste,
     nur ohne die Luft dazwischen: Polster, Abstaende, Randstaerke und das
     Icon-Plaettchen je eine Stufe kleiner, die Schrift bleibt lesbar. */
  /* UND SIE MUSS SELBST SCROLLEN KOENNEN (v2.518.0).
     Befund Murat 28.08.2026: „mobilde … icerideki kisimlari kaydiramiyorum."

     Die Ursache war eine Flexbox-Falle, keine fehlende Zeile Bedienlogik:
     ein Flex-Kind schrumpft NICHT unter seine Inhaltshoehe, solange es
     weder `overflow` noch `min-height:0` hat. `.asst-messages` scrollte
     deshalb (es hat `overflow-y:auto`), `.asst-quick` aber nicht - die
     Trefferliste wuchs, schob die Blasen nach oben und wurde unten vom
     `overflow:hidden` des Fensters abgeschnitten. Was abgeschnitten ist,
     kann man nicht erreichen: kein Balken, kein Wischen, kein Hinweis.

     Jetzt scrollt sie selbst und gibt die Bewegung nicht nach hinten ab. */
  .asst-quick{display:flex;flex-direction:column;gap:5px;padding:2px 12px 10px;
    background:var(--asst-hauch);
    flex:0 1 auto;min-height:0;overflow-y:auto;overscroll-behavior:contain;
    -webkit-overflow-scrolling:touch;}
  .asst-quick button{display:flex;align-items:center;gap:8px;width:100%;text-align:left;background:var(--card,#fff);border:1px solid var(--asst-kante);color:var(--ink,#1B2230);border-radius:11px;padding:7px 10px;font-size:13px;font-weight:600;cursor:pointer;font-family:inherit;transition:border-color .14s ease,background .14s ease,transform .12s ease;}
  .asst-quick button:hover{background:var(--brand-soft,#EEF1FB);border-color:var(--brand,#2E5BFF);}
  .asst-quick button:active{transform:scale(.985);}
  .asst-quick .asst-choice{gap:9px;}
  .asst-cico{width:27px;height:27px;border-radius:50%;background:var(--brand-soft,#E9EEFF);color:var(--brand,#2E5BFF);display:flex;align-items:center;justify-content:center;flex:none;}
  .asst-ctx{flex:1;min-width:0;display:flex;flex-direction:column;}
  .asst-ctx b{font-size:13px;font-weight:800;line-height:1.25;}
  .asst-ctx i{font-style:normal;font-size:11px;color:var(--muted);margin-top:0;line-height:1.3;}
  .asst-choice > svg{color:var(--muted);flex:none;}
  /* Schmale Zeile statt Karte: fuer Eintraege, die kein Vorhaben starten,
     sondern nur einen Blick oeffnen ("Meine Meldungen"). Ohne diesen zweiten
     Rang wirken alle Karten gleich wichtig - und genau das machte die Auswahl
     unuebersichtlich (Murat 15.08.2026: "bölümlerimi azaltsak"). */
  .asst-quick .asst-zeile{gap:8px;padding:6px 10px;border-style:dashed;background:transparent;
    font-size:12px;font-weight:700;color:var(--muted);}
  .asst-quick .asst-zeile:hover{background:var(--card);border-style:solid;color:var(--ink);}
  .asst-zeile .asst-cico{width:20px;height:20px;background:transparent;color:var(--muted);}
  .asst-zeile > span:nth-child(2){flex:1;min-width:0;}
  .asst-zeile > svg{color:var(--muted);flex:none;}

  /* ---- Gruppierte Trefferliste des Auflösers (v2.513.0) -----------------
     Die Antwort auf „Was gibt es zu Musik?" hat vier Schubladen: Aktionen,
     Unterrichtsfächer, vorhandene Materialien, Hilfe. Ohne Überschriften
     stünden sie als eine Wand gleich aussehender Karten da - und genau das
     macht die Auswahl unübersichtlich, dieselbe Beobachtung wie bei
     `.asst-zeile` weiter oben. */
  .asst-gruppe{display:flex;flex-direction:column;gap:5px;}
  .asst-gruppe + .asst-gruppe{margin-top:9px;}
  .asst-gtitel{font-size:10px;font-weight:700;letter-spacing:.06em;
    text-transform:uppercase;color:var(--muted);padding:1px 2px 0;}

  /* Ein gesperrter Treffer sieht anders aus, WEIL er anders ist: es gibt ihn,
     er lässt sich nur nicht öffnen. Er wird ruhiger, nicht rot - eine Warnfarbe
     hiesse „etwas ist kaputt", und kaputt ist nichts. */
  .asst-quick .asst-gesperrt{background:var(--surface-subtle,#F7F8FA);
    border-style:dashed;cursor:default;}
  .asst-quick .asst-gesperrt:hover{background:var(--surface-subtle,#F7F8FA);
    border-color:var(--line,#E4E7EE);}
  .asst-gesperrt .asst-cico{background:var(--amber-soft,#FFF4E2);
    color:var(--amber-ink,#8A5300);}

  /* „Weitere Ergebnisse (12)" ist eine ZWEITE ANFRAGE, kein Ausklappen -
     deshalb sieht es aus wie ein Nebenweg und nicht wie eine weitere Karte. */
  .asst-quick .asst-mehr{justify-content:center;background:transparent;
    border-style:dashed;color:var(--muted);font-size:12px;font-weight:600;
    padding:6px 10px;}
  .asst-quick .asst-mehr:hover{background:var(--card,#fff);border-style:solid;
    color:var(--ink,#1B2230);}
  .asst-quick .asst-mehr:disabled{opacity:.6;cursor:default;}
  .asst-zbadge{flex:none;min-width:18px;height:18px;padding:0 5px;border-radius:var(--r-pill);
    background:var(--brand);color:var(--on-brand);font-size:11px;font-weight:800;
    display:flex;align-items:center;justify-content:center;}
  /* ===== DER ASSISTENT ALS EIGENES FENSTER (v2.514.0) =====================
     Er lag als Bereich im Nachrichten-Screen und war damit an dessen Layout
     gebunden: oeffnen hiess, die Nachrichtenliste zu verdecken. Als eigenes
     Fenster ueber der Anwendung kann er ueberall aufgehen, ohne dass der
     Bildschirm darunter etwas davon merkt - das ist der ganze Zweck.

     KEIN position:fixed AUF DEM MASKOTTCHEN-KNOPF UND DEM FENSTER ZUGLEICH
     ohne gemeinsamen Bezug: beide haengen unten rechts, und die gemerkte
     Position des Knopfes verschiebt NUR den Knopf. Das Fenster bleibt, wo es
     ist - ein Fenster, das der Lehrkraft hinterherwandert, sucht man beim
     naechsten Mal. */
  /* HOEHE UEBER --vh100, NICHT UEBER 100vh: auf iOS ist 100vh die Hoehe OHNE
     die eingeblendeten Leisten, das Fenster ragte also unten heraus
     (ARCHITEKTUR.md §4b, qa/unit/test_viewport_hoehe.py).
     Farben und Erhebung kommen aus dem Woerterbuch OHNE Rueckfallwert: die
     Datei laedt design-tokens.css immer, und ein zweiter Farbwert daneben ist
     genau die Altlast, die der Grundstand zaehlt. */
  .asst-widget{position:fixed;right:20px;bottom:96px;z-index:1200;
    width:min(390px,calc(100vw - 32px));height:min(560px,calc(var(--vh100) - 140px));
    display:flex;flex-direction:column;overflow:hidden;
    --asst-hauch:color-mix(in srgb,var(--brand) 6%,var(--paper));
    --asst-kopf:color-mix(in srgb,var(--brand) 10%,var(--card));
    --asst-kante:color-mix(in srgb,var(--brand) 18%,var(--line));
    --asst-schatten:color-mix(in srgb,var(--brand) 14%,transparent);
    --asst-glanz:color-mix(in srgb,var(--brand) 60%,transparent);
    background:var(--card);border:1px solid var(--asst-kante);
    border-radius:18px;box-shadow:0 24px 54px -28px var(--asst-glanz),var(--e-3);}
  .asst-widget.hidden{display:none;}
  /* `position:relative` traegt Robis Farbreihe (.asst-farbwahl), die unter
     dem Kopf aufgeht (v2.911.0). */
  .asst-kopf{display:flex;align-items:center;gap:10px;flex:none;position:relative;
    padding:10px 12px;border-bottom:1px solid var(--asst-kante);
    background:linear-gradient(180deg,var(--asst-kopf),var(--card));}
  .asst-kopf-ava{width:32px;height:32px;border-radius:50%;flex:none;
    display:flex;align-items:center;justify-content:center;
    background:var(--brand-soft);color:var(--brand);}
  .asst-kopf-ava svg{width:19px;height:19px;}
  /* Mit der echten Figur braucht auch dieser Platz keine Flaeche mehr -
     dieselbe Ueberlegung wie beim Knopf in der Ecke. */
  .asst-kopf-ava.hat-figur{width:38px;height:38px;background:transparent;}
  .asst-kopf-ava.hat-figur svg{width:100%;height:100%;}
  .asst-kopf-ava .robi-kopf-figur{width:38px;height:38px;display:block;}
  .asst-kopf-tx{flex:1;min-width:0;display:flex;flex-direction:column;line-height:1.25;}
  .asst-kopf-tx b{font-size:var(--fs-sm);font-weight:800;}
  .asst-kopf-tx span{font-size:var(--fs-2xs);color:var(--muted);}
  .asst-schliessen{flex:none;width:36px;height:36px;border-radius:50%;
    border:none;background:color-mix(in srgb,var(--brand) 9%,var(--card));color:var(--ink);cursor:pointer;
    display:flex;align-items:center;justify-content:center;}
  .asst-schliessen:hover{background:color-mix(in srgb,var(--brand) 18%,var(--card));}
  /* DIE ZWEI ZEILEN FEHLTEN, UND DAMIT WAR DER KNOPF UNSICHTBAR.
     `pfSvg.x` bringt nur den Pfad mit; Strichfarbe und -staerke kommen sonst
     von `.pf-icobtn svg`, und diese Regel gilt hier nicht. Ohne sie zeichnet
     der Browser eine Flaeche ohne Inhalt in Schwarz und keinen Strich - der
     Knopf war da, liess sich anklicken und war vollstaendig durchsichtig.
     Auf dem Handy hiess das: das Fenster ging auf und nicht mehr zu. */
  .asst-schliessen svg{width:19px;height:19px;fill:none;stroke:currentColor;
    stroke-width:2;stroke-linecap:round;stroke-linejoin:round;}

  /* ---- Das Maskottchen: der EINE Eingang ---------------------------------
     Ein echter <button> in der Tabulator-Reihenfolge mit aria-label - das ist
     die Bedingung, unter der "Hilfe & Ideen" aus der Seitenleiste entfallen
     durfte. `touch-action:none`, weil der Knopf verschiebbar ist: sonst
     scrollt das Handy die Seite, statt die Figur zu bewegen. */
  /* ZWEI ZUSTAENDE, UND SIE SEHEN ABSICHTLICH VERSCHIEDEN AUS:
     OHNE Figur (Rueckfall-Icon, oder wenn jemand Bewegung abbestellt hat)
     braucht der Knopf eine Flaeche, sonst schwebt ein Strichsymbol ohne Halt
     ueber der Seite. MIT Figur ist dieselbe Flaeche eine Scheibe zu viel -
     die Figur bringt ihre eigene runde Form mit, und ein blauer Kreis
     dahinter liess sie aussehen wie ein Aufkleber auf einem Knopf. */
  .asst-mk{position:fixed;right:20px;bottom:24px;z-index:1201;
    width:56px;height:56px;border-radius:50%;border:none;cursor:pointer;
    display:flex;align-items:center;justify-content:center;touch-action:none;
    background:var(--brand);color:var(--card);box-shadow:var(--e-2);
    transition:transform .14s ease,box-shadow .14s ease;}
  .asst-mk.hidden{display:none;}
  .asst-mk:hover{transform:translateY(-2px);box-shadow:var(--e-3);}
  .asst-mk:active{transform:scale(.94);}
  .asst-mk svg{width:28px;height:28px;pointer-events:none;}

  /* Mit Figur: keine Flaeche, kein Schatten - und groesser, weil ein Gesicht
     mit Augen bei 56 px zu einem Fleck wird. Seit v2.962.2 noch ein Stueck
     (64 -> 76 px, Figur 100 -> 120 px): Kleidung, Herzen und die Boncuk-
     Augen brauchen den Platz (Murat 05.10.2026). Am Telefon bleibt es bei
     58/100 px - siehe die schmale Media-Regel weiter unten. */
  .asst-mk.hat-figur{width:76px;height:76px;background:transparent;
    box-shadow:none;overflow:visible;}
  .asst-mk.hat-figur:hover{box-shadow:none;transform:translateY(-3px);}

  /* DIE FIGUR DARF HINAUSRAGEN (v2.911.0: Leinwand aus robi-figur.js).
     Die Leinwand ist 100 px breit und 135 px hoch: unten das Quadrat der
     Figur, darueber Platz fuer aufsteigende Herzen und Sterne. Die Mitte des
     Quadrats sitzt auf der Mitte des Knopfes; der Knopf bleibt die
     Klickflaeche (`pointer-events:none` an der Leinwand). */
  .asst-mk-figur{position:absolute;left:50%;top:50%;width:120px;height:162px;
    transform:translate(-50%,-63%);pointer-events:none;}
  .asst-mk-ersatz{display:flex;align-items:center;justify-content:center;pointer-events:none;}

  /* Der Punkt fuer wartende Antworten - dieselbe Zahl wie im Briefkasten.
     Er sitzt am Rand des KNOPFES und nicht an der Figur: die bewegt sich,
     und ein mitspringender roter Punkt liest sich als Fehler. */
  .asst-mk-dot{position:absolute;top:6px;right:6px;width:11px;height:11px;
    border-radius:50%;background:var(--bad);border:2px solid var(--card);z-index:2;}
  .asst-mk.hat-figur .asst-mk-dot{top:10px;right:10px;}
  .asst-mk-dot[hidden]{display:none;}

  /* ---- SCHMALE SCHIRME: eine breite Flaeche von unten -------------------
     ALLES, WAS HIER STEHT, LEBT AUSSCHLIESSLICH IN DIESER MEDIA-REGEL.
     Tablet und Rechner werden nicht angefasst - dort war nichts kaputt, und
     dort arbeitet die Lehrkraft (CLAUDE.md: "schmal aendern heisst SCHMAL
     aendern"). Ein eigener Block statt eines Anhaengsels an einer der
     bestehenden `@media (max-width:640px)`-Regeln: die Datei hat mehrere
     davon, und wer die falsche erwischt, aendert etwas ganz anderes.

     Ein schwebendes Fenster von 390px hat auf einem Handy keinen Sinn - es
     waere fast der ganze Bildschirm, nur mit Rand drumherum. Also eine
     Flaeche, die von unten kommt, oben abgerundet, unten buendig.
     Die Ecken haengen bewusst NICHT an env(safe-area-inset-top): der Wert
     meldet in der PWA 0 und in der Store-Huelle 62, also zwei verschiedene
     Aussehen auf demselben Geraet (§4c 2.97.3). */
  @media (max-width:640px){
    /* 62 statt 78 Prozent: bei 78 blieb vom Bildschirm darunter nichts
       Erkennbares uebrig, und die Flaeche las sich wie eine eigene Seite,
       aus der man nicht mehr herauskommt. Man soll sehen, worueber man
       gerade fragt. */
    /* 56 statt urspruenglich 78 Prozent. Bei 78 blieb vom Bildschirm
       darunter nichts Erkennbares uebrig, und die Flaeche las sich wie eine
       eigene Seite, aus der man nicht mehr herauskommt - man soll sehen,
       worueber man gerade fragt, und dass die Anwendung noch da ist. */
    /* Solange das Blatt offen ist, gehoert die Bewegung IHM. Ohne diese
       Zeile fuhr die Seite darunter mit, sobald eine Liste im Fenster zu
       Ende war (v2.518.0) - siehe `overscroll-behavior` weiter oben, das
       allein reicht nicht, wenn der Finger neben einer scrollbaren Flaeche
       aufsetzt. Die Seite bleibt sichtbar, sie steht nur still. */
    body.asst-offen{overflow:hidden;}
    /* Und die Vorschlaege duerfen hoechstens die Haelfte nehmen: darunter
       muss die Antwort lesbar bleiben, auf die sie sich beziehen. */
    .asst-quick{max-height:46%;}
    .asst-widget{right:0;left:0;bottom:0;width:100%;
      height:calc(var(--vh100) * 0.56);
      border-radius:18px 18px 0 0;border-left:none;border-right:none;
      border-bottom:none;box-shadow:var(--e-3);}
    /* Am Handy ist der Schliessen-Knopf der auffaelligste Ausgang - er
       bekommt eine Flaeche, die man mit dem Daumen trifft. */
    .asst-widget .asst-schliessen{width:44px;height:44px;}
    .asst-widget .asst-schliessen svg{width:22px;height:22px;}
    /* Ein Griff oben an der Flaeche: er sagt ohne Worte, dass hier etwas
       ueber der Seite liegt und nicht die Seite selbst ist. */
    .asst-widget .asst-kopf{padding-top:14px;position:relative;}
    .asst-widget .asst-kopf::before{content:"";position:absolute;top:6px;
      left:50%;transform:translateX(-50%);width:38px;height:4px;
      border-radius:var(--r-pill);background:var(--line);}
    /* Kleiner gesetzt: auf einem Handy stehen in derselben Blase sonst nur
       wenige Woerter je Zeile, und die Flaeche wirkt voller als sie ist.
       Das EINGABEFELD bleibt bei 16px - alles darunter loest in iOS den
       automatischen Zoom aus, und dann springt die ganze Seite. */
    .asst-msg{font-size:12.5px;max-width:88%;padding:8px 11px;}
    .asst-quick button{font-size:12.5px;padding:6px 9px;}
    .asst-ctx b{font-size:12.5px;}
    .asst-ctx i{font-size:11px;}
    .asst-kopf-tx b{font-size:13px;}
    /* Der Knopf rutscht ueber den Home-Indicator, nicht darunter. */
    .asst-mk{width:52px;height:52px;
      bottom:calc(16px + env(safe-area-inset-bottom));}
    .asst-mk svg{width:26px;height:26px;}
    .asst-mk.hat-figur{width:58px;height:58px;}
    /* Die Figur bleibt am Telefon so gross wie vor v2.962.2 - dort ist der
       Platz knapp, und die Leinwand (120 px gerechnet) wird nur verkleinert. */
    .asst-mk-figur{width:100px;height:135px;}
    /* Solange die Flaeche offen ist, waere die Figur davor nur im Weg -
       geschlossen wird oben im Kopf. */
    body.asst-offen .asst-mk{display:none;}
  }

  .asst-input{display:flex;gap:8px;padding:11px;border-top:1px solid var(--asst-kante);flex:none;background:var(--card,#fff);}
  .asst-input input{flex:1;border:1.5px solid var(--asst-kante);border-radius:22px;padding:9px 14px;font:inherit;font-size:13.5px;outline:none;
    background:color-mix(in srgb,var(--brand) 3%,var(--card));color:var(--ink);transition:border-color .15s ease,box-shadow .15s ease;}
  .asst-input input:focus{border-color:var(--brand);box-shadow:0 0 0 3px color-mix(in srgb,var(--brand) 18%,transparent);}
  .asst-input button{background:var(--brand,#2E5BFF);color:#fff;border:none;width:40px;height:40px;border-radius:50%;cursor:pointer;flex:none;display:flex;align-items:center;justify-content:center;transition:background .15s ease,transform .12s ease;}
  .asst-input button:hover{background:var(--brand-dk,#1E3FCC);}
  .asst-input button:active{transform:scale(.9);}
  /* DER SENDEKNOPF IST DAS PAPIERFLUGZEUG SELBST (v2.518.0).
     Wunsch Murat 28.08.2026: „gönderme tusunu o ucak yap rengi siyah olsun
     büyüt biraz siritmasin kücüklügü ayrica arkasinda yuvarlak maviyi
     kaldir." Die blaue Scheibe war eine 40-px-Flaeche um ein 17-px-Zeichen -
     dadurch sah der Knopf kleiner aus, als er ist. Ohne sie darf das Zeichen
     die Flaeche nehmen, und es bleibt genau EIN Blau im Fenster (der Rahmen
     des Eingabefeldes im Fokus) statt zwei nebeneinander.
     NUR #asst-send: der Klammer-Knopf daneben hat seine eigene Regel
     (.asst-attach, mit !important) und bleibt, wie er ist. */
  #asst-send{background:transparent;color:var(--ink);width:42px;height:42px;
    transition:color .15s ease,transform .12s ease;}
  #asst-send:hover{background:transparent;transform:translate(1px,-1px);}
  #asst-send:active{transform:scale(.9);}
  #asst-send svg{width:24px;height:24px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;}
  .asst-input button:disabled{opacity:.5;cursor:default;}
  .asst-attach{background:none !important;border:1.5px solid var(--line) !important;color:var(--muted) !important;
    width:40px;height:40px;border-radius:50% !important;cursor:pointer;flex:none;display:flex;align-items:center;justify-content:center;padding:0;transition:border-color .12s,color .12s;}
  .asst-attach:hover{border-color:var(--brand) !important;color:var(--brand) !important;}
  .asst-attach svg{width:18px;height:18px;}
  .asst-shot-preview{display:flex;align-items:center;gap:9px;padding:8px 11px;border-top:1px solid var(--line);background:var(--paper,#F5F7FB);flex:none;}
  .asst-shot-preview img{width:46px;height:46px;object-fit:cover;border-radius:8px;border:1px solid var(--line);}
  .asst-shot-preview span{font-size:12.5px;color:var(--muted);font-weight:600;flex:1;}
  .asst-shot-preview button{background:none;border:none;color:var(--muted);font-size:16px;cursor:pointer;width:26px;height:26px;border-radius:50%;flex:none;}
  .asst-shot-preview button:hover{background:rgba(127,127,127,.12);color:var(--bad);}
  .nav-dd{position:relative;flex:1;min-width:0;display:flex;}
  .nav-dd > button{width:100%;border:none;background:transparent;font-family:inherit;font-weight:700;font-size:12px;color:var(--muted);cursor:pointer;padding:9px 4px;border-radius:9px;display:flex;align-items:center;justify-content:center;gap:4px;white-space:nowrap;}
  .nav-dd > button.on{background:#fff;color:var(--ink);box-shadow:0 1px 3px rgba(0,0,0,.08);}
  .nav-dd > button svg{width:15px;height:15px;flex:none;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;}
  .nav-dd > button .dd-caret{width:11px;height:11px;}
  .nav-dd-menu{position:absolute;top:calc(100% + 6px);left:50%;transform:translateX(-50%);z-index:60;min-width:210px;padding:6px;background:var(--card);border:1px solid var(--line);border-radius:12px;box-shadow:0 12px 30px rgba(27,34,48,0.18);display:none;}
  .nav-dd-menu.open{display:block;}
  .nav-dd-menu button{display:flex;align-items:center;gap:10px;width:100%;border:none;background:transparent;cursor:pointer;font-family:inherit;font-size:14px;font-weight:600;color:var(--ink);text-align:left;padding:10px 11px;border-radius:8px;white-space:nowrap;}
  .nav-dd-menu button:hover{background:rgba(127,127,127,0.10);}
  .nav-dd-menu button svg{width:17px;height:17px;flex:none;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;}
  /* Apple-Style Pull-to-Refresh: weicher Kreisbogen, der sich beim Ziehen füllt */
  /* ===== LADEANZEIGE IM SYSTEM-STIL (v2.42.8) ==========================
     Vorher: ein dicker Ring, der sich blau fuellte und beim Ausloesen GRUEN
     wurde. Auf dem Geraet sah das wie ein Fortschrittsbalken aus einer anderen
     App aus - Apple faerbt hier nichts ein, sondern zeigt den bekannten Kranz
     aus 12 Speichen in neutralem Grau (Rueckmeldung 2026-07-26).
     Beim Ziehen erscheinen die Speichen der Reihe nach (Fortschritt), beim
     Laden laufen sie im Kreis heller/dunkler - genau das Systemverhalten.
     Farbe: #8E8E93 = iOS-Systemgrau, bewusst NICHT var(--brand). */
  #ptr-indicator{position:fixed;top:0;left:50%;width:34px;height:34px;z-index:9999;opacity:0;pointer-events:none;transform:translate(-50%,-46px);transition:opacity .18s ease;}
  #ptr-indicator.visible{opacity:1;}
  #ptr-indicator svg{width:34px;height:34px;display:block;}
  #ptr-indicator .ptr-sp{fill:#8E8E93;opacity:0;transition:opacity .08s linear;}
  #ptr-indicator.spin .ptr-sp{opacity:1;animation:ptr-fade 1.05s linear infinite;transition:none;}
  @keyframes ptr-fade{0%{opacity:1;}100%{opacity:.12;}}
  .modal-overlay{position:fixed;inset:0;background:rgba(20,28,42,.45);z-index:10000;display:flex;align-items:center;justify-content:center;padding:18px;}
  /* Defektes LaTeX vom Modell NICHT als rote "Math input error"-Box zeigen.
     Wir blenden die Fehlerausgabe komplett aus (die Luecke bleibt einfach leer). */
  mjx-merror, .MathJax_Error, mjx-merror>*{ color:transparent!important; background:none!important;
    border:none!important; box-shadow:none!important; font-size:0!important; }
  .modal-overlay.hidden{display:none;}
  .modal-card{background:#fff;border-radius:18px;width:100%;max-width:440px;max-height:82vh;overflow-y:auto;padding:20px;box-shadow:0 12px 40px rgba(0,0,0,.25);animation:modalpop .16s ease;}
  @keyframes modalpop{from{transform:scale(.96);opacity:.6;}to{transform:scale(1);opacity:1;}}
  .modal-head{display:flex;align-items:center;justify-content:space-between;gap:10px;border-bottom:1px solid var(--line);padding-bottom:12px;margin-bottom:12px;}
  .modal-head h3{margin:0;font-size:18px;}
  .modal-x{background:none;border:none;font-size:26px;line-height:1;color:var(--muted);cursor:pointer;padding:0 4px;}
  .am-cls-head{display:flex;align-items:center;gap:9px;cursor:pointer;padding:12px;border:1px solid var(--line);border-radius:11px;margin-bottom:8px;font-weight:700;user-select:none;}
  .am-cls-head:hover{background:var(--paper);}
  .am-cls-body{margin:-4px 0 10px;padding-left:6px;}
  .am-stud{display:block;width:100%;text-align:left;background:var(--paper);border:1px solid var(--line);border-radius:9px;padding:10px 12px;margin-bottom:6px;font:inherit;font-weight:600;cursor:pointer;}
  .am-stud:hover{background:#E8EEFF;border-color:var(--brand);}
  .am-stud-new{display:flex;align-items:center;color:var(--brand);font-weight:700;background:#EEF3FF;border:1px dashed var(--brand);}
  .am-stud-new:hover{background:#E0E9FF;}
  /* ===== Nicht-zugeordnet Popup (Klassenbuch) ============================
     BREITER UND ALS LISTE seit v2.321.0. Der Anlass ist die erste Stunde mit
     einer Klasse: alle Kinder tippen ihren Namen frei ins Quiz, und am Ende
     sollen sie gemeinsam in eine Klasse. Bei 25 Kindern einzeln „Zuordnen"
     zu tippen dauert zu lange, um es vorzufuehren.

     Die Zeilen sind ENGER als vorher (Kasten mit Rand -> Zeile mit
     Trennlinie): eine Liste von zwanzig gerahmten Kaesten ist ein Stapel,
     keine Liste, und man sieht drei davon gleichzeitig. */
  /* BREITE: 760px statt 640 (Wunsch Murat 16.08.2026). Bei 640 passten die
     drei Aktionen nicht neben „Alle auswählen" und brachen in ZWEI weitere
     Reihen um - aus einer Menüleiste wurde ein Block. Die Breite richtet
     sich also nach der Leiste, nicht nach der Liste. */
  .kbu-card{max-width:760px;}
  /* EINE REIHE, KEIN KASTEN (Wunsch Murat 16.08.2026: „tek sira olmali menü
     … menü tarzinde yapsayfin orayi"). Vorher lag die Leiste auf einer
     grauen Fläche mit runden Ecken - das liest sich als eigener Bereich mit
     Inhalt, nicht als Werkzeugleiste über einer Liste. Jetzt trägt sie nur
     eine Trennlinie nach unten, wie ein Menü über seinem Inhalt.
     `nowrap`: die Aktionen bleiben in der Reihe. Wird es doch zu eng, greift
     der schmale Block weiter unten - dort ist Umbrechen gewollt. */
  .kbu-leiste{display:flex;align-items:center;gap:var(--s-3);flex-wrap:nowrap;
    padding:0 var(--s-1) var(--s-2);margin-bottom:var(--s-3);
    border-bottom:1px solid var(--line);}
  .kbu-alle{display:flex;align-items:center;gap:var(--s-2);cursor:pointer;
    font-size:var(--fs-sm);font-weight:700;color:var(--ink);white-space:nowrap;}
  .kbu-alle input{width:17px;height:17px;cursor:pointer;accent-color:var(--brand);}
  .kbu-leiste-akt{display:flex;gap:var(--s-2);flex-wrap:nowrap;margin-left:auto;}
  .kbu-akt{display:inline-flex;align-items:center;gap:var(--s-2);white-space:nowrap;}
  .kbu-akt svg{width:15px;height:15px;fill:none;stroke:currentColor;stroke-width:2;
    stroke-linecap:round;stroke-linejoin:round;}
  /* Ausgeschaltet statt ausgeblendet: die Leiste soll ihre Hoehe behalten,
     sonst verspringt die Liste darunter beim ersten Haken. */
  .kbu-akt[disabled]{opacity:.4;cursor:default;}
  /* Die Auswahl sieht aus wie die Knoepfe daneben - sie tut ja dasselbe. */
  /* `max-width` und `flex:none`: eine <select> in einem Flex-Container
     nimmt sich sonst den ganzen Rest, und die drei Aktionen brechen in
     drei Zeilen um (im Browser gesehen). */
  .kbu-sel{flex:0 0 auto;max-width:200px;appearance:none;-webkit-appearance:none;padding-right:26px;
    background-image:linear-gradient(45deg,transparent 50%,currentColor 50%),
      linear-gradient(135deg,currentColor 50%,transparent 50%);
    background-position:calc(100% - 14px) 50%, calc(100% - 9px) 50%;
    background-size:5px 5px, 5px 5px; background-repeat:no-repeat;}
  .kbu-akt:not([disabled]){border-color:var(--brand);color:var(--brand);}
  .kbu-akt-weg:not([disabled]){border-color:var(--bad);color:var(--bad);}
  .kbu-liste{max-height:min(52vh,420px);overflow-y:auto;
    border:1px solid var(--line);border-radius:var(--r-card);}
  .kbu-item{display:flex;align-items:center;gap:var(--s-3);padding:var(--s-3);
    border-bottom:1px solid var(--line);background:var(--card);transition:background .12s ease;}
  .kbu-item:last-child{border-bottom:none;}
  .kbu-item:hover{background:var(--paper);}
  .kbu-item.gewaehlt{background:var(--brand-soft);}
  .kbu-pick{width:17px;height:17px;flex:none;cursor:pointer;accent-color:var(--brand);}
  .kbu-name{flex:1 1 auto;min-width:0;}
  .kbu-name-txt{font-weight:700;font-size:var(--fs-md);overflow:hidden;
    text-overflow:ellipsis;white-space:nowrap;}
  .kbu-name-kl{color:var(--muted);font-weight:500;font-size:var(--fs-sm);}
  /* SCHMAL: die Zeile hat sechs Dinge nebeneinander (Haken, Kreis, Name,
     Zahlen, Zuordnen, Papierkorb). Bei 375px blieben vom Namen zwei
     Buchstaben ("M..") uebrig - im Browser gesehen. Der Name ist aber das
     EINZIGE, woran die Lehrkraft das Kind erkennt.
     Deshalb bricht die Zeile hier um: Haken, Kreis und Name in der ersten
     Reihe, Zahlen und Knoepfe in der zweiten. Die Sammelleiste ordnet sich
     ebenfalls untereinander - drei Knoepfe nebeneinander passen nicht. */
  @media (max-width:560px){
    .kbu-item{flex-wrap:wrap;row-gap:var(--s-2);}
    .kbu-name{flex:1 1 100%;order:3;}
    .kbu-item .mini-btn{order:4;margin-left:auto;}
    .kbu-item .kbu-del{order:5;}
    .kbu-liste{max-height:none;}
    /* Die eine Reihe von oben gilt fuer den Schreibtisch. Schmal ist sie
       nicht zu halten: drei Aktionen und ein Haken nebeneinander waeren bei
       375px vier Wortreste. Hier ist Umbrechen also gewollt - deshalb wird
       `nowrap` genau hier wieder aufgehoben und nirgends sonst. */
    .kbu-leiste{flex-wrap:wrap;row-gap:var(--s-2);}
    .kbu-leiste-akt{margin-left:0;width:100%;flex-wrap:wrap;}
    .kbu-leiste-akt .kbu-akt{flex:1 1 auto;justify-content:center;}
  }
  .kbu-ava{flex:none;width:38px;height:38px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-weight:800;font-size:var(--fs-md);color:var(--card);}
  .kbu-meta{font-size:var(--fs-xs);color:var(--muted);margin-top:2px;display:flex;gap:var(--s-3);flex-wrap:wrap;}
  .kbu-del{appearance:none;border:none;background:none;cursor:pointer;padding:var(--s-2);border-radius:var(--r-control);color:var(--muted);display:flex;}
  .kbu-del:hover{background:rgba(220,60,60,.12);color:var(--bad);}
  .authbar a{color:var(--brand);text-decoration:none;cursor:pointer;}
  .authbar a:hover{text-decoration:underline;}
  .authbar span{color:var(--muted);}
  .dash-row{display:flex;align-items:center;gap:12px;padding:14px 0;border-top:1px solid var(--line);flex-wrap:wrap;}
  .dash-row:first-of-type{border-top:none;}
  .dash-info{flex:1;min-width:170px;}
  .dash-title{font-weight:700;font-size:15px;word-break:break-word;}
  .dash-meta{font-size:12.5px;color:var(--muted);}
  .dash-actions{display:flex;gap:8px;flex-wrap:wrap;}
  .kb-row{display:flex;align-items:center;gap:var(--s-4);padding:var(--s-4) var(--s-4);border:1px solid var(--line);border-radius:var(--r-card);margin-bottom:var(--s-3);cursor:pointer;transition:background .12s,border-color .12s;}
  .kb-row:hover{background:var(--paper);border-color:var(--brand);}
  .kb-ava{width:50px;height:50px;border-radius:50%;display:flex;align-items:center;justify-content:center;color:var(--card);font-weight:800;font-size:var(--fs-lg);flex:0 0 auto;}
  .kb-attempt{display:flex;align-items:center;gap:var(--s-3);padding:var(--s-2) var(--s-3);background:var(--paper);border-radius:var(--r-control);margin-bottom:var(--s-1);}
  /* Ergebnis aus einer Übung (v2.882.0): steht an der Stelle der Note und
     sagt, dass es in keine zählt. Nur Variablen. */
  .kb-uebung-tag{display:inline-block;background:var(--line);color:var(--muted);font-weight:800;border-radius:var(--r-pill);padding:2px var(--s-2);font-size:var(--fs-xs);white-space:nowrap;}
  .mini-btn{appearance:none;border:1.5px solid var(--line);background:#fff;color:var(--brand);font-family:inherit;font-weight:700;font-size:12.5px;padding:8px 12px;border-radius:10px;cursor:pointer;}
  .mini-btn:hover{border-color:var(--brand);background:var(--brand-soft);}
  /* Der Weg zu einer neuen Klasse, direkt im Klassen-Feld der QR-Seite
     (v2.471.0). Das Mass steht HIER und nicht als style="" am Knopf:
     docs/DESIGN_SYSTEM.md - und der Waechter zaehlt Inline-Stile. */
  #share-class-neu{margin-top:8px;}
  .mini-btn.danger{color:var(--bad);}
  .mini-btn.danger:hover{border-color:var(--bad);background:var(--bad-soft);}
  /* Quadratischer Icon-Button (z. B. + Neues Quiz) */
  .iconbtn-square{appearance:none;flex:none;width:42px;height:42px;border:1.5px solid var(--line);background:#fff;color:var(--brand);border-radius:12px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:border-color .12s,background .12s;}
  .iconbtn-square:hover{border-color:var(--brand);background:var(--brand-soft);}
  .iconbtn-square svg{width:22px;height:22px;fill:none;stroke:currentColor;stroke-width:2.2;stroke-linecap:round;stroke-linejoin:round;}
  /* "Neue Aufgabe"-Button im Aufgaben-Kopf: kompakt, rechtsbündig, mit Label */
  .dash-new-btn{appearance:none;flex:none;display:inline-flex;align-items:center;gap:7px;padding:9px 14px;border:1.5px solid var(--brand);background:var(--brand);color:#fff;border-radius:11px;font-family:inherit;font-weight:700;font-size:13.5px;cursor:pointer;transition:transform .08s ease,filter .15s ease;}
  .dash-new-btn:hover{filter:brightness(1.05);}
  .dash-new-btn:active{transform:scale(.97);}
  .dash-new-btn svg{width:17px;height:17px;fill:none;stroke:currentColor;stroke-width:2.4;stroke-linecap:round;stroke-linejoin:round;}
  @media (max-width:380px){ .dash-new-btn span{display:none;} .dash-new-btn{padding:9px 11px;} }
  /* ===== AUFGABEN-TOOLBAR: alles in einer Zeile (Nutzung · Suche · +) ===== */
  .dash-toolbar{display:flex;align-items:center;gap:9px;margin-top:12px;}
  .usage-mini{flex:none;display:inline-flex;align-items:center;gap:7px;padding:8px 12px;border-radius:11px;
    background:linear-gradient(180deg,var(--brand-soft),var(--card));border:1px solid var(--line);
    font-size:12.5px;font-weight:800;color:var(--ink);white-space:nowrap;cursor:default;}
  .usage-mini .um-dot{width:7px;height:7px;border-radius:50%;background:var(--brand);flex:none;}
  .usage-mini .um-val{color:var(--muted);font-weight:700;}
  .usage-mini.um-clickable{cursor:pointer;transition:border-color .12s;}
  .usage-mini.um-clickable:hover{border-color:var(--brand);}
  /* Die Suche ist auf JEDER Breite ein Lupensymbol (2.91.0). Bis dahin war
     sie am Desktop das breiteste Element der Zeile (~300px) und zugleich das
     am seltensten benutzte - breit war sie nur, weil der "Neu"-Knopf darin
     sass. Seit der eigenstaendig davorsteht, gibt es keinen Grund mehr dafuer;
     der frei gewordene Platz traegt jetzt den Klassen-Filter.
     Ein Tipp setzt `such-offen` auf die Leiste (dashSucheAuf): dann blendet
     die Suche alles andere aus und nimmt die ganze Zeile - kein Umbruch,
     keine Sprungstelle. */
  .dash-search-inline{flex:none;width:40px;min-width:0;display:flex;align-items:center;
    justify-content:center;gap:7px;padding:0;height:40px;overflow:hidden;
    border:1.5px solid var(--line);border-radius:11px;background:var(--card);}
  .dash-search-inline:hover{border-color:var(--brand);}
  .dash-search-inline input,.dash-search-inline .dsi-clear{display:none;}
  .dash-toolbar.such-offen .dtb-drop,
  .dash-toolbar.such-offen .dtb-seg,
  .dash-toolbar.such-offen .dtb-zone-mob,
  .dash-toolbar.such-offen .dtb-neu{display:none;}
  .dash-toolbar.such-offen .dash-search-inline{flex:1;width:auto;padding:0 10px;
    justify-content:flex-start;}
  .dash-toolbar.such-offen .dash-search-inline input{display:block;}
  /* Das Kreuz ist da, SOLANGE die Suche offen ist - auch bei leerem Feld.
     Vorher haing es an "hat schon jemand etwas eingegeben" (JS setzte
     style.display), und bei leerem Feld gab es damit keinen Weg zurueck. */
  .dash-toolbar.such-offen .dash-search-inline .dsi-clear{display:flex;
    align-items:center;justify-content:center;width:26px;height:26px;border-radius:50%;}
  .dash-toolbar.such-offen .dash-search-inline .dsi-clear:hover{background:var(--paper);color:var(--ink);}
  /* Eingeklappt, aber es wird gesucht: die Lupe traegt die Markenfarbe.
     Sonst filtert die Liste, ohne dass man sieht warum - der schlimmste
     Zustand einer Suche, die sich wegklappen laesst. */
  .dash-search-inline.hat-text{border-color:var(--brand);background:var(--brand-soft);}
  .dash-search-inline.hat-text .dsi-ico{stroke:var(--brand-dk,var(--brand));}
  /* "Neu" als eigener Knopf ganz vorn - auf jeder Breite derselbe Ort und
     dieselbe Form. Es ist die einzige HANDLUNG dieser Zeile; alles andere
     filtert nur, deshalb steht es abgesetzt und gefuellt. */
  .dtb-neu{flex:none;width:40px;height:40px;display:inline-flex;align-items:center;
    justify-content:center;border-radius:12px;cursor:pointer;padding:0;font:inherit;
    transition:box-shadow .15s,transform .08s,background .15s;}
  .dtb-neu svg{width:20px;height:20px;fill:none;stroke:currentColor;stroke-width:2.8;
    stroke-linecap:round;stroke-linejoin:round;}
  .dtb-neu:active{transform:scale(.95);}
  .dash-search-inline .dsi-ico{width:18px;height:18px;flex:none;fill:none;stroke:var(--ink);stroke-width:2;stroke-linecap:round;stroke-linejoin:round;}
  .dash-toolbar.such-offen .dash-search-inline .dsi-ico{width:16px;height:16px;stroke:var(--muted);}
  .dash-search-inline input{flex:1;min-width:0;border:none;background:transparent;font:inherit;font-size:14px;color:var(--text);outline:none;}
  .dash-search-inline .dsi-clear{display:none;border:0;background:transparent;font-size:18px;line-height:1;color:var(--muted);cursor:pointer;padding:2px 4px;flex:none;}
  .dash-plus{flex:none;width:40px;height:40px;border:1.5px solid var(--brand);background:var(--brand);color:#fff;
    border-radius:11px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:filter .15s,transform .08s;}
  .dash-plus:hover{filter:brightness(1.06);}
  .dash-plus:active{transform:scale(.95);}
  .dash-plus svg{width:20px;height:20px;fill:none;stroke:currentColor;stroke-width:2.6;stroke-linecap:round;stroke-linejoin:round;}
  @media (max-width:420px){ .usage-mini .um-label{display:none;} .usage-mini{padding:8px 10px;} }

  /* ===== AUFGABEN-KOPFZEILE (2.82.0) =====================================
     WIE ES FUNKTIONIERT: eine Zeile mit vier Gruppen - Fach-Auswahl,
     Thema-Auswahl, Suchfeld mit eingebautem "Neu", und rechts die Ansicht
     (Aktiv / Archiv / Papierkorb). Gebaut wird sie in dashToolbar()
     (static/js/index-app.js), die Panels haengen an .dtb-drop.
     WARUM Auswahlfelder statt der frueheren Kachelgitter: ein Fach hat
     unbegrenzt viele Themen. Das Kachelgitter wuchs waagerecht, wurde am
     rechten Rand abgeschnitten und musste per fitThemaText je Kachel anders
     gross geschrieben werden - nebeneinander stehende Kacheln in
     verschiedenen Schriftgroessen lesen sich wie ein Fehler. Ein Auswahlfeld
     ist bei 15 wie bei 60 Themen exakt gleich hoch.
     ACHTUNG: fitThemaText und .dft-tile bleiben im Code - die Boerse und die
     Kurse benutzen sie weiterhin. Nur die Aufgabenseite nicht mehr. */
  /* Die Kopfzeile bleibt beim Scrollen stehen (2.83.0, Wunsch Murat 31.07.):
     sie ist die einzige Steuerung der Seite - wer bei Aufgabe 30 das Fach
     wechseln will, soll nicht erst nach oben zurueckrollen muessen. `sticky`
     statt `fixed`: fixed nimmt das Element aus dem Fluss, dann springt die
     Liste beim Anheften um die Hoehe der Leiste nach oben. */
  .dash-toolbar{position:sticky;top:0;z-index:50;background:var(--card);
    padding:10px 0;margin-top:2px;}
  .dash-toolbar::after{content:"";position:absolute;left:0;right:0;bottom:0;height:1px;
    background:var(--line);opacity:0;transition:opacity .15s;}
  .dash-toolbar.haftet::after{opacity:1;}
  .dtb-drop{position:relative;flex:none;}
  .dtb-btn{appearance:none;display:inline-flex;align-items:center;gap:7px;height:40px;padding:0 12px;
    border:1.5px solid var(--line);border-radius:11px;background:var(--card);color:var(--ink);
    font:inherit;font-size:13.5px;font-weight:600;cursor:pointer;white-space:nowrap;max-width:210px;
    transition:border-color .12s;}
  .dtb-btn:hover{border-color:var(--brand);}
  /* Waehrend der Suche treten die Filter zur Seite - sie bleiben klickbar
     (ein Klick beendet die Suche), sehen aber nicht mehr nach "gilt gerade"
     aus. Ohne dieses Zeichen stuende unter "Mathematik" eine Biologie-Aufgabe,
     ohne dass irgendetwas den Grund verraet. */
  .dtb-btn.aus{opacity:.45;border-style:dashed;}
  .dtb-btn.aus:hover{opacity:.75;}
  /* Trefferzeile der Suche: sie ist der einzige Ort, an dem steht, dass
     gerade ueber alle Faecher gesucht wird. */
  #dash-subtitle{font-size:12.5px;color:var(--muted);font-weight:600;margin:10px 2px 0;}
  .dtb-btn .dtb-lbl{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
  /* Zwei Beschriftungen, eine sichtbar. GRUNDREGEL (Tablet/Computer): der
     lange, echte Wert. Auf dem Telefon tauscht der 640px-Block sie gegen den
     Kategorienamen („Fach", „Thema") - siehe dort. */
  .dtb-lang{display:inline;}
  .dtb-kurz{display:none;}
  .dtb-btn .dtb-cnt{color:var(--muted);font-weight:700;flex:none;}
  .dtb-btn svg{width:15px;height:15px;flex:none;fill:none;stroke:currentColor;stroke-width:2.2;
    stroke-linecap:round;stroke-linejoin:round;transition:transform .15s;}
  .dtb-btn.offen svg.dtb-chev{transform:rotate(180deg);}
  .dtb-panel{display:none;position:absolute;top:46px;left:0;z-index:60;width:250px;padding:6px;
    background:var(--card);border:1.5px solid var(--line);border-radius:13px;
    box-shadow:0 10px 30px rgba(0,0,0,.13);}
  .dtb-panel.offen{display:block;}
  .dtb-panel-wide{width:284px;}
  /* Klassenstufen sind kurz und wenige - ein schmales Panel reicht, ein
     breites saehe leer aus. */
  .dtb-panel-klasse{width:186px;}
  .dtb-such{width:100%;height:34px;padding:0 10px;margin-bottom:6px;border:1.5px solid var(--line);
    border-radius:9px;background:var(--paper);font:inherit;font-size:13.5px;color:var(--ink);outline:none;}
  .dtb-such:focus{border-color:var(--brand);}
  .dtb-liste{max-height:262px;overflow-y:auto;}
  .dtb-item{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:8px 10px;
    border-radius:9px;font-size:13.5px;cursor:pointer;color:var(--ink);}
  .dtb-item:hover{background:var(--paper);}
  .dtb-item.sel{background:var(--brand-soft);color:var(--brand-dk);font-weight:700;}
  .dtb-item .dtb-nm{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0;}
  .dtb-item .dtb-n{color:var(--muted);font-weight:700;flex:none;font-size:12.5px;}
  .dtb-item .dtb-stift{opacity:0;flex:none;width:15px;height:15px;fill:none;stroke:var(--muted);
    stroke-width:2;stroke-linecap:round;stroke-linejoin:round;}
  .dtb-item:hover .dtb-stift{opacity:.8;}
  /* Trennt die festen Oberthemen von dem, was jemand selbst geschrieben hat.
     Ohne diese Zeile stuenden beide gemischt untereinander - dann ist der
     Unterschied unsichtbar, und der Katalog haette keinen Sinn. */
  .dtb-grp{font-size:10.5px;font-weight:800;color:var(--muted);padding:10px 10px 4px;
    margin-top:4px;border-top:1px solid var(--line);}
  .dtb-fuss{margin-top:6px;padding-top:6px;border-top:1px solid var(--line);}
  .dtb-fuss .dtb-item{color:var(--muted);font-weight:600;}
  /* Suchfeld: "Neu" sitzt IM Feld am rechten Rand (statt als eigener Knopf
     daneben) - eine Gruppe weniger in einer ohnehin vollen Zeile. */
  /* Glas-Optik (2.83.0): halbdurchsichtiger Verlauf + Unschaerfe dahinter,
     eine helle Innenkante oben und ein farbiger Schatten darunter. Das ist
     KEINE Dekoration um ihrer selbst willen - die beiden wichtigsten Knoepfe
     der Seite ("Neu" und "Teilen") heben sich damit von den grauen
     Umrandungen ringsum ab, ohne lauter zu werden. `backdrop-filter` faellt
     auf aelteren Browsern still weg; dann bleibt der Verlauf, und der traegt
     allein. */
  /* --flaeche-akzent wird von applyShellFarbe() gesetzt und ist die GESAETTIGTE
     Fassung der gewaehlten Flaechenfarbe (gleicher Farbton, dunkel genug fuer
     weisse Schrift). Ohne Wahl bleibt es der Markenton. So passen die Knoepfe
     zur Umgebung, ohne dass irgendwo eine zweite Farbe gepflegt werden muss.
     Der Verlauf ist eine WEISSE Aufhellung UEBER der Vollfarbe - dadurch
     funktioniert er mit jedem Farbton, ohne dass man je Farbe ein eigenes
     rgba() braeuchte. */
  .ss-glas{background:linear-gradient(180deg,rgba(255,255,255,.22),rgba(255,255,255,0)),
      var(--flaeche-akzent,var(--brand));
    border:1px solid rgba(255,255,255,.30);color:#fff;
    -webkit-backdrop-filter:blur(10px) saturate(1.5);backdrop-filter:blur(10px) saturate(1.5);
    box-shadow:inset 0 1px 0 rgba(255,255,255,.38),0 4px 14px rgba(0,0,0,.14);}
  .ss-glas:hover{background:linear-gradient(180deg,rgba(255,255,255,.32),rgba(255,255,255,.04)),
      var(--flaeche-akzent,var(--brand));
    box-shadow:inset 0 1px 0 rgba(255,255,255,.45),0 6px 18px rgba(0,0,0,.18);}
  .ss-glas:active{transform:scale(.97);}
  /* Ansicht-Umschalter. Archiv und Papierkorb sind seit 2.82.0 KEINE eigenen
     Seiten mehr, sondern derselbe Bildschirm mit einer anderen Menge - deshalb
     ein Segment und kein Link nach unten. */
  /* `margin-left:auto` ist die Federung der Zeile: es sammelt den freien
     Platz VOR dem Segment. Seit die Suche ueberall ein 40px-Symbol ist, gibt
     es kein dehnbares Element mehr - ohne diese Zeile klumpt alles links und
     rechts bleibt eine leere Flaeche. Ein automatischer Rand VERTEILT nur den
     Rest; `flex-grow` an einem Element mit eigener Inhaltsbreite wuerde die
     Zeile stattdessen aufblaehen und den Nachbarn Breite wegnehmen (der
     Fehler aus 2.90.2). */
  .dtb-seg{flex:none;margin-left:auto;display:flex;gap:2px;padding:2px;border:1.5px solid var(--line);
    border-radius:11px;background:var(--paper);}
  .dtb-seg button{appearance:none;display:inline-flex;align-items:center;gap:6px;height:32px;padding:0 11px;
    border:0;background:transparent;border-radius:8px;font:inherit;font-size:12.5px;font-weight:600;
    color:var(--muted);cursor:pointer;white-space:nowrap;transition:background .12s,color .12s;}
  .dtb-seg button:hover{color:var(--ink);}
  /* Rueckmeldung Murat 31.07.2026: "anlasilmiyor neyin aktif oldugu". Ein
     zarter Farbton reicht nicht, wenn drei Knoepfe nebeneinander stehen und
     zwei davon auch noch Symbole tragen. Die aktive Wahl ist jetzt GEFUELLT -
     derselbe Unterschied wie zwischen Papier und Stift, nicht zwei Grautoene. */
  .dtb-seg button.an{background:linear-gradient(180deg,rgba(255,255,255,.20),rgba(255,255,255,0)),
      var(--flaeche-akzent,var(--brand));
    color:#fff;font-weight:700;border:1px solid rgba(255,255,255,.28);
    box-shadow:inset 0 1px 0 rgba(255,255,255,.35),0 2px 8px rgba(0,0,0,.16);}
  .dtb-seg button.an .seg-n{color:#fff;opacity:.78;}
  .dtb-seg button svg{width:16px;height:16px;fill:none;stroke:currentColor;stroke-width:2;
    stroke-linecap:round;stroke-linejoin:round;}
  .dtb-seg .seg-n{color:var(--muted);font-weight:700;}
  /* Ansicht als EIN Auswahlfeld - nur am Telefon sichtbar (Regel im Block
     max-width:900px). Am Desktop bleibt das Dreier-Segment: dort ist Platz,
     und ein Segment zeigt alle drei Mengen samt Zahlen auf einen Blick. */
  .dtb-zone-mob{display:none;margin-left:auto;}
  .dtb-zone-btn{gap:6px;padding:0 9px;}
  /* currentColor, NICHT die Flaechenfarbe: das Feld steht neben Fach und Thema
     und soll wie sie aussehen. Ausserdem waechst der Akzent sonst unbemerkt
     ueber seine Liste hinaus (qa/unit/test_flaeche_akzent.py). */
  .dtb-btn .dtb-zico{width:17px;height:17px;flex:none;fill:none;stroke:currentColor;
    stroke-width:2;stroke-linecap:round;stroke-linejoin:round;}
  /* Rechtsbuendig aufklappen: das Feld steht ganz rechts in der Leiste - ein
     linksbuendiges Panel liefe aus dem Bild. */
  .dtb-panel-zone{width:196px;left:auto;right:0;}
  .dtb-panel-zone .dtb-item{gap:9px;}
  .dtb-panel-zone .dtb-item .dtb-nm{flex:1;}
  .dtb-panel-zone .dtb-item .dtb-zico{width:16px;height:16px;flex:none;fill:none;
    stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;opacity:.75;}
  /* Ab 1180px wird die Zeile eng. NACHGEBEN sollen die beiden Auswahlfelder:
     ihre Beschriftung kuerzt sich mit "…", und was dort abgeschnitten wird,
     steht eine Zeile spaeter ohnehin in jedem Listeneintrag.
     NICHT nachgeben soll das Ansicht-Segment - seine Woerter SIND die Namen
     der drei Bereiche, und ein halber Knopf am rechten Rand sieht aus wie ein
     Rand, nicht wie "hier geht es weiter".
     Bis 2.90.0 war es genau andersherum (die Woerter des Segments fielen ab
     1180px weg, die Felder blieben breit). Rueckmeldung Murat 01.08.2026:
     "o güzel dügmelerden kesme asla, textleri de ciksin tablet boyutunda". */
  @media (max-width:1180px){
    .dtb-drop{flex:0 1 auto;min-width:66px;}
    .dtb-btn{max-width:100%;padding:0 10px;}
    .dtb-seg{flex:none;}
    .dtb-seg button{padding:0 10px;}
  }

  /* ===== LISTE + KARTE ================================================== */
  .dash-split{display:grid;grid-template-columns:minmax(0,1.25fr) minmax(0,1fr);gap:16px;
    align-items:start;margin-top:14px;}
  #boerse-split{grid-template-columns:minmax(0,1.85fr) minmax(330px,1fr);}
  /* Beim Scrollen soll die LISTE laufen, nicht die Karte (Wunsch Murat
     31.07.2026). `top` ist die Hoehe der haftenden Kopfzeile (40px Knopf +
     2x10px Polster) plus etwas Luft - mit dem alten top:12px rutschte die
     Karte unter die Leiste und ihr Titel verschwand. */
  .dash-detail{position:sticky;top:72px;}
  /* ===== LISTE ALS TABELLE (2.83.0) ======================================
     WARUM SPALTEN: die Zeile trug frueher ALLES in einer grauen Unterzeile
     (Fach · Thema · Klasse · Datum). Das liest sich als Fliesstext - man kann
     zwei Zeilen nicht vergleichen und schon gar nicht danach sortieren.
     Jetzt: Klassenstufe und Erstelldatum sind eigene, sortierbare Spalten;
     unter dem Titel bleibt nur der PFAD (Fach › Thema) - er sagt, WO die
     Aufgabe liegt, und wiederholt nichts, was rechts schon in einer Spalte
     steht. Das Fach braucht keine eigene Spalte: es ist oben in der Leiste
     bereits gewaehlt und in JEDER Zeile dasselbe.
     Am Telefon (<=900px) faellt alles bis auf den Titel weg; dort wandern
     Klasse und Datum zurueck in die Unterzeile (.dq-m-mob) - eine Tabelle mit
     vier Spalten waere auf 380px Breite unlesbar.
     Gebaut in dashListe() (static/js/index-app.js), sortiert dashSortieren(). */
  .dq-kopf,.dq-row{display:grid;grid-template-columns:minmax(0,1fr) 76px 116px 74px;gap:10px;}
  .dq-kopf{padding:0 10px 7px;font-size:11.5px;color:var(--muted);font-weight:700;
    border-bottom:1px solid var(--line);}
  .dq-kopf .dq-r{text-align:right;}
  .dq-kopf .dq-c{text-align:center;}
  /* Sortierbare Ueberschrift: dasselbe Muster wie .mtl-th-sort im Team-Board -
     Klick sortiert, erneuter Klick dreht um, der Pfeil zeigt den Zustand. */
  .dq-kopf .dq-th{cursor:pointer;user-select:none;border-radius:6px;padding:2px 4px;margin:-2px -4px;
    transition:color .12s,background .12s;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
  .dq-kopf .dq-th:hover{color:var(--ink);background:var(--paper);}
  .dq-kopf .dq-th.an{color:var(--brand-dk);}
  .dq-kopf .dq-pf{font-size:9px;opacity:.9;}
  .dq-row{align-items:center;padding:10px;border-bottom:1px solid var(--line);border-radius:10px;
    cursor:pointer;transition:background .1s;}
  .dq-row:hover{background:var(--paper);}
  .dq-row.sel{background:var(--brand-soft);}
  .dq-row .dq-t{font-size:13.5px;font-weight:600;color:var(--ink);overflow:hidden;
    text-overflow:ellipsis;white-space:nowrap;display:flex;align-items:center;gap:6px;}
  .dq-row.sel .dq-t{color:var(--brand-dk);}
  .dq-row .dq-m{font-size:11.5px;color:var(--muted);margin-top:3px;overflow:hidden;
    text-overflow:ellipsis;white-space:nowrap;display:flex;align-items:center;gap:5px;}
  /* Pfad Fach › Thema: das Trennzeichen ist bewusst blasser als der Text -
     es strukturiert, ohne selbst gelesen zu werden. */
  .dq-row .dq-m .dq-sep{opacity:.5;font-size:12px;line-height:1;flex:none;}
  /* DIE MATERIALART IN DER BOERSE (v2.505.0, Anweisung Murat 27.08.2026:
     „Aufgabe ise Aufgabe, Erklärblatt ise Erklärblatt … abartili butonlar
     filan koyma"). Deshalb KEIN Chip, kein Rahmen, keine Farbe - dieselbe
     Zeile, dieselbe Groesse wie der Pfad daneben, nur etwas fester gesetzt,
     damit sie als Einordnung und nicht als Themenname gelesen wird.
     Gebaut in boerseListe() ueber boerseTypLabel(). */
  .dq-row .dq-m .dq-art{flex:none;font-weight:700;color:var(--ink);opacity:.62;}
  .dq-row .dq-m .dq-th2{overflow:hidden;text-overflow:ellipsis;}
  .dq-row .dq-m-mob{display:none;}
  .dq-row .dq-k,.dq-row .dq-d{font-size:12.5px;color:var(--muted);text-align:center;
    white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
  .dq-row .dq-k{font-weight:700;color:var(--ink);}
  .dq-row .dq-d small{display:block;font-size:11px;opacity:.75;margin-top:1px;}
  .dq-row .dq-f{font-size:13px;color:var(--muted);text-align:right;font-weight:600;}
  .dq-row .dq-ico{width:14px;height:14px;flex:none;fill:none;stroke:currentColor;stroke-width:2;
    stroke-linecap:round;stroke-linejoin:round;}
  .dq-leer{color:var(--muted);font-size:13.5px;padding:26px 10px;text-align:center;line-height:1.55;}
  /* ===== BÖRSE (2.94.0) ==================================================
     Dieselbe Bauform wie die Aufgabenliste, nur andere Spalten: in einer
     FREMDEN Sammlung tragen "von wem" und "wie oft schon kopiert" die
     Information, die auf der eigenen Seite "Abgaben" traegt. Der Name des
     Autors braucht mehr Platz als eine Zahl - deshalb ein eigenes Raster
     statt der geerbten Breiten. */
  #boerse-list .dq-kopf,#boerse-list .dq-row{
    grid-template-columns:minmax(0,1fr) 58px 112px 100px 62px;}
  #boerse-list .dq-row .dq-d{font-weight:600;color:var(--ink);}
  #boerse-list .dq-row .dq-b{font-size:12.5px;color:var(--ink);text-align:center;
    white-space:nowrap;font-weight:700;}
  /* Lautlesezeit ist die EINE Ausnahme: Buecher bleiben Karten, weil das
     Titelbild bei einem Buch die eigentliche Information ist. Dann gibt es
     nichts auszuwaehlen - die Karte rechts faellt weg und die Liste bekommt
     die ganze Breite. */
  .dash-split.nur-liste{grid-template-columns:minmax(0,1fr);}
  .dash-split.nur-liste .dash-detail{display:none;}
  .dqd-card{border:1.5px solid var(--line);border-radius:14px;background:var(--card);padding:16px;}
  .dqd-t{font-size:16px;font-weight:800;line-height:1.3;color:var(--ink);}
  .dqd-m{font-size:12.5px;color:var(--muted);margin-top:4px;}
  .dqd-warn{font-size:12px;color:var(--bad);margin-top:7px;font-weight:600;}
  .dqd-akt{display:flex;gap:7px;margin:14px 0;}
  .dqd-haupt{flex:1;display:inline-flex;align-items:center;justify-content:center;gap:7px;height:40px;
    border-radius:12px;font:inherit;font-size:13.5px;font-weight:700;cursor:pointer;
    transition:box-shadow .15s,transform .08s,background .15s;}
  /* Grau = eine Rueckhol-Aktion (Archiv, Papierkorb). Die darf NICHT wie der
     taegliche Hauptknopf aussehen, sonst klickt man sie versehentlich. */
  .dqd-haupt.grau{background:var(--card);color:var(--ink);border:1.5px solid var(--line);
    box-shadow:none;-webkit-backdrop-filter:none;backdrop-filter:none;}
  .dqd-haupt.grau:hover{border-color:var(--brand);background:var(--paper);box-shadow:none;}
  .dqd-haupt svg{width:16px;height:16px;fill:none;stroke:currentColor;stroke-width:2.2;
    stroke-linecap:round;stroke-linejoin:round;}
  .dqd-ico{flex:none;width:38px;height:38px;border:1.5px solid var(--line);background:var(--card);
    border-radius:11px;cursor:pointer;display:flex;align-items:center;justify-content:center;color:var(--ink);
    transition:border-color .12s;}
  .dqd-ico:hover{border-color:var(--brand);}
  .dqd-ico.rot{color:var(--bad);}
  .dqd-ico svg{width:17px;height:17px;fill:none;stroke:currentColor;stroke-width:2;
    stroke-linecap:round;stroke-linejoin:round;}
  .dqd-link{font-size:13px;color:var(--brand);font-weight:600;cursor:pointer;display:inline-flex;
    align-items:center;gap:5px;margin-bottom:12px;}
  .dqd-link:hover{text-decoration:underline;}
  /* Der Pfeil hinter „… ansehen" hatte KEIN Mass (v2.908.0 gefunden): ohne
     Breite ist ein SVG 300 × 150 gross und schwarz gefuellt - die Zeile brach
     in drei Teile, daneben ein grosses schwarzes Dreieck. Galt auch fuer
     „N Abgaben ansehen" in der Aufgabenliste. */
  .dqd-link svg{width:15px;height:15px;flex:none;fill:none;stroke:currentColor;stroke-width:2.2;
    stroke-linecap:round;stroke-linejoin:round;}
  .dqd-boerse{display:inline-flex;align-items:center;gap:6px;font-size:11.5px;font-weight:700;
    color:var(--ok);margin-top:6px;}
  .dqd-boerse svg{width:14px;height:14px;fill:none;stroke:currentColor;stroke-width:2;
    stroke-linecap:round;stroke-linejoin:round;}
  /* Bewertung direkt am ausgewaehlten Material - NUR Sterne links, Schnitt
     rechts (Rueckmeldung Murat 26.08.2026). Kein Kasten, keine Ueberschrift,
     kein Hintergrund: die Handlung besteht aus einem Tipp, sie braucht keinen
     eigenen Rahmen innerhalb einer Karte, die schon einen hat.
     DIE KASKADE IST DER KERN: beim Zeigen fuellen sich ALLE Sterne bis zum
     Mauszeiger (1 Stern = 1 gefuellt, 3 = drei), vorher leuchtete nur der eine
     Stern unter dem Zeiger - dann ist nicht zu sehen, welche Note man gerade
     vergibt. Die Reihenfolge der drei Regeln ist Pflicht: gleiche Gewichtung,
     die spaetere gewinnt (erst alle fuellen, dann die dahinter zuruecknehmen). */
  .boerse-bewertung{display:flex;align-items:center;justify-content:space-between;
    gap:12px;margin:10px 0 2px;transition:opacity .15s;}
  .boerse-bewertung.laedt{opacity:.55;pointer-events:none;}
  .boerse-bew-stand{font-size:12.5px;color:var(--muted);white-space:nowrap;}
  .boerse-bew-stand b{font-size:14px;font-weight:700;color:var(--ink);}
  .boerse-sterne{display:flex;align-items:center;gap:1px;}
  .boerse-stern{width:32px;height:32px;border:0;border-radius:9px;background:transparent;
    color:var(--muted);opacity:.3;font:inherit;font-size:25px;line-height:1;cursor:pointer;
    padding:0;transition:color .12s,opacity .12s,transform .08s;}
  .boerse-stern.an{color:var(--amber);opacity:1;}
  @media (hover:hover){
    .boerse-sterne:hover .boerse-stern{color:var(--amber);opacity:1;}
    .boerse-stern:hover ~ .boerse-stern{color:var(--muted);opacity:.3;}
  }
  .boerse-stern:focus-visible{outline:2px solid var(--brand);outline-offset:1px;}
  .boerse-stern:active{transform:scale(.92);}
  /* DER KOPF DER BOERSEN-KARTE STEHT MITTIG (Rueckmeldung Murat 26.08.2026:
     "basligi ortalasan ... daha hos durabilir"). Titel links und die Sterne
     darunter linksbuendig, den Schnitt aber ganz rechts am anderen Kartenrand
     - das riss den Kopf in zwei Ecken auseinander und liess die Mitte leer
     wirken. Jetzt bilden Titel, Sterne und Schnitt EINE mittige Gruppe ueber
     dem Hauptknopf: Titel, darunter die Sterne, darunter der Schnitt als
     kleine Zeile - drei Zeilen auf EINER Mittelachse. Nebeneinander (Sterne
     links, Schnitt rechts) sass die Sternenreihe optisch neben der Mitte.
     Die Angabenliste darunter bleibt linksbuendig, denn dort liest man
     Beschriftung gegen Wert. Nur in der Boerse - auf der Aufgabenseite traegt
     dieselbe .dqd-t-Zeile noch Zusatzangaben und bleibt links. */
  #boerse-detail .dqd-t{text-align:center;}
  #boerse-detail .boerse-bewertung{flex-direction:column;align-items:center;
    gap:3px;margin:9px 0 0;}
  /* Angaben als LISTE, nicht als Kachelgitter (Rueckmeldung Murat 01.08.2026:
     "heryer kutu kutu olmus"). Auf einem Bildschirm, auf dem schon zwei Karten
     uebereinander stehen, ergaenzt ein drittes Kaestchenraster nichts - es
     zerlegt nur dieselbe Information in noch mehr Rahmen. Zeilen mit einer
     hauchduennen Trennlinie: Beschriftung links gedaempft, Wert rechts
     betont. Das Auge liest die Werte in EINER Spalte untereinander. */
  .dqd-ang{border-top:1px solid var(--line);margin-top:13px;padding-top:4px;}
  .dqd-ang-k{display:flex;align-items:baseline;justify-content:space-between;gap:14px;
    padding:9px 2px;border-bottom:1px solid var(--line);}
  .dqd-ang-k:last-child{border-bottom:none;}
  .dqd-ang-l{font-size:12.5px;color:var(--muted);flex:none;}
  .dqd-ang-w{font-size:13.5px;font-weight:700;color:var(--ink);text-align:right;
    min-width:0;word-break:break-word;}
  .dqd-fr-h{font-size:11.5px;color:var(--muted);font-weight:700;border-top:1px solid var(--line);
    padding-top:11px;}
  .dqd-fr{font-size:12.5px;line-height:1.5;color:var(--ink);margin-top:8px;display:flex;gap:8px;}
  .dqd-fr .dqd-nr{color:var(--muted);flex:none;font-weight:700;}
  .dqd-mehr{font-size:12.5px;color:var(--muted);margin-top:10px;}
  /* Zweite Karte unter der ersten: was sich zu dieser Aufgabe herunterladen
     laesst (Wunsch Murat 31.07.2026). BEWUSST eine eigene Karte und keine
     Zeile in der ersten: oben steht, WAS die Aufgabe ist, hier WAS man damit
     macht. Die Formate werden erst beim Klick erzeugt - dafuer muss die
     Aufgabe einmal geladen werden, und das passiert nur auf ausdrueckliche
     Anforderung, nicht bei jeder Auswahl in der Liste. */
  .dqd-dl{border:1.5px solid var(--line);border-radius:14px;background:var(--card);padding:14px 16px;
    margin-top:12px;}
  .dqd-dl-h{font-size:11.5px;color:var(--muted);font-weight:700;margin-bottom:10px;}
  .dqd-dl-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(132px,1fr));gap:8px;}
  .dqd-dl-btn{appearance:none;display:inline-flex;align-items:center;gap:8px;padding:9px 11px;
    border:1.5px solid var(--line);background:var(--card);border-radius:11px;font:inherit;
    font-size:12.5px;font-weight:600;color:var(--ink);cursor:pointer;text-align:left;
    transition:border-color .12s,background .12s;}
  .dqd-dl-btn:hover{border-color:var(--brand);background:var(--paper);}
  .dqd-dl-btn:disabled{opacity:.55;cursor:progress;}
  .dqd-dl-btn svg{width:16px;height:16px;flex:none;fill:none;stroke:currentColor;stroke-width:2;
    stroke-linecap:round;stroke-linejoin:round;color:var(--brand);}
  .dqd-dl-hinweis{font-size:11.5px;color:var(--muted);margin-top:9px;line-height:1.45;}
  .dqd-zurueck{display:none;align-items:center;gap:7px;font-size:13.5px;font-weight:700;color:var(--brand);
    cursor:pointer;padding:4px 2px 12px;}
  .dqd-zurueck svg{width:17px;height:17px;fill:none;stroke:currentColor;stroke-width:2.4;
    stroke-linecap:round;stroke-linejoin:round;}
  /* Karte ohne Auswahl (Desktop): dezenter Platzhalter statt leerer Flaeche. */
  .dqd-platz{border:1.5px dashed var(--line);border-radius:14px;padding:30px 18px;text-align:center;
    color:var(--muted);font-size:13px;line-height:1.55;}

  /* ===== TELEFON: EINE Spalte, Karte statt Liste ========================
     KEIN Umbruch nach unten (Wunsch Murat 31.07.2026): die Karte erscheint
     nicht UNTER der Liste, sondern AN IHRER STELLE - mit einem Zurueck-Knopf.
     Deshalb schaltet .detail-offen die Liste hart ab, statt das Raster nur
     einspaltig zu machen. */
  /* ===== DESKTOP: LISTE SCROLLT, KARTE STEHT ============================
     Wunsch Murat 01.08.2026 ("sagdaki kutular sabit kalsin"). position:sticky
     reichte dafuer NICHT: sobald Angaben- und Herunterladen-Karte zusammen
     hoeher sind als der Bildschirm, klebt eine sticky-Box nicht mehr, sondern
     scrollt mit. Deshalb bekommt der Aufgaben-Screen hier dieselbe feste
     Bauform wie das Cockpit: der Screen selbst scrollt NICHT (overflow:hidden),
     stattdessen scrollt jede Spalte fuer sich. Ergebnis: die Kopfzeile und die
     Karte rechts bleiben immer an ihrem Platz, egal wie lang die Liste ist.
     Gilt nur ab 901px - am Telefon gibt es ohnehin nur EINE Spalte. */
  /* DER ERKLAERBLATT-BILDSCHIRM STEHT HIER MIT DRIN (Befund Murat
     27.08.2026, zum zweiten Mal: „yine sayfa üstünde kutu sayfa icinde
     duruyo" / „Inhalt ist so eine Box in der Mitte ... ich moechte in der
     hinteren Seite").

     Er baut dieselbe Karte wie die Aufgabenliste - aber diese Regel kannte
     nur `#screen-dashboard` und `#screen-boerse`. Ohne sie waechst die Karte
     mit ihrem Inhalt, statt die Seite zu fuellen: bei vier Blaettern steht
     ein halbhoher Kasten in der Mitte der Flaeche, und darunter liegt der
     Seitenhintergrund frei. Genau das ist die „Box", und sie verschwindet
     nicht durch eine eigene Regel, sondern dadurch, dass der Bildschirm in
     DIESER Liste steht.

     DIE HUELLE HAT EINE ZWISCHENEBENE: templates/index.html traegt
     `#erklaerblatt-content`, und die Karte entsteht erst darin (das
     JavaScript zeichnet sie). Sie muss also mitfliessen, sonst endet die
     Hoehe an ihr. */
  @media (min-width:901px){
    /* `padding-bottom:0` (v2.862.0): diese drei rollen nicht selbst, sondern
       je Spalte. Das untere Mass der generischen Shell (--pl-unten) waere
       hier tote Flaeche - die Listen endeten 32 px ueber der Panelkante.
       Es steht deshalb unten an den Spalten, die wirklich rollen. */
    body.has-sidebar:not(.lh-fullscreen) #screen-dashboard,
    body.has-sidebar:not(.lh-fullscreen) #screen-erklaerblatt,
    body.has-sidebar:not(.lh-fullscreen) #screen-kurse,
    body.has-sidebar:not(.lh-fullscreen) #screen-boerse{
      overflow:hidden;display:flex;flex-direction:column;padding-bottom:0;}
    body.has-sidebar:not(.lh-fullscreen) #screen-erklaerblatt > #erklaerblatt-content,
    body.has-sidebar:not(.lh-fullscreen) #screen-kurse #kurse-list{
      flex:1 1 auto;min-height:0;display:flex;flex-direction:column;}
    body.has-sidebar:not(.lh-fullscreen) #screen-dashboard > .card,
    body.has-sidebar:not(.lh-fullscreen) #screen-erklaerblatt #erklaerblatt-content > .card,
    body.has-sidebar:not(.lh-fullscreen) #screen-kurse > .card,
    body.has-sidebar:not(.lh-fullscreen) #screen-boerse > .card{
      flex:1 1 auto;min-height:0;display:flex;flex-direction:column;}
    body.has-sidebar:not(.lh-fullscreen) #screen-dashboard .dash-split,
    body.has-sidebar:not(.lh-fullscreen) #screen-erklaerblatt .dash-split,
    body.has-sidebar:not(.lh-fullscreen) #screen-kurse .dash-split,
    body.has-sidebar:not(.lh-fullscreen) #screen-boerse .dash-split{
      flex:1 1 auto;min-height:0;align-items:stretch;}
    /* Beide Spalten scrollen intern und OHNE sichtbaren Balken - wie ueberall
       in der App-Shell (sonst stehen zwei Balken nebeneinander). */
    body.has-sidebar:not(.lh-fullscreen) #screen-dashboard #dash-list,
    body.has-sidebar:not(.lh-fullscreen) #screen-boerse #boerse-list,
    body.has-sidebar:not(.lh-fullscreen) #screen-erklaerblatt #eb-list,
    body.has-sidebar:not(.lh-fullscreen) #screen-kurse #kur-liste,
    body.has-sidebar:not(.lh-fullscreen) #screen-dashboard .dash-detail,
    body.has-sidebar:not(.lh-fullscreen) #screen-erklaerblatt .dash-detail,
    body.has-sidebar:not(.lh-fullscreen) #screen-kurse .dash-detail,
    body.has-sidebar:not(.lh-fullscreen) #screen-boerse .dash-detail{
      min-height:0;overflow-y:auto;scrollbar-width:none;overscroll-behavior-y:contain;
      padding-bottom:var(--pl-unten, 0px);}
    body.has-sidebar:not(.lh-fullscreen) #screen-dashboard #dash-list::-webkit-scrollbar,
    body.has-sidebar:not(.lh-fullscreen) #screen-boerse #boerse-list::-webkit-scrollbar,
    body.has-sidebar:not(.lh-fullscreen) #screen-erklaerblatt #eb-list::-webkit-scrollbar,
    body.has-sidebar:not(.lh-fullscreen) #screen-kurse #kur-liste::-webkit-scrollbar,
    body.has-sidebar:not(.lh-fullscreen) #screen-dashboard .dash-detail::-webkit-scrollbar,
    body.has-sidebar:not(.lh-fullscreen) #screen-erklaerblatt .dash-detail::-webkit-scrollbar,
    body.has-sidebar:not(.lh-fullscreen) #screen-kurse .dash-detail::-webkit-scrollbar,
    body.has-sidebar:not(.lh-fullscreen) #screen-boerse .dash-detail::-webkit-scrollbar{
      display:none;}
    /* In dieser Bauform haftet nichts mehr - die Leiste steht ohnehin fest. */
    body.has-sidebar:not(.lh-fullscreen) #screen-dashboard .dash-detail,
    body.has-sidebar:not(.lh-fullscreen) #screen-erklaerblatt .dash-detail,
    body.has-sidebar:not(.lh-fullscreen) #screen-kurse .dash-detail,
    body.has-sidebar:not(.lh-fullscreen) #screen-boerse .dash-detail{position:static;}
    body.has-sidebar:not(.lh-fullscreen) #screen-dashboard .dq-kopf,
    body.has-sidebar:not(.lh-fullscreen) #screen-erklaerblatt .dq-kopf,
    body.has-sidebar:not(.lh-fullscreen) #screen-kurse .dq-kopf,
    body.has-sidebar:not(.lh-fullscreen) #screen-boerse .dq-kopf{
      position:sticky;top:0;z-index:2;background:var(--card);padding-top:6px;}
  }

  @media (max-width:900px){
    .dash-split,#boerse-split{grid-template-columns:minmax(0,1fr);gap:0;}
    .dash-detail{position:static;}
    /* Eine Spalte: nur der Titel + die Unterzeile. Klasse, Erstellt und
       Abgaben verschwinden als Spalten und stehen (Klasse/Datum) hinten in
       der Unterzeile - siehe Kommentar bei .dq-kopf. */
    /* #boerse-list MUSS hier mitstehen (2.94.2): die Boersen-Regel traegt eine
       ID und schlaegt damit jede Klassen-Regel - egal, wo sie steht. Ohne
       diese Zeile behielt die Boerse am Telefon ihre vier Spalten, die drei
       hinteren waren per display:none unsichtbar, ihre Breite aber weiterhin
       reserviert: der Titel bekam noch ein Drittel der Zeile und stand
       abgeschnitten da. */
    .dq-kopf,.dq-row,
    #boerse-list .dq-kopf,#boerse-list .dq-row{grid-template-columns:minmax(0,1fr);gap:0;}
    .dq-kopf .dq-c,.dq-kopf .dq-r,
    .dq-row .dq-k,.dq-row .dq-d,.dq-row .dq-f{display:none;}
    #boerse-list .dq-row .dq-b{display:none;}
    .dq-row .dq-m-mob{display:block;flex:none;}
    .dash-split .dash-detail{display:none;}
    /* `#eb-list` gehoert HIER dazu: ohne diese Zeile blieb die Liste des
       Erklaerblatt-Bildschirms am Telefon stehen, und die Karte erschien
       darunter statt an ihrer Stelle - genau der Umbruch nach unten, den
       `detail-offen` verhindern soll. */
    .dash-split.detail-offen #dash-list,
    .dash-split.detail-offen #eb-list,
    .dash-split.detail-offen #kur-liste,
    .dash-split.detail-offen #boerse-list{display:none;}
    .dash-split.detail-offen .dash-detail{display:block;}
    .dash-split.detail-offen .dqd-zurueck{display:inline-flex;}
    /* EINE Zeile am Telefon UND auf dem Tablet (Wunsch Murat 31.07.2026:
       "tek sira olabiliyosa mükemmel"). Dafuer schrumpfen hier nur noch die
       Auswahlfelder - Lupe, "Neu" und das Segment sehen aus wie am Desktop.
       Das Ansicht-Segment BLEIBT hier mit seinen Woertern stehen; erst unter
       700px (echtes Telefon) wird daraus ein Auswahlfeld. */
    .dtb-btn{padding:0 9px;font-size:12.5px;gap:5px;}
    .dash-toolbar{flex-wrap:nowrap;gap:6px;}
    /* AUFKLAPPEN OHNE DIE SEITE ZU VERBREITERN (2.94.2, Rueckmeldung Murat:
       "acilan menü saga kayiyor, sayfanin tamamini büyütüp saga kaydiriyor").
       Die Panels waren `position:absolute; left:0` AM KNOPF und 250px breit.
       Beim dritten Feld (Klasse) beginnt der Knopf schon rechts - das Panel
       ragte damit ueber den Bildschirmrand hinaus, und der Browser machte die
       ganze Seite breiter, statt es umzuhaengen.
       Jetzt haengt das Panel am WERKZEUGBALKEN (die Felder geben dafuer ihren
       eigenen Bezugsrahmen ab) und nimmt dessen volle Breite ein: es kann
       nicht mehr herausragen, egal welches Feld man tippt. Nebenbei ist damit
       auch mehr Platz fuer die Namen - vorher kuerzten sie mit "…". */
    .dash-toolbar .dtb-drop{position:static;}
    .dash-toolbar .dtb-panel{left:0;right:0;top:52px;width:auto;max-width:none;}
  }

  /* ===== NUR ECHTES TELEFON (<=700px): Ansicht als Auswahlfeld ==========
     WARUM 700 und nicht 900 (Korrektur 2.90.1, Rueckmeldung Murat
     01.08.2026: "tablette de o dügmeye yapmissin ... tablete sigiyodu"):
     Auf dem Tablet ist Platz fuer die drei Knoepfe MIT ihren Woertern - dort
     ein einzelnes Auswahlfeld zu zeigen nimmt Information weg, die
     hineinpasst. Zu eng wird es erst darunter: bei 700px braucht die Zeile
     mit Segment, beiden Feldern, Lupe und "Neu" rund 660px, und das ist die
     Grenze, unter der es nicht mehr aufgeht.
     Damit auch dort nichts abgeschnitten wird, geben die beiden
     Auswahlfelder nach: sie teilen sich den Rest der Zeile (flex:1 1 0) und
     kuerzen ihre Beschriftung mit "…". Alles andere ist flex:none - so
     bestimmt die Bildschirmbreite, wie breit die drei Filter sind, statt
     dass die Leiste ueber den Rand hinauswaechst. */
  @media (max-width:700px){
    .dtb-seg{display:none;}
    .dtb-zone-mob{display:block;flex:none;margin-left:0;}
    /* Hier teilen sich die drei Filter den Rest der Zeile - eine Federung am
       Segment braucht es nicht, weil es hier gar kein Segment mehr gibt. */
    .dash-toolbar .dtb-drop:not(.dtb-zone-mob){flex:1 1 0;min-width:54px;}
    /* Beim Klassen-Filter faellt das Wort weg: "Klasse 7" wird zu "7",
       "Alle Klassen" zu "Klassen". Die Zahl ist das Unterscheidende - das
       Wort davor ist auf 54px Breite Ballast. */
    .dtb-kl-w{display:none;}
  }
  /* ===== FACH-KACHELN (quadratisch, Icon oben, Name unten) ===== */
  .fach-tile{appearance:none;flex:none;scroll-snap-align:start;width:104px;height:96px;padding:12px 8px 10px;
    display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;
    border:1.5px solid var(--line);background:var(--card);border-radius:15px;cursor:pointer;-webkit-user-select:none;user-select:none;
    font-family:inherit;transition:border-color .12s,background .12s,transform .08s,box-shadow .12s;position:relative;}
  .fach-tile:hover{border-color:var(--brand);}
  .fach-tile:active{transform:scale(.96);}
  .fach-tile .ft-ico{width:38px;height:38px;border-radius:11px;flex:none;display:flex;align-items:center;justify-content:center;}
  .fach-tile .ft-ico svg{width:22px;height:22px;fill:none;stroke-width:2.1;stroke-linecap:round;stroke-linejoin:round;}
  .fach-tile .ft-name{font-weight:700;font-size:12.5px;color:var(--ink);text-align:center;line-height:1.15;
    max-width:100%;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;}
  .fach-tile .ft-cnt{position:absolute;top:7px;right:8px;font-size:10.5px;font-weight:800;
    padding:1px 6px;border-radius:99px;background:rgba(127,127,127,.14);color:var(--muted);}
  .fach-tile.active{color:#fff;border-color:transparent;box-shadow:0 5px 16px rgba(46,91,255,.2);}
  .fach-tile.active .ft-ico{background:rgba(255,255,255,.22)!important;}
  .fach-tile.active .ft-ico svg{stroke:#fff!important;}
  .fach-tile.active .ft-name{color:#fff;}
  .fach-tile.active .ft-cnt{background:rgba(255,255,255,.26);color:#fff;}
  .fach-tile.add-tile,.fach-tile.manage-tile{border-style:dashed;color:var(--muted);}
  .fach-tile.add-tile:hover,.fach-tile.manage-tile:hover{color:var(--brand);border-color:var(--brand);}
  .fach-tile.add-tile .ft-ico svg,.fach-tile.manage-tile .ft-ico svg{stroke:currentColor;}
  .fach-tile.manage-tile{border-style:solid;}
  .fach-tile.kb-tile{width:104px;height:104px;padding:var(--s-2) var(--s-2) var(--s-2);gap:var(--s-1);justify-content:center;}
  .fach-tile.kb-tile .kb-cname{font-size:var(--fs-xl);font-weight:800;line-height:1.05;-webkit-line-clamp:2;}
  .fach-tile.kb-tile .ft-ico{width:30px;height:30px;}
  .fach-tile.kb-tile .ft-ico svg{width:18px;height:18px;}
  .fach-tile.kb-tile .ft-name{font-size:var(--fs-xs);line-height:1.1;-webkit-line-clamp:2;}
  .fach-tile.kb-tile .ft-zeit{display:block;font-weight:600;font-size:var(--fs-3xs);opacity:.65;margin-top:2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:88px;}
  /* Kleinere Klassen-Kacheln (Unterrichtsfächer): kompakter als Fach-Kacheln */
  .fach-tile.sm-tile{width:76px;height:72px;padding:8px 6px 7px;gap:5px;}
  .fach-tile.sm-tile .ft-ico{width:28px;height:28px;border-radius:9px;}
  .fach-tile.sm-tile .ft-ico svg{width:16px;height:16px;}
  .fach-tile.sm-tile .ft-name{font-size:11px;line-height:1.1;}
  .fach-tile.sm-tile .ft-cnt{top:5px;right:6px;font-size:9.5px;padding:1px 5px;}
  /* Zahnrad in der Kachel-Ecke (öffnet Verwalten-Menü) */
  .ft-gear{position:absolute;top:4px;left:5px;width:20px;height:20px;border:none;background:rgba(127,127,127,.10);
    border-radius:6px;cursor:pointer;color:var(--muted);display:flex;align-items:center;justify-content:center;padding:0;z-index:2;
    transition:background .12s,color .12s,transform .15s;}
  .ft-gear:hover{background:rgba(46,91,255,.14);color:var(--brand);transform:rotate(35deg);}
  .ft-gear svg{width:13px;height:13px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;}
  .fach-tile.active .ft-gear{background:rgba(255,255,255,.22);color:#fff;}
  /* Runder Icon-Button für Zeilenaktionen (Umbenennen, Löschen, Excel, PDF, Würfel) */
  .icon-act{appearance:none;flex:none;width:42px;height:42px;border:1.5px solid var(--line);background:#fff;color:var(--muted);border-radius:11px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:border-color .12s,background .12s,color .12s;}
  .icon-act:hover{border-color:var(--brand);color:var(--brand);background:var(--brand-soft);}
  .icon-act.danger:hover{border-color:var(--bad);color:var(--bad);background:var(--bad-soft);}
  .icon-act svg{width:21px;height:21px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;}
  .kb-actions-row{-ms-overflow-style:none;scrollbar-width:none;}
  .kb-actions-row::-webkit-scrollbar{display:none;}
  .kb-actions-row .mini-btn{flex:none;white-space:nowrap;}
  /* Zurück-Link (einheitlich) */
  .back-link{display:flex;align-items:center;gap:5px;cursor:pointer;color:var(--muted);font-size:14px;font-weight:600;margin-bottom:14px;text-decoration:none;width:fit-content;}
  .back-link svg{width:16px;height:16px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;}
  .back-link:hover{color:var(--brand);}
  /* Kebab-Menü (⋯) für Quiz-Zeilen */
  .kebab-wrap{position:relative;}
  .kebab-btn{appearance:none;width:34px;height:34px;border:1.5px solid var(--line);background:#fff;color:var(--muted);border-radius:9px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:border-color .12s,background .12s;}
  .kebab-btn:hover{border-color:var(--brand);background:var(--brand-soft);color:var(--brand);}
  .kebab-btn svg{width:18px;height:18px;fill:currentColor;}
  .kebab-menu{position:absolute;top:40px;right:0;z-index:40;min-width:190px;padding:6px;background:var(--card);border:1px solid var(--line);border-radius:12px;box-shadow:0 12px 30px rgba(27,34,48,0.16);display:none;}
  .kebab-menu.open{display:block;}
  .kebab-menu button{display:flex;align-items:center;gap:10px;width:100%;appearance:none;border:none;background:transparent;cursor:pointer;font-family:inherit;font-size:14px;font-weight:600;color:var(--ink);text-align:left;padding:10px 11px;border-radius:8px;transition:background .12s;}
  .kebab-menu button:hover{background:rgba(127,127,127,0.10);}
  .kebab-menu button.danger{color:var(--bad);}
  .kebab-menu button.danger:hover{background:var(--bad-soft);}
  .kebab-menu button svg{width:16px;height:16px;flex:none;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;}
  .kebab-menu .km-divider{height:1px;background:var(--line);margin:5px 4px;}
  /* Gruppen-Ueberschrift im Menue (2.82.0). Die Eintraege stehen seit dem
     Umbau nach ABSICHT sortiert - Inhalt, Ordnung, Teilen, Ablage - statt als
     eine Liste, in der "In Papierkorb" dasselbe Gewicht hatte wie der
     taegliche Handgriff. Gebaut in dashKebabGruppen (index-app.js). */
  .kebab-menu .km-grp{font-size:11px;font-weight:800;letter-spacing:.02em;color:var(--muted);
    padding:9px 11px 4px;text-transform:none;}
  .kebab-menu .km-grp:first-child{padding-top:4px;}
  /* Karten-Grid (Börse) */
  .card-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:12px;}

  /* ===== KURS-LISTE: kompakte Zeile mit Icon-Aktionen ===== */
  .kurs-row{display:flex;align-items:center;gap:12px;border:1.5px solid var(--line);border-radius:13px;padding:12px 14px;margin-bottom:9px;transition:border-color .12s,box-shadow .12s;}
  .kurs-row:hover{border-color:var(--brand);box-shadow:0 3px 12px rgba(0,0,0,.05);}
  .kurs-row .kurs-main{flex:1;min-width:0;cursor:pointer;}
  .kurs-row .kurs-title{font-weight:800;font-size:15px;color:var(--ink);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
  .kurs-row .kurs-sub{font-size:12.5px;color:var(--muted);margin-top:3px;}
  .kurs-acts{display:flex;align-items:center;gap:4px;flex:none;}
  .kurs-iact{appearance:none;background:none;border:none;padding:7px;border-radius:9px;color:var(--muted);cursor:pointer;
             display:inline-flex;align-items:center;justify-content:center;transition:color .12s,background .12s;}
  .kurs-iact:hover{color:var(--brand);background:rgba(127,127,127,.08);}
  .kurs-iact.danger:hover{color:var(--bad);background:var(--bad-soft,#FDECEA);}
  .kurs-iact svg{width:19px;height:19px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;}
  /* Aufklappbare Abschnitte im Kurs-Editor */
  .ke-fold{border:1.5px solid var(--line);border-radius:13px;margin-bottom:12px;overflow:hidden;}
  .ke-fold>summary{list-style:none;cursor:pointer;padding:13px 15px;font-weight:800;font-size:var(--fs-md);color:var(--ink);
                   display:flex;align-items:center;justify-content:space-between;user-select:none;}
  .ke-fold>summary::-webkit-details-marker{display:none;}
  .ke-fold>summary::after{content:"";width:9px;height:9px;border-right:2px solid var(--muted);border-bottom:2px solid var(--muted);
                          transform:rotate(-45deg);transition:transform .15s;margin-left:8px;flex:none;}
  .ke-fold[open]>summary::after{transform:rotate(45deg);}
  .ke-fold>summary+*{padding:0 15px;}
  .ke-fold[open]>summary{border-bottom:1px solid var(--line);}

  /* ===== DASHBOARD THEMA-AUSWAHL (horizontale kleine Kacheln) ===== */
  .dft-zone{border-radius:16px;padding:10px 12px 4px;margin:8px 0 4px;transition:background .2s;}
  .dft-row{display:flex;align-items:center;gap:8px;margin-bottom:4px;}
  .dft-label{font-size:11px;font-weight:800;letter-spacing:.05em;text-transform:uppercase;color:var(--muted);flex:none;}
  .dft-scroll{display:flex;gap:9px;overflow-x:auto;padding:4px 2px 10px;scroll-snap-type:x proximity;-webkit-overflow-scrolling:touch;touch-action:pan-x;overscroll-behavior-x:contain;}
  .dft-scroll::-webkit-scrollbar{height:6px;}
  .dft-scroll::-webkit-scrollbar-thumb{background:rgba(127,127,127,.25);border-radius:99px;}
  /* Thema-Kachel: quadratisch, kleiner als die Fach-Kachel (104px -> 76px) */
  .dft-tile{appearance:none;flex:none;scroll-snap-align:start;width:76px;height:76px;border-radius:14px;border:1.5px solid var(--line);
            cursor:pointer;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;
            transition:transform .12s,box-shadow .15s,border-color .15s;position:relative;padding:6px;}
  .dft-tile:hover{transform:translateY(-2px);box-shadow:0 5px 13px rgba(0,0,0,.07);}
  .dft-tile:active{transform:scale(.96);}
  .dft-tile .dft-nm{font-weight:800;font-size:11px;text-align:center;line-height:1.15;
                    display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden;max-width:66px;}
  .dft-tile .dft-ct{position:absolute;top:5px;right:5px;font-size:9.5px;font-weight:800;min-width:15px;height:15px;
                    padding:0 4px;border-radius:99px;display:flex;align-items:center;justify-content:center;}
  .dft-tile .dft-edit{position:absolute;bottom:3px;right:4px;font-size:10px;line-height:1;opacity:0;transition:opacity .15s;cursor:pointer;}
  .dft-tile:hover .dft-edit{opacity:.55;}
  .dft-tile .dft-edit:hover{opacity:1;}
  .dft-tile.active{border-color:transparent;color:#fff;}
  .dft-tile.active .dft-nm{color:#fff;}
  /* "Verwalten" = nur ein Zahnrad: kein Hintergrund, kein Rahmen, kein Text */
  .dft-gear{appearance:none;background:none;border:none;padding:6px;margin:0;cursor:pointer;color:var(--muted);
            display:inline-flex;align-items:center;justify-content:center;flex:none;border-radius:10px;transition:color .15s,transform .15s;}
  .dft-gear:hover{color:var(--brand);transform:rotate(35deg);}
  .dft-gear svg{width:21px;height:21px;fill:none;stroke:currentColor;stroke-width:1.9;stroke-linecap:round;stroke-linejoin:round;}
  .dft-empty{color:var(--muted);font-size:13px;padding:10px 2px;}
  .quiz-card{border:1.5px solid var(--line);border-radius:14px;padding:14px;display:flex;flex-direction:column;gap:8px;background:var(--card);transition:border-color .12s,box-shadow .12s;}
  .quiz-card:hover{border-color:var(--brand);box-shadow:0 4px 14px rgba(46,91,255,0.08);}
  .quiz-card .qc-fach{display:inline-block;font-size:11px;font-weight:700;padding:3px 9px;border-radius:99px;background:var(--brand-soft);color:var(--brand-dk);width:fit-content;}
  .quiz-card .qc-title{font-weight:700;font-size:15px;line-height:1.3;}
  .quiz-card .qc-meta{font-size:12px;color:var(--muted);}
  /* Archiv-Akkordeon */
  .arch-head{display:flex;align-items:center;gap:8px;cursor:pointer;color:var(--muted);font-weight:700;font-size:13.5px;padding:12px 2px;user-select:none;margin-top:8px;border-top:1px solid var(--line);}
  .arch-head:hover{color:var(--brand);}
  .arch-head svg{width:15px;height:15px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;transition:transform .15s;}
  .arch-head.open svg{transform:rotate(90deg);}
  /* Nutzungs-Karte (Free-Plan-Stil) */
  .usage-plan{border:1px solid var(--line);border-radius:16px;padding:16px 18px;background:linear-gradient(180deg,var(--brand-soft),var(--card));margin-bottom:4px;}
  .usage-plan .up-month{font-size:11.5px;font-weight:800;color:#fff;background:#1f2733;padding:4px 11px;border-radius:999px;}
  .usage-plan .up-track{height:9px;border-radius:999px;background:rgba(127,127,127,.18);overflow:hidden;}
  .usage-plan .up-track i{display:block;height:100%;border-radius:999px;transition:width .4s ease, background .3s ease;}
  /* === ERWEITERTE OPTIONEN === */
  /* =====================================================================
     MATERIAL-RESKIN (paddy-Einstieg 2026-07, docs/PLAN_GAST_START.md)
     Scoped auf #screen-upload – leakt NICHT in andere Screens.
     Teil 1: Kreide-Hintergrund + bunte Begruessung. Der Rest (Eingabe-
     kasten, Chips, Karten) folgt in eigenen Bloecken.
     ===================================================================== */
  /* Kein weisser Karten-Look mehr – der Inhalt schwebt auf dem Seitengrund
     (wie im Entwurf), dadurch werden auch die Kreide-Formeln sichtbar. Inhalt
     VERTIKAL MITTIG statt oben angeklebt. */
  #screen-upload.card{background:transparent;border:0;box-shadow:none;padding:16px 20px;margin:0;}
  /* align-items:center + width:100% an den Kindern: deterministisch – jedes
     Kind fuellt bis zu seiner max-width, egal welche Flex-Vorgaben die Shell
     mitbringt (der "alles klebt schmal in der Mitte"-Fix). */
  #screen-upload{position:relative;display:flex;flex-direction:column;justify-content:center;align-items:center;
    min-height:calc(var(--vh100,100vh) - 150px);}
  /* Gast (ohne Seitenleiste): die globale .wrap-Kappe (720/1100px) fuer den
     Material-Screen anheben – der Entwurf ist breit und luftig. */
  body[data-screen="upload"]:not(.has-sidebar) .wrap{max-width:1240px;}
  /* ===== MITTIG – FÜR ALLE, AUF JEDEM GERÄT (v2.925.0) ====================
     Auftrag Murat 02.10.2026: „bu şey kutucuk ve yukarıdaki selamlama
     sayfanın tam ortasında olacak. ne olursa olsun Y ve X düzleminde … o
     beyaz kısmın tam ortasında … telefonda da tablette de … aşağıdan bir
     şey açıldığında yukarı kayacak yani bu kadar basit“.
     Damit sind zwei frühere Regeln abgelöst: der Anker oben bei 9 vh
     (v2.324.5, „üst kısım her zaman sabit kalmalı“) und die nur EINMAL
     gerechnete Mitte des Gastes (v2.919.0, gastMitteSetzen). Begrüßung und
     Kapsel stehen jetzt immer in der Mitte der weißen Fläche - angemeldet,
     als Gast, am Rechner, am Tablet, am Telefon; klappt unten etwas auf,
     wandert der Kopf nach oben.
     WIE: zwei Federn, `::before` oben und `::after` unten, teilen sich die
     freie Höhe (flex 1 1 0). NICHT `justify-content:center`: ist der Inhalt
     höher als die Fläche, schnitte das den Anfang oben ab - die Federn gehen
     dann einfach auf null, und die Fläche rollt. Am Telefon behält die
     untere Feder die 104 px für die Kapsel-Leiste (Block max-width:899.98px,
     `body.ml-an #screen-upload::after`): gemittelt wird über dem, was man
     sieht. Das Polster ist oben und unten dasselbe. */
  #screen-upload::before,#screen-upload::after{content:"";display:block;width:100%;
    flex:1 1 0;min-height:0;}
  body.has-sidebar #screen-upload{justify-content:flex-start;
    padding-top:var(--pl-oben, 0px);padding-bottom:var(--pl-oben, 0px);}
  @media(max-width:720px){ body.has-sidebar #screen-upload{padding-top:6px;padding-bottom:6px;} }
  /* Gast-Ansicht: obere Leiste (Logo, Begruessung, Anmelden) ausblenden – der
     Kasten begruesst selbst. Eingeloggt ist die .topbar ohnehin aus. */
  body[data-screen="upload"] .topbar{display:none !important;}
  /* Inhalt ueber die Kreide heben; die Kreide-Ebene bleibt ganz hinten. Die
     Kapsel liegt eine Stufe hoeher als ihre Geschwister: ihre Menues (Plus,
     „Lernspiele & mehr“) duerfen ueber einer Fehlermeldung darunter liegen. */
  #screen-upload > *{position:relative;z-index:1;}
  #screen-upload > .mat-chalk{z-index:0;}
  #screen-upload > .komposit{z-index:3;}
  /* .mat-chalk erbt die komplette Optik von .auth-chalk (Font, Fade, Rotation);
     hier nur die Verortung als Vollflaechen-Hintergrund der Karte. */
  .mat-chalk{position:absolute;inset:0;border-radius:inherit;overflow:hidden;}
  /* Die alte schlichte "Material"-Ueberschrift weicht der bunten Begruessung. */
  #screen-upload > .screen-h2-dup{display:none;}
  /* DIE BEGRÜSSUNG STEHT ÜBER DER KAPSEL – für alle (v2.925.0). Von 2026-07
     bis hier stand sie für Angemeldete oben in der Kopfzeile (setPageTitle)
     und das H1 war nur der Platz des Gastes. Mittig über der Kapsel muss sie
     IM Bildschirm stehen, sonst steht nur die halbe Gruppe in der Mitte;
     setPageTitle setzt auf „home“ deshalb keine Begrüßung mehr. */
  .mat-greeting{font-size:29px;font-weight:500;letter-spacing:-.02em;line-height:1.25;
    text-align:center;margin:0 0 20px;color:var(--ink);min-height:1.4em;max-width:960px;}
  @media(max-width:720px){ .mat-greeting{font-size:22px;margin-bottom:14px;} }

  /* ===== GAST: NUR DAS MATERIAL, IN DER MITTE (v2.918.1 / v2.919.0) =====
     Ansagen Murat 01.10.2026 zu /login?ausprobieren=1: „sagdaki material
     kismi olmaliydi sadece diger kisimlar olmamali" (v2.918.1: keine
     Leiste) und „headeri kaldir ... selamlamayi heute noch kisminin üstüne
     koy ortala kalin olmasin ... kenarlardan bastir ... sayfanin tam
     ortasinda olsun x y düzleminde" (v2.919.0).
     Der Gast behaelt die Huelle (`has-sidebar` = das weisse Panel), aber
     ohne Leiste, ohne Menueknopf und ohne Kopfzeile. Die Begruessung steht
     als #mat-greeting IM Panel, nicht fett (auch das bunte Wort: matRainbow
     setzt 800 inline, daher !important). Begruessung und Eingang sind
     hoechstens 960 px breit.
     SENKRECHT gilt seit v2.925.0 dieselbe Mitte wie für alle (Federn oben im
     Abschnitt „MITTIG – FÜR ALLE“); die eigene Rechnung des Gastes
     (gastMitteSetzen, `--gast-oben`) ist entfallen. Das Panel verliert sein
     oberes Polster (24 px, gedacht als Luft unter der Kopfzeile), damit oben
     und unten dasselbe Mass gilt. Gesetzt von renderMainNav (index-app.js).
     Bewacht von qa/unit/test_gast_rahmen.py. */
  body.gast-rahmen #app-sidebar,
  body.gast-rahmen #sb-overlay,
  body.gast-rahmen .app-topbar{ display:none !important; }
  @media (min-width:900px){
    body.has-sidebar.gast-rahmen:not(.lh-fullscreen){
      padding-left:max(10px, env(safe-area-inset-left)); }
  }
  body.has-sidebar.gast-rahmen:not(.lh-fullscreen) .wrap{ padding-top:0; }
  body.has-sidebar.gast-rahmen #screen-upload{ padding-top:24px; padding-bottom:24px; }
  body.has-sidebar.gast-rahmen #screen-upload > .mat-greeting,
  body.has-sidebar.gast-rahmen #screen-upload .komposit{
    width:100%; max-width:960px; margin-left:auto; margin-right:auto; }
  body.has-sidebar.gast-rahmen #screen-upload > .mat-greeting{ display:block; font-weight:500;
    margin-top:0; }
  body.has-sidebar.gast-rahmen #mat-greeting span{ font-weight:inherit !important; }
  @media(max-width:720px){
    body.has-sidebar.gast-rahmen #screen-upload{ padding-top:14px; padding-bottom:14px; }
  }

  /* ===== Teil 2: der Eingang (komposit) ===================================== */
  #screen-upload .komposit{position:relative;width:100%;max-width:1180px;margin:0 auto;}
  /* ⛔ AM ARBEITSPLATZ KEIN EIGENER RAND (v2.863.0). Befund Murat 26.09.2026,
     mit Bildschirmfotos von Faecher, Material, Werkzeuge und Boerse
     nebeneinander: „her sayfada farkli yani bir standarti yok kiminde bosluk
     cok kiminde az". DIE REGEL FUER ALLE BILDSCHIRME: der Inhalt beginnt
     dort, wo der Titel beginnt (Panelpolster --pl-seite). Der Gast behaelt
     seine Buehne. Bewacht von qa/unit/test_ein_rand_fuer_alle.py. */
  body.has-sidebar #screen-upload.card{padding-left:0;padding-right:0;}
  /* DIE KAPSEL STEHT MITTIG (v2.925.0, Auftrag Murat 02.10.2026 mit zwölf
     Vorlagen - alle mit einem Eingabefenster mitten auf freier Fläche).
     Der Bildschirm selbst trägt weiter keinen eigenen Rand (Regel oben);
     schmal ist nur die Kapsel. Am Telefon füllt sie die Breite (Block
     „Kapsel am Telefon“). */
  body.has-sidebar #screen-upload .komposit{max-width:960px;width:calc(100% - 32px);}

  /* ===== DIE EINGABEKAPSEL (v2.925.0) =====================================
     Auftrag Murat 02.10.2026 mit zwölf Vorlagen: „şunun aynısını yapsak …
     incecik küçük olacak o çerçeve ama renkli böyle etrafa renkler yayan bir
     pencere“ - und am selben Tag nachgeschärft: der Schein nur oben und
     unten („sağını solu olmasa … sadece üstten alttan güzelce yayılsın“),
     alles in TÖNEN DER FLÄCHENFARBE („tema renginin farklı renklerine“).
     Der Eingang ist wieder EIN Fenster - keins der beiden alten: nicht die
     Glaskarte (v2.253.0, rgba-Weiß + backdrop-filter, ohne Aussage) und
     nicht „gar kein Kasten“ (v2.324.0, „icerik kutu kutu ya“).
       1. DREI TÖNE (`--kapsel-a/-b/-c`): die Flächenfarbe selbst (b) und
          zwei Nachbarn auf dem Farbkreis, etwas heller (a: −42°, c: +48°).
          Gerechnet mit relativen Farben (oklch from …); wo der Browser das
          nicht kann, mischt color-mix() hellere Fassungen. Ohne gewählte
          Fläche (und im dunklen Design) ist der Grundton --brand.
          `--kapsel-ton*` setzt der Abschnitt „Akzent aus der Flaechenfarbe“
          (Nr. 7) - die EINE Stelle, an der die Kapsel die Wunschfarbe holt.
       2. RAHMEN 1,5 px im Verlauf der drei Töne (border-box); das Band
          darüber ist derselbe Verlauf unter einem Schleier aus --card
          (padding-box) - Pastell, damit die Schrift darauf dunkel bleibt.
       3. SCHEIN an `.komposit::before`: derselbe Verlauf, weichgezeichnet,
          links und rechts 48 px eingerückt - die Unschärfe läuft genau bis
          zur Kante und nicht darüber. Vorher lagen vier farbige Schatten
          auch SEITLICH; wurde das Fenster schmal, schnitt der rollende
          Bereich sie als harte senkrechte Linie ab („daralttıkça kesiliyor
          … dümdüz çizgi oluyor“). Der Schein steht still (kein Atmen mehr,
          „sürekli değişmesin“); beim Tippen wird er etwas kräftiger.
     Kein backdrop-filter: dahinter liegt das weiße Panel (DESIGN_SYSTEM.md
     §5.1). Bewacht von qa/unit/test_mat_einstieg.py, test_anzeigename.py. */
  #screen-upload .komposit{
    --kapsel-b:var(--kapsel-ton, var(--brand));
    --kapsel-a:color-mix(in oklch, var(--kapsel-b) 62%, var(--card));
    --kapsel-c:color-mix(in oklch, var(--kapsel-b) 70%, var(--violett));
    --kapsel-verlauf:linear-gradient(100deg, var(--kapsel-a), var(--kapsel-b) 50%, var(--kapsel-c));}
  @supports (color: oklch(from red l c h)){
    #screen-upload .komposit{
      --kapsel-a:oklch(from var(--kapsel-b) calc(l + .16) c calc(h - 42));
      --kapsel-c:oklch(from var(--kapsel-b) calc(l + .1) c calc(h + 48));}
  }
  #screen-upload .komposit::before{content:"";position:absolute;z-index:-1;pointer-events:none;
    left:48px;right:48px;top:-12px;bottom:-12px;border-radius:48px;
    background:var(--kapsel-verlauf);filter:blur(24px);opacity:.42;transition:opacity .3s ease;}
  #screen-upload .komposit:focus-within::before{opacity:.6;}
  #screen-upload .box{position:relative;z-index:2;
    --kapsel-schleier:color-mix(in srgb, var(--card) 88%, transparent);
    border:1.5px solid transparent;border-radius:24px;padding:0 4px 4px;
    background:linear-gradient(var(--kapsel-schleier), var(--kapsel-schleier)) padding-box,
      var(--kapsel-verlauf) border-box;}
  /* Quell-Tabs versteckt: das +-Menue ersetzt sie. */
  #screen-upload .tabs.matcompat{display:none;}
  #screen-upload .box .field{border:0;padding:0;}

  /* DAS KOPFBAND (#mat-pflicht). Drei Spalten: links das Kontingent, in der
     MITTE Fach · Thema · Klasse · Anzahl, rechts der Weg zu mehr (Auftrag
     Murat 02.10.2026: „fach tema klasse anzahl … daha küçük. kelime olarak
     daha küçük … ortalayacaksın … sol tarafta sonsuz … en sağda upgrade'in
     yerine …“). Die beiden Außenspalten sind gleich breit (1fr), dadurch
     steht die Mitte in der Mitte, egal wie lang „∞ heute“ und „Upgraden“
     sind. Die Felder tragen keine sichtbare Beschriftung mehr - „Fach“,
     „Thema“, „Klasse“ stehen als Platzhalter IM Feld, das <label> trägt den
     Namen für Vorlesewerkzeuge weiter (wie .sr-only). Ein fehlendes
     Pflichtfeld färbt sich erst NACH dem Absenden (.fpk-fehlt, setzt
     generate()). Am Telefon eine Zeile nur mit den Feldern (Block unten). */
  #screen-upload .box-pflicht{display:grid;grid-template-columns:minmax(0,1fr) auto minmax(0,1fr);
    align-items:center;column-gap:10px;padding:4px 10px;min-height:36px;}
  #screen-upload .kapsel-kontingent{justify-self:start;font-size:var(--fs-2xs);font-weight:700;
    color:var(--kapsel-ton-ink, var(--brand));white-space:nowrap;cursor:default;}
  #screen-upload .kapsel-plan{justify-self:end;display:inline-flex;align-items:center;gap:4px;
    padding:3px 9px;border-radius:var(--r-pill);font-size:var(--fs-2xs);font-weight:700;
    color:var(--kapsel-ton-ink, var(--brand));text-decoration:none;white-space:nowrap;}
  #screen-upload .kapsel-plan:hover{background:color-mix(in srgb, var(--card) 72%, transparent);}
  #screen-upload .kapsel-plan[hidden]{display:none;}
  #screen-upload .kapsel-plan .ic{--ic-px:13px;--ic-sw:2.3;}
  #screen-upload .box-pflicht .fach-pick-row{display:flex;flex-wrap:wrap;align-items:center;
    justify-content:center;gap:2px 0;min-width:0;}
  /* KLEINER UND RUHIGER (v2.997.0, Murat 11.10.2026: „orası çok gözüme
     batıyor … biraz daha küçük … daha düzenli“), und GENAU MITTIG
     (v2.997.1, „yukarıya yakınlığıyla aşağıdaki kısma yakınlığı aynı değil
     … y ekseninde ortalı değil … Fach çok küçük, Thema çok büyük“):
     - `margin:0` - das <label> erbte unten 7 px (allgemeine label-Regel),
       die Felder standen 2 px unter dem Rand und 8 px über dem weißen Feld.
     - JEDE Pille ist 28 px hoch, jedes Feld darin 24 px mit 24 px
       Zeilenhöhe - vorher war das Thema 28, die anderen 30 px.
     - Fach und Klasse haben eine Mindestbreite, das Thema ist schmaler:
       die drei stehen gleichgewichtig nebeneinander. */
  #screen-upload .box-pflicht .fpk{display:flex;align-items:center;gap:4px;margin:0;
    position:relative;padding:0 10px;height:28px;min-height:0;border-radius:999px;}
  #screen-upload .box-pflicht .fpk + .fpk{margin-left:8px;}
  #screen-upload .box-pflicht .fpk + .fpk::before{content:"";position:absolute;left:-5px;
    top:7px;bottom:7px;width:1px;background:color-mix(in srgb, var(--ink) 11%, transparent);}
  /* Neben einer leuchtenden Pille stört der Strich. */
  #screen-upload .box-pflicht .fpk-fehlt::before,
  #screen-upload .box-pflicht .fpk-fehlt + .fpk::before{display:none;}
  #screen-upload .box-pflicht .fpk > span:first-child{position:absolute;width:1px;height:1px;
    margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0;}
  #screen-upload .box-pflicht .fpk:hover{background:color-mix(in srgb, var(--card) 72%, transparent);}
  /* Fokus als weiße Pille, nicht als blauer Rahmen (Ansage 14.09.2026:
     „su can sikici mavi cerceve … asla istemiyorum“). */
  #screen-upload .box-pflicht .fpk:focus-within{border-color:transparent;background:var(--card);
    box-shadow:0 1px 3px color-mix(in srgb, var(--ink) 14%, transparent);}
  /* Ein <select> ist sonst so breit wie seine LÄNGSTE Zeile („Praktische
     Philosophie“), auch wenn „Mathematik“ gewählt ist. `field-sizing:content`
     misst die GEWÄHLTE Zeile (Chromium, neuere Safari); wo es fehlt, bleibt
     die alte Breite - kein Fehler, nur weniger schmal. */
  #screen-upload .box-pflicht .fpk select,
  #screen-upload .box-pflicht .fpk input{width:auto;font-size:12px;font-weight:600;
    height:24px;line-height:24px;margin:0;padding-top:0 !important;padding-bottom:0 !important;}
  #screen-upload .box-pflicht .fpk select{display:inline-flex;align-items:center;}
  #screen-upload .box-pflicht #mat-fach{min-width:7.5em;}
  #screen-upload .box-pflicht #mat-klasse{min-width:6.2em;}
  #screen-upload .box-pflicht .fpk select{field-sizing:content;max-width:13em;
    background-size:12px !important;padding-right:16px !important;}
  #screen-upload .box-pflicht .fpk select:has(> option[value=""]:checked),
  #screen-upload .box-pflicht #mat-thema::placeholder{color:var(--muted);opacity:1;}
  #screen-upload .box-pflicht .ss-aus{display:inline-block;width:clamp(120px,12vw,150px);min-width:0;height:24px;margin:0;}
  #screen-upload .box-pflicht .ss-aus > input{width:100%;min-width:0;}
  #screen-upload .box-pflicht .ss-aus-pfeil{width:14px;height:24px;background-size:11px;}
  #screen-upload .box-pflicht #mat-count{width:4ch;text-align:center;appearance:textfield;
    background:transparent !important;border-radius:6px;padding:0 2px !important;}
  #screen-upload .box-pflicht #mat-count::-webkit-inner-spin-button,
  #screen-upload .box-pflicht #mat-count::-webkit-outer-spin-button{appearance:none;margin:0;}
  #screen-upload .box-pflicht .fpk-einheit{font-size:var(--fs-2xs);font-weight:600;color:var(--sub);
    text-transform:none;letter-spacing:0;margin:0;}
  /* DIE LISTEN DER FELDER IN DER FLÄCHENFARBE (Murat 02.10.2026: „o
     şeylerin içlerindeki renkler hep mavi. tema rengi olsun“). Fach und
     Klasse sind echte <select> - ihre Liste zeichnet sonst das
     Betriebssystem, in seinem Blau. `appearance:base-select` (Chromium ab
     135) gibt die Liste in die Hand der Seite; ältere Browser und Safari
     behalten ihre eigene Liste - dieselbe Bedienung, nur nicht eingefärbt.
     Das Thema-Feld (ssAuswahl) färbt sich über den Akzent-Abschnitt. */
  @supports (appearance: base-select){
    #screen-upload .box-pflicht .fpk select,
    #screen-upload .box-pflicht .fpk select::picker(select){appearance:base-select;}
    #screen-upload .box-pflicht .fpk select::picker-icon{display:none;}
    #screen-upload .box-pflicht .fpk select::picker(select){margin-top:6px;padding:5px;
      border:1px solid var(--line);border-radius:14px;background:var(--card);
      box-shadow:0 12px 28px color-mix(in srgb, var(--ink) 16%, transparent);
      max-height:min(60vh, 420px);}
    #screen-upload .box-pflicht .fpk option{padding:7px 10px;border-radius:9px;
      font-size:var(--fs-sm);font-weight:600;color:var(--ink);}
    #screen-upload .box-pflicht .fpk option::checkmark{display:none;}
    #screen-upload .box-pflicht .fpk option:hover,
    #screen-upload .box-pflicht .fpk option:focus-visible,
    #screen-upload .box-pflicht .fpk option:checked{
      background:var(--kapsel-ton-soft, var(--brand-soft));color:var(--kapsel-ton-ink, var(--brand));}
  }
  /* WAS FEHLT, LEUCHTET IM NEON DER THEMENFARBE (v2.997.1). v2.997.0 war
     Rot - Murat 11.10.2026: „kırmızı çok kötü olmuş … tema rengi olsun …
     biraz parlak, neon … insanlar oraya gitmesi gerektiğini anlasın“.
     --kapsel-neon ist die Themenfarbe, heller und satter gerechnet
     (oklch from …); wo der Browser das nicht kann, die Themenfarbe selbst.
     Beim Druck glimmt der Schein dreimal auf und bleibt dann ruhig stehen,
     bis das Feld gefüllt ist; der Platzhalter („Fach“, „Thema“, „Klasse“)
     steht dabei in der Themenfarbe. Gesetzt von matFehltZeigen() - KEIN
     Satz darunter, das Leuchten ist die Erklärung. */
  #screen-upload .komposit .box-pflicht,
  #screen-upload .komposit .kapsel-eingabe{--kapsel-neon:var(--kapsel-ton, var(--brand));}
  @supports (color: oklch(from red l c h)){
    #screen-upload .komposit .box-pflicht,
    #screen-upload .komposit .kapsel-eingabe{
      --kapsel-neon:oklch(from var(--kapsel-ton, var(--brand)) calc(l + .08) calc(c + .1) h);}
  }
  /* `:focus-within` steht mit dabei: matFehltZeigen() setzt den Fokus ins
     erste fehlende Feld, und die weiße Fokus-Pille (oben) löschte sonst
     genau DESSEN Leuchten. */
  #screen-upload .box-pflicht .fpk-fehlt,
  #screen-upload .box-pflicht .fpk-fehlt:hover,
  #screen-upload .box-pflicht .fpk-fehlt:focus-within{
    background:color-mix(in srgb, var(--kapsel-neon) 12%, var(--card));}
  #screen-upload .box-pflicht .fpk-fehlt,
  #screen-upload .box-pflicht .fpk-fehlt:focus-within{border-color:var(--kapsel-neon);
    box-shadow:0 0 0 1px var(--kapsel-neon),
      0 0 10px color-mix(in srgb, var(--kapsel-neon) 65%, transparent),
      0 0 22px color-mix(in srgb, var(--kapsel-neon) 32%, transparent);
    animation:mat-fehlt-glimmen 1s ease-in-out 3;}
  #screen-upload .box-pflicht .fpk-fehlt select,
  #screen-upload .box-pflicht .fpk-fehlt #mat-thema::placeholder{color:var(--kapsel-ton-ink, var(--brand));}
  #screen-upload .kapsel-eingabe.mat-fehlt{border-radius:14px;
    background:color-mix(in srgb, var(--kapsel-neon) 6%, transparent);
    box-shadow:0 0 0 1.5px var(--kapsel-neon),
      0 0 14px color-mix(in srgb, var(--kapsel-neon) 55%, transparent),
      0 0 28px color-mix(in srgb, var(--kapsel-neon) 26%, transparent);
    animation:mat-fehlt-glimmen 1s ease-in-out 3;}
  @keyframes mat-fehlt-glimmen{
    50%{box-shadow:0 0 0 1.5px var(--kapsel-neon),
      0 0 16px color-mix(in srgb, var(--kapsel-neon) 90%, transparent),
      0 0 34px color-mix(in srgb, var(--kapsel-neon) 55%, transparent);} }
  @media (prefers-reduced-motion: reduce){
    #screen-upload .box-pflicht .fpk-fehlt,
    #screen-upload .kapsel-eingabe.mat-fehlt{animation:none;} }
  /* In schmalen Fenstern gehoert die Breite den Auswahlfeldern. Sonst
     ueberlagern Kontingent und Konto-Link die laengeren Feldwerte. */
  @media(min-width:641px) and (max-width:900px){
    #screen-upload .box-pflicht{grid-template-columns:minmax(0,1fr);}
    #screen-upload .kapsel-kontingent,#screen-upload .kapsel-plan{display:none;}
  }

  /* DIE WEISSE INNENFLÄCHE (.kapsel-feld): Eingabezeile, Knopfreihe und -
     nach dem Zahnrad - die Gruppen. Sie liegt 4 px tief im Band, wie das
     weiße Fenster der Vorlage in seinem Rahmen. */
  #screen-upload .kapsel-feld{position:relative;background:var(--card);border-radius:20px;
    box-shadow:0 1px 2px color-mix(in srgb, var(--ink) 7%, transparent),
      0 12px 28px -20px color-mix(in srgb, var(--ink) 40%, transparent);}
  /* PLUS | EINGABE | MIKROFON, SENDEN - drei Spalten, oben bündig: Plus und
     Senden stehen auf Höhe der ersten Zeile, auch wenn der Text wächst. Am
     Telefon wandern Plus und Werkzeuge unter das Feld (grid-areas). */
  #screen-upload .kapsel-zeile{display:grid;grid-template-columns:auto minmax(0,1fr) auto;
    grid-template-areas:"plus eingabe leiste";align-items:start;column-gap:4px;
    padding:8px 8px 0 6px;}
  #screen-upload .kapsel-zeile > .mat-add{grid-area:plus;}
  #screen-upload .kapsel-zeile > .kapsel-eingabe{grid-area:eingabe;min-width:0;}
  #screen-upload .kapsel-zeile > .leiste{grid-area:leiste;}
  /* Die Knopfreihe (#adv-home) hängt OHNE Haarlinie an der Eingabe - sie
     gehört zur selben Handlung wie in der Vorlage. Bis v2.924 trennte hier
     eine Linie die immer offenen Optionen ab; die tragen ihre Linie jetzt
     selbst (.mat-group), sobald das Zahnrad sie öffnet. */
  #screen-upload .kapsel-feld > #adv-home{padding:0;}
  #screen-upload textarea.mat-feld{width:100%;border:0;background:transparent;resize:none;
    padding:9px 6px 6px;font:inherit;font-size:15px;color:var(--ink);min-height:72px;line-height:1.5;}
  #screen-upload textarea.mat-feld:focus{outline:none;box-shadow:none;}
  /* „+ |“ wie in der Vorlage: ein Haarstrich trennt das Anhängen vom Text. */
  #screen-upload .mat-add{position:relative;display:flex;align-items:center;}
  #screen-upload .mat-add::after{content:"";width:1px;height:22px;margin:0 2px 0 6px;
    background:var(--line);}
  #screen-upload .leiste{display:flex;align-items:center;gap:2px;position:relative;}
  #screen-upload .ikbtn{width:38px;height:38px;flex:none;border:0;background:transparent;border-radius:50%;cursor:pointer;color:var(--sub,#475569);display:flex;align-items:center;justify-content:center;transition:all .2s;}
  #screen-upload .ikbtn:hover,#screen-upload .ikbtn.aktiv{background:var(--brand-soft,#EEF2FF);color:var(--brand,#2E5BFF);}
  #screen-upload .ikbtn svg:not(.ic){width:20px;height:20px;fill:none;stroke:currentColor;stroke-width:1.9;stroke-linecap:round;stroke-linejoin:round;}
  /* Offenes Menü: das Plus dreht sich zum Kreuz - derselbe Knopf schließt. */
  #screen-upload .ikbtn .ic{transition:transform .2s ease;}
  #screen-upload .ikbtn.aktiv .ic{transform:rotate(45deg);}
  #screen-upload .leiste .spacer{margin-left:auto;}
  /* SENDEN: NUR DER FLIEGER, SCHWARZ, OHNE FLÄCHE (Murat 02.10.2026:
     „gönderme butonun da arka planını sil siyah gönderme şey olsun sadece
     hani uçak olsun … arka plansız sade“). Dieselbe Entscheidung wie
     v2.324.2 („arkaplansız uçak sadece“); kurz war er ein gefüllter Kreis
     wie in der Vorlage. Schwarz ist --ink - im dunklen Design hell. Gesperrt
     deutlich blass: „noch nicht bereit“ muss man sehen. */
  #screen-upload .senden{width:40px;height:40px;flex:none;border:0;border-radius:50%;cursor:pointer;
    display:flex;align-items:center;justify-content:center;
    background:transparent;box-shadow:none;color:var(--ink);
    transition:transform .2s,opacity .2s;}
  #screen-upload .senden:hover{transform:translateY(-1px);}
  #screen-upload .senden:disabled{opacity:.3;cursor:not-allowed;transform:none;}
  /* Noch nicht bereit, aber DRÜCKBAR (v2.997.0, matSendenBereit): blass wie
     früher, doch ein Druck erklärt, was fehlt, statt nichts zu tun. */
  #screen-upload .senden.nicht-bereit{opacity:.35;transform:none;}
  #screen-upload .senden svg{width:22px;height:22px;fill:none;stroke:currentColor;stroke-width:1.9;
    stroke-linecap:round;stroke-linejoin:round;}
  #screen-upload .pop{position:absolute;z-index:20;background:var(--card,#fff);border:1px solid var(--line);border-radius:16px;box-shadow:0 12px 28px rgba(16,24,40,.12),0 40px 90px rgba(16,24,40,.20);}
  /* Das Menü hängt am Plus und öffnet sich nach RECHTS UNTEN: das Plus steht
     oben links in der Kapsel (am Telefon unten - dort geht es nach oben). */
  #screen-upload .pop.pop-add{left:0;right:auto;top:46px;width:262px;padding:7px;}
  #screen-upload .pop-add .zeile{display:flex;align-items:center;gap:12px;padding:12px;border-radius:11px;cursor:pointer;font-size:14px;font-weight:600;color:var(--ink);transition:background .18s;}
  #screen-upload .pop-add .zeile:hover{background:var(--brand-soft,#EEF2FF);}
  #screen-upload .pop-add .zeile .ic{width:36px;height:36px;border-radius:10px;background:var(--brand-soft,#EEF2FF);display:flex;align-items:center;justify-content:center;flex:none;}
  #screen-upload .pop-add .zeile .ic svg{width:18px;height:18px;fill:none;stroke:var(--brand,#2E5BFF);stroke-width:1.9;stroke-linecap:round;stroke-linejoin:round;}
  #screen-upload .pop-add .zeile small{display:block;font-size:11.5px;font-weight:500;color:var(--muted);margin-top:1px;}

  /* DIE INHALTE DER REITER IN DER KAPSEL (v2.925.0, Befund Murat
     02.10.2026: „içerideki bütün linklerin rengi butonların rengi … video an
     übernehmen transkript als … çok kötü duruyor … datei hochladına
     tıkladım iğrenç duruyor“). Datei, YouTube und Meine Quellen trugen eigene
     Knöpfe in Markenblau, volle Breite, Inline-Farben. In der Kapsel spricht
     alles EINE Sprache: Chips (weiß, Haarlinie, Text --ink, beim Zeigen der
     Hauch der Fläche), Eingabefelder als weiche Pillen, EINE gefüllte Pille
     für die Hauptaktion („Übernehmen“, „Fragen“) - in der Flächenfarbe. */
  #screen-upload .kapsel-titel{display:block;margin:2px 2px 7px;font-size:var(--fs-xs);
    font-weight:700;color:var(--sub);}
  #screen-upload #tab-file-content,#screen-upload #tab-yt-content{padding:6px 4px 4px;}
  #screen-upload #drop.drop{border:1.5px dashed color-mix(in srgb, var(--kapsel-ton, var(--brand)) 36%, transparent);
    border-radius:16px;padding:16px 14px;text-align:center;
    background:color-mix(in srgb, var(--kapsel-ton, var(--brand)) 5%, var(--card));
    color:var(--kapsel-ton, var(--brand));}
  #screen-upload #drop .big{margin-top:8px;font-size:var(--fs-sm);font-weight:600;color:var(--sub);}
  #screen-upload .drop-knoepfe{display:flex;justify-content:center;flex-wrap:wrap;gap:8px;margin-top:10px;}
  #screen-upload .kapsel-chip{display:inline-flex;align-items:center;gap:6px;width:auto;margin:0;
    height:34px;padding:0 14px;border:1px solid var(--line);border-radius:var(--r-pill);
    background:var(--card);color:var(--ink);font:inherit;font-size:var(--fs-sm);font-weight:650;
    cursor:pointer;transition:background .15s,border-color .15s,color .15s;}
  #screen-upload .kapsel-chip svg{color:var(--kapsel-ton, var(--brand));}
  #screen-upload .kapsel-chip:hover{
    background:var(--kapsel-ton-soft, var(--brand-soft));border-color:transparent;
    color:var(--kapsel-ton-ink, var(--brand));}
  #screen-upload .yt-zeile{display:flex;align-items:center;flex-wrap:wrap;gap:8px;}
  #screen-upload .kapsel-eingabefeld{flex:1 1 180px;min-width:0;height:36px;margin:0;padding:0 14px;
    border:1px solid var(--line);border-radius:var(--r-pill);background:var(--surface-subtle);
    color:var(--ink);font:inherit;font-size:var(--fs-sm);}
  #screen-upload textarea.kapsel-eingabefeld{display:block;width:100%;height:auto;min-height:96px;
    padding:10px 12px;border-radius:14px;resize:vertical;}
  #screen-upload .kapsel-eingabefeld:focus{outline:none;background:var(--card);
    border-color:var(--kapsel-ton, var(--brand));}
  #screen-upload .yt-schalter[aria-pressed="true"]{background:var(--kapsel-ton-soft, var(--brand-soft));
    border-color:transparent;color:var(--kapsel-ton-ink, var(--brand));}
  #screen-upload .yt-schalter[aria-pressed="false"]{color:var(--muted);}
  #screen-upload .yt-schalter[aria-pressed="false"] svg{color:var(--muted);}
  /* Bewusst KEIN .btn: dessen Glas-Fassung setzt Rand, Schatten und
     backdrop-filter mit !important (Abschnitt „.btn“ weiter oben) - in der
     Kapsel wäre das ein zweites Fenster im Fenster. */
  #screen-upload .kapsel-los{flex:none;width:auto;height:36px;margin:0;padding:0 16px;
    border:0;border-radius:var(--r-pill);background:var(--kapsel-ton, var(--brand));
    color:var(--on-brand);font:inherit;font-size:var(--fs-sm);font-weight:700;cursor:pointer;}
  #screen-upload .kapsel-los:hover{
    background:linear-gradient(rgba(0,0,0,.12),rgba(0,0,0,.12)),var(--kapsel-ton, var(--brand));}
  #screen-upload .kapsel-los:disabled{opacity:.4;cursor:not-allowed;background:var(--kapsel-ton, var(--brand));}
  #screen-upload .qu-frage-zeile input{height:36px;padding:0 14px;border:1px solid var(--line);
    border-radius:var(--r-pill);background:var(--surface-subtle);font-size:var(--fs-sm);}
  #screen-upload .qu-frage-zeile input:focus{outline:none;background:var(--card);
    border-color:var(--kapsel-ton, var(--brand));}
  #screen-upload .qu-merk{display:inline-flex;margin:10px 0 0;}
  #screen-upload #yt-status{margin-top:8px;}
  #screen-upload #yt-fallback{margin-top:10px;}
  #screen-upload #yt-preview{margin-top:10px;border-radius:14px;overflow:hidden;border:1px solid var(--line);}
  #screen-upload .mat-zurueck{display:inline-flex;margin:8px 0 4px;padding:4px 6px;
    color:var(--kapsel-ton-ink, var(--brand));font-weight:650;text-decoration:none;}
  #screen-upload .mat-zurueck:hover{background:var(--kapsel-ton-soft, var(--brand-soft));}

  /* Teil 3 (Beispiel-Faecher und -Karten) entfernt in v2.918.0 - Ansage Murat
     01.10.2026: „Oder starte mit einem dieser Beispiele … kaldir“. */

  /* ===== Material-Einstieg auf dem HANDY kompakt (2026-07) =====
     Vorher: Kontingent-Streifen umbrach auf 3 Zeilen, Eingabekasten + Schrift
     riesig -> man sah kaum etwas ohne langes Scrollen. Der Streifen ist
     seit v2.925.0 Teil des Kopfbands (am Telefon ausgeblendet, Block
     darunter). */
  @media(max-width:720px){
    #screen-upload .mat-greeting{font-size:18px;margin:0 0 10px;line-height:1.2;}
    #screen-upload textarea.mat-feld{font-size:14px;min-height:56px;padding:8px 4px 2px;}
    #screen-upload .ikbtn{width:36px;height:36px;}
    #screen-upload .ikbtn svg:not(.ic){width:18px;height:18px;}
    #screen-upload .senden{width:36px;height:36px;}
  }
  /* ===== KAPSEL AM TELEFON (v2.925.0) =====================================
     Schmal heißt schmal (CLAUDE.md): alles hier gilt nur bis 640 px, die
     Kapsel darüber bleibt unberührt. Auftrag Murat 02.10.2026: „mobilde
     olabildiğince küçült butonları yazıları … fach thema klasse anzahl
     kısmında bir şey düşünelim ya çok satır oluyor büyüyor orası“.
     - Die Kapsel füllt die Breite, der Schein rückt weiter ein.
     - Das Band ist EINE Zeile nur mit den vier Feldern; „∞ heute“ und
       „Upgraden“ stehen am Telefon im Alles-Menü („Nutzung heute“). Das
       Thema nimmt den Rest der Zeile und kürzt mit „…“, die Einheit
       „Aufgaben“ entfällt.
     - Das Textfeld bekommt die volle Breite, Plus und Werkzeuge stehen
       darunter (wie in jeder Telefon-Vorlage); das Menü geht nach oben auf.
     - Knöpfe 34 px, Knopfreihe 30 px, alles eine Stufe kleiner. */
  @media(max-width:640px){
    body.has-sidebar #screen-upload .komposit{width:100%;}
    #screen-upload .komposit::before{left:36px;right:36px;filter:blur(18px);}
    #screen-upload .box{border-radius:20px;padding:0 3px 3px;}
    #screen-upload .box-pflicht{display:flex;padding:3px 2px;min-height:34px;}
    #screen-upload .kapsel-kontingent,#screen-upload .kapsel-plan{display:none;}
    #screen-upload .box-pflicht .fach-pick-row{flex:1 1 auto;flex-wrap:nowrap;
      justify-content:flex-start;width:100%;}
    #screen-upload .box-pflicht .fpk{min-width:0;padding:0 6px;gap:3px;}
    #screen-upload .box-pflicht #mat-fach{min-width:4.6em;}
    #screen-upload .box-pflicht #mat-klasse{min-width:4.8em;}
    #screen-upload .box-pflicht .fpk + .fpk{margin-left:2px;}
    #screen-upload .box-pflicht .fpk + .fpk::before{left:-2px;}
    #screen-upload .box-pflicht .fpk:nth-child(2){flex:1 1 0;}
    #screen-upload .box-pflicht .fpk select,
    #screen-upload .box-pflicht .fpk input{font-size:var(--fs-2xs);}
    #screen-upload .box-pflicht .fpk select{max-width:8.5em;}
    #screen-upload .box-pflicht .ss-aus{flex:1 1 auto;min-width:0;width:100%;}
    #screen-upload .box-pflicht .ss-aus > input{width:100%;text-overflow:ellipsis;}
    #screen-upload .box-pflicht .fpk-einheit{display:none;}
    #screen-upload .kapsel-feld{border-radius:17px;}
    #screen-upload .kapsel-zeile{grid-template-areas:"eingabe eingabe eingabe" "plus . leiste";
      padding:4px 6px 0;}
    #screen-upload .mat-add::after{display:none;}
    #screen-upload .pop.pop-add{top:auto;bottom:42px;}
    #screen-upload textarea.mat-feld{min-height:46px;font-size:13px;padding:6px 4px 2px;}
    #screen-upload .ikbtn,#screen-upload .senden{width:32px;height:32px;}
    #screen-upload .ikbtn .ic{--ic-px:18px;--ic-sw:2.1;}
    #screen-upload .senden svg{width:19px;height:19px;}
    #screen-upload .mod-reihe{gap:6px;padding:0 6px 6px;}
    /* Die drei Einstiege teilen sich die Zeile und schrumpfen mit. */
    #screen-upload .mod-reihe{flex-wrap:nowrap;}
    #screen-upload .mod-reihe > .mat-start-reiter{flex:1 1 auto;}
    #screen-upload .mat-start-reiter{gap:6px;flex:1 1 auto;}
    #screen-upload .mat-start-reiter > .ls-acc-head,
    #screen-upload .mat-start-reiter > .mod-eb{flex:1 1 0;}
    #screen-upload .mat-start-reiter > .mod-eb > .ls-acc-head{flex:1 1 auto;}
    #screen-upload .mat-start-reiter .ls-acc-head{flex-direction:column;justify-content:center;gap:3px;
      padding:6px 3px 5px;border-radius:11px;text-align:center;}
    #screen-upload .mat-start-reiter .ls-acc-head > div{width:100%;}
    #screen-upload .mat-start-reiter .ls-acc-ico svg{width:16px;height:16px;}
    #screen-upload .mat-start-reiter .ls-acc-ttl{font-size:var(--fs-2xs, 11px);}
    #screen-upload .mat-einst-knopf{width:28px;height:28px;}
    #screen-upload .mat-einst-knopf .ic{--ic-px:18px;--ic-sw:2.1;}
    #screen-upload .mat-greeting{font-size:17px;}
    #screen-upload .kapsel-chip{height:30px;padding:0 11px;
      font-size:var(--fs-xs);}
    #screen-upload .kapsel-eingabefeld,#screen-upload .kapsel-los{height:32px;font-size:var(--fs-xs);}
  }

  /* --- Teil 4: Die Optionen in der Kapsel --- */
  /* HIER STAND DAS ERWEITERTE-OPTIONEN-FENSTER (.mat-ovl/.mat-modal) UND DER
     RIEGEL (.adv-toggle/.adv-arrow). Beides ist v2.324.0 ersatzlos entfallen
     und kommt nicht zurück: auch das Zahnrad von v2.925.0 öffnet kein
     Fenster, es blendet die Gruppen IN der Kapsel ein (Block „Knopfreihe
     und Zahnrad“ weiter unten, matEinstellungenUmschalten in index-app.js). */
  /* Das Panel liegt IM Eingabekasten (v2.324.0) und braucht deshalb keinen
     eigenen Rahmen mehr - zwei Kaesten ineinander, der innere ohne eigene
     Aussage, ist genau der Rand, den man sieht, ohne sagen zu koennen, was er
     umschliesst (dieselbe Ueberlegung wie bei #screen-share.card, 2.323.1). */
  .adv-panel{border:0;border-radius:0;padding:0;margin:0;background:transparent;}
  /* Material: sanfte Gruppierung der erweiterten Optionen */
  .mat-group{padding:14px 0 4px;border-top:1px solid var(--line);}
  .mat-group:first-of-type{border-top:0;padding-top:2px;}
  .mat-group-ttl{font-size:13.5px;font-weight:800;color:var(--text);margin:0 0 11px;letter-spacing:.01em;display:flex;align-items:center;gap:9px;}
  /* Icon je Gruppe: als CSS-Maske (Farbe = Marke), kein Markup-Eingriff noetig.
     Reihenfolge im DOM: 1 Fach · 2 Zielgruppe · 3 Aufgaben · 4 Lesetext · 5 Bild. */
  /* FALLE (Befund Murat 29.08.2026: „o kutucuk nedir? ben onu tam
     anlayamadim"): ohne `--grp-ico` maskiert NICHTS, und dann bleibt die
     volle 18-px-Flaeche als violettes Kaestchen stehen - ein Symbol, das
     nichts zeigt, sieht nicht leer aus, sondern falsch. Genau das passierte
     der Gruppe „Fertige Blaetter" (v2.533.0), die neu dazukam. Der
     Vorgabewert `none` laesst die Flaeche jetzt verschwinden, statt sie zu
     zeigen: eine vergessene Gruppe hat lieber gar kein Symbol als einen
     Klotz.

     UND DER VORGABEWERT IST EIN LEERES SVG, NICHT `none`: `mask-image:none`
     heisst „gar nicht maskieren" - also die volle Flaeche zeigen, genau der
     Fehler. Eine leere Maske ist durchsichtig, und durchsichtig heisst
     unsichtbar. */
  .mat-group-ttl::before{content:"";width:18px;height:18px;flex:none;background:#534AB7;
    -webkit-mask:var(--grp-ico,url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg'/%3E")) center/contain no-repeat;mask:var(--grp-ico,url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg'/%3E")) center/contain no-repeat;}
  /* NACH `data-grp`, NICHT NACH POSITION (v2.324.0). Vorher hingen die
     Symbole an `:nth-of-type` - eine Nummer. Als die Gruppe "Fach & Umfang"
     v2.324.0 in den Eingabekasten wanderte, rutschte JEDES Symbol eine Zeile
     hoch: neben "Zielgruppe" stand das Buch, neben "Aufgaben" die Personen.
     Kein Fehler, keine leere Stelle - nur vier falsche Bilder. Ein Name kann
     das nicht: er wandert mit der Gruppe mit. Das Buch der alten ersten
     Gruppe faellt ersatzlos weg; die Felder tragen im Kasten keine Symbole. */
  /* Lucide „image" (ISC) – Blatt mit Bildern, v2.978.0 */
  .mat-group[data-grp="bv"]{--grp-ico:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect width='18' height='18' x='3' y='3' rx='2' ry='2'/%3E%3Ccircle cx='9' cy='9' r='2'/%3E%3Cpath d='m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21'/%3E%3C/svg%3E");}
  .mat-group[data-grp="vor"]{--grp-ico:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect width='18' height='7' x='3' y='3' rx='1'/%3E%3Crect width='9' height='7' x='3' y='14' rx='1'/%3E%3Crect width='5' height='7' x='16' y='14' rx='1'/%3E%3C/svg%3E");}
  .mat-group[data-grp="ziel"]{--grp-ico:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='9' cy='8' r='3'/%3E%3Cpath d='M3.5 20a5.5 5.5 0 0 1 11 0'/%3E%3Cpath d='M16 6a3 3 0 0 1 0 6'/%3E%3Cpath d='M18.5 20a5.5 5.5 0 0 0-3-4.9'/%3E%3C/svg%3E");}
  .mat-group[data-grp="typen"]{--grp-ico:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 6h10M4 12h10M4 18h6'/%3E%3Cpath d='M16 16l2 2 4-4'/%3E%3C/svg%3E");}
  .mat-group[data-grp="lesetext"]{--grp-ico:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 3h8l5 5v13H6z'/%3E%3Cpath d='M14 3v5h5'/%3E%3Cpath d='M9 13h6M9 17h6'/%3E%3C/svg%3E");}
  .mat-group[data-grp="visual"]{--grp-ico:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='4' width='18' height='16' rx='2'/%3E%3Ccircle cx='8.5' cy='9.5' r='1.5'/%3E%3Cpath d='M21 15l-5-5-8 8'/%3E%3C/svg%3E");}
  .mat-group-sub{font-size:12px;color:var(--muted);margin:0 0 12px;line-height:1.45;}

  /* ===== (i)-Symbol mit Kurz-Erklaerung (2026-07) =====
     Ersetzt die frueheren Erklaerabsaetze (.mat-group-sub) im Fenster
     "Erweiterte Optionen". Regel aus CLAUDE.md: an einem Bedienelement steht
     hoechstens EIN Satz, alles Weitere gehoert ins Handbuch. Der Satz erscheint
     bei :hover (Maus) UND :focus (Tastatur + Antippen auf dem Handy, weil das
     Element tabindex="0" hat). Reines CSS – kein JS, kein externes Tooltip. */
  /* GEMELDET 29.07.2026: "das i sieht komisch aus". Ursache war die
     Kombination aus fester line-height (12px) in einem 15-px-Kreis und
     font-style:italic - der Buchstabe stand je nach Schriftgroesse der
     Umgebung leicht ausserhalb der Mitte und wirkte wie ein Fleck. Jetzt
     zentriert inline-flex das Zeichen unabhaengig von der Schriftgroesse,
     der Kreis ist eine Spur groesser und das Kursiv ist weg. */
  .ss-info{flex:none;width:16px;height:16px;border-radius:50%;border:1.4px solid var(--muted);
    box-sizing:border-box;display:inline-flex;align-items:center;justify-content:center;
    vertical-align:middle;color:var(--muted);font-size:10.5px;font-weight:800;line-height:1;
    font-family:Georgia,"Times New Roman",serif;
    text-align:center;cursor:help;position:relative;opacity:.75;transition:opacity .15s,color .15s,border-color .15s;}
  .ss-info:hover,.ss-info:focus{opacity:1;color:var(--brand);border-color:var(--brand);outline:none;}
  /* WICHTIG – NICHT wieder ein eigenes ::after-Tooltip hier einbauen!
     Es gab bis 2.59.1 genau das, und dadurch erschien die Erklaerung DOPPELT:
     die App hat seit laengerem einen zentralen "Sofort-Tooltip" (index-app.js,
     ein einziges <div class="ss-tipbox"> am <body>, das auf JEDES Element mit
     [data-tip] reagiert). Ein zweites CSS-Tooltip auf demselben Attribut ist
     immer eine Dopplung. Das Aussehen wird deshalb unten bei .ss-tipbox
     gepflegt, nicht hier. (Rueckmeldung Murat 29.07.2026)
     qa/unit/test_tooltip_einfach.py nagelt das fest. */

  /* ===== Der zentrale Sofort-Tooltip (gilt fuer ALLE [data-tip]-Elemente) =====
     Auf Wunsch Murat 29.07.2026 hell: weisser Grund, schwarze Schrift, feine
     Linie + Schatten, damit er sich vom Hintergrund abhebt. Im dunklen Design
     waere weiss ein Blitz - dort dieselbe Form in Karten-Optik. Die Groessen
     (max-width, Position) setzt weiterhin das JS, weil sie am Viewport haengen. */
  .ss-tipbox{position:fixed;z-index:9999;display:none;pointer-events:none;
    max-width:280px;padding:7px 11px;border-radius:9px;
    background:#fff;color:#12161F;border:1px solid rgba(16,24,40,.10);
    font-size:12px;font-weight:600;line-height:1.45;
    box-shadow:0 8px 24px rgba(16,24,40,.16),0 1px 3px rgba(16,24,40,.08);}
  html[data-theme="dark"] .ss-tipbox{background:var(--card,#1b2230);color:var(--ink,#e8ecf5);
    border-color:rgba(255,255,255,.14);box-shadow:0 8px 24px rgba(0,0,0,.45);}

  /* ===== Akkordeon der Optionen-Gruppen =====
     Bis 2026-07 nur auf dem Handy (<=720px). Jetzt ueberall: das Fenster war
     auf dem Desktop ueber zwei Bildschirmhoehen lang, obwohl "Zielgruppe &
     Sprache" und "Aufgaben" fast immer auf den Voreinstellungen bleiben.
     Zugeklappt zeigt die Titelzeile rechts eine Kurz-Zusammenfassung
     (.mat-grp-sum, gefuellt von matGrpSummary() in index-app.js), damit man
     den aktuellen Stand sieht, ohne aufzuklappen.
     .mat-group-bd wird zur Laufzeit von matAdvAccordionInit() eingehaengt. */
  .mat-grp-chev{flex:none;color:var(--muted);display:none;}
  .mat-grp-sum{margin-left:auto;flex:none;max-width:52%;font-size:11.5px;font-weight:650;
    color:var(--muted);letter-spacing:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
    display:none;}
  /* OHNE `.mat-modal-body` DAVOR (v2.324.0). Die Regeln hingen am Fenster,
     das es nicht mehr gibt - im Kasten griff dann kein Zuklappen mehr: alle
     Gruppen standen ausgeklappt untereinander, zwei Bildschirmhoehen lang,
     genau das Gegenteil des Gemeinten. `#advanced-options` ist einmalig im
     Dokument; der Vorsatz war also nie eine Eingrenzung, sondern nur die
     Herkunft der Regeln. */
  #advanced-options > .mat-group.collapsed > .mat-group-ttl > .mat-grp-sum{display:block;}
  #advanced-options > .mat-group > .mat-group-ttl{cursor:pointer;margin-bottom:0;
    transition:margin-bottom .24s cubic-bezier(.4,0,.2,1);}
  #advanced-options > .mat-group:not(.collapsed) > .mat-group-ttl{margin-bottom:11px;}
  /* ===== WEICH AUF UND ZU (v2.560.3) ==================================
     Wunsch Murat 30.08.2026: „dan diye acilmasa akordiyonlar. yani yumusak
     böyle inme yukari sürüklenmeyle acilip kapansalar biraz hava katalim
     oraya." Bis hierher stand an dieser Stelle `display:none` - der Pfeil
     drehte sich weich (Regel darunter, .18s), der Inhalt sprang hart. Das
     ist genau der Bruch, den man als „dan" hoert.

     WARUM `grid-template-rows` UND NICHT `height`: die Zielhoehe ist in
     jeder Gruppe eine andere und steht als `auto` fest - darauf greift kein
     Uebergang. Das Raster kann von `1fr` nach `0fr` fahren, ohne dass
     irgendwo eine Pixelhoehe gemessen werden muss. Deshalb legt
     `matAdvAccordionInit()` den Inhalt in EINE innere Huelle
     (`.mat-group-bdin`) - ein Rasterkind, sonst bewegt sich nur die erste
     Zeile.

     `overflow:hidden` muss sein, sonst quillt der Inhalt beim Fahren aus
     der Zeile. Die 3 px Innenabstand mit gleich grossem negativem
     Aussenabstand kosten kein Layout und lassen dem FOKUSRAHMEN der
     aeussersten Knoepfe Platz - ohne sie schnitte die Kante ihn ab.

     `visibility` ist kein Schmuck, sondern die Tastatur: bei `0fr` ist der
     Inhalt zwar flach, aber weiter anspringbar - man tabbte in eine
     zugeklappte Gruppe. Beim OEFFNEN ohne Verzoegerung sichtbar, beim
     SCHLIESSEN erst nach dem Fahren versteckt; daher die zwei
     verschiedenen Verzoegerungen.

     Auch der Abstand unter dem Titel wandert (0 <-> 11 px, Regeln
     darueber) - ohne eigenen Uebergang bliebe genau dort ein Sprung
     zurueck.

     WER BEWEGUNG ABGESTELLT HAT, BEKOMMT KEINE. `prefers-reduced-motion`
     ist fuer manche Menschen kein Geschmack, sondern Uebelkeit. */
  #advanced-options > .mat-group > .mat-group-bd{display:grid;
    grid-template-rows:1fr;transition:grid-template-rows .24s cubic-bezier(.4,0,.2,1);}
  #advanced-options > .mat-group.collapsed > .mat-group-bd{grid-template-rows:0fr;}
  #advanced-options > .mat-group > .mat-group-bd > .mat-group-bdin{
    min-height:0;overflow:hidden;padding:0 3px;margin:0 -3px;
    transition:visibility 0s;}
  #advanced-options > .mat-group.collapsed > .mat-group-bd > .mat-group-bdin{
    visibility:hidden;transition:visibility 0s .24s;}
  @media (prefers-reduced-motion: reduce){
    #advanced-options > .mat-group > .mat-group-bd,
    #advanced-options > .mat-group > .mat-group-bd > .mat-group-bdin,
    #advanced-options > .mat-group > .mat-group-ttl,
    #advanced-options > .mat-group > .mat-group-ttl > .mat-grp-chev{transition:none;}
  }
  #advanced-options > .mat-group > .mat-group-ttl > .mat-grp-chev{display:inline-flex;transition:transform .18s ease;}
  /* Ohne Zusammenfassung schiebt der Pfeil selbst nach rechts. */
  #advanced-options > .mat-group > .mat-group-ttl > .mat-grp-sum + .mat-grp-chev{margin-left:8px;}
  #advanced-options > .mat-group:not(.collapsed) > .mat-group-ttl > .mat-grp-chev{margin-left:auto;}
  .mat-group.collapsed .mat-grp-chev{transform:rotate(0deg);}
  .mat-group:not(.collapsed) .mat-grp-chev{transform:rotate(90deg);}
  #advanced-options > .mat-group.collapsed{padding-bottom:12px;}
  /* ===== Aufgabentyp „Reihenfolge" (v2.61.0) =====
     Sortiert wird mit Hoch/Runter-Knoepfen, NICHT per Ziehen: Drag&Drop ist auf
     Tablets die fehleranfaelligste Geste (Seite scrollen vs. Karte ziehen), und
     ein grosser Teil der Klassen arbeitet am Tablet. Die Knoepfe sind mit 34px
     bewusst fingerfreundlich. */
  .reihe-liste{display:flex;flex-direction:column;gap:8px;}
  .reihe-zeile{display:flex;align-items:center;gap:10px;padding:11px 12px;
    border:1.5px solid var(--line);border-radius:12px;background:var(--card);
    transition:border-color .15s,background .15s;}
  .reihe-nr{flex:none;width:24px;height:24px;border-radius:50%;background:var(--brand-soft,#EEF2FF);
    color:var(--brand);font-size:12px;font-weight:800;display:flex;align-items:center;justify-content:center;}
  .reihe-tx{flex:1;min-width:0;font-size:var(--fs-md);line-height:1.35;color:var(--ink);}
  .reihe-btns{flex:none;display:flex;gap:4px;}
  .reihe-b{width:34px;height:34px;border:1.5px solid var(--line);border-radius:9px;background:var(--card);
    color:var(--sub,#475569);cursor:pointer;display:flex;align-items:center;justify-content:center;padding:0;}
  .reihe-b:hover:not(:disabled){border-color:var(--brand);color:var(--brand);}
  .reihe-b:disabled{opacity:.3;cursor:default;}
  .reihe-zeile.ans-ok{border-color:var(--ok);background:var(--ok-soft);}
  .reihe-zeile.ans-bad{border-color:var(--bad);background:var(--bad-soft);}

  /* ===== Aufgabentyp „Tabelle" (v2.61.0) =====
     Auf schmalen Bildschirmen darf die Tabelle waagerecht gewischt werden –
     Umbrechen wuerde die Spaltenzuordnung zerstoeren, und genau die IST die
     Aufgabe. */
  .tab-wrap{overflow-x:auto;-webkit-overflow-scrolling:touch;}
  table.tab-quiz{border-collapse:collapse;width:100%;min-width:320px;font-size:14px;}
  table.tab-quiz th,table.tab-quiz td{border:1px solid var(--line);padding:8px 10px;text-align:left;vertical-align:middle;}
  table.tab-quiz thead th{background:var(--brand-soft,#EEF2FF);color:var(--brand);font-size:12.5px;font-weight:800;}
  table.tab-quiz tbody th{background:rgba(127,127,127,.05);font-weight:700;font-size:13.5px;white-space:nowrap;}
  table.tab-quiz td.tab-fix{color:var(--muted);}
  input.tab-in{width:100%;min-width:90px;border:1.5px solid var(--line);border-radius:8px;
    padding:7px 9px;font:inherit;font-size:14px;background:var(--card);color:var(--ink);}
  input.tab-in:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 3px rgba(46,91,255,.14);}
  input.tab-in.ans-ok{border-color:var(--ok);background:var(--ok-soft);}
  input.tab-in.ans-bad{border-color:var(--bad);background:var(--bad-soft);}

  .vis-seg-wrap{margin-top:2px;}
  .vis-note{font-size:12px;color:var(--muted);margin:8px 0 2px;line-height:1.45;display:none;}
  .vis-note.on{display:block;}
  /* ===== DIE KNOPFREIHE UND DAS ZAHNRAD (v2.925.0) =======================
     Unter dem Textfeld steht EINE Reihe: links der Knopf „Lernspiele &
     mehr“, rechts das Zahnrad (Auftrag Murat 02.10.2026: „lern spiele
     butonlarını da bir açılır menüye koy tek satırda olsunlar“ - drei Chips
     brachen am Telefon in zwei Zeilen um). Der Knopf öffnet ein Menü in der
     Bauart des Plus-Menüs (.pop): darin die drei Einstiege mit Symbol, Titel
     und Untertitel. Das VERHALTEN bleibt das von v2.528.0: Lernspiele klappt
     die Spiele DARUNTER auf, über die volle Breite; Erklärblatt und
     Klassenarbeit wechseln den Bildschirm. Die Glyphen behalten ihre
     Kennfarben (--ls-glyph, --eb-glyph, --kont-plan); offen oder mit
     gewähltem Spiel trägt der Knopf die THEMENFARBE (--kapsel-ton) wie
     „Mittel" und jede andere Wahl der Kapsel. Bis v2.991.0 war es VIOLETT
     (Kennfarbe der Lernspiele) – Murat 10.10.2026: „tema rengi olacak …
     bir tarafta tema rengi, diğer tarafta mor“. */
  .ls-acc{margin:0;padding:0;border-radius:0;background:none;box-shadow:none;}
  .ls-acc-inner{background:transparent;border-radius:0;}
  .mod-reihe{display:flex;flex-wrap:wrap;align-items:center;gap:8px;padding:4px 8px 8px;}
  .mod-reihe > *{flex:none;min-width:0;}
  /* DIE DREI EINSTIEGE ALS 3D-REITER (v2.996.1, Murat 11.10.2026:
     „lernspiele und mehr kısmında da 3d tab button şeklinde yapsana“).
     Bis v2.996.0 hingen sie im Menü am Knopf „Lernspiele & mehr“. Jetzt
     stehen sie nebeneinander in der Reihe - dieselbe Tiefe wie die Reiter im
     Einstellungskasten (.mat-reiter): erhaben mit dem Schattenpaar der alten
     Leiste auf --paper, gedrückt bzw. offen eingedrückt in der Themenfarbe,
     keine Unterstreichung. Sichtbar ist nur der Titel; der Untertitel bleibt
     im Markup (Vorlesewerkzeug). Die Symbole tragen die Themenfarbe statt
     ihrer Kennfarben - auch das Lernspiel-Violett ist damit weg. */
  .mod-reihe > .mat-start-reiter{flex:0 1 auto;}
  .mat-start-reiter{display:flex;align-items:center;gap:10px;min-width:0;padding:3px 2px;}
  .mat-start-reiter > .mod-eb{display:flex;min-width:0;}
  .mat-start-reiter .ls-acc-head{gap:7px;padding:6px 13px 6px 9px;border-radius:12px;min-width:0;
    background:var(--paper);color:var(--ink);text-decoration:none;
    box-shadow:3px 3px 7px var(--sb-tief), -3px -3px 7px var(--sb-hoch);
    transition:box-shadow .2s var(--sb-weich), background-color .2s ease, color .2s ease, transform .12s var(--sb-weich);}
  .mat-start-reiter .ls-acc-head > div{min-width:0;}
  .mat-start-reiter .ls-acc-ico,
  .mat-start-reiter .ls-acc-ico.eb-acc-ico,
  .mat-start-reiter .ls-acc-ico.ka-acc-ico{width:auto;height:auto;background:transparent;border-radius:0;
    color:var(--kapsel-ton, var(--brand));}
  .mat-start-reiter .ls-acc-ico svg{width:17px;height:17px;}
  .mat-start-reiter .ls-acc-ttl{font-size:13px;font-weight:750;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
  .mat-start-reiter .ls-acc-zusatz,
  .mat-start-reiter .ls-acc-sub,
  .mat-start-reiter .ls-acc-arrow{display:none;}
  .mat-start-reiter .ls-acc-head:hover{background:var(--paper);
    box-shadow:1px 1px 3px var(--sb-tief), -1px -1px 3px var(--sb-hoch);}
  .mat-start-reiter .ls-acc-head:active,
  .mat-start-reiter #ls-acc-kopf[aria-expanded="true"],
  body.ls-active .mat-start-reiter #ls-acc-kopf{
    background:var(--kapsel-ton-soft, var(--brand-soft));color:var(--kapsel-ton-ink, var(--brand));
    box-shadow:inset 2px 2px 5px var(--sb-tief), inset -2px -2px 5px var(--sb-hoch);}
  .mat-start-reiter .ls-acc-head:active{transform:scale(.985);}
  .mat-start-reiter #ls-acc-kopf[aria-expanded="true"] .ls-acc-ico,
  body.ls-active .mat-start-reiter #ls-acc-kopf .ls-acc-ico{color:var(--kapsel-ton-ink, var(--brand));}
  .mat-start-reiter .ls-acc-head:focus-visible{outline:2px solid var(--kapsel-ton, var(--brand));outline-offset:2px;}
  @media (prefers-reduced-motion: reduce){ .mat-start-reiter .ls-acc-head{transition:none;} }
  /* Grundform der Einstiege (bis v2.996.0 Menüzeilen: Symbol auf einem
     Hauch, Titel, darunter ein Satz). In der Kapsel überschreibt sie
     .mat-start-reiter oben. */
  .ls-acc-head{display:flex;align-items:center;gap:12px;padding:10px;border-radius:11px;
    color:var(--ink);cursor:pointer;user-select:none;transition:background .15s;}
  .ls-acc-head:hover{background:var(--kapsel-ton-soft, var(--surface-subtle));}
  .ls-acc-head:focus-visible{outline:2px solid var(--brand);outline-offset:-2px;}
  .ls-acc-ico{flex:none;width:36px;height:36px;border-radius:10px;display:flex;
    align-items:center;justify-content:center;background:var(--surface-subtle);color:var(--ls-glyph);}
  .ls-acc-ico svg{width:19px;height:19px;}
  .ls-acc-ttl{font-weight:650;font-size:14px;letter-spacing:0;line-height:1.25;}
  .ls-acc-sub{font-size:11.5px;font-weight:500;color:var(--muted);margin-top:2px;line-height:1.35;}
  .ls-pill{display:inline-flex;align-items:center;gap:4px;font-size:10.5px;font-weight:800;letter-spacing:.4px;
    text-transform:uppercase;padding:3px 9px;border-radius:99px;color:#fff;
    background:linear-gradient(135deg,#7A5AF8,#2E5BFF);}
  .ls-acc-arrow{display:none;}
  #ls-acc-kopf[aria-expanded="true"],body.ls-active #ls-acc-kopf{background:var(--kapsel-ton-soft, var(--brand-soft));}
  .mod-reihe .mod-eb:empty{display:none;}
  /* DAS ZAHNRAD: nur das Zeichen (Murat 02.10.2026: „o sürekli böyle
     yanmasın arka planını sil sadece dişli olsun“). Ruhend grau wie Plus
     und Mikrofon, beim Zeigen und offen in der Flächenfarbe; es dreht sich
     ein Stück - das ist der Zustand, kein Spiel. Kurz hatte es eine Fläche
     und pulsierte („yanıp sönen … bana bas“); beides ist zurückgenommen. */
  .mat-einst-knopf{margin-left:auto;flex:none;width:34px;height:34px;border:0;border-radius:50%;
    display:flex;align-items:center;justify-content:center;cursor:pointer;
    background:transparent;color:var(--sub);transition:color .2s;}
  .mat-einst-knopf .ic{transition:transform .4s cubic-bezier(.3,.7,.3,1);}
  .mat-einst-knopf:hover,.mat-einst-knopf.offen{color:var(--kapsel-ton-ink, var(--brand));}
  .mat-einst-knopf:hover .ic{transform:rotate(60deg);}
  .mat-einst-knopf.offen .ic{transform:rotate(90deg);}
  .mat-einst-knopf:focus-visible{outline:2px solid var(--brand);outline-offset:2px;}
  /* ===== DER EINSTELLUNGSKASTEN UNTER DER KAPSEL (v2.996.0) ==============
     Auftrag Murat 11.10.2026: „kutu sabit kalsın, büyümesin … ayarlar
     altta ayrı bir kutuda açılsın, aynı stilde … yan yana 3D tuşlar …
     sol nav gibi yumuşak açılıp kapansın“. Bis v2.995 standen die Gruppen
     als Klappzeilen IN der leuchtenden Kapsel und zogen sie lang.
       1. DER KASTEN ist ein zweites `.komposit` mit `.box` und
          `.kapsel-feld` - Rahmen, Verlauf und Schein kommen aus denselben
          Regeln wie oben, nichts davon ist hier nachgebaut. Zu ist er
          0 px hoch und ohne Schein.
       2. WEICH wie die Leiste links (#ml-alles): dieselbe Kurve
          --sb-weich, dieselbe Bewegung (ein Stück versetzt und minimal
          kleiner -> an seinem Platz). Die Höhe fährt über das Raster
          0fr -> 1fr - auf `auto` greift kein Übergang (siehe Akkordeon).
          `overflow:hidden` nur während des Fahrens; `.steht` setzt
          matEinstellungenUmschalten() nach dem Fahren.
       3. DIE REITER (.mat-reiter) nebeneinander, erhaben mit dem
          Schattenpaar der alten Seitenleiste (--sb-tief/--sb-hoch, auf
          --paper - auf Weiß fiele die helle Hälfte aus, siehe .pf-btn),
          gewählt EINGEDRÜCKT und in der Themenfarbe. Keine Unterstreichung.
          Ihr Inhalt erscheint direkt darunter (matReiterWaehlen).
     Wer Bewegung abgestellt hat, bekommt keine. */
  #screen-upload .komposit.mat-einst-komposit{margin-top:0;transition:margin-top .34s var(--sb-weich);}
  #screen-upload .komposit.mat-einst-komposit.offen{margin-top:18px;}
  #screen-upload .komposit.mat-einst-komposit:not(.offen)::before{opacity:0;}
  #screen-upload .mat-einst-falte{display:grid;grid-template-rows:0fr;overflow:hidden;
    transition:grid-template-rows .34s var(--sb-weich);}
  #screen-upload .mat-einst-komposit.offen > .mat-einst-falte{grid-template-rows:1fr;}
  #screen-upload .mat-einst-komposit.steht > .mat-einst-falte{overflow:visible;}
  #screen-upload .mat-einst-falte > .mat-einst-box{min-height:0;padding-top:4px;
    opacity:0;visibility:hidden;transform:translateY(-10px) scale(.985);transform-origin:50% 0;
    transition:transform .34s var(--sb-weich), opacity .24s ease, visibility 0s linear .34s;}
  #screen-upload .mat-einst-komposit.offen > .mat-einst-falte > .mat-einst-box{
    opacity:1;visibility:visible;transform:none;
    transition:transform .34s var(--sb-weich), opacity .24s ease, visibility 0s;}
  #screen-upload .mat-einst-feld{padding:0;}
  /* Die Reiter: gleich breit nebeneinander, am Telefon schrumpfen sie mit. */
  #screen-upload .mat-reiter-reihe{display:flex;gap:12px;padding:14px 14px 12px;}
  #screen-upload .mat-reiter{flex:1 1 0;min-width:0;display:flex;align-items:center;gap:10px;
    padding:10px 12px;border:0;border-radius:14px;cursor:pointer;font:inherit;text-align:left;
    background:var(--paper);color:var(--ink);text-decoration:none;
    box-shadow:3px 3px 7px var(--sb-tief), -3px -3px 7px var(--sb-hoch);
    transition:box-shadow .2s var(--sb-weich), background-color .2s ease, color .2s ease, transform .12s var(--sb-weich);}
  #screen-upload .mat-reiter .ic{flex:none;color:var(--kapsel-ton, var(--brand));}
  #screen-upload .mat-reiter-txt{display:flex;flex-direction:column;min-width:0;line-height:1.2;}
  #screen-upload .mat-reiter-name{font-size:13px;font-weight:750;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
  #screen-upload .mat-reiter-name .k-kurz{display:none;}
  #screen-upload .mat-reiter-sum{font-size:11px;font-weight:600;color:var(--muted);margin-top:2px;
    white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
  #screen-upload .mat-reiter-sum:empty{display:none;}
  #screen-upload .mat-reiter:hover{box-shadow:1px 1px 3px var(--sb-tief), -1px -1px 3px var(--sb-hoch);}
  #screen-upload .mat-reiter:active,
  #screen-upload .mat-reiter[aria-selected="true"]{
    background:var(--kapsel-ton-soft, var(--brand-soft));color:var(--kapsel-ton-ink, var(--brand));
    box-shadow:inset 2px 2px 5px var(--sb-tief), inset -2px -2px 5px var(--sb-hoch);}
  #screen-upload .mat-reiter:active{transform:scale(.985);}
  #screen-upload .mat-reiter[aria-selected="true"] .ic{color:var(--kapsel-ton-ink, var(--brand));}
  #screen-upload .mat-reiter[aria-selected="true"] .mat-reiter-sum{color:var(--kapsel-ton-ink, var(--brand));opacity:.75;}
  #screen-upload .mat-reiter:focus-visible{outline:2px solid var(--kapsel-ton, var(--brand));outline-offset:2px;}
  /* Die Gruppen: ohne Titel (der Reiter ist der Titel), ohne Linie und
     ohne Polster, solange sie zu sind - nur die gewählte trägt Höhe. */
  #screen-upload #advanced-options > .mat-group{padding:4px 18px 16px;border-top:0;
    transition:padding .34s var(--sb-weich);}
  #screen-upload #advanced-options > .mat-group.collapsed{padding-top:0;padding-bottom:0;}
  #screen-upload #advanced-options > .mat-group > .mat-group-ttl{display:none;}
  #screen-upload #advanced-options > .mat-group > .mat-group-bd{overflow:hidden;
    transition:grid-template-rows .34s var(--sb-weich);}
  #screen-upload #advanced-options > .mat-group.collapsed > .mat-group-bd > .mat-group-bdin{transition:visibility 0s .34s;}
  @media (prefers-reduced-motion: reduce){
    #screen-upload .komposit.mat-einst-komposit,
    #screen-upload .mat-einst-falte,
    #screen-upload .mat-einst-falte > .mat-einst-box,
    #screen-upload .mat-einst-komposit.offen > .mat-einst-falte > .mat-einst-box,
    #screen-upload .mat-reiter,
    #screen-upload #advanced-options > .mat-group,
    #screen-upload #advanced-options > .mat-group > .mat-group-bd{transition:none;}
  }
  @media (max-width:640px){
    #screen-upload .komposit.mat-einst-komposit.offen{margin-top:12px;}
    #screen-upload .mat-reiter-reihe{gap:6px;padding:10px 8px 8px;}
    #screen-upload .mat-reiter{flex-direction:column;justify-content:center;gap:4px;
      padding:8px 4px;border-radius:12px;text-align:center;}
    #screen-upload .mat-reiter-txt{align-items:center;width:100%;}
    #screen-upload .mat-reiter-name{font-size:var(--fs-2xs, 11px);max-width:100%;}
    #screen-upload .mat-reiter-name .k-lang{display:none;}
    #screen-upload .mat-reiter-name .k-kurz{display:inline;}
    #screen-upload .mat-reiter-sum{display:none;}
    #screen-upload #advanced-options > .mat-group{padding-left:10px;padding-right:10px;}
    #screen-upload #advanced-options > .mat-group:not(.collapsed){padding-bottom:12px;}
  }
  /* Die Kapsel darüber liegt eine Stufe höher: ihre Menüs („Lernspiele &
     mehr“, Plus) klappen über diesen Kasten, nicht darunter. */
  #screen-upload > .komposit.mat-einst-komposit{z-index:2;}
  /* Gruppensymbole in der Themenfarbe, nie Violett (Murat 11.10.2026). */
  #screen-upload .mat-group-ttl::before{background:var(--kapsel-ton, var(--brand));}
  /* „Fertige Blätter“ ist ausgeblendet (v2.992.0, Murat: „Fertige Blätter'ı
     kaldırıyoruz“). Der Code bleibt; die Vorlage wählt „Blattvorlage“. */
  #advanced-options > .mat-group[data-grp="vor"]{display:none !important;}
  /* Das Erklaerblatt traegt seine eigene Farbe - dieselbe wie die Kachel im
     Werkzeugkasten. Zwei Einstiege in derselben Farbe saehen aus wie ein
     Knopf mit zwei Haelften. */
  .eb-acc-ico{color:var(--eb-glyph);}
  /* Die Klassenarbeit (v2.898.0) im Ton ihres Kontingents - sie zählt wie
     die Planung (loadPlanQuota2 im Editor), deshalb --kont-plan. */
  .ka-acc-ico{color:var(--kont-plan);}
  /* ===== Fertige Blaetter (v2.533.0, benannt v2.534.0) =====
     Karten nebeneinander, umbrechend. Keine verkleinerte Seite - die kommt
     mit der Design-Schicht; bis dahin steht auf der Karte, was die
     Einstellung wirklich setzt. */
  /* EINE REIHE MIT PFEILEN (v2.535.0, Wunsch Murat 29.08.2026:
     „tek sira olmali, saga sola ok koy"). Vorher ein umbrechendes Raster -
     bei zehn Karten drei Zeilen, und die Reihe wuchs mit jeder neuen Karte
     nach unten statt zur Seite. Mit dem Regal je Fach (Plan Faz 12) waeren
     es Dutzende gewesen.

     Die Masse sind ABSICHTLICH dieselben wie bei der Design-Buehne des
     Erklaerblatts (`.eb-dz-*`): dort sind sie im Browser gemessen. Eigene
     Klassennamen trotzdem, weil `eb-` der Namensraum des Erklaerblatts ist -
     zwei Module an EINER Klasse haengen zu lassen heisst, dass die naechste
     Aenderung an einem beide trifft.

     WEDER `scroll-snap-type` NOCH `scroll-behavior:smooth` - beides ist
     dort ausprobiert und wieder herausgenommen worden (gemessen 28.08.2026):
     mit Rasterung zog ein Sprung auf 200 px wieder auf 32 px zurueck, mit
     Weichzeichner bewegte sich `scrollLeft` gar nicht. */
  .mat-vor-liste{display:flex;flex-direction:column;gap:8px;}
  .mat-vor-lauf{display:flex;align-items:stretch;gap:6px;min-width:0;}
  /* NUR DER PFEIL, KEIN KASTEN (v2.537.0, Anweisung Murat: „sadece ok
     olsunlar, kutuyu kaldir"). Ein Rahmen um einen Pfeil macht aus einer
     Blaetterhilfe ein Bedienelement, das mit den Karten daneben um
     Aufmerksamkeit streitet - und die Karten sind das, was man ansehen
     soll. Die Trefferflaeche bleibt 30 px breit; sie haengt an der Groesse
     des Knopfes, nicht an seinem Rahmen. */
  .mat-vor-pfeil{appearance:none;flex:none;width:30px;cursor:pointer;padding:0;
    display:inline-flex;align-items:center;justify-content:center;
    border:0;background:none;color:var(--muted);transition:color .12s;}
  .mat-vor-pfeil:hover{color:var(--brand);}
  .mat-vor-pfeil svg{width:20px;height:20px;fill:none;stroke:currentColor;
    stroke-width:2.2;stroke-linecap:round;stroke-linejoin:round;}
  /* AM TELEFON KEINE PFEILE (v2.540.0, Befund Murat 29.08.2026: „mobilde
     fertige blätter kismi sag sol yerlerini kaldir, mobile özel cok kötü
     duruyor orasi").

     Er hat recht, und der Grund ist der Platz: zweimal 30 px Pfeil plus
     Abstände fressen auf einem 375-px-Schirm ein Viertel der Zeile, und
     zurück bleibt eine Karte, die weder ganz zu sehen noch bequem zu
     treffen ist. Geblättert wird dort ohnehin mit dem FINGER - der Pfeil
     ist eine Maus-Hilfe, und auf dem Telefon gibt es keine Maus.

     NUR IM SCHMALEN BLOCK (CLAUDE.md, Mobil-Abschnitt): auf Tablet und
     Rechner bleibt die Reihe genau so, wie sie in v2.535.0 gebaut wurde.
     Die Einrückung der zwei Fusszeilen hing an der Pfeilbreite (36 px) -
     ohne Pfeil wäre sie eine Einrückung zu nichts. */
  /* KEIN SICHTBARER SCHIEBEBALKEN (Befund Murat 30.08.2026: „saga sola
     kaydirma bari cikiyor, görünmez yap").

     Geblättert wird hier mit den Pfeilen (Maus) oder mit dem Finger
     (Telefon). Der Balken ist also keine nötige Anzeige, sondern eine
     zweite, hässlichere Bedienung unter einer Reihe, die selbst nur gut
     zwei Fingerbreit hoch ist. GESCROLLT WIRD WEITER: `overflow-x:auto`
     bleibt stehen, nur die Anzeige verschwindet - Finger, Rad und Tastatur
     merken keinen Unterschied, und die Pfeile arbeiten unverändert über
     `scrollLeft` (matVorSchieben).

     ZWEI ZEILEN, WEIL EINE NICHT REICHT: `scrollbar-width:none` deckt
     Firefox und neuere Chrome/Safari ab. Die zweite Zeile richtet sich
     gegen die GLOBALE Regel `*:hover::-webkit-scrollbar-thumb` weiter oben
     in dieser Datei - die malt in WebKit beim Überfahren einen Daumen, und
     ohne sie zu überschreiben käme der Balken genau dann zurück, wenn die
     Maus über der Reihe steht. Also derselbe Bau wie bei `.fachbar`.

     Damit steht die Reihe auf demselben Stand wie die übrigen
     Karten-Streifen des Hauses (`.cockpit-recent`, `.pod-classbar`,
     `.kbp-tabs`); sie war mit `thin` der einzige Ausreisser. */
  @media (max-width:640px){
    .mat-vor-pfeil{display:none;}
    .mat-vor-alle,.mat-vor-zurueck{padding-left:2px;}
    .mat-vor-spur{padding-left:0;padding-right:0;}
  }
  .mat-vor-spur{flex:1 1 auto;min-width:0;display:flex;gap:12px;
    overflow-x:auto;overflow-y:hidden;padding:2px 2px 8px;
    scrollbar-width:none;-ms-overflow-style:none;}
  .mat-vor-spur::-webkit-scrollbar{display:none;}
  .mat-vor-k{position:relative;flex:0 0 176px;width:176px;}
  @media (max-width:560px){ .mat-vor-k{flex-basis:150px;width:150px;} }
  .mat-vor{appearance:none;cursor:pointer;font:inherit;text-align:left;
    width:100%;height:100%;display:flex;flex-direction:column;gap:3px;
    border:1px solid var(--line);border-radius:var(--r-control);
    background:var(--card);color:var(--ink);padding:10px 12px;
    transition:border-color .12s,background .12s;}
  .mat-vor:hover{border-color:var(--brand);}
  /* Der Name mittig, darunter die Facheignung - und sonst nichts (Faz A2).
     `text-align:left` steht an `.mat-vor` fuer die alten Erklaersaetze; die
     sind weg, also darf die Kachel mittig werden. Der Name darf umbrechen,
     die Fachzeile nicht: „Politik & Wirtschaft" auf zwei Zeilen liest sich
     wie zwei Faecher. */
  .mat-vor{text-align:center;align-items:center;}
  /* ===== NAME UND FACH LIEGEN AUF DEM BLATT (Faz B1, §3.1) ============
     Vorher standen sie DARUNTER und kosteten drei Zeilen Hoehe - mehr, als
     das Blatt darueber hoch war. In einer Reihe, durch die man blaettert,
     ist das die falsche Verteilung: gesucht wird mit dem Auge, gelesen erst
     bei der Kachel, die in Frage kommt.

     KEINE NEUE FARBE: der Streifen nimmt `--card` und `--line` aus dem
     Woerterbuch. Ein halbdurchsichtiges Dunkel haette hier besser
     ausgesehen und waere im Dunkelmodus falsch geblieben
     (DESIGN_SYSTEM.md §9).

     `pointer-events:none` ist Pflicht und nicht Feinschliff: der Lupenknopf
     liegt in derselben Kachel, und ein Streifen, der Klicks schluckt,
     nimmt ihm die untere Haelfte (§3.1, zweiter Punkt). */
  /* ZWEI KLASSEN JE REGEL, und das ist kein Zierat: weiter unten in dieser
     Datei stehen aus der alten Kachel noch `.mat-vor b` und `.mat-vor span`.
     Beide sind spezifischer als eine einzelne Klasse UND stehen spaeter -
     sie haetten jede Angabe hier ueberschrieben, und zwar lautlos. */
  .mat-vor .mat-vor-info{position:absolute;left:0;right:0;bottom:0;z-index:1;
    display:flex;flex-direction:column;gap:1px;padding:5px 7px 6px;
    background:var(--card);border-top:1px solid var(--line);
    opacity:0;transition:opacity .12s;pointer-events:none;}
  .mat-vor-k:hover .mat-vor-info,
  .mat-vor:focus-visible .mat-vor-info,
  .mat-vor-k.an .mat-vor-info{opacity:1;}
  @media (hover:none){ .mat-vor .mat-vor-info{opacity:1;} }
  .mat-vor .mat-vor-info > b{font-size:12px;line-height:1.25;font-weight:700;
    display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
  .mat-vor .mat-vor-fach{font-size:11px;font-weight:600;color:var(--ink);
    white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%;}
  .mat-vor .mat-vor-fach2{font-size:10px;color:var(--muted);line-height:1.3;
    max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
  .mat-vor-k.an .mat-vor{border-color:var(--brand);background:var(--brand-soft);
    box-shadow:inset 0 0 0 1px var(--brand);}
  /* Die Vorschau: ein GANZES Dokument in einem Rahmen, herunterskaliert.
     176 px von 760 px Blattbreite ergeben den Massstab 0.2316; die Rechnung
     steht hier und nicht im Blatt, weil die Breite hier festgelegt wird -
     dieselbe Ueberlegung wie bei `--ebb-mini-skala` im Erklaerblatt. */
  .mat-vor-mini{display:block;width:100%;aspect-ratio:210/297;overflow:hidden;
    border:1px solid var(--line);border-radius:6px;background:var(--paper);
    position:relative;pointer-events:none;}
  .mat-vor-mini iframe{position:absolute;top:0;left:0;width:760px;height:1074px;
    border:0;transform:scale(.2316);transform-origin:top left;}
  @media (max-width:560px){ .mat-vor-mini iframe{transform:scale(.1974);} }
  .mat-vor-lupe{position:absolute;top:6px;right:6px;width:26px;height:26px;z-index:2;
    display:inline-flex;align-items:center;justify-content:center;padding:0;
    border:1px solid var(--line);border-radius:8px;background:var(--card);
    color:var(--muted);cursor:pointer;opacity:0;transition:opacity .12s;}
  .mat-vor-k:hover .mat-vor-lupe,.mat-vor-lupe:focus-visible{opacity:1;}
  .mat-vor-lupe:hover{color:var(--brand);border-color:var(--brand);}
  .mat-vor-lupe svg{width:14px;height:14px;fill:none;stroke:currentColor;
    stroke-width:2;stroke-linecap:round;stroke-linejoin:round;}
  @media (hover:none){ .mat-vor-lupe{opacity:1;} }
  /* Die grosse Ansicht - ueber der Seite, damit die Auswahl stehen bleibt. */
  .mat-vor-gk{max-width:min(860px,96vw);width:100%;max-height:94vh;
    display:flex;flex-direction:column;overflow-y:auto;}
  .mat-vor-gk-akt{display:flex;align-items:center;gap:var(--s-2);margin-left:auto;}
  .mat-vor-gk-akt .btn{margin:0;width:auto;}
  .mat-vor-gk-satz{font-size:12px;color:var(--muted);margin:2px 0 8px;}
  /* EINE BILDLAUFLEISTE, NICHT ZWEI (v2.537.0).

     BEFUND MURAT 29.08.2026: „groß ansehen'a basiyom, hem icerdeki pdf
     kaydiriliyo hem pencerenin kendisi kaydirma cubugu geliyo - biri
     olmalidir." Er hat recht, und der Grund war hausgemacht: `.modal-card`
     scrollt ohnehin (`overflow-y:auto`), und der Blattkasten scrollte
     zusaetzlich. Zwei Leisten nebeneinander, und keine davon tat, was man
     erwartete.

     JETZT SCROLLT NUR DIE KARTE. Der Blattkasten waechst einfach mit -
     „millet salak degil, kaydirabilir". Die Kopfzeile bleibt oben kleben,
     sonst muesste man zum Schliessen erst wieder hochscrollen.

     Und mittig mit gleichen Raendern: das Blatt ist 760 px breit, die Karte
     breiter - ohne `justify-content` klebte es links und die Luft sammelte
     sich rechts. */
  .mat-vor-gk .modal-head{position:sticky;top:0;z-index:2;
    background:var(--card);padding-bottom:8px;}
  .mat-vor-gk-blatt{overflow:visible;display:flex;
    justify-content:center;align-items:flex-start;
    background:var(--paper);border-radius:var(--r-control);padding:var(--s-2);}
  .mat-vor-gk-buehne{flex:none;width:760px;transform-origin:top center;}
  .mat-vor-gk-blatt iframe{display:block;width:760px;height:1074px;
    border:0;background:var(--paper);}
  .mat-vor b{font-size:13px;font-weight:700;display:flex;align-items:center;
    gap:6px;flex-wrap:wrap;}
  .mat-vor span{font-size:11.5px;color:var(--muted);line-height:1.4;}
  .mat-vor.an span{color:var(--ink);}
  .mat-vor-was{font-size:11px !important;opacity:.8;}
  /* `.mat-vor-empf` gab es bis v2.533.2 – es hat die eine „empfohlene"
     Karte hervorgehoben. Seit der Fachfilter da ist, sind ALLE gezeigten
     Karten passend; eine davon auszuzeichnen hiesse, die anderen ohne Grund
     abzuwerten. Die Regel bleibt nur fuer `.mat-vor-ge` („geändert"). */
  .mat-vor-ge{font-style:normal;font-size:10px;font-weight:800;
    letter-spacing:.03em;text-transform:uppercase;padding:2px 6px;
    border-radius:999px;color:var(--bad);background:var(--bad-soft);}
  /* Der Ausweg aus dem Fachfilter (v2.533.3). Er steht in derselben Zeile
     wie die Karten, damit sichtbar ist, dass es noch mehr gibt - ein Filter
     ohne sichtbaren Ausweg ist eine Sperre mit besseren Manieren. */
  .mat-vor-alle{font-size:12px;padding-left:36px;}
  .mat-vor-alle button{appearance:none;border:0;background:none;padding:0;
    font:inherit;color:var(--muted);cursor:pointer;text-decoration:underline;}
  .mat-vor-alle button:hover{color:var(--brand);}
  .mat-vor-zurueck{font-size:12px;color:var(--muted);padding-left:36px;}
  .mat-vor-zurueck button{appearance:none;border:0;background:none;padding:0;
    font:inherit;font-weight:700;color:var(--brand);cursor:pointer;
    text-decoration:underline;}

  /* Wie viel Platz der Lesetext braucht (v2.531.1). Ein Satz unter den
     Schaltern - kein Absatz (CLAUDE.md: an einem Bedienelement steht
     hoechstens ein Satz). `warn` faerbt ihn, wenn es nicht mehr passt. */
  .lesetext-platz{font-size:12px;color:var(--muted);line-height:1.45;
    margin:2px 0 4px;}
  .lesetext-platz:empty{display:none;}
  .lesetext-platz.warn{color:var(--bad);font-weight:600;}

  /* ===== Beta-Protokoll im Admin-Bereich (v2.529.0) ===== */
  /* Der Beta-Reiter traegt eine eigene Farbe: er ist befristet und soll sich
     von den dauerhaften Eintraegen unterscheiden. `--kont-plan` ist der Ton,
     den das Woerterbuch fuer „vorlaeufig/Planung" schon fuehrt - keine neue
     Farbe. */
  .adm-tab-beta{color:var(--kont-plan);font-weight:800;}
  .adm-tab.active .adm-tab-beta{color:var(--kont-plan);}
  #admtab-beta .adm-tab-ico{color:var(--kont-plan);}
  .adm-tab-ico{display:inline-flex;align-items:center;}
  .adm-tab-ico svg{width:20px;height:20px;fill:none;stroke:currentColor;
    stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round;}
  .adm-beta-filter{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin-bottom:10px;}
  .adm-beta-btn{width:auto;padding:8px 14px;margin:0;}
  .adm-beta-kenn{display:block;font-size:11px;}
  .adm-beta-pdf{margin-left:8px;font-weight:700;}
  /* Die Frist ist aus der Zeile verschwunden (v2.564.0) - die Regel bleibt
     stehen, damit ein alter zwischengespeicherter Aufbau nichts zerreisst. */
  .adm-beta-frist{display:none;}
  /* ZWEI BEDIENELEMENTE, NEBENEINANDER. Vorher schob die Frist sie mit
     `margin-left:auto` an die beiden Raender - dazwischen lag eine
     Handbreit Nichts, und die Auswahl zog sich ueber die halbe Seite. */
  #admin-beta-filter{display:flex;align-items:center;gap:10px;flex-wrap:wrap;}
  #admin-beta-filter select{width:auto;min-width:180px;max-width:280px;}
  .adm-beta-wrap{overflow-x:auto;}
  .adm-beta-tab{width:100%;border-collapse:collapse;font-size:12.5px;}
  .adm-beta-tab th{text-align:left;padding:6px 8px;border-bottom:1px solid var(--line);
    white-space:nowrap;color:var(--muted);font-weight:700;}
  .adm-beta-tab td{padding:6px 8px;border-bottom:1px solid var(--line);vertical-align:top;}
  .adm-beta-tab td.eng{white-space:nowrap;}
  /* ⛔ DIE LETZTE SPALTE DARF NICHT ABGESCHNITTEN WERDEN (v2.640.3, Befund
     Murat 04.09.2026: „bide yaninda bisey daha var ama görünmüyor").
     Dort stehen bis zu VIER Wege - Erster Stand · Aktuell · Inhalt · PDF -
     und sie trug `white-space:nowrap` wie jede andere „enge" Spalte. Damit
     lief sie aus dem Bild, und „Inhalt" und „PDF" waren unerreichbar, ohne
     dass irgendetwas darauf hindeutete. Jetzt brechen die Wege um, stehen
     untereinander und sind alle erreichbar. */
  .adm-beta-tab td.adm-beta-wege{ white-space:normal; min-width:96px;
    display:flex; flex-direction:column; gap:2px; align-items:flex-start; }
  .adm-beta-tab td.adm-beta-wege a{ white-space:nowrap; }
  .adm-beta-pdf{ margin-left:0 !important; }
  .ls-acc-body{padding:4px 18px 16px;}
  .ls-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:10px;margin:6px 0 4px;}
  @media(min-width:620px){.ls-grid{grid-template-columns:repeat(3,1fr);}}
  .ls-tile{position:relative;border:1.5px solid var(--line);border-radius:13px;padding:13px 11px;cursor:pointer;
    background:var(--card);transition:border-color .14s,background .14s,transform .08s;text-align:center;}
  .ls-tile:hover{border-color:var(--kapsel-ton, var(--brand));background:var(--kapsel-ton-soft, var(--brand-soft));}
  .ls-tile:active{transform:scale(.98);}
  .ls-tile.on{border-color:var(--kapsel-ton, var(--brand));background:var(--kapsel-ton-soft, var(--brand-soft));
    box-shadow:0 0 0 1px var(--kapsel-ton, var(--brand)) inset;}
  .ls-tile-ico{width:26px;height:26px;margin:0 auto 7px;color:var(--kapsel-ton, var(--brand));}
  .ls-tile.on .ls-tile-ico{color:var(--kapsel-ton-ink, var(--brand));}
  .ls-tile-name{font-size:12.5px;font-weight:700;color:var(--ink);line-height:1.2;}
  .ls-tile-desc{font-size:10.5px;color:var(--muted);margin-top:3px;line-height:1.25;}
  .ls-tile-check{position:absolute;top:7px;right:7px;width:17px;height:17px;border-radius:50%;
    background:var(--kapsel-ton, var(--brand));color:var(--card);display:none;align-items:center;justify-content:center;}
  .ls-tile.on .ls-tile-check{display:flex;}
  .ls-diff-wrap{margin-top:12px;}
  /* Escape-Room: Themen-Auswahl (fachunabhängige Story-Verpackung) */
  .esc-theme-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:8px;margin-top:6px;}
  @media(min-width:620px){.esc-theme-grid{grid-template-columns:repeat(5,1fr);}}
  .esc-theme{position:relative;border:1.5px solid var(--line);border-radius:11px;padding:10px 6px 9px;cursor:pointer;
    text-align:center;background:var(--card);transition:border-color .14s,background .14s,transform .08s;}
  .esc-theme:hover{transform:translateY(-1px);}
  .esc-theme .et-emoji{font-size:22px;line-height:1;display:block;margin-bottom:5px;}
  .esc-theme .et-name{font-size:11px;font-weight:700;line-height:1.25;}
  .esc-theme.on{border-color:var(--kapsel-ton, var(--brand));background:var(--kapsel-ton-soft, var(--brand-soft));box-shadow:0 0 0 1px var(--kapsel-ton, var(--brand)) inset;}
  .ls-diff-lbl{font-size:12px;font-weight:700;color:var(--muted);display:block;margin-bottom:6px;}
  .ls-hint{font-size:12px;color:var(--muted);background:var(--kapsel-ton-soft, var(--brand-soft));border:0;
    border-radius:10px;padding:10px 12px;margin-top:12px;line-height:1.4;display:flex;gap:8px;align-items:flex-start;}
  .ls-hint svg{flex:none;color:var(--kapsel-ton, var(--brand));margin-top:1px;}
  .ls-locked{opacity:.45;pointer-events:none;filter:grayscale(.3);}
  .ls-lockbadge{display:none;font-size:11px;font-weight:700;color:var(--kapsel-ton-ink, var(--brand));background:var(--kapsel-ton-soft, var(--brand-soft));
    border-radius:8px;padding:6px 10px;margin-top:10px;align-items:center;gap:6px;}
  body.ls-active .ls-lockbadge{display:inline-flex;}
  .acc-head{display:flex;align-items:center;gap:9px;cursor:pointer;user-select:none;}
  .acc-head h3{margin:0;}
  .acc-arrow{display:inline-block;transition:transform .18s ease;font-size:13px;color:var(--muted);flex:0 0 auto;}
  .acc-arrow.open{transform:rotate(90deg);}
  .acc-body{margin-top:14px;}
  .acc-body.hidden{display:none;}

  /* Aufgaben-Quelle: Icon-Kacheln */
  .ex-src-tile{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:7px;
    background:#fff;border:1.5px solid var(--line);border-radius:12px;padding:14px 8px;cursor:pointer;
    color:var(--ink,#1a2233);font:inherit;text-align:center;line-height:1.2;transition:border-color .15s,background .15s,transform .1s;}
  .ex-src-tile:hover{border-color:var(--brand);background:var(--brand-soft,#F0F4FF);}
  .ex-src-tile:active{transform:scale(.97);}
  .ex-src-tile svg{width:24px;height:24px;color:var(--brand);}
  .ex-src-tile span{font-size:12px;font-weight:600;}

  /* === EDITOR === */
  .ed-card{border:1.5px solid var(--line);border-radius:14px;padding:14px;margin-bottom:14px;}
  .ed-head{display:flex;justify-content:space-between;align-items:center;margin-bottom:10px;font-size:12.5px;color:var(--muted);font-weight:700;}
  .ed-del{color:var(--bad);cursor:pointer;font-weight:700;text-decoration:none;}
  /* Frage-Akkordeon im Editor: zugeklappt zeigt nur den Kopf, Klick öffnet den Body */
  .ed-card .ed-head{cursor:pointer;user-select:none;margin-bottom:0;gap:8px;}
  .ed-head-main{display:flex;align-items:center;gap:8px;min-width:0;flex:1;}
  .ed-chev{width:16px;height:16px;flex:none;fill:none;stroke:var(--muted);stroke-width:2.2;stroke-linecap:round;stroke-linejoin:round;transition:transform .15s;}
  .ed-card:not(.ed-collapsed) .ed-chev{transform:rotate(90deg);}
  .ed-head-no{color:var(--ink);font-weight:800;flex:none;}
  .ed-head-type{flex:none;font-size:10.5px;font-weight:700;padding:2px 7px;border-radius:99px;background:var(--brand-soft);color:var(--brand-dk);}
  .ed-head-prev{font-weight:500;color:var(--muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0;}
  .ed-del{flex:none;font-size:14px;padding:2px 6px;border-radius:8px;}
  .ed-del:hover{background:var(--bad-soft,rgba(216,64,64,.1));}
  .ed-body{margin-top:12px;}
  .ed-card.ed-collapsed .ed-body{display:none;}
  .ed-card.ed-collapsed{padding-bottom:14px;}
  .ed-del:hover{text-decoration:underline;}
  .ed-card textarea{min-height:54px;margin-bottom:10px;}
  .ed-card input[type=text]{margin-bottom:0;}
  /* Abbildungs-Buttons (Funktionsgraph · Figur · Eigenes Bild): gleiche Größe,
     Icon + Label, dezent bis Hover. */
  .ed-abb-btn{flex:1 1 0;min-width:130px;display:inline-flex;align-items:center;justify-content:center;gap:7px;
    font-size:13px;padding:10px 12px;color:var(--brand);border:1px solid var(--line);border-radius:10px;
    background:var(--card);font-weight:600;cursor:pointer;transition:border-color .12s,background .12s,box-shadow .12s;}
  .ed-abb-btn:hover{border-color:var(--brand);background:var(--brand-soft,#EEF2FF);box-shadow:0 2px 8px rgba(46,91,255,.1);}
  .ed-abb-btn svg{width:16px;height:16px;fill:none;stroke:currentColor;stroke-width:1.9;stroke-linecap:round;stroke-linejoin:round;flex:none;}
  .ed-meta{display:flex;gap:14px;margin-top:10px;padding-top:10px;border-top:1px dashed var(--line);}
  .ed-meta label{display:flex;flex-direction:column;gap:4px;font-size:11.5px;color:var(--muted);font-weight:700;}
  .ed-meta select,.ed-meta input{padding:7px 9px;border:1px solid var(--line);border-radius:8px;font-size:13px;font-family:inherit;}
  .ed-meta input[type=number]{width:80px;}
  .ed-optrow{display:flex;align-items:center;gap:10px;margin-bottom:8px;}
  .ed-optrow input[type=text]{flex:1;}
  .ed-optrow input[type=radio],.ed-optrow input[type=checkbox]{width:18px;height:18px;flex-shrink:0;accent-color:var(--ok);}
  /* === ESCAPE-ROOM BEARBEITEN (B1, PLAN_ESCAPE_LEBENDIG §3) ================
     Das Fenster der Lehrkraft fuer die Texte der Stationen
     (static/js/escape-bearbeiten.js). Karten wie der Quiz-Editor (.ed-card),
     dazu nur, was ein Raum mehr hat: der Buchstabe je Station, das
     Loesungswort, ein fester Fuss mit Speichern. Steht VOR dem Escape-Block -
     dort darf nur stehen, was am Kinder-Bildschirm haengt
     (qa/unit/test_escape_modus.py). */
  .esb-karte{max-width:760px;width:100%;max-height:92vh;display:flex;flex-direction:column;padding:0;
    background:var(--card);color:var(--ink);overflow:hidden;}
  .esb-karte .modal-head{padding:var(--s-4) var(--s-5) var(--s-3);margin:0;}
  .esb-satz{margin:0;padding:var(--s-3) var(--s-5);font-size:var(--fs-sm);color:var(--muted);}
  .esb-liste{flex:1;min-height:0;overflow-y:auto;padding:0 var(--s-5) var(--s-3);
    -webkit-overflow-scrolling:touch;overscroll-behavior:contain;}
  .esb-wort{display:flex;align-items:center;flex-wrap:wrap;gap:6px;margin:0 0 var(--s-3);}
  .esb-wort-lbl{font-size:var(--fs-sm);font-weight:700;color:var(--muted);margin-right:4px;}
  .esb-zeichen{display:inline-flex;align-items:center;justify-content:center;min-width:24px;height:24px;
    padding:0 5px;border-radius:6px;background:var(--brand-soft);color:var(--brand-dk);font-weight:800;
    font-size:13px;flex:none;}
  .esb-neben{flex:none;font-size:10.5px;font-weight:700;padding:2px 7px;border-radius:var(--r-pill);
    background:var(--paper);color:var(--muted);}
  .esb-feld{display:flex;flex-direction:column;gap:5px;margin:0 0 var(--s-3);}
  .esb-feld>span{font-size:12px;font-weight:700;color:var(--muted);}
  .esb-feld input[type=text],.esb-feld textarea{width:100%;box-sizing:border-box;padding:9px 11px;
    border:1px solid var(--line);border-radius:var(--r-control);font:inherit;font-size:14px;
    color:var(--ink);background:var(--card);margin:0;}
  .ed-card .esb-feld textarea{min-height:44px;margin:0;resize:vertical;}
  .esb-feld input[type=text]:focus,.esb-feld textarea:focus{outline:none;border-color:var(--brand);
    box-shadow:0 0 0 3px var(--brand-soft);}
  .esb-feld .ed-optrow{margin:0;}
  .esb-aufgabe{border-top:1px dashed var(--line);border-bottom:1px dashed var(--line);
    padding:var(--s-3) 0 0;margin:0 0 var(--s-3);}
  .esb-paar,.esb-schritt{display:flex;align-items:center;gap:8px;}
  .esb-paar>span{color:var(--muted);flex:none;}
  .esb-nr{flex:none;width:22px;text-align:center;font-weight:800;color:var(--muted);}
  .esb-wahl{display:flex;gap:var(--s-4);}
  .esb-wahl label{display:flex;align-items:center;gap:6px;font-weight:600;cursor:pointer;}
  .esb-fuss{display:flex;align-items:center;justify-content:flex-end;gap:var(--s-2);flex-wrap:wrap;
    padding:var(--s-3) var(--s-5);border-top:1px solid var(--line);background:var(--card);}
  .esb-fuss .btn{width:auto;padding:10px 18px;font-size:15px;}
  .esb-msg{flex:1 1 200px;font-size:var(--fs-sm);color:var(--muted);}
  .esb-msg.warn{color:var(--bad-ink);font-weight:600;}
  .ed-card.esb-fehler{border-color:var(--bad);}
  /* „Neu erzeugen" (B2) oben in der Karte: Wunsch + Knopf, darunter die Rueckmeldung. */
  .esb-neu{display:flex;align-items:center;flex-wrap:wrap;gap:8px;margin:0 0 var(--s-3);padding:var(--s-2);
    border-radius:var(--r-control);background:var(--paper);}
  .esb-neu input[type=text]{flex:1 1 220px;min-width:0;padding:8px 10px;border:1px solid var(--line);
    border-radius:var(--r-control);font:inherit;font-size:14px;color:var(--ink);background:var(--card);margin:0;}
  .esb-neu .btn{width:auto;padding:8px 14px;font-size:14px;}
  .esb-neu-msg{flex:1 1 100%;font-size:var(--fs-sm);color:var(--muted);}
  .esb-neu-msg:empty{display:none;}
  .esb-neu-msg.warn{color:var(--bad-ink);font-weight:600;}
  /* Die Raetselart (B3) als Auswahl ueber der Aufgabe. */
  .esb-art select{align-self:flex-start;max-width:100%;padding:8px 10px;border:1px solid var(--line);
    border-radius:var(--r-control);font:inherit;font-size:14px;color:var(--ink);background:var(--card);}
  /* Stationen einfuegen und entfernen (B4). Das Wort, das daraus wird, steht
     oben - VOR dem Speichern (Plan §3 B4). */
  .esb-st-fuss{display:flex;flex-wrap:wrap;gap:8px;justify-content:space-between;margin-top:var(--s-2);}
  .esb-st-fuss .btn{width:auto;padding:7px 12px;font-size:13px;}
  .esb-st-fuss .btn.esb-weg{color:var(--bad-ink);}
  .esb-st-fuss .btn:disabled{opacity:.5;cursor:default;}
  .esb-marke{display:inline-flex;align-items:center;gap:6px;flex:none;}
  .esb-neu-marke{flex:none;font-size:10.5px;font-weight:800;padding:2px 7px;border-radius:var(--r-pill);
    background:var(--ok-soft);color:var(--ok-ink);}
  .ed-card.esb-st-neu{border-style:dashed;}
  .esb-wort-neu{margin:0 0 var(--s-3);padding:var(--s-2) var(--s-3);border-radius:var(--r-control);
    background:var(--amber-soft);color:var(--amber-ink);font-size:var(--fs-sm);}
  body.esb-offen{overflow:hidden;}
  @media (max-width:640px){
    .esb-karte{max-height:100%;}
    .esb-karte .modal-head,.esb-satz,.esb-liste,.esb-fuss{padding-left:var(--s-3);padding-right:var(--s-3);}
  }
  /* Aufgabentypen als kompakte Chips (2026-07, Konzept B): statt grosser
     Kaestchen kleine Pillen, die umbrechen – spart Hoehe, passt zum Karten-Look.
     Die native Checkbox wird versteckt, ein Haekchen-Kreis zeigt die Auswahl. */
  /* EIN AUSGERICHTETES RASTER (v2.467.0).
     ZWEI ANLAEUFE, und der erste war falsch. v2.465.0 machte aus dem
     umbrechenden Block EINE waagerecht rollende Zeile - Befund Murat sofort:
     „aufgaben scroll a düsüyo bu olmaz böyle. düzenli alt alta koy ama
     düzenli görüsünler." Und das stimmt: Waagerechtes Rollen versteckt
     Auswahlmoeglichkeiten hinter einer Kante, die niemand sucht. Wer
     „Fehlersuche" nie sieht, benutzt sie nie.

     Das eigentliche Uebel war nie das Umbrechen, sondern die UNRUHE: ein
     `flex-wrap` bricht dort um, wo die Breite zufaellig endet - jede Zeile
     endet woanders, nichts steht untereinander. Ein Raster mit GLEICH
     BREITEN Spalten bricht an derselben Stelle: die Kaestchen stehen in
     Spalten und Zeilen, wie eine Liste. Sichtbar bleibt alles, und ruhig
     ist es trotzdem. `auto-fill` bestimmt die Spaltenzahl aus der Breite -
     am Computer vier, auf dem Tablet drei, auf dem Handy zwei (unten). */
  .typ-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(146px,1fr));gap:6px;}
  /* `flex` statt `inline-flex`: das Kaestchen fuellt seine Rasterzelle, sonst
     schrumpft es auf die Textbreite und die Spalten waeren wieder ungleich. */
  .typ-row{display:flex;align-items:center;gap:6px;cursor:pointer;font-size:11.5px;font-weight:700;
    color:var(--sub,#475569);border:1.5px solid var(--line);border-radius:18px;padding:6px 10px 6px 9px;
    background:var(--card);white-space:nowrap;min-width:0;
    transition:border-color .12s,background .12s,color .12s,opacity .12s;}
  /* Ein zu langer Name kuerzt sich, statt die Spalte zu sprengen. */
  .typ-row span{overflow:hidden;text-overflow:ellipsis;}
  /* SCHMAL: zwei Spalten. Vier Spalten a 146 px passen auf einem Handy nicht,
     `auto-fill` faellt dort ohnehin auf eine Spalte zurueck - und elf
     einspaltige Zeilen sind wieder genau der lange Block, der weg sollte.
     Zwei feste Spalten sind der Mittelweg. Die Grundregel oben bleibt
     unberuehrt (CLAUDE.md: „schmal aendern heisst SCHMAL aendern"). */
  @media (max-width:640px){
    .typ-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:5px;}
    .typ-row{font-size:11px;padding:6px 8px;}
  }
  /* Gesperrt heisst SICHTBAR gesperrt: ausgegraut, nicht anklickbar - aber
     weiterhin da, damit klar ist, dass es die Wahl gibt. Ein Feld, das
     verschwindet, sucht man beim naechsten Mal. */
  .typ-row.typ-aus{opacity:.42;cursor:not-allowed;}
  .typ-row.typ-aus:hover{border-color:var(--line);}
  .typ-row:hover{border-color:#C7D2FE;}
  .typ-row:has(input:checked){border-color:#B9C7FF;background:var(--brand-soft,#EEF1FB);color:#1B3FCC;}
  .typ-row input[type=checkbox]{position:absolute;opacity:0;width:1px;height:1px;pointer-events:none;}
  .typ-row::before{content:"";width:14px;height:14px;flex:none;border-radius:50%;
    border:1.6px solid var(--line);background:transparent;transition:all .12s;}
  .typ-row:has(input:checked)::before{border-color:var(--brand,#2E5BFF);
    background:var(--brand,#2E5BFF) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='3.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20 6 9 17l-5-5'/%3E%3C/svg%3E") center/11px no-repeat;}
  .typ-row:has(input:focus-visible){box-shadow:0 0 0 3px rgba(46,91,255,.18);}
  .ed-hint{font-size:11.5px;color:var(--muted);margin:2px 0 8px;}
  .ed-pair{display:flex;align-items:center;gap:8px;margin-bottom:8px;}
  .ed-pair input[type=text]{flex:1;}
  .ed-pair .ed-pairdel{color:var(--bad);cursor:pointer;font-weight:700;flex-shrink:0;}
  .ed-erk{margin-top:6px;}
  @media (prefers-color-scheme: dark) {
    html:not([data-theme="light"]) .mini-btn{background:var(--card);}
  }

  /* ===== UNTERRICHTSFÄCHER-MANAGER (Dateimanager) ===== */
  .uf-bar{display:flex;align-items:center;gap:12px;margin:4px 0 20px;flex-wrap:wrap;}
  .uf-back{display:inline-flex;align-items:center;gap:5px;border:none;background:rgba(127,127,127,0.10);border-radius:10px;padding:8px 14px 8px 11px;cursor:pointer;font-weight:600;font-family:inherit;font-size:14px;color:var(--ink);}
  .uf-back:hover{background:rgba(127,127,127,0.18);}
  .uf-back svg{width:16px;height:16px;}
  /* pfad: mavi/mor badge stili */
  .uf-pfad{display:inline-flex;align-items:center;gap:6px;background:linear-gradient(135deg,rgba(59,130,246,0.12),rgba(139,92,246,0.12));border:1px solid rgba(124,92,246,0.25);padding:6px 13px;border-radius:999px;}
  .uf-crumb-item{font-size:13px;font-weight:700;color:#6d5dd3;letter-spacing:.01em;}
  .uf-crumb-sep{color:#9b8fd6;font-size:13px;}
  .uf-trashrow{position:absolute;top:12px;right:12px;margin:0;z-index:5;}
  .uf-trashbtn{display:inline-flex;align-items:center;gap:5px;border:none;background:none;cursor:pointer;padding:6px;color:var(--muted);font-family:inherit;}
  .uf-trashbtn:hover{color:var(--ink);}
  .uf-trashbtn svg{width:18px;height:18px;}
  .uf-trashbtn .ubadge{background:var(--bad);color:#fff;border-radius:10px;padding:1px 8px;font-size:11.5px;font-weight:700;}
  /* 2'li kare grid — ortalanmış */
  .uf-grid2{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px;max-width:520px;margin:0 auto;}
  .uf-card{position:relative;border:1px solid var(--line);border-radius:18px;background:var(--card);cursor:pointer;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:11px;padding:26px 16px;text-align:center;transition:transform .12s,box-shadow .12s,border-color .12s;}
  .uf-card:hover{transform:translateY(-2px);box-shadow:0 8px 22px rgba(27,34,48,0.10);border-color:rgba(127,127,127,0.25);}
  .uf-ico{width:54px;height:54px;border-radius:15px;display:flex;align-items:center;justify-content:center;}
  .uf-ico svg{width:30px;height:30px;}
  .uf-card .lbl{font-weight:700;font-size:15px;line-height:1.25;color:var(--ink);}
  .uf-cnt{font-size:11.5px;color:var(--muted);}
  .uf-card-add{border-style:dashed;border-color:rgba(124,92,246,0.4);background:rgba(124,92,246,0.03);}
  .uf-card-add:hover{background:rgba(124,92,246,0.07);}
  .uf-ico-add{background:rgba(124,92,246,0.10);color:#7c5cf6;}
  .uf-ico-add svg{width:26px;height:26px;}
  .uf-lbl-add{color:#7c5cf6;font-size:14px;}
  .uf-draghandle{position:absolute;top:9px;left:9px;color:var(--muted);opacity:0;cursor:grab;transition:opacity .12s;}
  .uf-card:hover .uf-draghandle{opacity:.45;}
  .uf-draghandle svg{width:18px;height:18px;}
  .uf-cardmenu{position:absolute;top:9px;right:9px;color:var(--muted);opacity:0;cursor:pointer;transition:opacity .12s;padding:2px;}
  .uf-card:hover .uf-cardmenu{opacity:.55;}
  .uf-cardmenu:hover{opacity:1;}
  .uf-cardmenu svg{width:18px;height:18px;}
  .uf-dragging{opacity:.4;}
  /* Pop menü */
  .uf-popmenu{position:absolute;z-index:10000;background:var(--card);border:1px solid var(--line);border-radius:11px;box-shadow:0 12px 30px rgba(0,0,0,.16);padding:5px;min-width:150px;}
  .uf-popmenu button{display:block;width:100%;text-align:left;border:none;background:none;padding:9px 12px;border-radius:8px;cursor:pointer;font-family:inherit;font-size:13.5px;color:var(--ink);}
  .uf-popmenu button:hover{background:rgba(127,127,127,0.10);}
  .uf-popmenu button.danger{color:var(--bad);}
  /* Akordeon (Börse fach-acc) */
  .uf-acc-ico{width:34px;height:34px;border-radius:10px;background:rgba(127,127,127,0.10);display:flex;align-items:center;justify-content:center;color:var(--muted);flex:none;}
  .uf-acc-ico svg{width:19px;height:19px;}
  .uf-acc-drag{position:static;opacity:.35;flex:none;}
  .fach-acc:hover .uf-acc-drag{opacity:.6;}
  .uf-foldacts{display:flex;gap:1px;margin-right:6px;opacity:0;transition:opacity .12s;}
  .fach-acc-head:hover .uf-foldacts{opacity:1;}
  /* Dosya satırı — numaralı */
  .uf-list{display:flex;flex-direction:column;gap:8px;}
  .uf-item{display:flex;align-items:center;gap:6px;padding:4px 6px 4px 4px;border-radius:11px;transition:background .12s;}
  .uf-item:hover{background:rgba(127,127,127,0.05);}
  .uf-item.is-hidden{opacity:.5;}
  .uf-itemdrag{color:var(--muted);opacity:0;cursor:grab;flex:none;display:flex;}
  .uf-item:hover .uf-itemdrag{opacity:.4;}
  .uf-itemdrag svg{width:16px;height:16px;}
  .uf-item-link{flex:1;display:flex;align-items:center;gap:11px;text-decoration:none;color:inherit;padding:8px 6px;min-width:0;}
  .uf-num{width:24px;height:24px;border-radius:7px;background:linear-gradient(135deg,#3B82F6,#7c5cf6);color:#fff;font-size:12.5px;font-weight:700;display:flex;align-items:center;justify-content:center;flex:none;}
  /* Titel: EINZEILIG mit Ellipsis – nie mehr Buchstabe-für-Buchstabe umbrechen,
     wenn es auf dem Handy eng wird. */
  .uf-item-link .ttl{flex:1;min-width:0;font-weight:600;font-size:14px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-break:normal;}
  .uf-item .tag{font-size:10.5px;color:#b8860b;border:1px solid #e3c07a;border-radius:6px;padding:1px 7px;flex:none;}
  .uf-item .acts{display:flex;gap:1px;flex:none;}
  /* Schmale Screens: Aktionen kompakter, Typ-Tag weglassen (Platz für den Titel). */
  @media (max-width:560px){
    .uf-item{flex-wrap:nowrap;}
    .uf-item .tag{display:none;}
    .uf-item-link{gap:8px;padding:8px 2px;}
    .uf-item .acts .uf-act svg{width:15px;height:15px;}
  }
  .uf-act{border:none;background:transparent;cursor:pointer;padding:7px;border-radius:8px;color:var(--muted);display:flex;}
  .uf-act svg{width:17px;height:17px;}
  .uf-act:hover{background:rgba(127,127,127,0.15);color:var(--ink);}
  .uf-empty{color:var(--muted);font-style:italic;padding:14px;text-align:center;font-size:13.5px;}
  .uf-addbtn{margin-top:10px;display:flex;align-items:center;justify-content:center;gap:7px;border:1px dashed var(--brand);color:var(--brand);background:none;border-radius:11px;padding:11px;cursor:pointer;font-weight:700;font-family:inherit;font-size:13.5px;width:100%;}
  .uf-addbtn svg{width:16px;height:16px;}
  .uf-addbtn:hover{background:rgba(99,102,241,0.06);}
  .uf-addbtn-folder{border-color:rgba(124,92,246,0.45);color:#7c5cf6;margin-top:14px;}
  .uf-addbtn-folder:hover{background:rgba(124,92,246,0.06);}
  .uf-addbtn.uf-danger{border-color:var(--bad);color:var(--bad);margin-top:16px;}
  .uf-addbtn.uf-danger:hover{background:rgba(216,64,64,0.06);}
  .uf-locked{text-align:center;padding:60px 20px;}
  .uf-lock-ico{color:var(--muted);opacity:.6;display:flex;justify-content:center;margin-bottom:4px;}
  .uf-lock-ico svg{width:54px;height:54px;}
  .uf-locked h2{margin:14px 0 6px;color:var(--ink);}
  .uf-locked p{color:var(--muted);}
  .uf-locked button{margin-top:18px;padding:11px 24px;border:none;border-radius:10px;background:var(--brand);color:#fff;font-weight:700;cursor:pointer;font-family:inherit;}
  .uf-modal-bg{position:fixed;inset:0;background:rgba(0,0,0,.45);display:flex;align-items:center;justify-content:center;z-index:9999;padding:20px;}
  .uf-modal{background:var(--card);border-radius:16px;padding:24px;width:100%;max-width:440px;box-shadow:0 20px 50px rgba(0,0,0,.3);}
  .uf-modal h3{margin:0 0 16px;color:var(--ink);}
  .uf-modal label{display:block;font-size:12.5px;font-weight:700;margin:12px 0 5px;color:var(--muted);}
  .uf-modal input,.uf-modal .uf-sel{width:100%;box-sizing:border-box;padding:11px 13px;border:1px solid var(--line);border-radius:10px;font-size:15px;background:var(--bg);color:var(--ink);font-family:inherit;}
  .uf-modal .row{display:flex;gap:10px;margin-top:22px;}
  .uf-modal .row button{flex:1;padding:11px;border:none;border-radius:10px;font-weight:700;cursor:pointer;font-family:inherit;font-size:14px;}
  .uf-modal .ok{background:var(--brand);color:#fff;}
  .uf-modal .cancel{background:rgba(127,127,127,0.12);color:var(--ink);}
  .uf-modal .hint{font-size:12px;color:var(--muted);margin-top:6px;}
  /* ===== HIER STAND DIE ZWEITE LANDING-PAGE (entfernt in v2.100.1) =====
     Rund 290 Zeilen `.lp-*` fuer einen Marketing-Bildschirm INNERHALB der
     App (`templates/teile/screen-landing.html`), der bei `/login` ohne
     Sitzung erschien. Damit gab es SchlauStart zweimal als Startseite, mit
     verschiedenen Versprechen (`in Minuten` gegen `in Sekunden`) und zwei
     handgepflegten Werkzeuglisten. `/login` zeigt jetzt die Anmeldung,
     die Startseite ist `templates/landing.html` - und nur die.
     Wer hier wieder Marketing einbauen will: es gehoert nach landing.html. */


/* Infotext-Boxen (Schueler-Ansicht) */
.it-wrap .it-p{margin:0 0 8px;}
.it-box{border-radius:10px;padding:10px 13px;margin:9px 0;border-left:4px solid;}
.it-box-t{font-weight:700;font-size:13px;margin-bottom:3px;}
.it-merk{background:#EEF3FF;border-color:#2E5BFF;}
.it-formel{background:#F3FBF6;border-color:#15A05A;text-align:center;font-size:16px;}
.it-bsp{background:#FFF9EC;border-color:#E2A100;}
.it-wichtig{background:#FFF1EE;border-color:#E0552E;}
.it-step{display:block;padding-left:10px;}
.it-mark{background:linear-gradient(180deg,transparent 12%,#FFE873 12%,#FFE873 90%,transparent 90%);padding:0 3px;border-radius:3px;color:inherit;}

/* ODER SELBST WAEHLEN - der Verweis neben „Passendes Bild dazu suchen"
   (Anweisung Murat 05.09.2026, PLAN_BILDPOOL.md §4.3). Er steht eingerueckt
   unter dem Schalter, damit erkennbar bleibt, wozu er gehoert, und traegt
   keine eigene Farbe: `--muted` fuer den Satz, `--brand` fuer den Knopf -
   dieselben Tokens wie ueberall sonst. */
.t-bild-eigen{margin:0 0 10px 27px;font-size:13px;color:var(--muted);
  display:flex;align-items:center;gap:8px;flex-wrap:wrap;}
.t-bild-eigen button{border:0;background:none;padding:0;font:inherit;
  color:var(--brand);font-weight:600;cursor:pointer;text-decoration:underline;}
.t-bild-eigen .t-bild-name{color:var(--ink);font-weight:600;}

/* ===== DESKTOP-LAYOUT (>=1024px): einheitliche Breite fuer ALLE Screens =====
   Mobil/Tablet-Hochformat (<1024px) bleibt zu 100% unveraendert - alle
   Regeln liegen in Media Queries. Eine Breite fuer alle Seiten, damit die
   Ansicht beim Seitenwechsel nicht springt. */
@media (min-width:1024px){
  .wrap{ max-width:1100px; }

  /* Quiz-Karten (Dashboard + Boerse): mehr Spalten statt breiter Karten */
  .card-grid{
    grid-template-columns:repeat(auto-fill,minmax(240px,1fr));
  }
  /* Schueler-Kacheln (Klassenbuch): mehr Luft, groessere Klick-Ziele */
  .kb-stud-grid{
    grid-template-columns:repeat(auto-fill,minmax(112px,1fr));
    gap:var(--s-3);
  }
  /* Lernbot-Historie: breitere Kinder-Liste neben dem Gespraech.
     Hoehe folgt dem Bildschirm statt fester 600px-Boxen ("ince uzun"-Fix). */
  .lhl-wrap{
    grid-template-columns:360px 1fr;
  }
  .lhl-list, .lhl-detail{
    max-height:calc(var(--vh100) - 300px);
    min-height:480px;
  }
}
/* Grosse Monitore: eine Stufe weiter, weiterhin einheitlich */
@media (min-width:1440px){
  .wrap{ max-width:1240px; }
}

/* DAS BLATT-STUDIO BEKOMMT DIE GANZE BREITE (Murat 07.08.2026: „sagdaki
   beyaz yer var ya biraz daha genisletilebilir").

   Nicht das PAPIER wird groesser - das bleibt A4 bei 100 %, sonst luegt die
   Vorschau ueber die wirkliche Groesse. Groesser wird die SEITE um das
   Papier herum: die einheitlichen 1100/1240 px sind fuer Text gedacht, und
   1240 px reichen fuer 794 px Papier plus rechte Eigenschaftsspalte (die in
   Stufe 1.3 dazukommt) nicht aus. Dieselbe Ausnahme, die admin (1560) und
   blauerbrief (1240) schon haben - der Weg ist also vorgezeichnet. */
/* Unten KEIN Polster:  bringt sonst 80 px Luft mit, und unter der
   Seitenleiste stand ein leerer weisser Streifen, der nach einem Fehler
   aussah (Murat 07.08.2026). Das Studio rechnet seine Hoehe selbst. */
/* Unten KEIN Polster: `.wrap` bringt sonst rund 80 px Luft mit, und unter
   der Seitenleiste stand ein leerer weisser Streifen, der nach einem
   Fehler aussah (Rueckmeldung Murat 07.08.2026). Das Studio rechnet
   seine Hoehe selbst und braucht die Luft nicht. */
/* ===== DAS STUDIO HAT EINE EIGENE SHELL ================================
   GEMESSEN, nicht geraten (Konsole, 07.08.2026 – der dritte Anlauf war der
   erste mit Zahlen):

     SECTION#screen-blaetter | overflow:auto | h:0  scrollH:320 | scrollt
     DIV.wrap                | overflow:hidden| h:138 scrollH:463 | scrollt

   Damit war klar, was drei Runden lang unklar war: **nicht die Seite rollte,
   sondern die Section selbst.** Die generische Shell-Regel gibt jeder
   `.wrap > section[id^="screen-"]` ein `overflow-y:auto` – richtig für
   Textseiten, falsch für ein Werkzeug, dessen Spalten an den Rändern kleben
   sollen. Rollt die Section, wandert ALLES mit: Werkzeugkästen, Lineale,
   Seitenleiste.

   Cockpit, Unterrichtsfächer, Lautlesezeit und die Nachrichten-Zentrale sind
   aus genau diesem Grund schon ausgenommen. Das Studio gehört dazu – deshalb
   steht `blaetter` jetzt in derselben `:not()`-Kette und bekommt hier seine
   eigene Shell.

   KEINE MAGISCHE ZAHL MEHR: die Höhe kommt aus `--vh100` (die App rechnet
   sie selbst, weil `100vh` auf iOS lügt), und darunter reicht `flex` sie
   weiter. `#st-wirt` braucht deshalb kein `calc(100vh - …)` – der Wert war
   ohnehin falsch, weil `.wrap` schon begrenzt war. */
body[data-screen="blaetter"].has-sidebar .wrap{
  height:calc(var(--vh100) - var(--shell-top,16px) - var(--shell-bot,16px));
  max-height:calc(var(--vh100) - var(--shell-top,16px) - var(--shell-bot,16px));
  overflow:hidden; display:flex; flex-direction:column;
}
body[data-screen="blaetter"].has-sidebar .app-topbar{ flex:none; }
/* `padding-top:var(--pl-oben)` (v2.862.0): die 20 px unter der Kopflinie
   stehen am Rechner nicht mehr als Rand an der Kopfzeile, sondern werden
   vom Bildschirm selbst geholt - ohne diese Zeile klebte die Werkzeugleiste
   des Studios an der Linie. Unter 900 px ist die Variable leer, dort 0. */
body[data-screen="blaetter"] #screen-blaetter{
  flex:1 1 auto; min-height:0; overflow:hidden; display:flex;
  flex-direction:column;
  padding-top:var(--pl-oben, 0px);
}
body[data-screen="blaetter"] #blaetter-content{
  flex:1 1 auto; min-height:0; display:flex; flex-direction:column;
}
/* ⛔ DAS REGAL ROLLT (v2.906.0, Befund Murat 30.09.2026: „asagiya
   kaydiramiyorum"). Die Shell oben haelt Section und .wrap fest
   (overflow:hidden) - richtig fuer das offene Blatt, das seine Hoehe selbst
   rechnet. Das Regal aber ist eine Liste: ohne diese Regel endete es an der
   Unterkante, und alles darunter war nicht zu erreichen. Gerollt wird
   INNEN, wie auf den anderen Reitern (ohne sichtbaren Balken); die Kinder
   behalten ihre Hoehe (flex:none), sonst quetschte die Spalte das Raster.
   Im offenen Blatt (.bl-offen, blSammlungZeile) gilt die Regel nicht. */
body[data-screen="blaetter"] #screen-blaetter:not(.bl-offen) #blaetter-content{
  overflow-y:auto; scrollbar-width:none; overscroll-behavior-y:contain;
  padding-bottom:var(--pl-unten, 16px);
}
body[data-screen="blaetter"] #screen-blaetter:not(.bl-offen) #blaetter-content::-webkit-scrollbar{ display:none; }
body[data-screen="blaetter"] #screen-blaetter:not(.bl-offen) #blaetter-content > *{ flex:none; }
body[data-screen="blaetter"]{ overflow:hidden; }
/* DIE WERKZEUGSPALTEN GEHEN BIS AN DIE KARTENKANTE (Murat 07.08.2026:
   „soldaki aracin solunda, sagdakinin saginda bosluklar var - o bosluklara
   dogru araclari büyüt").

   NICHT ueber ein kleineres `.wrap`-Polster: dieselbe Zahl haelt auch die
   Kopfzeile („‹ Regal", Name, Speichern) vom Rand fern, und die soll dort
   bleiben, wo sie ist. Stattdessen steht das Mass EINMAL als `--bl-pad`,
   und `#st-wirt` zieht sich mit einem negativen Rand genau darum wieder
   hinaus (AB_ST_CSS). Zwei Zahlen, die sich aufheben muessen, gehoeren
   nicht an zwei Orte. */
body[data-screen="blaetter"]{ --bl-pad:12px; }
body[data-screen="blaetter"] .wrap{ max-width:none;
  padding-left:var(--bl-pad); padding-right:var(--bl-pad);
  padding-bottom:10px; }
/* DIE SEITENLEISTE SITZT 1 MM UEBER DER KARTENKANTE (Murat 07.08.2026:
   „o alttaki sayfa bari icerikleri sayfanin kenarina indir, hemen 1 mm
   üstünde olsun").

   WARUM DIESE ZEILE UEBERHAUPT NOETIG IST - und warum die drei Zeilen
   darueber NICHT gereicht haben: `body.has-sidebar:not(.lh-fullscreen)
   .wrap` setzt weiter unten (im 900px-Block) die KURZFORM
   `padding:20px … 32px`. Sie hat dieselbe Gewichtung (0,3,1) wie die
   blaetter-Regel und steht SPAETER in der Datei - also gewann sie, und
   unter der Seitenleiste blieben 32 px weisser Streifen stehen. Genau
   das Bild, das nach einem Fehler aussieht. `:not(.lh-fullscreen)` hebt
   die Gewichtung hier auf (0,4,1); damit entscheidet nicht mehr die
   Reihenfolge. 4 px sind bei 96 dpi 1,06 mm. */
body[data-screen="blaetter"].has-sidebar:not(.lh-fullscreen) .wrap{
  padding-bottom:4px;
  padding-left:var(--bl-pad); padding-right:var(--bl-pad);
}

/* =====================================================================
   SEITENLEISTE (Sidebar) + neue Kopfzeile — ersetzt die alte Top-Nav.
   Idee: linke, aufklappbare Spalte (Icons, eingeklappt mit Mini-Label),
   Inhalt bleibt mittig; oben nur Seitentitel + Postfach/Profil rechts.
   Mobil: Sidebar wird zur Schublade (Drawer), oben links per Menü-Icon.
   ===================================================================== */
:root{
  --sb-w-collapsed: 84px;   /* eingeklappt: Icon + kleines Label            */
  --sb-w-open: 248px;       /* ausgeklappt: Icon + Text (etwas breiter)     */
  /* Abstand Leiste <-> Panel. ⛔ DERSELBE WERT steht links vor der Leiste
     (Shell-Polster im 900er-Block liest diese Variable) - und nur so stehen
     die Symbole GENAU MITTIG zwischen Bildschirmrand und Panel. Bis
     v2.862.1 waren es links 6 px, hier 14 px: das aktive Plaettchen sass
     14 px vom Rand und 22 px vom Panel entfernt (Befund Murat 26.09.2026:
     „sol kisimda biraz daha sola dayali gibi duruyor … mesafe tam ayni
     degil"). Zugeklappt jetzt 14/14, aufgeklappt 20/20. */
  --sb-gap: 6px;

  /* ===== WEICHE TIEFE (2026-08-15) ======================================
     WIE ES FUNKTIONIERT: ein Eintrag hat zwei Schatten – einen dunklen unten
     rechts, einen hellen oben links. Beim Ueberfahren liegen beide INNEN
     (`inset`), der Eintrag wirkt eingedrueckt; der aktive Eintrag hat sie
     AUSSEN und wirkt erhaben. Mehr ist es nicht.

     WARUM ES HIER rgba IST UND KEIN FESTES GRAU: die Flaeche hinter der
     Leiste ist --shell-bg, und die WAEHLT DER NUTZER (sieben Toene + freie
     Wunschfarbe, applyShellFarbe in index-app.js). Ein fest gewaehltes
     Schattenpaar wie in den ueblichen Neumorphismus-Vorlagen passt dann zu
     genau einer der acht Flaechen und sieht auf den anderen sieben schmutzig
     aus. Schwarz/Weiss mit Deckkraft dunkelt bzw. hellt dagegen JEDE Flaeche
     um denselben Betrag auf – die Leiste bleibt automatisch farbgleich mit
     dem Hintergrund, was die eigentliche Bedingung dieses Aussehens ist.

     WAS BEWUSST NICHT PASSIERT: die Leiste selbst bekommt KEINEN erhabenen
     Schatten. Sie ist seit 2026-07 absichtlich keine eigene Karte mehr
     (Vorbild Gmail, siehe Regel weiter unten) – ein Rahmen ringsum waere ein
     Rueckschritt hinter diese Entscheidung. Die Tiefe sitzt nur an den
     Eintraegen, dort wo sie etwas BEDEUTET (beruehrbar / ausgewaehlt).

     VERBUNDEN MIT: qa/unit/test_seitenleiste.py, docs/DESIGN_SYSTEM.md §5. */
  --sb-tief: rgba(15,23,42,.10);    /* dunkle Seite  – Richtung --ink       */
  --sb-hoch: rgba(255,255,255,.92); /* helle Seite                          */
  --sb-weich: cubic-bezier(.22,1,.36,1);

  /* ===== GLAS (v2.646.0) ================================================
     AUFTRAG MURAT 04.09.2026: „su soldaki kutucugu saydam böyle cam gibi
     yapsan … whatsappta alt kisimdaki gecislerde kullaniyoruz." Vorbild ist
     die WhatsApp-Leiste unten: eine schwebende, milchige Kapsel, durch die
     der Grund durchscheint.

     EIN REZEPT, ZWEI ORTE – und deshalb steht es hier und nicht doppelt
     verstreut: die Schublade (mobil) und die Lesekarten des Cockpits. Wer
     den Ton ändert, ändert ihn einmal.
     (Bis v2.861.0 waren es drei: auch die Seitenleiste am Rechner war Glas,
     `--glas-leiste`. Seit v2.862.0 hat sie gar keinen Kasten mehr - Auftrag
     Murat 26.09.2026, Vorbild ChatGPT und Zoom; Begruendung an ihrer Regel
     im 900er-Block. Das Token ist mit ihr gegangen.)

     DIE VIER TEILE, ohne die es „billig" aussieht – dieselben, die schon an
     der Fertig-Kapsel (.ss-fertig) stehen:
       1. eine HALBDURCHSICHTIGE Füllung. Ohne sie hat backdrop-filter
          nichts zu tun.
       2. --glas-schliff: blur UND saturate. Das saturate ist der Trick –
          ohne es wirkt der Grund hinter dem Glas grau statt lebendig.
       3. eine feine Kante (--glas-kante) plus ein heller Innenrand
          (--glas-licht): so sitzt die Fläche AUF dem Grund statt darin zu
          kleben.
       4. ein tragender, weicher Schatten (--glas-trage) – kein Ring.

     ⛔ `backdrop-filter` GIBT ES NUR AN EINER STELLE: AN DER SCHUBLADE.
     Und das ist seit v2.647.1 eine Erfahrung, keine Meinung.

     Die Regel dahinter: `backdrop-filter` unschärft, was DAHINTER liegt.
       · Schublade (mobil) – dahinter liegt der Bildschirm. Es wirkt. JA.
       · Seitenleiste – dahinter liegt --shell-bg, eine glatte Fläche. blur
         von einer glatten Fläche ist dieselbe Fläche; nur saturate hätte
         den Ton vertieft. NEIN.
       · Cockpit-Karte – dahinter liegt das weiße Panel. blur von Weiß ist
         Weiß, saturate eines neutralen Tons ist derselbe Ton. NEIN.

     WAS v2.647.0 GEKOSTET HAT: die Leiste trug das Filter, obwohl es dort
     fast nichts zeigte – ein Element über die volle Bildschirmhöhe,
     `position:sticky`, mit einer Animation darin (der Linse). Safari
     berechnet den Hintergrund einer solchen Fläche bei JEDEM Bild neu, und
     zwar für die ganze Fläche. Rückmeldung Murat 04.09.2026, wenige Minuten
     nach dem Deploy: „yanda gezinirken kitlendi." Der Server war dabei
     gesund (/healthz), es war allein die Darstellung.

     Also: kein backdrop-filter über einer glatten Fläche. Nie. Was das Glas
     dort ausmacht, ist ohnehin die halbdurchsichtige Füllung, die Kante und
     der tragende Schatten – die drei bleiben.

     RÜCKFALL: die Schublade braucht einen für Browser ohne backdrop-filter
     (ältere Firefox-Fassungen, alte Android-WebViews) – --glas-schublade-fest,
     dieselbe Fläche, nur deckender. Die Leiste braucht keinen mehr; sie hat
     kein Filter, das ausfallen könnte.

     VERBUNDEN MIT: qa/unit/test_seitenleiste.py (Zusage 2),
     qa/unit/test_cockpit_check.py, docs/DESIGN_SYSTEM.md §5. */
  --glas-schliff: blur(22px) saturate(180%);
  /* Das Cockpit-Glas (v2.943.0: Blatt des Bearbeiten-Modus, v2.944.0:
     die Widgets) hat ein EIGENES Token: es gilt nur, wenn hinter dem
     Cockpit ein Verlauf oder Foto liegt (body.ck-hg-an) – die Zählung der
     --glas-schliff-Stellen (test_seitenleiste) bleibt davon unberührt. */
  --ck-glas-schliff: blur(24px) saturate(170%);
  --glas-schublade:      rgba(255,255,255,.80); /* Schublade über Inhalt    */
  /* Die Kapsel am Telefon (v2.922.0): durchsichtiger als die Schublade - der
     rollende Inhalt soll „belli belirsiz" durchscheinen (Murat 01.10.2026). */
  --glas-kapsel:         rgba(255,255,255,.44);
  --glas-schublade-fest: rgba(255,255,255,.97);
  --glas-karte:  rgba(15,23,42,.022);  /* Lesekarte auf dem weißen Panel   */
  --glas-kante:  rgba(15,23,42,.070);  /* die feine Begrenzung             */
  --glas-licht:  rgba(255,255,255,.62);/* heller Innenrand oben            */
  --glas-trage:  0 10px 26px -14px rgba(15,23,42,.34);
  /* DUNKLES GLAS (v2.947.1) – EIN Rezept für zwei Orte: den Dunkelmodus
     gleich darunter und den RAHMEN auf einem dunklen Hintergrund
     (body.ck-hg-dunkel, Abschnitt HINTERGRUND DES COCKPITS). */
  --glas-dunkel-kapsel: rgba(31,39,57,.48);
  --glas-dunkel-kante:  rgba(255,255,255,.070);
  --glas-dunkel-licht:  rgba(255,255,255,.10);
  --glas-dunkel-tief:   rgba(0,0,0,.38);
}
/* Im Dunkelmodus traegt Weiss nicht mehr: eine helle Kante auf dunklem Grund
   wird sofort zum Grat. Der helle Anteil geht auf ein Achtel zurueck, der
   dunkle wird kraeftiger – dieselbe Regel, anderer Betrag. */
html[data-theme="dark"]{
  --sb-tief: var(--glas-dunkel-tief);
  --sb-hoch: rgba(255,255,255,.045);

  /* Im Dunkeln kehren sich die Rollen um: die Füllung hellt AUF statt
     abzudunkeln, und der helle Innenrand geht fast ganz zurück – eine
     weiße Kante auf dunklem Grund wird sofort zum Grat (dieselbe Regel
     wie bei --sb-hoch eine Zeile darüber). */
  --glas-schublade:      rgba(31,39,57,.84);
  --glas-kapsel:         var(--glas-dunkel-kapsel);
  --glas-schublade-fest: rgba(31,39,57,.98);
  --glas-karte:  rgba(255,255,255,.045);
  --glas-kante:  var(--glas-dunkel-kante);
  --glas-licht:  var(--glas-dunkel-licht);
  --glas-trage:  0 10px 26px -14px rgba(0,0,0,.60);
}

/* Dynamische Viewport-Höhe: --vh100 = tatsächlich SICHTBARE Bildschirmhöhe.
   Problem: im Browser (Safari/Chrome auf Tablet/Handy) zählt 100vh die GRÖSSTE
   Höhe – so als wäre die Adressleiste ausgeblendet. Die App-Shells (Cockpit,
   Nachrichten, Lautlesezeit …) wurden dadurch höher als der sichtbare Bereich
   und ragten unten heraus -> genau die 10-Zoll-Tablet-Beschwerde. Als installierte
   App (kein Browser-Chrome) passte 100vh dagegen exakt. 100dvh = aktuell sichtbare
   Höhe -> passt in BEIDEN Fällen. Fallback bleibt 100vh, falls dvh fehlt (alte
   Android-WebViews / Safari < 15.4): dort läuft exakt das bisherige Verhalten,
   also KEIN Risiko/Regression. Überall statt 100vh: var(--vh100). */
:root{ --vh100: 100vh; }
@supports (height: 100dvh){ :root{ --vh100: 100dvh; } }
/* Nachtrag Rotationsfix: 100dvh meldet auf iOS direkt nach dem Drehen kurzzeitig
   noch den ALTEN Wert. Sobald JS die echte Hoehe gemessen hat (siehe
   ssSyncViewport() in index.html), setzt es --vh100-js; das gewinnt dann. */
:root{ --vh100-js: 0px; }
@supports (height: 100dvh){
  :root:not([data-vh-ready]){ --vh100: 100dvh; }
}
:root[data-vh-ready]{ --vh100: var(--vh100-js); }

/* ===== SICHERHEITSNETZ (2026-07-26) =====================================
   Beschwerde aus der installierten App (iOS-PWA): "mal ist es ganzer
   Bildschirm, mal ist es unten abgeschnitten" – unzuverlaessig, mal so, mal so.

   URSACHE: `--vh100-js` ist ein FESTER Pixelwert und wurde als GROESSTE je
   beobachtete Hoehe gefuehrt. Ein einziger zu grosser Messwert (z. B. wenn
   `visualViewport` kurz fehlte und der Fallback `innerHeight` einsprang, der
   den Bereich hinter Statusleiste und Home-Indicator mitzaehlt) blieb dann
   fuer die ganze Sitzung stehen – das Panel war hoeher als der Bildschirm,
   der untere Rand lag ausserhalb. Beim naechsten Start passte es zufaellig
   wieder, daher das wechselhafte Bild.

   LOESUNG: beide Quellen gegeneinander deckeln. `min()` ist in BEIDE
   Fehlerrichtungen richtig:
     · JS-Wert zu GROSS (der Fehler oben)      -> 100dvh gewinnt.
     · 100dvh veraltet nach dem Drehen (der
       Grund, aus dem es den JS-Wert gibt)     -> der kleinere JS-Wert gewinnt.
   Die Tastatur stoert dabei nicht: `dvh` beruecksichtigt nur die dynamische
   Browser-Oberflaeche, NICHT die Bildschirmtastatur.
   Ohne `dvh` (iOS < 15.4) bleibt es bei der Zeile darueber – dort greift
   weiterhin allein der JS-Wert, wie bisher. */
@supports (height: 100dvh){
  :root[data-vh-ready]{ --vh100: min(var(--vh100-js), 100dvh); }
}

/* Die aufklappbare Leiste ist im Grundzustand versteckt (Landing/Schüler/
   Vollbild-Screens). Sichtbar wird sie erst, wenn renderSidebar() sie füllt. */
#app-sidebar{ display:none; }
#sb-overlay{ display:none; }

/* ---------- DESKTOP / TABLET quer (>= 900px): zwei bündige Spalten ---------- */
@media (min-width:900px){
  /* Body wird zum Flex-Container: Sidebar links, Inhalt rechts – aneinander,
     gleiche Höhe. Das Paar (Leiste + Panel) hat eine feste Maximalbreite und
     wird IMMER mittig gehalten (margin:auto) – links wie rechts gleich viel
     Luft, egal wie breit der Bildschirm ist. */
  body.has-sidebar:not(.lh-fullscreen){
    display:flex; align-items:stretch; gap:var(--sb-gap);
    /* Breiter + randnäher: Tablet nutzt fast die volle Breite, große Monitore
       bekommen mehr Lesefläche. Oben respektieren wir die iOS-Statusleiste
       (PWA auf dem Homescreen); ALLE Höhenrechnungen nutzen dieselben
       Variablen, damit unten exakt derselbe Rand bleibt wie oben/seitlich. */
    --shell-top:max(16px, env(safe-area-inset-top));
    /* ===== DAS PANEL GEHT NACH UNTEN UND NACH RECHTS (v2.862.0) ==========
       Auftrag Murat 26.09.2026, Vorbild ChatGPT und Zoom: „sagdaki
       kutucugun yüksekligini artirsak ve saga uzatsak … yukari
       genisletmeyelim bar ile kaynasmasin … asagi dogru uzatalim saga
       dogru uzatalim." Unten standen 26 px, rechts bis zu 22 px - jetzt
       10 px an beiden Kanten. Die Safe-Area geht vor: am iPad mit
       Home-Leiste bleibt unten deren Hoehe, nicht weniger.
       ⛔ OBEN BLEIBT --shell-top UNVERAENDERT. Das ist ausdruecklich
       bestellt, nicht vergessen: am Tablet sitzt darueber die
       Statusleiste, und ein Panel, das hinaufrueckt, verschmilzt mit ihr
       („yukari gitmesin … tam sinirda").
       Links sind es nur 6 px, weil dort seit v2.862.0 kein Kasten mehr
       steht, sondern die Symbole selbst - sie tragen ihren Abstand in
       sich (8 px Polster der Leiste). Die 6 px sind --sb-gap: links vor
       der Leiste steht dasselbe Mass wie zwischen Leiste und Panel, sonst
       stehen die Symbole nicht mittig (v2.862.2, siehe :root).

       ⛔ UNTEN 10 px AUCH AM TABLET (v2.862.2). Bis v2.862.1 stand hier
       `max(10px, env(safe-area-inset-bottom))` - am iPad meldet die
       Home-Leiste mehr als 10 px, und genau diese Safe-Area war die Luecke
       unter dem Panel, in der PWA wie in Safari (Befund Murat 26.09.2026:
       „ipadde asagida bosluk var … tablet tarafi icinde uzasin"; am
       Bildschirmfoto 26 px). Das Panel geht jetzt wie am Rechner bis
       10 px an die Kante, die Home-Leiste liegt darueber - so wie mobil
       seit 2026-07. Dass die letzte Zeile trotzdem frei bleibt, sorgt der
       Auslauf IM rollenden Bereich: --pl-unten (32 px) ist groesser als
       jede Home-Leiste. */
    --shell-bot:10px;
    padding:var(--shell-top) max(10px, env(safe-area-inset-right))
            var(--shell-bot) max(var(--sb-gap), env(safe-area-inset-left));
    min-height:var(--vh100);
    /* Breiter (2026-07): auf 13-Zoll-Tablets/grossen Monitoren blieb bei 1560px
       links/rechts viel Luft ungenutzt. 1760px nutzte die Fläche besser, ohne dass
       Zeilen unangenehm lang werden; auf 10-Zoll-Tablets greift die Kappe eh nicht
       (dort füllt der Inhalt schon fast randlos).

       ⛔ 2100px SEIT v2.642.2 (Wunsch Murat 04.09.2026: „solda sagda yer var
       orayi artiralim bari"). Nachgemessen auf 1920 px: der weisse Kasten war
       1618 px breit, rechts blieben 102 px ungenutzt - 80 davon allein durch
       diese Kappe, der Rest ist der Innenabstand. Der Kasten oben hat 16 px
       Rand; 102 px an der Seite waren also nicht „derselbe Rand wie
       oben/seitlich", wie der Absatz darueber es verspricht, sondern das
       Sechsfache.

       WARUM NICHT `none`: auf einem 27-Zoll-Monitor (2560 px) waere jede
       Zeile ueber zwei Meter Text lang. 2100 px deckt 1920 px vollstaendig ab
       - dort bestimmt dann der Innenabstand den Rand, so wie es gemeint war -
       und laesst auf 2560 px einen ruhigen Rahmen stehen. Unter 1760 px
       aendert sich nichts; die Kappe greift dort ohnehin nicht. */
    max-width:2100px; margin:0 auto;
  }
  /* Das Inhaltspanel darf die volle Restbreite nutzen (die alten .wrap-Kappen
     bei 1100/1240px gelten nur noch für Seiten OHNE Seitenleiste). */
  body.has-sidebar:not(.lh-fullscreen) .wrap{ max-width:none; }
  /* ===== DIE LEISTE HAT KEINEN KASTEN (v2.862.0) =======================
     Auftrag Murat 26.09.2026, mit Bildschirmfotos von ChatGPT und Zoom:
     „bende chatgpt ve zoomdaki gibi bir sol alan istiyorum yani o
     kutucugu kaldir sol tarafin kutusu olmasin sagdaki o icerik
     kutucugu tek basina kalsin."

     Die Symbole stehen damit direkt auf der Flaeche der Lehrkraft
     (--shell-bg), und das weisse Panel ist der EINE Kasten der Seite.
     Das ist zugleich der Zustand, an dem die weiche Tiefe der Eintraege
     haengt: Eintrag und Grund haben DIESELBE Flaeche (siehe --sb-tief).

     DIE GESCHICHTE, damit niemand im Kreis baut:
       2026-07   keine Flaeche (Vorbild Gmail) - „keine zweite weisse Karte"
       v2.646.0  halbdurchsichtiges Glas (Vorbild WhatsApp-Leiste)
       v2.862.0  wieder keine Flaeche, kein Rand, kein Schatten - jetzt
                 ausdruecklich, weil der Kasten links neben dem Panel wie
                 eine zweite Karte gelesen wurde.
     Wer das Glas zurueckholt, holt den zweiten Kasten zurueck.

     ⛔ UND KEIN backdrop-filter - die Lehre aus v2.647.0 gilt weiter:
     bildschirmhohe, klebende Flaeche + Linse darin = Safari friert ein.

     BEWACHT VON qa/unit/test_seitenleiste.py, Zusage 2. */
  body.has-sidebar:not(.lh-fullscreen) #app-sidebar{
    display:flex; flex-direction:column; flex:none;
    position:sticky; top:var(--shell-top,16px); align-self:flex-start;
    height:calc(var(--vh100) - var(--shell-top,16px) - var(--shell-bot,16px));
    width:var(--sb-w-collapsed);
    background:transparent; border:none; border-radius:0; box-shadow:none;
    padding:14px 8px; overflow:hidden;
    transition:width .22s cubic-bezier(.4,0,.2,1), padding .22s cubic-bezier(.4,0,.2,1);
  }
  body.has-sidebar.sb-open:not(.lh-fullscreen) #app-sidebar{
    width:var(--sb-w-open); padding:14px;
  }
  /* Ohne Kasten hat die Leiste auch keine Kanten, zwischen denen eine Linie
     etwas trennen muesste: die Striche unter dem Logo und ueber dem Fuss
     standen als kurze, frei schwebende Reste da. Die mobile Schublade ist
     weiterhin eine Flaeche und behaelt sie (dort gilt diese Regel nicht). */
  body.has-sidebar:not(.lh-fullscreen) #app-sidebar .sb-top{ border-bottom:none; }
  body.has-sidebar:not(.lh-fullscreen) #app-sidebar .sb-bottom{ border-top:none; }

  /* Inhaltsspalte = EIN großes weißes Panel, bündig mit der Leiste:
     gleicher oberer Rand, füllt die Restbreite, wächst mit dem Inhalt.
     Oben sitzt die Kopfzeile (Titel/Begrüßung + Profil), darunter der Screen. */
  body.has-sidebar:not(.lh-fullscreen) .wrap{
    flex:1 1 auto; min-width:0; margin:0;
    background:var(--card); border:1px solid var(--line);
    border-radius:22px; box-shadow:var(--shadow);
    /* ===== DER INHALT ROLLT BIS AN DIE KANTE (v2.862.0) ================
       Befund Murat 26.09.2026: „beyaz alanin her bir karisini
       sinirlarinin sonuna kadar kullanmaliyiz asagida cok bosluk varken
       kesiliyor ve bu beni cildirtiyor."

       VORHER lagen die 32 px unten als Polster am PANEL, die 20 px unter
       der Kopflinie als Rand an der KOPFZEILE - beide also ausserhalb des
       Bereichs, der rollt. Der Inhalt wurde deshalb 32 px ueber dem
       Panelrand abgeschnitten und 20 px unter der Linie, und darunter bzw.
       darueber stand leeres Weiss: genau das Bild „kesiliyor".

       JETZT stehen dieselben beiden Masse als --pl-oben/--pl-unten IM
       rollenden Bereich (Cockpit, generische Shell, Einstellungen,
       Schulverwaltung - jeweils dort, wo wirklich gerollt wird). In Ruhe
       sitzt alles auf demselben Pixel wie vorher; erst beim Rollen laeuft
       der Inhalt bis an die Linie und bis an die Unterkante.
       Mobil ist das seit 2026-07 so (`padding:16px 16px 0` im Block
       max-width:899.98px) - der Rechner zieht nach, nicht umgekehrt. */
    --pl-oben:20px;
    --pl-unten:32px;
    /* ===== EIN RAND FUER ALLE BILDSCHIRME: --pl-seite (v2.863.0) =======
       Befund Murat 26.09.2026, mit Bildschirmfotos von Faecher, Material,
       Werkzeuge und Boerse nebeneinander: „her sayfada farkli yani bir
       standarti yok kiminde bosluk cok kiminde az" - und „sagdaki beyaz
       kisimda sag ve soldada biraz daha bosluklar var … genisletsek
       icerigi nasil olur".
       ZWEI DINGE, und beide gehoeren zusammen:
       1. EIN Mass. Titel, Kopflinie und der Inhalt JEDES Bildschirms
          beginnen an diesem Polster; kein Bildschirm legt einen eigenen
          Rand, eine eigene Wurzelkarte oder eine mittige Kappe darueber
          (gemessen bei 1470 px vorher: Boerse 30, Faecher 59, Werkzeuge 81,
          Material 91). Bewacht von qa/unit/test_ein_rand_fuer_alle.py.
       2. Ein KLEINERES Mass: 16 px statt clamp(18px, 2vw, 28px) und 30 px
          ab 1440 px. 16 ist der Abstand, den die Karten des Cockpits
          untereinander haben (14 px) plus die Linie - Aussenrand und
          Innenabstand lesen sich damit als EIN Raster. Weniger waere der
          Fehler vom 04.09.2026 („herseyi yapistirmissin mesafe birak
          biraz" - damals 4 bis 6 px).
       Mobil gilt dasselbe Prinzip mit 12 px (Block max-width:899.98px). */
    --pl-seite:16px;
    padding:20px var(--pl-seite) 0;
    align-self:flex-start;
    min-height:calc(var(--vh100) - var(--shell-top,16px) - var(--shell-bot,16px));
  }
  /* DAS PANEL BLEIBT - ES IST DIE SEITE (Klarstellung Murat 17.08.2026:
     „en arkadaki beyazi cikar demedim … o ana sayfanin arkaplani").
     Kurzzeitig war es hier transparent geschaltet. Das war der falsche der
     beiden Kaesten: weg gehoert die GLASKARTE im Panel (#screen-upload .box),
     nicht das Panel selbst. Es ist auf jedem Bildschirm dieselbe Flaeche -
     Cockpit, Klassenbuch, Material -, und genau darauf soll der Eingang
     liegen, statt als zweite Karte darin zu schweben. Bitte nicht erneut
     „aufraeumen". */
  /* Material-Einstieg: WIRKLICH mittig im weißen Panel (v2.30.4).
     VORHER: #screen-upload rechnete mit `min-height:calc(var(--vh100) - 150px)`.
     Die 150 px waren geraten und decken den echten Overhead nicht ab
     (--shell-top + --shell-bot + 20/32 px Panel-Padding + Kopfzeile mit
     Titel/Profil). Der Screen wurde also HÖHER als der freie Bereich, das
     Panel wuchs über einen Bildschirm hinaus und der Inhalt saß sichtbar zu
     tief – „dikeyde ortalanmamış".
     JETZT: dasselbe Muster wie beim Cockpit – Panel ist genau einen Bildschirm
     hoch, die Kopfzeile bleibt oben stehen (flex:none), #screen-upload nimmt
     den Rest (flex:1) und zentriert sich darin über sein vorhandenes
     `justify-content:center`. Reicht der Platz auf kleinen Laptops nicht,
     scrollt NUR der Screen (ohne sichtbaren Balken), nichts wird abgeschnitten.
     Mobil/<900px bleibt unberührt. */
  body.has-sidebar[data-screen="upload"]:not(.lh-fullscreen) .wrap{
    height:calc(var(--vh100) - var(--shell-top,16px) - var(--shell-bot,16px));
    min-height:0; max-height:calc(var(--vh100) - var(--shell-top,16px) - var(--shell-bot,16px));
    overflow:hidden;
    display:flex; flex-direction:column;
  }
  body.has-sidebar[data-screen="upload"]:not(.lh-fullscreen) .app-topbar{
    flex:none;
  }
  body.has-sidebar[data-screen="upload"]:not(.lh-fullscreen) #screen-upload{
    flex:1 1 auto; min-height:0; overflow-y:auto;
    scrollbar-width:none;
  }
  /* DIE MITTE DER WEISSEN FLÄCHE (v2.925.0): .wrap trägt oben 20 px Polster,
     unten keins. #screen-upload gleicht das unten aus - sonst stünden
     Begrüßung und Kapsel 10 px unter der Mitte (gemessen bei 1280 × 800). */
  body.has-sidebar[data-screen="upload"]:not(.lh-fullscreen) #screen-upload{
    padding-bottom:calc(var(--pl-oben, 0px) + 20px);
  }
  body.has-sidebar[data-screen="upload"]:not(.lh-fullscreen) #screen-upload::-webkit-scrollbar{
    display:none;
  }
  /* Cockpit = feste App-Shell (wie Unterrichtsfächer, der Nutzer-Referenz):
     Panel ist GENAU einen Bildschirm hoch, die Kopfzeile (Titel/Postfach/Profil)
     bleibt oben STEHEN, NUR der Inhalt scrollt im Panel – und zwar OHNE sichtbaren
     Scrollbalken (der störte im weißen Panel). Ergebnis: stabile Höhe (nicht mal
     kurz, mal lang), Leiste + Panel immer auf gleicher Höhe, Kopf immer sichtbar. */
  body.has-sidebar[data-screen="cockpit"]:not(.lh-fullscreen) .wrap{
    height:calc(var(--vh100) - var(--shell-top,16px) - var(--shell-bot,16px));
    min-height:0; max-height:calc(var(--vh100) - var(--shell-top,16px) - var(--shell-bot,16px));
    overflow:hidden;
    display:flex; flex-direction:column;
  }
  body.has-sidebar[data-screen="cockpit"]:not(.lh-fullscreen) #screen-cockpit,
  body.has-sidebar[data-screen="cockpit"]:not(.lh-fullscreen) #screen-cockpit > .card{
    flex:1 1 auto; min-height:0; display:flex; flex-direction:column;
  }
  /* Inhaltsbereich scrollt intern; Scrollbalken ausgeblendet (wie das uf-Portal).
     Er beginnt direkt an der Kopflinie und endet an der Unterkante des
     Panels; die Luft davor und danach liegt IN ihm (--pl-oben/--pl-unten,
     Begruendung am .wrap). Das untere Mass steht an #cockpit-fit und nicht
     hier: ein Flex-Container, der rollt, zaehlt sein eigenes unteres Polster
     in Safari nicht ueberall zur Rollflaeche - das Polster eines Kindes
     zaehlt ueberall. */
  body.has-sidebar[data-screen="cockpit"]:not(.lh-fullscreen) #cockpit-content{
    flex:1 1 auto; min-height:0; overflow-y:auto;
    scrollbar-width:none;
    display:flex; flex-direction:column;
    padding-top:var(--pl-oben);
  }
  body.has-sidebar[data-screen="cockpit"]:not(.lh-fullscreen) #cockpit-content::-webkit-scrollbar{ display:none; }
  body.has-sidebar[data-screen="cockpit"]:not(.lh-fullscreen) #cockpit-fit{
    width:100%;
    padding-bottom:var(--pl-unten);
  }

  /* ===== GENERISCHE feste App-Shell für ALLE übrigen Nav-Seiten =====
     (Material, Aufgaben, Klassenbuch, Pinnwände, Kurse, Planung, Klassenarbeiten,
     Förderung, Fehlzeiten, Dateien …). Gleiches Muster wie Cockpit: die Kopfzeile
     bleibt oben (flex:none), die AKTIVE Screen-Section scrollt intern OHNE
     sichtbaren Balken, Panel-Höhe bleibt stabil (ein Bildschirm), Leiste + Panel
     bündig. Ausgenommen die Screens mit EIGENER Shell (cockpit, unterrichtsfaecher,
     lautlesezeit) und die Nachrichten-Zentrale (eigene .pf-shell). Die verborgenen
     Sections sind display:none -> die generische Regel trifft nur die sichtbare. */
  body.has-sidebar:not(.lh-fullscreen):not([data-screen="cockpit"]):not([data-screen="unterrichtsfaecher"]):not([data-screen="lautlesezeit"]):not([data-screen="nachrichten"]):not([data-screen="blaetter"]) .wrap{
    height:calc(var(--vh100) - var(--shell-top,16px) - var(--shell-bot,16px));
    max-height:calc(var(--vh100) - var(--shell-top,16px) - var(--shell-bot,16px));
    overflow:hidden; display:flex; flex-direction:column;
  }
  body.has-sidebar:not(.lh-fullscreen):not([data-screen="cockpit"]):not([data-screen="unterrichtsfaecher"]):not([data-screen="lautlesezeit"]):not([data-screen="nachrichten"]):not([data-screen="blaetter"]) .app-topbar{
    flex:none;
  }
  body.has-sidebar:not(.lh-fullscreen):not([data-screen="cockpit"]):not([data-screen="unterrichtsfaecher"]):not([data-screen="lautlesezeit"]):not([data-screen="nachrichten"]):not([data-screen="blaetter"]) .wrap > section[id^="screen-"]{
    flex:1 1 auto; min-height:0; overflow-y:auto; scrollbar-width:none;
    overscroll-behavior-y:none;   /* siehe Begruendung im mobilen Zweig */
    /* Die Luft unter der Kopflinie und am Ende rollt MIT (v2.862.0,
       Begruendung am .wrap). In Ruhe steht alles wie vorher; der
       Inhaltskasten der Section ist genau so hoch wie zuvor, deshalb
       aendert sich auch an Bildschirmen mit `height:100%` im Inneren
       nichts. Bildschirme, die innen rollen (Einstellungen,
       Schulverwaltung), nehmen das untere Mass weiter unten zurueck. */
    padding-top:var(--pl-oben); padding-bottom:var(--pl-unten);
  }
  body.has-sidebar:not(.lh-fullscreen):not([data-screen="cockpit"]):not([data-screen="unterrichtsfaecher"]):not([data-screen="lautlesezeit"]):not([data-screen="nachrichten"]):not([data-screen="blaetter"]) .wrap > section[id^="screen-"]::-webkit-scrollbar{ display:none; }

  /* Lautlesezeit = feste App-Shell wie Cockpit: Seite und Nav scrollen NICHT,
     nur der Kapiteltext im iframe scrollt. */
  body.has-sidebar[data-screen="lautlesezeit"]:not(.lh-fullscreen) .wrap{
    height:calc(var(--vh100) - var(--shell-top,16px) - var(--shell-bot,16px));
    min-height:0; max-height:calc(var(--vh100) - var(--shell-top,16px) - var(--shell-bot,16px));
    overflow:hidden;
    display:flex; flex-direction:column;
  }
  body.has-sidebar[data-screen="lautlesezeit"]:not(.lh-fullscreen) .app-topbar{
    flex:none;
  }
  /* Oben dieselbe Luft wie ueberall unter der Kopflinie; unten keine - das
     Buecherregal rollt in seinem eigenen Rahmen bis an die Panelkante. */
  body.has-sidebar[data-screen="lautlesezeit"]:not(.lh-fullscreen) #screen-lautlesezeit{
    flex:1 1 auto; min-height:0; display:flex; flex-direction:column;
    padding-top:var(--pl-oben);
  }
  body.has-sidebar[data-screen="lautlesezeit"]:not(.lh-fullscreen) #screen-lautlesezeit.hidden{
    display:none;
  }
  body.has-sidebar[data-screen="lautlesezeit"]:not(.lh-fullscreen) #ll-frame{
    flex:1 1 auto; min-height:0; height:auto !important;
  }
  /* Ohne Kasten hat die Leiste auch keine Kanten, zwischen denen eine Linie
     etwas trennen muesste: die Striche unter dem Logo und ueber dem Fuss
     standen als kurze, frei schwebende Reste da. Die mobile Schublade ist
     weiterhin eine Flaeche und behaelt sie (dort gilt diese Regel nicht). */
  body.has-sidebar:not(.lh-fullscreen) #app-sidebar .sb-top{ border-bottom:none; }
  body.has-sidebar:not(.lh-fullscreen) #app-sidebar .sb-bottom{ border-top:none; }

  /* Unterrichtsfächer = ebenfalls feste App-Shell: NUR das eingebettete Portal
     scrollt, nie die äußere Seite (sonst zwei Scrollbalken nebeneinander). */
  body.has-sidebar[data-screen="unterrichtsfaecher"]:not(.lh-fullscreen) .wrap{
    height:calc(var(--vh100) - var(--shell-top,16px) - var(--shell-bot,16px));
    min-height:0; max-height:calc(var(--vh100) - var(--shell-top,16px) - var(--shell-bot,16px));
    overflow:hidden;
    display:flex; flex-direction:column;
  }
  body.has-sidebar[data-screen="unterrichtsfaecher"]:not(.lh-fullscreen) .app-topbar{
    flex:none;
  }
  /* Wie die Lautlesezeit: oben die Luft unter der Kopflinie, unten rollt
     das Portal in seinem Rahmen bis an die Panelkante. */
  body.has-sidebar[data-screen="unterrichtsfaecher"]:not(.lh-fullscreen) #screen-unterrichtsfaecher{
    flex:1 1 auto; min-height:0; display:flex; flex-direction:column;
    padding-top:var(--pl-oben);
  }
  body.has-sidebar[data-screen="unterrichtsfaecher"]:not(.lh-fullscreen) #screen-unterrichtsfaecher.hidden{
    display:none;
  }
  body.has-sidebar[data-screen="unterrichtsfaecher"]:not(.lh-fullscreen) #uf-frame{
    flex:1 1 auto; min-height:0; height:auto !important;
  }

  /* Nachrichten-Zentrale = ebenfalls feste App-Shell (Kernregel: Leiste + Panel
     sind IMMER exakt gleich hoch, egal welcher Screen). Vorher war "nachrichten"
     von den Shell-Regeln ausgenommen und die .pf-shell hatte eine starre Hoehe
     calc(vh - 175px): stimmte die 175px-Annahme nicht mit Topbar + Panel-Padding
     ueberein, wurde .wrap hoeher als der Viewport, die Seite scrollte und die
     sticky Leiste stand versetzt zum Panel ("oben verrutscht"). Jetzt: Panel
     exakt ein Bildschirm hoch (wie Cockpit), Kopfzeile fix, die pf-shell fuellt
     den Rest per Flex (height:auto statt calc). Mobil (<=720px) bleibt die
     pf-shell ein position:fixed-Overlay – diese Regeln greifen nur >=900px. */
  body.has-sidebar[data-screen="nachrichten"]:not(.lh-fullscreen) .wrap{
    height:calc(var(--vh100) - var(--shell-top,16px) - var(--shell-bot,16px));
    min-height:0; max-height:calc(var(--vh100) - var(--shell-top,16px) - var(--shell-bot,16px));
    overflow:hidden;
    display:flex; flex-direction:column;
  }
  body.has-sidebar[data-screen="nachrichten"]:not(.lh-fullscreen) .app-topbar{
    flex:none;
  }
  /* KEINE KARTE MEHR IM PANEL (v2.909.0). Bis v2.908.0 war die Zentrale eine
     eigene Karte mit Rand und stand deshalb eingerueckt (oben --pl-oben,
     unten --pl-seite), damit die Panelrundung ihren Rand nicht abschnitt.
     Jetzt liegen Liste und Chat auf dem Panel selbst: die Linie zwischen
     beiden beginnt an der Kopflinie und laeuft bis an die Unterkante, die
     Liste beginnt dort, wo der Titel „Nachrichten" beginnt, und der Chat
     endet dort, wo das Profil endet. Darum stehen hier die Polster nach
     aussen auf 0 - nach innen (zur Linie hin) behalten sie ihre Luft. */
  body.has-sidebar[data-screen="nachrichten"]:not(.lh-fullscreen) #screen-nachrichten{
    flex:1 1 auto; min-height:0; display:flex; flex-direction:column;
    padding-top:0; padding-bottom:0;
  }
  body.has-sidebar[data-screen="nachrichten"]:not(.lh-fullscreen) #screen-nachrichten.hidden{
    display:none;
  }
  body.has-sidebar[data-screen="nachrichten"]:not(.lh-fullscreen) #pf-shell{
    flex:1 1 auto; min-height:0; height:auto;
  }
  body.has-sidebar[data-screen="nachrichten"]:not(.lh-fullscreen) .pf-searchrow{ padding-left:0; padding-top:16px; }
  body.has-sidebar[data-screen="nachrichten"]:not(.lh-fullscreen) .pf-filters,
  body.has-sidebar[data-screen="nachrichten"]:not(.lh-fullscreen) .pf-lhead{ padding-left:0; }
  body.has-sidebar[data-screen="nachrichten"]:not(.lh-fullscreen) .pf-convs{ padding-left:0; padding-bottom:var(--pl-seite); }
  body.has-sidebar[data-screen="nachrichten"]:not(.lh-fullscreen) .pf-chead,
  body.has-sidebar[data-screen="nachrichten"]:not(.lh-fullscreen) #pf-csuche{ padding-right:0; padding-left:16px; }
  body.has-sidebar[data-screen="nachrichten"]:not(.lh-fullscreen) .pf-msgs{ padding-right:0; padding-left:18px; }
  body.has-sidebar[data-screen="nachrichten"]:not(.lh-fullscreen) .pf-comp{ padding-right:0; padding-left:18px; padding-bottom:var(--pl-seite); }

  /* Screens innerhalb des Panels: keine eigene weiße Karte mehr (sonst
     Weiß-auf-Weiß). Rahmen/Schatten/Hintergrund entfernen, Panel trägt alles.

     DIE DRITTE ZEILE IST DER GRUND, WARUM DAS ERKLÄRBLATT DREIMAL „in einer
     Box" AUSSAH (Befund Murat 27.08.2026: „ya kardesim erklär blatt hala kutu
     icinde aufgabena bak böyle istiyom demistim sna").

     Und es lag NICHT am Erklärblatt-Stylesheet, sondern an EINEM Zeichen hier:
     `>`. Die Aufgabenliste steht als `.wrap > section#screen-dashboard >
     .card` – ein direktes Kind, die Regel greift, die Karte verschwindet.
     Das Erklärblatt hat eine Zwischenebene, weil das JavaScript seine Karte
     erst zeichnet: `.wrap > section#screen-erklaerblatt > #erklaerblatt-content
     > .card`. Ein ENKEL. Der Kindkombinator trifft ihn nicht, die Karte behielt
     Rahmen, Schatten, Radius und 22 px Polster – und genau das ist die Box,
     die man sieht.

     Warum hier eine dritte Zeile und kein Nachkommenkombinator (`section .card`):
     der träfe AUCH die Karten INNERHALB eines Bildschirms – die Detailkarte
     rechts, die Kästen im Konto –, und die sollen ihren Rahmen behalten. Die
     Regel meint die EINE Wurzelkarte eines Bildschirms, nicht jede Karte
     darin. Ein weiterer Bildschirm mit JS-gezeichneter Wurzelkarte gehört
     deshalb hier dazu; bewacht von qa/unit/test_erklaerblatt_ui.py.

     DIE VIER ZEILEN DARUNTER (v2.863.0) sind genau dieser Fall, viermal:
     Pinnwaende, Foerderplaene, Fehlzeitenbriefe und Blaue Briefe zeichnen
     ihre Wurzelkarte per JavaScript in `#…-content` - ein Enkel. Sie
     standen deshalb als Kasten mit 22 px Polster IM Panel, und am Telefon
     begann der Text erst 47 px hinter dem Bildschirmrand (Befund Murat
     26.09.2026: „mobilde oralar bazi kisimlar icin cok cok genis"; „her
     sayfada farkli … bir standarti yok"). Gemessen an allen Bildschirmen
     der Leiste und des Werkzeugkastens; es sind die einzigen vier.
     Bewacht von qa/unit/test_ein_rand_fuer_alle.py. */
  body.has-sidebar:not(.lh-fullscreen) .wrap > section.card,
  body.has-sidebar:not(.lh-fullscreen) .wrap > section > .card,
  body.has-sidebar:not(.lh-fullscreen) .wrap > section > #erklaerblatt-content > .card,
  body.has-sidebar:not(.lh-fullscreen) .wrap > section > #pwh-content > .card,
  body.has-sidebar:not(.lh-fullscreen) .wrap > section > #foerder-content > .card,
  body.has-sidebar:not(.lh-fullscreen) .wrap > section > #fehlzeiten-content > .card,
  body.has-sidebar:not(.lh-fullscreen) .wrap > section > #blauerbrief-content > .card{
    background:transparent; border:none; box-shadow:none;
    border-radius:0; padding:0; margin:0;
  }

  /* Die Kopfzeile bündig oben im Panel, mit dünner Trennlinie zum Inhalt. */
  body.has-sidebar:not(.lh-fullscreen) .app-topbar{
    padding-bottom:16px; border-bottom:1px solid var(--line);
  }
  /* KEIN Rand darunter (v2.862.0): die 20 px stehen jetzt als --pl-oben im
     rollenden Bereich, damit der Inhalt beim Rollen bis an die Linie laeuft
     statt 20 px darunter abgeschnitten zu werden. Jeder Bildschirm holt sie
     sich dort ab, wo er rollt - wer einen neuen Bildschirm mit eigener
     Shell baut, gibt ihm `padding-top:var(--pl-oben)`, sonst klebt sein
     Inhalt an der Linie.
     `.wrap >` ist NOETIG, nicht Zierde: die Grundregel der Kopfzeile
     (`margin:2px 0 20px`, Abschnitt „Neue Kopfzeile") steht WEITER UNTEN
     in dieser Datei und haette bei gleicher Gewichtung gewonnen - genau
     daran ist der erste Anlauf im Browser gescheitert. */
  body.has-sidebar:not(.lh-fullscreen) .wrap > .app-topbar{
    margin-bottom:0;
  }
  /* Bildschirme OHNE Kopfzeile (QR-Seite, Ergebnisse, Laden, Anmeldung -
     dort ist .app-topbar ausgeblendet) haben keine Linie, unter der Luft
     stehen muesste. Ohne diese Regel rueckten sie 20 px nach unten. */
  body[data-screen="share"].has-sidebar:not(.lh-fullscreen) .wrap,
  body[data-screen="results"].has-sidebar:not(.lh-fullscreen) .wrap,
  body[data-screen="loading"].has-sidebar:not(.lh-fullscreen) .wrap,
  body[data-screen="sso-invite"].has-sidebar:not(.lh-fullscreen) .wrap,
  body[data-screen="auth"].has-sidebar:not(.lh-fullscreen) .wrap{ --pl-oben:0px; }
  /* Die QR-Seite nimmt per ID ihr ganzes Polster zurueck (#screen-share.card)
     - das untere Mass muss sie deshalb ausdruecklich wiederbekommen, sonst
     stoesst ihr letzter Knopf beim Rollen an die Unterkante. */
  body.has-sidebar:not(.lh-fullscreen) .wrap > #screen-share.card{
    padding-bottom:var(--pl-unten);
  }
}
@media (min-width:1440px){
  /* --pl-seite steht hier NICHT mehr (bis v2.862.3: 30 px) - der Rand ist
     seit v2.863.0 auf jeder Breite derselbe, siehe `.wrap` im 900er-Block. */
  body.has-sidebar:not(.lh-fullscreen) .wrap{
    --pl-unten:36px;
    padding:24px var(--pl-seite) 0;
  }
}

/* ---------- Sidebar-Innenleben (shared) ---------- */
#app-sidebar .sb-top{
  display:flex; align-items:center; gap:6px;
  padding:2px 4px 12px; margin-bottom:6px;
  border-bottom:1px solid var(--line);
}
#app-sidebar .sb-logo{ height:24px; width:auto; flex:none; cursor:pointer; transition:opacity .18s ease; }
/* Eingeklappt: logo.png (kompakt). Aufgeklappt: logo2.png (volle Wortmarke). */
#app-sidebar .sb-logo-mark{ height:26px; object-fit:contain; max-width:100%; }
body:not(.sb-open) #app-sidebar .sb-logo-full{ display:none; }
body.sb-open #app-sidebar .sb-logo-mark{ display:none; }
/* Aufgeklappt: Wortmarke (logo2) mittig statt linksbündig. */
body.sb-open #app-sidebar .sb-logo-full{ margin:0 auto; height:30px; }
#app-sidebar .sb-toggle{
  margin-left:auto; appearance:none; border:none; cursor:pointer;
  width:28px; height:28px; border-radius:8px; flex:none;
  background:transparent; color:var(--muted-shell);
  display:flex; align-items:center; justify-content:center;
  transition:background .16s var(--sb-weich), color .16s var(--sb-weich),
             box-shadow .16s var(--sb-weich), transform .16s var(--sb-weich);
  box-shadow:3px 3px 7px var(--sb-tief), -3px -3px 7px var(--sb-hoch);
}
/* Der Knopf ist im Ruhezustand erhaben und geht beim Druecken hinein – die
   Bewegung sagt dasselbe wie das Symbol, nur schneller. */
#app-sidebar .sb-toggle:hover{ color:var(--ink); transform:translateY(-1px); }
#app-sidebar .sb-toggle:active{
  transform:scale(.94);
  box-shadow:inset 2px 2px 5px var(--sb-tief), inset -2px -2px 5px var(--sb-hoch);
}
#app-sidebar .sb-toggle svg{ width:16px; height:16px; fill:none; stroke:currentColor;
  stroke-width:2.2; stroke-linecap:round; stroke-linejoin:round; transition:transform .22s; }
body.sb-open #app-sidebar .sb-toggle svg{ transform:rotate(180deg); }
/* Eingeklappt (schmal): Logo-Marke + Pfeil bleiben nebeneinander, mittig,
   ohne umzuspringen (Wunsch: Pfeil klebt am Logo). */
body:not(.sb-open) #app-sidebar .sb-top{ padding:2px 2px 12px; gap:3px; justify-content:center; }
body:not(.sb-open) #app-sidebar .sb-toggle{ margin-left:2px; }
body:not(.sb-open) #app-sidebar .sb-logo-mark{ height:22px; }

/* ===========================================================================
   ZEITWERK - Stoppuhr und Timer (v2.291.0)
   ---------------------------------------------------------------------------
   AUSSEHEN: dasselbe Prinzip wie die Seitenleiste - zwei Schatten statt
   Fuellfarben, eine helle Kante oben links, eine dunkle unten rechts. Die
   Zahl liegt in einer MULDE (inset), die Knoepfe stehen ERHABEN darauf und
   senken sich beim Beruehren ein. Mehr ist der Effekt nicht.

   WARUM --paper UND NICHT --card: eine helle Kante braucht einen Grund, von
   dem sie sich abheben kann. Auf Weiss faellt die halbe Tiefe aus - dieselbe
   Physik, die schon die Kopfzeile und die mobile Schublade gelernt haben
   (qa/unit/test_seitenleiste.py, Zusage 3).

   KEINE eigenen Farbwerte: alles kommt aus --sb-tief/--sb-hoch und den
   Bedeutungsfarben. Das Fenster soll aussehen, als haette es immer
   dazugehoert - nicht wie ein Gast aus einem anderen Programm.
   MIT WEM: ZW/zwZeichnen() in static/js/index-app.js. */
.zw{
  position:fixed; top:96px; right:28px; z-index:9600;
  width:min(404px, calc(100vw - 24px));
  background:var(--paper); border-radius:var(--r-panel);
  /* ZWEITE ZEILE, ABSICHTLICH (v2.294.0): DAS FENSTER TRAEGT DIE FLAECHENFARBE
     DER LEHRKRAFT (--shell-bg, waehlbar im Konto: Stein, Himmel, Rose …).
     Zwei Gruende, und der zweite ist der eigentliche:
     (1) Wunsch Murat 16.08.2026 - "stopuhrun rengi de arkaplana göre degisse".
     (2) Diese Tiefe FUNKTIONIERT nur so. Die weichen Schatten sind kein
         Muster, sondern Licht auf einer Flaeche: eine helle Kante oben links,
         eine dunkle unten rechts. Sie setzen voraus, dass das Element
         DIESELBE Farbe hat wie der Grund, aus dem es herausgedrueckt wird -
         genau die Begruendung, die auch an --sb-tief/--sb-hoch steht. Ein
         festes Weiss darauf sieht bei jeder Wunschfarbe schmutzig aus; das
         war der Befund "zu weiss".
     Die Zeile darueber bleibt als Rueckfallebene stehen: --shell-bg hat als
     Vorgabe ohnehin --paper. */
  background:var(--shell-bg);
  box-shadow:8px 8px 22px var(--sb-tief), -6px -6px 18px var(--sb-hoch);
  user-select:none; touch-action:none;
  animation:zwAuf .22s var(--sb-weich);
}
@keyframes zwAuf{ from{opacity:0; transform:translateY(-6px) scale(.98);} to{opacity:1;} }
.zw.zw-zieht{ box-shadow:12px 12px 30px var(--sb-tief), -8px -8px 22px var(--sb-hoch); }
.zw-kopf{
  display:flex; align-items:center; gap:8px; padding:12px 12px 8px;
  cursor:grab;
}
.zw.zw-zieht .zw-kopf{ cursor:grabbing; }
/* Die Umschaltung liegt in einer Mulde, der aktive Bereich steht erhaben
   darin - dieselbe Sprache wie der aktive Eintrag in der Leiste. */
.zw-tabs{
  display:flex; gap:4px; padding:4px; border-radius:var(--r-card); flex:1; min-width:0;
  box-shadow:inset 2px 2px 5px var(--sb-tief), inset -2px -2px 5px var(--sb-hoch);
}
.zw-tab{
  flex:1; min-width:0; appearance:none; border:none; background:transparent;
  font:inherit; font-size:12px; font-weight:700; color:var(--muted);
  padding:7px 8px; border-radius:var(--r-control); cursor:pointer;
  transition:color .16s, box-shadow .16s;
}
.zw-tab.an{
  color:var(--brand);
  box-shadow:3px 3px 7px var(--sb-tief), -3px -3px 7px var(--sb-hoch);
}
.zw-kopf-btns{ display:flex; gap:5px; flex:none; }
.zw-ico{
  width:28px; height:28px; flex:none; appearance:none; border:none; cursor:pointer;
  border-radius:50%; background:transparent; color:var(--muted);
  display:flex; align-items:center; justify-content:center;
  transition:box-shadow .16s, color .16s;
}
.zw-ico svg{ width:15px; height:15px; fill:none; stroke:currentColor; stroke-width:2.2;
  stroke-linecap:round; stroke-linejoin:round; }
.zw-ico:hover{ color:var(--ink);
  box-shadow:inset 2px 2px 4px var(--sb-tief), inset -2px -2px 4px var(--sb-hoch); }
.zw-body{ padding:4px 18px 18px; display:flex; flex-direction:column; gap:13px; }
/* Die Zahl sitzt in einer eingelassenen Scheibe - das ist das Bild aus der
   Vorlage: nichts liegt AUF der Flaeche, alles ist HINEINGEDRUECKT.
   Die Mulde ist seit v2.293.0 einen Tick staerker eingefaerbt als das Fenster
   darum: eine Vertiefung, die dieselbe Helligkeit hat wie ihre Umgebung, ist
   nur ein Schatten - mit dem Farbunterschied wird sie zum Zifferblatt. */
.zw-scheibe{
  border-radius:var(--r-panel); padding:20px 12px; text-align:center;
  /* Einen Schritt TIEFER als die Flaeche - nicht bunter. Gemischt wird mit
     --ink, also mit der Schriftfarbe: im hellen Design dunkelt das ab, im
     dunklen hellt es auf, und der Farbton der Lehrkraft bleibt in beiden
     Faellen erhalten. Eine feste Beimischung waere bei "Rose" rosa und bei
     "Minze" gruen daneben. */
  background:color-mix(in srgb, var(--ink) 7%, var(--shell-bg));
  box-shadow:inset 5px 5px 12px var(--sb-tief), inset -5px -5px 12px var(--sb-hoch);
}
.zw-zeit{
  font-size:36px; font-weight:800; letter-spacing:-.02em; color:var(--ink);
  font-variant-numeric:tabular-nums; line-height:1.05;
}
.zw-eingabe{ display:flex; gap:8px; }
.zw-eingabe label{
  flex:1; min-width:0; display:flex; flex-direction:column; gap:3px;
  font-size:10px; font-weight:700; letter-spacing:.04em; text-transform:uppercase;
  color:var(--muted); text-align:center;
}
.zw-eingabe input{
  width:100%; box-sizing:border-box; appearance:textfield; -moz-appearance:textfield;
  border:none; background:transparent; border-radius:var(--r-control);
  padding:8px 4px; font:inherit; font-size:16px; font-weight:800; text-align:center;
  color:var(--ink); font-variant-numeric:tabular-nums;
  box-shadow:inset 2px 2px 5px var(--sb-tief), inset -2px -2px 5px var(--sb-hoch);
}
.zw-eingabe input::-webkit-outer-spin-button,
.zw-eingabe input::-webkit-inner-spin-button{ -webkit-appearance:none; margin:0; }
.zw-eingabe input:focus{ outline:2px solid var(--brand); outline-offset:1px; }
/* umbrechen statt ueberlaufen: auf einem 320-px-Handy quer haben drei
   Knoepfe nebeneinander keinen Platz - dann steht "Runde" eine Zeile
   tiefer, statt aus dem Fenster zu ragen. */
.zw-knoepfe{ display:flex; flex-wrap:wrap; gap:8px; }
/* KEIN Umbruch und keine feste Breite: "Zuruecksetzen" ist das laengste Wort
   im Fenster und passte bei 340 px Breite nicht in sein Drittel (Befund Murat
   16.08.2026). Jetzt wachsen die Knoepfe mit ihrer Beschriftung (flex-basis
   auto statt 0), und das Fenster ist breit genug fuer alle drei. */
.zw-btn{
  flex:1 1 auto; min-width:0; appearance:none; border:none; cursor:pointer;
  /* dieselbe Flaeche wie das Fenster - sonst liegt ein andersfarbiges
     Rechteck darauf und die Tiefe kippt (siehe Begruendung an .zw). */
  background:var(--shell-bg); color:var(--ink); white-space:nowrap;
  font:inherit; font-size:12.5px; font-weight:700; padding:12px 10px;
  border-radius:var(--r-card);
  box-shadow:4px 4px 9px var(--sb-tief), -4px -4px 9px var(--sb-hoch);
  transition:box-shadow .16s, color .16s;
}
.zw-btn:hover{ box-shadow:inset 3px 3px 6px var(--sb-tief), inset -3px -3px 6px var(--sb-hoch); }
.zw-btn:active{ transform:scale(.985); }
.zw-btn[disabled]{ opacity:.45; cursor:default; box-shadow:none; }
.zw-btn.zw-haupt{ color:var(--ok-ink); }
.zw-btn.zw-haupt.laeuft{ color:var(--amber-ink); }
.zw-ton{ display:flex; align-items:center; gap:9px; font-size:11.5px; color:var(--muted); }
.zw-ton select{
  flex:1; min-width:0; font:inherit; font-size:12px; color:var(--ink);
  border:none; background:transparent; border-radius:var(--r-control); padding:7px 9px;
  box-shadow:inset 2px 2px 5px var(--sb-tief), inset -2px -2px 5px var(--sb-hoch);
}
/* Ein-/Ausschalter im Fliesstext-Format (Konfetti). Er sieht eingedrueckt aus,
   wenn er AN ist - dieselbe Sprache wie der aktive Bereich der Umschaltung
   oben; ein zweiter Schaltertyp waere eine zweite Formensprache. */
.zw-schalter{
  flex:none; appearance:none; border:none; cursor:pointer;
  font:inherit; font-size:11.5px; font-weight:800; color:var(--muted);
  background:transparent; padding:7px 12px; border-radius:var(--r-pill);
  box-shadow:3px 3px 7px var(--sb-tief), -3px -3px 7px var(--sb-hoch);
  transition:color .16s, box-shadow .16s;
}
.zw-schalter.an{
  color:var(--brand);
  box-shadow:inset 2px 2px 5px var(--sb-tief), inset -2px -2px 5px var(--sb-hoch);
}
/* Die Leinwand fuer Feuerwerk und Konfetti liegt UEBER allem und faengt
   keinen Klick ab - sonst waere die Seite fuenf Sekunden lang tot. */
.zw-konfetti{
  position:fixed; inset:0; z-index:9700; pointer-events:none;
}
.zw-runden{ max-height:132px; overflow-y:auto; display:flex; flex-direction:column; gap:2px; }
.zw-runde{ display:flex; justify-content:space-between; align-items:center;
  font-size:12px; color:var(--muted); padding:5px 2px;
  border-bottom:1px solid var(--hair); }
.zw-runde b{ color:var(--ink); font-variant-numeric:tabular-nums; }
/* Abgelaufen: die Scheibe pulst kurz in der Warnfarbe. Der Ton kann stumm
   sein (Autoplay-Sperre, Geraet lautlos) - sichtbar muss es trotzdem sein. */
.zw-aus .zw-scheibe{ animation:zwPuls 1s ease-in-out 4; }
@keyframes zwPuls{
  0%,100%{ box-shadow:inset 5px 5px 12px var(--sb-tief), inset -5px -5px 12px var(--sb-hoch); }
  50%{ box-shadow:inset 5px 5px 12px var(--sb-tief), inset -5px -5px 12px var(--sb-hoch),
                  0 0 0 3px var(--amber-soft); }
}
.zw-aus .zw-zeit{ color:var(--amber-ink); }
/* Eingeklappt: nur noch die Zahl - gross genug, um sie vom Pult aus zu lesen,
   und auf JEDER Seite sichtbar. Der gruene Punkt daneben ist mit v2.294.0
   entfallen (Befund Murat 16.08.2026: "o yesil sey olmasin gereksiz"): eine
   laufende Zahl sagt selbst, dass sie laeuft; eine stehende ebenso. */
.zw.zw-klein{ width:auto; top:96px; right:28px; border-radius:var(--r-pill); cursor:grab; }
.zw.zw-klein.zw-zieht{ cursor:grabbing; }
.zw-mini{
  display:flex; align-items:center; justify-content:center; appearance:none; border:none;
  cursor:inherit; background:transparent; font:inherit; font-size:26px; font-weight:800;
  color:var(--ink); font-variant-numeric:tabular-nums; letter-spacing:-.01em;
  padding:12px 24px; border-radius:var(--r-pill);
}
/* Laeuft die Zeit, atmet die Pille ganz leicht - das ersetzt den Punkt und
   braucht keine zweite Farbe. Bei "weniger Bewegung" steht sie still. */
.zw.zw-klein.zw-laeuft{ animation:zwAtmen 2.6s ease-in-out infinite; }
@keyframes zwAtmen{
  0%,100%{ box-shadow:8px 8px 22px var(--sb-tief), -6px -6px 18px var(--sb-hoch); }
  50%{ box-shadow:5px 5px 14px var(--sb-tief), -4px -4px 12px var(--sb-hoch); }
}
@media (prefers-reduced-motion: reduce){
  .zw.zw-klein.zw-laeuft{ animation:none; }
}
@media (max-width:640px){
  .zw{ right:12px; left:12px; width:auto; top:74px; }
  .zw.zw-klein{ left:auto; right:12px; width:auto; }
  .zw-zeit{ font-size:32px; }
}

/* Scrollbereich mit den Einträgen */
#app-sidebar .sb-scroll{ flex:1; overflow-y:auto; overflow-x:hidden; margin:2px -4px; padding:2px 4px;
  scrollbar-width:none; display:flex; flex-direction:column;
  /* Bezugsrahmen der Linse (siehe .sb-linse). Sie liegt IN der Rolle, damit
     sie beim Scrollen mitwandert statt stehenzubleiben. */
  position:relative; }
#app-sidebar .sb-scroll::-webkit-scrollbar{ display:none; }
#app-sidebar .sb-scroll .sb-item{ flex:none; }
/* Unterstützen: Teil der Liste, sitzt unten (margin-top:auto), scrollt aber mit. */
#app-sidebar .sb-scroll .sb-support{ margin-top:auto; }
#app-sidebar .sb-bottom{ flex:none; padding-top:8px; margin-top:4px; border-top:1px solid var(--line); }
/* Update-Zeile: ruhig (Claude-Stil). Kleiner blauer Punkt am Icon signalisiert
   "es gibt was Neues", ohne die ganze Zeile einzufaerben. Beschreibung bleibt
   dauerhaft sichtbar (kein Hover noetig), damit klar ist: Klick = neu laden. */
/* "HILFE & IDEEN" STEHT NICHT MEHR IN DER SEITENLEISTE (v2.514.0).
   Der Eintrag war der zweite Eingang zum Assistenten, neben dem Chip in den
   Nachrichten. Beide sind mit dem Umzug entfallen; der Punkt fuer wartende
   Antworten sitzt jetzt auf dem Maskottchen (.asst-mk-dot). Die Regeln fuer
   die laufende Fassung darunter bleiben - sie hingen nie an diesem Eintrag,
   sondern nur am selben Fuss der Leiste. */
/* Die laufende Fassung, klein unter "Hilfe & Ideen" (v2.316.0). Sie ist der
   Deploy-Beweis und soll ohne Umweg lesbar sein. Bewusst KEIN Knopf: es gibt
   nichts zu tun, sie ist eine Auskunft. Zugeklappt (70px) faellt sie weg -
   dort stehen nur Symbole, und eine abgeschnittene Versionsnummer ist
   schlechter als keine. */
#app-sidebar .sb-version{
  font-size:10.5px; line-height:1.2; color:var(--muted); opacity:.55;
  text-align:center; padding:7px 4px 2px; letter-spacing:.01em;
  font-variant-numeric:tabular-nums; user-select:text; }
body:not(.sb-open) #app-sidebar .sb-version{ display:none; }
/* HIER STAND DIE ZEILE „UPDATE" (.sb-update, bis v2.737.2). Eine neue Fassung
   kommt seit v2.738.0 von selbst - index-app.js „EINE NEUE FASSUNG KOMMT VON
   SELBST". */
/* Kurze Bildschirme: Navigation kompakter, damit ALLE Knöpfe sichtbar bleiben
   (Inhalte skalieren, nichts verschwindet).
   SEIT v2.920.0 NUR NOCH IN DER SCHUBLADE (unter 900 px). Am Rechner teilen
   sich die Eintraege die Hoehe selbst und ziehen Zeichen und Schrift nach
   der Hoehe der Rolle mit - „DIE LEISTE FUELLT IHRE HOEHE" weiter unten.
   Diese beiden Stufen schrumpften dort Zeichen auf 15 px und Schrift auf
   8,5 px, waehrend darunter ein Drittel der Leiste leer stand. */
@media (max-width:899.98px) and (max-height:880px){
  #app-sidebar .sb-item{ padding:7px 8px; margin:1px 0; gap:10px; }
  body:not(.sb-open) #app-sidebar .sb-item{ padding:6px 3px; gap:3px; }
  body:not(.sb-open) #app-sidebar .sb-item .sb-label{ font-size:9px; }
  #app-sidebar .sb-group{ padding:8px 8px 3px 10px; font-size:9.5px; }
  body:not(.sb-open) #app-sidebar .sb-group{ padding:6px 12px 2px; }
  /* Kleiner heisst nicht duenner: 17px brauchen 2.25, um dieselbe
     1.6px-Linie zu zeichnen wie 21px/1.85 (DESIGN_SYSTEM.md §6.2).
     Ohne die zweite Zahl erbt die Regel 1.85 und zeichnet 1.31px -
     die Seitenleiste wuerde auf schmalen Schirmen blasser. */
  #app-sidebar .sb-item svg{ width:17px; height:17px; stroke-width:2.25; }
}
@media (max-width:899.98px) and (max-height:740px){
  #app-sidebar .sb-item{ padding:5px 8px; }
  body:not(.sb-open) #app-sidebar .sb-item{ padding:4px 2px; }
  body:not(.sb-open) #app-sidebar .sb-item .sb-label{ font-size:8.5px; }
  #app-sidebar .sb-item svg{ width:15px; height:15px; stroke-width:2.55; }
}
#app-sidebar .sb-support{ position:relative; overflow:hidden; color:#7C5CFF; }
#app-sidebar .sb-support svg{ stroke:#7C5CFF; }
#app-sidebar .sb-support:hover{ background:rgba(124,92,255,.10); }
/* Sanfter Schein hinter dem Text (Markenfarbe, sehr dezent) – kein Lauflicht. */
#app-sidebar .sb-support::after{
  content:""; position:absolute; top:50%; left:50%; width:130px; height:36px;
  transform:translate(-50%,-50%); border-radius:999px; pointer-events:none;
  background:radial-gradient(ellipse at center, rgba(46,91,255,.16), transparent 70%);
  opacity:0; animation:sbGlowSoft 8s ease-in-out infinite;
}
@keyframes sbGlowSoft{ 0%,60%,100%{opacity:0;} 75%{opacity:1;} 90%{opacity:.35;} }
@media (prefers-reduced-motion: reduce){ #app-sidebar .sb-support::after{ animation:none; } }

/* Gruppen-Überschrift ("Werkzeuge" usw.) — klein, informativ, nicht laut */
#app-sidebar .sb-group{
  font-size:10.5px; font-weight:800; letter-spacing:.06em; text-transform:uppercase;
  color:var(--muted-shell); opacity:.75; padding:14px 8px 6px 10px; white-space:nowrap;
}
#app-sidebar .sb-group + .sb-item{ margin-top:0; }
body:not(.sb-open) #app-sidebar .sb-group{
  /* eingeklappt: als dünne Trennlinie statt Text */
  font-size:0; padding:10px 12px 4px; position:relative;
}
body:not(.sb-open) #app-sidebar .sb-group::after{
  content:""; display:block; height:1px; background:var(--line);
}

/* Aufklappbare Menü-Bereiche (Unterricht / Planen & Prüfen / Werkzeuge).
   Verhalten wie macOS-Seitenleisten: Kopf klickbar, Pfeil dreht sich,
   Zustand bleibt (localStorage). Eingeklappte (schmale) Leiste: Kopf wird
   zur Trennlinie, Einträge bleiben IMMER sichtbar (sonst käme man nicht ran). */
#app-sidebar .sb-sec-h{
  appearance:none; border:none; background:transparent; cursor:pointer; font-family:inherit;
  width:100%; display:flex; align-items:center; justify-content:space-between; gap:6px;
  font-size:10.5px; font-weight:800; letter-spacing:.06em; text-transform:uppercase;
  color:var(--muted-shell); opacity:.8; padding:14px 8px 6px 10px; white-space:nowrap;
  border-radius:8px;
}
#app-sidebar .sb-sec-h:hover{ color:var(--ink); opacity:1; }
#app-sidebar .sb-sec-h svg{
  width:12px; height:12px; fill:none; stroke:currentColor; stroke-width:2.2;
  stroke-linecap:round; stroke-linejoin:round; transition:transform .18s; flex:none;
}
#app-sidebar .sb-sec.closed .sb-sec-h svg{ transform:rotate(-90deg); }
body.sb-open #app-sidebar .sb-sec.closed .sb-sec-items{ display:none; }
body:not(.sb-open) #app-sidebar .sb-sec-h{
  font-size:0; padding:10px 12px 4px; cursor:default; pointer-events:none;
}
body:not(.sb-open) #app-sidebar .sb-sec-h::after{
  content:""; display:block; height:1px; background:var(--line); width:100%;
}
body:not(.sb-open) #app-sidebar .sb-sec-h svg{ display:none; }

/* Einträge */
/* `text-decoration:none` ist seit v2.311.0 noetig: die Eintraege mit eigener
   Adresse sind jetzt <a href> statt <button>, damit die mittlere Maustaste
   und Cmd/Strg+Klick sie in einem neuen Tab oeffnen (Begruendung bei navUrl
   in index-app.js). Ohne diese Zeile traegt genau die Haelfte der Leiste
   einen Unterstrich - naemlich die mit einer Adresse. */
#app-sidebar .sb-item{
  appearance:none; border:none; background:transparent; cursor:pointer;
  text-decoration:none;
  font-family:inherit; color:var(--muted-shell); width:100%;
  display:flex; align-items:center; gap:11px;
  padding:6px 10px; border-radius:11px; margin:1px 0;
  text-align:left;
  transition:background .16s var(--sb-weich), color .16s var(--sb-weich),
             box-shadow .16s var(--sb-weich), transform .16s var(--sb-weich);
}
/* Beruehrbar = eingedrueckt. Die Flaeche bleibt durchsichtig, gearbeitet wird
   allein mit den zwei inneren Schatten – deshalb stimmt die Farbe auf jeder
   der acht waehlbaren Schalen von selbst. */
#app-sidebar .sb-item:hover{
  background:transparent; color:var(--ink);
  box-shadow:inset 3px 3px 6px var(--sb-tief), inset -3px -3px 6px var(--sb-hoch);
}
/* Ausgewaehlt = erhaben.
   HIER STEHT ABSICHTLICH KEIN `background`. Die Fuellung des aktiven Eintrags
   gehoert dem Abschnitt „Akzent aus der Flaechenfarbe" am Dateiende – dort
   traegt sie die Farbe, die die Lehrkraft gewaehlt hat, und dort steht die
   VOLLSTAENDIGE Liste aller Stellen mit Akzent (qa/unit/test_flaeche_akzent.py
   zaehlt sie). Stuende die Fuellung auch hier, gaebe es zwei Wahrheiten, und
   die spaetere gewaenne stillschweigend – genau der Fehler, den dieser
   Abschnitt verhindern soll. Form, Tiefe und Schriftfarbe sind dagegen vom
   Farbton unabhaengig und bleiben hier.

   Und die Schriftfarbe ist NICHT nur Geschmack: die bisherige Paarung
   --brand auf --brand-soft erreicht 4.47:1 und faellt unter der
   Schriftschwelle 4.5 knapp durch. Weiss auf der Akzentfuellung ist
   dagegen gerechnet – ssAkzentSetzen() dunkelt sie so lange ab, bis
   4.5:1 stehen. Die Umstellung raeumt damit einen echten
   Barrierefreiheits-Mangel weg (BITV 2.0). */
#app-sidebar .sb-item.on{
  color:var(--on-brand); font-weight:700;
}
/* ⛔ DER AUSGEWAEHLTE EINTRAG WIRD BEIM UEBERFAHREN NICHT AUCH NOCH
   EINGEDRUECKT (Befund Murat 06.09.2026: „su cam efekti garip duruyo üstüne
   gelince yani arkadaki renkli kisim büyük duruyo, kenarlardan bire bir üst
   üste gelmelilerdi").

   Hier standen zwei innere Schatten - dieselbe Mulde wie beim Ueberfahren
   eines INAKTIVEN Eintrags. Auf der farbigen Linse ergab das einen hellen
   Innenrand, also ein zweites, kleineres Rechteck INNERHALB der Fuellung;
   zusammen mit dem Aussenschatten der Linse sah man zwei versetzte Kaesten
   statt eines. Und es war auch sachlich falsch: „eingedrueckt" heisst
   „beruehrbar" - ein Eintrag, der schon ausgewaehlt IST, hat nichts mehr
   anzubieten. Die Auswahl traegt die Linse, mehr braucht es nicht. */
#app-sidebar .sb-item.on:hover{
  color:var(--on-brand);
  box-shadow:none;
}

/* ===== DIE LINSE (v2.647.0) ===========================================
   AUFTRAG MURAT 04.09.2026: „secili halde cam olmasinda tusunca digerine
   gecerken o cam effekti versek." Vorbild ist wieder die WhatsApp-Leiste:
   dort ist die Auswahl kein Zustand, den zwei Felder abwechselnd tragen,
   sondern EIN Koerper, der von einem Feld zum naechsten zieht.

   GENAU DAS IST DER UMBAU: die Fuellung des aktiven Eintrags sitzt nicht
   mehr am Eintrag, sondern an einem einzigen Element in der Rolle. Der
   Eintrag behaelt Schriftfarbe, Schriftschnitt und Icon - also alles, woran
   die gerechnete Lesbarkeit haengt (weiss auf --flaeche-akzent, 4.5:1,
   ssDunkelnBis). Die FARBE der Linse steht wie zuvor im Abschnitt „Akzent
   aus der Flaechenfarbe" am Dateiende; hier stehen Form, Tiefe und Bewegung.

   WARUM DAS UEBERHAUPT NOETIG IST - und das ist die Falle beim Nachbauen:
   renderMainNav() zeichnet die Leiste bei JEDEM Seitenwechsel per innerHTML
   neu. Ein Eintrag, den es vor einer Millisekunde noch nicht gab, kann
   nirgendwo herkommen; eine Ueberblendung zwischen altem und neuem Eintrag
   ist damit unmoeglich. Ein Koerper, dessen Lage gemerkt und beim Zeichnen
   stumm wiederhergestellt wird, kann es. Die Merker-Logik steht bei
   sbLinseSetzen() in index-app.js - ohne sie fliegt die Linse bei jedem
   Seitenaufruf von oben herein.

   DER GLASZUG: der helle Innenrand (--glas-licht) ist derselbe wie an der
   Leiste, und beim Reisen zieht sich der Koerper kurz schmal zusammen. Das
   ist der ganze „liquid"-Eindruck - kein Filter, keine zweite Bibliothek.

   BEWACHT VON qa/unit/test_seitenleiste.py (Zusage 1: erhaben statt
   eingedrueckt, keine feste Farbe) und qa/unit/test_flaeche_akzent.py. */
#app-sidebar .sb-linse{
  position:absolute; left:4px; right:4px; top:0; height:0; z-index:0;
  border-radius:11px; pointer-events:none; opacity:0;
  transform:translateY(var(--linse-y,0px));
  /* ⛔ DIE TIEFE UMARMT DIE FORM, SIE WAECHST NICHT UEBER SIE HINAUS
     (derselbe Befund: „arkadaki renkli kisim büyük duruyo"). Vorher
     5px/12px Weichzeichnung auf einer gesaettigten Fuellung - das liest sich
     nicht als Schatten, sondern als zweiter, groesserer Koerper hinter dem
     ersten. Jetzt kurz und eng: die Kanten liegen aufeinander, die Erhebung
     bleibt (kein `inset` bei --sb-tief/--sb-hoch, siehe
     qa/unit/test_seitenleiste.py). */
  box-shadow:0 2px 6px var(--sb-tief), 0 -1px 3px var(--sb-hoch),
             inset 0 1px 0 var(--glas-licht);
  transition:transform .40s cubic-bezier(.34,1.26,.44,1),
             height .26s var(--sb-weich), opacity .18s ease;
}
#app-sidebar .sb-linse.da{ opacity:1; }
#app-sidebar .sb-linse.reist{ transform:translateY(var(--linse-y,0px)) scaleX(.93); }
/* Beim ersten Zeichnen, beim Auf-/Zuklappen und beim Drehen des Geraets wird
   die Linse GESETZT, nicht geflogen - sonst kaeme sie bei jedem Seitenaufruf
   von oben angerauscht. */
#app-sidebar .sb-linse.stumm{ transition:none; }
/* Die Eintraege liegen ueber der Linse: sie ist ihre Fuellung, nicht ihr
   Deckel. Ohne diese Zeile gewaenne das absolut gesetzte Element und
   verdeckte Schrift und Symbol. */
#app-sidebar .sb-item{ position:relative; z-index:1; }
@media (prefers-reduced-motion: reduce){
  #app-sidebar .sb-linse{ transition:opacity .18s ease; }
  #app-sidebar .sb-linse.reist{ transform:translateY(var(--linse-y,0px)); }
}
/* IM DUNKELN GILT DAS UMGEKEHRTE, und zwar gerechnet, nicht gefuehlt:
   dort ist --brand-dk (#9DB0FF) HELLER als --brand (#6E8CFF) – die Rollen der
   beiden Token kehren sich um (design-tokens.css sagt das ausdruecklich).
   Weisse Schrift erreicht auf diesem Verlauf nur 3.06:1 bzw. 2.08:1 und faellt
   klar durch. Deshalb bleibt der Dunkelmodus bei der bisherigen weichen
   Fuellung (4.49:1). Kein Rueckschritt, sondern die einzige Fassung, die dort
   lesbar ist. */
html[data-theme="dark"] #app-sidebar .sb-item.on{
  color:var(--brand);
}
html[data-theme="dark"] #app-sidebar .sb-linse{
  background:var(--brand-soft);
  box-shadow:3px 3px 8px var(--sb-tief), -3px -3px 8px var(--sb-hoch);
}
html[data-theme="dark"] #app-sidebar .sb-item.on .sb-ico svg{ stroke:var(--brand); }
html[data-theme="dark"] #app-sidebar .sb-item.on .sb-desc{ color:var(--muted); }
/* Kurz nachgeben beim Druecken – das ist der ganze Unterschied zwischen
   "Bild einer Taste" und "Taste". */
#app-sidebar .sb-item:active{ transform:scale(.985); }
#app-sidebar .sb-item svg{ width:21px; height:21px; flex:none; fill:none; stroke:currentColor;
  stroke-width:1.85; stroke-linecap:round; stroke-linejoin:round; }
#app-sidebar .sb-item .sb-label{
  font-size:13.5px; font-weight:600; white-space:nowrap; overflow:hidden;
  opacity:1; transition:opacity .16s;
}
#app-sidebar .sb-item.on .sb-label{ font-weight:700; }
/* Standard (offen / Drawer): volle Beschriftung; kurze ausgeblendet. */
#app-sidebar .sb-item .sb-label-short{ display:none; }

/* ---- Konfetti-Pop (Hover): Icon-Badge färbt sich, wackelt kurz, zwei
   Farbpunkte fliegen davon; unter dem Namen klappt eine Mini-Beschreibung auf. */
#app-sidebar .sb-ico{
  position:relative; width:34px; height:32px; flex:none; border-radius:10px;
  display:flex; align-items:center; justify-content:center;
  transition:background .18s;
}
/* ===== KEIN WACKELN MEHR (v2.413.0) ====================================
   ANWEISUNG MURAT 24.08.2026: „kesinlikle oyunsal biseye dönmesin."
   Hier lag genau das: `sbWob` drehte das Zeichen beim Ueberfahren um 8° und
   vergroesserte es um 15 %. Auf einem Werkzeug, mit dem Lehrkraefte den
   ganzen Tag arbeiten, ist eine huepfende Menuezeile kein Charme, sondern
   Unruhe - und sie sagt nichts, was die Farbflaeche nicht schon sagt.
   Die Rueckmeldung bleibt: das Plaettchen faerbt sich, das Zeichen wird
   weiss. Das ist deutlich genug und haelt still. */
#app-sidebar .sb-item:hover .sb-ico{ background:var(--sbc,#7F77DD); }
#app-sidebar .sb-item:hover .sb-ico svg{ stroke:#fff; }
/* (Hier lagen bis v2.413.0 zwei Konfetti-Punkte .pp/.pp2 mit `sbPop`. Sie
   sprangen beim Ueberfahren aus dem Plaettchen heraus - genau das, was ein
   Werkzeug fuer den Schulalltag nicht sein soll. Ersatzlos entfernt, in CSS
   UND im Markup: eine Regel ohne Element findet spaeter niemand wieder.)

   Auf dem aktiven Eintrag ist der Grund schon die Marke: ein zweites farbiges
   Kaestchen darauf waere Farbe auf Farbe. */
#app-sidebar .sb-item.on .sb-ico,
#app-sidebar .sb-item.on:hover .sb-ico{ background:transparent; }
#app-sidebar .sb-item.on .sb-ico svg,
#app-sidebar .sb-item.on:hover .sb-ico svg{ stroke:var(--on-brand); }
#app-sidebar .sb-item .sb-desc{
  display:block; font-size:10.5px; font-weight:500; color:var(--muted-shell);
  max-height:0; opacity:0; overflow:hidden; white-space:nowrap; text-overflow:ellipsis;
  transition:max-height .2s ease, opacity .2s ease; letter-spacing:0;
}
#app-sidebar .sb-item.on .sb-desc{ color:var(--on-brand); }
/* ⛔ HIER STAND BIS v2.647.1 EIN AUFKLAPPENDER BESCHREIBUNGSTEXT:
     `body.sb-open #app-sidebar .sb-item:hover .sb-desc{max-height:15px;opacity:1;}`
   Er machte den ueberfahrenen Eintrag 15px hoeher und schob damit ALLE
   Eintraege darunter nach unten - bei jeder Mausbewegung durch die Liste neu.
   Befund Murat 04.09.2026: „nav genis haldeyken tuslar böyle oynuyor
   kipirdiyor gezikce." Genau das war es.

   ZWEI GRUENDE, WARUM ER NICHT WIEDERKOMMT:
   1. CLAUDE.md, Entscheidung 2026-07: erklaerende Absaetze in der Oberflaeche
      werden nicht gelesen; ein `title`-Tooltip ist erlaubt, und den hat jeder
      Eintrag (title="<Name>"). Die Beschreibung war genau so ein Absatz.
   2. Die Linse (.sb-linse) misst die Lage des aktiven Eintrags EINMAL beim
      Zeichnen. Eine Liste, die beim Ueberfahren ihre Hoehen aendert, laesst
      die Auswahl neben ihrem Eintrag stehen. Wer den Text zurueckholt, muss
      seinen Platz FEST reservieren (immer sichtbar), nicht aufklappen.

   `.sb-desc` selbst bleibt: die Update-Zeile unten benutzt sie weiter, und
   dort bewegt sich nichts (sie steht dauerhaft offen, eine Zeile am Ende). */
body:not(.sb-open) #app-sidebar .sb-ico{ width:30px; height:26px; border-radius:8px; }

/* eingeklappt: Icon oben, Mini-Label darunter (kleine, nette Beschriftung) */
body:not(.sb-open) #app-sidebar .sb-item{
  flex-direction:column; gap:4px; padding:9px 3px; border-radius:14px;
}
body:not(.sb-open) #app-sidebar .sb-item .sb-label-full{ display:none; }
body:not(.sb-open) #app-sidebar .sb-item .sb-label-short{ display:block; }
body:not(.sb-open) #app-sidebar .sb-item .sb-label{
  font-size:9.5px; font-weight:600; line-height:1.05; width:100%;
  text-align:center; letter-spacing:-.015em;
  white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
}

/* ===== DIE LEISTE FUELLT IHRE HOEHE (v2.920.0) ===========================
   Befund Murat 01.10.2026, mit zwei Bildschirmfotos: seit der Werkzeugraum
   aufgeloest ist (PLAN_WERKZEUGE_VERTEILEN N4) stehen nur noch acht
   Eintraege in der Leiste. Darunter blieb ein Drittel der Hoehe leer,
   waehrend die Eintraege selbst auf kurzen Schirmen bis auf 15-px-Zeichen
   und 8,5-px-Schrift schrumpften (die alten Stufen 880/740 weiter oben).
   Wortlaut: „boyutlarini büyütüp modernlestirsek … browserin boyutu
   kücüldükce boyutu da kücülsün … hep büyük olup asagi kaymasin menü."

   WIE: Am Rechner (ab 900 px) teilen sich die Eintraege die freie Hoehe
   der Rolle - `flex:1 1 0`, gedeckelt auf --sb-zeile-max. Ein hohes
   Fenster bekommt grosse Eintraege und den Rest als Luft darunter, ein
   niedriges kleinere. Kleiner als ihr Inhalt werden sie nie (die
   automatische Mindesthoehe eines Flex-Kindes); erst dann rollt die Liste,
   der alte Ausweg mit unsichtbarem Balken.

   ZEICHEN UND SCHRIFT folgen in Stufen der Hoehe, die die ROLLE wirklich
   hat - nicht der Fensterhoehe. Darum ist `.sb-scroll` ein Groessen-
   Container: was unter der Liste steht (Robi abgelegt oder nicht), zaehlt
   so von selbst mit, ohne dass hier jemand nachrechnet. Wie die Schwellen
   entstehen, steht an den Stufen selbst. Browser ohne Container-Abfragen
   (iPadOS 15) bleiben auf der grossen Stufe und rollen.

   ⛔ JEDE STUFE SETZT GROESSE UND STRICH ZUSAMMEN (DESIGN_SYSTEM.md §6.2):
   24/1.6 · 22/1.75 · 20/1.92 · 18/2.13 · 17/2.25 - immer 1,6 px sichtbare
   Linie.
   Eine Stufe, die nur --sb-ico aendert, zeichnet duennere oder dickere
   Linien als der Rest der Seite. Nachgerechnet von
   qa/unit/test_seitenleiste.py (test_jede_leistenstufe_zeichnet_1_6_px).

   DIE SCHUBLADE (unter 900 px) BLEIBT, WIE SIE IST.
   VERBUNDEN MIT: sbLinseSetzen() (misst den aktiven Eintrag nach dem
   Layout und beim Aendern der Fenstergroesse neu), renderMainNav(). */
@media (min-width:900px){
  #app-sidebar .sb-scroll{ container:sb-rolle / size; }
  #app-sidebar .sb-scroll .sb-item{ flex:1 1 0; max-height:var(--sb-zeile-max); }
  #app-sidebar .sb-scroll{
    --sb-zeile-max:66px; --sb-ico:24px; --sb-strich:1.6; --sb-kissen:8px;
    --sb-schrift-zu:11px; --sb-schrift-auf:15px; --sb-luft:6px; --sb-abstand:5px;
  }
  body.sb-open #app-sidebar .sb-scroll{ --sb-zeile-max:54px; }
  #app-sidebar .sb-scroll .sb-item svg{
    width:var(--sb-ico); height:var(--sb-ico); stroke-width:var(--sb-strich);
  }
  /* Eingeklappt: Plaettchen ueber dem kurzen Namen, beides mittig in der
     Zeile, wie hoch sie auch geworden ist. */
  body:not(.sb-open) #app-sidebar .sb-scroll .sb-item{
    justify-content:center; gap:var(--sb-abstand); padding:var(--sb-luft) 3px; border-radius:16px;
  }
  body:not(.sb-open) #app-sidebar .sb-scroll .sb-ico{
    width:calc(var(--sb-ico) + 16px); height:calc(var(--sb-ico) + var(--sb-kissen)); border-radius:10px;
  }
  body:not(.sb-open) #app-sidebar .sb-scroll .sb-item .sb-label{
    font-size:var(--sb-schrift-zu); line-height:1.1; letter-spacing:0;
  }
  /* Aufgeklappt: eine ruhige Zeile mit groesserem Plaettchen und Schrift in
     Lesegroesse - „acik pozisyonda cok sig duruyor". */
  body.sb-open #app-sidebar .sb-scroll .sb-item{ gap:13px; padding:4px 12px 4px 8px; border-radius:14px; }
  body.sb-open #app-sidebar .sb-scroll .sb-ico{
    width:calc(var(--sb-ico) + 16px); height:calc(var(--sb-ico) + 14px); border-radius:12px;
  }
  body.sb-open #app-sidebar .sb-scroll .sb-item .sb-label{
    font-size:var(--sb-schrift-auf); letter-spacing:-.01em;
  }
  /* Die Linse folgt der Rundung der Eintraege - sonst steht ihre Ecke
     neben der Ecke des Eintrags. */
  body:not(.sb-open) #app-sidebar .sb-linse{ border-radius:16px; }
  body.sb-open #app-sidebar .sb-linse{ border-radius:14px; }
  /* Die Schwellen sind gerechnet, nicht geschaetzt: acht Eintraege mal die
     Hoehe, die der Inhalt der VORIGEN Stufe eingeklappt braucht (Polster +
     Plaettchen + Abstand + Namenszeile + 2 px Rand). Stufe 1 braucht
     8 x 63 = 504 px - darunter kaeme sie nicht mehr unter, also greift bei
     510 die zweite. Wer an einer Groesse dreht, rechnet die Schwelle
     darunter nach; sonst rollt die Liste wieder um ein paar Pixel
     (gemessen bei 1000 x 670, bevor die Zahlen stimmten: 13 px). */
  @container sb-rolle (max-height:510px){
    .sb-item{ --sb-ico:22px; --sb-strich:1.75; --sb-schrift-zu:10.5px;
              --sb-schrift-auf:14.5px; --sb-luft:4px; --sb-abstand:4px; }
  }
  @container sb-rolle (max-height:448px){
    .sb-item{ --sb-ico:20px; --sb-strich:1.92; --sb-schrift-zu:10px;
              --sb-schrift-auf:14px; --sb-luft:3px; }
  }
  @container sb-rolle (max-height:412px){
    .sb-item{ --sb-ico:18px; --sb-strich:2.13; --sb-kissen:6px; --sb-schrift-zu:9.5px;
              --sb-schrift-auf:13.5px; --sb-luft:2px; --sb-abstand:3px; }
  }
  @container sb-rolle (max-height:352px){
    .sb-item{ --sb-ico:17px; --sb-strich:2.25; --sb-kissen:5px; --sb-schrift-zu:9px;
              --sb-schrift-auf:13px; --sb-luft:1px; --sb-abstand:2px; }
  }
}

/* ---------- Neue Kopfzeile (App-Topbar): Titel links, Postfach/Profil rechts ---------- */
.app-topbar{ display:none; }
body.has-sidebar:not(.lh-fullscreen) .app-topbar{
  display:flex; align-items:center; gap:14px; margin:2px 0 20px; min-height:44px;
}
.app-topbar .at-menu{ /* nur mobil sichtbar */ display:none; }
.app-topbar .at-title{
  flex:1 1 auto; min-width:0;
  font-family:"Inter",-apple-system,BlinkMacSystemFont,"Segoe UI",system-ui,sans-serif;
  font-weight:800; letter-spacing:-.02em; color:var(--ink);
  font-size:clamp(19px,3vw,26px); white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
}
/* Dezente Kennzahlen NEBEN dem Seitentitel (z. B. Pinnwand-Hub:
   "3 Pinnwände · 1 Ordner · 1 freigegeben"). Wird von pwhRender() gesetzt,
   setPageTitle() raeumt beim Screenwechsel via textContent automatisch auf. */
.at-title .at-title-meta{
  margin-left:12px; font-size:12.5px; font-weight:650; letter-spacing:0;
  color:var(--muted); vertical-align:2px; white-space:nowrap;
}
@media(max-width:600px){ .at-title .at-title-meta{ display:none; } }
/* Cockpit-Begrüßung als Kopfzeilen-Titel: NIE zweizeilig (Wunsch 2026-07) –
   eine Zeile, kürzt bei Bedarf mit … und bleibt neben dem Profilbild. Gilt
   zentral fuer alle Seiten (setPageTitle setzt denselben #page-title). */
.app-topbar .at-title.at-title-hello{
  font-size:clamp(19px,3vw,30px); line-height:1.15;
  white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
}
body.has-sidebar:not(.lh-fullscreen) .app-topbar:has(.at-title-hello){
  align-items:center;
}
/* ⛔ SCHRIFTGROESSE AUF JEDER SEITE (v2.683.0, Ansage Murat 06.09.2026:
   „her sayfaya sayfadaki metinleri kücültüp büyüten bir -A+ istiyorum").

   Skaliert wird `.wrap` mit `zoom`, NICHT `font-size`. Grund: die Oberfläche
   ist in Pixeln gebaut (`font-size:13px` steht hundertfach im CSS) - eine
   Umstellung auf `rem` wäre ein Umbau jeder Seite, und eine reine
   Schriftvergrößerung ließe Kästen, Zeilenhöhen und Symbole zurück. `zoom`
   nimmt alles mit und ist genau das, was ein Mensch mit „größer" meint.

   ⛔ NUR DER INHALT, NICHT DIE HUELLE. Seitenleiste und Kopfzeile bleiben,
   wie sie sind - sonst wandert der Knopf unter dem eigenen Finger weg, und
   feste Überlagerungen (Menüs, Fenster) säßen falsch.

   Gespeichert im Browser, nicht am Konto: am Tablet im Klassenraum will man
   oft etwas anderes als am Schreibtisch. */
.app-topbar #authbar{ flex:none; min-width:0; }

/* ===== DIE KOPFZEILE AUF SCHMALEN SCHIRMEN (v2.363.0) ====================
   BEFUND MURAT 22.08.2026: „mobilde giris yapinca ve ben okul adminiysem sag
   üstteki mesaj, okul amblemi, text, admin girisi, profil resmi acayip yer
   kapliyo ve kocaman. soldaki mesajimida kesiyor."

   Er beschreibt zwei verschiedene Dinge, und beide stimmen:

   1. ZU VIELE ELEMENTE. Ein Schul-Admin traegt rechts FUENF Dinge: Postfach,
      Schul-Logo, Schulname, Verwaltungs-Knopf, Profilbild. Der 640er-Block
      unten blendete Name und Trennstrich schon aus - aber erst ab 641px war
      wieder alles da, und genau dazwischen (Tablet hochkant, geteiltes
      Fenster) draengt sich die volle Kapsel neben den Titel.
      Jetzt faellt der Schulname schon ab 900px weg. Das Logo bleibt: es sagt
      auf einen Blick, in WELCHER Schule man arbeitet - bei Lehrkraeften an
      zwei Schulen ist das keine Zierde.

   2. ZU GROSS. Postfach, Verwaltung und Profil sind je 40px - zusammen mit
      Abstaenden 140px, auf einem 375er Schirm mehr als ein Drittel der Zeile.
      Unter 640px werden es 34px; die Klickflaeche bleibt damit ueber den
      44px-Empfehlungen, weil die Knoepfe die volle Kopfzeilenhoehe treffen.

   WAS NICHT MEHR PASSIERT (v2.414.0): Der SCHULNAME wird nicht mehr
   ausgeblendet. Bis hierher stand hier `.av-school-name{display:none}` ab
   900px - und weil diese Regel WEITER UNTEN in der Datei steht als die der
   Kapsel, gewann sie. Am Telefon blieb vom „Wo arbeite ich" also nur ein
   Logo uebrig; genau das war Befund Murat 24.08.2026 („eskiden burda benim
   okulum okulum ismi dururdu o gitmis"). Der Platz ist jetzt da, weil der
   zweite Knopf daneben entfallen ist. Gekuerzt wird der Name ueber
   `max-width`, nicht versteckt - ein abgeschnittener Schulname sagt noch
   etwas, ein fehlender nichts.

   ⛔ Und die Kapsel selbst verschwindet nirgends: sie ist am Telefon der
   EINZIGE Weg in die Schulverwaltung. Wer sie hier ausblendet, sperrt jeden
   Schul-Admin aus, ohne dass es am Computer auffaellt. */
@media (max-width:900px){
  .av-school-name{ max-width:120px; }
  .avatar-wrap.with-school{ padding:4px 6px; gap:6px; }
}
@media (max-width:640px){
  body.has-sidebar:not(.lh-fullscreen) .app-topbar{ gap:8px; }
  .app-topbar .at-title{ font-size:clamp(17px,4.6vw,21px); }
  .pf-btn, .avatar-btn{ width:34px; height:34px; }
  .pf-btn svg{ width:20px; height:20px; }
  /* DAS BILD MUSS MITSCHRUMPFEN (v2.414.0). Der Knopf ging hier auf 34px,
     `.avatar-circle` blieb bei 40 - das Bild stand also 6px ueber seinen
     eigenen Knopf hinaus und wurde von der Kopfzeile angeschnitten. Genau
     das war der Befund Murat 24.08.2026: „sag üstteki profil resmi boka
     sarmis." Am Computer war nichts zu sehen, weil dort beide 40px sind. */
  .avatar-circle{ width:34px; height:34px; font-size:13px; }
  .avatar-caret{ width:9px; height:9px; }
  .av-school-logo{ width:26px; height:26px; }
  .av-school-logo svg{ width:15px; height:15px; }
}

/* Die alte Kopfzeile (Logo + Greeting + authbar) wird ersetzt, sobald die
   Sidebar aktiv ist. */
body.has-sidebar .topbar{ display:none; }
/* Doppelte Seitentitel: steht der Name schon oben in der App-Kopfzeile,
   blenden wir die identische Überschrift in der Karte aus. */
body.has-sidebar .screen-h2-dup{ display:none; }

/* ---------- MOBIL (< 900px): Sidebar als Schublade ---------- */
@media (max-width:899.98px){
  body.has-sidebar:not(.lh-fullscreen) .app-topbar{
    display:flex; margin:4px 0 16px; min-height:40px;
  }
  /* Seitliche Lücken auf Tablet-Hochkant (z. B. iPad 8, ~810px) für ALLE
     App-Seiten weg: die globale .wrap-Kappe (720px, Zeile ~28) ließ den Inhalt
     mittig kleben. Ab 900px hebt die Zwei-Spalten-Regel die Kappe schon auf –
     hier machen wir es fürs schmalere Fenster GLEICH, damit Cockpit, Material,
     Klassenbuch, Pinnwand … einheitlich die Breite nutzen (nur echte App-Shell-
     Seiten; Landing/Auth/Konto haben kein .has-sidebar und behalten 720px). */
  body.has-sidebar:not(.lh-fullscreen) .wrap{ max-width:none; }
  /* Tablet hochkant (721-899 px): hier steht die Zentrale NICHT im weissen
     Panel (Ausnahme unten) - seit v2.909.0 traegt sie keine eigene Karte mehr
     und laege sonst auf der Flaechenfarbe. Deshalb hier ihre Flaeche; bis
     720 px ist sie das deckende Blatt ueber der App (Regel bei .pf-shell). */
  @media (min-width:721px){
    body.has-sidebar[data-screen="nachrichten"]:not(.lh-fullscreen) #pf-shell{
      background:var(--card); border-radius:22px; }
  }

  /* ===== FESTE App-Shell auch mobil + Tablet-Hochkant (iPad 8) =====
     Weisses Panel bleibt STEHEN, der Inhalt scrollt DARIN – Kopf oben fix, unten
     gefüllt. WICHTIG (der Fehler beim letzten Mal): die Ränder respektieren die
     Safe-Area (Notch/Statusleiste), damit das Panel oben NICHT unter die
     Statusleiste rutscht und oben genauso viel Luft bleibt wie unten.
     - Im Browser ist env(safe-area-inset-*) = 0 -> 10px Rand ringsum.
     - Als installierte App (Notch) -> Rand = Notch-Höhe, Panel sitzt sauber darunter.
     Ausnahme: Nachrichten + iframe-Portale (eigene Vollflächen). */
  body.has-sidebar:not(.lh-fullscreen):not([data-screen="unterrichtsfaecher"]):not([data-screen="lautlesezeit"]):not([data-screen="nachrichten"]) .wrap{
    /* ===== GLEICH GROSSE LUECKE oben wie unten =====
       Vorher: --m-top = safe-area-top (47px auf iPhone 12 Pro Max),
               --m-bot = safe-area-bottom (34px).
       Der obere Bereich wird aber von der STATUSLEISTE (Uhr/Akku) gefuellt –
       sichtbar grau blieb dort also ~0px, unten dagegen volle 34px. Genau das
       war die "unten ist eine Luecke"-Beschwerde: die Zahlen waren gesetzt,
       aber der SICHTBARE Abstand war ungleich.
       Jetzt: --gap ist die sichtbare graue Luecke und gilt oben wie unten
       identisch. Oben kommt die Statusleisten-Hoehe zusaetzlich dazu (sonst
       laege das Panel unter der Uhr), unten NICHT – dadurch ist der graue
       Rand ober- und unterhalb des Panels exakt gleich breit.
       Der Home-Indicator liegt dann auf dem weissen Panel; damit Inhalt nicht
       darunter rutscht, federt die Scroll-Section unten ab (siehe unten). */
    /* 10px -> 7px (Rueckmeldung Murat 02.08.2026: "oben frisst es Flaeche").
       WAS DABEI ZU HOLEN IST, und was nicht - am iPhone 17 nachgerechnet:
           Dynamic Island endet   ~48px
           safe-area-inset-top     62px   <- 14px gehoeren iOS, nicht uns
           --gap                   10px   <- NUR das ist unser Anteil
           Panel beginnt           72px
       Die 14px Reserve setzt das Betriebssystem; wer sie anfasst, schiebt das
       Panel unter Uhr und Akku. Verhandelbar ist allein --gap, und der gilt
       oben wie unten GLEICH - die Symmetrie ist kein Zufall, sondern die
       Behebung der alten Beschwerde "unten ist eine Luecke" (siehe oben).
       Deshalb 7px statt 4px: das kostet 3px Flaeche und haelt den Rahmen
       ringsum gleich breit. */
    --gap: 7px;
    --m-top: calc(env(safe-area-inset-top, 0px) + var(--gap));
    --m-bot: var(--gap);
    --m-side: max(var(--gap), env(safe-area-inset-left, 0px));

    /* ===== KEINE HOEHENRECHNUNG MEHR (2026-07-26) =========================
       Vorher: `height: calc(var(--vh100) - …)`. Damit haengt die Panel-Hoehe
       an einer GEMESSENEN Zahl - und jede Abweichung zwischen dem, was das
       Geraet meldet, und dem, was es wirklich anzeigt, wird sofort als
       abgeschnittener oder zu kurzer Bildschirm sichtbar. Genau das war die
       wiederkehrende, nicht reproduzierbare Beschwerde.

       Jetzt: das Panel ist `position:fixed` und an ALLEN VIER SEITEN
       angeschlagen. Ein so verankertes Element fuellt den Layout-Viewport
       exakt aus - ohne dass irgendjemand seine Hoehe kennen muss. Es gibt
       nichts mehr zu messen, zu runden oder zu deckeln: was der Viewport ist,
       ist das Panel. Rechnet das Geraet anders als erwartet, waechst oder
       schrumpft das Panel einfach mit.
       (Die Seite selbst scrollt ohnehin nicht - gescrollt wird die
       Screen-Section IM Panel, siehe weiter unten.) */
    position: fixed;
    top: var(--m-top); bottom: var(--m-bot);
    left: var(--m-side); right: var(--m-side);
    margin: 0;
    width: auto; max-width: none; height: auto; max-height: none;
    box-sizing: border-box;
    overflow: hidden;
    display: flex; flex-direction: column;
    background: var(--card); border: 1px solid var(--line); box-shadow: var(--shadow);
    /* Seitlich 12 statt 16 px (v2.863.0, Befund Murat 26.09.2026: „mobilde
       oralar bazi kisimlar icin cok cok genis"). Der Inhalt beginnt damit
       20 px hinter dem Bildschirmrand (7 Luecke + 1 Linie + 12) - so wie
       die Randabstaende der Systemapps. Begruendung und Regel: --pl-seite
       im 900er-Block. */
    padding: 16px 12px 0;

    /* ===== Ecken-Rundung: geraetetypisch OHNE Geraete-Abfrage =====
       Kein CSS/JS kann den echten Eckenradius des Bildschirms auslesen – weder
       fuer iPhone 6 (eckig) noch iPhone 17 (stark gerundet) noch die hunderten
       Android-Geraete. Fest verdrahtete Werte waeren also auf der Mehrheit der
       Geraete falsch.
       Trick: env(safe-area-inset-*) ist der einzige verfuegbare Indikator.
       Geraete MIT gerundetem Display/Home-Indicator melden dort Werte > 0
       (iPhone X..17: unten 34px), eckige Geraete (iPhone 6/SE, iPad, Android
       mit Tasten, Desktop) melden 0. Wir rechnen daraus einen weichen Radius –
       je runder das Geraet, desto runder das Panel – und deckeln oben und unten
       per clamp(), damit nichts entgleist.
       Unten bewusst runder als oben (dort ist die Geraeterundung am staerksten
       sichtbar, oben ueberdeckt die Statusleiste einen Teil).
       WICHTIG – Fallback zuerst: clamp() gibt es erst ab iOS 13.4. Auf aelteren
       Geraeten (iPhone 6 bleibt bei iOS 12) wird die zweite Zeile als ungueltig
       verworfen und die feste 24px-Regel bleibt stehen. Kein eckiges Panel. */
       NACHGESCHAERFT 02.08.2026, mit zwei Aenderungen:

       (a) ALLE VIER Ecken haengen jetzt an safe-area-inset-BOTTOM, auch die
           oberen. Vorher richteten sich die oberen nach -TOP, und der Wert ist
           je nach Betriebsart verschieden: als installierte PWA meldet iOS
           oben 0 (die Statusleiste liegt dort ausserhalb der WebView), in der
           Capacitor-App dagegen 62. Dieselbe Seite hatte damit auf demselben
           Geraet unterschiedlich runde obere Ecken - PWA 20px, App 30px.
           -bottom meldet in BEIDEN Betriebsarten denselben Wert (34px) und ist
           damit der verlaesslichere Anzeiger fuer "dieses Geraet hat einen
           gerundeten Bildschirm".

       (b) Die Obergrenzen waren zu niedrig. Ein iPhone hat rund 55px
           Eckenradius; das Panel sitzt --gap davon entfernt, passend waeren
           also etwa 45px. Gedeckelt war bei 30/34 - sichtbar eckiger als das
           Geraet. Jetzt ~40 oben und ~47 unten (bei -bottom = 34px).
           Unten bleibt runder als oben: dort ist die Geraeterundung am
           staerksten sichtbar, oben ueberdeckt die Statusleiste einen Teil. */
    border-radius: 24px;
    border-radius:
      clamp(20px, calc(16px + env(safe-area-inset-bottom, 0px) * 0.70), 42px)
      clamp(20px, calc(16px + env(safe-area-inset-bottom, 0px) * 0.70), 42px)
      clamp(22px, calc(18px + env(safe-area-inset-bottom, 0px) * 0.85), 47px)
      clamp(22px, calc(18px + env(safe-area-inset-bottom, 0px) * 0.85), 47px);
  }
  /* Kopfzeile bleibt oben (flex:none) mit dünner Trennlinie, klar getrennt vom
     Inhalt (kein Ineinanderlaufen mehr). */
  body.has-sidebar:not(.lh-fullscreen):not([data-screen="unterrichtsfaecher"]):not([data-screen="lautlesezeit"]):not([data-screen="nachrichten"]) .app-topbar{
    flex: none; margin: 0 0 12px; padding-bottom: 12px; border-bottom: 1px solid var(--line);
  }
  /* Die aktive Screen-Section ist der interne Scroll-Bereich (Balken ausgeblendet). */
  body.has-sidebar:not(.lh-fullscreen):not([data-screen="unterrichtsfaecher"]):not([data-screen="lautlesezeit"]):not([data-screen="nachrichten"]) .wrap > section[id^="screen-"]{
    /* Unten federt die Safe-Area ab: das Panel reicht jetzt bis dicht an den
       Bildschirmrand, der Home-Indicator liegt also DARUEBER. Diese Reserve
       sorgt dafuer, dass die letzte Zeile trotzdem frei lesbar/tippbar bleibt. */
    flex: 1 1 auto; min-height: 0; overflow-y: auto; scrollbar-width: none;
    /* KEIN eigenes Gummiband (v2.42.8): Beim Pull-to-Refresh schiebt unser
       Skript das ganze Panel nach unten. Ohne diese Zeile federt iOS die
       Liste ZUSAETZLICH im Panel durch - Kopfzeile und Inhalt wandern dann
       getrennt voneinander, es sieht aus wie zwei Bewegungen uebereinander
       (Rueckmeldung 2026-07-26). Jetzt bewegt sich nur das Panel. */
    overscroll-behavior-y: none;
    padding-bottom: calc(16px + env(safe-area-inset-bottom, 0px));
  }
  body.has-sidebar:not(.lh-fullscreen):not([data-screen="unterrichtsfaecher"]):not([data-screen="lautlesezeit"]):not([data-screen="nachrichten"]) .wrap > section[id^="screen-"]::-webkit-scrollbar{ display: none; }

  /* ---- AUSNAHME: Einstellungen und Admin scrollen NICHT selbst (v2.99.2) ---
     BEFUND Murat 02.08.2026: "einstellungen a özel altta o bos yer duruyo" -
     unter der Liste klaffte eine Luecke, die zu nichts gehoerte.

     URSACHE: Die Regel darueber gibt JEDER Screen-Section ein Polster von
     16px + Safe-Area (rund 50px am iPhone). Das ist richtig, SOLANGE die
     Section selbst scrollt - dann ist es die Reserve, in die die letzte Zeile
     hineinlaufen darf. Genau diese beiden Bildschirme scrollen aber nicht
     selbst: `#screen-konto` und `#screen-admin` stehen weiter oben auf
     `overflow:hidden`, weil INNEN `#konto-content` bzw. `.adm-main` scrollt
     (sonst gaebe es zwei Balken). Fuer sie ist das Polster deshalb kein
     Auslauf, sondern eine tote Flaeche am unteren Panelrand, die niemand je
     fuellen kann - unabhaengig davon, wie weit man scrollt.

     KORREKTUR MEINERSEITS: In v2.99.0 stand hier die Vermutung, der Inhalt
     sei ABGESCHNITTEN, und `#konto-content` bekam zusaetzliches Polster.
     Das war die falsche Richtung - es hat die Luecke vergroessert. Die
     Reserve gehoert an den Ort, der wirklich scrollt, und nur einmal.

     WARUM HIER UND NICHT IM 640px-Block: die Luecke entsteht durch diese
     Regel, und die gilt ab 899.98px abwaerts. Auf dem Tablet im Hochformat
     ist sie genauso da. Ein Fix nur fuer 640px waere kein Fix, sondern eine
     zweite Wahrheit. */
  body.has-sidebar[data-screen="konto"] .wrap > #screen-konto,
  body.has-sidebar[data-screen="admin"] .wrap > #screen-admin{
    padding-bottom: 0;
  }
  body.has-sidebar[data-screen="konto"] #konto-content{
    padding-bottom: calc(12px + env(safe-area-inset-bottom, 0px));
  }
  /* Innere weisse Karten neutralisieren (Panel trägt das Weiss).
     DIESELBE REGEL WIE WEITER OBEN – und deshalb auch dieselbe dritte Zeile
     für die JS-gezeichnete Wurzelkarte des Erklärblatts. Wer nur eine der
     beiden Stellen ändert, bekommt die Box in der anderen Fenstergröße
     zurück; die ausführliche Begründung steht bei der ersten Fassung
     (dort auch, warum Pinnwand, Förderung, Fehlzeiten und Blauer Brief seit
     v2.863.0 dazugehören). */
  body.has-sidebar:not(.lh-fullscreen) .wrap > section.card,
  body.has-sidebar:not(.lh-fullscreen) .wrap > section > .card,
  body.has-sidebar:not(.lh-fullscreen) .wrap > section > #erklaerblatt-content > .card,
  body.has-sidebar:not(.lh-fullscreen) .wrap > section > #pwh-content > .card,
  body.has-sidebar:not(.lh-fullscreen) .wrap > section > #foerder-content > .card,
  body.has-sidebar:not(.lh-fullscreen) .wrap > section > #fehlzeiten-content > .card,
  body.has-sidebar:not(.lh-fullscreen) .wrap > section > #blauerbrief-content > .card{
    background: transparent; border: none; box-shadow: none; border-radius: 0; padding: 0; margin: 0;
  }

  .app-topbar .at-menu{
    display:flex; align-items:center; justify-content:center; flex:none;
    width:40px; height:40px; border-radius:12px; cursor:pointer;
    appearance:none; border:none; background:rgba(127,127,127,.08); color:var(--ink);
  }
  .app-topbar .at-menu:hover{ background:rgba(127,127,127,.16); }
  .app-topbar .at-menu svg{ width:21px; height:21px; fill:none; stroke:currentColor;
    stroke-width:2; stroke-linecap:round; stroke-linejoin:round; }
  .app-topbar .at-title{ font-size:clamp(17px,5vw,21px); }
  /* Begrüßung mobil ebenfalls einzeilig halten (sonst kürzt sie neben dem
     Profilbild nicht, weil die Zwei-Klassen-Regel groesser bleibt). */
  .app-topbar .at-title.at-title-hello{ font-size:clamp(16px,4.6vw,22px); }

  /* Drawer + Overlay */
  /* ===== DIE SCHUBLADE IST GLAS (v2.646.0) ===============================
     HIER hat das Milchglas seinen eigentlichen Sinn: die Schublade liegt
     UEBER dem Bildschirm, also hat blur etwas zu unschaerfen - genau das
     Bild der WhatsApp-Leiste, die den Auftrag ausgeloest hat.
     Deckkraft .80 statt .46 wie am Rechner, und das ist keine Willkuer: hier
     steht Text ueber wechselndem Inhalt und muss lesbar bleiben. Der
     abdunkelnde Vorhang (#sb-overlay, .42) hilft zusaetzlich.
     Der Rand rechts bleibt: er trennt die Schublade vom Inhalt, den sie
     ueberdeckt - am Rechner gibt es diese Kante nicht zu trennen. */
  body.has-sidebar #app-sidebar{
    display:flex; flex-direction:column; position:fixed; top:0; bottom:0; left:0; z-index:9500;
    width:min(84vw,300px); background:var(--glas-schublade);
    border:none; border-right:1px solid var(--line); border-radius:0 20px 20px 0;
    box-shadow:0 12px 40px rgba(27,34,48,.22);
    padding:calc(14px + env(safe-area-inset-top)) 14px calc(14px + env(safe-area-inset-bottom));
    transform:translateX(-104%); transition:transform .26s cubic-bezier(.4,0,.2,1);
    overflow:hidden;
    /* ===== WEICHE TIEFE, ABER LEISER (2026-08-15) =====================
       Die Schublade steht auf --card, also auf WEISS – und auf Weiss ist der
       helle Anteil des Schattenpaars per Definition unsichtbar. Bliebe der
       Desktop-Wert stehen, wirkte nur noch die dunkle Haelfte, und aus der
       weichen Mulde wuerde ein einseitiger Schmutzrand.
       Deshalb hier: heller Anteil aus, dunkler auf zwei Drittel. Das ergibt
       auf Weiss eine ruhige Vertiefung statt eines Schattens. Die REGELN
       darueber bleiben unveraendert – geaendert wird nur der Betrag, an
       genau einer Stelle. */
    --sb-tief: rgba(15,23,42,.07);
    --sb-hoch: rgba(255,255,255,0);
  }
  @supports not ((backdrop-filter:blur(2px)) or (-webkit-backdrop-filter:blur(2px))){
    body.has-sidebar #app-sidebar{ background:var(--glas-schublade-fest); }
  }
  /* DAS FILTER LAEUFT NUR, WENN DIE SCHUBLADE OFFEN IST (v2.647.1).
     Geschlossen steht sie mit `translateX(-104%)` neben dem Bildschirm - sie
     ist nicht weg, sie ist nur verschoben. Ein backdrop-filter an der
     Grundregel haelt dort eine Ebene, die nie jemand sieht, und laesst sie
     bei jedem Bild mitrechnen. Am Telefon ist das Akku ohne Gegenwert. */
  body.has-sidebar.drawer-open #app-sidebar{
    transform:translateX(0);
    -webkit-backdrop-filter:var(--glas-schliff); backdrop-filter:var(--glas-schliff);
  }
  #sb-overlay{
    display:block;
    position:fixed; inset:0; z-index:9400; background:rgba(0,0,0,.42);
    opacity:0; pointer-events:none; transition:opacity .22s;
  }
  body.drawer-open #sb-overlay{ opacity:1; pointer-events:auto; }

  /* Im Drawer immer die volle (ausgeklappte) Darstellung — Text sichtbar. */
  body.has-sidebar #app-sidebar .sb-item{ flex-direction:row; gap:12px; padding:11px 12px; }
  body.has-sidebar #app-sidebar .sb-item .sb-label{ font-size:15px; }
  body.has-sidebar #app-sidebar .sb-item .sb-label-full{ display:block; }
  body.has-sidebar #app-sidebar .sb-item .sb-label-short{ display:none; }
  body.has-sidebar #app-sidebar .sb-group{ font-size:10.5px; padding:16px 10px 6px; }
  body.has-sidebar #app-sidebar .sb-group::after{ display:none; }
  body.has-sidebar #app-sidebar .sb-toggle{ display:none; }
  body.has-sidebar #app-sidebar .sb-top{ flex-direction:row; gap:10px; padding:2px 4px 12px; }
  body.has-sidebar #app-sidebar .sb-logo-mark{ display:none; }
  body.has-sidebar #app-sidebar .sb-logo-full{ display:block; }
  body.has-sidebar .wrap{ padding-left:calc(16px + env(safe-area-inset-left)); }
  /* Auf der Schulseite laufen breite Verwaltungslisten - dort geben Shell
     und Karte ihre Raender ab (Ansage Murat 06.09.2026, „bi yürü yer var").
     Nur diese eine Seite; die uebrigen Bildschirme bleiben, wie sie sind. */
  body.has-sidebar[data-screen="schule"] .wrap{
    padding-left:calc(6px + env(safe-area-inset-left));
    padding-right:calc(6px + env(safe-area-inset-right)); }

  /* Profilkopf im Drawer (Foto + Name), oben — Tap öffnet Konto verwalten. */
  #app-sidebar .sb-profile{
    display:flex; align-items:center; gap:11px; width:100%;
    appearance:none; border:none; background:transparent; cursor:pointer;
    padding:10px 8px; border-radius:14px; text-align:left; margin-bottom:4px;
    transition:background .13s;
  }
  #app-sidebar .sb-profile:hover{ background:rgba(127,127,127,.08); }
  #app-sidebar .sb-prof-av{ width:44px; height:44px; border-radius:50%; flex:none;
    display:flex; align-items:center; justify-content:center; color:#fff; font-weight:700;
    font-size:16px; background-size:cover; background-position:center; }
  /* display:block, damit Name und Schule UNTEREINANDER stehen (sonst kleben
     sie in einer Zeile zusammen: "AdminFrida-Levy-…"). */
  #app-sidebar .sb-prof-name{ display:block; font-weight:700; font-size:15px; color:var(--ink); line-height:1.15;
    overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
  #app-sidebar .sb-prof-sub{ display:block; font-size:12px; color:var(--muted); margin-top:2px;
    overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
}
/* Desktop: Profil-Kopf im Drawer nicht anzeigen (dort sitzt Profil oben rechts). */
@media (min-width:900px){ #app-sidebar .sb-profile{ display:none; } }

/* ===== DIE SCHWEBENDE KAPSEL – Telefon und Tablet hochkant (v2.921.0) =====
   Auftrag Murat 01.10.2026: „aşağıda yüzen cam menü … sayfa arkada akacak",
   „üst tarafı açmak çok önemli", „şekil damla olsun, yazılar sadece
   seçildiğinde, minimalist". Wie sie arbeitet und warum die Kopfzeile in den
   Bildschirm zieht: index-app.js, „DIE SCHWEBENDE KAPSEL".

   NUR FUER DIE LEHRKRAFT (`body.ml-an`, gesetzt von mlAnwenden). Das Kind
   im Arbeitsplatz behaelt seine Schublade und den Menueknopf - deshalb
   haengt hier alles an `ml-an` und nicht an der Breite allein.

   ⛔ ZWEI FLAECHEN MIT backdrop-filter, und beide liegen wie die Schublade
   UEBER rollendem Inhalt: die Kapsel (klein, 60 px hoch) und das Blatt
   „Alles" (nur offen). Die Lehre von v2.647.0 - kein Filter auf einer
   bildschirmhohen Flaeche - bleibt unberuehrt. Der Huegel ueber dem
   gewaehlten Platz hat KEIN Filter: Safari schneidet backdrop-filter nicht
   an clip-path ab (im Prototyp ein Rechteck um die ganze Leiste); die
   Unschaerfe liegt deshalb an `.ml-glas` mit border-radius.
   ⛔ KEINE FESTE FARBE: Glas, Kante und Schatten kommen aus den --glas-*
   und --sb-tief-Variablen, der Tropfen aus dem Akzent-Abschnitt am
   Dateiende (#ml-leiste .ml-blase).
   VERBUNDEN MIT: qa/unit/test_mobil_kapsel.py, qa/unit/test_seitenleiste.py
   (Zahl der backdrop-filter-Stellen). */
/* Dieselbe Kapsel fuer Telefon und Rechner: die Form, Tropfen und Federn
   bleiben identisch. Desktop dreht nur die Laengsachse; keine rollende Liste. */
.ml-logo{ display:none; }
  #ml-leiste{
    /* Klareres Glas: beide SVG-Kanten und der gefilterte Streifen lesen
       denselben Stoff. Dunkel-/Fotowerte im Cockpit-Abschnitt gehen vor. */
    --glas-kapsel:rgba(255,255,255,.28);
    --glas-licht:rgba(255,255,255,.74);
    --muted:color-mix(in srgb,var(--ink) 85%,var(--card));
    --ml-oben:var(--glas-kapsel); --ml-unten:var(--glas-kapsel);
    --ml-kante:var(--glas-kante); --glas-schliff:blur(12px) saturate(160%);
  }
  @supports (color:color-mix(in srgb, white, transparent)){
    #ml-leiste{
      --ml-oben:color-mix(in srgb, var(--flaeche-akzent,var(--brand)) 6%, var(--glas-kapsel));
      --ml-unten:color-mix(in srgb, var(--flaeche-akzent,var(--brand)) 12%, var(--glas-kapsel));
      --ml-kante:color-mix(in srgb, var(--flaeche-akzent,var(--brand)) 16%, var(--glas-kante));
    }
  }
  #ml-leiste .ml-glas{ position:absolute; left:0; right:0; bottom:0; height:60px; border-radius:30px;
    background:linear-gradient(0deg, var(--glas-licht), transparent 32%, transparent 68%, var(--glas-licht));
    box-shadow:inset 0 0 2px var(--glas-licht);
    -webkit-backdrop-filter:var(--glas-schliff); backdrop-filter:var(--glas-schliff); }
  #ml-leiste .ml-form{ position:absolute; inset:0; width:100%; height:100%; overflow:visible;
    pointer-events:none; filter:drop-shadow(0 0 8px var(--sb-tief)); }
  #ml-leiste .ml-flaeche{ fill:var(--glas-kapsel); fill:url(#ml-glas-ton); stroke:var(--ml-kante); stroke-width:1; }
  #ml-leiste .ml-ton-oben{ stop-color:var(--ml-oben); }
  #ml-leiste .ml-ton-unten{ stop-color:var(--ml-unten); }
  #ml-leiste .ml-licht{ fill:none; stroke:var(--glas-licht); stroke-width:1.6; }
  html[data-theme="dark"] #ml-leiste{ --glas-kapsel:var(--glas-dunkel-kapsel); --glas-licht:var(--glas-dunkel-licht); }
  @supports not ((backdrop-filter:blur(2px)) or (-webkit-backdrop-filter:blur(2px))){
    #ml-leiste .ml-flaeche{ fill:var(--glas-schublade-fest); }
  }
  #ml-leiste .ml-plaetze{ position:absolute; left:6px; right:6px; bottom:0; height:60px; display:flex; }
  #ml-leiste .ml-platz{ flex:1 1 0; min-width:0; position:relative; padding:0; border:0; margin:0;
    background:transparent; cursor:pointer; pointer-events:auto; color:var(--muted);
    display:flex; flex-direction:column; align-items:center; justify-content:center; }
  #ml-leiste .ml-platz:focus-visible{ outline:2px solid var(--brand); outline-offset:-4px; border-radius:16px; }
  #ml-leiste .ml-platz > svg{ width:22px; height:22px; flex:none; fill:none; stroke:currentColor;
    stroke-width:1.75; stroke-linecap:round; stroke-linejoin:round;
    transition:transform .34s cubic-bezier(.34,1.4,.5,1), opacity .2s ease; }
  /* Der Name steht NUR unter dem gewaehlten Platz, klein - „minimalist". */
  #ml-leiste .ml-name{ position:absolute; bottom:7px; left:50%; transform:translate(-50%, 4px);
    font-size:10px; font-weight:700; letter-spacing:.01em; white-space:nowrap; color:var(--ink);
    opacity:0; transition:opacity .2s ease, transform .3s cubic-bezier(.34,1.4,.5,1); }
  #ml-leiste .ml-platz.an .ml-name{ opacity:1; transform:translate(-50%, 0); }
  #ml-leiste .ml-platz.an > svg,
  #ml-leiste .ml-platz.an > .ml-av{ opacity:0; transform:translateY(-20px) scale(.6); }
  #ml-leiste .ml-av{ width:27px; height:27px; border-radius:50%; flex:none; display:grid; place-items:center;
    color:var(--on-brand); font-size:10.5px; font-weight:800; overflow:hidden;
    transition:transform .34s cubic-bezier(.34,1.4,.5,1), opacity .2s ease; }
  #ml-leiste .ml-zahl{ position:absolute; top:7px; left:calc(50% + 4px); min-width:17px; height:17px;
    padding:0 4px; border-radius:9px; background:var(--bad); color:var(--on-brand);
    font-size:10px; font-weight:800; line-height:13px; text-align:center;
    border:2px solid var(--card); box-sizing:border-box; }
  #ml-leiste .ml-zahl[hidden]{ display:none; }
  #ml-leiste .ml-platz.an .ml-zahl{ opacity:0; }
  #ml-leiste .ml-blase{ position:absolute; top:0; left:0; width:44px; height:44px; border-radius:50%;
    display:grid; place-items:center; color:var(--on-brand); pointer-events:none; z-index:2;
    box-shadow:0 0 0 4px var(--ml-ring, var(--shell-bg, var(--paper))), 0 0 12px -4px var(--sb-tief),
               inset 0 0 1px var(--glas-licht);
    will-change:transform; transition:opacity .2s ease; }
  #ml-leiste.ohne-wahl .ml-blase{ opacity:0; }
  #ml-leiste .ml-blase > svg{ width:21px; height:21px; fill:none; stroke:currentColor; stroke-width:1.83;
    stroke-linecap:round; stroke-linejoin:round; }
  #ml-leiste .ml-blase > .ml-av{ width:44px; height:44px; font-size:14px; }
  #ml-leiste .ml-blase.tausch > *{ transform:scale(.4) rotate(-20deg); opacity:0; }
  #ml-leiste .ml-blase > *{ transition:transform .16s ease, opacity .16s ease; }
@media (min-width:900px){
  body.sb-fest.has-sidebar:not(.lh-fullscreen){ padding-left:124px; }
  body.sb-fest.has-sidebar:not(.lh-fullscreen) #app-sidebar{ display:none; }
  body.sb-fest.ml-an.has-sidebar #ml-leiste{
    display:block; position:fixed; z-index:590; left:var(--sb-leiste-links,10px); top:50%;
    width:76px; height:min(720px, calc(var(--vh100) - 124px)); transform:translateY(-50%);
    pointer-events:none; -webkit-tap-highlight-color:transparent;
  }
  body.sb-fest #ml-leiste .ml-glas{ left:0; right:auto; top:0; bottom:0; width:60px; height:100%; }
  body.sb-fest #ml-leiste .ml-form{ inset:auto; top:0; left:0; width:var(--ml-laenge); height:88px;
    transform-origin:0 0; transform:rotate(90deg) translateY(-88px); }
  body.sb-fest #ml-leiste .ml-plaetze{ top:6px; bottom:6px; left:0; right:0; height:auto; flex-direction:column; }
  body.sb-fest #ml-leiste .ml-platz{ min-height:0; align-items:flex-start; padding-left:16px; }
  body.sb-fest #ml-leiste .ml-platz > svg{ width:28px; height:28px; stroke-width:1.65; }
  body.sb-fest #ml-leiste .ml-platz > .ml-av{ width:28px; height:28px; }
  body.sb-fest #ml-leiste .ml-platz.an > svg,
  body.sb-fest #ml-leiste .ml-platz.an > .ml-av{ transform:translateX(8px) scale(.6); }
  body.sb-fest #ml-leiste .ml-name{ left:44px; top:calc(50% + 28px); bottom:auto; font-size:9px; line-height:12px; z-index:3; }
  body.sb-fest #ml-leiste .ml-blase > svg{ width:26px; height:26px; stroke-width:1.65; }
  body.sb-fest #ml-leiste .ml-zahl{ top:calc(50% - 22px); right:auto; left:34px; }
  body.sb-fest.has-sidebar:not(.lh-fullscreen) .app-topbar #authbar,
  body.sb-fest .app-topbar .at-menu{ display:none; }
  body.sb-fest .app-topbar #page-title:not(.at-title-hello):not(:has(.at-kopf)){ display:none; }
  body.sb-fest.has-sidebar:not(.lh-fullscreen) .app-topbar:not(:has(.at-title-hello, .at-kopf, #kbx-tb, #kal-tb, #kal-bar, #st-tb, #ss-tabs-host)),
  body.sb-fest.has-sidebar[data-screen="cockpit"]:not(.lh-fullscreen) .app-topbar{ display:none; }
  body.sb-fest.has-sidebar:not(.lh-fullscreen) .app-topbar{ border-bottom:0; padding-bottom:0; margin-bottom:0; min-height:0; }
  body.sb-fest.has-sidebar[data-screen="upload"]:not(.lh-fullscreen) .app-topbar{ display:none; }
  body.sb-fest.has-sidebar[data-screen="upload"] #mat-greeting{ display:block; text-align:center; }
  body.sb-fest .ck2-uhr .ck2-gruss{ display:block; text-align:center; margin-bottom:10px; font-size:clamp(16px,1.7vw,24px); }
  body.sb-fest.ml-an #ml-schleier{ display:block; position:fixed; inset:0; z-index:9059;
    background:transparent; opacity:0; pointer-events:none; }
  body.sb-fest.ml-an.ml-alles-auf #ml-schleier{ opacity:1; pointer-events:auto; }
  #ml-alles{ --ma-oben:var(--glas-schublade); --ma-unten:var(--glas-schublade);
    --ma-kante:var(--glas-kante); --ma-innen:var(--card); }
  @supports (color:color-mix(in srgb, white, transparent)){
    #ml-alles{
      --ma-oben:color-mix(in srgb, var(--flaeche-akzent,var(--brand)) 12%, var(--glas-schublade));
      --ma-unten:color-mix(in srgb, var(--flaeche-akzent,var(--brand)) 20%, var(--glas-schublade));
      --ma-kante:color-mix(in srgb, var(--flaeche-akzent,var(--brand)) 28%, var(--glas-kante));
      --ma-innen:color-mix(in srgb, var(--card) 78%, transparent);
    }
  }
  body.sb-fest.ml-an #ml-alles{ display:flex; flex-direction:column; gap:10px; position:fixed; z-index:9060;
    left:var(--sb-blatt-links,112px); bottom:24px; width:min(400px, calc(100vw - 136px));
    max-height:calc(var(--vh100) - 48px); overflow-y:auto; overscroll-behavior:contain;
    scrollbar-width:none; padding:14px; border-radius:26px;
    background:linear-gradient(145deg, var(--ma-oben), var(--ma-unten)); border:1px solid var(--ma-kante);
    box-shadow:0 18px 40px -12px var(--sb-tief), inset 0 1px 0 var(--glas-licht);
    transform:translateX(-12px) scale(.97); transform-origin:0 100%; opacity:0; pointer-events:none;
    transition:transform .25s var(--sb-weich), opacity .2s ease; }
  body.sb-fest.ml-an.ml-alles-auf #ml-alles{ transform:none; opacity:1; pointer-events:auto; }
  @supports not ((backdrop-filter:blur(2px)) or (-webkit-backdrop-filter:blur(2px))){
    body.ml-an #ml-alles{ background:var(--glas-schublade-fest); }
  }
  #ml-alles::-webkit-scrollbar{ display:none; }
  #ml-alles .ml-identitaet{ border-radius:20px; background:var(--ma-innen);
    border:1px solid var(--glas-kante); overflow:hidden; flex-shrink:0; }
  #ml-alles .ml-zeile{ display:flex; align-items:center; gap:12px; width:100%; text-align:left; cursor:pointer;
    padding:12px; border:0; border-radius:0; background:transparent; color:var(--ink); font:inherit; }
  #ml-alles .ml-zeile > svg{ width:18px; height:18px; flex:none; margin-left:auto; fill:none; stroke:var(--muted);
    stroke-width:2.13; stroke-linecap:round; stroke-linejoin:round; }
  #ml-alles .ml-ich-av{ width:50px; height:50px; border-radius:50%; flex:none; display:grid; place-items:center;
    color:var(--on-brand); font-weight:800; font-size:15px; overflow:hidden; }
  #ml-alles .ml-zeile-tx{ min-width:0; flex:1; display:flex; flex-direction:column; gap:3px; }
  #ml-alles .ml-zeile-tx b{ font-size:16px; letter-spacing:-.02em; line-height:1.3;
    white-space:normal; overflow-wrap:anywhere; }
  #ml-alles .ml-zeile-tx small{ font-size:12.5px; color:var(--muted); }
  #ml-alles .ml-schule{ border-top:1px solid var(--glas-kante); padding:11px 12px; }
  #ml-alles .ml-schule .ml-zeile-tx b{ font-size:13.5px; letter-spacing:0; }
  #ml-alles .ml-schule .ml-zeile-tx small{ font-size:11.5px; }
  #ml-alles .ml-schullogo{ position:relative; flex:none; display:flex; }
  #ml-alles .ml-schullogo .av-school-logo{ width:32px; height:32px; }
  #ml-alles .ml-raster{ flex-shrink:0; display:grid; grid-template-columns:repeat(4, minmax(0, 1fr)); gap:4px; }
  #ml-alles .ml-kachel{ display:flex; flex-direction:column; align-items:center; gap:6px; min-width:0;
    padding:8px 2px; border:0; border-radius:16px; background:transparent; cursor:pointer;
    color:var(--ink); font:inherit; font-size:11.5px; font-weight:700; }
  #ml-alles .ml-kachel i{ width:46px; height:46px; border-radius:15px; display:grid; place-items:center;
    background:var(--ma-innen); color:var(--ink); box-shadow:inset 0 1px 0 var(--glas-licht), 0 2px 6px -3px var(--sb-tief); }
  #ml-alles .ml-kachel i svg{ width:22px; height:22px; fill:none; stroke:currentColor; stroke-width:1.75;
    stroke-linecap:round; stroke-linejoin:round; }
  #ml-alles .ml-kachel span{ max-width:100%; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
  #ml-alles .ml-robi .robi-leiste, #ml-alles .ml-robi .robi-leiste-figur{ width:40px; height:40px; }
  #ml-alles .ml-liste{ display:flex; flex-direction:column; flex-shrink:0; border-radius:18px;
    background:var(--ma-innen); border:1px solid var(--glas-kante); overflow:hidden; }
  #ml-alles .ml-liste button{ display:flex; align-items:center; gap:12px; min-height:46px;
    text-align:left; padding:11px 14px; border:0; border-top:1px solid var(--glas-kante);
    background:transparent; cursor:pointer; font:inherit; font-size:14.5px; font-weight:600; color:var(--ink); }
  #ml-alles .ml-aktionsicon{ width:22px; flex:none; display:grid; place-items:center; color:var(--muted); }
  #ml-alles .ml-aktionsicon svg{ width:20px; height:20px; }
  #ml-alles .ml-raus .ml-aktionsicon{ color:inherit; }
  #ml-alles .ml-zeile:hover, #ml-alles .ml-liste button:hover{ background:var(--glas-karte); }
  #ml-alles .ml-liste button:first-child{ border-top:0; }
  #ml-alles .ml-liste .ml-raus{ color:var(--bad); }
  #ml-alles button:focus-visible{ outline:2px solid var(--brand); outline-offset:-2px; }

}

@media (min-width:900px) and (max-height:540px){
  body.sb-fest.ml-an.has-sidebar #ml-leiste{ height:calc(var(--vh100) - 84px); top:calc(50% + 18px); }
  body.sb-fest #ml-leiste .ml-logo{ top:-38px; height:30px; }
  body.sb-fest #ml-leiste .ml-logo img{ height:24px; }
}
body.ml-an.ml-alles-auf #ml-alles{
  -webkit-backdrop-filter:var(--glas-schliff); backdrop-filter:var(--glas-schliff);
}
#ml-leiste, #ml-schleier, #ml-alles{ display:none; }
@media (max-width:899.98px){
  body.ml-an #app-sidebar, body.ml-an #sb-overlay{ display:none !important; }
  body.ml-an .app-topbar .at-menu,
  body.ml-an .app-topbar #authbar{ display:none; }
  /* Im Bildschirm (mlKopfPlatzieren) ist die Kopfzeile nur noch Titel und
     rollt mit weg - ohne Linie darunter, sie trennt nichts mehr ab. */
  /* `.wrap >` ist noetig: die feste Shell darueber setzt Linie und Polster
     mit drei :not() - ohne die zusaetzliche Stufe gewaenne sie. */
  body.ml-an.has-sidebar:not(.lh-fullscreen) .wrap > section[id^="screen-"] > .app-topbar{
    margin:0 0 10px; padding-bottom:0; border-bottom:none; min-height:0;
  }

  body.ml-an.has-sidebar #ml-leiste{
    display:block; position:fixed; z-index:590;
    left:50%; bottom:calc(8px + env(safe-area-inset-bottom, 0px));
    width:min(calc(100% - 24px), 440px); height:88px;
    transform:translateX(-50%); pointer-events:none;
    transition:transform .3s cubic-bezier(.22,1,.36,1), opacity .2s ease;
    -webkit-tap-highlight-color:transparent;
  }
  /* Die Einstellungen tragen ihren eigenen Kopf („✕ Einstellungen") und rollen
     nicht selbst - der Seitentitel stuende dort doppelt und fest. */
  body.ml-an.has-sidebar[data-screen="konto"] .app-topbar{ display:none; }
  /* Waehrend getippt wird, tritt die Kapsel zurueck (ml-tippen, index-app.js). */
  body.ml-an.ml-tippen #ml-leiste{ transform:translate(-50%, 130%); opacity:0; }
  /* Die Nachrichten liegen am Telefon als eigenes Blatt (z-index 9000) ueber
     der App. In der Liste bleibt die Kapsel darueber erreichbar; im
     geoeffneten Gespraech gehoert der untere Rand dem Eingabefeld. */
  body.ml-an[data-screen="nachrichten"] #ml-leiste{ z-index:9050; }
  /* Das Blatt „Alles" und sein Schleier muessen mit hinauf - sonst oeffnet
     das Profilbild auf den Nachrichten ein Blatt UNTER der Zentrale (Befund
     Murat 01.10.2026: „nachrichten acikken profil acamiyorum"). */
  body.ml-an[data-screen="nachrichten"] #ml-alles{ z-index:9049; }
  body.ml-an[data-screen="nachrichten"] #ml-schleier{ z-index:9048; }

  /* KEINE SEITENTITEL AM TELEFON (v2.922.0, Murat 01.10.2026: „basliklara
     ihtiyac yok … onlarin yerine ikinci satira düsen kisimlari oraya
     kaldiralim"). Welcher Bereich offen ist, sagt der Name unter dem
     Tropfen. Es bleibt, was in der Zeile ARBEITET: die Begruessung, der
     Schulname mit Jahr (.at-kopf) und die Leisten, die Bildschirme dort
     einhaengen (Klasse, Kalender, Sprechtag/Studio, Schulverwaltung). Eine
     Kopfzeile, in der dann nichts mehr steht, faellt ganz weg. */
  body.ml-an .app-topbar #page-title:not(.at-title-hello):not(:has(.at-kopf)){ display:none; }
  body.ml-an .app-topbar:not(:has(#page-title.at-title-hello, .at-kopf, #kal-tb, #kal-bar, #st-tb, #ss-tabs-host)){
    display:none; }
  /* `#kbx-tb` (Klassen-Chip) zaehlt dort nicht mit: unter der Kapsel steht
     der Chip in der Karte neben dem Schuljahr (Abschnitt Klassen unten). */
  /* Nur AUF den Nachrichten: `.chat` bleibt an der Zentrale haengen, wenn
     man sie verlaesst - ohne den Bildschirm-Bezug verschwaende die Kapsel
     danach ueberall (gemessen im Pruefstand). */
  /* Weggetreten heisst auch: nicht mehr antippbar. */
  body.ml-an.ml-tippen #ml-leiste .ml-platz{ pointer-events:none; }
  body.ml-an[data-screen="nachrichten"] .pf-convs{
    padding-bottom:calc(104px + env(safe-area-inset-bottom, 0px)); }

  /* Glas braucht eine sichtbare Toennung auch ueber weissem Inhalt.
     SVG-Verlauf folgt der Tropfenform; nur die kleine Kapsel wird unscharf.
     Ohne color-mix bleiben die vorhandenen neutralen Glasfarben erhalten. */


  /* Das Blatt „Alles" - dasselbe Glas, ueber der Kapsel. */
  body.ml-an #ml-schleier{ display:block; position:fixed; inset:0; z-index:588;
    /* Nur der Tipp ausserhalb schliesst das Blatt. Kein dunkler Hintergrund:
       Safari/iOS-PWA kann die Farbe eines festen Overlays in die Statusleiste
       uebernehmen (WebKit 302272/305546). Das Glasblatt traegt seinen Schatten
       selbst; eine bildschirmhohe Abdunklung faerbt oben die Schale um. */
    background:transparent; opacity:0; pointer-events:none; transition:opacity .2s ease; }
  body.ml-an.ml-alles-auf #ml-schleier{ opacity:1; pointer-events:auto; }
  /* Das Blatt bleibt ueber Weiss als eigene Flaeche erkennbar. Die Toene
     folgen dem Akzent; ohne color-mix bleiben die bisherigen Glasfarben. */
  #ml-alles{ --ma-oben:var(--glas-schublade); --ma-unten:var(--glas-schublade);
    --ma-kante:var(--glas-kante); --ma-innen:var(--card); }
  @supports (color:color-mix(in srgb, white, transparent)){
    #ml-alles{
      --ma-oben:color-mix(in srgb, var(--flaeche-akzent,var(--brand)) 12%, var(--glas-schublade));
      --ma-unten:color-mix(in srgb, var(--flaeche-akzent,var(--brand)) 20%, var(--glas-schublade));
      --ma-kante:color-mix(in srgb, var(--flaeche-akzent,var(--brand)) 28%, var(--glas-kante));
      --ma-innen:color-mix(in srgb, var(--card) 78%, transparent);
    }
  }
  body.ml-an #ml-alles{ display:flex; flex-direction:column; gap:10px; position:fixed; z-index:589;
    left:50%; width:min(calc(100% - 24px), 440px);
    bottom:calc(104px + env(safe-area-inset-bottom, 0px));
    max-height:calc(var(--vh100) - 140px - env(safe-area-inset-bottom, 0px) - env(safe-area-inset-top, 0px));
    overflow-y:auto; overscroll-behavior:contain; scrollbar-width:none;
    padding:14px; border-radius:26px;
    background:linear-gradient(145deg, var(--ma-oben), var(--ma-unten));
    border:1px solid var(--ma-kante);
    box-shadow:0 18px 40px -12px var(--sb-tief), 0 3px 10px -4px var(--sb-tief), inset 0 1px 0 var(--glas-licht);
    transform:translate(-50%, 16px) scale(.94); transform-origin:90% 100%; opacity:0; pointer-events:none;
    transition:transform .32s cubic-bezier(.34,1.3,.5,1), opacity .2s ease; }
  body.ml-an.ml-alles-auf #ml-alles{ transform:translate(-50%, 0) scale(1); opacity:1; pointer-events:auto;
    }
  @supports not ((backdrop-filter:blur(2px)) or (-webkit-backdrop-filter:blur(2px))){
    body.ml-an #ml-alles{ background:var(--glas-schublade-fest); }
  }
  #ml-alles::-webkit-scrollbar{ display:none; }
  #ml-alles .ml-identitaet{ border-radius:20px; background:var(--ma-innen);
    border:1px solid var(--glas-kante); overflow:hidden; flex-shrink:0; }
  #ml-alles .ml-zeile{ display:flex; align-items:center; gap:12px; width:100%; text-align:left; cursor:pointer;
    padding:12px; border:0; border-radius:0; background:transparent; color:var(--ink); font:inherit; }
  #ml-alles .ml-zeile > svg{ width:18px; height:18px; flex:none; margin-left:auto; fill:none; stroke:var(--muted);
    stroke-width:2.13; stroke-linecap:round; stroke-linejoin:round; }
  #ml-alles .ml-ich-av{ width:50px; height:50px; border-radius:50%; flex:none; display:grid; place-items:center;
    color:var(--on-brand); font-weight:800; font-size:15px; overflow:hidden; }
  #ml-alles .ml-zeile-tx{ min-width:0; flex:1; display:flex; flex-direction:column; gap:3px; }
  #ml-alles .ml-zeile-tx b{ font-size:16px; letter-spacing:-.02em; line-height:1.3;
    white-space:normal; overflow-wrap:anywhere; }
  #ml-alles .ml-zeile-tx small{ font-size:12.5px; color:var(--muted); }
  #ml-alles .ml-schule{ border-top:1px solid var(--glas-kante); padding:11px 12px; }
  #ml-alles .ml-schule .ml-zeile-tx b{ font-size:13.5px; letter-spacing:0; }
  #ml-alles .ml-schule .ml-zeile-tx small{ font-size:11.5px; }
  #ml-alles .ml-schullogo{ position:relative; flex:none; display:flex; }
  #ml-alles .ml-schullogo .av-school-logo{ width:32px; height:32px; }
  #ml-alles .ml-raster{ flex-shrink:0; display:grid; grid-template-columns:repeat(4, minmax(0, 1fr)); gap:4px; }
  #ml-alles .ml-kachel{ display:flex; flex-direction:column; align-items:center; gap:6px; min-width:0;
    padding:8px 2px; border:0; border-radius:16px; background:transparent; cursor:pointer;
    color:var(--ink); font:inherit; font-size:11.5px; font-weight:700; }
  #ml-alles .ml-kachel i{ width:46px; height:46px; border-radius:15px; display:grid; place-items:center;
    background:var(--ma-innen); color:var(--ink); box-shadow:inset 0 1px 0 var(--glas-licht), 0 2px 6px -3px var(--sb-tief); }
  #ml-alles .ml-kachel i svg{ width:22px; height:22px; fill:none; stroke:currentColor; stroke-width:1.75;
    stroke-linecap:round; stroke-linejoin:round; }
  #ml-alles .ml-kachel span{ max-width:100%; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
  #ml-alles .ml-robi .robi-leiste, #ml-alles .ml-robi .robi-leiste-figur{ width:40px; height:40px; }
  #ml-alles .ml-liste{ display:flex; flex-direction:column; flex-shrink:0; border-radius:18px;
    background:var(--ma-innen); border:1px solid var(--glas-kante); overflow:hidden; }
  #ml-alles .ml-liste button{ display:flex; align-items:center; gap:12px; min-height:46px;
    text-align:left; padding:11px 14px; border:0; border-top:1px solid var(--glas-kante);
    background:transparent; cursor:pointer; font:inherit; font-size:14.5px; font-weight:600; color:var(--ink); }
  #ml-alles .ml-aktionsicon{ width:22px; flex:none; display:grid; place-items:center; color:var(--muted); }
  #ml-alles .ml-aktionsicon svg{ width:20px; height:20px; }
  #ml-alles .ml-raus .ml-aktionsicon{ color:inherit; }
  #ml-alles .ml-zeile:hover, #ml-alles .ml-liste button:hover{ background:var(--glas-karte); }
  #ml-alles .ml-liste button:first-child{ border-top:0; }
  #ml-alles .ml-liste .ml-raus{ color:var(--bad); }
  #ml-alles button:focus-visible{ outline:2px solid var(--brand); outline-offset:-2px; }

  /* Platz fuer die Kapsel am Ende jedes rollenden Bildschirms - sonst laege
     die letzte Zeile unter dem Glas. 104 = 88 Kapsel + 8 Abstand + 8 Luft. */
  body.ml-an.has-sidebar:not(.lh-fullscreen):not([data-screen="unterrichtsfaecher"]):not([data-screen="lautlesezeit"]):not([data-screen="nachrichten"]) .wrap > section[id^="screen-"]{
    padding-bottom:calc(104px + env(safe-area-inset-bottom, 0px));
  }
  /* Material ist eine Flex-Spalte. Ein echtes Endstueck bleibt auch in
     WebKit scrollbar, wenn dessen Flex-Scrollbox das Endpolster verschluckt. */
  body.ml-an.has-sidebar .wrap > #screen-upload{ padding-bottom:0; }
  body.ml-an #screen-upload > .komposit{ flex-shrink:0; }
  /* Seit v2.925.0 ist dieses Endstück zugleich die UNTERE FEDER der
     Mitte (Abschnitt „MITTIG – FÜR ALLE“): es wächst wie die obere
     (flex-grow 1), behält aber seine 104 px - gemittelt wird über der
     Kapsel-Leiste, nicht hinter ihr. */
  body.ml-an #screen-upload::after{ content:""; display:block; width:100%;
    flex:1 0 calc(104px + env(safe-area-inset-bottom, 0px)); }
  /* Das Fachportal scrollt im iframe. Seine Schale braucht dieselbe sichere
     Oberkante; die Reserve unten liegt deshalb IM Portal (ufKapselPlatz). */
  body.ml-an.has-sidebar[data-screen="unterrichtsfaecher"]:not(.lh-fullscreen) .wrap{
    position:fixed; top:calc(7px + env(safe-area-inset-top, 0px)); bottom:7px;
    left:calc(7px + env(safe-area-inset-left, 0px));
    right:calc(7px + env(safe-area-inset-right, 0px));
    margin:0; width:auto; height:auto; max-height:none; min-height:0; padding:12px;
    display:flex; flex-direction:column; overflow:hidden;
  }
  body.ml-an.has-sidebar[data-screen="unterrichtsfaecher"]:not(.lh-fullscreen) #screen-unterrichtsfaecher{
    padding-top:0; flex:1 1 auto; min-height:0; display:flex; flex-direction:column;
  }
  body.ml-an.has-sidebar[data-screen="unterrichtsfaecher"]:not(.lh-fullscreen) #screen-unterrichtsfaecher.hidden{ display:none; }
  body.ml-an.has-sidebar[data-screen="unterrichtsfaecher"]:not(.lh-fullscreen) #uf-frame{
    flex:1 1 auto; min-height:0; height:auto !important;
  }
  body.ml-an.has-sidebar[data-screen="konto"] .wrap > #screen-konto{ padding-bottom:0; }
  body.ml-an.has-sidebar[data-screen="konto"] #konto-content,
  body.ml-an.has-sidebar[data-kset="main"][data-screen="konto"] .kset-nav{
    padding-bottom:calc(104px + env(safe-area-inset-bottom, 0px));
  }
  /* Robi schwebt ueber der Kapsel, nicht auf ihr (Ort ohne eigene Wahl) -
     und tritt zurueck, solange das Blatt offen ist, sonst saesse er darauf. */
  body.ml-an .asst-mk{ bottom:calc(104px + env(safe-area-inset-bottom, 0px)); }
  body.ml-an.ml-alles-auf .asst-mk{ opacity:0; pointer-events:none; }
  body.ml-an #toast-wrap{ bottom:calc(108px + env(safe-area-inset-bottom, 0px)); }
}
/* DAS GESPRAECH AM TELEFON gehoert dem Eingabefeld (bis 720 px liegt die
   Zentrale als eigenes Blatt ueber der App, mit Zurueck-Pfeil oben). */
@media (max-width:720px){
  body.ml-an[data-screen="nachrichten"]:has(.pf-shell.chat) #ml-leiste{ transform:translate(-50%, 130%); opacity:0; }
  body.ml-an[data-screen="nachrichten"]:has(.pf-shell.chat) #ml-leiste .ml-platz{ pointer-events:none; }
}
/* DIE LISTE DER NACHRICHTEN BRAUCHT KEINEN ZURUECK-PFEIL (Murat 01.10.2026:
   „mesajlarin oldugu kisim icin geriye ihtiyac yok … tek ihtiyac bir mesaj
   acilinca geri dönülebilmesi"). Die Kapsel steht darunter; zurueck muss man
   nur aus dem Gespraech, und dessen Kopf behaelt seinen Pfeil. Der Titel
   „Nachrichten" faellt mit - wie jeder Seitentitel am Telefon. Die Suche
   rueckt hinauf und nimmt dafuer den Abstand zur Statusleiste. */
@media (max-width:720px){
  body.ml-an .pf-mobiletop{ display:none; }
  body.ml-an .pf-left .pf-searchrow{ padding-top:calc(10px + env(safe-area-inset-top, 0px)); }
}
/* DIE BEGRUESSUNG STEHT AM TELEFON NEBEN DER UHR (v2.922.0, Befund Murat am
   iPhone: allein an der gerundeten Panelkante „komik duruyo"). Links der
   Spruch, zwei bis drei Zeilen, rechts Datum, Uhr und Stoppuhr - ohne neuen
   Wrapper, das Raster stellt nur um. Die Kopfzeile des Cockpits faellt am
   Telefon weg; am Tablet und Rechner bleibt alles, wie es war. */
.ck2-gruss{ display:none; }
@media (max-width:640px){
  body.ml-an[data-screen="cockpit"] .app-topbar{ display:none; }
  body.ml-an .ck2-card.ck2-uhr{
    display:grid; grid-template-columns:minmax(0,1fr) auto;
    grid-template-areas:"gruss datum" "gruss zeit" "gruss timer";
    align-items:center; column-gap:14px; row-gap:1px; text-align:center; padding:4px 0 6px; }
  body.ml-an .ck2-uhr .ck2-gruss{ display:block; grid-area:gruss; text-align:left;
    font-size:clamp(17px, 5.2vw, 21px); font-weight:800; line-height:1.18; letter-spacing:-.02em;
    color:var(--ink); overflow-wrap:anywhere; }
  /* Datum, Uhr und Timer sind in IHRER rechten Spalte gemeinsam zentriert. */
  body.ml-an .ck2-uhr .ckb-date{ grid-area:datum; justify-self:center; }
  body.ml-an .ck2-uhr .ck-uhr-zeit{ grid-area:zeit; justify-self:center; font-size:28px; }
  body.ml-an .ck2-uhr .ck-uhr-timer{ grid-area:timer; justify-self:center; }

  /* KLASSEN AM TELEFON (v2.922.0, Befund Murat am iPhone):
     1. „schuljahr kismini yukari tasi alt satirda biraz daha cok menü göster":
        Klasse und Schuljahr stehen oben nebeneinander in der Karte, die
        Aktionen bekommen die zweite Zeile ganz. Der Chip kommt dafuer aus der
        Kopfzeile zurueck (`.kbx-head-ck`) - die gibt es am Telefon nicht mehr.
     2. In der vollen Zeile stehen jetzt auch Fehltage, Gruppen und Zufall
        (`.kbx-nurbreit`). Dafuer verschwinden genau diese Eintraege aus dem
        Schubfach (`.kbv-nurschmal`) - nie an beiden Stellen zugleich
        (qa/unit/test_halbjahr_waehler.py).
     3. „fachlarda … cocuk isimlerini kesiyor … genel görünümde bunu
        göstermeyelim": die Faecher-Spalten fallen weg, der Name bekommt die
        Zeile. Alle Faecher stehen im Profil des Kindes. */
  body.ml-an #kbx-tb{ display:none; }
  body.ml-an .kbx-head{ flex-wrap:wrap; overflow-x:visible; row-gap:var(--s-2); }
  body.ml-an .kbx-head-ck{ display:flex; flex:none; }
  body.ml-an .kbx-head .kbx-acts{ flex:1 0 100%; order:3; margin-left:0; justify-content:flex-end;
    overflow-x:auto; scrollbar-width:none; }
  /* Auge = Zustand links, die Werkzeuge rechts; alle vertikal mittig. */
  body.ml-an .kbx-head .kbx-acts{ align-items:center; }
  body.ml-an .kbx-head .kbx-acts > .kbx-auge{ margin-right:auto; flex:none; }
  body.ml-an .kbx-head .kbx-acts::-webkit-scrollbar{ display:none; }
  body.ml-an .kbx-act.kbx-nurbreit{ display:inline-flex; }
  body.ml-an .kbv-item.kbv-nurschmal{ display:none; }
  body.ml-an .kbx-table .kbx-cfach,
  body.ml-an .kbx-table .kbx-cplus{ display:none; }
}
/* AM TABLET HOCHKANT stehen Liste und Gespraech nebeneinander IM Panel, ohne
   Zurueck-Pfeil - die Kapsel ist dort der einzige Weg hinaus und bleibt.
   Die Zentrale endet deshalb ueber ihr. */
@media (min-width:721px) and (max-width:899.98px){
  body.ml-an[data-screen="nachrichten"] #pf-shell{ margin-bottom:calc(96px + env(safe-area-inset-bottom, 0px)); }
}
/* Ab 640 px hat die Kapsel neun Plaetze und wird breiter. */
@media (min-width:640px) and (max-width:899.98px){
  body.ml-an.has-sidebar #ml-leiste, body.ml-an #ml-alles{ width:min(calc(100% - 48px), 600px); }
}
@media (max-width:899.98px) and (prefers-reduced-motion: reduce){
  #ml-leiste, #ml-leiste *, #ml-alles, #ml-schleier{ transition:none !important; }
}

/* ===== PINNWÄNDE: Ordner-Übersicht (App-Tab) =========================
   GEBAUT WIE DAS REGAL IM BLATT-STUDIO (v2.910.0, Befund Murat 01.10.2026:
   „burası da ayrı bir dünya gibi"). Bis v2.908.0 sprach diese Seite eine
   eigene Sprache: Suchbalken ueber die volle Breite, blauer „Neu"-Knopf,
   roter „Papierkorb", Ordner mit dickem Farbrand, Pinnwaende in zufaelligen
   Pastellfarben mit einem Kreis in der Ecke, Fenster als weisse Kaesten mit
   festen Farben. Jetzt dieselben Bausteine wie im Blatt-Studio:
   - die Pille rechts (.pwh-pille) mit DENSELBEN Knoepfen .bl-u-knopf
     (Fuellung und Zeigen: Akzent-Abschnitt Nr. 11) - die Pille selbst ist
     ein eigener Kasten, weil die des Blatt-Studios eine Spitze zum Reiter
     hat und von blUnterEinpassen() verschoben wird;
   - EIN Raster fuer Ordner und Pinnwaende, jede Kachel mit Bild oben, Name
     und Zeile darunter (wie .bl-karte), das Menue „⋮" erst beim Zeigen;
   - das Bild einer Pinnwand ist GEZEICHNET: ihre eigene Hintergrundfarbe
     (--bg, frueher ignoriert) und ein Zettel je Karte, hoechstens sechs;
   - die Fenster sind die der App (.modal-overlay, .modal-card, .kswitch,
     .seg) - pwhFenster() in index-app.js.
   Farben der Flaechenfarbe: Akzent-Abschnitt Nr. 13. */
.pwh-toolbar{display:flex;align-items:center;gap:10px;margin-bottom:18px;flex-wrap:wrap;}
.pwh-search{display:flex;align-items:center;gap:8px;flex:1 1 220px;max-width:420px;min-width:0;height:38px;
  box-sizing:border-box;background:var(--paper);border:1.5px solid transparent;border-radius:12px;
  padding:0 8px 0 12px;color:var(--muted);transition:border-color .18s ease,background .18s ease;}
.pwh-search:focus-within{border-color:var(--brand);background:var(--card);}
.pwh-search input{flex:1;min-width:0;border:none;outline:none;background:transparent;font:inherit;font-size:14px;color:var(--ink);padding:0;}
.pwh-search-x{display:flex;align-items:center;justify-content:center;flex:none;width:24px;height:24px;
  border:none;border-radius:7px;background:transparent;color:var(--muted);cursor:pointer;padding:0;}
.pwh-search-x:hover{background:var(--line);color:var(--ink);}
.pwh-pille{margin-left:auto;display:inline-flex;align-items:center;gap:2px;padding:4px;flex:none;
  background:var(--card);border:1px solid var(--line);border-radius:12px;box-shadow:var(--e-1);}
/* Der Weg zurueck, nur im Ordner. Die Krumen sehen aus wie im Blatt-Studio. */
.pwh-krumen{display:flex;align-items:center;gap:2px;margin:0 0 14px;font-size:13px;}
.pwh-krume{border:0;background:transparent;font:inherit;color:var(--brand);font-weight:600;padding:4px 8px;border-radius:8px;cursor:pointer;}
.pwh-krume:hover{background:var(--brand-soft);}
.pwh-krume.an{color:var(--ink);font-weight:700;cursor:default;}
.pwh-krume.an:hover{background:transparent;}
.pwh-krume-p{display:flex;color:var(--muted);}
.pwh-hint{color:var(--muted);font-size:14px;padding:12px 2px;}
.pwh-leer{display:flex;flex-direction:column;align-items:center;text-align:center;gap:4px;padding:34px 20px;color:var(--muted);font-size:13px;}
.pwh-leer img{width:100%;max-width:120px;opacity:.85;margin-bottom:8px;}
.pwh-leer b{font-size:14.5px;color:var(--ink);}
/* Die Spalten FUELLEN die Zeile - dieselbe Regel wie .bl-regal (v2.906.0). */
.pwh-raster{display:grid;gap:18px;grid-template-columns:repeat(auto-fill,minmax(180px,1fr));}
.pwh-kachel{position:relative;display:flex;flex-direction:column;cursor:pointer;border-radius:12px;outline:none;}
.pwh-bild{position:relative;aspect-ratio:16 / 10;border-radius:12px;border:1px solid var(--line);overflow:hidden;
  box-sizing:border-box;transition:border-color .12s ease,box-shadow .12s ease;}
.pwh-kachel:hover .pwh-bild,.pwh-kachel:focus-visible .pwh-bild{border-color:var(--brand);box-shadow:var(--e-1);}
/* Ordner: dieselbe Kachel, das Bild ist ein Ordner in SEINER Farbe (die hat
   die Lehrkraft gewaehlt - sie bleibt, wie im Blatt-Studio). */
.pwh-ordner .pwh-bild{display:grid;place-items:center;background:color-mix(in srgb, var(--fc) 11%, var(--card));}
.pwh-ordner .pwh-bild .ic{width:40%;height:auto;fill:var(--fc);stroke:none;opacity:.92;}
.pwh-kachel.pwh-ordner:hover .pwh-bild,.pwh-kachel.pwh-ordner:focus-visible .pwh-bild{border-color:var(--fc);}
/* Pinnwand: ihre Hintergrundfarbe, ein Zettel je Karte (hoechstens sechs). */
.pwh-brett{background:var(--bg, var(--paper));display:grid;grid-template-columns:repeat(3,1fr);
  align-content:start;gap:8%;padding:9% 9%;}
.pwh-brett i{display:block;aspect-ratio:4 / 3;background:var(--card);border-radius:4px;
  border-top:3px solid var(--brand);box-shadow:0 1px 2px rgba(20,30,50,.14);}
.pwh-info{padding:8px 2px 0;min-width:0;}
.pwh-name{font-size:13.5px;font-weight:700;color:var(--ink);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.pwh-meta{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-top:3px;font-size:11.5px;color:var(--muted);}
.pwh-frei{display:inline-flex;align-items:center;gap:3px;color:var(--ok-ink);font-weight:700;}
.pwh-mehr{position:absolute;top:6px;right:6px;width:28px;height:28px;display:flex;align-items:center;justify-content:center;
  border:0;border-radius:8px;background:var(--card);color:var(--ink);box-shadow:var(--e-1);cursor:pointer;padding:0;
  opacity:0;transition:opacity .12s ease;}
.pwh-kachel:hover .pwh-mehr,.pwh-kachel:focus-within .pwh-mehr{opacity:1;}
@media (hover:none){ .pwh-mehr{opacity:1;} }
/* Die Fenster (Neue Pinnwand, Ordner, Papierkorb) - Rahmen aus .modal-*. */
.pwh-fenster .modal-card{max-width:480px;}
.pwh-fenster .modal-head b{font-size:16px;}
.pwh-lbl{display:block;font-weight:700;font-size:13px;color:var(--ink);margin:12px 0 6px;}
.pwh-in{width:100%;box-sizing:border-box;padding:10px 12px;border:1.5px solid var(--line);border-radius:10px;font:inherit;font-size:var(--fs-md);color:var(--ink);resize:vertical;}
.pwh-seg button{padding:9px 6px;}
.pwh-toggle{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-top:14px;font-size:13.5px;color:var(--ink);cursor:pointer;}
.pwh-toggle > span:first-child{flex:1;}
.pwh-fuss{display:flex;justify-content:flex-end;gap:9px;margin-top:20px;}
.pwh-fuss .btn{width:auto;margin:0;padding:9px 18px;font-size:14px;}
.pwh-sw-row{display:flex;flex-wrap:wrap;gap:9px;}
.pwh-sw{width:30px;height:30px;border-radius:50%;border:1px solid var(--line);cursor:pointer;padding:0;
  transition:transform .12s ease, box-shadow .12s ease;}
.pwh-sw:hover{transform:scale(1.08);}
.pwh-sw.keine{background:var(--card);border:2px dashed var(--line);}
.pwh-sw.on{box-shadow:0 0 0 3px var(--card), 0 0 0 5px var(--ink);}
.pwh-trash-h{font-size:11.5px;font-weight:800;text-transform:uppercase;letter-spacing:.05em;color:var(--muted);margin:10px 0 4px;}
.pwh-trash-h:first-child{margin-top:2px;}
.pwh-trash-row{display:flex;align-items:center;gap:10px;padding:8px 2px;border-bottom:1px solid var(--line);}
.pwh-trash-row:last-child{border-bottom:0;}
.pwh-trash-ico{display:flex;flex:none;color:var(--muted);}
.pwh-trash-ordner .ic{fill:color-mix(in srgb, var(--fc) 22%, transparent);stroke:var(--fc);}
.pwh-trash-name{flex:1;min-width:0;font-size:13.5px;font-weight:700;color:var(--ink);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.pwh-trash-zahl{color:var(--muted);font-weight:600;}
.pwh-trash-leer{padding:18px 4px;text-align:center;font-size:14px;color:var(--muted);}
.pwh-trash-leer.pwh-fehler{color:var(--bad);}
.pwh-restore{flex:none;border:1.5px solid var(--brand);background:var(--card);color:var(--brand);border-radius:9px;padding:5px 11px;font:inherit;font-size:12px;font-weight:700;cursor:pointer;}
.pwh-restore:hover{background:var(--brand-soft);}
.pwh-purge{flex:none;display:inline-flex;align-items:center;border:1.5px solid transparent;background:var(--bad-soft);color:var(--bad-ink);border-radius:9px;padding:5px 7px;cursor:pointer;}
.pwh-purge:hover{background:var(--bad);color:var(--on-brand);}
/* Das Menue „⋮" an einer Kachel - dieselbe Form wie die Menues der Zentrale. */
.pwh-pop{position:absolute;background:var(--card);border:1px solid var(--line);border-radius:var(--r-card);box-shadow:var(--e-2);padding:5px;min-width:200px;z-index:80;}
.pwh-pop button{display:flex;align-items:center;gap:10px;width:100%;border:none;background:transparent;font:inherit;font-size:13.5px;font-weight:600;color:var(--ink);padding:9px 10px;border-radius:10px;cursor:pointer;text-align:left;}
.pwh-pop button span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.pwh-pop button .ic{color:var(--muted);}
.pwh-pop button:hover{background:var(--paper);}
.pwh-pop button.danger,.pwh-pop button.danger .ic{color:var(--bad-ink);}
.pwh-pop button.danger:hover{background:var(--bad-soft);}
.pwh-pop-lbl{font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:var(--muted);padding:6px 10px 3px;}
.pwh-pop-div{height:1px;background:var(--line);margin:5px 0;}

/* =====================================================================
   SCHULSEITE (#screen-schule) – Umbau 2026-07
   WIE: Alle Blöcke der Schulseite haben jetzt echte Klassen statt
   Inline-Styles. Grund: die Inline-Grids (`ss-head-grid`, das alte
   Bewertungs-Panel) hatten KEINE Media Query – unter 400px blieben sie
   zweispaltig und die Kennzahlen-Kacheln rutschten aus dem Bild
   ("mobilde kutucuklar kaymış", Murat 2026-07). Regel für diese Datei:
   jedes mehrspaltige Grid der Schulseite bricht unter 760px auf eine
   Spalte, jeder Text darf umbrechen (overflow-wrap), nichts wird
   abgeschnitten.
   MIT WEM: schulseiteHtml() / ssFunktionenHtml() / ssBewertungHtml() /
   svRender() / svTabelleRender() in static/js/index-app.js.
   Breite: in der App-Shell KEINE eigene Kappe – die Seite füllt das
   Inhaltspanel wie Cockpit/Klassenbuch auch (body.has-sidebar .wrap
   ist max-width:none). Nur der Vollbild-Fallback kappt bei 1240px.
   ===================================================================== */
/* ⛔ DIE SEITENRAENDER GEHOEREN DER TABELLE (Ansage Murat 06.09.2026:
   „su tablolari … hepsini genisletmeni istiyorum. yani beyaz sayfa blogunun
   saginda solunca bi yürü yer var"). Die Verwaltungslisten sind breiter als
   der Bildschirm und scrollen quer - jeder Pixel Polsterung ist eine Spalte
   weniger, die man sieht. Die Karte selbst bleibt, nur ihr Innenabstand
   schrumpft; der Vollbild-Rueckfall (.ss-solo) behaelt seinen. */
.ss-wrap{margin:0 auto;padding:6px 8px 48px;}
.ss-wrap.ss-solo{max-width:1240px;padding:34px 22px 90px;}

/* ---- Reiterleiste: mittig, waagerecht scrollbar statt gequetscht ---- */
.ss-tabs{max-width:820px;margin-left:auto;margin-right:auto;overflow-x:auto;
  scrollbar-width:none;-webkit-overflow-scrolling:touch;}
.ss-tabs::-webkit-scrollbar{display:none;}
.ss-tabs .adm-tab{flex:1 1 auto;min-width:max-content;padding-left:12px;padding-right:12px;font-size:12.5px;}
.ss-tabs .adm-tab span{white-space:nowrap;}

/* ---- DIE SAMMLUNG: sechs Listen, EINE Reiterzeile -----------------------
   Inhaltstypen stehen links in ihrer natuerlichen Breite. Ein Themenstrich
   markiert die Auswahl, die darunterliegenden Leisten filtern deren Inhalt.
   Telefon/Tablet: eine waagerecht rollende Zeile, aktive Wahl im Bild.
   Derselbe Zeichner und dieselben Rechte fuer alle sechs Bildschirme. */
.sam-reiter{ --sam-akzent:var(--flaeche-akzent,var(--brand)); display:flex; flex-wrap:nowrap; justify-content:flex-start; gap:24px;
  padding:0; margin:0 0 14px; width:100%; max-width:100%; min-width:0;
  background:transparent; border:0; border-bottom:1px solid var(--line); border-radius:0;
  overflow-x:auto; scrollbar-width:none;
  -webkit-overflow-scrolling:touch; scroll-snap-type:x proximity; flex:none;
  position:relative; }
.sam-reiter::-webkit-scrollbar{ display:none; }
.sam-reiter .adm-tab{ flex:1 0 0; min-width:max-content; flex-direction:row; gap:7px;
  min-height:44px; padding:10px 0 12px; border-radius:0; font-weight:600;
  font-size:var(--fs-sm); scroll-snap-align:center;
  position:relative; z-index:1; }
.sam-reiter .adm-tab span{ overflow:visible; white-space:nowrap; }
.sam-reiter .adm-tab svg{ width:17px; height:17px; }
@media (max-width:640px){
  .sam-reiter{ margin-bottom:10px; gap:20px; }
  .sam-reiter .adm-tab{ flex:0 0 auto; padding:10px 12px 12px; gap:6px; }
}
/* Die vorhandene Linse ist jetzt ein schmaler Themenstrich. Ihre Messung
   und weiche Bewegung bleiben; keine zweite Auswahlflaeche dahinter. */
html .sam-reiter .adm-tab.active{ background:transparent; box-shadow:none; }
html .sam-reiter .adm-tab.active{ color:var(--sam-akzent,var(--flaeche-akzent,var(--brand))); }
.sam-reiter .adm-tab:hover{ background:transparent; color:var(--ink); }
.sam-reiter .adm-tab:focus-visible{ outline:2px solid var(--sam-akzent,var(--flaeche-akzent,var(--brand))); outline-offset:-3px; }
.sam-reiter .sam-linse{
  position:absolute; left:0; top:auto; bottom:0; height:2px; z-index:0;
  width:var(--sam-w, 0px); transform:translateX(var(--sam-x, 0px));
  border-radius:2px; background:var(--sam-akzent,var(--flaeche-akzent,var(--brand))); box-shadow:none;
  pointer-events:none; opacity:0;
  transition:transform .44s cubic-bezier(.34,1.2,.44,1),
             width .44s cubic-bezier(.34,1.2,.44,1), opacity .18s ease;
}
.sam-reiter .sam-linse.da{ opacity:1; }
.sam-reiter .sam-linse.stumm{ transition:none; }
/* Die Liste darunter blendet beim Reiterwechsel ein, statt hart zu
   erscheinen. NUR Deckkraft - ein transform machte die Section zum
   Bezugsrahmen jedes position:fixed darin (Fenster, Menues). */
.sam-ein > :not(.sam-reiter){ animation:samEin .34s ease both; }
@keyframes samEin{ from{ opacity:0; } to{ opacity:1; } }
@media (prefers-reduced-motion: reduce){
  .sam-reiter .sam-linse{ transition:opacity .18s ease; }
  .sam-ein > :not(.sam-reiter){ animation:none; }
}
/* Status ist eine untergeordnete Auswahl, keine zweite Hauptnavigation. */
section:has(> .sam-reiter) .dtb-seg{ padding:2px; border:0; background:transparent; }
section:has(> .sam-reiter) .dtb-seg button{ height:30px; padding:0 10px; font-size:12px; }
section:has(> .sam-reiter) .dtb-seg button.an{
  background:var(--flaeche-akzent-soft,var(--brand-soft));
  color:var(--flaeche-akzent-ink,var(--brand)); border:0; box-shadow:none;
}
section:has(> .sam-reiter) .dtb-seg button.an .seg-n{ color:inherit; opacity:.75; }
/* Im Dunkelmodus ist die Fuellfarbe fuer Text zu dunkel. Derselbe helle
   Auswahlton gilt fuer ausdruecklich und automatisch dunkle Ansichten. */
html[data-theme="dark"] .sam-reiter{ --sam-akzent:#A7B6FF; }
html[data-theme="dark"] section:has(> .sam-reiter) .dtb-seg button.an{ color:#A7B6FF; }
@media (prefers-color-scheme:dark){
  html:not([data-theme="light"]) .sam-reiter{ --sam-akzent:#A7B6FF; }
  html:not([data-theme="light"]) section:has(> .sam-reiter) .dtb-seg button.an{ color:#A7B6FF; }
}
/* DASSELBE MASS WIE DIE ANDEREN FUENF REITER. Das Blatt-Studio hat einen
   eigenen, schmaleren Rand (--bl-pad, die Werkzeugspalten des offenen
   Blatts gehen bis an die Kante). Im Regal stand die Reiterzeile dadurch
   4 px weiter links und 8 px breiter als auf den anderen Reitern - bei
   jedem Wechsel ein kleiner Sprung der ganzen Zeile. Im Regal holt die
   Section die Differenz zurueck; im offenen Blatt (.bl-offen, gesetzt von
   blSammlungZeile) bleibt es beim schmalen Rand. Unter 900 px sind beide
   Masse 12 px (--pl-seite ist dort nicht gesetzt). */
body[data-screen="blaetter"] #screen-blaetter:not(.bl-offen){
  padding-left:calc(var(--pl-seite, 12px) - var(--bl-pad, 12px));
  padding-right:calc(var(--pl-seite, 12px) - var(--bl-pad, 12px));
}
/* Hier stand `#bl-zeile-akt{ margin-left:auto; }` (v2.900.0) - die Knoepfe
   des Regals rechts. Seit v2.906.0 stehen sie als Pille unter ihrem Reiter
   (Abschnitt REGAL weiter unten, blUnterEinpassen in blatt-studio.js). */
/* Die Werkzeugseite hat keinen Leisteneintrag mehr (v2.901.0) - ihr
   Rueckweg ins Cockpit steht oben, wie auf den anderen Seiten. */
.wz-zurueck{ margin:0 0 12px; cursor:pointer; }

/* ---- SPIELZEIT (v2.903.0, PLAN_WERKZEUGE_VERTEILEN N5) --------------------
   Zwei Seiten derselben Sache: die Zeile in der Belohnungstafel der
   Lehrkraft (.bel-spielzeit, belSpielzeitHtml) und die Spiele im Arbeitsplatz
   der Kinder (.sz-*, static/js/spielzeit.js). Nur Farben aus dem Woerterbuch;
   die Kinderseite hat grosse Flaechen und wenig Text (DESIGN_SYSTEM §2). */
.bel-spielzeit{ display:flex; align-items:center; gap:12px; flex-wrap:wrap;
  margin:0 0 16px; padding:12px 14px; border-radius:var(--r-card);
  background:var(--card); border:1px solid var(--line); }
.bel-spielzeit > svg{ width:20px; height:20px; flex:none; fill:none; stroke:var(--brand);
  stroke-width:2; stroke-linecap:round; stroke-linejoin:round; }
.bel-spielzeit.an{ background:var(--ok-soft); border-color:var(--ok); }
.bel-spielzeit.an > svg{ stroke:var(--ok-ink); }
.bel-sz-text{ flex:1 1 220px; min-width:0; font-size:var(--fs-sm); color:var(--ink); line-height:1.4; }
.bel-sz-text b{ font-variant-numeric:tabular-nums; }
.bel-sz-knoepfe{ display:flex; gap:6px; flex-wrap:wrap; }
.bel-sz-knopf{ appearance:none; font:inherit; font-size:var(--fs-sm); font-weight:750; cursor:pointer;
  padding:7px 12px; border-radius:var(--r-control); border:1px solid var(--line);
  background:var(--paper); color:var(--ink); }
.bel-sz-knopf:hover{ border-color:var(--brand); background:var(--brand-soft); color:var(--brand-dk); }
.bel-spielzeit.an .bel-sz-knopf{ background:var(--card); }

.sz{ display:flex; flex-direction:column; gap:16px; }
.sz-hinweis{ display:flex; align-items:center; gap:12px; padding:14px 16px;
  border-radius:var(--r-card); background:var(--amber-soft); color:var(--ink);
  font-size:var(--fs-md); line-height:1.4; }
.sz-hinweis > svg{ width:24px; height:24px; flex:none; fill:none; stroke:var(--amber-ink);
  stroke-width:2; stroke-linecap:round; stroke-linejoin:round; }
.sz-hinweis.sz-frei{ background:var(--ok-soft); }
.sz-hinweis.sz-frei > svg{ stroke:var(--ok-ink); }
.sz-hinweis.sz-leer{ background:var(--paper); color:var(--muted); }
.sz-hinweis b{ font-variant-numeric:tabular-nums; }
.sz-raster{ display:grid; grid-template-columns:repeat(auto-fill, minmax(150px, 1fr)); gap:12px; }
.sz-spiel{ appearance:none; font:inherit; cursor:pointer; text-align:center;
  display:flex; flex-direction:column; align-items:center; gap:4px; min-height:132px;
  padding:16px 12px; border-radius:var(--r-card); border:1px solid var(--line);
  background:var(--card); color:var(--ink); box-shadow:var(--e-1);
  transition:transform .12s ease, border-color .12s ease; }
.sz-spiel:hover{ border-color:var(--brand); transform:translateY(-2px); }
.sz-spiel:active{ transform:scale(.98); }
.sz-spiel:focus-visible{ outline:2px solid var(--brand); outline-offset:2px; }
.sz-spiel:disabled{ cursor:not-allowed; opacity:.5; transform:none; box-shadow:none; }
.sz-ico{ font-size:40px; line-height:1.1; }
.sz-name{ font-weight:800; font-size:var(--fs-md); }
.sz-desc{ font-size:var(--fs-xs); color:var(--muted); line-height:1.35; }
.sz-spieler{ gap:10px; }
.sz-leiste{ display:flex; align-items:center; gap:10px; flex:none; }
.sz-chip svg{ width:18px; height:18px; fill:none; stroke:currentColor;
  stroke-width:2; stroke-linecap:round; stroke-linejoin:round; flex:none; }
.sz-titel{ flex:1; min-width:0; font-size:var(--fs-lg); white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.sz-chip{ display:inline-flex; align-items:center; gap:5px; padding:6px 12px; border-radius:var(--r-pill);
  font-weight:800; font-size:var(--fs-sm); font-variant-numeric:tabular-nums;
  background:var(--amber-soft); color:var(--amber-ink); }
.sz-chip.sz-chip-frei{ background:var(--ok-soft); color:var(--ok-ink); }
.sz-buehne{ position:relative; flex:1 1 auto; min-height:0; display:flex; flex-direction:column; }
/* Der Rahmen selbst braucht keine eigene Regel: `.sl-detail-frame
   .sl-task-frame` (Aufgaben im Rahmen) laesst ihn schon die Buehne fuellen. */
/* Die Rundenkarte legt sich UEBER den Rahmen - dessen eigenes „Nochmal"
   ist darunter nicht mehr erreichbar (dieselbe Regel wie belohnung.html). */
.sz-runde{ position:absolute; inset:0; display:flex; align-items:center; justify-content:center;
  background:color-mix(in srgb, var(--ink) 55%, transparent); border-radius:var(--r-card); padding:16px; }
.sz-runde[hidden]{ display:none; }
.sz-runde-karte{ display:flex; flex-direction:column; align-items:center; gap:8px; text-align:center;
  background:var(--card); color:var(--ink); border-radius:var(--r-panel); padding:22px 24px;
  box-shadow:var(--e-3); min-width:min(320px, 100%); }
.sz-runde-karte b{ font-size:var(--fs-xl); }
.sz-runde-karte span{ color:var(--muted); font-size:var(--fs-md); }
.sz-runde-knoepfe{ display:flex; gap:10px; flex-wrap:wrap; justify-content:center; margin-top:6px; }
.sz-runde-knoepfe .btn{ width:auto; margin:0; min-height:48px; padding-left:22px; padding-right:22px; }
@media (max-width:640px){
  .sz-raster{ grid-template-columns:repeat(2, minmax(0, 1fr)); }
  .sz-spiel{ min-height:118px; }
}

/* ---- Kopfkarte: Identität links, Kennzahlen rechts ---- */
.ss-head{background:var(--card);border:1px solid var(--line);border-radius:22px;
  box-shadow:var(--shadow);padding:22px 24px;margin-bottom:6px;
  display:grid;grid-template-columns:minmax(220px,.85fr) minmax(320px,2fr);gap:22px;align-items:center;}
.ss-ident{display:flex;align-items:center;gap:16px;min-width:0;}
.ss-logo{width:84px;height:84px;flex:none;border-radius:22px;border:1px solid var(--line);
  box-shadow:var(--shadow);display:flex;align-items:center;justify-content:center;
  background:var(--brand) center/contain no-repeat content-box;cursor:pointer;}
.ss-chips{display:flex;align-items:center;gap:8px;flex-wrap:wrap;min-width:0;}
.ss-chip{display:inline-flex;align-items:center;gap:6px;font-size:12.5px;font-weight:700;
  padding:5px 12px;border-radius:20px;overflow-wrap:anywhere;}
.ss-chip.ok{background:var(--ok-soft);color:#0F7A43;}
.ss-chip.warn{background:var(--amber-soft);color:#B4690E;}
.ss-chip.star{background:#FFF7E3;color:#8A6100;}
.ss-chip.plain{background:transparent;color:var(--muted);font-weight:600;padding-left:0;}
.ss-stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(118px,1fr));gap:10px;min-width:0;}
.ss-stat{border:1px solid var(--line);border-radius:16px;padding:13px 10px;text-align:center;min-width:0;}
.ss-stat b{display:block;font-size:22px;font-weight:800;letter-spacing:-.02em;line-height:1.15;}
.ss-stat span{display:block;font-size:11.5px;color:var(--muted);margin-top:3px;line-height:1.35;overflow-wrap:anywhere;}
.ss-stat i{display:inline-flex;width:32px;height:32px;border-radius:11px;align-items:center;justify-content:center;margin-bottom:7px;}

/* ---- Abschnittsüberschrift mit optionalem Textknopf rechts ---- */
.ss-sec{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap;margin:26px 2px 12px;}
.ss-sec b{font-size:17px;letter-spacing:-.01em;}
.ss-sec .ss-sub{font-size:13px;color:var(--muted);}
.ss-sec .ss-lnk{margin-left:auto;background:none;border:0;padding:0;font:inherit;font-size:13px;
  font-weight:700;color:var(--brand);cursor:pointer;}
.ss-sec .ss-lnk:hover{text-decoration:underline;}

/* ---- Funktionen ---- */
.ss-fgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(230px,1fr));gap:12px;}

/* ---- Kollegium: kompakte Karte statt Farbpanel ---- */
.ss-kol{background:var(--card);border:1px solid var(--line);border-radius:20px;box-shadow:var(--shadow);
  padding:16px 20px;display:flex;align-items:center;gap:18px;flex-wrap:wrap;}
.ss-kol-num{font-size:34px;font-weight:800;letter-spacing:-.03em;line-height:1;}
.ss-kol-meta{min-width:0;}
.ss-kol-meta .s{font-size:12.5px;color:var(--muted);margin-top:4px;overflow-wrap:anywhere;}
.ss-kol-sp{flex:1 1 0;min-width:0;}
.ss-btn{border:1px solid var(--line);background:var(--card);color:var(--ink);border-radius:12px;
  padding:9px 16px;font:inherit;font-size:13.5px;font-weight:650;cursor:pointer;white-space:nowrap;}
.ss-btn:hover{border-color:var(--brand);color:var(--brand);}
.ss-btn.pri{background:var(--brand);border-color:var(--brand);color:#fff;}
.ss-btn.pri:hover{background:var(--brand-dk);color:#fff;}
.ss-bewgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:12px;margin-top:12px;}

/* =====================================================================
   SCHÜLERVERZEICHNIS – EINE Werkzeugleiste (2026-07)
   Vorher standen drei dauerhaft aufgeklappte Blöcke über der Tabelle
   (Klasse anlegen · Filter · Aktionen) – zusammen fast ein halber
   Bildschirm, bevor man das erste Kind sah. Jetzt: Suche links, aktive
   Filter als Chips, rechts zwei Aufklapp-Menüs. Zustand liegt in
   SV_MENU (index-app.js), damit ein Neuzeichnen das Menü nicht schließt.
   ===================================================================== */
/* AUCH DIE LEISTE IST KEIN KASTEN MEHR (v2.374.0, dieselbe Ansage wie bei der
   Tabelle: „icerigi kutudan kurtar, arkadaki beyaz alana göm"). Sie stand als
   weisse Karte auf einem weissen Panel - eine Ebene, die nichts trennte, weil
   darunter dieselbe Farbe lag. Die Knoepfe darin tragen ihre Form selbst. */
/* `.sv-tbar` GIBT ES NICHT MEHR (v2.380.0). Sie war die zweite Zeile mit
   Knoepfen ueber der Tabellen-Kopfzeile - zwei Reihen Handgriffe uebereinander,
   in verschiedenen Hoehen. Filter und Hinzufuegen stehen jetzt IN der
   Kopfzeile (`opt.aktion`), bei der Liste, auf die sie wirken.
   Die Filter-CHIPS bleiben darueber: sie sind keine Handgriffe, sondern die
   Antwort auf „warum ist die Liste so kurz", und sie duerfen umbrechen. */
.sv-chipzeile{display:flex;align-items:center;gap:9px;flex-wrap:wrap;padding:0 0 10px;}
/* DIE LUPE IST WEG (v2.374.0). Die Kinderliste ist jetzt dieselbe Tabelle wie
   bei den Lehrkraeften, und die bringt ihr Suchfeld ueber den Spalten mit.
   Zwei Suchfelder auf einem Bildschirm, die verschieden filtern, waeren
   schlimmer als keines - deshalb sind `.sv-lupe`, `.sv-search` und
   `.such-offen` hier ersatzlos raus statt nur versteckt. */
.sv-btx{white-space:nowrap;}
.sv-tbar-sp{flex:1 1 0;min-width:0;}
.sv-fchips{display:flex;gap:7px;flex-wrap:wrap;align-items:center;min-width:0;}
.sv-fchip{display:inline-flex;align-items:center;gap:7px;background:var(--brand-soft);color:var(--brand-dk);
  border-radius:20px;padding:5px 8px 5px 12px;font-size:12.5px;font-weight:650;max-width:100%;}
.sv-fchip span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.sv-fchip button{flex:none;border:0;background:rgba(46,91,255,.16);color:var(--brand-dk);
  width:18px;height:18px;border-radius:50%;font:inherit;font-size:11px;line-height:1;cursor:pointer;}
.sv-menuwrap{position:relative;}
.sv-menu{position:absolute;right:0;top:calc(100% + 7px);z-index:60;width:270px;max-width:min(300px,88vw);
  background:var(--card);border:1px solid var(--line);border-radius:16px;
  box-shadow:0 14px 38px rgba(27,34,48,.18);padding:8px;}
.sv-menu h4{margin:9px 10px 5px;font-size:11px;font-weight:750;color:var(--muted);
  text-transform:uppercase;letter-spacing:.06em;}
.sv-menu button, .sv-menu a{display:flex;width:100%;align-items:center;gap:10px;background:none;border:0;
  border-radius:10px;padding:9px 10px;font:inherit;font-size:13.5px;font-weight:600;color:var(--ink);
  text-align:left;text-decoration:none;cursor:pointer;}
.sv-menu button:hover, .sv-menu a:hover{background:var(--brand-soft);color:var(--brand-dk);}
.sv-menu button svg, .sv-menu a svg{flex:none;opacity:.7;}
.sv-menu hr{border:0;border-top:1px solid var(--line);margin:7px 4px;}
.sv-menu label{display:block;margin:9px 10px 4px;font-size:11.5px;font-weight:700;color:var(--muted);}
.sv-menu select{display:block;width:calc(100% - 20px);margin:0 10px 8px;padding:8px 10px;
  border:1px solid var(--line);border-radius:10px;font:inherit;font-size:13px;
  background:var(--card);color:var(--ink);}
.sv-badge{display:inline-flex;align-items:center;justify-content:center;min-width:18px;height:18px;
  padding:0 5px;border-radius:9px;background:var(--brand);color:#fff;font-size:11px;font-weight:800;}

/* ---- Fußzeile der Liste (v2.354.0) ----------------------------------------
   Die Zahlen standen bis dahin ÜBER der Tabelle, zusammen mit einem Titel,
   der schon im Reiter darüber stand. Jetzt unten - Vorbild ANTON: oben, was
   man TUN will, unten, was man WISSEN will. Die drei Auffälligkeiten sind
   Knöpfe und setzen den passenden Filter. */
/* Der leere Zustand: kein Kasten mit eigenem Rand - der Bereich ist schon
   ein Panel, und ein Rahmen darin waere die zweite Ebene, die wir gerade
   ueberall abgeschafft haben. */
.sv-leer{padding:var(--s-6) var(--s-4);text-align:center;color:var(--muted);line-height:1.6;}
.sv-fuss{display:flex;align-items:center;gap:8px;flex-wrap:wrap;
  padding:10px 4px 2px;font-size:12.5px;color:var(--muted);}
.sv-fuss-m{border:1px solid var(--line);background:var(--card);border-radius:20px;
  padding:3px 11px;font:inherit;font-size:12px;font-weight:700;color:var(--muted);cursor:pointer;}
.sv-fuss-m:hover{border-color:var(--brand);color:var(--brand);}
.sv-fuss-m.rot{background:var(--bad-soft);border-color:var(--bad-soft);color:var(--bad-ink);}
.sv-fuss-m.gelb{background:var(--amber-soft);border-color:var(--amber-line);color:var(--amber-ink);}

/* ---- „Aus dem Schulverzeichnis" im Klassenbuch (v2.711.0) -----------------
   Der Reiter zeigt seit v2.711.0 auch die Listen der ECHTEN Klassen, wenn
   die eigene Klasse nicht aus dem Verzeichnis bezogen ist (Untis-Klasse,
   Kurs). Dazu gehoeren eine Suche, eine Zaehlzeile und die Leiste mit den
   uebrigen Klassen. Begruendung: app.py
   /classes/<id>/verzeichnis-nachtragen. */
.stuadd-suche{width:100%;box-sizing:border-box;margin:0 0 8px;padding:8px 10px;
  font:inherit;font-size:13px;border:1px solid var(--line);border-radius:10px;
  background:var(--card);color:var(--ink);}
.stuadd-zahl{font-size:12px;color:var(--muted);margin:6px 2px 0;}
.stuadd-mehr{font-size:12px;color:var(--muted);margin:8px 2px 0;line-height:1.9;}

/* ⛔ DAS FENSTER WIRD BREIT, UND DIE LISTE BEKOMMT SPALTEN (v2.712.0).
   Befund Murat 12.09.2026: „bu popupi genisletelim, sinif listesi gelsin,
   böyle excel tarzi iki sütun olsun … mümkün olsa bir cirpida hepsini bi
   anda gösterebilsek, yani bir sinifi sonra diger sinif gelir altta."
   Berechtigt: 41 Kinder in einer 300 px hohen Spalte sind vierzehn
   Bildschirmhoehen Gescrolle, um zu sehen, WER ueberhaupt zur Wahl steht.
   Jetzt: 52 rem breit, die Kinder einer Klasse als Gitter (zwei bis drei
   Spalten, je nach Platz), die naechste Klasse darunter mit ihrem eigenen
   Kopf. Auf dem Handy bleibt es von selbst eine Spalte - `auto-fill`
   braucht dafuer keine eigene Regel. Nur der Verzeichnis-Reiter wird breit;
   ein Textfeld zum Tippen wird von Breite nicht besser. */
.stuadd-card{max-width:480px;}
.stuadd-card.breit{max-width:56rem;}
.stuadd-liste{max-height:min(58vh,34rem);overflow:auto;
  border:1px solid var(--line);border-radius:10px;padding:0 10px 6px;}
/* Der Klassenkopf bleibt beim Scrollen stehen - sonst weiss man nach zehn
   Zeilen nicht mehr, in wessen Liste man gerade hakt. */
.stuadd-verz-kopf{display:flex;align-items:center;gap:9px;padding:10px 2px 6px;
  position:sticky;top:0;z-index:1;background:var(--card);
  border-bottom:1px solid var(--line);}
.stuadd-verz-kopf b{font-size:13px;}
.stuadd-verz-kopf .stuadd-verz-zahl{font-size:12px;color:var(--muted);font-weight:400;}
.stuadd-verz-kinder{display:grid;
  grid-template-columns:repeat(auto-fill,minmax(15rem,1fr));gap:0 18px;}
.stuadd-verz-zeile{display:flex;align-items:center;gap:9px;min-width:0;
  padding:7px 2px;border-bottom:1px solid var(--line);cursor:pointer;}
.stuadd-verz-zeile span{font-size:14px;min-width:0;overflow:hidden;
  text-overflow:ellipsis;white-space:nowrap;}
.stuadd-verz-leer{padding:14px 2px;color:var(--muted);font-size:13px;line-height:1.5;}

/* ---- Hinzufügen-Fenster (v2.354.0, svAddOeffnen) --------------------------
   EIN Fenster für alles, was Kinder ins Verzeichnis bringt. Der Aufbau ist
   bewusst derselbe wie im Klassenbuch (#stuadd-modal): oben die Herkunft als
   Reiter, darunter die Quellen-Knöpfe, unten das prüfbare Textfeld. Wer eins
   von beiden kennt, kennt beide. */
.svadd-reiter{display:flex;gap:6px;padding:12px 18px 0;flex:none;}
/* Der Reiter-Inhalt scrollt, nicht das Fenster: `.sv-modal` ist eine
   Flex-Spalte mit overflow:hidden – ohne eigenes overflow wüchse der Inhalt
   aus dem Rahmen heraus und die Knopfzeile unten wäre nicht mehr erreichbar. */
#svadd-eins{overflow:auto;min-height:0;}
.svadd-reiter button{flex:1;border:1px solid var(--line);background:var(--card);border-radius:11px;
  padding:9px 10px;font:inherit;font-size:13px;font-weight:700;color:var(--muted);cursor:pointer;}
.svadd-reiter button.an{background:var(--brand);border-color:var(--brand);color:var(--on-brand);}
.svadd-body{padding:14px 18px 6px;overflow:auto;min-height:0;}
.svadd-lbl{display:block;font-size:11.5px;font-weight:750;color:var(--muted);
  text-transform:uppercase;letter-spacing:.05em;margin-bottom:6px;}
.svadd-klasse{display:flex;gap:7px;flex-wrap:wrap;}
.svadd-klasse select,.svadd-klasse input{flex:1 1 200px;min-width:0;padding:9px 11px;
  border:1px solid var(--line);border-radius:10px;font:inherit;font-size:13.5px;
  background:var(--card);color:var(--ink);}
/* K0a: „+ Klasse anlegen" steht neben der Auswahl und waechst nicht mit -
   die Auswahl ist der Normalfall, das Anlegen die Ausnahme. */
.svadd-klneu{flex:0 0 auto;padding:9px 13px;border:1px solid var(--line);
  border-radius:10px;background:var(--paper);color:var(--ink);
  font:inherit;font-size:13px;font-weight:650;cursor:pointer;}
.svadd-klneu:hover{border-color:var(--brand);color:var(--brand);}
.svadd-vorschau{font-size:12.5px;color:var(--muted);margin-top:7px;}
/* K0b: die Fachliste im Verwaltungs-Fenster. Kaesten statt Tabelle - es
   sind zwanzig kurze Woerter, und jedes ist ein Knopf zum Bearbeiten. */
.svuv-faecher{display:flex;gap:7px;flex-wrap:wrap;}
.svuv-fach{border:1px solid var(--line);background:var(--paper);color:var(--ink);
  border-radius:10px;padding:7px 11px;font:inherit;font-size:13px;font-weight:600;
  cursor:pointer;}
.svuv-fach:hover{border-color:var(--brand);color:var(--brand);}
/* K1: der Dublettenbericht im Verwaltungs-Fenster. */
.svuv-dubl{margin-top:12px;}
.svuv-dgrp{border:1px solid var(--line);border-radius:10px;padding:9px 11px;
  margin-bottom:8px;font-size:13px;}
.svuv-dzeile{display:flex;align-items:center;justify-content:space-between;gap:8px;
  flex-wrap:wrap;margin-top:6px;font-size:12.5px;color:var(--muted);}
.svuv-dzeile button{border:1px solid var(--line);background:var(--paper);
  color:var(--ink);border-radius:9px;padding:5px 9px;font:inherit;font-size:12px;
  font-weight:650;cursor:pointer;}
.svuv-dzeile button:hover{border-color:var(--brand);color:var(--brand);}

/* ===== K2d: KURSE & GRUPPEN (PLAN_KLASSEN_KURSE.md §4) ==================
   Das Aufteilungs-Fenster ist bewusst BREIT (bis 1040 px, §4) - eine
   Kinderliste mit einem Auswahlfeld je Zeile ist in einem schmalen Fenster
   eine Zumutung. Auf schmalen Geraeten faellt alles auf volle Breite
   zurueck; die Regel dafuer steht weiter unten im 640er-Block und NICHT
   hier (CLAUDE.md: schmal aendern heisst schmal aendern). */
.svkg-zeile{display:flex;align-items:center;gap:10px;border:1px solid var(--line);
  border-radius:10px;padding:9px 11px;margin-bottom:7px;background:var(--paper);}
.svkg-name{flex:1;min-width:0;font-size:13.5px;}
.svkg-sub{font-size:12px;color:var(--muted);margin-top:2px;}
.svkg-marke{display:inline-block;border:1px solid var(--line);border-radius:6px;
  padding:1px 6px;font-size:11.5px;color:var(--muted);margin-left:4px;}
.svkg-zahl{font-size:12.5px;color:var(--muted);white-space:nowrap;}
.svkg-oeffnen{border:1px solid var(--line);background:var(--paper);color:var(--ink);
  border-radius:8px;padding:4px 10px;font-size:12.5px;cursor:pointer;}
.svkg-oeffnen:hover{border-color:var(--brand);color:var(--brand);}
.svkg-gruppen{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:12px;}
.svkg-karte{flex:1 1 150px;border:1px solid var(--line);border-radius:10px;
  padding:9px 11px;background:var(--paper);font-size:13px;}
.svkg-karte-offen{border-style:dashed;}
.svkg-karte-zahl{font-size:20px;margin-top:4px;}
/* ⛔ EINE SPALTE JE KLASSE (v2.674.0: „solda bir liste sagda diger sinifin
   listesi"). Vorher lief eine einzige Liste ueber beide Klassen, umgebrochen
   nach Platz - man suchte seine 8A zwischen den Kindern der 8B. Die
   Stammklasse ist aber die Ordnung, in der eine Lehrkraft denkt. */
.svkg-spalten{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));
  gap:14px;max-height:52vh;overflow:auto;}
.svkg-spalte{display:grid;gap:0;align-content:start;}
/* ⛔ EINE ZEILE, KEIN KAESTCHEN (v2.674.1: „cocukalr kutu icinde degil excel
   tarzi minimal liste gibi olsunlar"). Vierzig gerahmte Kaesten sind vierzig
   Rahmen, die um Aufmerksamkeit bitten - gemeint ist eine Liste, in der man
   die Namen herunterliest. Deshalb nur eine feine Trennlinie. */
.svkg-zeile{display:flex;align-items:center;gap:8px;padding:4px 2px;
  border-bottom:1px solid var(--line);font-size:13px;min-height:30px;}
.svkg-zeile:last-child{border-bottom:0;}
.svkg-zeile:hover{background:var(--paper);}
.svkg-chips{display:flex;gap:4px;flex:none;}
.svkg-chip{border:1px solid var(--line);background:var(--card);color:var(--muted);
  border-radius:7px;padding:2px 9px;font:inherit;font-size:12px;font-weight:700;
  cursor:pointer;min-width:30px;}
.svkg-chip:hover{border-color:var(--brand);color:var(--brand);}
.svkg-chip.an{background:var(--brand);border-color:var(--brand);color:var(--on-brand);}
.svkg-spalte-k{position:sticky;top:0;background:var(--card);z-index:1;
  padding:4px 2px;font-weight:700;font-size:13px;border-bottom:1px solid var(--line);}
.svkg-spalte-k i{font-style:normal;color:var(--muted);font-weight:600;font-size:12px;}
/* Die leise Rueckmeldung des Selbstsicherns - sie darf nichts verschieben. */
.svkg-gesichert{min-height:16px;margin-top:8px;color:var(--muted);
  font-size:12px;text-align:right;}
.svkg-gesichert.schlecht{color:var(--bad);font-weight:700;}
.svkg-kinder{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));
  gap:6px;max-height:46vh;overflow:auto;}
.svkg-kind{display:flex;align-items:center;gap:8px;border:1px solid var(--line);
  border-radius:9px;padding:6px 9px;background:var(--paper);font-size:13px;}
.svkg-kind-n{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.svkg-kind-n i{font-style:normal;color:var(--muted);font-size:12px;}
.svkg-kind select{max-width:46%;font-size:12.5px;}
.svkg-feld{display:block;margin-bottom:12px;font-size:13px;}
.svkg-feld>span{display:block;color:var(--muted);font-size:12.5px;margin-bottom:4px;}
.svkg-kl{display:flex;gap:7px;flex-wrap:wrap;}
.svkg-klbox{border:1px solid var(--line);border-radius:8px;padding:5px 10px;
  background:var(--paper);font-size:13px;cursor:pointer;}

/* Die schmale Fassung - und NUR sie (CLAUDE.md „schmal aendern heisst
   SCHMAL aendern"). Die Regeln oben bleiben unangetastet: auf Tablet und
   Rechner war die Aufteilung nicht kaputt, und dort arbeitet die Lehrkraft.
   Eigener Block direkt an den Grundregeln, damit beim naechsten Umbau
   sichtbar ist, was zusammengehoert - es gibt in dieser Datei mehrere
   640er-Bloecke, und vom Dateianfang aus findet man den falschen. */
@media (max-width:640px){
  .svu-fwerk{opacity:1;}
  #svkg-modal .sv-modal{max-width:100%;}
  .svkg-gruppen .svkg-karte{flex:1 1 100%;}
  .svkg-kinder{grid-template-columns:1fr;max-height:none;}
  .svkg-spalten{grid-template-columns:1fr;max-height:none;}
  .svkg-kind select{max-width:52%;}
  .svkg-kl{gap:6px;}
  /* DREI KNOEPFE PASSEN AUF 375 px NICHT NEBENEINANDER. Gemessen am
     05.09.2026 im Browser: „Bestätigen" endete 28 px hinter dem Fensterrand
     und war angeschnitten - ausgerechnet der Knopf, um den es geht. Die
     Grundregel (`.sv-modal-f`) steht auf `nowrap` und bleibt so; hier darf
     die Reihe umbrechen, und der Hauptknopf nimmt dann die ganze Zeile. */
  #svkg-modal .sv-modal-f{flex-wrap:wrap;}
  #svkg-modal .sv-modal-f .btn{flex:1 1 auto;}
  #svkg-modal .sv-modal-f .btn:last-child{flex:1 1 100%;}
}
.svadd-quellen{display:flex;gap:7px;flex-wrap:wrap;}
.svadd-quellen button{flex:1 1 150px;display:inline-flex;align-items:center;justify-content:center;gap:8px;
  border:1px solid var(--line);background:var(--paper);border-radius:11px;padding:11px 10px;
  font:inherit;font-size:13px;font-weight:650;color:var(--ink);cursor:pointer;}
.svadd-quellen button:hover{border-color:var(--brand);color:var(--brand);}
.svadd-quellen button svg{flex:none;opacity:.75;}
.svadd-status{margin-top:10px;border-radius:10px;padding:9px 12px;font-size:12.5px;
  background:var(--ok-soft);color:var(--ok-ink);}
.svadd-status.err{background:var(--bad-soft);color:var(--bad-ink);}
.svadd-body textarea{width:100%;box-sizing:border-box;padding:11px 12px;border:1px solid var(--line);
  border-radius:11px;font:inherit;font-size:14px;resize:vertical;background:var(--card);color:var(--ink);}
.svadd-zaehl{font-size:12px;color:var(--muted);margin:4px 2px 0;}
.svadd-fuss{font-size:12px;color:var(--muted);line-height:1.55;margin-top:10px;}
.svadd-fuss a{color:var(--brand);}
.svadd-akt{display:flex;gap:9px;justify-content:flex-end;padding:12px 18px 16px;border-top:1px solid var(--line);flex:none;}

/* ---- Tabelle (Desktop) ---- */
.sv-tab{background:var(--card);border:1px solid var(--line);border-radius:16px;box-shadow:var(--shadow);overflow:hidden;}
.sv-row{display:grid;grid-template-columns:minmax(150px,2.2fr) minmax(74px,.8fr) 96px minmax(96px,1fr);
  gap:10px;padding:11px 16px;align-items:center;border-bottom:1px solid var(--line);font-size:13.5px;}
.sv-row:last-child{border-bottom:0;}
.sv-row.head{background:var(--paper);font-size:11.5px;font-weight:750;color:var(--muted);
  text-transform:uppercase;letter-spacing:.04em;}
.sv-row.klick{cursor:pointer;}
.sv-row.klick:hover{background:var(--brand-soft);}
.sv-row .nm{font-weight:700;min-width:0;overflow-wrap:anywhere;}
.sv-row .sv-zelle{min-width:0;color:var(--muted);font-size:12.5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.sv-row .pin{font-variant-numeric:tabular-nums;letter-spacing:.08em;font-weight:700;}
.sv-mark{border-radius:6px;padding:1px 7px;font-size:10.5px;font-weight:800;white-space:nowrap;}
.sv-mark.dop{background:#F6D7D5;color:#B4322F;}
.sv-mark.abg{background:#FEF3E7;color:#8A5B0E;}
/* Zwei Zustaende, die in den Verwaltungslisten immer wieder vorkommen
   (v2.365.0): etwas ist FERTIG (aktives Konto, verknuepfte Zuordnung) oder es
   WARTET NOCH (offene Einladung, unbestaetigte Zuordnung). Sie stehen hier als
   Klasse und nicht als Hex im JavaScript - sonst waeren es vier feste Farben
   je Liste, und bei der naechsten Liste wieder vier (DESIGN_SYSTEM.md). */
.sv-mark.fertig{background:var(--ok-soft);color:var(--ok-ink);}
.sv-mark.wartet{background:var(--amber-soft);color:var(--amber-ink);}

/* ---- Mobil (<=760px): alles einspaltig, Tabelle wird zur Kartenliste ---- */
@media (max-width:760px){
  .ss-wrap{padding:4px 14px 44px;}
  .ss-head{grid-template-columns:1fr;gap:16px;padding:16px;border-radius:18px;}
  .ss-ident{gap:13px;}
  .ss-logo{width:60px;height:60px;border-radius:17px;}
  .ss-stats{grid-template-columns:repeat(2,minmax(0,1fr));}
  .ss-stat b{font-size:19px;}
  .ss-fgrid{grid-template-columns:1fr;}
  .ss-bewgrid{grid-template-columns:1fr;}
  .ss-kol{padding:15px 16px;gap:14px;}
  .ss-kol-sp{display:none;}
  .ss-kol .ss-btn{flex:1 1 100%;}
  .ss-sec{margin-top:22px;}
  .ss-tabs{margin-left:0;margin-right:0;}

  /* EINE Zeile am Telefon: Lupe · Filter · Ausgeben · Hinzufügen. Die drei
     Knöpfe zeigen dort nur ihr Zeichen - vier Wörter nebeneinander passen auf
     360px nicht, und die Leiste würde waagerecht schiebbar (dieselbe Rechnung
     wie in der Aufgaben-Werkzeugleiste, §4c 2.99.7). Sobald die Suche offen
     ist, nimmt sie die ganze Zeile und die Knöpfe rutschen darunter. */
  .sv-btx{display:none;}
  .sv-tbar-sp{display:none;}
  .sv-tbar.such-offen .sv-search{flex:1 1 100%;}
  .sv-menuwrap{position:static;}
  .sv-menu{left:12px;right:12px;width:auto;max-width:none;}
  /* Tabelle -> Karten: vier Spalten passen auf 360px nicht ohne Abschneiden. */
  .sv-tab{background:transparent;border:0;box-shadow:none;overflow:visible;}
  .sv-row.head{display:none;}
  .sv-row{display:block;background:var(--card);border:1px solid var(--line);border-radius:14px;
    box-shadow:var(--shadow);padding:13px 15px;margin-bottom:9px;}
  /* display:block ist PFLICHT: `.sv-row` wird hier zum Block, `.nm` blieb aber
     ein Inline-Element – dadurch klebte das erste Feld direkt am Namen
     ("Elif ÖztürkKlasse: 5a"). Befund Murat 02.08.2026. */
  .sv-row .nm{display:block;font-size:15px;white-space:normal;}
  .sv-row .sv-zelle{display:inline-flex;align-items:center;gap:6px;margin:8px 10px 0 0;
    font-size:12.5px;color:var(--muted);}
  .sv-row .sv-zelle::before{content:attr(data-lbl);font-weight:700;color:var(--muted);opacity:.75;}
}

/* ---- Fenster der Schulverwaltung (Lehrkraft-Konto, Einsammeln) -----------
   EIN Rahmen fuer alle Popups dieses Bereichs, damit sie sich gleich anfuehlen
   und mobil gleich brechen. Hoehe folgt dem sichtbaren Bereich (--vh100, siehe
   ARCHITEKTUR §4b: NIE 100vh hart setzen). */
.sv-modal-bg{position:fixed;inset:0;z-index:1300;background:rgba(15,20,35,.45);
  display:flex;align-items:center;justify-content:center;padding:16px;}
.sv-modal{background:var(--card);border-radius:20px;box-shadow:0 20px 60px rgba(0,0,0,.3);
  width:100%;max-width:520px;max-height:calc(var(--vh100) - 60px);
  display:flex;flex-direction:column;overflow:hidden;}
.sv-modal-breit{max-width:760px;}
.sv-modal-h{display:flex;align-items:flex-start;gap:12px;padding:16px 18px 13px;
  border-bottom:1px solid var(--line);flex:none;}
.sv-modal-h b{font-size:var(--fs-base);letter-spacing:-.01em;overflow-wrap:anywhere;}
/* ⛔ EIN KNOPF IN DER KOPFZEILE IST KLEIN (v2.674.1). Als `.btn` nahm
   „Bestätigen" die ganze Breite und drückte den Titel in eine
   Buchstabensäule - `.btn` ist für Fußzeilen gebaut, wo Breite erwünscht
   ist. Hier gilt dasselbe Maß wie für das X daneben. */
.sv-modal-ok{flex:none;border:1px solid var(--brand);background:var(--brand);
  border-radius:10px;padding:6px 12px;font:inherit;font-size:13px;font-weight:700;
  color:var(--on-brand);cursor:pointer;white-space:nowrap;}
.sv-modal-ok:hover{background:var(--brand-dk);border-color:var(--brand-dk);}
.sv-modal-x{flex:none;border:1px solid var(--line);background:var(--card);border-radius:10px;
  padding:6px 11px;font:inherit;font-size:13px;color:var(--muted);cursor:pointer;}
.sv-modal-x:hover{border-color:var(--brand);color:var(--brand);}
.sv-modal > div:not(.sv-modal-h){min-height:0;}
.sv-modal > div[style*="overflow:auto"]{flex:1;}
/* KOERPER UND FUSS (v2.373.0). Vorher hatte `.sv-modal` weder Innenabstand
   noch eine scrollbare Zone - wer Inhalt direkt hineinschrieb, bekam Text,
   der am Rand klebte und unten abgeschnitten war (Befund Murat 22.08.2026:
   „pop-up cok kötü gözüküyor, sanki büyütülmüs, o pop-up'a sigmamis").
   Jetzt: Kopf fest, Koerper scrollt, Fuss fest unten - dieselbe Bauform wie
   in jedem anderen Fenster des Projekts. */
.sv-modal-b{flex:1;min-height:0;overflow:auto;padding:16px 18px;}
.sv-modal-f{flex:none;display:flex;gap:10px;padding:13px 18px;border-top:1px solid var(--line);
  background:var(--card);}
.sv-modal-f .btn{margin:0;flex:1;}
.sv-modal-feld{width:100%;box-sizing:border-box;padding:9px 11px;border:1.5px solid var(--line);
  border-radius:10px;font:inherit;font-size:13.5px;background:var(--card);color:var(--text);}
.sv-modal-kasten{background:var(--paper);border-radius:12px;padding:12px;margin-bottom:12px;}
/* Zwei gleich breite Knoepfe nebeneinander im Rumpf eines Fensters. Als
   Klasse und nicht inline: ein Inline-Style schlaegt jedes Stylesheet,
   und genau daran scheiterte schon einmal eine Korrektur fuer schmale
   Schirme (qa/unit/test_landing_mobil.py). */
.sv-modal-reihe{display:flex;gap:8px;flex-wrap:wrap;}
/* Beschriftung links, Auswahlfeld rechts - fuer Formulare, in denen es
   um Zuordnung geht (Spalte X ist Y). Untereinander waere jede Zeile
   doppelt so hoch, und man sucht die Paare. */
.sv-modal-feld-zeile{display:flex;align-items:center;gap:10px;margin-bottom:8px;}
.sv-modal-feld-zeile > label{flex:none;width:78px;font-size:12.5px;font-weight:700;color:var(--muted);}
.sv-modal-feld-zeile > select{flex:1;min-width:0;border:1px solid var(--line);
  border-radius:var(--r-control);background:var(--card);color:var(--ink);
  font:inherit;font-size:13px;padding:7px 9px;}
.sv-modal-reihe > .btn{flex:1;margin:0;min-width:130px;}
.sv-modal-kasten-h{font-size:11px;color:var(--muted);text-transform:uppercase;
  letter-spacing:.06em;margin-bottom:6px;}
/* Schlüssel-Wert-Zeilen im Konto-Fenster */
.sv-kv{display:flex;align-items:baseline;gap:12px;padding:8px 0;border-bottom:1px solid var(--line);
  font-size:13.5px;flex-wrap:wrap;}
.sv-kv span{flex:1;min-width:120px;color:var(--muted);}
.sv-kv b{font-weight:700;text-align:right;overflow-wrap:anywhere;}
.sv-kv-h{font-size:11px;font-weight:750;color:var(--muted);text-transform:uppercase;
  letter-spacing:.06em;margin:16px 0 2px;}
.sv-kv-h:first-child{margin-top:0;}
@media (max-width:760px){
  .sv-modal-bg{padding:10px;align-items:flex-end;}
  .sv-modal{max-height:calc(var(--vh100) - 40px);border-radius:18px;}
  .sv-kv b{text-align:left;}
}

/* ---- „Hab ich gesehen": Knopf an abgeleiteten To-do-Zeilen (v2.42.0) ------
   Cockpit-Karte (.t-row) und Seite "Meine Aufgaben" (.mtl-table). Dezent, bis
   die Zeile berührt wird – der Knopf soll nicht wie die Hauptaktion aussehen,
   die Hauptaktion ist der Deep-Link der Zeile.

   Seit v2.53.0 trägt er im Cockpit das WORT „Gesehen" statt nur einen Haken:
   ein nackter Haken liest sich wie „erledigt", und das ist er nicht – er
   blendet die Zeile bis zur nächsten Änderung aus. Der Knopf bleibt trotzdem
   ruhig (Umriss, kein Farbfeld), damit der Deep-Link die Hauptaktion bleibt.
   MIT WEM: todoAusblenden() in index-app.js, mtHeuteHtml() in index-aufgaben.js. */
.t-row .t-weg, .mtl-table .mtl-weg{
  flex:none;display:inline-flex;align-items:center;justify-content:center;gap:5px;
  min-height:28px;padding:0 10px;border:1px solid var(--line);border-radius:99px;
  background:var(--card);color:var(--muted);cursor:pointer;
  font:650 12px/1 inherit;white-space:nowrap;
  opacity:.55;transition:opacity .14s,border-color .14s,color .14s,background .14s;}
.mtl-table .mtl-weg{width:28px;padding:0;border-radius:9px;}
.t-row .t-weg svg, .mtl-table .mtl-weg svg{width:14px;height:14px;flex:none;fill:none;
  stroke:currentColor;stroke-width:2.6;stroke-linecap:round;stroke-linejoin:round;}
.t-row:hover .t-weg, .mtl-table tr:hover .mtl-weg{opacity:1;}
.t-row .t-weg:hover, .mtl-table .mtl-weg:hover{
  opacity:1;border-color:var(--ok);color:var(--ok);background:var(--ok-soft);}
.t-row .t-weg:focus-visible, .mtl-table .mtl-weg:focus-visible{
  opacity:1;outline:2px solid var(--brand);outline-offset:2px;}
.mtl-table td.mtl-chev{white-space:nowrap;}
.mtl-table td.mtl-chev .mtl-weg{margin-right:8px;vertical-align:middle;}
/* Touch-Geräte kennen kein Hover – dort dauerhaft sichtbar. */
@media (hover:none){
  .t-row .t-weg, .mtl-table .mtl-weg{opacity:1;}
}

/* ---- "Verwalten": Schubfach von rechts (v2.56.0) -------------------------
   Ersetzt das "…"-Menue der Klassen-Kopfzeile. WARUM ein Schubfach und kein
   Menue: ein Menue ist eine Spalte ohne Platz - keine Ueberschriften, kein
   Raum fuer den einen erklaerenden Satz je Eintrag. Das Schubfach laesst die
   Schuelertabelle stehen (ein Aufklapp-Bereich haette sie nach unten
   geschoben) und legt sich nicht auf einen bestehenden Dialog.
   Auf schmalen Geraeten wird daraus ein Blatt von UNTEN - dort ist ein
   seitliches Schubfach entweder zu schmal oder deckt alles zu.
   MIT WEM: kbVerwaltenOeffnen()/kbVerwaltenSchliessen() in index-app.js. */
.kbv-ov{position:fixed;inset:0;z-index:9600;background:rgba(20,24,35,0);
  display:flex;justify-content:flex-end;transition:background .18s ease;}
.kbv-ov.auf{background:rgba(20,24,35,.34);}
.kbv{width:min(420px,92vw);max-height:100%;overflow-y:auto;background:var(--card,#fff);
  border-left:1px solid var(--line);box-shadow:-18px 0 48px rgba(20,30,60,.16);
  transform:translateX(100%);transition:transform .2s cubic-bezier(.22,.61,.36,1);}
.kbv-ov.auf .kbv{transform:translateX(0);}
.kbv-kopf{position:sticky;top:0;z-index:2;display:flex;align-items:flex-start;gap:var(--s-3);
  padding:var(--s-4) var(--s-4) var(--s-3);background:var(--card);border-bottom:1px solid var(--line);}
.kbv-kopf b{display:block;font-size:var(--fs-md);font-weight:800;color:var(--ink);letter-spacing:-.01em;}
.kbv-kopf small{display:block;margin-top:2px;font-size:var(--fs-xs);color:var(--muted);}
.kbv-zu{flex:none;margin-left:auto;width:30px;height:30px;border:1px solid var(--line);
  border-radius:var(--r-control);background:var(--card);color:var(--muted);cursor:pointer;
  display:inline-flex;align-items:center;justify-content:center;}
.kbv-zu:hover{border-color:var(--ink);color:var(--ink);}
.kbv-zu svg{width:15px;height:15px;fill:none;stroke:currentColor;stroke-width:2.2;stroke-linecap:round;}
.kbv-body{padding:var(--s-3) var(--s-3) var(--s-5);}
.kbv-grp + .kbv-grp{margin-top:var(--s-4);padding-top:var(--s-3);border-top:1px solid var(--line);}
.kbv-grp-t{font-size:var(--fs-2xs);font-weight:800;color:var(--muted);text-transform:uppercase;
  letter-spacing:.06em;padding:2px var(--s-1) var(--s-2);}
.kbv-item{display:flex;align-items:flex-start;gap:var(--s-3);width:100%;box-sizing:border-box;
  border:1px solid transparent;border-radius:var(--r-control);background:none;font:inherit;text-align:left;
  padding:var(--s-2) var(--s-3);cursor:pointer;transition:background .12s,border-color .12s;}
.kbv-item:hover{background:var(--paper);border-color:var(--line);}
.kbv-item:focus-visible{outline:2px solid var(--brand);outline-offset:1px;}
.kbv-ico{flex:none;width:30px;height:30px;border-radius:var(--r-control);background:var(--paper);
  color:var(--ink);display:inline-flex;align-items:center;justify-content:center;}
.kbv-ico svg{width:16px;height:16px;fill:none;stroke:currentColor;stroke-width:1.9;
  stroke-linecap:round;stroke-linejoin:round;}
.kbv-tx{flex:1;min-width:0;}
.kbv-tx b{display:block;font-size:var(--fs-sm);font-weight:700;color:var(--ink);}
.kbv-tx small{display:block;margin-top:1px;font-size:var(--fs-2xs);color:var(--muted);line-height:1.45;}
/* Die eine unumkehrbare Aktion sieht auch so aus - aber erst beim Zeigen,
   damit die Liste nicht dauerhaft nach Warnung aussieht. */
.kbv-item.gefahr .kbv-tx b{color:var(--bad);}
.kbv-item.gefahr:hover{background:rgba(224,70,62,.07);border-color:rgba(224,70,62,.35);}
.kbv-item.gefahr .kbv-ico{color:var(--bad);}
/* HERVORGEHOBEN - die zwei Wege, die in einen eigenen Bildschirm fuehren
   (v2.391.0: Aufgabenzentrale, Elternsprechtag planen). Alles andere im
   Schubfach oeffnet ein Fenster und ist nach einem Klick erledigt; diese
   beiden sind der Anfang einer Arbeit, die eine Weile dauert. Gleich
   aussehende Zeilen behaupten gleiches Gewicht - deshalb tragen nur sie eine
   Flaeche und ein GEFUELLTES Zeichen. Anders, nicht lauter: rot bleibt dem
   Unumkehrbaren vorbehalten (.gefahr darueber).

   SEIT v2.419.0 IST ES DIE VOLLE FLAECHENFARBE, NICHT MEHR IHR HAUCH
   (Anweisung Murat 24.08.2026: „arkaplanini tema rengi degil kendini belirgin
   tema rengi yap ... ama her zaman okunur olmali. gri secen birinde sicar bu
   kisim"). Er hat den wunden Punkt getroffen, und es ist ein RECHENFEHLER,
   kein Geschmack:
     - Der Hauch trug farbige Schrift (`-ink` auf `-soft`). Diese Paarung ist
       auf 4.5:1 GERECHNET, aber nur knapp - dieselbe Rechnung, die schon den
       aktiven Eintrag der Seitenleiste in v2.283.0 von Hauch auf Fuellung
       gebracht hat (Rueckfall dort: 4.47:1, knapp UNTER der Schwelle).
     - Bei einem fast grauen Wunschton (Stein, oder eine selbst gewaehlte
       Farbe knapp ueber der Saettigungsgrenze von ssAkzentSetzen) wird aus
       „hervorgehoben" ein blassgrauer Kasten mit blassgrauer Schrift: der
       auffaelligste Eintrag der Liste ist dann der unauffaelligste.
   DIE FUELLUNG HAT DIESES PROBLEM NICHT: `--flaeche-akzent` wird von
   `ssDunkelnBis()` so lange abgedunkelt, bis 4.5:1 GEGEN WEISS stehen - egal
   welcher Farbton gewaehlt ist. Weisse Schrift darauf ist damit nicht
   „wahrscheinlich lesbar", sondern nachgerechnet (Test: qa/unit/
   test_flaeche_akzent.py, „weisse Schrift auf jedem Akzent").
   Deshalb traegt auch die UNTERZEILE volles Weiss und kein abgesenktes:
   jede Deckkraft unter 100 % rechnet genau diese Zusage wieder herunter
   (0.88 Weiss auf dem Grenzton ergibt ~4.3:1). Unterschieden werden die
   beiden Zeilen ueber Groesse und Fettung, nicht ueber Blaesse.
   Das Zeichen dreht sich mit um: weisse Scheibe, Glyph in der Flaechenfarbe.
   HIER STEHT NUR DIE GRUNDFASSUNG IN DER MARKENFARBE. Die Wunschfarbe der
   Lehrkraft zieht sie im Abschnitt „Akzent aus der Flaechenfarbe" am
   DATEIENDE nach - dort steht die vollstaendige Liste dessen, was die
   Farbwahl faerbt, und qa/unit/test_flaeche_akzent.py haelt sie beisammen.
   MIT WEM: kbVerwaltenGruppen (klasse:"kbv-betont"), kbSchubfach. */
/* KEINE FLAECHE MEHR (v2.491.0, Befund Murat 27.08.2026: „su sagdaki
   vorbereitung kismi bok gibi olmus butonlar girmis birbirine ... arkaplani
   koymak yerine baska cözüm bul").

   Er hat recht, und der Grund liegt eine Regel weiter oben: `.kbv-item` hat
   `border:1px solid transparent` und KEINEN Aussenabstand. Ein einzelner
   gefuellter Eintrag sieht damit gut aus - zwei UNTEREINANDER stossen Kante
   an Kante und lesen sich als EIN Block mit zwei Zeilen. Genau diese zwei
   gibt es hier („Aufgabenzentrale", „Elternsprechtag planen"), und sie sind
   die einzige Stelle der App, an der zwei betonte Zeilen aufeinandertreffen.
   Ein Abstand haette den Blockeindruck geheilt und die Flaeche behalten -
   aber die Ansage war, es OHNE Flaeche zu loesen, und das ist auch das
   robustere Mittel: eine Flaeche kann verschmelzen, ein Randstrich nicht.

   STATTDESSEN: ein Strich an der linken Kante, ein getoentes Zeichen und die
   Ueberschrift in der Akzentfarbe. Der Strich sitzt als `inset`-Schatten und
   nicht als `border-left` - eine echte Kante von 3px wuerde den Text um 2px
   verschieben und die Zeile gegen ihre Nachbarn verrutschen lassen.

   DER KONTRAST BLEIBT NACHGERECHNET, und zwar leichter als vorher:
   `--flaeche-akzent` ist von `ssDunkelnBis()` so weit abgedunkelt, dass
   WEISS darauf 4.5:1 erreicht. Kontrast ist symmetrisch - also erreicht
   dieselbe Farbe ALS SCHRIFT auf der weissen Karte ebenfalls 4.5:1. Die
   Unterzeile bleibt bewusst in `--muted`: sie ist Beiwerk, und zwei
   Akzentzeilen uebereinander waeren wieder ein Block.

   MIT WEM: kbVerwaltenGruppen (klasse:"kbv-betont"), kbSchubfach,
   qa/unit/test_flaeche_akzent.py, qa/unit/test_schubfach_betont.py. */
.kbv-item.kbv-betont{background:none;border-color:transparent;
  box-shadow:inset 3px 0 0 var(--brand);}
.kbv-item.kbv-betont:hover{background:var(--paper);border-color:transparent;
  box-shadow:inset 3px 0 0 var(--brand);}
.kbv-item.kbv-betont .kbv-ico{background:var(--brand-soft);color:var(--brand);}
.kbv-item.kbv-betont .kbv-tx b{color:var(--brand);}
/* "VERWALTEN" TRUG ALS EINZIGER KNOPF DER ZEILE IMMER SEINE BESCHRIFTUNG.
   Weg seit v2.331.0 (Wunsch Murat 18.08.2026: „verwalten yazisini kaldir tek
   ikon kalsin ... o ikonlarin üstüne gelince ismi text olarak geliyo").
   Er hat recht: Die Zeile besteht aus Symbolen, die ihren Namen beim Zeigen
   nennen; ein einziger, der ihn dauerhaft ausschreibt, ist keine Hilfe,
   sondern eine Ausnahme, die die Zeile unruhig macht. Der Name geht nicht
   verloren – er steht im `title` und faehrt beim Zeigen aus, genau wie bei
   Bewerten, Analyse und Gewichtung.
   ABSICHTLICH NICHT GELOESCHT, SONDERN AUSKOMMENTIERT: Wer sie zurueckholen
   will, soll die Regel finden und nicht neu erfinden – und mit ihr die
   Begruendung, warum sie weg ist.
   AM HANDY STAND DAS WORT BIS v2.921.0 NOCH - seit v2.922.0 nirgends mehr
   („verwalten texti gösterme hicbiyerde tek cark olsun"). */
/* .kbx-act.kbx-verw .kbx-actlbl{max-width:110px;opacity:1;margin-left:6px;} */
.kbx-act.kbx-verw .kbx-actlbl{display:none;}
.kbx-act.kbx-verw{border-color:var(--line);color:var(--ink);}
.kbx-act.kbx-verw:hover,.kbx-act.kbx-verw:focus-visible{border-color:var(--ink);
  color:var(--ink);box-shadow:0 0 0 1px var(--ink) inset;}
@media (max-width:640px){
  .kbv-ov{align-items:flex-end;justify-content:center;}
  /* DAS BLATT WAR IN SAFARI NICHT ZU SCHLIESSEN (Befund Murat 05.08.2026:
     „mobilde verwalten acinca o en üst kisim x in oldugu yukari kayiyor
     kapatamiyorum … safariden girince böyle ama pwa da sikinti yok").
     URSACHE - und der PWA-Hinweis ist der Beweis: Hier stand `86vh`. `vh`
     misst in mobilem Safari gegen den GROSSEN Bildschirm, den OHNE die
     eingeblendeten Browserleisten. Die Huelle `.kbv-ov` ist dagegen mit
     `position:fixed; inset:0` am sichtbaren Bereich verankert und damit
     kleiner. Das Blatt haengt unten an (`align-items:flex-end`), also schob
     jedes zu viel gemessene Pixel seinen KOPF nach oben aus der Huelle heraus
     - und mit ihm das X. In der PWA gibt es keine Leisten, dort ist `vh`
     zufaellig richtig; deshalb trat es nur im Browser auf.
     LOESUNG NACH DER HAUSREGEL (ARCHITEKTUR §4b, qa/unit/test_viewport_hoehe):
     bildschirmhohe Flaechen MESSEN nicht, sie sind verankert. 86 % beziehen
     sich auf die Huelle, die bereits an allen vier Seiten haengt - damit gibt
     es gar keine Geraetehoehe mehr, die falsch sein koennte. Kein `vh`, kein
     `dvh`, keine Rechnung. */
  .kbv{width:100%;max-height:86%;border-left:0;
    border-top:1px solid var(--line);
    border-radius:18px 18px 0 0;transform:translateY(100%);}
  .kbv-ov.auf .kbv{transform:translateY(0);}
}

/* ===== SCHUELER-ARBEITSPLATZ (v2.230.0) ================================
   MIGRIERT MIT SCHRITT 8 (v2.280.0) - DER LETZTE SCHRITT VON §10.
   "Gleiche Familie, eigene Dichte" (§2): dieselbe Farb-, Icon- und
   Bausteinfamilie wie bei der Lehrkraft, aber groessere Flaechen, weniger
   Text, deutlichere Hierarchie. Nicht die Lehrer-Oberflaeche in klein.

   GEZOGEN: 57 Schriftgroessen, 32 Ecken, 141 Abstaende, 37 feste Farben.

   DIE EIGENTLICHE AUFGABE DIESES SCHRITTS WAR EINE SCHULD AUS SCHRITT 6:
   die fuenf Zustandsstufen (ok gruen · info blau · soon gelb · warn orange ·
   bad rot) standen mit denselben festen Werten HIER und in der
   Aufgabenzentrale (.az-k-*). v2.278.0 hat sie bewusst stehen lassen, weil
   eine halbe Migration die zwei Seiten auseinanderlaufen liesse - bei
   Toenen, deren einziger Zweck es ist, auf beiden Seiten dasselbe zu
   bedeuten. Jetzt sind BEIDE Seiten im selben Commit gezogen.

   SOON UND WARN SIND BEIDE BERNSTEIN und muessen trotzdem unterscheidbar
   bleiben ("morgen faellig" gegen "in wenigen Stunden"). Statt zwei
   erfundener Toene sind es jetzt zwei Saettigungen DERSELBEN Farbe:
   color-mix(--amber 4%) und color-mix(--amber 14%). Aendert sich der
   Bernstein, ziehen beide mit und ihr Abstand bleibt.

   DIE ZWEI PROZENTZAHLEN SIND GEMESSEN, NICHT GESCHAETZT. Der erste Versuch
   stand auf 10% und 22%; nachgerechnet erreichte die Schrift (--amber-ink)
   auf 22% nur 4.30:1 und fiel damit unter WCAG AA (§3.2). Die Messreihe:
       4% -> 4.88   8% -> 4.75   12% -> 4.62   14% -> 4.55   16% -> 4.49
   Ab 16% besteht sie nicht mehr. Gewaehlt sind deshalb 4% und 14% - beide
   ueber der Schwelle, mit dem groesstmoeglichen Abstand dazwischen.
   Dass dieser Abstand klein ist (1.07), ist vertretbar: die fuenf Stufen
   sind ausdruecklich auch OHNE Farbe unterscheidbar - daneben steht
   "morgen" oder "in 3 Stunden".

   EINE TOTE DOPPELDEFINITION ENTFERNT: `.sl-task-deadline.warn` stand
   ZWEIMAL da (erst #FFF5DE/#A45E00, spaeter #FFF0E0/#B4520B). Bei gleicher
   Spezifitaet gewinnt die spaetere - die fruehere hat nie gewirkt, aber
   jeder, der die Farbe nachschlug, las die falsche Zahl ab. Gefunden beim
   Schreiben des Klassenbuch-Tests (v2.279.0).

   WAS STEHENBLEIBT: der Verlauf der Pizza-Anzeige (#FFF6DF -> #FFEFC9 mit
   Rand #F0DCAB). Das ist eine ZEICHNUNG - ein Stueck Pizza, das den
   Fortschritt zeigt -, kein Bauteil des Systems (§9.1).

   EINE ENTSCHEIDUNG ZUR SKALA: das PIN-Feld (.sl-in) stand auf 27px, also
   zwischen --fs-xl (24) und --fs-2xl (32). Gewaehlt ist die GROESSERE Stufe:
   hier tippt ein Kind seine Nummer, und §2 verlangt fuer das Kind-Gesicht
   ausdruecklich groessere Ziele - nicht die bequemere kleine Zahl.
   ======================================================================= */
body.student-workspace #authbar{display:none;}
/* HIER STANDEN BIS 2.243.1 ZWEI REGELN FÜR `.sl-side-head` UND
   `.sl-side-logo` – und sie waren der Grund, warum die Leiste des Kindes
   kaputt aussah (Befund Murat 10.08.2026: „sol üstteki logoya bak bide bu
   sol kisim acilir kapanirdi yani").

   WAS PASSIERT WAR: v2.240.0 hat den Kopf der Kind-Leiste auf dieselbe
   Bauart umgestellt wie den der Lehrkraft – eine Flex-Zeile mit ZWEI Logos
   (volle Wortmarke + kompakte Marke, eine davon versteckt) und dem
   Klappknopf rechts (`.sl-side-head`/`.sl-side-logo`/`.sl-logo-marke`/
   `.sl-side-klapp`, weiter unten in dieser Datei). Diese beiden alten
   Zeilen aus v2.230.0 blieben stehen – und sie GEWINNEN, weil sie
   `#app-sidebar` enthalten (0-1-2-1 gegen 0-0-1-0):
     • `display:block` schlug `.sl-logo-marke{display:none}` → BEIDE Logos
       waren sichtbar, eins über dem anderen gequetscht.
     • `width:174px` schlug `width:auto` → zwei Bilder à 174 px in einer
       268 px breiten Leiste. Der Klappknopf hat `flex:none` und wurde aus
       dem sichtbaren Bereich geschoben. Für das Kind war die Leiste damit
       nicht mehr einklappbar – der Knopf war nicht kaputt, er war weg.

   LEHRE, die schon zweimal in diesem Projekt Geld gekostet hat: wer eine
   Bauart ersetzt, LÖSCHT die alte im selben Commit. Zwei Regelsätze für
   dasselbe Bauteil entscheidet sonst die Spezifität – und die kennt die
   Absicht nicht. Der Trennstrich unter dem Kopf war das einzig Brauchbare
   an den beiden Zeilen; er steht jetzt unten bei `.sl-side-head`. */
body.student-workspace #app-sidebar .sl-side-name{font-size:var(--fs-lg);font-weight:800;color:var(--ink);}
body.student-workspace #app-sidebar .sl-side-class{font-size:var(--fs-sm);color:var(--muted);margin-top:3px;}
body.student-workspace #app-sidebar .sl-side-nav{display:flex;flex-direction:column;gap:var(--s-1);padding:var(--s-4) 0;}
body.student-workspace #app-sidebar .sl-side-btn{appearance:none;width:100%;border:0;background:transparent;color:var(--muted);font:inherit;font-weight:700;display:flex;align-items:center;gap:var(--s-3);text-align:left;padding:var(--s-3) var(--s-3);border-radius:var(--r-control);cursor:pointer;white-space:nowrap;}
body.student-workspace #app-sidebar .sl-side-btn:hover,body.student-workspace #app-sidebar .sl-side-btn.on{background:var(--brand-soft);color:var(--brand);}
body.student-workspace #app-sidebar .sl-side-btn svg{width:21px;height:21px;fill:none;stroke:currentColor;stroke-width:1.9;stroke-linecap:round;stroke-linejoin:round;}
body.student-workspace #app-sidebar .sl-side-count{margin-left:auto;min-width:22px;height:22px;border-radius:var(--r-pill);background:var(--brand);color:var(--card);font-size:var(--fs-2xs);display:flex;align-items:center;justify-content:center;}
/* ===== DAS PROFIL IN DER LEISTE (v2.281.0) ==============================
   Befund Murat 12.08.2026: "solda kocaman yer var abmelden üstünde ... o sag
   üstteki logo isim ve yildizi daha klas bi sekilde sola alsak daha iyi gibi
   olur hem daha büyük görünür".
   Er hat recht in beide Richtungen: oben rechts war der Block klein und
   gedraengt (Stern, Name, 38px-Bild in einer Zeile), und in der Leiste stand
   ueber "Abmelden" die halbe Hoehe leer.

   `margin-top:auto` schiebt ihn nach UNTEN an die Abmelden-Linie - nicht
   nach oben unter das Menue. Das ist Absicht: die vier Ansichten sind das,
   was ein Kind benutzt; das Profil ist das, was es ANSIEHT. Es soll dort
   stehen, wo der Blick hinfaellt, wenn er nichts sucht.

   DAS BILD ZUERST, dann der Name. Ein Kind erkennt sich an seiner Figur -
   deshalb 72px, etwa doppelt so gross wie vorher oben rechts.            */
/* ZWEI `margin-top:auto` IN EINER SPALTE TEILEN DIE LUECKE, statt einen
   Block nach unten zu schieben - beim Bauen stand das Profil deshalb genau
   in der Mitte zwischen Menue und Abmelden (je 129px Luft). Das `auto`
   gehoert an den OBEREN der beiden; der untere schliesst direkt an. */
.sl-profil{margin-top:auto;display:flex;flex-direction:column;align-items:center;
  gap:var(--s-1);padding:var(--s-4) var(--s-2);text-align:center;}
.sl-profil-bild{appearance:none;border:0;background:none;padding:0;cursor:pointer;
  border-radius:var(--r-pill);line-height:0;transition:transform .16s;}
.sl-profil-bild:hover{transform:scale(1.06);}
.sl-profil-bild:focus-visible{outline:2px solid var(--brand);outline-offset:3px;}
.sl-profil-name{font-size:var(--fs-lg);font-weight:800;color:var(--ink);line-height:1.2;
  margin-top:var(--s-1);max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.sl-profil-klasse{font-size:var(--fs-sm);color:var(--muted);}
/* Die Sternzeile ist ein KNOPF - sie fuehrt zur Belohnungstafel. Damit das
   sichtbar ist, traegt sie eine Flaeche und keine blosse Zahl. */
.sl-profil-sterne{appearance:none;cursor:pointer;margin-top:var(--s-2);
  display:inline-flex;align-items:center;gap:var(--s-1);
  border:1px solid var(--amber-line);border-radius:var(--r-pill);
  padding:var(--s-1) var(--s-3);
  background:color-mix(in srgb, var(--amber) 10%, var(--card));
  color:var(--amber-ink);font:inherit;font-size:var(--fs-sm);font-weight:700;
  transition:background .14s;}
.sl-profil-sterne:hover{background:color-mix(in srgb, var(--amber) 18%, var(--card));}
.sl-profil-sterne svg{width:16px;height:16px;fill:currentColor;flex:none;}
.sl-profil-sterne b{font-size:var(--fs-base);font-weight:800;}
.sl-profil-schatz{font-size:var(--fs-2xs);font-weight:700;color:var(--amber-ink);
  letter-spacing:.03em;text-transform:uppercase;}
/* Wer noch keinen Schatz hat, liest nicht NICHTS, sondern wie weit es ist -
   der Unterschied zwischen "du hast nichts" und "du bist fast da". */
.sl-profil-schatz.offen{color:var(--muted);text-transform:none;letter-spacing:0;
  font-weight:600;}
/* Zugeklappt (70px) bleibt nur das Bild - Name und Zahl haetten dort keinen
   Platz, und ein abgeschnittener Name ist schlimmer als keiner. */
body.sl-leiste-zu .sl-profil-name,
body.sl-leiste-zu .sl-profil-klasse,
body.sl-leiste-zu .sl-profil-schatz{display:none;}
/* Der kleine Fortschritt im Profil (v2.317.0, Faz 5a). Er zeigt den AKTUELLEN
   Abschnitt des Sternenwegs - der ganze Weg steht auf der Belohnungstafel.
   Zugeklappt (70px) faellt er weg wie die Schatzzeile darueber: ein Balken
   ohne Beschriftung waere ein Strich ohne Aussage. */
.sl-profil-weg{width:100%;max-width:170px;margin-top:var(--s-2);}
.sl-profil-weg-bahn{display:block;height:6px;border-radius:var(--r-pill);
  background:var(--line);overflow:hidden;}
.sl-profil-weg-bahn i{display:block;height:100%;border-radius:var(--r-pill);
  /* Beide Enden aus Tokens - der Profil-Test verbietet feste Farben
     hier ausdruecklich, und ein zweiter Goldton waere ohnehin ein
     Ton mehr, als die Marke hat. */
  background:linear-gradient(90deg,var(--amber),var(--ld-4));
  transition:width .8s cubic-bezier(.2,.8,.3,1);}
.sl-profil-weg-txt{display:block;margin-top:var(--s-1);font-size:var(--fs-3xs);
  color:var(--muted);text-align:center;}
.sl-profil-weg-txt.voll{color:var(--amber-ink);font-weight:750;}
body.sl-leiste-zu .sl-profil-weg,
body.sl-leiste-zu .sl-profil-weg-txt{display:none;}
@media (prefers-reduced-motion: reduce){ .sl-profil-weg-bahn i{transition:none;} }
body.sl-leiste-zu .sl-profil-sterne{padding:var(--s-1);}
body.sl-leiste-zu .sl-profil-sterne span{display:none;}
body.sl-leiste-zu .sl-profil{padding:var(--s-3) 0;}
/* DAS BILD MUSS MITSCHRUMPFEN. Nachgemessen: 72px in einer 70px schmalen
   Leiste laufen ueber den Rand hinaus - das faellt nur auf, wenn man
   zuklappt UND hinsieht. Die Groesse steht am <span> als Inline-Mass
   (slAvKreisHtml rechnet sie), deshalb hier mit !important. */
body.sl-leiste-zu .sl-profil-bild .sl-av-kreis{width:44px!important;height:44px!important;}

body.student-workspace #app-sidebar .sl-side-out{margin-top:0;border-top:1px solid var(--line);padding-top:var(--s-3);}
@media(min-width:900px){body.student-workspace #app-sidebar{width:268px!important;min-width:268px;flex-basis:268px;padding:var(--s-4)!important;}}
/* ===== DIE LEISTE DER KINDER PASST WIEDER AUF DEN SCHIRM (v2.907.2) =======
   Befund Murat 30.09.2026: „cocuk menüsünde … ordaki menü tuslarini ya
   kücült metinlerle birlikte yada birini cikar." Mit „Rechner" und „Spiele"
   (v2.903.0/v2.904.0) stehen bis zu zehn Eintraege in der Leiste. Gemessen
   bei 1024 × 690 (iPad quer im Browser): Kopf 43 + Menue 444 + Profil 241 +
   Abmelden 61 = 825 px auf 664 px - Sterne, Schatzweg und „Abmelden" lagen
   unter der Kante, und die Leiste rollte nicht (overflow:hidden).
   Also beides: die Knoepfe werden SAMT SCHRIFT kleiner (48 → 38 px, --fs-md,
   Zeichen 19 px), auf niedrigen Schirmen auch das Profil - und reicht es
   dann noch immer nicht (Telefon quer), ROLLT die Leiste, statt etwas
   abzuschneiden. Kein Eintrag faellt weg. */
body.student-workspace #app-sidebar{ overflow-x:hidden; overflow-y:auto; scrollbar-width:none; }
body.student-workspace #app-sidebar::-webkit-scrollbar{ display:none; }
body.student-workspace #app-sidebar .sl-side-nav{ gap:2px; padding:var(--s-3) 0; }
body.student-workspace #app-sidebar .sl-side-btn{ padding:var(--s-2) var(--s-3); font-size:var(--fs-md); }
body.student-workspace #app-sidebar .sl-side-btn svg{ width:19px; height:19px; }
@media (max-height:860px){
  .sl-profil{ padding:var(--s-2) var(--s-2); gap:2px; }
  body.student-workspace:not(.sl-leiste-zu) .sl-profil-bild .sl-av-kreis{ width:56px!important; height:56px!important;
    font-size:var(--fs-2xl)!important; }
  .sl-profil-name{ font-size:var(--fs-base); margin-top:2px; }
  .sl-profil-sterne{ margin-top:var(--s-1); }
  body.student-workspace #app-sidebar .sl-side-out{ padding-top:var(--s-2); }
}
.sl-work-card{min-height:100%;}
/* Der Begruessungsblock ist leer, seit der Gruss oben in der Kopfzeile steht
   (v2.235.4). Er darf dann auch keinen Platz und keine Linie mehr kosten -
   sonst stehen zwei Trennlinien untereinander. */
#sl-work-head:empty{display:none;}
.sl-welcome{padding:0 2px var(--s-5);border-bottom:1px solid var(--line);margin-bottom:var(--s-5);}.sl-welcome h2{margin:0 0 var(--s-2);font-size:clamp(22px,2.6vw,30px);font-weight:650;letter-spacing:-.025em;}.sl-rainbow{font-weight:850;}.sl-welcome p{margin:0;color:var(--muted);font-size:var(--fs-sm);}.sl-welcome p span::after{content:"";display:inline-block;width:4px;height:4px;margin:0 var(--s-2) 3px;border-radius:50%;background:var(--brand);}
.sl-section-title{font-size:var(--fs-xs);font-weight:800;letter-spacing:.08em;text-transform:uppercase;color:var(--muted);margin:0 0 var(--s-3);}.sl-task-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--s-4);}
.sl-task{appearance:none;width:100%;min-height:230px;border:1px solid var(--line);background:var(--card);border-radius:var(--r-panel);padding:var(--s-4);text-align:left;font:inherit;cursor:pointer;display:flex;flex-direction:column;align-items:stretch;transition:border-color .13s,box-shadow .13s,transform .13s;overflow:hidden;}.sl-task:hover{border-color:var(--brand);box-shadow:0 10px 28px rgba(20,28,50,.09);transform:translateY(-2px);}.sl-task.done{opacity:.7;cursor:default;}
.sl-task-top{display:flex;align-items:center;justify-content:space-between;gap:var(--s-3);margin-bottom:var(--s-4);}.sl-task-subject{display:inline-flex;align-items:center;min-height:25px;padding:var(--s-1) var(--s-3);border-radius:var(--r-pill);background:var(--brand-soft);color:var(--brand);font-size:var(--fs-2xs);font-weight:800;}.sl-task-type{font-size:var(--fs-2xs);color:var(--muted);}.sl-task-title{display:block;font-size:var(--fs-lg);font-weight:830;color:var(--ink);line-height:1.25;margin-bottom:var(--s-2);}.sl-task-copy{display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;overflow:hidden;font-size:var(--fs-sm);line-height:1.45;color:var(--muted);margin-bottom:var(--s-4);}.sl-task-deadline{display:block;margin-top:auto;border-radius:var(--r-card);padding:var(--s-3) var(--s-3);background:var(--paper);}.sl-task-deadline strong,.sl-task-deadline small{display:block;}.sl-task-deadline strong{font-size:var(--fs-base);color:var(--ink);}.sl-task-deadline small{font-size:var(--fs-2xs);color:var(--muted);margin-top:2px;}.sl-task-deadline.bad{background:var(--bad-soft)}.sl-task-deadline.bad strong{color:var(--bad-ink)}.sl-task-deadline.soon{background:color-mix(in srgb, var(--amber) 4%, var(--card))}.sl-task-deadline.soon strong{color:var(--amber-ink)}.sl-task-deadline.ok{background:var(--ok-soft)}.sl-task-deadline.ok strong{color:var(--ok-ink)}
/* Die Stufen des Countdowns, von ruhig nach dringend (slFristInfo):
   ok gruen (3+ Tage) · info blau (2 Tage) · soon gelb (1 Tag / 12+ Std) ·
   warn orange (weniger als 12 Std) · bad rot (vorbei). Sie sind bewusst
   auch OHNE Farbe unterscheidbar - die Zahl daneben wechselt die Einheit. */
.sl-task-deadline.info{background:var(--brand-soft)}.sl-task-deadline.info strong{color:var(--brand-dk)}
.sl-task-deadline.warn{background:color-mix(in srgb, var(--amber) 14%, var(--card))}.sl-task-deadline.warn strong{color:var(--amber-ink)}
.sl-task-deadline.done{background:var(--ok-soft)}.sl-task-deadline.done strong{color:var(--ok-ink)}.sl-task-open{display:flex;align-items:center;gap:var(--s-1);justify-content:flex-end;color:var(--brand);font-size:var(--fs-xs);font-weight:800;margin-top:var(--s-3);}.sl-task-open svg{width:15px;height:15px;fill:none;stroke:currentColor;stroke-width:2.2;}.sl-empty{border:1px dashed var(--line);border-radius:var(--r-card);padding:var(--s-6) var(--s-4);text-align:center;}.sl-empty strong{display:block;font-size:var(--fs-lg);margin-bottom:var(--s-1);}.sl-empty span{font-size:var(--fs-sm);color:var(--muted);}
/* ===== DIE BUECHEREI DES KINDES (v2.330.0) ================================
   Dieselbe Bauteilfamilie wie die Aufgabenkarten daneben, nur ruhiger: hier
   drueckt nichts, es gibt keine Frist und keinen Zustand. Deshalb Karten
   ohne Farbflaeche und Zeilen statt Kacheln, sobald es um einzelne Themen
   geht - eine Liste mit 40 Kacheln waere ein Bilderteppich, durch den ein
   Kind nicht liest.
   ALLE Werte aus dem Woerterbuch (docs/DESIGN_SYSTEM.md): keine feste Farbe,
   keine Groesse neben der Skala. */
.sl-bib-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(210px,1fr));gap:var(--s-4);}
.sl-bib-fach{appearance:none;border:1px solid var(--line);background:var(--card);border-radius:var(--r-panel);padding:var(--s-5) var(--s-4);font:inherit;text-align:left;cursor:pointer;display:flex;flex-direction:column;gap:var(--s-2);transition:border-color .13s,box-shadow .13s,transform .13s;}
.sl-bib-fach:hover{border-color:var(--brand);box-shadow:0 10px 28px rgba(20,28,50,.09);transform:translateY(-2px);}
.sl-bib-fach-ico{display:inline-flex;align-items:center;justify-content:center;width:44px;height:44px;border-radius:var(--r-card);background:var(--brand-soft);color:var(--brand);}
.sl-bib-fach-ico svg{width:24px;height:24px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;}
.sl-bib-fach-name{font-size:var(--fs-lg);font-weight:830;color:var(--ink);line-height:1.25;}
.sl-bib-fach-zahl{font-size:var(--fs-sm);color:var(--muted);}
.sl-bib-liste{display:flex;flex-direction:column;gap:var(--s-2);margin-bottom:var(--s-5);}
.sl-bib-thema{appearance:none;width:100%;border:1px solid var(--line);background:var(--card);border-radius:var(--r-card);padding:var(--s-3) var(--s-4);font:inherit;text-align:left;cursor:pointer;display:flex;align-items:center;gap:var(--s-3);min-height:56px;transition:border-color .13s,background .13s;}
.sl-bib-thema:hover{border-color:var(--brand);background:var(--paper);}
.sl-bib-thema-txt{flex:1;min-width:0;}
.sl-bib-thema-txt b{display:block;font-size:var(--fs-base);font-weight:750;color:var(--ink);line-height:1.3;}
.sl-bib-thema-txt small{display:block;font-size:var(--fs-2xs);color:var(--muted);margin-top:2px;}
.sl-bib-thema svg{width:18px;height:18px;flex:none;fill:none;stroke:var(--brand);stroke-width:2.2;stroke-linecap:round;stroke-linejoin:round;}
/* 44px hoch, obwohl der Text kleiner ist: das Kind-Gesicht braucht groessere
   Ziele (DESIGN_SYSTEM.md §2). */
.sl-bib-zurueck{appearance:none;border:0;background:transparent;color:var(--brand);font:inherit;font-weight:750;padding:0;margin-bottom:var(--s-3);cursor:pointer;display:inline-flex;align-items:center;gap:var(--s-1);min-height:44px;}
.sl-bib-zurueck svg{width:18px;height:18px;fill:none;stroke:currentColor;stroke-width:2.2;stroke-linecap:round;stroke-linejoin:round;}
/* HIER STAND DIE ZWEITE FASSUNG DES FACHTEXTES (.sl-bib-seite,
   .sl-bib-klassen, .sl-bib-inhalt und alles darunter - bis v2.332.0).
   Sie hat den Fliesstext des Fachportals im Arbeitsplatz NACHGEBAUT:
   eigene Ueberschriften, eigene Tabellen, eigenes MathJax-Rollen. Seit
   v2.333.0 steht dort die echte Seite im Rahmen (fach-thema.css bringt
   ihre Gestaltung selbst mit), also gibt es hier nichts mehr zu
   gestalten. Was BLEIBT, sind die zwei Listen davor (.sl-bib-grid,
   .sl-bib-liste) - die gehoeren dem Arbeitsplatz, nicht dem Fachportal. */
@media(max-width:640px){
  .sl-bib-grid{grid-template-columns:1fr;}
}
.sl-detail{max-width:900px;}.sl-detail-back{appearance:none;border:0;background:transparent;color:var(--brand);font:inherit;font-weight:750;padding:0;cursor:pointer;}.sl-detail h2{margin:0 0 var(--s-2);}.sl-detail-copy{white-space:pre-wrap;line-height:1.6;color:var(--ink);background:var(--paper);border-radius:var(--r-card);padding:var(--s-4);margin:var(--s-4) 0;}.sl-answer{width:100%;min-height:150px;resize:vertical;border:1.5px solid var(--line);border-radius:var(--r-card);padding:var(--s-3);font:inherit;box-sizing:border-box;}.sl-detail-frame{max-width:none;}.sl-detail-bar{display:flex;align-items:center;gap:var(--s-4);margin-bottom:var(--s-3);padding-bottom:var(--s-3);border-bottom:1px solid var(--line);}.sl-detail-bar>div{min-width:0;}.sl-detail-bar strong,.sl-detail-bar span{display:block;}.sl-detail-bar strong{font-size:var(--fs-lg);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}.sl-detail-bar span{font-size:var(--fs-2xs);color:var(--muted);margin-top:2px;}.sl-task-frame{display:block;width:100%;height:clamp(560px,68vh,900px);border:0;border-radius:var(--r-card);background:var(--paper);}
/* ===== KOPFZEILE DES KINDES (v2.235.2) ================================
   Name, Klasse und Sterne stehen oben rechts; der Gruss hat den Titel. */
.sl-ich{margin-left:auto;flex:none;display:flex;align-items:center;gap:var(--s-3);}
/* Der Gruss steht im Seitentitel und darf dort NICHT umbrechen - er ist die
   einzige Zeile, die das Kind hier lesen soll. */
body.student-workspace .app-topbar .at-title{font-weight:650;letter-spacing:-.025em;}
@media(max-width:600px){.sl-ich-name{display:none;}}
.sl-ich-name{display:flex;flex-direction:column;line-height:1.2;text-align:right;}
.sl-ich-name b{font-size:var(--fs-sm);color:var(--ink);}
.sl-ich-name small{font-size:var(--fs-2xs);color:var(--muted);}
/* Die Sterne sind ein KNOPF, kein Abzeichen - er oeffnet die Tafel. Das
   muss man sehen koennen, sonst probiert es niemand aus. */
.sl-sterne{appearance:none;display:inline-flex;align-items:center;gap:var(--s-1);border:1px solid var(--amber-line);
  background:color-mix(in srgb, var(--amber) 4%, var(--card));color:var(--amber-ink);border-radius:var(--r-pill);padding:var(--s-1) var(--s-3) var(--s-1) var(--s-3);font:inherit;
  font-size:var(--fs-sm);font-weight:800;cursor:pointer;}
.sl-sterne:hover{background:color-mix(in srgb, var(--amber) 18%, var(--card));border-color:var(--amber);}
.sl-sterne svg{width:17px;height:17px;fill:var(--amber);stroke:none;}
/* Abmelden ist der einzige Knopf, der etwas BEENDET - er sieht anders aus. */
.sl-side-out-btn{color:var(--bad)!important;}
.sl-side-out-btn svg{stroke:currentColor;}
.sl-side-out-btn:hover{background:var(--bad-soft)!important;}
/* Belohnungstafel - nur zum Ansehen. */
.sl-tafel-ov{position:fixed;inset:0;z-index:10030;background:rgba(19,28,45,.48);display:grid;place-items:center;padding:var(--s-5);}
.sl-tafel{width:min(720px,calc(100vw - 32px));max-height:min(720px,calc(var(--vh100) - 40px));
  display:flex;flex-direction:column;background:var(--card);border-radius:var(--r-panel);overflow:hidden;
  box-shadow:0 22px 70px rgba(20,30,50,.3);}
.sl-tafel-kopf{display:flex;align-items:center;justify-content:space-between;gap:var(--s-3);padding:var(--s-4) var(--s-4);border-bottom:1px solid var(--line);}
.sl-tafel-kopf b{font-size:var(--fs-base);}
.sl-tafel-kopf button{border:0;background:var(--paper);border-radius:var(--r-control);width:30px;height:30px;font-size:var(--fs-lg);cursor:pointer;color:var(--muted);}
.sl-tafel-inhalt{padding:var(--s-3) var(--s-4) var(--s-4);overflow:auto;font-size:var(--fs-sm);color:var(--muted);}
.sl-tafel-liste{list-style:none;margin:0;padding:0;display:grid;gap:var(--s-1);counter-reset:platz;}
.sl-tafel-liste li{display:flex;align-items:center;gap:var(--s-3);padding:var(--s-2) var(--s-3);border-radius:var(--r-control);background:var(--paper);}
.sl-tafel-liste li.ich{background:var(--brand-soft);outline:1.5px solid var(--brand);}
.sl-tafel-emoji{font-size:var(--fs-xl);width:28px;text-align:center;flex:none;}
.sl-tafel-name{flex:1;min-width:0;font-size:var(--fs-sm);font-weight:750;color:var(--ink);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.sl-tafel-zahl{font-size:var(--fs-md);font-weight:850;color:var(--amber-ink);flex:none;}
/* Pizza-Karte der Klasse: dasselbe Bild wie bei der Lehrkraft, ohne Knoepfe. */
.sl-tafel-pizza{background:linear-gradient(180deg,#FFF6DF,#FFEFC9);border:1px solid #F0DCAB;
  border-radius:var(--r-card);padding:var(--s-4) var(--s-4);margin-bottom:var(--s-4);}
.sl-pizza-kopf{font-size:var(--fs-sm);font-weight:800;color:var(--amber-ink);text-align:center;}
.sl-pizza-kopf b{color:var(--ok);}
/* Der Satz unter der Ueberschrift - dieselbe Rolle und dieselbe Gestalt wie
   `.sl-weg-satz` beim eigenen Weg (v2.320.0). Zwei Fortschritte auf einem
   Bildschirm sollen sich gleich lesen; nur die Farbe bleibt die des
   Pizza-Blocks, damit „ihr" und „du" trotzdem unterscheidbar bleiben. */
.sl-pizza-satz{font-size:var(--fs-sm);color:var(--amber-ink);text-align:center;
  margin:var(--s-1) 0 var(--s-2);opacity:.85;}
.sl-pizza-satz b{opacity:1;}
.sl-pizza-reihe{display:flex;justify-content:center;gap:var(--s-1);margin:var(--s-2) 0 var(--s-3);flex-wrap:wrap;}
.sl-pizza-st{width:30px;height:30px;}
/* ===== DER STERNENWEG (v2.317.0, Faz 5a) ================================
   HIER STANDEN `.sl-beutel-reihe` und `.sl-beutel` - drei Schatzbeutel
   nebeneinander mit „★ 5 · ★ 8 · ★ 11". Eine Preisliste: das Kind sah, was
   es kostet, aber nicht, wo es steht; zwischen der Liste und der eigenen
   Zahl oben in der Ecke musste es selbst rechnen.

   Der Weg zeigt beides in einem Bild: die Stationen UND den eigenen Stand.
   Er ist bewusst waagerecht und ohne Bild-Datei gebaut - eine Grafik pro
   Station waere ein neuer Satz Dateien fuer etwas, das drei Farben und ein
   Haken genauso sagen.

   `--wf` ist die Farbe der erreichten Station; sie kommt aus dem JS, weil
   dort auch `belBeutelFor()` dieselben drei Toene vergibt (EINE Quelle). */
.sl-weg{background:var(--card);border:1px solid var(--line);border-radius:var(--r-card);
  padding:var(--s-4) var(--s-4) var(--s-5);margin-bottom:var(--s-3);}
.sl-weg-kopf{font-size:var(--fs-sm);font-weight:800;color:var(--ink);text-align:center;}
.sl-weg-ich{color:var(--amber-ink);}
.sl-weg-satz{font-size:var(--fs-sm);color:var(--muted);text-align:center;margin:var(--s-1) 0 var(--s-5);}
.sl-weg-satz b{color:var(--ink);}
/* Die Bahn traegt die Stationen ABSOLUT - nur so sitzt jede genau ueber
   ihrem Anteil. Ein Flex-Raster mit `space-between` sieht bei vier gleichen
   Abstaenden identisch aus und bricht in dem Moment, in dem die Lehrkraft
   die Schwellen ungleichmaessig einstellt (5/6/20 ist erlaubt). */
.sl-weg-bahn{position:relative;height:8px;margin:0 var(--s-5);}
.sl-weg-spur{position:absolute;inset:0;border-radius:var(--r-pill);background:var(--line);}
/* Die drei Stufenfarben sind DIESELBEN wie an den Stationen (slWegStationen
   in index-app.js) - sonst haette der Balken bei „Mittlerer Schatz" einen
   anderen Blauton als der Punkt, den er gerade erreicht. Klein und Mittel
   sind echte Token; der Ton des grossen Schatzes hat keinen, und §3.1 des
   Design-Systems verbietet, dafuer eine Bedeutungsfarbe zu erfinden. */
.sl-weg-voll{position:absolute;top:0;bottom:0;left:0;border-radius:var(--r-pill);
  background:linear-gradient(90deg,var(--ok),var(--brand) 55%,#7A5AF8);
  transition:width .8s cubic-bezier(.2,.8,.3,1);}
.sl-weg-station{position:absolute;top:50%;transform:translate(-50%,-50%);
  display:flex;flex-direction:column;align-items:center;width:76px;}
.sl-weg-station i{width:26px;height:26px;border-radius:50%;display:grid;place-items:center;
  background:var(--paper);border:2px solid var(--line);box-shadow:0 0 0 3px var(--card);}
.sl-weg-station i svg{width:14px;height:14px;fill:none;stroke:var(--muted);
  stroke-width:2.4;stroke-linecap:round;stroke-linejoin:round;}
.sl-weg-station.auf i{background:var(--wf,var(--brand));border-color:var(--wf,var(--brand));}
.sl-weg-station.auf i svg{stroke:var(--on-brand);}
.sl-weg-station small{margin-top:var(--s-2);font-size:var(--fs-3xs);font-weight:750;
  color:var(--muted);line-height:1.2;text-align:center;}
.sl-weg-station.auf small{color:var(--ink);}
.sl-weg-station em{font-style:normal;font-size:var(--fs-3xs);color:var(--muted);opacity:.75;}
@media (prefers-reduced-motion: reduce){ .sl-weg-voll{transition:none;} }
/* ===== ABZEICHEN (v2.318.0, Faz 5b) ====================================
   Ein Raster, keine Reihe: fuenf Kacheln passen am Telefon nicht
   nebeneinander, und waagerecht scrollen wuerde die hinteren verstecken -
   gerade die noch offenen, die das Ziel sind. Erreichte tragen Farbe,
   offene bleiben grau; der Unterschied muss auf einen Blick sichtbar sein,
   ohne dass ein Kind den Text liest. */
.sl-abz{background:var(--card);border:1px solid var(--line);border-radius:var(--r-card);
  padding:var(--s-4);margin-bottom:var(--s-3);}
.sl-abz-kopf{font-size:var(--fs-sm);font-weight:800;color:var(--ink);
  text-align:center;margin-bottom:var(--s-3);}
.sl-abz-reihe{display:grid;grid-template-columns:repeat(auto-fit,minmax(118px,1fr));
  gap:var(--s-2);}
.sl-abz-stueck{display:flex;flex-direction:column;align-items:center;text-align:center;
  gap:2px;padding:var(--s-3) var(--s-2);border-radius:var(--r-control);
  background:var(--paper);opacity:.6;}
.sl-abz-stueck.hat{opacity:1;background:var(--amber-soft);}
.sl-abz-stueck i{width:32px;height:32px;border-radius:50%;display:grid;place-items:center;
  background:var(--card);margin-bottom:2px;}
.sl-abz-stueck i svg{width:17px;height:17px;fill:none;stroke:var(--muted);
  stroke-width:2;stroke-linecap:round;stroke-linejoin:round;}
.sl-abz-stueck.hat i{background:var(--amber);}
.sl-abz-stueck.hat i svg{fill:var(--card);stroke:var(--card);}
.sl-abz-stueck b{font-size:var(--fs-2xs);font-weight:800;color:var(--muted);line-height:1.2;}
.sl-abz-stueck.hat b{color:var(--amber-ink);}
.sl-abz-stueck small{font-size:var(--fs-3xs);color:var(--muted);line-height:1.25;}
.sl-abz-stueck em{font-style:normal;font-size:var(--fs-3xs);font-weight:750;
  color:var(--muted);opacity:.8;margin-top:2px;}
/* Schmal: die Beschriftungen der vier Stationen wuerden sich sonst
   ueberlappen. Sie stehen dann nur noch an der ERREICHTEN und der naechsten
   - genau die zwei, die gerade zaehlen. */
@media (max-width:520px){
  .sl-weg-station{width:56px;}
  /* --fs-3xs (10px) ist die Untergrenze der Skala (§4.3, abgeschlossen).
     Hier stand 9.5px - ein halber Pixel unter dem Kleinsten, was wir einem
     Kind zumuten. Der Platz reicht auch mit 10px: schmal stehen nur noch
     zwei der vier Beschriftungen. */
  .sl-weg-station small{font-size:var(--fs-3xs);}
  .sl-weg-station em{display:none;}
}
/* Ein Kind je Karte - dieselbe Rasteroptik wie die Tafel der Lehrkraft. */
.sl-tafel-karten{display:grid;grid-template-columns:repeat(auto-fill,minmax(210px,1fr));gap:var(--s-2);}
.sl-tafel-karte{display:flex;align-items:center;gap:var(--s-3);padding:var(--s-3) var(--s-3);border-radius:var(--r-card);
  background:var(--paper);border:1px solid var(--line);}
.sl-tafel-karte.ich{background:var(--brand-soft);border-color:var(--brand);}
.sl-tafel-mitte{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px;}
.sl-tafel-mitte b{font-size:var(--fs-sm);color:var(--ink);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.sl-tafel-schatz{font-style:normal;font-size:var(--fs-3xs);font-weight:800;border:1px solid;border-radius:var(--r-pill);
  padding:1px var(--s-2);align-self:flex-start;}
.sl-tafel-fuss{margin:var(--s-4) 0 0;font-size:var(--fs-2xs);line-height:1.5;color:var(--muted);text-align:center;}
/* ===== AVATAR DES KINDES (v2.238.0, docs/PLAN_AVATAR.md §5) ============
   Uebertragen aus der Sichtprobe `docs/vorschau_avatar.html` - dort wurde
   das Verhalten in drei Breiten angesehen, bevor es hierher kam.

   ZWEI REGELN, die den ganzen Bildschirm tragen:
     * Galerie `repeat(auto-fill, minmax(88px,1fr))` - eine Regel, drei
       Groessen: Telefon 3, Tablet 6, Computer 8 Spalten.
     * Beruehrflaechen mindestens 44 px, Farbpunkte 40 px. 24 px wird am
       Telefon danebengetippt, und dieser Bildschirm ist FUER das Telefon.
   Die Umschaltung auf eine Spalte steht bei 900 px, nicht bei 640 px: ein
   hoch gehaltenes Tablet ist breit genug fuer eine Galerie, aber nicht fuer
   Galerie UND klebende Vorschau nebeneinander. */
/* ===== DER VERDIENTE RING (v2.319.0, Faz 5c) ===========================
   Wer eine Station des Sternenwegs erreicht hat, traegt einen farbigen Kranz
   um sein Bild - auf der Belohnungstafel sieht ihn die ganze Klasse.

   WARUM EIN RING UND NICHT FREIGESCHALTETE AVATAR-TEILE: im Vorrat stehen
   `hijab`, `cornrows`, `afro`, `gray-bun`, `glasses`, `eyepatch`, und die
   Kategorie "Farben" sind Hauttoene. Das ist kein Schmuck, sondern wie ein
   Kind aussieht; daraus eine Belohnung zu machen hiesse, dass es sich selbst
   verdienen muss. Der Ring sagt etwas ueber die ARBEIT, nicht ueber die
   Person - und laesst das Bild darunter unangetastet.

   `box-shadow` statt `border`: ein Rahmen wuerde die Kreisgroesse aendern,
   und die steht als Inline-Stil an acht Aufrufstellen (28px auf der Tafel,
   72px im Profil, 46px im Klassenbuch). Der Schatten legt sich AUSSEN an und
   verschiebt nichts. */
.sl-av-rang{position:relative;}
.sl-av-rang-klein{box-shadow:0 0 0 2.5px var(--card), 0 0 0 5px var(--ok);}
.sl-av-rang-mittel{box-shadow:0 0 0 2.5px var(--card), 0 0 0 5px var(--brand);}
/* Klein/Mittel tragen Token, Gross den Ton des grossen Schatzes - derselbe
   Wert wie am Ende des Sternenwegs (.sl-weg-voll). */
.sl-av-rang-gross{box-shadow:0 0 0 2.5px var(--card), 0 0 0 5px #7A5AF8,
  0 0 12px rgba(122,90,248,.45);}
.sl-av-kreis{display:inline-flex;align-items:center;justify-content:center;flex:none;position:relative;
  border-radius:50%;overflow:hidden;background:var(--paper);line-height:1;}
.sl-av-kreis img{width:100%;height:100%;object-fit:cover;object-position:top center;}
/* Pixel-Figuren sind 240-px-Rastergrafiken. Weichgezeichnet sehen sie aus
   wie ein Fehler; `pixelated` ist hier die originalgetreue Wiedergabe. */
.sl-av-kreis img.ist-pixel{image-rendering:pixelated;object-fit:contain;object-position:center;}
.sl-av-kreis svg{width:100%;height:100%;display:block;}
/* EINE FIGUR UEBERALL (v2.854.0): eine Rennfigur zeigt im Kreis nur Kopf und
   Schultern (index-app.js slAvBildHtml, Ausschnitt aus RENN_KATALOG.kopf) -
   das Bild wird groesser gesetzt und verschoben, der Kreis schneidet. */
.sl-av-kreis img.ist-ausschnitt,.sl-av-mini img.ist-ausschnitt{position:absolute;max-width:none;max-height:none;
  object-fit:fill;object-position:0 0;}
.sl-av-emoji{background:transparent;}
/* Der Emoji-Rueckfall bei der Lehrkraft (studentBild). Die alten Stellen
   hatten den Schlagschatten einzeln im style-Attribut stehen; hier steht er
   einmal, damit ein Kind mit Emoji neben einem Kind mit Avatar nicht
   ploetzlich flach aussieht. */
.stud-emoji{filter:drop-shadow(0 2px 3px rgba(0,0,0,.18));}
.sl-ich-knopf{appearance:none;border:0;background:transparent;padding:0;cursor:pointer;
  border-radius:50%;display:inline-flex;}
.sl-ich-knopf:hover .sl-av-kreis{outline:2px solid var(--brand);outline-offset:1px;}
.sl-ich{position:relative;}
/* HIER STANDEN DIE REGELN FUER `.sl-ich-menue` (entfernt in v2.312.1).
   Das Klappmenue am Profilkreis war seit v2.281.0 unerreichbar und ist mit
   seinem Aufrufer zusammen entfallen - die Begruendung steht bei
   `slAufgabeOeffnen` in static/js/index-app.js. Der Kreis oeffnet jetzt
   direkt den Bildwaehler (`.sl-av-*`, gleich darunter). */

.sl-av-ov{position:fixed;inset:0;z-index:10035;background:rgba(19,28,45,.48);display:grid;place-items:center;padding:var(--s-5);}
.sl-av-box{width:min(1040px,calc(100vw - 32px));height:min(760px,calc(var(--vh100) - 40px));
  display:flex;flex-direction:column;background:var(--card);border-radius:var(--r-panel);overflow:hidden;
  box-shadow:0 22px 70px rgba(20,30,50,.3);}
.sl-av-kopf{display:flex;align-items:center;justify-content:space-between;gap:var(--s-3);
  padding:var(--s-4) var(--s-4);border-bottom:1px solid var(--line);flex:none;}
.sl-av-kopf b{font-size:var(--fs-base);}
.sl-av-kopf button{border:0;background:var(--paper);border-radius:var(--r-control);width:34px;height:34px;
  font-size:var(--fs-lg);cursor:pointer;color:var(--muted);}
.sl-av-leib{flex:1;min-height:0;display:grid;grid-template-columns:38% 1fr;}
/* Die Vorschau KLEBT: beim Blaettern durch 105 Koepfe muss die Figur stehen
   bleiben, sonst sieht das Kind nicht, was es gerade waehlt. */
.sl-av-vorschau{border-right:1px solid var(--line);background:var(--paper);position:sticky;top:0;
  display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--s-3);padding:var(--s-4);
  position:relative;}
/* DIE GROSSE VORSCHAU IST KEIN KREIS. Eine stehende Figur hat das
   Seitenverhaeltnis 1179:3291 - in einem Kreis stuende sie als schmaler
   Strich in der Mitte, und die gewaehlte Haltung waere nicht zu erkennen.
   Also eine hohe Flaeche mit weichen Ecken; rund wird es erst dort, wo der
   Avatar spaeter wirklich erscheint (der Mini-Kreis daneben). */
.sl-av-gross{flex:1;width:100%;max-width:230px;min-height:0;border-radius:var(--r-panel);
  overflow:hidden;display:grid;place-items:center;}
.sl-av-gross svg{width:100%;height:100%;}
.sl-av-gross img{max-width:100%;max-height:100%;object-fit:contain;}
.sl-av-gross img.ist-pixel{image-rendering:pixelated;}
/* Derselbe Avatar im echten Format der Belohnungstafel - OBEN LINKS und ohne
   Beschriftung (v2.240.0). Unten am Rand ging er unter, und der Satz daneben
   erklaerte etwas, das ein Kind an einem Kopf im Kreis von selbst sieht.
   Ohne ihn waere die grosse Figur ein Versprechen, das der Alltag nicht
   haelt - er bleibt also, nur an der richtigen Stelle. */
.sl-av-mini{position:absolute;top:12px;left:12px;z-index:2;
  width:44px;height:44px;border-radius:50%;overflow:hidden;flex:none;
  display:grid;place-items:center;background:var(--paper);
  box-shadow:0 0 0 2px var(--card);}
.sl-av-mini svg{width:100%;height:100%;display:block;}
.sl-av-mini img{width:100%;height:100%;object-fit:cover;object-position:top center;}
.sl-av-mini img.ist-pixel{image-rendering:pixelated;object-fit:contain;object-position:center;}
.sl-av-vorschau small{font-size:var(--fs-2xs);color:var(--muted);text-align:left;}
.sl-av-rechts{display:flex;flex-direction:column;min-width:0;min-height:0;}
.sl-av-reiter{display:flex;gap:var(--s-1);padding:var(--s-3) var(--s-4) 0;flex:none;overflow-x:auto;-webkit-overflow-scrolling:touch;}
.sl-av-reiter button{flex:none;appearance:none;border:1.5px solid var(--line);background:var(--card);
  color:var(--muted);font:inherit;font-weight:750;font-size:var(--fs-sm);border-radius:var(--r-pill);
  padding:var(--s-2) var(--s-3);cursor:pointer;min-height:44px;white-space:nowrap;}
.sl-av-reiter button.on{background:var(--brand-soft);border-color:var(--brand);color:var(--brand);}
/* Die Kategorien im Kurator scrollen WAAGERECHT. Eine senkrechte Liste
   fraesse am Telefon das halbe Bild (PLAN_AVATAR.md §5). */
.sl-av-chips{display:flex;gap:var(--s-1);padding:var(--s-3) var(--s-4) 0;flex:none;overflow-x:auto;-webkit-overflow-scrolling:touch;}
.sl-av-chips button{flex:none;appearance:none;border:1.5px solid var(--line);background:var(--card);
  color:var(--muted);font:inherit;font-weight:750;font-size:var(--fs-sm);border-radius:var(--r-pill);
  padding:var(--s-2) var(--s-3);cursor:pointer;min-height:44px;white-space:nowrap;}
.sl-av-chips button.on{background:var(--ink);border-color:var(--ink);color:var(--card);}
/* `grid-auto-rows:min-content` (v2.854.0): ohne sie bemass Chrome die Zeilen
   nach der Mindesthoehe der Kachel (88 px), waehrend die Kachel quadratisch
   breiter wird - am Telefon (Kachel 109 px) lagen die Reihen uebereinander.
   Gefunden beim Browserlauf 26.09.2026; am Computer (Kachel unter 88 px)
   aendert sich nichts. */
.sl-av-galerie{flex:1;min-height:0;overflow:auto;padding:var(--s-3) var(--s-4);font-size:var(--fs-sm);color:var(--muted);
  display:grid;grid-template-columns:repeat(auto-fill,minmax(88px,1fr));grid-auto-rows:min-content;gap:var(--s-2);align-content:start;}
.sl-av-kachel{appearance:none;border:1.5px solid var(--line);background:var(--card);border-radius:var(--r-card);
  padding:var(--s-1);cursor:pointer;aspect-ratio:1;min-height:88px;display:grid;place-items:center;overflow:hidden;}
.sl-av-kachel:hover{border-color:color-mix(in srgb, var(--brand) 22%, var(--card));}
.sl-av-kachel.on{border-color:var(--brand);background:var(--brand-soft);outline:1.5px solid var(--brand);}
.sl-av-kachel img{max-width:100%;max-height:100%;object-fit:contain;}
.sl-av-kachel img.ist-pixel{image-rendering:pixelated;}
/* Die Kacheln aus dem Katalog der Rennfiguren (warteplatz.js wpFigurenHtml)
   markieren die Wahl mit `an`; Pixelkunst bleibt scharf - dieselbe Regel wie
   im Rennmotor (der Pfad entscheidet, …/pixel/ = scharf). */
.sl-av-kachel.an{border-color:var(--brand);background:var(--brand-soft);outline:1.5px solid var(--brand);}
/* Die Katalogbilder tragen width/height="240" (die Kachel haelt ihre Form,
   solange das Bild noch laedt) - hier fuellen sie die Kachel quadratisch. */
.sl-av-kachel[data-rennfigur] img{display:block;width:100%;height:auto;max-height:none;aspect-ratio:1/1;}
.sl-av-kachel img[src*="/pixel/"]{image-rendering:pixelated;}
.sl-av-kachel img:not([src*="/pixel/"]){image-rendering:auto;}
.sl-av-reiter button:focus-visible,.sl-av-chips button:focus-visible,.sl-av-kachel:focus-visible,
.sl-av-seg button:focus-visible{outline:3px solid var(--brand);outline-offset:2px;}
/* „Gezeichnet" unter „Menschen" (bis v2.853.0 zwei eigene Reiter): eine
   Ueberschrift ueber die ganze Breite, daneben der Schalter Bunt/Umriss. */
.sl-av-abschnitt{grid-column:1/-1;display:flex;align-items:center;justify-content:space-between;
  gap:var(--s-3);margin:var(--s-3) 0 0;}
.sl-av-abschnitt b{font-size:var(--fs-base);color:var(--ink);}
.sl-av-seg{display:inline-flex;gap:2px;padding:3px;border-radius:var(--r-pill);background:var(--paper);}
.sl-av-seg button{appearance:none;border:0;background:transparent;color:var(--muted);font:inherit;
  font-weight:750;font-size:var(--fs-sm);border-radius:var(--r-pill);padding:var(--s-1) var(--s-3);
  min-height:36px;cursor:pointer;}
.sl-av-seg button.on{background:var(--card);color:var(--ink);box-shadow:0 1px 3px rgba(20,30,50,.14);}
/* Der Reitername: am Computer lang, am Telefon kurz (Regel unten, 640px). */
.sl-av-kurz{display:none;}
/* SELBST BAUEN IN DREI STILEN (v2.855.0): die Stilzeile (Mensch · Roboter ·
   Gezeichnet), Kacheln mit der ganzen Figur, runde Farbfelder, der Wuerfel
   oben rechts in der Vorschau. Beruehrflaechen 44 px wie ueberall hier. */
.sl-av-stile{display:flex;padding:var(--s-3) var(--s-4) 0;flex:none;}
.sl-av-stile .sl-av-seg button{min-height:40px;padding:var(--s-1) var(--s-4);}
.sl-av-baukachel{position:relative;}
.sl-av-baukachel svg{width:100%;height:100%;display:block;}
.sl-av-ohne-marke{position:absolute;left:var(--s-1);bottom:var(--s-1);font-size:var(--fs-3xs);font-weight:800;
  color:var(--muted);background:var(--card);border-radius:var(--r-pill);padding:0 var(--s-1);}
.sl-av-farben{grid-column:1/-1;display:flex;flex-wrap:wrap;gap:var(--s-2);}
.sl-av-farbe{appearance:none;width:44px;height:44px;padding:0;border-radius:50%;border:3px solid var(--card);
  box-shadow:0 0 0 1.5px var(--line);cursor:pointer;}
.sl-av-farbe.on{box-shadow:0 0 0 3px var(--brand);}
.sl-av-farbe:focus-visible{outline:3px solid var(--brand);outline-offset:2px;}
.sl-av-wuerfel{position:absolute;top:var(--s-3);right:var(--s-3);z-index:2;width:44px;height:44px;
  border-radius:50%;border:1.5px solid var(--line);background:var(--card);color:var(--ink);
  display:grid;place-items:center;cursor:pointer;}
.sl-av-wuerfel:hover{border-color:var(--brand);color:var(--brand);}
.sl-av-wuerfel:focus-visible{outline:3px solid var(--brand);outline-offset:2px;}
.sl-av-wuerfel svg{width:22px;height:22px;fill:none;stroke:currentColor;stroke-width:2;
  stroke-linecap:round;stroke-linejoin:round;}
.sl-av-ohne{font-size:var(--fs-xs);font-weight:800;color:var(--muted);}
/* Die Haltung wird als Bild gewaehlt, mit dem Wort darunter - "Sitzend"
   allein sagt weniger als die Figur. */
.sl-av-haltung{gap:2px;grid-template-rows:1fr auto;}
.sl-av-haltung b{font-size:var(--fs-3xs);font-weight:800;color:var(--muted);}
.sl-av-haltung.on b{color:var(--brand);}
.sl-av-paletten{grid-template-columns:repeat(auto-fill,minmax(104px,1fr));gap:var(--s-3);}
.sl-av-pal{appearance:none;border:1.5px solid var(--line);background:var(--card);border-radius:var(--r-card);
  padding:var(--s-3);cursor:pointer;min-height:88px;display:flex;flex-direction:column;
  align-items:center;justify-content:center;gap:var(--s-2);}
.sl-av-pal.on{border-color:var(--brand);outline:1.5px solid var(--brand);}
.sl-av-pal-punkte{display:flex;gap:var(--s-1);}
/* 40 px, nicht 24: ein Farbpunkt ist am Telefon ein Ziel, kein Symbol. */
.sl-av-pal-punkte i{width:40px;height:40px;border-radius:50%;border:1px solid rgba(0,0,0,.12);}
.sl-av-pal b{font-size:var(--fs-xs);}
/* Speichern klebt unten - in Daumenreichweite, und ausdruecklich: kein
   Autosave (PLAN_AVATAR.md §5). */
.sl-av-fuss{flex:none;border-top:1px solid var(--line);padding:var(--s-3) var(--s-4);background:var(--card);
  display:flex;gap:var(--s-3);align-items:center;justify-content:space-between;}
.sl-av-fuss small{font-size:var(--fs-2xs);color:var(--muted);min-width:0;overflow:hidden;
  text-overflow:ellipsis;white-space:nowrap;}
.sl-av-sichern{flex:none;min-height:44px;padding:var(--s-3) var(--s-5);font-weight:800;}
.sl-av-sichern:disabled{opacity:.5;cursor:default;}
@media(max-width:900px){
  /* NIE nebeneinander: Vorschau als fester Streifen oben, darunter Reiter,
     darunter die scrollende Galerie. Genau das Muster, das am Telefon
     funktioniert. */
  .sl-av-ov{padding:0;}
  .sl-av-box{width:100vw;height:var(--vh100);border-radius:0;}
  .sl-av-leib{grid-template-columns:1fr;grid-template-rows:170px 1fr;}
  .sl-av-vorschau{border-right:0;border-bottom:1px solid var(--line);flex-direction:row;
    gap:var(--s-4);padding:var(--s-3) var(--s-4);justify-content:flex-start;}
  .sl-av-gross{max-width:110px;height:100%;}
  .sl-av-so{flex-direction:column;align-items:flex-start;gap:var(--s-1);}
  .sl-av-vorschau small{text-align:left;}
}
/* TELEFON (v2.854.0): die sechs Reiter des Figurenfensters als EINE Leiste
   (Anweisung Murat 26.09.2026 fuer die Rennauswahl: „mobilde alle pixel filan
   butonlari yan yana olmali tek satirda … iki satir olamaz" - sie gilt fuer
   das eine Fenster weiter). Kurze Namen, gleich geteilt, die Schrift waechst
   mit dem Schirm. Nur hier - Tablet und Computer behalten die Pillen. */
@media (max-width:640px){
  .sl-av-lang{display:none;}
  .sl-av-kurz{display:inline;}
  .sl-av-reiter{gap:0;margin:var(--s-2) var(--s-3) 0;padding:3px;border-radius:var(--r-card);
    background:var(--surface-subtle);overflow:hidden;}
  .sl-av-reiter button{flex:1 1 auto;min-width:0;padding:var(--s-1) 3px;border:0;border-radius:var(--r-control);
    background:transparent;font-size:clamp(10px,3.2vw,12px);letter-spacing:-.01em;}
  .sl-av-reiter button.on{background:var(--brand);color:var(--on-brand);}
  .sl-av-reiter button:focus-visible{outline-offset:-2px;}
}
/* ===== NACHRICHTEN ALS SPRECHBLASEN ===================================
   Die Farbe gehoert zur Lehrkraft, nicht zur Nachricht - sie wird aus dem
   Namen gerechnet (slBlasenFarbe) und ist damit immer dieselbe. */
.sl-blasen{display:grid;gap:var(--s-4);max-width:760px;}
.sl-blase-zeile{display:flex;align-items:flex-start;gap:var(--s-3);}
.sl-blase-kopf{flex:none;width:38px;height:38px;border-radius:50%;border:1.5px solid;
  display:flex;align-items:center;justify-content:center;font-size:var(--fs-sm);font-weight:850;}
.sl-blase{position:relative;flex:1;min-width:0;border:1.5px solid;border-radius:var(--r-card);
  border-top-left-radius:5px;padding:var(--s-3) var(--s-4);}
/* Der kleine Zipfel zum Kopf hin - das ist es, was eine Blase zur Blase macht. */
.sl-blase::before{content:"";position:absolute;left:-8px;top:11px;width:0;height:0;
  border:7px solid transparent;border-right-color:inherit;border-left:0;}
.sl-blase-wer{font-size:var(--fs-sm);font-weight:800;display:flex;align-items:baseline;
  justify-content:space-between;gap:var(--s-3);flex-wrap:wrap;}
.sl-blase-wer span{font-size:var(--fs-2xs);font-weight:650;color:var(--muted);}
.sl-blase p{margin:var(--s-2) 0 0;font-size:var(--fs-md);line-height:1.55;white-space:pre-wrap;color:var(--ink);}
.sl-blase small{display:block;margin-top:var(--s-2);font-size:var(--fs-3xs);color:var(--muted);}
@media(max-width:600px){.sl-blase-kopf{width:32px;height:32px;font-size:var(--fs-xs);}}
/* ===== EINKLAPPBARE LEISTE ============================================
   Zugeklappt bleiben die Symbole stehen. Eine Leiste, die ganz verschwindet,
   nimmt dem Kind den Weg zurueck - und der Klappknopf muesste dann irgendwo
   anders wieder auftauchen. */
/* DIESELBE BAUART WIE DIE LEISTE DER LEHRKRAFT (`.sb-top`/`.sb-toggle`,
   v2.240.0). Vorher schwebte der Klappknopf absolut ueber dem Kopf; klappte
   man zu, verschwand das Logo und uebrig blieb ein grosser Pfeil im Nichts.
   Jetzt: eine Zeile mit Logo und Knopf, der Knopf 28 px mit weichem Grund
   statt Rahmen - genau wie nebenan. Zwei Leisten, die sich verschieden
   bedienen lassen, sind eine zu viel. */
/* Der Trennstrich kommt aus der alten v2.230.0-Regel, die oben gelöscht
   wurde – er ist dasselbe Bild wie bei der Lehrkraft (`.sb-top`). */
/* DAS LOGO STEHT MITTIG (Befund Murat 12.08.2026: "sol üstteki logo
   ortalansin"). Es hing links am Rand, waehrend der Klappknopf rechts
   stand - eine Zeile mit zwei Dingen an den Enden und nichts dazwischen.
   Der Knopf liegt jetzt ABSOLUT rechts; nur so kann das Logo in der ganzen
   Breite mittig sitzen und nicht nur in dem, was der Knopf uebriglaesst. */
.sl-side-head{position:relative;display:flex;align-items:center;justify-content:center;
  gap:var(--s-2);
  padding:2px var(--s-1) var(--s-3);margin-bottom:var(--s-1);border-bottom:1px solid var(--line);}
.sl-side-logo{height:28px;width:auto;max-width:100%;flex:none;}
.sl-logo-marke{display:none;height:22px;}
.sl-side-klapp{position:absolute;right:var(--s-1);top:0;appearance:none;border:none;cursor:pointer;padding:0;
  width:28px;height:28px;border-radius:var(--r-control);flex:none;color:var(--muted);
  background:rgba(127,127,127,.08);display:flex;align-items:center;justify-content:center;
  transition:background .14s,color .14s;}
.sl-side-klapp:hover{background:rgba(127,127,127,.16);color:var(--ink);}
.sl-side-klapp svg{width:16px;height:16px;fill:none;stroke:currentColor;stroke-width:2.2;
  stroke-linecap:round;stroke-linejoin:round;transition:transform .22s;}
body.sl-leiste-zu .sl-side-klapp svg{transform:rotate(180deg);}
@media(min-width:900px){
  body.student-workspace.sl-leiste-zu #app-sidebar{width:70px!important;min-width:70px;flex-basis:70px;padding:var(--s-4) var(--s-2)!important;}
  /* Zugeklappt: kompakte Marke + Pfeil nebeneinander, mittig - wie nebenan. */
  body.sl-leiste-zu .sl-side-head{justify-content:center;gap:3px;padding:2px 2px var(--s-3);}
  body.sl-leiste-zu .sl-logo-voll{display:none;}
  body.sl-leiste-zu .sl-logo-marke{display:block;}
  /* Zugeklappt ist die Leiste 70px schmal: dort stehen Marke und Pfeil
     nebeneinander in EINER Reihe - absolut positioniert laege der Pfeil
     ueber dem Logo. */
  body.sl-leiste-zu .sl-side-klapp{position:static;margin-left:2px;}
  body.sl-leiste-zu .sl-side-btn span:not(.sl-side-count){display:none;}
  body.sl-leiste-zu .sl-side-btn{justify-content:center;padding:var(--s-3) 0;position:relative;}
  body.sl-leiste-zu .sl-side-count{position:absolute;top:4px;right:8px;margin:0;min-width:17px;height:17px;font-size:var(--fs-3xs);}
}
/* UNTER 900 px IST DIE LEISTE EINE SCHUBLADE, KEINE SPALTE - dort gibt es
   nichts einzuklappen (die Schublade geht ohnehin ganz zu). Alle Regeln
   oben stecken deshalb in `min-width:900px`; bliebe der Knopf sichtbar,
   stuende im Handy-Menue eines Kindes eine Schaltflaeche, die nichts tut.
   Genau dieselbe Zeile hat die Leiste der Lehrkraft (`.sb-toggle`,
   @media max-width:899.98px). */
@media (max-width:899.98px){
  body.student-workspace #app-sidebar .sl-side-klapp{display:none;}
  body.student-workspace #app-sidebar .sl-logo-voll{display:block;}
  body.student-workspace #app-sidebar .sl-logo-marke{display:none;}
}
/* Der Kopf ueber einem eingebetteten Inhalt: EINE Zeile. */
.sl-detail-bar-schlank{align-items:center;gap:var(--s-3);padding-bottom:var(--s-3);margin-bottom:var(--s-3);}
.sl-back-rund{flex:none;width:36px;height:36px;border:1px solid var(--line);background:var(--card);
  border-radius:var(--r-control);cursor:pointer;padding:0;color:var(--brand);}
.sl-back-rund:hover{background:var(--brand-soft);border-color:var(--brand);}
.sl-back-rund svg{width:19px;height:19px;fill:none;stroke:currentColor;stroke-width:2.2;
  stroke-linecap:round;stroke-linejoin:round;}
@media(max-width:720px){.sl-detail-bar-schlank{flex-direction:row;align-items:center;}}
.sl-message-banner{appearance:none;width:100%;border:1px solid color-mix(in srgb, var(--brand) 25%, var(--card));background:color-mix(in srgb, var(--brand) 6%, var(--card));color:var(--ink);border-radius:var(--r-card);padding:var(--s-4) var(--s-4);text-align:left;font:inherit;cursor:pointer;margin-bottom:var(--s-4);display:flex;align-items:center;gap:var(--s-4)}.sl-message-banner span{font-size:var(--fs-2xs);font-weight:800;color:var(--brand);white-space:nowrap}.sl-message-banner strong{font-size:var(--fs-sm);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sl-message-list{display:grid;gap:var(--s-3);max-width:900px}.sl-message{border:1px solid var(--line);border-radius:var(--r-card);padding:var(--s-4);background:var(--card)}.sl-message-head{display:flex;align-items:baseline;justify-content:space-between;gap:var(--s-3)}.sl-message-head strong{font-size:var(--fs-md)}.sl-message-head span,.sl-message small{font-size:var(--fs-2xs);color:var(--muted)}.sl-message p{white-space:pre-wrap;font-size:var(--fs-md);line-height:1.55;margin:var(--s-3) 0}
body.student-embedded #app-sidebar,body.student-embedded #sb-overlay,body.student-embedded .app-topbar,body.student-embedded .topbar{display:none!important;}body.student-embedded{display:block!important;max-width:none!important;min-height:0!important;margin:0!important;padding:0!important;background:var(--card)!important;}body.student-embedded .wrap{max-width:none!important;min-height:0!important;height:auto!important;margin:0!important;padding:var(--s-4)!important;border:0!important;border-radius:0!important;box-shadow:none!important;}
/* DIE LEERE FLAECHE UNTER EINER KURZEN MELDUNG (v2.282.0, Befund Murat
   12.08.2026: "unter dem Ergebnis eine grosse leere graue Flaeche"). Die
   Startkarte des Quiz bekommt mit einem Quiz-Design `min-height:100dvh` -
   gedacht fuer die eigene Seite, wo sie den Bildschirm fuellen soll. Im
   Rahmen des Schuelerarbeitsplatzes ist 100dvh die Hoehe des RAHMENS: eine
   dreizeilige Meldung ("Schon erledigt") blaeht die Karte damit auf volle
   Rahmenhoehe auf, und darunter steht getoente Leere. Der Rahmen bringt seine
   Hoehe selbst mit, die Karte darf also so hoch sein wie ihr Inhalt.
   Das Quiz selbst ist ausgenommen - dort ist das Fuellen richtig. */
body.student-embedded #screen-student-welcome{min-height:0!important;}
@media(max-width:720px){.sl-task-grid{grid-template-columns:1fr}.sl-task{min-height:210px;padding:var(--s-4)}.sl-welcome{margin-bottom:var(--s-4)}.sl-detail-bar{align-items:flex-start;flex-direction:column;gap:var(--s-2)}.sl-task-frame{height:72vh}}

/* ===== AUFGABENZENTRALE (v2.230.0) =====================================
   MIGRIERT MIT SCHRITT 6 (v2.278.0, docs/DESIGN_SYSTEM.md §10) - "Kern des
   Arbeitsablaufs". Nach den vier oeffentlichen Seiten und dem Cockpit ist das
   der Bildschirm, auf dem eine Lehrkraft ihre eigentliche Arbeit macht.

   WAS GEZOGEN WURDE: 18 Schriftgroessen auf die Skala (die halben Pixel
   9.5/11.5/12.5/15.5 sind weg - hier greifen zum ersten Mal --fs-3xs und
   --fs-2xs aus §4.3, entschieden in v2.271.0), 11 Ecken nach Bauteil (§4.1),
   28 Abstaende auf die Reihe (§4.2) und zwei feste Farben.

   WAS ABSICHTLICH STEHENBLEIBT - und das ist die wichtigste Zeile hier:
   die fuenf Zustandstoene .az-k-ok/-info/-soon/-warn/-bad. Sie gehoeren NICHT
   allein diesem Bildschirm: dieselben Werte stehen in .sl-task-deadline
   (Schuelerarbeitsplatz, Schritt 8) - der Kommentar dort sagt es ausdruecklich,
   "dieselben Stufen wie beim Kind". Und sie sind NICHT wertgleich mit dem
   Woerterbuch: #EAF7F0 gegen --ok-soft #E4F6EC, #147A45 gegen --ok-ink
   #0E7A43, und so weiter bei allen fuenf.
   Sie hier zu ziehen hiesse also, die Lehrer- und die Kinderseite fuer die
   Dauer von zwei Migrationsschritten AUSEINANDERLAUFEN zu lassen - bei
   Toenen, deren einziger Zweck es ist, auf beiden Seiten dasselbe zu
   bedeuten. Sie wandern gemeinsam in Schritt 8. Wer sie vorher anfasst,
   loest genau den Fehler aus, den das Design-System verhindern soll.

   ZWEI KLEINIGKEITEN, die kein Token vertragen:
   * Der Pfeil im Auswahlfeld ist eine data-URI (SVG im CSS). Dort kann keine
     Variable stehen - eine data-URI wird nicht als CSS ausgewertet. Der Ton
     %236B7280 ist von --muted (#6A7384) nicht unterscheidbar.
   * `gap:1px` in .az-k-daten>span ist kein Abstand aus der Reihe, sondern
     der Ausgleich zwischen Beschriftung und Zahl INNERHALB einer Zeile.
     4px waeren hier sichtbar zu viel; die Kachel wuerde um 9px hoeher.

   TOTE REGELN ENTFERNT: .az-list, .az-item (mit :hover und >span),
   .az-progress (mit strong) und der ganze .az-message-Block. Die Liste
   wurde in v2.236.1 durch Karten ersetzt, die Mitteilungsleiste ist mit
   v2.242.0 in die Nachrichten gewandert - der Kommentar dazu stand seit
   damals hier, die Regeln aber auch. 16 Regeln, die kein Markup mehr
   erreicht.                                                                */
/* FILTER LINKS, AKTIONEN RECHTS (Murat 22.08.2026: "diger iki acilir
   filtre tuslarini sola daya"). Vorher waren die beiden Auswahlfelder
   eigene Flex-Kinder neben den Knoepfen - `space-between` schob das
   zweite in die Mitte, und dort stand es ohne Bezug zum ersten. Jetzt
   sind sie EINE Gruppe. */
.az-toolbar{display:flex;align-items:center;justify-content:space-between;gap:var(--s-3);margin:0 0 var(--s-4);min-width:0}.az-toolbar-filter{display:flex;align-items:center;gap:var(--s-2);min-width:0;flex:1}.az-toolbar select{appearance:none;-webkit-appearance:none;height:42px;min-width:190px;max-width:280px;border:1px solid var(--line);border-radius:var(--r-control);background-color:var(--card);background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18' height='18' viewBox='0 0 24 24' fill='none' stroke='%236B7280' stroke-width='2'%3E%3Cpath d='m7 10 5 5 5-5'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 11px center;color:var(--ink);font:inherit;font-size:var(--fs-sm);font-weight:700;padding:0 38px 0 13px;box-sizing:border-box;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.az-toolbar-actions{display:flex;align-items:center;gap:var(--s-2)}.az-tool-btn{appearance:none;height:42px;border:1px solid var(--brand);border-radius:var(--r-control);background:var(--brand);color:var(--card);padding:0 16px;font:inherit;font-size:var(--fs-sm);font-weight:750;white-space:nowrap;cursor:pointer}.az-tool-btn.ghost{background:var(--card);color:var(--brand)}
.az-form select,.az-form input,.az-form textarea{width:100%;min-width:0;font:inherit;border:1px solid var(--line);border-radius:var(--r-control);background:var(--card);color:var(--ink);padding:10px 11px;box-sizing:border-box;}.az-form select,.az-form input{height:42px;min-height:42px;line-height:20px}.az-form input[type=file]{height:42px;padding:6px 11px;line-height:28px;font-size:var(--fs-sm)}.az-form input[type=file]::file-selector-button{box-sizing:border-box;font:inherit;font-size:var(--fs-sm);font-weight:750;margin:0 10px 0 0;padding:0 12px;height:28px;border:1px solid var(--line);border-radius:var(--r-control);background:var(--paper);color:var(--ink);cursor:pointer}.az-form input[type=file]::-webkit-file-upload-button{box-sizing:border-box;font:inherit;font-size:var(--fs-sm);font-weight:750;margin:0 10px 0 0;padding:0 12px;height:28px;border:1px solid var(--line);border-radius:var(--r-control);background:var(--paper);color:var(--ink);cursor:pointer}.az-form select:disabled{color:var(--muted);background:var(--paper)}.az-form{border:0;background:transparent;padding:0;margin:0;}.az-types{display:grid;grid-template-columns:repeat(auto-fit,minmax(120px,1fr));gap:var(--s-2);margin-bottom:var(--s-4);}.az-type{appearance:none;border:1px solid var(--line);background:var(--card);border-radius:var(--r-control);padding:var(--s-3) var(--s-2);font:inherit;font-size:var(--fs-sm);font-weight:750;color:var(--ink);cursor:pointer;}.az-type.on{border-color:var(--brand);color:var(--brand);background:var(--brand-soft);}
/* Vier Spalten statt zwei: Klasse, Fach, Thema und Inhalt gehoeren in EINE
   Reihe - sie sind eine Kaskade, kein Stapel Einzelfelder (Murat 09.08.2026).
   Titel/Frist/Uhrzeit teilen sich die zweite Reihe im Verhaeltnis 2:1:1. */
.az-fields{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:var(--s-3);}.az-field{display:flex;flex-direction:column;gap:var(--s-1);min-width:0;}.az-field.wide{grid-column:1/-1;}
.az-field.az-titelzeile{grid-column:span 2;}
.az-field.az-fristfeld,.az-field.az-uhrfeld{grid-column:span 1;}
@media(max-width:1100px){.az-fields{grid-template-columns:repeat(2,minmax(0,1fr));}.az-field.az-titelzeile{grid-column:1/-1;}}.az-field label{font-size:var(--fs-2xs);font-weight:750;color:var(--muted);}.az-actions{display:flex;justify-content:flex-end;gap:var(--s-2);margin-top:var(--s-3);}.az-title{display:block;font-weight:800;font-size:var(--fs-md);}.az-meta{display:block;font-size:var(--fs-xs);color:var(--muted);margin-top:var(--s-1);}.az-bar{display:block;width:100px;height:5px;background:var(--line);border-radius:var(--r-pill);overflow:hidden;margin-top:var(--s-1);}.az-bar i{display:block;height:100%;background:var(--ok);}.az-empty{padding:var(--s-5);text-align:center;border:1px dashed var(--line);border-radius:var(--r-card);color:var(--muted);display:flex;flex-direction:column;align-items:center;gap:var(--s-2);}
/* Der Grund steht klein, aber er STEHT da - sonst braucht jede Stoerung den
   Server-Log (siehe openAufgabenzentrale, v2.235.1). */
.az-fehlergrund{font-size:var(--fs-xs);color:var(--muted);max-width:520px;line-height:1.5;word-break:break-word;}
.az-empty .btn{margin:0;}
/* Der zweite Satz im leeren Bereich: er sagt, was dieser Ort ist -
   frueher stand dort ein Knopf zum anderen Ort (v2.362.0). */
.az-empty-sub{font-size:var(--fs-xs);line-height:1.55;max-width:460px;color:var(--muted);}
/* .az-detail-head/.az-kinder/.az-kind sind mit v2.308.0 entfallen: der
   Fortschritt ist keine Namensliste mit Fliesstext mehr, sondern eine
   Tabelle mit Spalten (.az-tab weiter unten). Die Regeln erreichte danach
   kein Markup mehr - test_die_klassen_die_bleiben_werden_auch_benutzt. */
/* ---- Aufgabenliste als Karten (v2.236.1) --------------------------------
   Zwei bis drei je Reihe; jede Angabe hat ihren festen Platz, damit sich
   zwei Aufgaben vergleichen lassen. In einer Zeile stand alles als
   Fliesstext hintereinander und war nur zu LESEN, nicht zu ueberblicken. */
.az-karten{display:grid;grid-template-columns:repeat(auto-fill,minmax(290px,1fr));gap:var(--s-3);}
.az-karte{appearance:none;text-align:left;font:inherit;color:inherit;cursor:pointer;
  display:flex;flex-direction:column;gap:var(--s-2);border:1px solid var(--line);background:var(--card);
  border-radius:var(--r-card);padding:var(--s-4);min-width:0;}
.az-karte:hover{border-color:var(--brand);box-shadow:0 8px 22px rgba(20,28,50,.08);}
.az-k-kopf{display:flex;align-items:center;justify-content:space-between;gap:var(--s-2);}
.az-k-typ{font-size:var(--fs-2xs);font-weight:800;color:var(--brand);background:var(--brand-soft);
  border-radius:var(--r-pill);padding:var(--s-1) var(--s-2);}
.az-k-klasse{font-size:var(--fs-2xs);font-weight:750;color:var(--muted);}
.az-k-titel{font-size:var(--fs-base);font-weight:830;line-height:1.25;overflow:hidden;
  display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;}
.az-k-fach{font-size:var(--fs-2xs);color:var(--muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
/* EINZELAUFGABE (v2.589.0): die Marke "Nur für <Name>" auf der Karte und das
   feste Empfängerschild in der Maske. Beide tragen den Violett-Ton des
   Wörterbuchs – dieselbe Farbe wie die PIN im Klassenbuch, weil beides
   dasselbe meint: es geht um EIN Kind, nicht um die Klasse. */
.az-k-nur{align-self:flex-start;font-size:var(--fs-2xs);font-weight:800;color:var(--violett-ink);
  background:var(--violett-soft);border-radius:var(--r-pill);padding:var(--s-1) var(--s-2);
  max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
/* OHNE FACH (F3, v2.805.0): die Noten dieser Aufgabe zählen in keine
   Zeugnisnote. Bernstein heißt „Hinweis/Achtung" (DESIGN_SYSTEM §3.1). */
.az-k-ohnefach{align-self:flex-start;font-size:var(--fs-2xs);font-weight:800;color:var(--amber-ink);
  background:var(--amber-soft);border-radius:var(--r-pill);padding:var(--s-1) var(--s-2);white-space:nowrap;}
/* Entwurf (PLAN_PDF_ABGABE B3): Kinder sehen ihn nicht. */
.az-k-entwurf{align-self:flex-start;font-size:var(--fs-2xs);font-weight:800;color:var(--brand-dk);
  background:var(--brand-soft);border-radius:var(--r-pill);padding:var(--s-1) var(--s-2);white-space:nowrap;}
.az-nurkind{display:flex;align-items:center;gap:var(--s-1);height:42px;box-sizing:border-box;
  border:1px solid var(--violett);background:var(--violett-soft);color:var(--violett-ink);
  border-radius:var(--r-control);padding:0 11px;min-width:0;overflow:hidden;}
.az-nurkind b{font-size:var(--fs-md);font-weight:830;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.az-nurkind span{font-size:var(--fs-2xs);font-weight:750;opacity:.85;white-space:nowrap;flex:none;}
.az-k-daten{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:var(--s-1);margin-top:var(--s-1);}
.az-k-daten>span{display:flex;flex-direction:column;gap:1px;font-size:var(--fs-xs);font-weight:750;
  background:var(--paper);border-radius:var(--r-control);padding:var(--s-1) var(--s-2);min-width:0;}
.az-k-daten small{font-size:var(--fs-3xs);font-weight:800;letter-spacing:.05em;text-transform:uppercase;color:var(--muted);}
/* Dieselben Stufen wie beim Kind - beide Seiten benutzen dasselbe Wort. */
.az-k-ok{background:var(--ok-soft)!important;color:var(--ok-ink);}
.az-k-info{background:var(--brand-soft)!important;color:var(--brand-dk);}
.az-k-soon{background:color-mix(in srgb, var(--amber) 4%, var(--card))!important;color:var(--amber-ink);}
.az-k-warn{background:color-mix(in srgb, var(--amber) 14%, var(--card))!important;color:var(--amber-ink);}
.az-k-bad{background:var(--bad-soft)!important;color:var(--bad-ink);}
.az-k-frei{color:var(--muted);}
.az-k-fuss{margin-top:auto;padding-top:var(--s-2);border-top:1px solid var(--line);
  display:flex;flex-direction:column;gap:var(--s-1);}
.az-k-fuss b{font-size:var(--fs-sm);}
.az-k-fuss small{font-size:var(--fs-2xs);color:var(--muted);}
.az-k-fuss .az-bar{width:100%;}
/* Die Mitteilungs-Leiste der Aufgabenzentrale ist mit v2.242.0 entfallen -
   Durchsagen leben vollstaendig in den Nachrichten (.pf-klwahl, .pf-klkachel).
   Wer sie hier wieder einbaut, hat zwei Orte fuer dieselbe Sache. */
.az-section-label{font-size:var(--fs-2xs);text-transform:uppercase;letter-spacing:.08em;font-weight:800;color:var(--muted);margin:var(--s-5) 0 var(--s-2)}
/* VERLAUF: abgelaufene UND geschlossene Aufgaben. Sie verschwinden NICHT -
   die Lehrkraft muss nachlesen koennen, wer abgegeben hat, und wer nichts
   abgegeben hat, bekommt seine Note aus genau diesem Eintrag.
   Von v2.306.0 bis v2.307.0 war der Verlauf ein zugeklappter Abschnitt UNTER
   der laufenden Liste; seit v2.308.0 ist er ein eigener Ort hinter dem Knopf
   in der Leiste (azVerlaufUm) - die Aufklapp-Regeln hier sind deshalb weg.
   Geblieben ist die blassere Karte: man soll auf einen Blick sehen, dass
   hier nichts mehr zu tun ist. */
.az-karte-alt{opacity:.72}
.az-karte-alt:hover{opacity:1}
/* ===== DIE GEOEFFNETE AUFGABE (v2.308.0) =================================
   Befund Murat 19.08.2026: "ögretmen aufgabenin icine girince ... detayli
   sekilde notlarinin her tipi gözükmelidir. listeme tipi kullanalim
   spalteleriyle birlikte." Deshalb steht hier eine TABELLE statt der
   frueheren Kachelliste: eine Klasse hat 25 Kinder, und wer sucht, wer noch
   nicht abgegeben hat, liest eine Spalte hinunter - nicht 25 Absaetze.
   Die Nummer vorne ist die Zeilennummer, nicht die Schueler-ID.
   Ueber der Tabelle sitzt EINE Leiste mit dem Zurueck-Knopf (ein Knopf, kein
   Text - Befund derselbe Tag) und den Handgriffen Bearbeiten/Beenden. Die
   Toolbar der Uebersicht (Klassenwahl, "Neue Aufgabe") wird waehrenddessen
   ausgeblendet: sie gehoert zur Liste, nicht zur einzelnen Aufgabe.
   VERBUNDEN MIT: azDetailHtml/azToolbarZeigen (index-app.js),
   hausaufgabe_fortschritt (hausaufgaben.py). */
.az-detail-bar{display:flex;align-items:center;gap:var(--s-3);flex-wrap:nowrap;
  padding-bottom:var(--s-3);margin-bottom:var(--s-3);border-bottom:1px solid var(--line);}
.az-detail-titel{flex:1;min-width:160px;}
.az-detail-titel .az-title{font-size:var(--fs-lg);font-weight:830;line-height:1.25;}
.az-detail-titel .az-meta{font-size:var(--fs-xs);color:var(--muted);margin-top:1px;}
.az-detail-tools{display:flex;gap:var(--s-2);flex-wrap:wrap;justify-content:flex-end;}
/* Die Handgriffe sind KLEIN und stehen in EINER Reihe mit dem Titel (Befund
   Murat 24.09.2026: „daha küçük textli … tek satır olmalı iki değil"). `.btn`
   ist global volle Breite - deshalb hier `width:auto`. Farbe: Akzent-Abschnitt. */
.az-detail-bar .btn{margin:0;width:auto;flex:none;padding:var(--s-1) var(--s-3);min-height:32px;
  font-size:var(--fs-sm);font-weight:750;border-radius:var(--r-control);white-space:nowrap;}
.az-zurueck{margin:0;flex:none;}
.az-detail-zahl{font-size:var(--fs-sm);font-weight:750;color:var(--muted);margin:0 0 var(--s-2);}
.az-tab-wrap{overflow-x:auto;border:1px solid var(--line);border-radius:var(--r-card);background:var(--card);}
.az-tab{width:100%;border-collapse:collapse;font-size:var(--fs-sm);}
.az-tab th{text-align:left;font-size:var(--fs-3xs);text-transform:uppercase;letter-spacing:.06em;
  font-weight:800;color:var(--muted);background:var(--paper);padding:var(--s-2) var(--s-3);
  white-space:nowrap;border-bottom:1px solid var(--line);}
.az-tab td{padding:var(--s-2) var(--s-3);border-bottom:1px solid var(--line);
  vertical-align:top;white-space:nowrap;}
.az-tab tr:last-child td{border-bottom:0;}
.az-tab .az-nr{width:var(--s-6);color:var(--muted);font-weight:750;text-align:right;
  padding-right:var(--s-1);}
.az-td-name{font-weight:800;white-space:normal;}
.az-status{display:inline-block;font-size:var(--fs-2xs);font-weight:800;
  border-radius:var(--r-pill);padding:var(--s-1) var(--s-2);}
.az-st-offen{background:color-mix(in srgb, var(--amber) 14%, var(--card));color:var(--amber-ink);}
.az-st-fertig{background:var(--ok-soft);color:var(--ok-ink);}
/* Die Zustaende je Kind (v2.875.0, azZustandHtml): offen/entschuldigt neutral,
   in Arbeit/Nachfrist Markenblau, ueberfaellig Rot - nur Variablen. */
.az-st-neutral{background:var(--line);color:var(--muted);}
.az-st-arbeit{background:var(--brand-soft);color:var(--brand);}
.az-st-warn{background:var(--bad-soft);color:var(--bad-ink);}
.az-fehlen{color:var(--bad-ink);}
.az-hinweis{font-size:var(--fs-xs);color:var(--muted);margin:0 0 var(--s-2);}
.az-nachtrag{display:flex;gap:var(--s-2);align-items:center;flex-wrap:wrap;
  font-size:var(--fs-xs);color:var(--muted);margin:0 0 var(--s-2);}
.az-nachtrag select{width:auto;margin:0;}
/* Die automatische 6 des Altbestands (v2.877.0) und die Entscheidung je Kind
   (azEntscheidungDialog) - nur Variablen. Die Auswahl sind Radioknoepfe im
   Fenster der Aufgabenzentrale; `.az-modal-body input` machte sie sonst
   seitenbreit. */
.az-auto6{font-weight:700;color:var(--amber-ink);}
.az-auto6-hinweis{color:var(--amber-ink);}
.aze-stand{margin:0 0 var(--s-2);font-size:var(--fs-sm);color:var(--ink);}
.aze-warn{margin:0 0 var(--s-3);font-size:var(--fs-xs);color:var(--amber-ink);
  background:var(--amber-soft);border-radius:var(--r-control);padding:var(--s-2) var(--s-3);}
.aze-wahl{display:flex;flex-direction:column;gap:var(--s-1);}
.az-modal-body .aze-opt{display:flex;align-items:center;gap:var(--s-2);font-size:var(--fs-sm);
  font-weight:650;color:var(--ink);cursor:pointer;padding:var(--s-1) 0;}
.az-modal-body .aze-opt input{width:auto;margin:0;flex:none;}
.aze-aus{opacity:.5;cursor:default;}
.aze-zusatz{margin:0 0 var(--s-2) var(--s-5,28px);}
.az-modal-body .aze-zusatz select,.az-modal-body .aze-zusatz input{width:auto;max-width:100%;}
.aze-hinweis{margin:var(--s-3) 0 var(--s-2);font-size:var(--fs-xs);color:var(--muted);}
.az-modal-body .aze-entfernen{display:flex;align-items:center;gap:var(--s-2);font-weight:700;
  color:var(--bad-ink);margin:var(--s-2) 0;}
.az-modal-body .aze-entfernen input{width:auto;margin:0;}
.aze-verlauf{margin-top:var(--s-3);font-size:var(--fs-xs);color:var(--muted);}
.aze-verlauf-titel{font-weight:800;color:var(--ink);margin-bottom:var(--s-1);}
.az-td-note{font-weight:800;}
/* Grundton hier bleibt das Markenblau; die Wunschfarbe der Lehrkraft setzt
   sich weiter unten im Abschnitt "Akzent aus der Flaechenfarbe" darueber -
   dort steht die vollstaendige Liste, und nur dort darf sie stehen. */
.az-mini{appearance:none;font:inherit;font-size:var(--fs-2xs);font-weight:800;cursor:pointer;
  border:1px solid var(--brand);border-radius:var(--r-pill);padding:var(--s-1) var(--s-2);
  background:var(--card);color:var(--brand);}
.az-tr-antwort td{padding-top:0;white-space:normal;}
.az-tr-antwort p{margin:0 0 var(--s-1);padding:var(--s-2) var(--s-3);background:var(--paper);
  border-radius:var(--r-control);white-space:pre-wrap;line-height:1.5;font-size:var(--fs-xs);}
/* Das kleine Fenster der Aufgabenzentrale (azModalOeffnen). Eigener Baustein,
   weil die App keinen gemeinsamen hat - kzModal und pwhBoardModal daneben. */
.az-ov{position:fixed;inset:0;z-index:1400;background:rgba(16,22,40,.44);
  display:flex;align-items:center;justify-content:center;padding:var(--s-4);}
.az-modal{background:var(--card);border:1px solid var(--line);border-radius:var(--r-panel);
  width:min(560px,100%);max-height:88vh;display:flex;flex-direction:column;
  box-shadow:var(--e-3);}
.az-modal-kopf{display:flex;align-items:center;justify-content:space-between;gap:var(--s-3);
  padding:var(--s-3) var(--s-4);border-bottom:1px solid var(--line);}
/* `.btn` ist global volle Breite - im Kopf fraß „Schließen" die Zeile
   (830 von 980 px) und der Titel brach um. */
.az-modal-kopf .btn{margin:0;width:auto;flex:none;}
.az-modal-body{padding:var(--s-4);overflow:auto;}
.az-modal-body .az-fields{grid-template-columns:repeat(2,minmax(0,1fr));}
.az-modal-body input,.az-modal-body textarea{width:100%;box-sizing:border-box;font:inherit;
  border:1px solid var(--line);border-radius:var(--r-control);background:var(--card);
  color:var(--ink);padding:var(--s-2) var(--s-3);}
.az-modal-body label{font-size:var(--fs-xs);font-weight:750;color:var(--muted);}
.az-modal-fuss{display:flex;justify-content:flex-end;gap:var(--s-2);
  padding:var(--s-3) var(--s-4);border-top:1px solid var(--line);}
.az-modal-fuss .btn{margin:0;}
/* Gruppen bilden (PLAN_PDF_ABGABE B10): breiteres Fenster, Spalten zum
   Hineintippen - erst das Kind, dann die Gruppe. Keine Leistungswerte, keine
   eigenen Gruppennamen (§8 Nr. 2). Die Arbeitsform im Formular sind zwei
   Radioknoepfe - `.az-form input` wuerde sie sonst 42 px hoch und voll breit
   ziehen. */
.az-modal.breit{width:min(980px,100%);}
.az-arbeitsform{display:flex;gap:var(--s-4);align-items:center;min-height:42px;flex-wrap:wrap;}
.az-arbeitsform label{display:inline-flex;align-items:center;gap:var(--s-1);font-weight:650;color:var(--ink);cursor:pointer;}
.az-form .az-arbeitsform input{width:auto;min-width:0;height:auto;min-height:0;padding:0;margin:0;}
.az-g-regler{display:flex;flex-wrap:wrap;gap:var(--s-3);align-items:flex-end;margin:0 0 var(--s-3);}
.az-g-regler label{display:flex;flex-direction:column;gap:var(--s-1);}
.az-modal-body .az-g-regler input{width:96px;}
.az-g-getrennt{display:flex;flex-wrap:wrap;gap:var(--s-2);align-items:center;margin:0 0 var(--s-3);font-size:var(--fs-sm);}
.az-g-getrennt select{width:auto;max-width:200px;}
.az-g-paar{display:inline-flex;align-items:center;gap:var(--s-1);padding:var(--s-1) var(--s-2);border-radius:var(--r-pill);
  background:var(--paper);border:1px solid var(--line);}
.az-g-weg{appearance:none;border:0;background:none;font:inherit;cursor:pointer;color:var(--muted);padding:0 var(--s-1);}
.az-g-spalten{display:grid;grid-template-columns:repeat(auto-fill,minmax(170px,1fr));gap:var(--s-3);}
.az-g-spalte{display:flex;flex-direction:column;gap:var(--s-2);min-height:96px;padding:var(--s-2);border:1px solid var(--line);
  border-radius:var(--r-card);background:var(--card);cursor:pointer;}
.az-g-spalte > b{font-size:var(--fs-sm);}
.az-g-spalte small{font-size:var(--fs-2xs);color:var(--muted);margin-top:calc(-1 * var(--s-1));}
.az-g-spalte.ohne{background:var(--paper);}
.az-g-neu{appearance:none;font:inherit;align-items:center;justify-content:center;color:var(--muted);border-style:dashed;}
.az-g-kind{appearance:none;font:inherit;font-size:var(--fs-sm);text-align:left;padding:var(--s-2);
  border-radius:var(--r-control);border:1px solid var(--line);background:var(--card);color:var(--ink);cursor:pointer;}
.az-g-kind.an{background:var(--brand-soft);border-color:var(--brand);color:var(--brand-dk);}
span.az-g-kind{cursor:default;}
.az-g-hier{appearance:none;font:inherit;font-size:var(--fs-xs);font-weight:650;padding:var(--s-2);
  border:1px dashed var(--brand);border-radius:var(--r-control);background:transparent;color:var(--brand-dk);cursor:pointer;}
.az-g-hinweis{font-size:var(--fs-xs);color:var(--muted);margin:var(--s-3) 0 0;}
/* `.btn` ist global volle Breite - im Regler stehen die Knoepfe neben den Feldern. */
.az-g-regler .btn,.az-g-getrennt .btn{width:auto;margin:0;}
@media(max-width:640px){.az-detail-bar{flex-wrap:wrap}.az-toolbar{align-items:stretch;flex-direction:column}.az-toolbar-filter{flex-direction:column;width:100%}.az-toolbar select{width:100%;max-width:none}.az-toolbar-actions{width:100%}.az-tool-btn{flex:1;padding:0 var(--s-3)}.az-fields{grid-template-columns:1fr}.az-bar{width:100%}.az-modal-body .az-fields{grid-template-columns:1fr}.az-detail-tools{width:100%}.az-detail-tools .btn{flex:1}.az-tab td,.az-tab th{padding:var(--s-2)}.sl-message-banner{align-items:flex-start;flex-direction:column;gap:var(--s-1)}.sl-message-banner strong{white-space:normal}.sl-message-head{align-items:flex-start;flex-direction:column;gap:var(--s-1)}}

.az-form option:disabled{color:var(--muted);background:var(--paper)}
/* ===== AUFGABE IM RAHMEN: der Inhalt bekommt die Flaeche (v2.240.0) =====
   Befund Murat 09.08.2026: unten stand eine grosse leere Flaeche, waehrend
   Kopfzeile und Knopf sich oben draengten. Jetzt fuellt der Rahmen die Hoehe
   und der Abgeben-Knopf klebt unten - dort ist auf dem Telefon der Daumen,
   und es ist der letzte Schritt, nicht der erste. */
/* DIE 132 PX SIND WEG (v2.332.0, Befund Murat 19.08.2026: „o anki acilan
   görünür bölgeye sigmali her zaman"). Sie waren geraten und deckten den
   echten Ueberbau nicht ab - Panel-Rand, Kopfzeile, `#sl-work-head` mit dem
   Aufgabentitel, die Titelzeile des Rahmens. Der Rahmen wurde hoeher als der
   freie Platz, die Seite wuchs ueber einen Bildschirm hinaus, und die
   Fertig-Leiste des Lernberichts (`.ha-fertig`, im Rahmen `position:fixed`)
   lag unter dem sichtbaren Rand.
   Jetzt nimmt der Rahmen, was uebrig ist - gemessen vom Layout, nicht
   geraten. Die Hoehe der Kette setzt `body.sl-rahmen` weiter unten. */
/* DIE BUECHEREI STEHT AUF WEISS, NICHT AUF GRAU (v2.342.0).
   `.sl-task-frame` traegt `--paper` - richtig fuer eine AUFGABE, die wie ein
   Blatt auf der Unterlage liegt. Die Buecherei ist aber keine Aufgabe,
   sondern eine Seite; ihre Karten stehen selbst auf Weiss, und der graue
   Streifen dazwischen sah aus wie ein Ladefehler (Befund Murat 20.08.2026:
   „arkaplanida gri ya, beyaz olsa ya orasi").
   BEWUSST NUR HIER: die Grundregel bleibt, wie sie ist - fuer Hausaufgaben,
   Pinnwand und Lautlesezeit war sie nie falsch (CLAUDE.md: schmal aendern
   heisst SCHMAL aendern, und dasselbe gilt fuer einen einzelnen Fall). */
.sl-bib-rahmen .sl-task-frame{background:var(--card);}

.sl-detail-frame{display:flex;flex-direction:column;min-height:0;
  flex:1 1 auto;height:auto;}
.sl-detail-frame .sl-task-frame{flex:1;height:auto;min-height:0;}
/* Die Pinnwand bringt ihren eigenen Kopf mit - hier bleibt nur das Board. */
.sl-detail-blank .sl-task-frame{border-radius:var(--r-card);}
.sl-frame-fuss{flex:none;padding-top:var(--s-3);display:flex;justify-content:flex-end;}
.sl-frame-fuss .btn{min-height:48px;padding-left:26px;padding-right:26px;}
@media(max-width:720px){
  /* Die zweite geratene Zahl (112 px) ist aus demselben Grund weg - auf dem
     Telefon war der Fehler nur groesser, weil dort weniger Platz uebrig ist. */
  .sl-frame-fuss .btn{width:100%;}
}

/* ===== RAHMEN-MODUS: die Aufgabe passt IMMER auf einen Bildschirm ==========
   Gesetzt von `slRahmenModus()` (index-app.js), solange eine Aufgabe im
   Rahmen offen ist - Quiz, Lernbericht, Lautlesezeit, Spiel, Pinnwand.

   WARUM EINE KETTE UND KEINE RECHNUNG: Jede Zahl, die den Ueberbau schaetzt,
   ist beim naechsten Zusatz oben falsch - genau so ist dieser Fehler
   entstanden. Die Kette Panel -> Bildschirm -> Karte -> Inhalt ist eine
   Flex-Spalte von genau einem Bildschirm Hoehe; der Rahmen bekommt den Rest.
   Gescrollt wird NUR im Rahmen.
   Dasselbe Muster wie `body.has-sidebar[data-screen="upload"]` (v2.30.4);
   wer eines aendert, sollte das andere ansehen.

   NUR FUER RAHMEN-AUFGABEN: Die Textaufgabe hat keinen Rahmen und darf mit
   der Seite wachsen - dort ist ein langes Antwortfeld richtig. */
body.sl-rahmen .wrap{
  height:var(--vh100); min-height:0; max-height:var(--vh100);
  overflow:hidden; display:flex; flex-direction:column;
}
body.sl-rahmen .app-topbar{ flex:none; }
body.sl-rahmen #screen-schuelerbereich{
  flex:1 1 auto; min-height:0; display:flex; flex-direction:column;
}
body.sl-rahmen .sl-work-card{
  flex:1 1 auto; min-height:0; display:flex; flex-direction:column;
}
body.sl-rahmen #sl-work-head{ flex:none; }
body.sl-rahmen #sl-work-content{
  flex:1 1 auto; min-height:0; display:flex; flex-direction:column;
}
/* Mit Seitenleiste ist das Panel nicht der ganze Bildschirm, sondern der
   Bildschirm minus der Raender, mit denen die Leiste buendig steht. */
@media(min-width:900px){
  body.sl-rahmen.has-sidebar:not(.lh-fullscreen) .wrap{
    height:calc(var(--vh100) - var(--shell-top,16px) - var(--shell-bot,16px));
    max-height:calc(var(--vh100) - var(--shell-top,16px) - var(--shell-bot,16px));
  }
}
.az-field small{min-height:16px;color:var(--muted);font-size:11.5px;line-height:1.35}
/* Ein leerer Hinweis (z. B. der Upload-Status vor dem Hochladen) nimmt keinen Platz. */
.az-field small:empty{display:none}

/* ---- Filter-Leiste „neue Abgaben" im Klassenbuch (v2.53.0) ---------------
   Steht ÜBER der Klassentabelle, wenn man über einen Deep-Link aus „Meine
   Aufgaben" bzw. dem Cockpit gekommen ist. Sie ist PFLICHT, sobald gefiltert
   wird: eine Tabelle, in der ohne Ansage vier von sieben Kindern fehlen,
   sieht aus wie ein Datenverlust, nicht wie ein Filter.
   MIT WEM: kbxClassTable()/kbNeuFilterAus() in index-app.js. */
.kbx-tablewrap .kbx-neubar{display:flex;align-items:center;gap:var(--s-3);margin:0 0 var(--s-3);
  padding:var(--s-2) var(--s-4);border:1px solid var(--ok);border-radius:var(--r-control);
  background:var(--ok-soft,rgba(21,160,90,.08));}
.kbx-tablewrap .kbx-neubar svg{flex:none;width:16px;height:16px;fill:none;stroke:var(--ok);
  stroke-width:2.2;stroke-linecap:round;stroke-linejoin:round;}
.kbx-tablewrap .kbx-neubar span{flex:1;min-width:0;font-size:var(--fs-sm);color:var(--ink);}
.kbx-tablewrap .kbx-neubar b{font-weight:750;}
.kbx-tablewrap .kbx-neubar button{flex:none;border:1px solid var(--line);border-radius:var(--r-pill);
  background:var(--card);color:var(--ink);cursor:pointer;padding:var(--s-1) var(--s-3);font:650 12px inherit;}
.kbx-tablewrap .kbx-neubar button:hover{border-color:var(--ink);}
.kbx-tablewrap .kbx-neubar button:focus-visible{outline:2px solid var(--brand);outline-offset:2px;}

/* ---- Rückgängig-Zeile nach dem Ausblenden (v2.53.0) ----------------------
   Erscheint unter der Kopfzeile der Karte "Meine Aufgaben", sobald eine Zeile
   ausgeblendet wurde. Sie ist der EINE Satz, der erklärt, was gerade passiert
   ist – deshalb steht sonst nirgends in der Karte ein Erklärabsatz.
   MIT WEM: renderTodo()/todoRueckgaengig() in index-app.js. */
.ck2-todo .ck2-undo{display:flex;align-items:center;gap:9px;padding:9px 16px;
  border-top:1px solid rgba(127,127,127,.1);background:var(--paper,#F4F5F9);}
.ck2-todo .ck2-undo svg{flex:none;width:15px;height:15px;fill:none;stroke:var(--muted);
  stroke-width:2.55;stroke-linecap:round;stroke-linejoin:round;}
.ck2-todo .ck2-undo span{flex:1;min-width:0;font-size:12px;color:var(--muted);}
.ck2-todo .ck2-undo button{flex:none;border:0;background:none;cursor:pointer;padding:2px 4px;
  color:var(--brand);font:700 12px inherit;text-decoration:underline;text-underline-offset:2px;}
.ck2-todo .ck2-undo button:focus-visible{outline:2px solid var(--brand);outline-offset:2px;border-radius:6px;}

/* ---- Zwei Einstiege in "Meine Aufgaben" (v2.53.0) ------------------------
   Vorher hing die volle Ansicht an einem kleinen Pillen-Knopf rechts oben.
   Jetzt sind die ganze Kopfzeile und eine breite Fußzeile der Weg dorthin;
   ein eigener Menüpunkt kam bewusst nicht in Frage (Namenskollision mit
   "Aufgaben" = Material im Seitenmenü).
   MIT WEM: renderTodo() in index-app.js, openMeineAufgaben() in
   index-aufgaben.js. */
.ck2-todo .ck2-todo-head{justify-content:flex-start;cursor:pointer;
  border-radius:14px 14px 0 0;transition:background .12s;}
.ck2-todo .ck2-todo-head:hover{background:var(--paper,#F4F5F9);}
.ck2-todo .ck2-todo-head:focus-visible{outline:2px solid var(--brand);outline-offset:-2px;}
.ck2-todo .ck2-todo-hico{flex:none;width:16px;height:16px;fill:none;stroke:var(--brand);
  stroke-width:2;stroke-linecap:round;stroke-linejoin:round;}
.ck2-todo .ck2-todo-hchev{margin-left:auto;}
.ck2-todo .ck2-todo-foot{display:flex;width:100%;align-items:center;justify-content:center;gap:7px;
  padding:11px 16px;border:0;border-top:1px solid rgba(127,127,127,.1);
  background:var(--paper,#F4F5F9);color:var(--brand);cursor:pointer;
  font:700 13px inherit;transition:background .12s;}
.ck2-todo .ck2-todo-foot:hover{background:var(--brand-soft,rgba(0,113,227,.1));}
.ck2-todo .ck2-todo-foot:focus-visible{outline:2px solid var(--brand);outline-offset:-2px;}
.ck2-todo .ck2-todo-foot svg{width:15px;height:15px;fill:none;stroke:currentColor;
  stroke-width:2.55;stroke-linecap:round;stroke-linejoin:round;}

/* ---- Aufbewahrungs-Fenster: ein Satz + aufklappbares „i" ------------------
   Vorher stand dort ein fünfzeiliger Absatz, den niemand liest, und es gab
   NUR „verlängern" – wer die Unterlagen nicht mehr braucht, hatte keinen Weg
   (Entscheidung Murat 2026-07). */
.vw-i{margin-left:7px;width:19px;height:19px;border-radius:50%;border:1.5px solid var(--line);
  background:var(--card);color:var(--muted);font:700 12px/1 inherit;cursor:pointer;
  display:inline-flex;align-items:center;justify-content:center;vertical-align:baseline;padding:0;}
.vw-i:hover, .vw-i.on{border-color:var(--brand);color:var(--brand);background:var(--brand-soft);}
.vw-abl-mehr-info{font-size:12.5px;line-height:1.6;color:var(--muted);
  background:var(--paper);border-radius:11px;padding:11px 13px;margin:0 0 12px;}
.vw-abl-mehr-info[hidden]{display:none;}
.vw-abl-grp-h .vw-abl-ok{border-color:var(--line);color:var(--muted);}
.vw-abl-grp-h .vw-abl-ok:hover{border-color:var(--ink);color:var(--ink);}

/* ===========================================================================
   AUSWAHLFELD (static/js/index-auswahl.js)
   Ein Eingabefeld, das sich wie ein <select> öffnet, aber Tippen erlaubt.
   Anlass: Rückmeldung Murat 27.07.2026 – das Thema-Feld war ein <datalist>
   und sah neben dem Fach-<select> aus wie ein totes Textfeld.
   Der Pfeil ist DERSELBE wie in `.fpk select` (gleiches SVG, gleiche Größe),
   damit beide Felder nebeneinander nicht zu unterscheiden sind.
=========================================================================== */
.ss-aus{position:relative;display:block;width:100%;}
.ss-aus>input{width:100%;padding-right:20px !important;cursor:pointer;}
/* Der Pfeil ist ein eigener Knopf statt eines Hintergrundbildes: so ist er
   auch dann anklickbar, wenn das Feld schon Text enthält. */
.ss-aus-pfeil{position:absolute;right:0;top:50%;transform:translateY(-50%);
  width:20px;height:20px;padding:0;border:none;background:transparent;cursor:pointer;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%237A8194' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");
  background-repeat:no-repeat;background-position:center;background-size:15px;
  transition:transform .15s;}
.ss-aus-auf .ss-aus-pfeil{transform:translateY(-50%) rotate(180deg);}
/* ABGELEHNTE EINGABE (v2.335.0): das strenge Feld hat einen Wert geleert, der
   nicht in der Liste stand. Kurz rot statt einer Meldung - eine Meldung waere
   ein Kasten, den man wegklicken muss, fuer etwas, das man am Feld selbst
   sieht. Verbunden mit: static/js/index-auswahl.js ssAusStrengPruefen(). */
.ss-aus-abgelehnt input{border-color:var(--bad)!important;
  box-shadow:0 0 0 3px color-mix(in srgb,var(--bad) 22%,transparent);}
/* Die Liste hängt an <body> (das Optionen-Fenster scrollt und würde sie
   abschneiden), deshalb feste Positionierung und ein hoher z-Index. */
.ss-aus-panel{position:fixed;z-index:9000;overflow-y:auto;background:var(--card,#fff);
  border:1.5px solid var(--line);border-radius:12px;
  box-shadow:0 12px 30px rgba(15,20,35,.16);padding:5px;}
.ss-aus-opt{padding:8px 10px;border-radius:8px;font-size:var(--fs-md);font-weight:600;
  color:var(--ink);cursor:pointer;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.ss-aus-opt:hover,.ss-aus-akt{background:rgba(109,91,255,.10);color:#4B3FD8;}
.ss-aus-panel-material .ss-aus-opt{white-space:normal;overflow:visible;text-overflow:clip;
  overflow-wrap:anywhere;font-size:13px;line-height:1.45;padding:9px 12px;}
.ss-aus-leer{padding:9px 10px;font-size:13px;color:var(--muted);}

/* ===== Akzent aus der Flaechenfarbe (2.87.0) ==============================
   WORUM ES GEHT: waehlt die Lehrkraft eine Flaechenfarbe, sollen die
   Bedienelemente dazu passen – ein blauer Knopf auf einer Salbei-Flaeche sieht
   aus wie ein Fremdkoerper. Die drei Toene kommen aus `ssAkzentSetzen()`
   (index-app.js) und haben denselben Farbton wie die Flaeche:
     --flaeche-akzent       Fuellung, traegt weisse Schrift (Kontrast gerechnet)
     --flaeche-akzent-soft  Hauch hinter einem aktiven Eintrag
     --flaeche-akzent-ink   Schrift auf diesem Hauch

   DIESER ABSCHNITT IST DIE VOLLSTAENDIGE LISTE. Wer den Akzent an einer
   weiteren Stelle haben will, traegt sie HIER ein – nicht verstreut im
   Stylesheet. `qa/unit/test_flaeche_akzent.py` zaehlt die Regeln und schlaegt
   an, wenn die Liste hier und der Test auseinanderlaufen.

   WAS BEWUSST NICHT DAZUGEHOERT und auch nicht dazukommen soll:
   - Die Bedeutungsfarben bleiben unabhängig; seit v2.930.0 folgt hingegen
     die allgemeine Marke über :root dem gewählten Flächenakzent.
   - Die BEDEUTUNGSFARBEN `--ok` (gruen = richtig), `--bad` (rot = falsch),
     `--amber` (Hinweis). Ein gruener Akzent, der neben einem gruenen
     „richtig" steht, macht die Rueckmeldung mehrdeutig – und die ist der Kern
     einer Lern-App. Deshalb bleiben `.btn.ok`, `.btn.sub` und `.btn.ghost`
     ausgenommen.
   - Alles im dunklen Design: `ssAkzentSetzen()` loescht die Variablen dort,
     die Regeln fallen dann auf `var(--brand)` zurueck.

   DER FALLBACK IST DIE SICHERUNG: ohne gewaehlte Farbe (oder bei einem zu
   blassen Wunschton) sind die Variablen nicht gesetzt und jede Regel hier
   liefert exakt den Markenton – also genau das Bild von vorher. */

/* 1) Der Hauptknopf. Ausgenommen sind die drei Sonderfassungen: `ghost` ist
      weiss umrandet, `sub` ist bewusst tintenfarben, `ok` traegt die
      Bedeutungsfarbe Gruen. */
.btn:not(.ghost):not(.sub):not(.ok){ background:var(--flaeche-akzent,var(--brand)); }
/* Der dunklere Hover-Ton entsteht als schwarze Auflage UEBER der Fuellfarbe.
   So funktioniert er mit jedem Farbton, ohne dass je Farbe ein zweiter Wert
   gepflegt werden muesste (dasselbe Prinzip wie die helle Auflage bei
   .ss-glas, nur andersherum). */
.btn:not(.ghost):not(.sub):not(.ok):hover{
  background:linear-gradient(rgba(0,0,0,.13),rgba(0,0,0,.13)),var(--flaeche-akzent,var(--brand-dk));}
/* 2) Aktives Segment im Umschalter. */
.seg button.on{ background:var(--flaeche-akzent,var(--brand)); }
/* 3) Eingeschalteter Schalter (Bedienungshilfen, Einstellungen). */
.kswitch input:checked + .ksl{ background:var(--flaeche-akzent,var(--brand)); }
/* 4) Aktiver Eintrag der Seitenleiste – seit v2.283.0 die VOLLE Fuellung,
      nicht mehr der Hauch.

      WARUM DER WECHSEL: die alte Paarung war Hauch + farbige Schrift, und die
      erreichte im Rueckfall (--brand auf --brand-soft) 4.47:1 – knapp unter
      der Schriftschwelle 4.5. Die Fuellung dagegen IST auf weisse Schrift
      gerechnet: `ssAkzentSetzen()` dunkelt `--flaeche-akzent` so lange ab, bis
      4.5:1 gegen Weiss stehen (index-app.js, ssDunkelnBis). Der Eintrag wird
      also lesbarer, nicht nur anders.

      WARUM DIE AUFLAGE NUR ABDUNKELT: der schraege Verlauf ist der Rest des
      erhabenen Eindrucks – Licht von oben links, Schatten nach unten rechts.
      Eine AUFHELLENDE Auflage waere hier gefaehrlich: sie wuerde genau die
      Rechnung von oben nach unten druecken, und aus 4.5:1 wuerden 4.2:1.
      Schwarz mit Deckkraft kann den Kontrast gegen Weiss nur VERBESSERN –
      dieselbe Ueberlegung wie beim Hover des Hauptknopfs, nur andersherum
      begruendet. Die weiche Tiefe selbst steht beim Bauteil (Abschnitt
      SEITENLEISTE), hier steht ausschliesslich die Farbe. */
/* ⛔ DIE REITERLEISTE DER SCHULVERWALTUNG (Ansage Murat 06.09.2026:
   „bastaki menü rengi hala mavi"). Sie steht ueber allem und war die letzte
   grosse Flaeche im Marken-Blau, waehrend die Knoepfe darunter schon der
   Schale folgten. Sie steht HIER und nicht bei `.adm-tab` oben, weil dieser
   Abschnitt die vollstaendige Liste aller Stellen mit Akzent ist -
   qa/unit/test_flaeche_akzent.py zaehlt sie. */
.adm-tab.active{ color:var(--flaeche-akzent, var(--brand)); }
/* ⛔ DER GEFUELLTE VERWALTUNGSKNOPF (Ansage Murat 06.09.2026: „Schüler
   verzeichnisteki + hinzufügende mavi"). `.ss-btn.pri` ist der Zwilling von
   `.btn` in den Verwaltungslisten – „+ hinzufügen", „Speichern", „Einladen" –
   und war der letzte gefuellte Knopf im Marken-Blau, waehrend alles um ihn
   herum schon der Schale folgte. Der Hover entsteht wie beim Hauptknopf als
   schwarze Auflage, damit er mit jedem Farbton stimmt und kein zweiter Wert
   je Farbe gepflegt werden muss. Der Rand geht mit: bliebe er blau, saesse um
   die Fuellung ein blauer Faden. */
.ss-btn.pri{ background:var(--flaeche-akzent,var(--brand));
  border-color:var(--flaeche-akzent,var(--brand)); }
.ss-btn.pri:hover{
  background:linear-gradient(rgba(0,0,0,.13),rgba(0,0,0,.13)),var(--flaeche-akzent,var(--brand-dk));
  border-color:var(--flaeche-akzent,var(--brand-dk)); }
/* Und der leere Zwilling beim Zeigen – ein blauer Rand auf einer Salbei-
   Flaeche ist derselbe Fremdkoerper, nur duenner. */
.ss-btn:hover{ border-color:var(--flaeche-akzent,var(--brand));
  color:var(--flaeche-akzent,var(--brand)); }
#app-sidebar .sb-linse{
  background:linear-gradient(145deg, rgba(0,0,0,0), rgba(0,0,0,.20)),
             var(--flaeche-akzent,var(--brand));}
#app-sidebar .sb-item.on{ color:var(--on-brand);}
/* v2.921.0 – der Tropfen der schwebenden Kapsel (Telefon, Tablet hochkant).
   Er sagt dasselbe wie die Linse der Seitenleiste: „hier bist du". Der helle
   Fleck oben links macht ihn zur Kugel statt zur Scheibe. */
#ml-leiste .ml-blase{
  background:radial-gradient(circle at 35% 28%, rgba(255,255,255,.34), rgba(255,255,255,0) 46%),
             var(--flaeche-akzent,var(--brand));}
/* SchlauHeft folgt der gewaehlten Flaechenfarbe; freie Tage bleiben rot. */
#screen-kalender .kal-datumfeld-tag .kal-datumtext strong,
#screen-kalender .kh-startsymbol{color:var(--flaeche-akzent,var(--brand));}
body.kal-titel-aus #kal-bar .kal-seg.kal-views button.on{
  background:var(--flaeche-akzent-soft,var(--brand-soft));
  color:var(--flaeche-akzent-ink,var(--brand));}
body.kal-titel-aus .kal-flach:hover,#screen-kalender .kal-blattern button:hover{
  color:var(--flaeche-akzent,var(--brand));}
/* 5) ZEIGEN UND STRUKTUR IN LISTEN (v2.143.0, Wunsch Murat 05.08.2026:
      „arkaplanim mor ya … o renkte olsa. bunu klasiklestirmek lazim tüm site
      icin"). Das Grau beim Ueberfahren war neutral, aber es war auch fremd:
      Wer sich Lavendel eingestellt hat, bekam ein Blaugrau.

      ZWEI STAERKEN, WEIL ES ZWEI AUSSAGEN SIND – das ist die Regel, an der
      sich kuenftige Zeilen hier orientieren sollen:
        -soft  (0.88)   „hier zeigt die Maus hin" bzw. „das ist ausgewaehlt"
        -hauch (0.965)  reine STRUKTUR, behauptet nichts (Zebra)
      Ein Streifenmuster in Auswahlstaerke laese sich, als waere die halbe
      Liste markiert.

      DIE `:not()` SIND KEIN SCHMUCK: Dieser Abschnitt steht am Dateiende,
      also NACH `.kbx-row:hover td` und `.kbx-row.open td` (~Zeile 615). Ohne
      die Ausnahmen wuerde das Zebra beide ueberstimmen – auf jeder zweiten
      Zeile gaebe es dann weder Hover- noch Aufklapp-Anzeige. Die Wirkung
      haengt hier also NICHT an der Reihenfolge, sondern steht im Selektor.

      Der Rueckfall haelt beides unveraendert, wenn keine Farbe gewaehlt ist –
      und im dunklen Design, wo `ssAkzentSetzen()` die Variablen loescht. */
.kbx-row.kbx-zebra:not(.open):not(:hover) td{
  background:var(--flaeche-akzent-hauch,#FAFBFE);}
.kbx-row:hover td{ background:var(--flaeche-akzent-soft,var(--paper)); }
.kbx-addbtn:hover{ color:var(--flaeche-akzent-ink,var(--brand));
  background:var(--flaeche-akzent-soft,var(--paper)); }
.kbv-item:hover{ background:var(--flaeche-akzent-soft,var(--paper)); }
/* 5b) DIE ZWEI HERVORGEHOBENEN EINTRAEGE des Schubfachs (v2.391.0, seit
      v2.419.0 die VOLLE Fuellung statt des Hauchs).

      WARUM DIE FUELLUNG UND NICHT DER HAUCH - es ist dieselbe Ueberlegung
      wie bei 4) und derselbe Weg, den die Seitenleiste in v2.283.0 gegangen
      ist: Hauch + farbige Schrift ist auf 4.5:1 gerechnet, aber knapp; und
      bei einem fast grauen Wunschton verschwindet die Hervorhebung ganz.
      `--flaeche-akzent` ist dagegen so weit abgedunkelt, dass WEISSE Schrift
      darauf bei JEDEM Farbton 4.5:1 erreicht (ssDunkelnBis, index-app.js).
      Der auffaelligste Eintrag der Liste haengt damit nicht mehr davon ab,
      welche Farbe die Lehrkraft gewaehlt hat.

      DIE AUFLAGE BEIM ZEIGEN DARF NUR ABDUNKELN. Schwarz mit Deckkraft kann
      den Kontrast gegen Weiss nur VERBESSERN; eine aufhellende Auflage wuerde
      die 4.5:1 von oben nach unten druecken (siehe 4)).

      DIE HOVER-ZEILE IST PFLICHT, nicht Schmuck: `.kbv-item:hover` eine Zeile
      weiter oben hat dieselbe Spezifitaet wie `.kbv-item.kbv-betont` und
      steht davor - ohne eigene Hover-Regel legte sich der HAUCH ueber die
      Fuellung, und die weisse Schrift stuende auf einem Pastell. */
.kbv-item.kbv-betont{ box-shadow:inset 3px 0 0 var(--flaeche-akzent,var(--brand)); }
.kbv-item.kbv-betont:hover{ background:var(--paper);
  box-shadow:inset 3px 0 0 var(--flaeche-akzent,var(--brand)); }
.kbv-item.kbv-betont .kbv-ico{ background:var(--flaeche-akzent-soft,var(--brand-soft));
  color:var(--flaeche-akzent,var(--brand)); }
.kbv-item.kbv-betont .kbv-tx b{ color:var(--flaeche-akzent,var(--brand)); }
/* 6) Halbjahr-Waehler (v2.144.0): "Gesamt" im aktiven Zustand und der mobile
      Kasten sind AUSGEWAEHLT-Flaechen - also -soft, nicht -hauch. */
.kbz-ges.an{ background:var(--flaeche-akzent-soft,var(--brand-soft));
  color:var(--flaeche-akzent-ink,var(--brand)); }
.kbz-kbtn{ background:var(--flaeche-akzent-soft,var(--brand-soft));
  color:var(--flaeche-akzent-ink,var(--brand)); }
/* 6b) DIE FORMULAR-KNOEPFE DER BRIEFE UND FOERDERBLAETTER (v2.381.0, Befund
      Murat 23.08.2026: „Fehlzeitenbriefe sayfasindaki butonlar thema rengi
      olmali").

      `.fo-btn` stand auf `var(--brand)` - festes Blau. Auf einer gruenen
      Flaeche sah die ganze Seite richtig aus, bis unten die vier Knoepfe
      kamen: Speichern, Vorschau, Word, PDF, alle blau. Es ist derselbe Fehler
      wie beim Glas-Block in v2.373.0, nur an einer anderen Stelle - eine
      zweite Farbquelle neben dem Woerterbuch.

      `.fo-btn.ghost` bleibt neutral: er ist die ZWEITE Wahl neben dem
      Hauptknopf, und zwei gefuellte Knoepfe nebeneinander sagen nicht mehr,
      welcher gemeint ist. */
.fo-btn:not(.ghost){ background:var(--flaeche-akzent,var(--brand)); }
.fo-btn:not(.ghost):hover{
  background:linear-gradient(rgba(0,0,0,.13),rgba(0,0,0,.13)),
             var(--flaeche-akzent,var(--brand-dk)); filter:none; }
.fo-btn.ghost:hover{ border-color:var(--flaeche-akzent,var(--brand)); }
/* Der aktive Ankreuz-Block traegt den Hauch der Flaechenfarbe statt eines
   festen Blaus - er markiert eine AUSWAHL, keine Bedeutung. */
.fo-pair.on{ border-color:var(--flaeche-akzent,var(--brand));
  background:var(--flaeche-akzent-soft,var(--brand-soft)); }

/* 7) MATERIAL-EINSTIEG (v2.253.0, Auftrag Murat 10.08.2026: „renk kismi bide
      arkaplan rengine göre degismeli"). Der Einstieg war die auffaelligste
      Seite der App und zugleich die einzige, die stur blau blieb: blauer
      Kontingent-Streifen, blaue Chips, blauer Sende-Knopf – auf einer
      lavendelfarbenen Flaeche. Diese acht Zeilen ziehen ihn nach.

      WARUM DIE SELEKTOREN `#screen-upload` MITFUEHREN: Die Grundfassung
      dieser Regeln steht weiter oben im Stylesheet MIT dieser ID. Ohne sie
      verloere der Akzent hier gegen die eigene Vorlage – nicht wegen der
      Reihenfolge, sondern wegen der Spezifitaet.

      DER SENDE-KNOPF traegt weisse Symbole: er darf deshalb NUR
      `--flaeche-akzent` bekommen (dort ist 4.5:1 gegen Weiss gerechnet), nie
      `-soft`. Chips und Karten sind Flaechen unter dunkler Schrift und
      nehmen `-soft` mit `-ink`. */
/* Die Marke traegt seit v2.324.2 keine Fuellung mehr (neumorphe Tiefe statt
   Flaeche) und keinen Ring - der Akzent sitzt nur noch in der Schrift.
   Deshalb faellt hier die Hintergrund-Regel weg; sie wuerde die Marke wieder
   zu einem farbigen Balken machen. */
/* DIE KAPSEL NIMMT IHRE FARBE AN DIESER EINEN STELLE (v2.925.0). Auftrag
   Murat 02.10.2026: „o şeylerin içlerindeki renkler hep mavi. tema rengi
   olsun … o arkadaki yansımayı da tema renginin farklı renklerine“. Die
   drei Töne der Flächenfarbe werden hier als `--kapsel-ton*` an den
   Bildschirm gehängt; Rahmen, Band, Schein, Kontingent, Chips, Felder,
   „Übernehmen“ und die Listen von Fach/Klasse lesen NUR diese Namen
   (index.css, Abschnitt „DIE EINGABEKAPSEL“). Ohne gewählte Fläche und im
   dunklen Design greift der Rückfall --brand.
   `#screen-upload .notiz .l,#screen-upload .notiz a{…}` stand bis v2.924
   hier: der Kontingent-Streifen über dem Eingang. Er ist ins Kopfband
   gewandert und färbt sich jetzt über --kapsel-ton-ink. */
#screen-upload{ --kapsel-ton:var(--flaeche-akzent,var(--brand));
  --kapsel-ton-soft:var(--flaeche-akzent-soft,var(--brand-soft));
  --kapsel-ton-ink:var(--flaeche-akzent-ink,var(--brand)); }
/* Die Liste des Auswahlfelds (ssAuswahl, z. B. „Thema“) trug ein festes
   Violett-Blau - auf jeder Fläche dasselbe („renkler hep mavi“). */
.ss-aus-opt:hover,.ss-aus-akt{ background:var(--flaeche-akzent-soft,var(--brand-soft));
  color:var(--flaeche-akzent-ink,var(--brand)); }
/* `#screen-upload .box:focus-within{ border-color:… }` stand hier bis
   v2.924: ein Akzentrand um den Eingang beim Tippen. Seit v2.925.0 ist der
   Rand der Regenbogen der Kapsel - eine Akzentfarbe darauf würde ihn beim
   Tippen auslöschen. Den Fokus zeigt jetzt der Schein (er hört auf zu
   atmen und steht voll da, `.box:focus-within::before`). */
/* Bis v2.924 stand hier die Akzent-Regel des Sende-Knopfs (`.senden`,
   Farbe des Fliegers). Seit v2.925.0 ist der Flieger SCHWARZ (--ink) und ohne Fläche
   (Murat 02.10.2026: „siyah gönderme … sadece uçak … arka plansız“) - er
   trägt keine Flächenfarbe mehr. Plus und Zahnrad färben sich beim Zeigen
   über --kapsel-ton* (oben). */
#screen-upload .ikbtn:hover,#screen-upload .ikbtn.aktiv,
#screen-upload .pop-add .zeile:hover{
  background:var(--flaeche-akzent-soft,var(--brand-soft));
  color:var(--flaeche-akzent-ink,var(--brand)); }
#screen-upload .pop-add .zeile .ic{
  background:var(--flaeche-akzent-soft,var(--brand-soft)); }
#screen-upload .pop-add .zeile .ic svg{
  stroke:var(--flaeche-akzent-ink,var(--brand)); }
/* 8) EINSTELLUNGEN, KATEGORIENSPALTE (v2.253.0). Die aktive Zeile links ist
      dieselbe Aussage wie der aktive Eintrag der Seitenleiste unter 4) –
      also derselbe Ton, damit die App an zwei Orten nicht zwei Sprachen fuer
      „hier bist du" spricht. Die Namensvorschau ist ein ERGEBNIS und traegt
      denselben Hauch. */
.kset-nav .knav.on,.kset-nav .kprof.on{
  background:var(--flaeche-akzent-soft,var(--brand-soft)); }
.kset-nav .knav.on .knav-title{ color:var(--flaeche-akzent-ink,var(--brand)); }
.kname-vorschau{ background:var(--flaeche-akzent-soft,var(--brand-soft));
  color:var(--flaeche-akzent-ink,var(--brand)); }
/* Die Knoepfe unter „Push-Benachrichtigungen" (kontoSubBenachrichtigungen,
   v2.865.1): eine Klasse statt des Inline-Stils, den test_landing_mobil
   verbietet. Nicht .fo-btnreihe - die bricht am Telefon absichtlich nicht
   um, und drei lange Beschriftungen passen dort nicht in eine Zeile. */
.push-knoepfe{ display:flex; gap:8px; flex-wrap:wrap; }
/* 9) ERWEITERTE OPTIONEN (v2.254.0, Befund Murat 10.08.2026: „Erweiterte
      Optionen kismini unutmusun orasi mavi kalmis bütünlük bozuluyor"). Das
      Fenster haengt am Material-Einstieg, blieb bei der Umstellung aber
      stehen – man schloss also einen eingefaerbten Kasten auf und bekam ein
      blaues Fenster.

      DREI STELLEN, MEHR NICHT: der Zahnrad-Kopf, der Aufklapp-Streifen unter
      dem Eingabekasten und der Knopf „Übernehmen". Der Knopf bekommt NUR
      `--flaeche-akzent` (dort ist 4.5:1 gegen Weiss gerechnet) und verliert
      dafuer seinen Verlauf – ein selbst gemischter Verlauf waere in der
      oberen Haelfte heller als gerechnet, und genau dort steht die Schrift.

      WAS BEWUSST BLAU-VIOLETT BLEIBT: der Lernspiele-Block (`.ls-*`, Ton
      #7A5AF8). Das ist keine vergessene Stelle, sondern eine eigene
      Kennfarbe – sie markiert im selben Fenster einen ANDEREN Weg
      (druckfertige Spiele statt Aufgabensatz) und traegt das Premium-Etikett.
      Faerbte sie sich mit, verschwaende der Unterschied zwischen „das gehoert
      zu deiner Einstellung" und „das ist etwas anderes". */
/* Fenster und Riegel der Erweiterten Optionen gibt es seit v2.324.0 nicht
   mehr - ihre Akzent-Regeln sind mit ihnen entfallen. Was vom Panel uebrig
   ist (Gruppentitel, Symbole), faerbt sich ueber .mat-group-ttl::before. */
.mat-group-ttl::before{ background:var(--flaeche-akzent,#534AB7); }
/* v2.308.0 – zwei Knoepfe, die stur blau blieben (Befund Murat 19.08.2026:
   "ekledigin butonlari otomatik mavi yapiyosun, her zaman arkaplan rengiyle
   uyumu düsünmelisin ... hem lautlesen sayfasindaki tuslar hem cockpitteki
   Stoppuhr butonu"). Beide sind HAUPTAKTIONEN ihrer Flaeche und tragen
   deshalb eine Fuellung - nur eben in der Farbe, die die Lehrkraft gewaehlt
   hat, statt im Markenblau daneben.
   Die Lautlesezeit steht in einem eigenen Dokument (iframe) und erreicht
   diese Variablen nicht; sie bekommt den Ton per postMessage - siehe
   `llAkzentMelden` in index-app.js und `ss:"akzent"` in lautlesezeit.html. */
.az-tool-btn:not(.ghost){ background:var(--flaeche-akzent,var(--brand));
  border-color:var(--flaeche-akzent,var(--brand)); }
/* Die Handgriffe einer Aufgabe (Zurück, Bearbeiten, Aufgabe beenden …) und
   die Nebenknoepfe der Maske (Abbrechen, Als Entwurf speichern) tragen die
   Flaechenfarbe - „tema rengi olmalı her şey" (Murat 24.09.2026). */
.az-detail-bar .btn.ghost,.az-actions .btn.ghost{ color:var(--flaeche-akzent-ink,var(--brand)) !important;
  border-color:color-mix(in srgb, var(--flaeche-akzent,var(--brand)) 30%, transparent) !important; }
.az-tool-btn.ghost{ color:var(--flaeche-akzent-ink,var(--brand));
  border-color:var(--flaeche-akzent,var(--brand)); }
/* Dieselbe Flaeche, eine Ebene tiefer: der Speichern-Knopf im Aufgaben-
   Fenster und der kleine "Bewerten"-Knopf in der Fortschrittstabelle. */
.az-modal-fuss .btn:not(.ghost){ background:var(--flaeche-akzent,var(--brand));
  border-color:var(--flaeche-akzent,var(--brand)); }
.az-mini{ border-color:var(--flaeche-akzent,var(--brand));
  color:var(--flaeche-akzent-ink,var(--brand)); }
/* Die Wunschfarbe faerbt auch diesen Knopf. DER SCHEIN DARUNTER IST MIT
   v2.414.0 WEG - er wurde von der Kartenkante abgeschnitten (Begruendung an
   der Grundregel oben); deshalb steht hier nur noch die Fuellung. */
.ck2-uhr .ck-uhr-timer{ background:var(--flaeche-akzent,var(--brand)); }
.ck2-uhr .ck-uhr-timer:hover{
  background:linear-gradient(rgba(0,0,0,.13),rgba(0,0,0,.13)),var(--flaeche-akzent,var(--brand-dk)); }
/* 10) DIE GEWAEHLTE STUNDE IM KALENDER (v2.729.0, Ansage Murat 14.09.2026:
      „thema rengi olsun secili termin"). Es ist die Stunde, deren SEITE
      rechts im SchlauHeft steht - dieselbe Aussage wie der aktive Eintrag
      der Seitenleiste unter 4), also dieselbe Fuellung mit weisser Schrift.

      WARUM `!important`: FullCalendar setzt Fuellung, Rand und die farbige
      linke Kante INLINE je Ereignis (kalWeicheFarbe, index-app.js); ohne
      Nachdruck kaeme diese Regel gegen das style-Attribut nicht an. Es ist
      die einzige Stelle im Akzent-Abschnitt, an der das noetig ist, und sie
      gilt genau einem Element. Die Schrift wird an den INNEREN Elementen
      gesetzt: FullCalendar faerbt Zeit und Titel ueber eigene Regeln
      (templates/index.html, „DIE SCHRIFT MUSS DUNKEL SEIN"), eine Farbe am
      aeusseren Kasten erreichte sie nicht. */
#kal-host .fc-event.kh-gewaehlt{
  background-color:var(--flaeche-akzent,var(--brand)) !important;
  border-color:var(--flaeche-akzent,var(--brand)) !important;
  border-left-color:var(--flaeche-akzent,var(--brand)) !important;
  box-shadow:0 2px 10px color-mix(in srgb, var(--flaeche-akzent,var(--brand)) 35%, transparent); }
#kal-host .fc-event.kh-gewaehlt .fc-event-main,
#kal-host .fc-event.kh-gewaehlt .fc-event-title,
#kal-host .fc-event.kh-gewaehlt .fc-event-time,
#kal-host .fc-event.kh-gewaehlt .kal-ev-ort{ color:var(--on-brand); }
#kal-host .fc-event.kh-gewaehlt .kal-ev-ort{ opacity:.85; }
/* Die LISTE (Tag am Tablet/Handy, `uh-schmaltag`): dort ist das Ereignis
   eine Tabellenzeile, und FullCalendar faerbt beim Zeigen die ZELLEN - also
   muessen die Zellen die Fuellung tragen, nicht nur die Zeile. */
#kal-host .fc-list-event.kh-gewaehlt td{
  background-color:var(--flaeche-akzent,var(--brand)) !important; }
#kal-host .fc-list-event.kh-gewaehlt .fc-list-event-time,
#kal-host .fc-list-event.kh-gewaehlt .fc-list-event-title,
#kal-host .fc-list-event.kh-gewaehlt .fc-list-event-title a{ color:var(--on-brand); }
/* 11) DAS BLATT-STUDIO (v2.906.0, Befund Murat 30.09.2026: „rengi thema
      rengi degil o kismin"). Das Regal war der letzte Reiter der Sammlung,
      der stur im Marken-Blau stand: Hauptknopf, Wegmarken, der Rahmen beim
      Zeigen, der Kopfbalken der gezeichneten Vorschau, das Abzeichen
      „Studio", der Stift an der Karte, das Ziel beim Ziehen. Die
      Ordnerfarben bleiben - die hat die Lehrkraft je Ordner gewaehlt.
      Die Pille unter dem Reiter (.bl-u-*) steht mit hier.

      ⛔ `html` VOR JEDEM SELEKTOR, und zwar mit Grund: der Abschnitt REGAL
      (.bl-*) steht in dieser Datei HINTER diesem hier. Bei gleicher
      Gewichtung gewinnt die spaetere Regel - die Akzentfarbe verlor still
      gegen das Blau der Grundregel (im Browser gesehen, kein Test haette es
      gemerkt). `html` hebt die Gewichtung um ein Element an; damit
      entscheidet nicht mehr die Reihenfolge. `.bl-krume.an` (die aktuelle
      Wegmarke, Textfarbe) bleibt dabei staerker - so soll es sein. */
html .bl-u-knopf.haupt,html .bl-neu{ background:var(--flaeche-akzent,var(--brand)); }
html .bl-u-knopf.haupt:hover{
  background:linear-gradient(rgba(0,0,0,.13),rgba(0,0,0,.13)),var(--flaeche-akzent,var(--brand-dk)); }
html .bl-u-knopf:not(.haupt):hover,html .bl-krume:hover,html .bl-krume.bl-ueber,
html .bl-vm-liste button:hover{
  background:var(--flaeche-akzent-soft,var(--brand-soft));
  color:var(--flaeche-akzent-ink,var(--brand)); }
html .bl-krume,html .bl-akt .bl-bearb{ color:var(--flaeche-akzent-ink,var(--brand)); }
html .bl-vorschau:hover{ border-color:var(--flaeche-akzent,var(--brand)); }
html .bl-kopfbalken{ background:var(--flaeche-akzent,var(--brand)); }
html .bl-abz.studio{ background:var(--flaeche-akzent-soft,var(--brand-soft));
  color:var(--flaeche-akzent-ink,var(--brand-dk)); }
html .bl-ueber{ outline-color:var(--flaeche-akzent,var(--brand)); }
/* 12) DIE NACHRICHTEN (v2.909.0, Befund Murat 01.10.2026: „tema rengi
       olmuyor"). Die Zentrale war die letzte grosse Seite im Markenblau: der
       Knopf „Neuer Chat", der gewaehlte Filter, die offene Unterhaltung, die
       Zaehler, die Kreise mit den Anfangsbuchstaben, die eigene Blase, der
       Knopf in einer Systemnachricht („Bewerten & beenden") und die Linie
       zwischen Liste und Chat, wenn man sie zieht.
       WAS BLEIBT, WIE ES IST: der gruene Haken „gelesen" und der gruene Punkt
       „gerade aktiv" (Bedeutungsfarben, siehe oben), der rote Knopf beim
       Loeschen und der Bernstein-Kreis „An das ganze Kollegium" - der sagt:
       das geht an alle, nicht an eine Person. */
.pf-plus,.pf-deeplink,.pf-conv-unread,.pf-conv-at,.pf-gava .g2{
  background:var(--flaeche-akzent,var(--brand)); }
.pf-plus:hover,.pf-deeplink:hover{
  background:linear-gradient(rgba(0,0,0,.13),rgba(0,0,0,.13)),var(--flaeche-akzent,var(--brand-dk)); }
.pf-fchip.on,.pf-conv.active{ background:var(--flaeche-akzent-soft,var(--brand-soft)); }
.pf-fchip.on,.pf-conv-date.neu,.pf-absender,.pf-mention,.pf-mehr-btn{
  color:var(--flaeche-akzent-ink,var(--brand)); }
.pf-ava-ini,.pf-gava .g1,.pf-cico,.pf-klkachel-ico,.pf-gn-ava,.pf-leer-chat .pf-leer-ico{
  background:var(--flaeche-akzent-soft,var(--brand-soft));
  color:var(--flaeche-akzent-ink,var(--brand)); }
/* In der offenen Zeile liegt der Kreis sonst Hauch auf Hauch und verschwindet. */
.pf-conv.active .pf-ava-ini,.pf-conv.active .pf-gava .g1{ background:var(--card); }
.pf-mrow.me .pf-bubble{ background:var(--flaeche-akzent-soft,var(--pf-sent-bg,#E6EAFF));
  color:var(--flaeche-akzent-ink,var(--pf-sent-ink,#2B3358)); }
.pf-quote,.pf-mrow.me .pf-quote{ border-left-color:var(--flaeche-akzent,var(--pf-sent,#5063D6)); }
.pf-mrow.me .pf-mact{ color:var(--flaeche-akzent-ink,var(--pf-sent,#5063D6)); }
.pf-rchip.mir,.pf-reply-prev{ border-color:var(--flaeche-akzent,var(--brand));
  background:var(--flaeche-akzent-soft,var(--brand-soft)); }
.pf-search:focus-within,.pf-compbar:focus-within,.pf-klkachel:hover,.pf-mehr-btn:hover{
  border-color:var(--flaeche-akzent,var(--brand)); }
.pf-mehr-btn:hover{ background:var(--flaeche-akzent-soft,var(--brand-soft)); }
.pf-icobtn:hover{ background:var(--flaeche-akzent-soft,var(--paper));
  color:var(--flaeche-akzent-ink,var(--brand)); }
.pf-conv-check{ accent-color:var(--flaeche-akzent,var(--brand)); }
.pf-trenner:hover::before,.pf-trenner.zieht::before,.pf-trenner:focus-visible::before{
  background:var(--flaeche-akzent,var(--brand)); }
.pf-mrow.erwaehnt .pf-bubble{ box-shadow:0 0 0 1.5px var(--flaeche-akzent,var(--brand)); }
.pf-reply-ico,.pf-med-ico,#pf-anhang-menue .ic,.pf-gm-x.an{ color:var(--flaeche-akzent-ink,var(--brand)); }
/* 13) DIE PINNWÄNDE (v2.910.0, Befund Murat 01.10.2026: „burası da ayrı bir
       dünya gibi"). Die Knoepfe der Pille nehmen ihre Farbe schon aus Nr. 11
       (.bl-u-knopf, dieselben wie im Blatt-Studio). Hier stehen: die Krume
       zurueck zur Uebersicht, der Rahmen beim Zeigen auf eine Kachel, die
       Kopfkante der Zettel im Bild einer Pinnwand, das Suchfeld beim Tippen
       und „Wiederherstellen" im Papierkorb. WAS BLEIBT: die Ordnerfarbe (von
       der Lehrkraft gewaehlt) und das gruene „freigegeben" (Bedeutung: die
       Kinder sehen es). */
.pwh-krume{ color:var(--flaeche-akzent-ink,var(--brand)); }
.pwh-krume:hover,.pwh-restore:hover{ background:var(--flaeche-akzent-soft,var(--brand-soft)); }
.pwh-kachel:hover .pwh-bild,.pwh-kachel:focus-visible .pwh-bild,.pwh-search:focus-within{
  border-color:var(--flaeche-akzent,var(--brand)); }
.pwh-brett i{ border-top-color:var(--flaeche-akzent,var(--brand)); }
.pwh-restore{ border-color:var(--flaeche-akzent,var(--brand)); color:var(--flaeche-akzent-ink,var(--brand)); }
/* „Abbrechen" in den Fenstern: .btn.ghost setzt Farbe und Rand mit
   !important - deshalb hier dasselbe, wie bei .az-detail-bar (Nr. 9). */
.pwh-fuss .btn.ghost{ color:var(--flaeche-akzent-ink,var(--brand)) !important;
  border-color:color-mix(in srgb, var(--flaeche-akzent,var(--brand)) 30%, transparent) !important; }

/* ===== HINWEIS: RECHTSTEXTE GEAENDERT (v2.98.0) ============================
   Gegenstueck zu consentDialog() in index-app.js.

   BEWUSST KEIN SPERR-OVERLAY: keine Flaeche ueber der ganzen Seite, kein
   `pointer-events` auf dem Hintergrund. Der Hinweis sitzt unten rechts wie
   eine Meldung und laesst die Arbeit weiterlaufen. Eine Zustimmung, die man
   nur durch Wegklicken loswird, waere nach Art. 7 Abs. 4 DSGVO keine
   freiwillige - und wer zwischen zwei Stunden schnell etwas nachschlagen
   will, darf daran nicht haengenbleiben.

   Auf schmalen Schirmen legt er sich ueber die volle Breite an den unteren
   Rand und haelt `safe-area-inset-bottom` frei, damit er nicht unter dem
   Home-Indicator klebt. */
#consent-neu, #bn-intro{ position:fixed; z-index:9600; right:18px; bottom:18px; max-width:420px; }
#consent-neu .cn-box, #bn-intro .cn-box{
  background:var(--card,#fff); border:1px solid var(--line); border-radius:16px;
  box-shadow:0 12px 34px rgba(16,24,40,.16); padding:16px 18px 14px;
  animation:cnAuf .22s ease; }
@keyframes cnAuf{ from{ opacity:0; transform:translateY(10px); } to{ opacity:1; transform:none; } }
#consent-neu .cn-kopf, #bn-intro .cn-kopf{ display:flex; align-items:center; gap:9px; margin-bottom:8px; }
#consent-neu .cn-kopf svg, #bn-intro .cn-kopf svg{ width:20px; height:20px; flex:none; stroke:#157347; fill:none;
  stroke-width:1.9; stroke-linecap:round; stroke-linejoin:round; }
#consent-neu .cn-kopf b, #bn-intro .cn-kopf b{ font-size:var(--fs-md); font-weight:800; color:var(--ink); flex:1; min-width:0; }
#consent-neu .cn-zu, #bn-intro .cn-zu{ appearance:none; border:0; background:transparent; cursor:pointer;
  padding:4px; color:var(--muted); flex:none; border-radius:8px; }
#consent-neu .cn-zu:hover, #bn-intro .cn-zu:hover{ background:var(--line); color:var(--ink); }
#consent-neu .cn-zu svg, #bn-intro .cn-zu svg{ width:16px; height:16px; stroke:currentColor; fill:none;
  stroke-width:2.2; stroke-linecap:round; }
#consent-neu p, #bn-intro p{ margin:0 0 9px; font-size:13.5px; line-height:1.5; color:var(--muted); }
#consent-neu .cn-links, #bn-intro .cn-links{ font-size:13px; }
#consent-neu .cn-links a, #bn-intro .cn-links a{ color:var(--brand); font-weight:700; text-decoration:none; }
#consent-neu .cn-links a:hover, #bn-intro .cn-links a:hover{ text-decoration:underline; }
#consent-neu .cn-fuss, #bn-intro .cn-fuss{ display:flex; gap:8px; justify-content:flex-end; margin-top:12px; }
#consent-neu .cn-fuss button, #bn-intro .cn-fuss button{ appearance:none; font-family:inherit; font-weight:700;
  font-size:13px; padding:8px 14px; border-radius:10px; cursor:pointer; }
#consent-neu .cn-spaeter, #bn-intro .cn-spaeter{ border:1px solid var(--line); background:#fff; color:var(--muted); }
#consent-neu .cn-spaeter:hover, #bn-intro .cn-spaeter:hover{ background:var(--line); color:var(--ink); }
#consent-neu .cn-ok, #bn-intro .cn-ok{ border:0; background:var(--flaeche-akzent,var(--brand)); color:#fff; }
#consent-neu .cn-ok:disabled, #bn-intro .cn-ok:disabled{ opacity:.6; cursor:default; }
@media (max-width:640px){
#consent-neu, #bn-intro{ right:10px; left:10px; bottom:calc(10px + env(safe-area-inset-bottom, 0px)); max-width:none; }
#consent-neu .cn-fuss button, #bn-intro .cn-fuss button{ flex:1; }
  /* Drei Knoepfe passen am Telefon nicht in eine Zeile (gemessen 375 px:
     „Benachrichtigungen aktivieren" drueckte „Später" ueber den Kartenrand).
     Der Hauptknopf steht deshalb oben ueber die volle Breite. */
  #bn-intro .cn-fuss{ flex-wrap:wrap; }
  #bn-intro .cn-fuss .cn-ok{ flex-basis:100%; order:-1; }
}

/* ===========================================================================
   ANSICHT-FENSTER (#ss-fenster) – Ersatz fuer window.open (v2.99.0)
   ---------------------------------------------------------------------------
   WOZU: Arbeitsblatt-Vorschau, Karteikarten, Datentabelle, Mindmap und die
   Druckansichten oeffnen seit jeher ein ZWEITES Fenster
   (`window.open("","_blank")` + `document.write`). Genau das gibt es in einer
   WKWebView (Store-App) und in der installierten PWA NICHT: `window.open`
   liefert dort `null`, und der bestehende Code zeigte daraufhin nur noch
   „Pop-up wurde blockiert" – auf dem Handy war damit KEINE dieser Ansichten
   erreichbar (Befund Murat 02.08.2026).

   LOESUNG: dieselben Generatoren schreiben in ein <iframe>, das als
   Vollbild-Blatt ueber der App liegt. Kein Umbau an den Generatoren – die
   Umleitung passiert zentral in `ssFensterOeffnen()` (index-app.js), das
   dasselbe Muster benutzt wie das laengst bewaehrte `ltiRunEmbedded()`.

   MIT WEM: index-app.js (`ssFensterOeffnen`, `ssFensterZu`,
   `window.open`-Huelle), templates/index.html (#ss-fenster).
   Absicherung: qa/unit/test_mobil_fenster.py.
=========================================================================== */
#ss-fenster{ position:fixed; inset:0; z-index:9800; display:none;
  flex-direction:column; background:var(--card,#fff); }
#ss-fenster.auf{ display:flex; }
#ss-fenster .ssf-kopf{
  flex:none; display:flex; align-items:center; gap:10px;
  padding:calc(9px + env(safe-area-inset-top, 0px)) 12px 9px;
  border-bottom:1px solid var(--line); background:var(--card);
}
#ss-fenster .ssf-titel{ flex:1; min-width:0; font-size:15px; font-weight:800; color:var(--ink);
  white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
#ss-fenster .ssf-btn{
  flex:none; appearance:none; border:1px solid var(--line); background:var(--card);
  color:var(--ink); border-radius:10px; height:36px; padding:0 12px; cursor:pointer;
  font:700 13px inherit; display:inline-flex; align-items:center; gap:6px;
}
#ss-fenster .ssf-btn:hover{ border-color:var(--brand); color:var(--brand); }
#ss-fenster .ssf-btn svg{ width:16px; height:16px; fill:none; stroke:currentColor;
  stroke-width:2.2; stroke-linecap:round; stroke-linejoin:round; }
#ss-fenster iframe{ flex:1 1 auto; width:100%; border:0; display:block; background:#fff; }
/* Beim Drucken soll NUR das Blatt kommen, nicht die App dahinter. */
@media print{
  body.ss-fenster-auf > *:not(#ss-fenster){ display:none !important; }
  #ss-fenster{ position:static; }
  #ss-fenster .ssf-kopf{ display:none; }
}

/* ===========================================================================
   SCHMALE SCHIRME – Sammelkorrekturen 02.08.2026 (v2.99.0)
   ---------------------------------------------------------------------------
   ALLES HIER STEHT BEWUSST IN @media (max-width:640px): die Grundregeln
   bleiben unangetastet (CLAUDE.md, „schmal aendern heisst SCHMAL aendern").
   Tablet und Computer sehen exakt aus wie vorher.
=========================================================================== */
@media (max-width:640px){

  /* --- 1) Seitenmenue: Unterlaengen wurden abgeschnitten -------------------
     URSACHE: `.sb-label` traegt `overflow:hidden`, und die eingeklappte
     Fassung (`body:not(.sb-open)`) setzt `line-height:1.05`. Auf dem Handy
     ist die Leiste eine SCHUBLADE – dort greift `body.sb-open` nie, also galt
     die 1.05 weiter, waehrend die Schrift auf 15px hochgesetzt wurde. Ergebnis:
     das „g" in „Aufgaben" lag unterhalb der Zeilenbox und wurde weggeschnitten.
     Aus demselben Grund standen die Beschriftungen mittig statt links: die
     eingeklappte Fassung setzt `text-align:center; width:100%`, und auch das
     nahm die Schublade mit. */
  body.has-sidebar #app-sidebar .sb-item .sb-label{
    line-height:1.4; text-align:left; width:auto; letter-spacing:normal;
    overflow:visible;
  }
  body.has-sidebar #app-sidebar .sb-item{ padding:10px 12px; margin:2px 0; }

  /* --- 2) (entfallen mit v2.287.0) ----------------------------------------
     Hier stand die Korrektur fuer den Knopf „Schulverwaltung", der auf dem
     Schul-Bild im Cockpit lag: seine Leiste hatte `env(safe-area-inset-bottom)`
     als Polster, obwohl sie MITTEN auf der Seite sass und nicht am Rand.
     Das Bild samt Knopf gibt es nicht mehr (siehe renderCockpit). Der neue
     Einstieg in der Seitenleiste ist ein ganz normaler `.sb-item` und braucht
     keine eigene schmale Regel.
     DIE LEHRE BLEIBT: `env(safe-area-inset-*)` gehoert nur an Elemente, die
     wirklich am Bildschirmrand kleben. */

  /* --- 3) Aufgaben/Boerse: Filter wieder lesbar ---------------------------
     Vorher teilten sich Fach, Thema und Klasse den Rest EINER Zeile, in der
     ausserdem „Neu", die Lupe und die Ansicht sitzen – uebrig blieben rund
     60px je Feld, also „P. 4", „A…", „K…". Zwei Massnahmen:
       (a) kleinere Schrift/Polster (Wunsch: „mobilde kücük olsun ama yazi
           boyutu kücülsün"),
       (b) auf der AUFGABEN-Seite bekommen die drei Filter eine eigene Zeile.
     Der Umbruch entsteht ueber ein leeres Flex-Element (::before) mit voller
     Breite – so bleibt die Reihenfolge im HTML unveraendert. */
  .dash-toolbar{ gap:6px; }
  .dash-toolbar .dtb-btn{ font-size:11.5px; height:36px; padding:0 8px; gap:5px; }
  .dash-toolbar .dtb-btn svg{ width:13px; height:13px; }

  /* EINE Zeile, fuenf Elemente (v2.99.7, Wunsch Murat 02.08.2026:
     „arti en solda olsun, yanlarina 3 box, en sagda güzel bi svg").
     Reihenfolge: [+] [Fach] [Thema] [Klasse] [Ansicht]

     WAS DAFUER WEICHEN MUSSTE - und wohin es gegangen ist: die Lupe. Sie ist
     von allen Elementen das am seltensten gebrauchte und braucht doch die
     Breite eines ganzen Filters. Sie ist nicht geloescht, sondern in das
     Ansicht-Feld gezogen (erster Eintrag „Durchsuchen…", siehe
     dashToolbarZone in index-app.js); ein Tipp dort oeffnet dieselbe
     Suchzeile wie vorher.

     Der Umbruch aus v2.99.0 (`::before` mit voller Breite) ist damit
     hinfaellig und wird ausdruecklich zurueckgenommen - sonst bliebe eine
     leere zweite Zeile stehen. */
  /* KATEGORIENAME STATT VERSTUEMMELTEM WERT (v2.99.9).
     „Physik" wurde auf 390px zu „Phy… 4", „Alle Themen" zu „Alle T…". Ein
     abgeschnittenes Wort sagt weniger als der Kategoriename - und „Klassen"
     machte es schon immer so (Rueckmeldung Murat 03.08.2026: „digeri süper
     zaten"). Beide Texte stehen im HTML, hier wird getauscht; die Zahl
     daneben bleibt, denn sie ist das, was sich aendert. */
  .dtb-lang{ display:none; }
  .dtb-kurz{ display:inline; }
  /* Gleiche Breite fuer die drei Felder - sonst bestimmt die Wortlaenge das
     Bild und die Zeile wirkt schief (Wunsch fuer die Boerse: „o boxlari
     mobil icin esit yay o satira"). */
  #dash-toolbar > .dtb-drop:not(.dtb-zone-mob),
  #kur-toolbar > .dtb-drop:not(.dtb-zone-mob),
  #boerse-toolbar > .dtb-drop{ flex:1 1 0; min-width:0; }
  #dash-toolbar, #kur-toolbar, #boerse-toolbar{ flex-wrap:nowrap; column-gap:6px; }
  #dash-toolbar::before{ content:none; }
  #dash-toolbar > .dtb-neu, #kur-toolbar > .dtb-neu{ order:1; flex:none; }
  #dash-toolbar > .dtb-drop:not(.dtb-zone-mob),
  #kur-toolbar > .dtb-drop:not(.dtb-zone-mob),
  #boerse-toolbar > .dtb-drop:not(.dtb-zone-mob){ order:2; flex:1 1 0; min-width:0; }
  #dash-toolbar > .dtb-zone-mob, #kur-toolbar > .dtb-zone-mob{ order:3; flex:none; margin-left:0; }
  /* Die Kurse haben ZWEI Filter statt drei - die Felder sind dadurch breiter
     als ihr Text, und der Knopf stand schmal links in seinem Feld. Er fuellt
     es wie in der Aufgabenliste, der Pfeil rechts (v2.908.0). */
  #kur-toolbar > .dtb-drop:not(.dtb-zone-mob) > .dtb-btn{ width:100%; justify-content:space-between; }
  /* Die Lupe ist umgezogen (siehe oben) - in der Leiste hat sie keinen Platz
     mehr. Sobald die Suche offen ist, gilt der bestehende `.such-offen`-Block
     und sie nimmt die ganze Zeile ein; deshalb NUR im geschlossenen Zustand
     ausblenden. */
  .dash-toolbar:not(.such-offen) > .dash-search-inline{ display:none; }
  /* Nur am Telefon: der Sucheintrag im Ansicht-Feld. Ab 641px steht die Lupe
     wieder in der Leiste, und zwei Wege waeren verwirrend. */
  .dtb-trenn{ height:1px; background:var(--line); margin:4px 6px; }
  /* Das Ansicht-Feld ganz rechts: nur Symbol, kein Text - so bleibt fuer die
     drei Filter die maximale Breite. */
  #dash-toolbar .dtb-zone-btn, #kur-toolbar .dtb-zone-btn{ padding:0 8px; gap:4px; }
  #dash-toolbar .dtb-zone-btn .dtb-cnt, #kur-toolbar .dtb-zone-btn .dtb-cnt{ display:none; }
  /* ===== DAS WORT GEWINNT GEGEN DIE ZAHL (v2.414.0) ====================
     BEFUND MURAT 24.08.2026: „börse ve aufgabenda alle Fächer kismi
     yazmiyor … Fa.... 86 yaziyo mesela. yukarisi Fächer Thema Klassen
     olarak görüncek."

     Nachgerechnet auf 402px: abzueglich Rand, „+"-Knopf, Ansicht-Feld und
     Abstaenden bleiben je Filter rund 90px. „Fächer 86 ⌄" braucht etwa 95 -
     also griff `text-overflow:ellipsis` und machte daraus „Fä… 86".

     Die Zahl ist das, was hier weichen muss, nicht das Wort: WELCHER Filter
     das ist, muss man lesen koennen; WIE VIELE dahinterstehen, steht in der
     Liste, sobald man ihn oeffnet. Ein abgeschnittenes Wort mit einer Zahl
     daneben ist die schlechteste der drei Moeglichkeiten.

     Am Computer bleibt die Zahl - dort ist der Platz da. */
  #dash-toolbar .dtb-btn .dtb-cnt,
  #kur-toolbar .dtb-btn .dtb-cnt,
  #boerse-toolbar .dtb-btn .dtb-cnt{ display:none; }
  /* Das Panel haengt am Werkzeugbalken (siehe <=899px-Block). */
  #dash-toolbar .dtb-panel, #kur-toolbar .dtb-panel, #boerse-toolbar .dtb-panel{ top:calc(100% + 4px); }

  /* --- 4) Einstellungen: die Luecke unten ---------------------------------
     Hier stand bis v2.99.2 ein zusaetzliches Polster fuer `#konto-content`.
     Es beruhte auf einer falschen Vermutung (der Inhalt sei abgeschnitten)
     und hat die Luecke groesser gemacht statt kleiner. Die wirkliche Ursache
     - das Polster der generischen Screen-Regel an einer Section, die gar
     nicht scrollt - ist jetzt an ihrer Quelle behoben (siehe Block
     "AUSNAHME: Einstellungen und Admin scrollen NICHT selbst" im
     899.98px-Abschnitt). Hier gehoert deshalb nichts mehr hin. */

  /* --- 5) Schuelerverzeichnis: kompakte Zeilen statt Kaesten --------------
     ZWEI Dinge waren falsch. Erstens klebte der Name am ersten Feld
     („Elif ÖztürkKlasse: 5a"), weil `.sv-row` zwar auf `display:block`
     umgestellt wurde, `.nm` aber ein Inline-Element blieb. Zweitens ist ein
     Kasten je Kind auf dem Handy sehr viel Flaeche fuer sehr wenig Inhalt –
     bei 13 Kindern scrollt man ohne Not (Wunsch Murat: „kompakt olsun,
     satir satir"). Jetzt: Name in Zeile eins, die Angaben klein darunter,
     getrennt durch eine Haarlinie. */
  .sv-tab{ background:var(--card); border:1px solid var(--line);
    border-radius:14px; box-shadow:var(--shadow); overflow:hidden; }
  .sv-row{ display:block; background:transparent; border:0; border-radius:0;
    box-shadow:none; padding:9px 13px; margin:0;
    border-bottom:1px solid rgba(127,127,127,.14); }
  .sv-row:last-child{ border-bottom:0; }
  .sv-row .nm{ display:block; font-size:14px; line-height:1.3; white-space:normal; }
  .sv-row .sv-zelle{ display:inline; margin:0 9px 0 0; font-size:11.5px; line-height:1.5; }
  .sv-row .sv-zelle:empty{ display:none; }
  .sv-row .sv-zelle::before{ content:attr(data-lbl); font-weight:700; opacity:.7; }

  /* --- 6) Pinnwand-Uebersicht (Hub) in der App-Shell ----------------------
     Suche ueber die volle Zeile, die Pille darunter rechts - zwei Kacheln
     nebeneinander, damit am Telefon mehr als eine sichtbar ist. */
  .pwh-search{ flex-basis:100%; max-width:none; }
  .pwh-raster{ grid-template-columns:repeat(2,minmax(0,1fr)); gap:12px; }

  /* --- 8) Klassenbuch: EINE Zeile (v2.99.7) -------------------------------
     Wunsch: „en solda sinif secme boxu, sagindada o bilgiseyini kaldir,
     boxun yanina menüleri ekle. tek sira."
     `.kbx-head` steht auf `flex-wrap:wrap`; auf 390px passten Chip,
     Kennzahlen und sechs Icon-Knoepfe nie in eine Zeile, also brach es um.
     Die Kennzahlen („6 Schüler · Ø 80%") sind das, was hier am wenigsten
     traegt - die Zahl steht ohnehin in der Tabelle darunter. Sie fallen weg,
     der Rest bleibt in einer Zeile und darf waagerecht geschoben werden,
     falls eine Klasse einmal mehr Knoepfe hat. */
  .kbx-head{ flex-wrap:nowrap; gap:var(--s-1); overflow-x:auto; scrollbar-width:none;
    touch-action:pan-x; overscroll-behavior-x:contain; }
  .kbx-head::-webkit-scrollbar{ display:none; }
  .kbx-head .kbx-kpi{ display:none; }
  .kbx-head-ck{ flex:none; flex-wrap:nowrap; }
  .kbx-acts{ flex:none; flex-wrap:nowrap; }
  /* HIER STAND DIE UMSCHALTUNG „Band aus, Kasten an" (v2.144.0 bis v2.330.0).
     Sie ist seit v2.331.0 gegenstandslos: Es gibt nur noch EINE Fassung des
     Zeitraum-Waehlers, und die galt hier ohnehin schon. Wer das Band wieder
     einfuehrt, muss auch diese Regel wieder einfuehren - sonst stehen zwei
     Waehler nebeneinander. */
  /* Grundregel fuer die alte schmale Kopfzeile: Unterrichts-Aktionen stehen
     im Schubfach (Wunsch Murat 05.08.2026). Bei aktiver Kapsel hebt
     body.ml-an oben die ausgeblendeten Aktionen wieder in eine eigene Zeile;
     ihre Kopien im Schubfach verschwinden dort (v2.922.0). */
  .kbx-act.kbx-nurbreit{ display:none; }
  .kbv-grp.kbv-nurschmal{ display:block; }
  .kbv-item.kbv-nurschmal{ display:flex; }
  /* Auch „Verwalten" zeigt nur noch das Zahnrad; sein Name bleibt im title. */
  .kbx-act .kbx-actlbl{ display:none; }
  /* „Verwalten" HAT AUCH HIER KEIN WORT MEHR (v2.922.0, Murat 01.10.2026:
     „verwalten texti gösterme hicbiyerde tek cark olsun"). Bis v2.921.0 stand
     hier die Ausnahme `.kbx-verw .kbx-actlbl{display:inline}` - das Zahnrad
     ist am Telefon jetzt wie am Rechner nur Zeichen; der Name steht im
     `title`. */

  /* --- 9) Werkzeug-Koepfe: SCHRUMPFEN statt schieben (v2.99.8) ------------
     Betrifft Foerderempfehlung, Fehlzeitenbriefe und Blauer Brief.

     WAS IN v2.99.7 FALSCH WAR - und es war die Idee, nicht die Umsetzung:
     Aus „die drei Knoepfe sollen nebeneinander bleiben" wurde eine
     waagerecht SCHIEBBARE Kopfzeile. Damit lagen ausserdem die
     Modus-Reiter („Stufe 1/2/3", „Einzelfach/Sammel") und die
     Funktionsknoepfe in DERSELBEN Schiebespur - zwei Dinge, die nichts
     miteinander zu tun haben. Rueckmeldung Murat: „sayfalarca saga kaydirsin
     insanlar" und „o ne ucube gibi". Beides berechtigt.

     EINE KOPFZEILE SCHIEBT MAN NICHT. Wenn drei Knoepfe nicht passen, macht
     man die Knoepfe kleiner - nicht die Zeile laenger. Deshalb hier:
       - `.foerder-head` darf wieder UMBRECHEN. Reiter oben, Knoepfe darunter:
         zwei ruhige Zeilen, jede in sich vollstaendig.
       - NUR `.fo-btnreihe` bleibt zusammen (`nowrap`) - das war der
         urspruengliche Wunsch, und mehr war es nie.
       - Damit die drei auch wirklich passen, werden sie kompakt: 12px
         statt 13px, engeres Polster, kleinere Symbole. Gerechnet auf 390px:
         „Schnellerfassung" ~112px + „Kopf & Logos" ~92px + „Gespeichert"
         ~86px + 2x7px Abstand = ~304px. Passt mit Rand.
     KEIN `overflow-x` mehr, KEIN `touch-action` - eine Kopfzeile, die sich
     schieben laesst, ist genau der Fehler von vorher. */
  .foerder-head{ flex-wrap:wrap; gap:9px; }
  .fo-btnreihe{ flex-wrap:nowrap; gap:6px; min-width:0; }
  /* `flex:0 0 auto` UND `white-space:nowrap` gehoeren ZUSAMMEN.
     In v2.99.8 stand hier `flex:0 1 auto; min-width:0` - damit durften die
     Knoepfe unter ihre Inhaltsbreite schrumpfen, und „Kopf & Logos" brach
     MITTEN IM KNOPF auf zwei Zeilen um. Das sah schlimmer aus als das
     Problem davor (Befund Murat 03.08.2026). Ein Knopf schrumpft nicht, er
     wird kleiner GESETZT - darum die kleineren Schriftgroessen darunter. */
  .fo-btnreihe > *{ flex:0 0 auto; white-space:nowrap; }
  .foerder-listbtn{ padding:6px 9px; font-size:12px; gap:4px; white-space:nowrap; }
  .foerder-listbtn svg{ width:13px; height:13px; }
  .fo-seg{ padding:6px 11px; font-size:12px; white-space:nowrap; }
  /* KURZE BESCHRIFTUNGEN - der letzte fehlende Schritt (v2.99.10).
     In v2.99.9 passten die drei Knoepfe rechnerisch (~304px), aber eben nur
     rechnerisch: je nach Schrift und Geraet fehlten ein paar Pixel, die Reihe
     ragte hinaus, und weil sie `nowrap` ist, schob sie die GANZE Seite nach
     rechts - sichtbar am angeschnittenen Rand links. Ein Layout, das auf zwei
     Pixel genau aufgeht, ist keines.
     „Schnellerfassung" -> „Schnell", „Kopf & Logos" -> „Kopf",
     „Gespeichert" -> „Liste". Zusammen rund 200px statt 300 - jetzt ist Luft
     da, statt dass es gerade eben reicht. Der ausgeschriebene Text steht
     weiterhin im `title` und ab 641px wieder im Knopf. */
  .fo-lang{ display:none; }
  .fo-kurz{ display:inline; }
  /* Sicherheitsnetz: sollte doch einmal etwas hinausragen, schneidet der Kopf
     es ab, statt die ganze Seite zu verschieben. */
  .foerder-head{ max-width:100%; overflow-x:clip; }

  /* --- 7) PWA-Statusleiste: ZURUECKGENOMMEN (v2.99.3) ---------------------
     Hier stand in v2.99.2 der Versuch, das weisse Panel oben bis an die
     Statusleiste zu schieben (`--m-top:0`, eckige obere Ecken).

     WARUM ES WIEDER WEG IST - und was die Messung dazu gezeigt hat:
     Die eingebaute Diagnose meldete auf dem iPhone 428x926 Bildschirm, aber
     nur 428x879 Innenraum und `safe-area oben 0`. Die 47px Unterschied sind
     die Statusleiste, und sie liegt AUSSERHALB der WebView. Die Seite kann
     sie also gar nicht einfaerben - `--m-top:0` hat nur den eigenen 7px-Rand
     gefressen und damit die Rundung und die Symmetrie zerstoert, ohne den
     fremden Streifen loszuwerden. Ergebnis: schlechter als vorher.

     Der Wunsch dahinter ("der Streifen soll die Flaechenfarbe tragen") ist
     mit `default` grundsaetzlich nicht erfuellbar; iOS zeichnet dort seine
     eigene helle Flaeche. Der EINZIGE Weg waere
     `apple-mobile-web-app-status-bar-style: black-translucent` - dann waechst
     die WebView ueber die volle Hoehe und unsere Flaeche traegt den Streifen
     wirklich. Der Preis ist hart: iOS zwingt Uhr, Netz und Akku dann auf
     WEISS. Auf einer hellen Flaechenfarbe sind sie unlesbar. Das lohnt sich
     nur, wenn die Flaechenfarbe dauerhaft DUNKEL ist - siehe ARCHITEKTUR.md
     §4c 2.99.3. Bis dahin bleibt das Panel so, wie es war: gerundet, mit
     gleichem Rand oben und unten. */
}

/* =====================================================================
   LOGO IM DUNKELMODUS (v2.100.3)
   ---------------------------------------------------------------------
   DER BEFUND (Murat 03.08.2026): "logo karanlik modda böyle oluyo" - die
   Wortmarke verschwand auf dunklem Grund. Kein Wunder: `logo.png` ist zu
   80 % durchsichtig und die Schrift schwarz.

   WAS VORHER DA WAR und hiermit ERSETZT wird: eine weisse Kachel hinter
   `.main-logo` (background-color:#fff, padding, Schatten). Das machte die
   Schrift zwar lesbar, legte aber ein weisses Rechteck mitten in eine
   dunkle Oberflaeche - eine Notloesung, die man sieht. Jetzt wird das BILD
   getauscht: `logo-hell.png` / `logo2-hell.png` sind dieselben Dateien mit
   weisser Schrift; die Farbflaechen (rot, gelb, gruen, blau) bleiben
   unveraendert, weil beim Erzeugen nur Pixel umgefaerbt wurden, die dunkel
   UND gering gesaettigt sind.

   WARUM `content:url()` UND NICHT ZWEI <img> IM HTML:
   Fuer TEXT gilt in diesem Projekt die Regel "beide Fassungen ins HTML, das
   CSS blendet eine aus" (CLAUDE.md) - dort geht es darum, dass niemand beim
   Drehen des Geraets neu rechnen muss. Bei einem Bild waere dieselbe Loesung
   ein zweiter Download und ein zweites Element an sechs Stellen. `content`
   auf einem <img> koennen alle heutigen Browser (Chrome, Safari, Firefox ab
   118); und wenn es doch einmal nicht greift, steht dort das schwarze Logo -
   also genau der Zustand von vorher, kein neuer Schaden. Ein Fehlschlag, der
   auf den Ausgangszustand zurueckfaellt, ist die richtige Art zu scheitern.

   BEIDE WEGE MUESSEN ABGEDECKT SEIN: `prefers-color-scheme` (Geraet steht
   auf dunkel, Nutzer hat in SchlauStart nichts eingestellt) UND
   `data-theme="dark"` (Nutzer hat es ausdruecklich gewaehlt). Umgekehrt
   gewinnt `data-theme="light"` ueber die Geraeteeinstellung - deshalb das
   `html:not([data-theme="light"])`.
   Abgesichert: qa/unit/test_seiten_icons.py.
===================================================================== */
@media (prefers-color-scheme: dark){
  html:not([data-theme="light"]) img.logo-tausch-marke{
    content: url("/static/images/logo-hell.png");
  }
  html:not([data-theme="light"]) img.logo-tausch-wort{
    content: url("/static/images/logo2-hell.png");
  }
}
html[data-theme="dark"] img.logo-tausch-marke{
  content: url("/static/images/logo-hell.png");
}
html[data-theme="dark"] img.logo-tausch-wort{
  content: url("/static/images/logo2-hell.png");
}


/* ===== ELTERNSPRECHTAG (v2.104.0) ==========================================
   Aufbau: static/js/index-app.js (ST-Block) · Hülle: templates/index.html
   (#screen-sprechtag) · Plan: docs/PLAN_ELTERNSPRECHTAG.md

   UMBAU 2c – WARUM HIER KEINE `.card` MEHR VORKOMMT:
   Der Inhalt saß bis 2.103.0 in einer eigenen weißen Karte INNERHALB des
   weißen Panels. Zwei Rahmen um dieselbe Sache, doppelter Innenabstand,
   und der Seitentitel stand irgendwo in der Mitte des Bildschirms
   („sayfa içinde sayfa", Befund Murat 03.08.2026). Jetzt schreibt der
   Screen direkt ins Panel; gegliedert wird mit `.st-block` – einer
   Überschrift und einer Trennlinie, nicht mit einem zweiten Kasten.

   DER TITEL LEBT IN DER APP-KOPFZEILE (#st-tb neben #page-title), wie beim
   Klassenbuch und beim Kalender. Dort stehen auch die Aktionen: „+" für
   einen neuen Sprechtag, Papierkorb, Verlauf. Aktionen zwischen den Daten
   sind Aktionen, die man beim Scrollen verliert.

   DIE TABELLE IST EIN WERKZEUG, KEINE ANZEIGE. Am Sprechtag wird darin
   getippt und geklickt, oft im Stehen. Deshalb große Klickflächen bei „Da?",
   ruhige Zeilen, und Eingabefelder, die erst beim Hineinklicken wie
   Eingabefelder aussehen – sonst flimmert eine Liste aus 24 umrandeten
   Kästen.

   SCHMAL (max-width:640px): NUR dort wird verändert (CLAUDE.md). Die Tabelle
   wird waagerecht schiebbar statt umgebrochen – eine Terminliste, deren
   Zeilen sich in Blöcke auflösen, verliert genau die Eigenschaft, für die
   man sie ansieht: dass die Uhrzeiten untereinander stehen. */

/* --- Kopfzeile + Aktionsleiste ------------------------------------------
   In die APP-KOPFZEILE gehoeren nur Titel und Klasse. Die Aktionsknoepfe
   standen dort einen Versuch lang und haben Postfach und Profil zur Seite
   gedrueckt (Befund Murat 03.08.2026) - der Platz in der Kopfzeile gehoert
   der App, nicht einer einzelnen Seite. Sie sitzen jetzt rechts auf der
   Zeile des Zurueck-Links: ueber dem Inhalt, den sie betreffen, und ohne
   etwas zu verschieben. */
/* FLEX:1 IST HIER KEIN SCHOENHEITSFEHLER, SONDERN DER GRUND, WARUM DAS PROFIL
   RECHTS STEHT (Befund Murat 04.08.2026: "profil ve mesajlar kismi sola
   kayiyor"). `.app-topbar:has(#st-tb) .at-title{flex:0 0 auto}` nimmt dem
   Titel die Dehnung, damit der Klassen-Chip daneben passt. Nimmt sie danach
   NIEMAND auf, schrumpfen Titel und Chip auf ihren Textbedarf, und #authbar
   (flex:none) klebt direkt dahinter - mitten auf dem Bildschirm. Beim
   Klassenbuch faellt das nicht auf, weil #kbx-tb genau dieses flex:1 hat.
   Wer die Zeile hier entfernt, holt den Fehler zurueck. */
#st-tb{ display:flex; align-items:center; gap:7px; margin-left:12px;
  flex:1 1 auto; min-width:0; }
.app-topbar:has(#st-tb) .at-title{ flex:0 0 auto; }
#st-tb .st-tb-klasse{ font-size:13px; color:var(--muted); font-weight:600;
  padding:4px 11px; border:1.5px solid var(--line); border-radius:999px;
  white-space:nowrap; }
/* Die Leiste traegt LINKS die Tagesreiter und RECHTS die Aktionen. Der
   Zurueck-Link stand hier bis 2.105.0 als Text ("Klassenbuch") - er sagte,
   WOHER man kam, und nahm dafuer die ganze linke Haelfte. Zurueck ist jetzt
   der erste Knopf in der Aktionsleiste (Wunsch Murat 04.08.2026). */
#screen-sprechtag .st-leiste{ display:flex; align-items:center; position:relative;
  justify-content:space-between; gap:12px; margin:0 0 14px; flex-wrap:wrap; }
#screen-sprechtag .st-links{ display:flex; align-items:center; gap:10px; flex:0 1 auto; min-width:0; }
/* Was NEBEN dem Zurueck-Knopf steht (v2.148.0): Halbjahr-Reiter bzw. die
   Angabe, fuer welche Klasse geplant wird. Beides sagt, woran man arbeitet -
   es gehoert zur Verortung, nicht in den Inhalt. Auf schmalen Schirmen darf
   es waagerecht geschoben werden, aber NIE umbrechen: die Zeile ist der
   Ausgang, und ein Ausgang, der zweizeilig wird, verschiebt alles darunter. */
#screen-sprechtag .st-links .fn-stufen{ margin:0; flex-wrap:nowrap; }
#screen-sprechtag .st-kopf-info{ font-size:12.5px; color:var(--muted);
  white-space:nowrap; overflow:hidden; text-overflow:ellipsis; min-width:0; }
#screen-sprechtag .st-kopf-info b{ color:var(--ink); font-weight:700; }
/* Die Knopfreihe am Formularende mittig (Wunsch Murat 05.08.2026). */
#screen-sprechtag .st-knopfreihe.mitte{ justify-content:center; }
#screen-sprechtag #st-aktionen{ display:flex; align-items:center; gap:7px;
  margin-left:auto; flex-wrap:wrap; }
#screen-sprechtag .st-tb-b{ width:34px; height:34px; display:grid; place-items:center;
  border:1.5px solid var(--line); border-radius:10px; background:var(--card);
  color:var(--muted); cursor:pointer; padding:0; transition:all .12s; }
#screen-sprechtag .st-tb-b svg{ width:17px; height:17px; fill:none; stroke:currentColor;
  stroke-width:2; stroke-linecap:round; stroke-linejoin:round; }
#screen-sprechtag .st-tb-b:hover{ border-color:#7B4FBF; color:#7B4FBF; }
#screen-sprechtag .st-tb-b.st-tb-zurueck{ margin-right:5px; }

/* --- Tagesreiter ---------------------------------------------------------
   EIN SPRECHTAG KANN MEHRERE TAGE HABEN, und bis 2.104.0 standen alle Termine
   beider Tage in EINER Liste untereinander (Befund Murat 04.08.2026: "iki gün
   sectim ... bir sacmalik oldu"). 36 Zeilen, in denen das Datum als kleine
   Zeile ueber jeder Uhrzeit mitlief - man sah nicht mehr, wo der Montag
   aufhoert. Jetzt ist jeder Tag ein Reiter; sichtbar ist immer genau ein Tag,
   und die Zeit-Spalte braucht dann nur noch die Uhrzeit.
   BEI EINEM EINZIGEN TAG wird gar kein Reiter gezeichnet - ein Reiter, den
   man nicht wechseln kann, ist nur ein Etikett. */
#screen-sprechtag .st-reiter{ display:flex; align-items:center; gap:6px;
  flex:1 1 auto; min-width:0; overflow-x:auto; scrollbar-width:none; }
#screen-sprechtag .st-reiter::-webkit-scrollbar{ display:none; }
#screen-sprechtag .st-reiter-b{ display:inline-flex; align-items:baseline; gap:7px;
  padding:7px 14px; border:1.5px solid var(--line); border-radius:999px;
  background:var(--card); color:var(--muted); font:inherit; font-size:13px;
  font-weight:600; cursor:pointer; white-space:nowrap; transition:all .12s; }
#screen-sprechtag .st-reiter-b small{ font-size:11.5px; font-weight:600; opacity:.8; }
#screen-sprechtag .st-reiter-b:hover{ border-color:#7B4FBF; color:#7B4FBF; }
#screen-sprechtag .st-reiter-b.an{ border-color:#7B4FBF; background:rgba(123,79,191,.10);
  color:#7B4FBF; }

/* --- Grundelemente ------------------------------------------------------- */
#screen-sprechtag .st-unter{ font-size:13.5px; color:var(--muted); margin:0 0 14px; }
#screen-sprechtag .st-laedt{ font-size:14px; color:var(--muted); }
#screen-sprechtag .st-fehler{ font-size:14px; color:var(--bad); }
#screen-sprechtag .st-leer{ font-size:13.5px; color:var(--muted); margin:10px 0; }
#screen-sprechtag .st-fuss{ font-size:12.5px; color:var(--muted); margin:12px 0 0; line-height:1.5; }
#screen-sprechtag .st-strich{ color:var(--muted); }
#screen-sprechtag .btn.st-klein{ margin:0; padding:7px 13px; font-size:13px; }
#screen-sprechtag .btn.st-gefahr{ color:var(--bad); }
/* Gliederung OHNE zweiten Kasten: Überschrift + Linie. */
#screen-sprechtag .st-block{ padding:0 0 18px; margin-bottom:18px;
  border-bottom:1px solid var(--line); }
#screen-sprechtag .st-block:last-of-type{ border-bottom:0; }
#screen-sprechtag .st-block-t{ font-size:11.5px; font-weight:700; color:var(--muted);
  text-transform:uppercase; letter-spacing:.5px; margin-bottom:11px; }
/* Die leere Seite steht MITTIG, der Knopf mittig darunter (Wunsch Murat
   04.08.2026). Links geklebt sah sie aus wie ein abgeschnittener Inhalt und
   nicht wie das, was sie ist: eine Einladung, das Erste anzulegen. */
#screen-sprechtag .st-leerseite{ max-width:480px; margin:min(11vh, 96px) auto 0;
  padding:0; text-align:center; }
#screen-sprechtag .st-leerseite p{ font-size:14px; color:var(--muted); line-height:1.6;
  margin:0 0 10px; }
#screen-sprechtag .st-leerseite p b{ color:var(--text); font-size:15.5px; }
#screen-sprechtag .st-leerseite .btn{ margin:16px auto 0; max-width:300px; }

/* --- Übersichtskarten ----------------------------------------------------
   `max-width:640px` liess die Liste auf einem 27-Zoll-Schirm als schmale
   Spalte links kleben, waehrend rechts zwei Drittel weiss blieben (Befund
   Murat 04.08.2026: "tüm sayfalar sola dayali"). Ein Raster, das sich selbst
   in Spalten teilt, fuellt die Breite ohne die Karten zu verzerren: 320px ist
   die Breite, ab der Datum, Zeitraum und Zaehler nebeneinander lesbar
   bleiben. */
#screen-sprechtag .st-karten{ display:grid; gap:10px;
  grid-template-columns:repeat(auto-fill, minmax(320px, 1fr)); }
/* DIE KARTE BEANTWORTET DIE FRAGE, DIE MAN BEIM DRAUFSCHAUEN HAT.
   Vorher: drei graue Zeilen in derselben Groesse - Datum, Uhrzeit und
   Belegung sahen gleich wichtig aus, also sah man keins davon. Jetzt traegt
   der Wochentag das Gewicht (danach sucht man), und die Belegung ist ein
   Balken: eine Zahl sagt "7 von 12", ein Balken sagt es, ohne dass man
   rechnet. */
#screen-sprechtag .st-karte{ position:relative; border:1.5px solid var(--line);
  border-radius:15px; background:var(--card); transition:border-color .15s,
  box-shadow .15s; }
#screen-sprechtag .st-karte:hover{ border-color:#7B4FBF;
  box-shadow:0 6px 20px rgba(123,79,191,.13); }
#screen-sprechtag .st-k-flaeche{ display:block; width:100%; text-align:left;
  padding:16px 17px 15px; background:none; border:0; font:inherit;
  color:var(--text); cursor:pointer; }
#screen-sprechtag .st-k-kopf{ font-size:13px; font-weight:700; color:var(--muted);
  text-transform:uppercase; letter-spacing:.4px; margin-bottom:9px;
  padding-right:30px; }
#screen-sprechtag .st-k-zeiten{ display:flex; flex-wrap:wrap; gap:6px 18px;
  margin-bottom:12px; }
#screen-sprechtag .st-k-tag{ display:block; }
#screen-sprechtag .st-k-tag b{ display:block; font-size:var(--fs-base); font-weight:700;
  letter-spacing:-.2px; }
#screen-sprechtag .st-k-tag span{ font-size:13px; color:var(--muted);
  font-variant-numeric:tabular-nums; }
#screen-sprechtag .st-k-balken{ height:6px; border-radius:999px;
  background:var(--line); overflow:hidden; margin-bottom:9px; }
#screen-sprechtag .st-k-balken i{ display:block; height:100%; border-radius:999px;
  background:#7B4FBF; transition:width .25s; }
#screen-sprechtag .st-k-zahlen{ display:flex; flex-wrap:wrap; gap:4px 14px;
  font-size:12.5px; color:var(--muted); }
#screen-sprechtag .st-k-zahlen b{ color:var(--text); font-size:13.5px; }
/* Der Loeschknopf liegt UEBER der Flaeche und stoppt den Klick - sonst
   oeffnete er den Sprechtag, den er wegraeumen soll. */
#screen-sprechtag .st-k-menue{ position:absolute; top:10px; right:10px; z-index:2;
  width:28px; height:28px; display:grid; place-items:center; border:0;
  border-radius:8px; background:transparent; color:var(--muted); cursor:pointer;
  padding:0; opacity:0; transition:opacity .12s, background .12s; }
#screen-sprechtag .st-karte:hover .st-k-menue,
#screen-sprechtag .st-k-menue:focus{ opacity:1; }
#screen-sprechtag .st-k-menue:hover{ background:rgba(192,57,43,.12); color:var(--bad); }
#screen-sprechtag .st-k-menue svg{ width:15px; height:15px; fill:none;
  stroke:currentColor; stroke-width:2; stroke-linecap:round; stroke-linejoin:round; }
#screen-sprechtag .st-karte.fertig{ background:rgba(21,160,90,.05);
  border-color:rgba(21,160,90,.3); }
#screen-sprechtag .st-karte-tage{ display:inline-block; margin-left:7px; padding:1px 8px;
  border-radius:999px; background:rgba(123,79,191,.12); color:#7B4FBF;
  font-size:11px; font-weight:700; letter-spacing:0; text-transform:none; }
#screen-sprechtag .st-karte-fertig{ display:inline-block; margin-left:7px; padding:1px 9px;
  border-radius:999px; background:rgba(21,160,90,.14); color:#15A05A;
  font-size:11px; font-weight:700; letter-spacing:0; text-transform:none; }

/* Abschluss-Bereich unter der Tabelle. Der grosse Knopf ist der ABSCHLUSS -
   die richtige Geste fuer einen gelungenen Tag; das Zurueckziehen bleibt
   daneben und sieht auch danach aus. */
/* MITTIG (Wunsch Murat 05.08.2026: "alttaki butonlari ortala sola dayali
   olmasin"). Linksbuendig sahen die beiden Knoepfe aus wie der Anfang einer
   weiteren Zeile der Tabelle darueber - sie sind aber der ABSCHLUSS der
   Seite. `justify-content:center` gilt nicht fuer die abgeschlossene
   Fassung: dort steht links eine Meldung und rechts ein Knopf, und die
   gehoert ueber die volle Breite. */
#screen-sprechtag .st-abschluss{ display:flex; flex-wrap:wrap; gap:10px;
  align-items:center; justify-content:center; margin-top:22px; padding-top:18px;
  border-top:1px solid var(--line); }
#screen-sprechtag .st-abschluss:has(.st-abschluss-fertig){ justify-content:flex-start; }
#screen-sprechtag .st-abschluss .btn{ width:auto; margin:0; padding:11px 22px; }
#screen-sprechtag .st-abschluss-fertig{ display:flex; align-items:center; gap:11px;
  flex:1 1 320px; padding:11px 14px; border-radius:12px;
  background:rgba(21,160,90,.09); border:1.5px solid rgba(21,160,90,.3); }
#screen-sprechtag .st-abschluss-fertig svg{ width:20px; height:20px; flex:none;
  fill:none; stroke:#15A05A; stroke-width:2.6; stroke-linecap:round;
  stroke-linejoin:round; }
#screen-sprechtag .st-abschluss-fertig div{ flex:1 1 auto; }
#screen-sprechtag .st-abschluss-fertig b{ display:block; font-size:14px; }
#screen-sprechtag .st-abschluss-fertig small{ font-size:12.5px; color:var(--muted); }

/* --- Formular ------------------------------------------------------------
   Die feste Kappe von 680px war auf breiten Schirmen eine halb leere Seite.
   `auto-fit` legt so viele Spalten nebeneinander, wie bei 250px Mindestbreite
   hineinpassen - am Computer drei, auf dem Tablet zwei, am Telefon eine. Die
   Zeitzeilen behalten eine Kappe: fuenf Uhrzeit-Felder ueber 1600px gezogen
   sind kein Formular mehr, sondern eine Landebahn. */
#screen-sprechtag .st-form{ display:grid; gap:11px 13px;
  grid-template-columns:repeat(auto-fit, minmax(250px, 1fr)); max-width:1100px; }
#screen-sprechtag .st-form label{ display:block; font-size:12.5px; color:var(--muted);
  margin-bottom:4px; }
#screen-sprechtag .st-tagkopf,
#screen-sprechtag .st-tagzeile{ display:grid;
  grid-template-columns:1.5fr 1fr 1fr 1fr 1fr 30px; gap:7px; align-items:center;
  max-width:820px; }
#screen-sprechtag .st-tagkopf{ font-size:11px; font-weight:700; color:var(--muted);
  text-transform:uppercase; letter-spacing:.4px; margin-bottom:5px; }
#screen-sprechtag .st-tagzeile{ margin-bottom:7px; }
/* `min-width:0` IST HIER DER GANZE FEHLER GEWESEN (Befund Murat 05.08.2026:
   "Sprechtag planen kismi tam sigmamis ekrana saga dogru büyümüs").
   Rasterelemente haben von sich aus `min-width:auto`, also die Breite ihres
   Inhalts. Ein `<input type="date">` meldet auf iOS eine Mindestbreite von
   deutlich ueber 200px - zwei davon nebeneinander sprengen ein 360px-Telefon,
   und zwar nicht das Feld, sondern die ganze SEITE: sie wird waagerecht
   schiebbar, und alles andere rutscht mit. `min-width:0` erlaubt dem Feld zu
   schrumpfen; `max-width:100%` faengt Safari zusaetzlich ab, das die
   Mindestbreite mancher Datumsfelder auch dann noch durchsetzt. */
#screen-sprechtag .st-tagzeile > *{ min-width:0; max-width:100%; }
#screen-sprechtag .st-form > *{ min-width:0; }
#screen-sprechtag .st-tf{ display:block; min-width:0; }
#screen-sprechtag .st-tf > span{ display:none; }
#screen-sprechtag .st-tagzeile input{ width:100%; min-width:0; padding:8px 9px;
  border:1.5px solid var(--line);
  border-radius:9px; font:inherit; font-size:13.5px; background:var(--card); color:var(--text); }
#screen-sprechtag .st-mehr{ background:none; border:0; padding:4px 0; font:inherit;
  font-size:13px; font-weight:600; color:#7B4FBF; cursor:pointer; }
/* HIER STANDEN DIE ZWEI MODUS-KARTEN (.st-modus / .st-modus-w). Sie sind
   weg, weil die Frage weg ist: Eltern sehen jetzt IMMER die freien Uhrzeiten
   und darunter den Ausweg "keine passt mir" (v2.123.0, §4c). Die Regeln
   stehen nicht mehr hier - auch nicht auskommentiert, sonst kommen sie beim
   naechsten Aufraeumen zurueck. */
#screen-sprechtag .st-vorschau{ font-size:13.5px; margin-bottom:4px; }
#screen-sprechtag .st-warn{ margin-top:9px; padding:9px 11px; border-radius:10px;
  background:rgba(245,166,35,.14); font-size:13px; line-height:1.5; max-width:820px; }
#screen-sprechtag .st-warn-rot{ color:var(--bad); }
#screen-sprechtag .st-knopfreihe{ display:flex; gap:8px; margin-top:16px; max-width:520px; }
#screen-sprechtag .st-knopfreihe.mitte{ max-width:none; justify-content:center; }
#screen-sprechtag .st-knopfreihe .btn,
#st-kind-ov .st-knopfreihe .btn,
#st-notiz-ov .st-knopfreihe .btn{ flex:1; margin:0; }

/* --- Zahlen-Chips = Filter -----------------------------------------------
   Eine Zahl, die man anklicken kann, spart die Suche danach: „3 ohne Mail"
   → Klick → genau diese drei.

   SIE STEHEN JETZT IN EINEM AUSKLAPP-FENSTER hinter dem Trichter-Symbol
   (Wunsch Murat 04.08.2026). Als offene Zeile nahmen sechs Chips die volle
   Breite ueber der Tabelle weg - jeden Tag, obwohl gefiltert selten wird.
   Der Trichter traegt die aktive Zahl als Punkt, damit ein gesetzter Filter
   nicht unsichtbar wird: eine Liste, die etwas verschweigt, ohne es zu
   sagen, ist die schlimmste Art von Liste. */
#st-leit-ov .st-leit-liste{ display:grid; gap:6px; margin-bottom:6px; }
#st-leit-ov .st-leit-z{ display:flex; align-items:center; justify-content:space-between;
  gap:10px; padding:10px 12px; border:1.5px solid var(--line); border-radius:11px; }
#st-leit-ov .st-leit-z b{ display:block; font-size:14px; }
#st-leit-ov .st-leit-z small{ font-size:12px; color:var(--muted); }
#st-leit-ov .st-leit-lab{ display:block; font-size:12.5px; color:var(--muted);
  margin:12px 0 4px; }
#st-leit-ov .st-leit-info{ margin-top:14px; padding:11px 13px; border-radius:11px;
  background:rgba(123,79,191,.08); font-size:12.5px; line-height:1.55; }
#st-leit-ov .versteckt{ display:none; }
#screen-sprechtag .st-filterhalter{ position:relative; display:inline-flex;
  align-items:center; }
#screen-sprechtag .st-tb-b.an{ border-color:#7B4FBF; color:#7B4FBF;
  background:rgba(123,79,191,.10); }
/* DIE ZAHL LIEGT IM KNOPF, nicht darueber: ein absolut gesetzter Punkt am
   oberen Rand haengt ausserhalb der Leiste und wird vom naechsten Elternteil
   mit `overflow` abgeschnitten - genau das passierte am Status-Knopf
   (Befund Murat 04.08.2026, "balon kesilmis"). Was innen liegt, kann nichts
   abschneiden. */
#screen-sprechtag .st-tb-zahl{ display:inline-grid; place-items:center;
  min-width:19px; height:19px; padding:0 5px; margin-left:2px;
  border-radius:999px; background:#7B4FBF; color:#fff; font-size:11px;
  font-weight:700; line-height:1; }
#screen-sprechtag .st-filterpunkt{ position:absolute; top:-4px; right:-4px;
  min-width:17px; height:17px; padding:0 4px; border-radius:999px;
  background:#7B4FBF; color:#fff; font-size:10.5px; font-weight:700;
  line-height:17px; text-align:center; pointer-events:none; }
#screen-sprechtag .st-filterbox{ position:absolute; top:calc(100% + 7px); right:0;
  z-index:40; min-width:250px; padding:11px; border:1.5px solid var(--line);
  border-radius:13px; background:var(--card);
  box-shadow:0 14px 34px rgba(0,0,0,.16); }
#screen-sprechtag .st-filterbox .st-chips{ flex-direction:column; align-items:stretch;
  margin:0; gap:5px; }
#screen-sprechtag .st-filterbox .st-chip{ justify-content:space-between; border-radius:9px; }
#screen-sprechtag .st-chips{ display:flex; flex-wrap:wrap; gap:7px; margin-bottom:12px; }
#screen-sprechtag .st-chip{ --chip:var(--muted); display:inline-flex; align-items:center; gap:5px;
  padding:5px 11px; border:1.5px solid var(--line); border-radius:999px;
  background:var(--card); color:var(--muted); font:inherit; font-size:12.5px;
  cursor:pointer; transition:border-color .15s, color .15s; }
#screen-sprechtag .st-chip b{ color:var(--chip); font-size:13.5px; }
#screen-sprechtag .st-chip:hover{ border-color:var(--chip); }
#screen-sprechtag .st-chip.aktiv{ border-color:var(--chip); color:var(--text); font-weight:600; }
#screen-sprechtag .st-chip.still{ cursor:default; }
#screen-sprechtag .st-chip.still:hover{ border-color:var(--line); }

/* --- Elternlink + Wunschzeiten -------------------------------------------
   EINE ZEILE, FARBIG, MIT EINEM KNOPF, DEN MAN TRIFFT (Befund Murat
   04.08.2026). Vorher: ein gestrichelter Kasten in Seitenbreite, die Adresse
   umbrochen ueber zwei Zeilen (`word-break:break-all`), daneben ein 13px
   kleiner Geisterknopf. Die Adresse ist das, was die Lehrkraft weitergibt -
   sie ist der Inhalt dieser Zeile, nicht ihre Fussnote.
   `overflow:hidden` + `text-overflow:ellipsis` statt Umbruch: lieber hinten
   abgeschnitten als zweizeilig, denn kopiert wird ohnehin der volle Wert. */
/* DAS BAND: Adresse + vier Vorlagen in EINER Reihe.
   Sie gehoeren zusammen, weil sie dasselbe sind - das, was aus dieser Seite
   HERAUSGEHT und bei der Familie ankommt. Die Adresse ist breiter (flex:3),
   weil sie einen WERT traegt, den man lesen muss; die Kacheln tragen nur
   ihren Namen. */
#screen-sprechtag .st-band{ display:flex; flex-wrap:wrap; gap:10px;
  align-items:stretch; margin-bottom:6px; }
#screen-sprechtag .st-bandnotiz{ font-size:12px; color:var(--muted);
  margin:0 0 14px; }
#screen-sprechtag .st-dokkachel{ flex:1 1 150px; min-width:0; display:flex;
  flex-direction:column; align-items:flex-start; gap:2px; text-align:left;
  padding:11px 13px; border:1.5px solid var(--line); border-radius:13px;
  background:var(--card); color:var(--text); font:inherit; cursor:pointer;
  transition:border-color .15s, background .15s; }
#screen-sprechtag .st-dokkachel:hover{ border-color:#7B4FBF;
  background:rgba(123,79,191,.05); }
#screen-sprechtag .st-dokkachel svg{ width:18px; height:18px; fill:none;
  stroke:#7B4FBF; stroke-width:1.9; stroke-linecap:round; stroke-linejoin:round;
  margin-bottom:3px; }
#screen-sprechtag .st-dokkachel b{ font-size:13.5px; }
#screen-sprechtag .st-dokkachel small{ font-size:11.5px; color:var(--muted);
  line-height:1.35; }
#screen-sprechtag .st-dokkachel.aus{ opacity:.5; cursor:default; }
#screen-sprechtag .st-dokkachel.aus:hover{ border-color:var(--line);
  background:var(--card); }

#screen-sprechtag .st-link{ flex:3 1 300px; min-width:0;
  display:flex; gap:12px; align-items:center;
  padding:10px 10px 10px 15px; margin-bottom:0; border-radius:13px;
  border:1.5px solid rgba(123,79,191,.35); background:rgba(123,79,191,.08); }
#screen-sprechtag .st-link-txt{ flex:1 1 auto; min-width:0; }
#screen-sprechtag .st-link b{ display:block; font-size:10.5px; color:#7B4FBF;
  text-transform:uppercase; letter-spacing:.5px; }
#screen-sprechtag .st-link code{ display:block; font-size:15px; font-weight:700;
  color:var(--text); white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
  letter-spacing:.2px; }
#screen-sprechtag .st-link .st-kopier{ flex:0 0 auto; display:inline-flex;
  align-items:center; gap:7px; padding:0 18px; height:40px; border:0;
  border-radius:10px; background:#7B4FBF; color:#fff; font:inherit; font-size:14px;
  font-weight:700; cursor:pointer; transition:filter .12s; }
#screen-sprechtag .st-link .st-kopier:hover{ filter:brightness(1.08); }
#screen-sprechtag .st-link .st-kopier svg{ width:17px; height:17px; fill:none;
  stroke:currentColor; stroke-width:2; stroke-linecap:round; stroke-linejoin:round; }
/* --- Status-Fenster ------------------------------------------------------
   Drei Namenslisten standen als Fliesstext quer ueber der Seite. Zwanzig
   Namen mit Komma sind kein Verzeichnis, sondern ein Absatz - man liest ihn
   nicht, man sucht darin. Als Plaettchen ist jeder Name ein eigenes Ding und
   auf einen Blick zaehlbar. */
#st-status-ov .st-w-zeile{ padding:6px 0; border-bottom:1px solid var(--line); font-size:13.5px; }
#st-status-ov .st-w-zeile:last-child{ border-bottom:0; }
#st-status-ov .st-w-zeile b{ margin-right:9px; }
#st-status-ov .st-w-zeile span{ color:var(--muted); }
#st-status-ov .st-w-zeile small{ display:block; color:var(--muted); font-style:italic; }
#st-status-ov .st-statuszahlen{ display:grid;
  grid-template-columns:repeat(auto-fit, minmax(90px, 1fr)); gap:9px;
  margin-bottom:18px; }
#st-status-ov .st-statuszahlen div{ padding:11px 12px; border-radius:12px;
  border:1.5px solid var(--line); text-align:center; }
#st-status-ov .st-statuszahlen b{ display:block; font-size:21px; line-height:1.2; }
#st-status-ov .st-statuszahlen span{ font-size:11.5px; color:var(--muted); }
#st-status-ov .st-statusblock{ padding-bottom:16px; margin-bottom:16px;
  border-bottom:1px solid var(--line); }
#st-status-ov .st-statusblock:last-child{ border-bottom:0; margin-bottom:0;
  padding-bottom:0; }
#st-status-ov .st-block-t{ font-size:11.5px; font-weight:700; color:var(--muted);
  text-transform:uppercase; letter-spacing:.5px; margin-bottom:10px; }
#st-status-ov .st-zaehl{ display:inline-block; margin-left:6px; padding:1px 8px;
  border-radius:999px; background:rgba(123,79,191,.12); color:#7B4FBF;
  font-size:11px; letter-spacing:0; }
#st-status-ov .st-namen{ display:flex; flex-wrap:wrap; gap:6px; }
#st-status-ov .st-name{ padding:5px 12px; border-radius:999px;
  border:1.5px solid var(--line); font-size:13px; background:var(--card); }
#st-status-ov .st-leer{ font-size:13.5px; color:var(--muted); margin:0; }
#st-status-ov .btn.st-klein{ margin:0; padding:8px 14px; font-size:13px;
  width:auto; display:inline-block; }

/* --- Blaue Briefe aus den Fachnoten --------------------------------------
   Eine Vorschlagsliste, keine Entscheidung: Jede Zeile ist abwaehlbar, und
   die betroffenen Faecher stehen NEBEN dem Namen - sonst muesste die
   Lehrkraft zum Raster zurueck, um zu sehen, warum ein Kind dabei ist. */
#fn-bb-ov .fn-bb-hj{ font-weight:600; color:var(--muted); font-size:12.5px;
  margin-left:7px; }
#fn-bb-ov .fn-bb-alle{ display:flex; align-items:center; gap:8px;
  flex-wrap:wrap; margin-bottom:12px; }
#fn-bb-ov .fn-bb-alle small{ color:var(--muted); font-size:11.5px;
  font-style:italic; }
#fn-bb-ov .fn-bb-liste{ max-height:46vh; overflow-y:auto; }
#fn-bb-ov .fn-bb-zeile{ display:flex; align-items:flex-start; gap:10px;
  padding:9px 2px; border-bottom:1px solid var(--line); cursor:pointer; }
#fn-bb-ov .fn-bb-zeile:last-child{ border-bottom:0; }
#fn-bb-ov .fn-bb-zeile input{ flex:0 0 auto; width:18px; height:18px;
  margin-top:2px; accent-color:#7B4FBF; cursor:pointer; }
#fn-bb-ov .fn-bb-name{ flex:0 0 34%; font-weight:700; font-size:13.5px;
  word-break:break-word; }
#fn-bb-ov .fn-bb-faecher{ flex:1 1 auto; display:flex; flex-wrap:wrap; gap:5px; }
#fn-bb-ov .fn-bb-fach{ padding:2px 9px; border-radius:999px; font-size:12px;
  background:rgba(220,53,69,.10); color:#B3202F; white-space:nowrap; }
#fn-bb-ov .fn-bb-fach b{ font-weight:800; }
#fn-bb-ov .fn-bb-fuss{ display:flex; justify-content:flex-end; gap:9px;
  margin-top:16px; }
#fn-bb-ov .fn-bb-fuss .btn{ width:auto; margin:0; padding:10px 18px;
  font-size:14px; }
/* Auf dem Telefon steht der Name UEBER den Faechern - nebeneinander bleiben
   von jedem Fach zwei Buchstaben uebrig. */
@media (max-width:640px){
  #fn-bb-ov .fn-bb-zeile{ flex-wrap:wrap; }
  #fn-bb-ov .fn-bb-name{ flex:1 1 auto; }
  #fn-bb-ov .fn-bb-faecher{ flex:1 1 100%; padding-left:28px; }
  #fn-bb-ov .fn-bb-fuss .btn{ flex:1 1 auto; }
}

/* --- Tabelle ------------------------------------------------------------- */
#screen-sprechtag .st-tabwrap{ overflow-x:auto; }
#screen-sprechtag .st-tab{ width:100%; border-collapse:collapse; font-size:13.5px; }
#screen-sprechtag .st-tab th{ text-align:left; font-size:11px; font-weight:700;
  text-transform:uppercase; letter-spacing:.4px; color:var(--muted);
  padding:0 8px 8px; border-bottom:1.5px solid var(--line); white-space:nowrap; }
#screen-sprechtag .st-tab td{ padding:6px 8px; border-bottom:1px solid var(--line);
  vertical-align:middle; }
#screen-sprechtag .st-tab tr:hover td{ background:rgba(123,79,191,.05); }
#screen-sprechtag .st-leerzeile td{ opacity:.55; }
/* Sortierbare Spaltenköpfe. Der Pfeil steht IMMER im Kopf (blass, wenn diese
   Spalte gerade nicht sortiert) - ein Pfeil, der erst beim Klicken erscheint,
   verraet vorher nicht, dass man klicken kann. */
#screen-sprechtag .st-tab th.st-sortbar{ padding:0; }
#screen-sprechtag .st-sortb{ display:inline-flex; align-items:center; gap:5px;
  width:100%; padding:0 8px 8px; background:none; border:0; font:inherit;
  font-size:11px; font-weight:700; text-transform:uppercase; letter-spacing:.4px;
  color:var(--muted); cursor:pointer; }
#screen-sprechtag .st-sortb:hover{ color:#7B4FBF; }
#screen-sprechtag .st-sortb svg{ width:11px; height:11px; fill:none; stroke:currentColor;
  stroke-width:2.6; stroke-linecap:round; stroke-linejoin:round; opacity:.28; }
#screen-sprechtag .st-sortb.an{ color:#7B4FBF; }
#screen-sprechtag .st-sortb.an svg{ opacity:1; }
#screen-sprechtag .st-c-zeit{ width:74px; font-weight:700; font-variant-numeric:tabular-nums; }
#screen-sprechtag .st-c-zeit small{ display:block; font-weight:600; font-size:10.5px;
  color:var(--muted); }
#screen-sprechtag .st-c-kind{ min-width:150px; }
#screen-sprechtag .st-c-eltern{ min-width:140px; }
#screen-sprechtag .st-c-anw{ width:62px; }
#screen-sprechtag .st-c-mail{ min-width:190px; }
#screen-sprechtag .st-c-code{ width:104px; }
#screen-sprechtag .st-c-notiz{ min-width:180px; }
#screen-sprechtag .st-c-weg{ width:34px; }

/* Anwesenheit: EIN Kästchen, drei Aussagen (Wunsch Murat 04.08.2026).
   Vorher waren es zwei Knöpfe („war da" / „nicht erschienen") - also zwei
   Klickziele fuer eine Frage, und der Zustand „noch nicht erfasst" sah aus
   wie „nicht erschienen". Jetzt gilt:
     angehakt              → Zeile gruen  (die Familie war da)
     leer, Zeit laeuft     → Zeile neutral (noch offen)
     leer, Zeit ist vorbei → Zeile rot     (nicht erschienen)
   Das Rot entsteht also aus der UHR, nicht aus einem zweiten Klick - genau
   deshalb muss niemand am Ende des Tages 24 Zeilen nacharbeiten. Gespeichert
   wird weiterhin nur „ja" oder leer; „nicht erschienen" ist eine Ableitung
   und keine Eingabe. */
#screen-sprechtag .st-da{ display:inline-flex; align-items:center; justify-content:center;
  width:30px; height:30px; border:2px solid var(--line); border-radius:9px;
  background:var(--card); color:transparent; cursor:pointer; padding:0;
  transition:all .12s; }
#screen-sprechtag .st-da svg{ width:16px; height:16px; fill:none; stroke:currentColor;
  stroke-width:3; stroke-linecap:round; stroke-linejoin:round; }
#screen-sprechtag .st-da:hover{ border-color:#15A05A; color:rgba(21,160,90,.45); }
#screen-sprechtag .st-da.an{ background:#15A05A; border-color:#15A05A; color:#fff; }
#screen-sprechtag tr.st-z-da td{ background:rgba(21,160,90,.09); }
#screen-sprechtag tr.st-z-da:hover td{ background:rgba(21,160,90,.15); }
#screen-sprechtag tr.st-z-weg td{ background:rgba(192,57,43,.09); }
#screen-sprechtag tr.st-z-weg:hover td{ background:rgba(192,57,43,.15); }
#screen-sprechtag tr.st-z-weg .st-da{ border-color:rgba(192,57,43,.55); }

#screen-sprechtag .st-kind{ background:none; border:0; padding:0; font:inherit;
  font-weight:600; color:var(--text); cursor:pointer; text-align:left;
  border-bottom:1px dashed var(--line); }
#screen-sprechtag .st-kind:hover{ border-bottom-color:currentColor; }
#screen-sprechtag .st-fb{ margin-right:3px; }
#screen-sprechtag .st-sel{ width:100%; padding:5px 7px; border:1.5px solid var(--line);
  border-radius:8px; font:inherit; font-size:13px; background:var(--card); color:var(--text); }
/* Eingabefelder in der Tabelle: unauffällig, bis man hineinklickt. 24 umrandete
   Kästen untereinander machen die Liste unlesbar. */
#screen-sprechtag .st-in{ width:100%; padding:5px 7px; border:1.5px solid transparent;
  border-radius:8px; font:inherit; font-size:13px; background:transparent; color:var(--text); }
#screen-sprechtag .st-in::placeholder{ color:var(--muted); opacity:.6; }
#screen-sprechtag .st-in:hover{ border-color:var(--line); }
#screen-sprechtag .st-in:focus{ border-color:#7B4FBF; background:var(--card); outline:none; }
/* Der Code hat eine EIGENE Spalte (Wunsch Murat 04.08.2026: "email ve code
   ayri ayri"). Er gehoert dem KIND (students.eltern_code), die Adresse gehoert
   dem TERMIN - zwei verschiedene Dinge in einer Zelle sahen aus wie eins, und
   wer die Adresse leerte, meinte manchmal den Code. Ein Klick kopiert ihn. */
#screen-sprechtag .st-code{ display:inline-flex; align-items:center; gap:6px;
  font-family:ui-monospace,SFMono-Regular,Menlo,monospace; font-size:12.5px;
  letter-spacing:1px; padding:4px 9px; border:0; border-radius:7px;
  background:rgba(123,79,191,.12); color:#7B4FBF; font-weight:700;
  cursor:pointer; transition:background .12s; }
#screen-sprechtag .st-code:hover{ background:rgba(123,79,191,.22); }
#screen-sprechtag .st-code svg{ width:12px; height:12px; fill:none; stroke:currentColor;
  stroke-width:2; stroke-linecap:round; stroke-linejoin:round; opacity:.7; }
/* Absprachen: die Zelle zeigt den Anfang und öffnet den Dialog. */
#screen-sprechtag .st-notizbtn{ width:100%; text-align:left; background:none;
  border:1.5px solid transparent; border-radius:8px; padding:5px 7px; font:inherit;
  font-size:13px; color:var(--text); cursor:pointer; }
#screen-sprechtag .st-notizbtn:hover{ border-color:var(--line); }
#screen-sprechtag .st-notiz-leer{ color:var(--muted); opacity:.6; }
#screen-sprechtag .st-x{ width:26px; height:26px; display:grid; place-items:center;
  border:0; border-radius:7px; background:transparent; color:var(--muted); cursor:pointer; padding:0; }
#screen-sprechtag .st-x svg{ width:13px; height:13px; fill:none; stroke:currentColor; stroke-width:2.4; }
#screen-sprechtag .st-x:hover{ background:rgba(192,57,43,.12); color:var(--bad); }
#screen-sprechtag .st-pk-zeile{ display:flex; gap:12px; align-items:center;
  justify-content:space-between; padding:11px 0; border-bottom:1px solid var(--line);
  max-width:640px; }
#screen-sprechtag .st-pk-zeile small{ display:block; font-size:12.5px; color:var(--muted); margin-top:2px; }

/* --- Notiz-Dialog -------------------------------------------------------- */
#st-notiz-ov .st-unter{ font-size:13px; color:var(--muted); margin:0 0 12px; }
#st-notiz-ov .st-notiz-feld{ width:100%; padding:12px 13px; border:1.5px solid var(--line);
  border-radius:11px; font:inherit; font-size:var(--fs-md); line-height:1.6;
  background:var(--card); color:var(--text); resize:vertical; }
#st-notiz-ov .st-notiz-feld:focus{ border-color:#7B4FBF; outline:none; }
#st-notiz-ov .st-anh-liste{ display:flex; flex-wrap:wrap; gap:9px; margin-top:12px; }
#st-notiz-ov .st-anh{ position:relative; width:96px; }
#st-notiz-ov .st-anh a{ display:block; text-decoration:none; color:var(--text); }
#st-notiz-ov .st-anh img{ width:96px; height:72px; object-fit:cover; border-radius:9px;
  border:1.5px solid var(--line); display:block; }
#st-notiz-ov .st-anh-ico{ width:96px; height:72px; display:grid; place-items:center;
  border-radius:9px; border:1.5px solid var(--line); background:var(--card);
  font-size:12px; font-weight:700; color:var(--muted); }
#st-notiz-ov .st-anh-n{ display:block; font-size:11px; color:var(--muted); margin-top:3px;
  overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
#st-notiz-ov .st-anh .st-x{ position:absolute; top:3px; right:3px; width:22px; height:22px;
  background:rgba(255,255,255,.9); border-radius:6px; }
#st-notiz-ov .st-anh .st-x svg{ width:12px; height:12px; fill:none; stroke:currentColor;
  stroke-width:2.6; }
#st-notiz-ov .st-anh-knoepfe{ display:flex; gap:8px; margin-top:13px; }
#st-notiz-ov .st-anh-knoepfe .btn{ margin:0; cursor:pointer; }
#st-notiz-ov .st-notiz-hinweis{ font-size:12px; color:var(--muted); margin-top:9px;
  line-height:1.5; }
#st-notiz-ov .versteckt{ display:none; }

/* --- Kind-Pop-up --------------------------------------------------------- */
#st-kind-ov .st-tl{ display:grid; grid-template-columns:78px 1fr auto; gap:10px;
  padding:7px 0; border-bottom:1px solid var(--line); font-size:13px; align-items:baseline; }
#st-kind-ov .st-tl-d{ color:var(--muted); font-size:12px; font-variant-numeric:tabular-nums; }
#st-kind-ov .st-tl-t small{ color:var(--muted); }
#st-kind-ov .st-tl-w{ font-weight:700; }
#st-kind-ov .st-leer{ font-size:13.5px; color:var(--muted); margin:10px 0; }

@media (max-width:640px){
  /* Die Aktionen bleiben oben, der Klassen-Chip weicht - er wiederholt, was
     schon auf der Seite steht, und nimmt dem Titel die Breite. */
  #st-tb .st-tb-klasse{ display:none; }
  /* DER TITEL DARF SCHMAL SCHRUMPFEN (Befund Murat 05.08.2026: "profil
     resmini kaydirmis safa"). Breit ist `flex:0 0 auto` richtig - der Titel
     soll dort nicht gestaucht werden. Schmal schob "Noten der
     Fachlehrkräfte" genau deshalb den Avatar aus dem Bild: Was nicht
     schrumpfen darf, draengt alles andere hinaus. Hier also schrumpfen und
     notfalls kuerzen - der Avatar ist ein Bedienelement, der Titel eine
     Beschriftung. */
  .app-topbar:has(#st-tb) .at-title{ flex:1 1 auto; min-width:0;
    font-size:clamp(15px,4.3vw,19px); overflow:hidden;
    text-overflow:ellipsis; white-space:nowrap; }
  #screen-sprechtag .st-form{ grid-template-columns:1fr; }
  #screen-sprechtag .st-tagkopf{ display:none; }
  #screen-sprechtag .st-tagzeile{ grid-template-columns:1fr 1fr; gap:7px 8px;
    padding-bottom:9px; margin-bottom:9px; border-bottom:1px solid var(--line); }
  /* Der Kopf mit den Spaltennamen ist weg - also traegt jedes Feld seinen
     eigenen. Ohne das standen dort zwei leere Kaesten, von denen niemand
     wusste, dass es die Pause ist. */
  #screen-sprechtag .st-tf > span{ display:block; font-size:11px; font-weight:600;
    color:var(--muted); margin-bottom:3px; }
  #screen-sprechtag .st-tf:first-child{ grid-column:1 / -1; }
  /* Auf einen Blick statt dreimal scrollen: enger gesetzt, aber nicht kleiner
     angefasst - die Felder behalten ihre 44px Hoehe. */
  #screen-sprechtag .st-block{ padding-bottom:14px; margin-bottom:14px; }
  #screen-sprechtag .st-form{ gap:9px; }
  /* Waagerecht schieben statt umbrechen – die Uhrzeiten müssen untereinander
     bleiben, sonst ist es keine Terminliste mehr. 860 statt 740: seit 2d hat
     der Elterncode eine eigene Spalte. */
  #screen-sprechtag .st-tab{ min-width:860px; }
  #screen-sprechtag .st-knopfreihe{ max-width:none; }
  /* Eine Karte je Zeile: zwei nebeneinander waeren auf 360px zwei Streifen,
     in denen weder Datum noch Zeitraum ganz hineinpasst. */
  #screen-sprechtag .st-karten{ grid-template-columns:1fr; }
  /* ZURUECK UND DIE AKTIONEN STEHEN AUF EINER ZEILE (Befund Murat
     05.08.2026: "mobilde o zurück ile o menüler ayni sirada olmali").
     Vorher stand der Pfeil allein auf einer Zeile und die Knoepfe darunter -
     zwei Zeilen fuer eine Leiste, und die obere war zu 90 Prozent leer.
     Die TAGESREITER brechen statt dessen um: sie sind die einzigen, die
     beliebig breit werden koennen, und `order:3` schiebt sie unter die
     Knoepfe. `flex-basis:100%` erzwingt den Umbruch, ohne dass die Leiste
     selbst die Richtung wechselt - der Pfeil bleibt also links, die Aktionen
     bleiben rechts. */
  #screen-sprechtag .st-leiste{ flex-direction:row; align-items:center;
    flex-wrap:wrap; gap:8px; }
  #screen-sprechtag .st-links{ order:1; }
  #screen-sprechtag #st-aktionen{ order:2; margin-left:auto;
    justify-content:flex-end; }
  #screen-sprechtag .st-reiter{ order:3; flex:1 1 100%; margin:0 -4px;
    padding:0 4px; }
  #screen-sprechtag .st-reiter:empty{ display:none; }
  /* Die Adresse: Knopf unter die Zeile, sonst bleibt fuer sie selbst nichts.
     Und die vier Vorlagen zu zweit nebeneinander - einspaltig waeren es vier
     halbleere Streifen, vierspaltig passt kein Wort hinein. */
  #screen-sprechtag .st-link{ flex:1 1 100%; flex-wrap:wrap; padding:12px 13px; }
  #screen-sprechtag .st-link .st-kopier{ width:100%; justify-content:center; }
  #screen-sprechtag .st-dokkachel{ flex:1 1 calc(50% - 5px); }
  /* Ohne Zeiger gibt es kein hover - der Loeschknopf der Karte und der Text
     im Status-Knopf muessen dauerhaft sichtbar bleiben. */
  #screen-sprechtag .st-k-menue{ opacity:1; }
  #screen-sprechtag .st-abschluss .btn{ width:100%; }
  #st-status-ov .st-statuszahlen{ grid-template-columns:repeat(2, 1fr); }
  /* Der Halter ist nur 34px breit - ein `width:100%` waere hier 34px. Deshalb
     wird er schmal auf `static` gesetzt: dann haengt das Fenster an der
     LEISTE (die relativ ist) und darf ueber die ganze Breite gehen. */
  #screen-sprechtag .st-filterhalter{ position:static; }
  #screen-sprechtag .st-filterbox{ left:0; right:0; top:calc(100% + 4px);
    width:auto; min-width:0; }
  /* Ohne Zeiger gibt es kein "hover" - das Löschkreuz der Fachspalte muss
     dauerhaft sichtbar sein, sonst ist es auf dem Telefon gar nicht da. */
  #screen-sprechtag .fn-fachweg{ opacity:1; }
}

/* --- Tablet (641–1024px): die Stelle, an der bisher NICHTS stand ----------
   Zwischen Telefon und Computer lag eine Luecke: die Seite bekam die
   Desktop-Regeln, hatte aber nicht die Breite dafuer. Auf einem iPad hoch
   standen Reiter, Dokumente-Knopf und Filter in einer Zeile, die nicht
   aufging. Hier bricht die Leiste um, ohne dass am Telefon (oben) oder am
   Computer (Grundregeln) etwas kippt. */
@media (min-width:641px) and (max-width:1024px){
  #screen-sprechtag .st-leiste{ align-items:flex-start; }
  #screen-sprechtag #st-aktionen{ justify-content:flex-end; }
  #screen-sprechtag .st-reiter{ flex:1 1 100%; order:2; }
  #screen-sprechtag #st-aktionen{ flex:1 1 100%; order:1; }
  #screen-sprechtag .st-karten{ grid-template-columns:repeat(auto-fill, minmax(280px, 1fr)); }
  #screen-sprechtag .st-tabwrap{ overflow-x:auto; }
  #screen-sprechtag .st-tab{ min-width:820px; }
}

/* Mail-Zustand je Termin (Faz 2b). Bewusst "gesendet", nicht "zugestellt":
   die Annahme durch den Mailserver sagt nichts ueber Zustellung oder Lesen -
   und eine Lesebestaetigung gaebe es nur ueber Zaehlpixel, die hier nicht
   hineinkommen. */
/* EIN SYMBOL NEBEN DEM FELD, keine zweite Zeile darunter: das Text-Etikett
   ("⏱ geplant") machte jede Zeile mit Adresse um eine Zeilenhöhe größer -
   bei 36 Terminen eine halbe Bildschirmseite für eine Angabe, die man einmal
   nachschlägt. Die Erklärung steht im title. */
#screen-sprechtag .st-mailzelle{ display:flex; align-items:center; gap:5px; }
#screen-sprechtag .st-mailzelle .st-in{ flex:1 1 auto; min-width:0; }
#screen-sprechtag .st-mailz{ flex:0 0 auto; display:inline-grid; place-items:center;
  width:20px; height:20px; border-radius:6px; cursor:help; }
#screen-sprechtag .st-mailz svg{ width:13px; height:13px; fill:none;
  stroke:currentColor; stroke-width:2.4; stroke-linecap:round; stroke-linejoin:round; }
#screen-sprechtag .st-mailz.ok{ background:#E6F7EF; color:#15A05A; }
#screen-sprechtag .st-mailz.bad{ background:rgba(192,57,43,.12); color:#C0392B; }
#screen-sprechtag .st-mailz.warte{ background:var(--card); color:var(--muted);
  border:1px solid var(--line); }

/* Dokumente-Knopf + Auswahl (Faz 2b). Der Knopf traegt als einziger in der
   Leiste einen TEXT: "Dokumente" ist keine Aktion, die man am Symbol errät,
   und sie ist der Grund, warum die Lehrkraft ueberhaupt hier ist, wenn der
   Sprechtag geplant steht. */
#screen-sprechtag .st-tb-b.breit{ width:auto; gap:6px; padding:0 12px;
  display:inline-flex; align-items:center; font:inherit; font-size:13px;
  font-weight:600; color:var(--text); }
#screen-sprechtag .st-tb-b.breit svg{ width:15px; height:15px; }
#st-dok-ov .st-unter{ font-size:13px; color:var(--muted); margin:0 0 14px; }
#st-dok-ov .st-dokbtn{ display:block; width:100%; text-align:left; padding:13px 15px;
  margin-bottom:9px; border:1.5px solid var(--line); border-radius:12px;
  background:var(--card); color:var(--text); font:inherit; cursor:pointer;
  transition:border-color .15s; }
#st-dok-ov .st-dokbtn:hover{ border-color:#7B4FBF; }
#st-dok-ov .st-dokbtn b{ display:block; font-size:var(--fs-md); }
#st-dok-ov .st-dokbtn small{ display:block; font-size:12.5px; color:var(--muted);
  margin-top:2px; line-height:1.45; }
#st-dok-ov .st-dokbtn.aus{ opacity:.5; cursor:default; }
#st-dok-ov .st-dokbtn.aus:hover{ border-color:var(--line); }

@media (max-width:640px){
  /* Auf dem Telefon zaehlt die Breite: der Text weicht, das Symbol bleibt. */
  #screen-sprechtag .st-tb-b.breit span{ display:none; }
  #screen-sprechtag .st-tb-b.breit{ width:34px; padding:0; justify-content:center; }
}

/* ===== GESPRÄCHSPROTOKOLL (Faz 3, v2.107.0) ================================
   Zwei Spalten mit einer klaren Rollenverteilung: LINKS die Vergangenheit
   (nur lesen), RECHTS das Gespräch (schreiben). Im Gespräch soll niemand
   versehentlich eine Note ändern, während er auf sie zeigt.
   Schmal fallen die Spalten untereinander - auf dem Telefon nebeneinander
   waere beides unlesbar. */
#screen-sprechtag .st-notizzelle{ display:flex; align-items:center; gap:4px; }
#screen-sprechtag .st-notizzelle .st-notizbtn{ flex:1; }
#screen-sprechtag .st-protobtn{ width:26px; height:26px; display:grid; place-items:center;
  border:1.5px solid var(--line); border-radius:7px; background:var(--card);
  color:var(--muted); cursor:pointer; padding:0; flex:0 0 auto; }
#screen-sprechtag .st-protobtn svg{ width:13px; height:13px; fill:none; stroke:currentColor;
  stroke-width:2; stroke-linecap:round; stroke-linejoin:round; }
#screen-sprechtag .st-protobtn:hover{ border-color:#7B4FBF; color:#7B4FBF; }

#st-proto-ov .st-unter{ font-size:13px; color:var(--muted); margin:0 0 14px; }
#st-proto-ov .stp-zwei{ display:grid; grid-template-columns:1fr 1fr; gap:18px; }
#st-proto-ov .stp-links{ max-height:52vh; overflow:auto; padding-right:6px; }
#st-proto-ov .stp-block{ margin-bottom:14px; }
#st-proto-ov .stp-t{ font-size:11px; font-weight:700; color:var(--muted);
  text-transform:uppercase; letter-spacing:.5px; margin-bottom:6px; }
#st-proto-ov .stp-chip{ display:inline-block; margin-left:6px; padding:1px 7px;
  border-radius:999px; background:rgba(123,79,191,.12); color:#7B4FBF;
  font-size:11px; letter-spacing:0; text-transform:none; }
#st-proto-ov .stp-z{ display:flex; align-items:baseline; gap:8px; padding:4px 0;
  border-bottom:1px solid var(--line); font-size:13px; }
#st-proto-ov .stp-z span{ flex:1; }
#st-proto-ov .stp-z small{ color:var(--muted); font-size:11.5px; }
#st-proto-ov .stp-z b{ font-variant-numeric:tabular-nums; }
#st-proto-ov .stp-leer{ font-size:13px; color:var(--muted); }
#st-proto-ov .stp-text{ font-size:13px; line-height:1.55; margin:0; }
#st-proto-ov .stp-rechts label{ display:block; font-size:12.5px; color:var(--muted);
  margin:10px 0 4px; }
#st-proto-ov .stp-rechts label:first-child{ margin-top:0; }
#st-proto-ov .stp-rechts textarea,
#st-proto-ov .stp-rechts input{ width:100%; padding:10px 12px; border:1.5px solid var(--line);
  border-radius:10px; font:inherit; font-size:14px; line-height:1.55;
  background:var(--card); color:var(--text); resize:vertical; }
#st-proto-ov .stp-rechts textarea:focus,
#st-proto-ov .stp-rechts input:focus{ border-color:#7B4FBF; outline:none; }
#st-proto-ov .stp-anw{ display:flex; gap:7px; }
#st-proto-ov .stp-anwb{ flex:1; padding:9px; border:1.5px solid var(--line);
  border-radius:10px; background:var(--card); color:var(--muted); font:inherit;
  font-size:13px; font-weight:600; cursor:pointer; }
#st-proto-ov .stp-anwb.an{ border-color:#15A05A; background:#EAF7F0; color:#15A05A; }
#st-proto-ov .stp-anwb:nth-child(2).an{ border-color:#C0392B;
  background:rgba(192,57,43,.1); color:#C0392B; }
#st-proto-ov .stp-warn{ padding:10px 12px; border-radius:10px; font-size:13px;
  background:rgba(245,166,35,.14); margin-bottom:12px; }
#st-proto-ov .stp-knoepfe{ display:flex; gap:8px; margin-top:16px; flex-wrap:wrap; }
#st-proto-ov .stp-knoepfe .btn{ flex:1; margin:0; min-width:130px; }
#st-proto-ov .versteckt{ display:none; }

/* Rückfrage vor dem Verschicken. Sie zeigt die ADRESSE gross und den TEXT
   vollstaendig - eine Einschaetzung ueber ein Kind, die an die falsche
   Familie geht, laesst sich durch nichts zurueckholen. */
#st-send-ov .st-send-an{ padding:12px 14px; border-radius:12px;
  background:rgba(123,79,191,.08); border:1.5px solid rgba(123,79,191,.3);
  margin-bottom:12px; }
#st-send-ov .st-send-an span{ display:block; font-size:10.5px; font-weight:700;
  letter-spacing:.5px; text-transform:uppercase; color:#7B4FBF; }
#st-send-ov .st-send-an b{ display:block; font-size:16px; word-break:break-all; }
#st-send-ov .st-send-an small{ display:block; font-size:12.5px; color:var(--muted);
  margin-top:2px; }
#st-send-ov .st-send-vor{ max-height:34vh; overflow:auto; padding:12px 14px;
  border:1.5px solid var(--line); border-radius:12px; font-size:13.5px;
  line-height:1.6; background:var(--card); }
#st-send-ov .st-send-warn{ font-size:12.5px; color:var(--muted); line-height:1.5;
  margin:10px 0 0; }
#st-send-ov .st-knopfreihe{ display:flex; gap:8px; margin-top:14px; }
#st-send-ov .st-knopfreihe .btn{ flex:1; margin:0; }

@media (max-width:640px){
  #st-proto-ov .stp-zwei{ grid-template-columns:1fr; }
  #st-proto-ov .stp-links{ max-height:30vh; }
  #st-proto-ov .stp-knoepfe .btn{ min-width:0; flex:1 1 45%; }
}

/* ===== FREMDNOTEN-RASTER (Faz 4, v2.108.0) =================================
   Vorbild ist die Praxis-Datei "Klasse 7a": Kinder x Faecher, Werte wie 4+,
   5-6, 2- E, n.b., /. Deshalb SCHMALE Spalten und mittige Zellen - es sind
   kurze Zeichen, keine Saetze. Der Kindername bleibt beim waagerechten
   Schieben stehen (position:sticky), sonst weiss man in Spalte 14 nicht
   mehr, wessen Note man tippt.

   DIE FARBE IST BEWUSST NICHT DIE DER EIGENEN NOTEN: Diese Werte gehoeren
   den Kolleginnen und fliessen in keinen Schnitt. Im Protokollbogen stehen
   sie als eigener Block mit dem Hinweis "nicht im Schnitt". */
/* DIE VIER WERKZEUGE LIEGEN OBEN RECHTS in der Aktionsleiste, nicht mehr als
   Knopfreihe ueber der Tabelle (Wunsch Murat 04.08.2026). Der Grund, warum
   sie dort so schlecht aussahen, war eine unsichtbare Kollision: `.btn` ist in
   dieser App `width:100%`, also nahm in einem flex-Behaelter jeder Knopf die
   volle Zeile - vier Knoepfe, vier Zeilen, quer ueber den Bildschirm. Statt
   die Breite zu flicken, gehoeren sie dorthin, wo beim Sprechtag auch alle
   anderen Aktionen stehen. `.fn-status` bleibt ueber der Tabelle: er meldet
   "nicht gespeichert" und muss dort stehen, wo getippt wird. */
#screen-sprechtag .fn-luecke{ padding:9px 12px; border-radius:10px; margin-bottom:10px;
  background:rgba(245,166,35,.14); font-size:13px; line-height:1.5; }
#screen-sprechtag .fn-status{ display:block; font-size:12.5px; color:var(--bad);
  margin-bottom:10px; min-height:16px; }
/* Welcher Faechersatz gilt. Eine Angabe, kein Umschalter - deshalb Fliesstext
   und kein Reiter. Der Knopf daneben repariert, er waehlt nicht. */
/* Das "i" neben den Halbjahren. Es traegt den einen Satz, der ueber der
   Tabelle zu sagen ist - vorher standen dort drei Zeilen Fliesstext, die auf
   dem Telefon den halben Bildschirm kosteten (CLAUDE.md: an einem
   Bedienelement hoechstens ein Satz, ein `title`-Tooltip ist erlaubt). */
#screen-sprechtag .fn-info{ flex:none; width:20px; height:20px; padding:0;
  border:1.5px solid var(--line); border-radius:999px; background:var(--card);
  color:var(--muted); font:inherit; font-size:12px; font-weight:800;
  font-style:italic; line-height:1; cursor:pointer; }
#screen-sprechtag .fn-info:hover{ border-color:var(--brand,#7B4FBF);
  color:var(--brand,#7B4FBF); }
#screen-sprechtag .fn-satz{ display:flex; align-items:center; flex-wrap:wrap; gap:8px;
  font-size:12.5px; color:var(--muted); margin:0 0 12px; }
#screen-sprechtag .fn-satz b{ color:var(--text); }
#screen-sprechtag .fn-satz-b{ border:1.5px solid var(--line); background:transparent;
  color:var(--text); border-radius:999px; padding:3px 12px; font-size:12.5px;
  font-weight:700; cursor:pointer; }
#screen-sprechtag .fn-satz-b:hover{ border-color:var(--brand,#3B6FE0); }
/* Die Reiterzeile des Rasters. Der NAME stammt noch aus der Zeit, als hier
   der Fächersatz umgeschaltet wurde; heute trägt sie die beiden Halbjahre –
   der Satz ist keine Wahl mehr, sondern eine Angabe (.fn-satz oben). Sie
   sieht aus wie die Tagesreiter des Sprechtags und benutzt deren Regeln:
   dieselbe Geste, dieselbe Optik. */
#screen-sprechtag .fn-stufen{ display:flex; align-items:center; flex-wrap:wrap;
  gap:7px; margin:0 0 12px; }
#screen-sprechtag .fn-stufen > span{ font-size:11.5px; font-weight:700;
  color:var(--muted); text-transform:uppercase; letter-spacing:.5px;
  margin-right:3px; }
#screen-sprechtag .fn-status.ok{ color:#15A05A; }
#screen-sprechtag .fn-belege{ display:flex; flex-wrap:wrap; gap:8px; margin-bottom:12px; }
#screen-sprechtag .fn-beleg{ display:flex; align-items:center; gap:4px; padding:4px 6px 4px 11px;
  border:1.5px solid var(--line); border-radius:999px; font-size:12.5px; }
#screen-sprechtag .fn-beleg a{ color:var(--text); text-decoration:none; }
#screen-sprechtag .fn-beleg a:hover{ text-decoration:underline; }
/* Notenfarben im Raster: 5 und schlechter rot, 1 und 2 gruen, alles andere
   schwarz. GEFAERBT WIRD DIE SCHRIFT, nicht die Zelle - ein Raster mit
   dreissig roten Kaesten sieht aus wie eine Katastrophe, auch wenn es zwei
   Fuenfen sind, und im Gespraech liest die Familie mit. Welche Note welche
   Farbe bekommt, entscheidet `fnNoteFarbe()` in index-app.js; hier steht nur,
   wie die drei Zustaende aussehen. */
#screen-sprechtag .fn-zelle.schlecht{ color:var(--bad); font-weight:700; }
#screen-sprechtag .fn-zelle.gut{ color:#15803D; font-weight:700; }
/* NOTENWAHL STATT TASTATUR - der Kasten, der auf schmalen Schirmen statt der
   Bildschirmtastatur aufgeht (siehe fnNotenwahlOeffnen in index-app.js).
   Er sitzt UNTEN am Rand: Dort ist der Daumen, und dort stand vorher die
   Tastatur - die Hand muss also nirgendwo hin. Die Karte ist bewusst niedrig,
   damit die Tabellenzeile darueber sichtbar bleibt; man soll sehen, in welche
   Zelle man gerade schreibt. */
.fn-wahl-ov{ position:fixed; inset:0; z-index:1200; background:rgba(15,18,26,.34);
  display:flex; align-items:flex-end; justify-content:center; }
.fn-wahl-karte{ width:100%; max-width:420px; background:var(--card);
  border-radius:18px 18px 0 0; padding:12px 12px calc(12px + env(safe-area-inset-bottom));
  box-shadow:0 -8px 30px rgba(0,0,0,.18); }
.fn-wahl-kopf{ display:flex; align-items:center; gap:8px; margin-bottom:10px; }
.fn-wahl-kopf b{ font-size:15px; }
.fn-wahl-kopf span{ font-size:12.5px; color:var(--muted); }
.fn-wahl-kopf .modal-x{ margin-left:auto; }
.fn-wahl-reihe{ display:grid; grid-template-columns:repeat(3,1fr); gap:7px;
  margin-bottom:7px; }
.fn-wahl-b{ padding:12px 4px; border:1.5px solid var(--line); border-radius:11px;
  background:var(--card); color:var(--text); font:inherit; font-size:17px;
  font-weight:700; cursor:pointer; }
.fn-wahl-b.an{ border-color:var(--brand,#7B4FBF); background:rgba(123,79,191,.10); }
/* Dieselben Farben wie im Raster - wer im Kasten eine 5 waehlt, soll sie
   dort schon rot sehen. */
.fn-wahl-b.schlecht{ color:var(--bad); }
.fn-wahl-b.gut{ color:#15803D; }
.fn-wahl-leer{ display:block; }
.fn-wahl-fuss{ display:flex; gap:8px; margin-top:4px; }
.fn-wahl-weg{ flex:1; padding:12px; border:1.5px solid var(--line); border-radius:11px;
  background:var(--card); color:var(--muted); font:inherit; font-weight:700;
  cursor:pointer; }
.fn-wahl-ok{ flex:1; padding:12px; border:0; border-radius:11px;
  background:var(--brand,#7B4FBF); color:#fff; font:inherit; font-weight:700;
  cursor:pointer; }
#screen-sprechtag .fn-tabwrap{ overflow-x:auto; border:1px solid var(--line);
  border-radius:12px; }
#screen-sprechtag .fn-tab{ border-collapse:collapse; font-size:13px; width:100%; }
#screen-sprechtag .fn-tab th,
#screen-sprechtag .fn-tab td{ border:1px solid var(--line); padding:0; }
#screen-sprechtag .fn-tab thead th{ background:var(--card); padding:3px; }
#screen-sprechtag .fn-tab .fn-name{ position:sticky; left:0; z-index:2; background:var(--card);
  text-align:left; font-weight:600; padding:6px 10px; white-space:nowrap; min-width:150px; }
/* Fachspalte: Name + Löschkreuz. Ein Fach, das versehentlich entstanden ist
   (ein Klick auf "+ Fach" zu viel, eine Spalte aus einer fremden Tabelle),
   liess sich bis 2.104.0 nicht mehr entfernen - es blieb als leere Spalte
   stehen. Das Kreuz erscheint erst beim Zeigen auf die Spalte, damit die
   Kopfzeile ruhig bleibt; auf dem Telefon steht es dauerhaft (kein Zeiger). */
#screen-sprechtag .fn-fachkopf{ display:flex; align-items:center; gap:2px; padding:0 2px; }
#screen-sprechtag .fn-fach{ flex:1 1 auto; width:100%; min-width:64px; padding:5px 4px;
  border:0; background:transparent; font:inherit; font-size:12px; font-weight:700;
  text-align:center; color:var(--text); }
#screen-sprechtag .fn-fach:focus{ outline:2px solid #7B4FBF; outline-offset:-2px; }
#screen-sprechtag .fn-fachweg{ flex:0 0 auto; width:18px; height:18px; display:grid;
  place-items:center; border:0; border-radius:5px; background:transparent;
  color:var(--muted); cursor:pointer; padding:0; opacity:0; transition:opacity .12s; }
#screen-sprechtag .fn-fachkopf:hover .fn-fachweg,
#screen-sprechtag .fn-fachweg:focus{ opacity:1; }
#screen-sprechtag .fn-fachweg:hover{ background:rgba(192,57,43,.12); color:var(--bad); }
#screen-sprechtag .fn-fachweg svg{ width:11px; height:11px; fill:none; stroke:currentColor;
  stroke-width:2.6; stroke-linecap:round; }
#screen-sprechtag .fn-zelle{ width:100%; min-width:74px; padding:7px 4px; border:0;
  background:transparent; font:inherit; font-size:13.5px; text-align:center;
  color:var(--text); }
#screen-sprechtag .fn-zelle:focus{ outline:2px solid #7B4FBF; outline-offset:-2px;
  background:rgba(123,79,191,.06); }
/* Der Wert aus dem LETZTEN Halbjahr steht blass in derselben Zelle - nicht
   als zweites Eingabefeld: Vergangenheit wird nicht bearbeitet. Er ist der
   Grund, warum die Spalte zweimal im Jahr gefuellt wird. */
#screen-sprechtag .fn-zellbox{ display:flex; align-items:center; gap:3px;
  padding:0 3px; }
#screen-sprechtag .fn-alt{ flex:0 0 auto; font-size:11px; color:var(--muted);
  opacity:.75; cursor:help; }
#screen-sprechtag .fn-zellbox .fn-zelle{ flex:1 1 auto; min-width:44px; }
/* Entwicklung: zwei Halbjahre je Zelle. Der Pfeil erscheint NUR bei zwei
   einfachen Schulnoten - ein geratener Pfeil ist schlimmer als keiner. */
#screen-sprechtag .fn-etab td{ padding:6px 8px; text-align:center;
  white-space:nowrap; font-size:13px; }
#screen-sprechtag .fn-e-alt{ color:var(--muted); }
#screen-sprechtag .fn-e-zu{ color:var(--muted); margin:0 3px; font-size:11px; }
#screen-sprechtag .fn-e-neu{ font-weight:700; }
#screen-sprechtag .fn-e-leer{ color:var(--muted); opacity:.5; }
#screen-sprechtag .fn-pf{ margin-left:5px; font-size:10px; }
#screen-sprechtag .fn-pf.gut{ color:#15A05A; }
#screen-sprechtag .fn-pf.schlecht{ color:#C0392B; }
#screen-sprechtag .fn-pf.gleich{ color:var(--muted); }
#screen-sprechtag .fn-einfeld{ width:100%; padding:11px 12px; border:1.5px solid var(--line);
  border-radius:11px; font-family:ui-monospace,SFMono-Regular,Menlo,monospace;
  font-size:12.5px; background:var(--card); color:var(--text); resize:vertical; }

/* Zuordnungsansicht - hier ist noch NICHTS gespeichert. */
#fn-ein-ov .st-unter{ font-size:13px; color:var(--muted); margin:0 0 12px; }
#fn-ein-ov .fn-hinweis{ padding:9px 11px; border-radius:10px; font-size:13px;
  background:rgba(245,166,35,.14); margin-bottom:10px; }
#fn-ein-ov .fn-tabwrap{ max-height:44vh; overflow:auto; }
#fn-ein-ov .fn-ptab{ width:100%; border-collapse:collapse; font-size:13px; }
#fn-ein-ov .fn-ptab th{ text-align:left; font-size:11px; font-weight:700; color:var(--muted);
  text-transform:uppercase; letter-spacing:.4px; padding:0 8px 7px;
  border-bottom:1.5px solid var(--line); position:sticky; top:0; background:var(--card); }
#fn-ein-ov .fn-ptab td{ padding:5px 8px; border-bottom:1px solid var(--line);
  vertical-align:middle; }
#fn-ein-ov .fn-zuord{ width:100%; padding:5px 7px; border:1.5px solid var(--line);
  border-radius:8px; font:inherit; font-size:13px; background:var(--card); color:var(--text); }
#fn-ein-ov .fn-noten{ font-size:12.5px; color:var(--muted); }
#fn-ein-ov .fn-noten b{ color:var(--text); }
#fn-ein-ov .fn-ok{ color:#15A05A; font-weight:700; }
#fn-ein-ov .fn-warn{ color:#D98324; font-size:11.5px; font-weight:700; }
#fn-ein-ov .fn-offen{ color:#C0392B; font-size:11.5px; font-weight:700; }
#fn-ein-ov .versteckt{ display:none; }

/* Fremdnoten im Protokollbogen: eigener Block, sichtbar getrennt. */
#st-proto-ov .stp-fremd{ padding:10px 12px; border:1.5px dashed var(--line);
  border-radius:11px; }
#st-proto-ov .stp-chip.grau{ background:var(--card); color:var(--muted);
  border:1px solid var(--line); }
#st-proto-ov .stp-hjnotiz{ font-size:11px; color:var(--muted); margin:0 0 6px; }
#st-proto-ov .stp-vorher{ color:var(--muted); font-weight:400; }
#st-proto-ov .stp-zu{ color:var(--muted); font-weight:400; margin:0 4px; font-size:11px; }

@media (max-width:640px){
  /* DAS NOTENRASTER AUF DEM TELEFON (Befund Murat 05.08.2026: "Noten der
     Fachlehrkräfte sayfasi mobilde cok kötü dagilmis").
     Es ist eine Tabelle mit bis zu vierzehn Spalten - sie kann schmal nicht
     "passen", sie kann nur SCHIEBBAR sein, und dann muss der Kindername
     stehen bleiben. Genau das war kaputt: der Name klebte zwar (sticky),
     hatte aber keinen eigenen Hintergrund mehr, sodass die Noten beim
     Schieben darunter durchliefen. */
  #screen-sprechtag .fn-tabwrap{ margin:0 -14px; border-radius:0;
    border-left:0; border-right:0; -webkit-overflow-scrolling:touch; }
  #screen-sprechtag .fn-tab .fn-name{ min-width:88px; max-width:88px;
    background:var(--card); box-shadow:1px 0 0 var(--line);
    font-size:11.5px; padding:4px 6px; white-space:normal; line-height:1.2; }
  #screen-sprechtag .fn-fach,
  #screen-sprechtag .fn-zelle{ min-width:46px; }
  #screen-sprechtag .fn-fach{ font-size:10px; padding:3px 2px; }
  /* KLEINER, ABER NICHT WINZIG (Befund Murat 05.08.2026: "tablo cok önemli,
     text boyutunu filan kücült"). 14 -> 13 px und schmalere Spalten bringen
     zwei Faecher mehr ins Bild, ohne dass eine Note zum Raten wird - und
     getippt wird hier ohnehin nicht mehr, sondern gewaehlt (.fn-wahl-ov). */
  #screen-sprechtag .fn-zelle{ font-size:13px; padding:3px 2px; }
  #screen-sprechtag .fn-tab th,
  #screen-sprechtag .fn-tab td{ padding:2px 3px; }
  /* Der alte Wert daneben braucht schmal keinen Platz - er steht darunter. */
  #screen-sprechtag .fn-zellbox{ flex-direction:column; gap:0; padding:2px; }
  #screen-sprechtag .fn-alt{ font-size:10px; line-height:1.2; }
  /* Die Reiterzeile schiebbar statt umbrechend: drei Halbjahre untereinander
     kosten drei Zeilen, die man jeden Tag sieht. */
  #screen-sprechtag .fn-stufen{ flex-wrap:nowrap; overflow-x:auto;
    scrollbar-width:none; margin:0 -14px 12px; padding:0 14px; }
  #screen-sprechtag .fn-stufen::-webkit-scrollbar{ display:none; }
  #screen-sprechtag .fn-stufen > span{ flex:none; font-size:10.5px;
    letter-spacing:.3px; }
  /* SCHMALER UND KLEINER (Befund Murat 05.08.2026: "halbjahr ve yanindaki
     tuslari daralt ve textleri kücült"). Zwei Halbjahre plus Beschriftung
     brauchten mehr als die Bildschirmbreite und schoben sich unter den
     Rand; jetzt passen sie nebeneinander. */
  #screen-sprechtag .fn-stufen{ gap:5px; margin-bottom:9px; }
  #screen-sprechtag .fn-stufen .st-reiter-b{ flex:none; padding:5px 10px;
    font-size:11.5px; gap:4px; }
  #screen-sprechtag .fn-stufen .st-reiter-b small{ font-size:10.5px; }
  /* Der Faechersatz-Hinweis darunter ist eine Angabe, kein Bedienelement -
     schmal darf er klein sein. */
  #screen-sprechtag .fn-satz{ font-size:11.5px; gap:6px; margin-bottom:9px; }
  #screen-sprechtag .fn-satz-b{ padding:2px 10px; font-size:11.5px; }
  /* Entwicklung: zwei Werte plus Pfeil je Zelle - schmal untereinander. */
  #screen-sprechtag .fn-etab td{ padding:5px 6px; font-size:12px; }
  #screen-sprechtag .fn-e-zu{ margin:0 2px; }
}

/* ---- Aufbewahrungs-Streifen im Klassenbuch (v2.137.0) -------------------
   Er sagt eine Frist an und stellt EINE Frage. Deshalb ruhig (bernstein),
   nicht rot: Rot ist in dieser App die Farbe des Unumkehrbaren, und hier ist
   noch gar nichts passiert. Erst wenn die Frist erreicht IST, wird er
   deutlicher (.akut) - aber immer noch nicht rot, denn auch dann loescht
   niemand von selbst. */
.kb-aufbew{
  display:flex; align-items:center; gap:var(--s-4); flex-wrap:wrap;
  border:1px solid var(--amber-line); background:var(--amber-soft); color:var(--amber-ink);
  border-radius:var(--r-card); padding:var(--s-3) var(--s-4); margin:0 0 var(--s-4);
}
.kb-aufbew.akut{ border-color:var(--amber); background:var(--amber-soft); }
.kb-aufbew-tx{ flex:1; min-width:220px; }
.kb-aufbew-tx b{ display:block; font-size:var(--fs-sm); font-weight:700; }
.kb-aufbew-tx small{ display:block; font-size:var(--fs-xs); opacity:.85; margin-top:2px; line-height:1.45; }
.kb-aufbew-akt{ display:flex; gap:var(--s-2); flex-wrap:wrap; }
.kb-aufbew-akt .btn{ width:auto; margin:0; padding:var(--s-2) var(--s-3); font-size:var(--fs-sm); border-radius:var(--r-control); }

/* Schmal: die Knoepfe unter den Text, sonst quetschen sie ihn auf zwei Woerter. */
@media (max-width:640px){
  .kb-aufbew{ flex-direction:column; align-items:stretch; gap:var(--s-3); }
  .kb-aufbew-akt{ display:grid; grid-template-columns:1fr 1fr; }
  .kb-aufbew-akt .btn{ width:100%; }
}

/* ---- Gesperrte Klasse (v2.138.0) ---------------------------------------
   Bewusst NICHT rot und bewusst nicht dramatisch: Es ist nichts verloren,
   und wer "gesperrt" liest und Schlimmes vermutet, macht im Zweifel etwas
   Unumkehrbares. Ruhiges Grau mit Schloss - eine Tuer, kein Alarm. */
.kb-gesperrt{
  border:1px solid var(--line); background:var(--card);
  border-radius:var(--r-card); padding:var(--s-5) var(--s-5); margin:var(--s-1) 0 var(--s-4); text-align:center;
}
.kb-gesperrt-kopf{ display:flex; align-items:center; justify-content:center; gap:var(--s-3); margin-bottom:var(--s-2); }
.kb-gesperrt-kopf svg{ width:22px; height:22px; color:var(--muted); flex:none; }
.kb-gesperrt-kopf b{ font-size:var(--fs-md); font-weight:800; }
.kb-gesperrt p{ margin:0 auto var(--s-4); max-width:52ch; font-size:var(--fs-sm); color:var(--muted); line-height:1.55; }
.kb-gesperrt-akt{ display:flex; gap:var(--s-2); justify-content:center; flex-wrap:wrap; }
.kb-gesperrt-akt .btn{ width:auto; margin:0; padding:var(--s-3) var(--s-4); font-size:var(--fs-sm); border-radius:var(--r-control); }

@media (max-width:640px){
  .kb-gesperrt{ padding:var(--s-5) var(--s-4); }
  .kb-gesperrt-akt{ display:grid; grid-template-columns:1fr; width:100%; }
  .kb-gesperrt-akt .btn{ width:100%; }
}

/* ==========================================================================
   REGAL „MEINE ARBEITSBLÄTTER" (.bl-*) – Blatt-Studio, Aufgabe 0.3b
   docs/PLAN_BLATT_STUDIO.md §9, docs/PLAN_ARBEITSBLATT_EDITOR.md §12.3

   Gezeichnet von blaetterZeichnen() in static/js/blatt-studio.js in
   #blaetter-content (templates/index.html).

   DIE VORSCHAU IST GEZEICHNET, NICHT FOTOGRAFIERT. `.bl-blatt` ist ein
   weisses Rechteck im A4-Verhaeltnis (1:1.414 ueber aspect-ratio), darin ein
   Kopfbalken und ein paar graue Balken fuer die Bloecke. Ein echtes
   Miniaturbild gaebe es nur ueber html2canvas oder zwanzig <iframe> - beides
   in §4 F1 des Editor-Plans schon verworfen.
   ========================================================================== */
/* ===== DIE PILLE UNTER DEM REITER (v2.906.0) ==============================
   Befund Murat 30.09.2026: „neu ordner neues arbeitsblatt ve silme tusu sagda
   olmasa … blätter altinda böyle kücük bir alt menü seklinde olsa, sanki
   ordan pitlamis gibi yan yana kücük süper sade yüzüyo gibi." Bis v2.905.0
   standen die drei Knoepfe rechts in einer eigenen Zeile.

   Jetzt steht eine kleine Pille direkt UNTER dem Reiter „Blatt-Studio" -
   ihre Spitze zeigt auf ihn, beim Betreten springt sie aus ihm heraus
   (`.pop`). Die Lage rechnet blUnterEinpassen() (blatt-studio.js) und setzt
   sie als --bl-unter-x (Pille) und --bl-pfeil-x (Spitze in der Pille).
   Leicht angehoben (--e-1): sie schwebt, ohne ein Aufklapp-Menue zu sein.
   Die Farben der Knoepfe folgen der Flaechenfarbe - die Regeln dafuer stehen
   im Abschnitt „Akzent aus der Flaechenfarbe" am Dateiende (Nr. 11). */
.bl-zeile{ display:block; position:relative; flex:none; margin:-4px 0 14px; }
#bl-zeile-akt{ display:inline-flex; align-items:center; gap:2px; padding:4px;
  position:relative; margin-left:var(--bl-unter-x, 0px);
  background:var(--card); border:1px solid var(--line); border-radius:12px;
  box-shadow:var(--e-1); }
#bl-zeile-akt:empty{ display:none; }
#bl-zeile-akt::before{ content:""; position:absolute; top:-6px; left:var(--bl-pfeil-x, 50%);
  width:10px; height:10px; margin-left:-5px; transform:rotate(45deg);
  background:var(--card); border-left:1px solid var(--line); border-top:1px solid var(--line);
  border-top-left-radius:2px; }
.bl-zeile.bl-unter-frei #bl-zeile-akt::before{ display:none; }
#bl-zeile-akt.pop{ animation:blUnterAuf .42s cubic-bezier(.34,1.35,.5,1) both;
  transform-origin:var(--bl-pfeil-x, 50%) 0; }
@keyframes blUnterAuf{ from{ opacity:0; transform:translateY(-8px) scale(.9); }
  to{ opacity:1; transform:none; } }
/* Die Pille springt selbst - das Einblenden der Liste (.sam-ein) laesst sie aus. */
.sam-ein > #bl-zeile{ animation:none; }
@media (prefers-reduced-motion: reduce){ #bl-zeile-akt.pop{ animation:none; } }
.bl-u-knopf{ display:inline-flex; align-items:center; gap:6px; height:32px; padding:0 11px;
  border:0; border-radius:9px; background:transparent; color:var(--ink); cursor:pointer;
  font:inherit; font-size:12.5px; font-weight:600; white-space:nowrap;
  transition:background .12s, color .12s; }
.bl-u-knopf svg{ width:16px; height:16px; flex:none; }
.bl-u-knopf.haupt{ color:var(--on-brand); }
.bl-u-korb{ padding:0 8px; color:var(--muted); }
.bl-u-trenn{ width:1px; height:18px; background:var(--line); margin:0 3px; flex:none; }
/* Am Telefon passt die Pille in die Zeile: etwas enger, und unter 400 px
   steht „Neuer Ordner" nur als Zeichen da (Name im title/aria-label). */
@media (max-width:640px){
  #bl-zeile-akt{ max-width:100%; }
  .bl-u-knopf{ padding:0 9px; gap:5px; font-size:12px; }
}
@media (max-width:400px){
  .bl-u-knopf.bl-u-ordner span{ display:none; }
}
/* Der Primaerknopf der Dialoge im Studio (Ordner speichern, PDF
   uebernehmen). Seine Fuellung steht im Akzent-Abschnitt. */
.bl-neu{ display:inline-flex; align-items:center; gap:7px; border:0;
  border-radius:10px; padding:9px 15px; font-size:13.5px; font-weight:700;
  cursor:pointer; background:var(--brand); color:var(--on-brand); }
.bl-neu:hover{ filter:brightness(1.06); }
.bl-neu svg{ fill:none; stroke:currentColor; stroke-width:2.4;
  stroke-linecap:round; }

/* Der Weg von oben bis hierher. Die Krumen sind Ziele fuer das Ziehen -
   deshalb sind es Knoepfe und keine Textstuecke. */
.bl-krumen{ display:flex; align-items:center; gap:4px; flex-wrap:wrap;
  margin:0 0 14px; font-size:13px; }
.bl-krume{ border:0; background:transparent; cursor:pointer; font:inherit;
  color:var(--brand,#2E5BFF); font-weight:600; padding:4px 8px;
  border-radius:8px; }
.bl-krume:hover{ background:var(--brand-soft,#EAF1FE); }
/* `var(--ink)` statt `var(--text,#1b2230)` (v2.906.0): `--text` gibt es nicht -
   im Dunkeln stand die dunkle Rueckfallfarbe auf dunklem Grund (Namen, Titel,
   „Papierkorb" unsichtbar). Im Hellen ist --ink derselbe Ton. */
.bl-krume.an{ color:var(--ink); font-weight:700; padding:4px 8px; }
.bl-krume-p{ color:var(--muted,#5b6472); }
.bl-korb-kopf{ gap:8px; color:var(--muted,#5b6472); }
.bl-korb-kopf svg{ fill:none; stroke:currentColor; stroke-width:1.9;
  stroke-linecap:round; stroke-linejoin:round; }
.bl-korb-kopf b{ color:var(--ink); }
.bl-korb-hinw{ font-size:12px; }

.bl-laedt,.bl-leer{ padding:34px 20px; text-align:center;
  color:var(--muted,#5b6472); font-size:14px; }
.bl-leer b{ display:block; font-size:15px; color:var(--ink);
  margin-bottom:5px; }
.bl-leer p{ margin:0; }

/* Die Spalten FUELLEN die Zeile (v2.906.0). Mit festen 190 px blieb rechts
   ein Rest stehen, der auf dem Tablet hochkant fast eine Spalte breit war -
   die Blaetter rueckten sichtbar nach links (Befund Murat 30.09.2026: „sagda
   blattlar sola kayiyor sagda bosluk oluyor dikey tablette"). */
.bl-regal{ display:grid; gap:18px;
  grid-template-columns:repeat(auto-fill,minmax(170px,1fr)); }
.bl-karte{ display:flex; flex-direction:column; position:relative; }

.bl-vorschau{ cursor:pointer; border-radius:10px; overflow:hidden;
  background:#eef1f6; border:1px solid var(--line,#e3e8f0); padding:9px;
  transition:border-color .12s, box-shadow .12s; }
.bl-vorschau:hover{ border-color:var(--brand,#2E5BFF);
  box-shadow:0 4px 14px rgba(20,30,50,.10); }
.bl-blatt{ position:relative; aspect-ratio:1 / 1.414; background:#fff;
  border-radius:3px; box-shadow:0 1px 3px rgba(20,30,50,.14);
  padding:11% 12%; display:flex; flex-direction:column; gap:7%; }
/* Querformat: dasselbe Blatt, gekippt. */
.bl-vorschau.quer .bl-blatt{ aspect-ratio:1.414 / 1; }
.bl-blatt.bl-real{ padding:0; display:block; overflow:hidden; }
.bl-real-page{ position:absolute; left:0; top:0; transform-origin:0 0;
  background:#fff; overflow:hidden; }
.bl-real-page .st-el{ position:absolute; box-sizing:border-box; overflow:hidden; }
.bl-fluss-real{ padding:10% 9%; gap:5%; }
.bl-fluss-kopf{ font-size:9px; font-weight:800; border-bottom:1px solid #d7dce6;
  padding-bottom:6%; margin-bottom:4%; overflow:hidden; white-space:nowrap; }
.bl-fluss-frage{ display:grid; grid-template-columns:12px 1fr; gap:3px; font-size:6px;
  line-height:1.35; border-bottom:1px solid #e3e8f0; padding:4% 0; }
.bl-fluss-frage span{ display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical;
  overflow:hidden; }
.bl-kopfbalken{ display:block; height:9%; min-height:5px; border-radius:2px;
  background:var(--brand,#2E5BFF); opacity:.75; width:64%; }
.bl-blatt i{ display:block; height:6%; min-height:3px; border-radius:2px;
  background:#d7dce6; }
.bl-mehr{ position:absolute; right:6%; bottom:5%; font-style:normal;
  font-size:10px; font-weight:700; color:#8b93a5; }

.bl-info{ padding:8px 2px 0; }
.bl-name{ font-size:13.5px; font-weight:700; color:var(--ink);
  overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.bl-meta{ display:flex; align-items:center; gap:7px; flex-wrap:wrap;
  margin-top:3px; font-size:11.5px; color:var(--muted,#8b93a5); }
/* Das Abzeichen ist die Bedingung fuer das GEMEINSAME Regal (§10 Frage 4):
   ohne es waeren Studio- und Editor-Blaetter nicht zu unterscheiden. */
.bl-abz{ font-size:10px; font-weight:800; letter-spacing:.03em;
  text-transform:uppercase; border-radius:5px; padding:2px 6px; }
.bl-abz.studio{ background:#EAF1FE; color:#1E3FCC; }
.bl-abz.fluss{ background:#F4F6FA; color:var(--muted); }

.bl-akt{ position:absolute; top:6px; right:6px; opacity:0; display:flex; gap:4px;
  transition:opacity .12s; }
.bl-karte:hover .bl-akt,.bl-akt:focus-within{ opacity:1; }
.bl-akt button{ border:0; background:rgba(255,255,255,.92); border-radius:7px;
  width:27px; height:27px; cursor:pointer; color:#b3261e; padding:0;
  box-shadow:0 1px 4px rgba(20,30,50,.16); }
.bl-akt svg{ fill:none; stroke:currentColor; stroke-width:2;
  stroke-linecap:round; }
.bl-akt .bl-bearb{ color:var(--brand,#2E5BFF); }

/* ===== ORDNER IM REGAL (v2.244.0) =======================================
   Die Ordnerkachel hat DIESELBE Breite und DENSELBEN Aufbau wie eine
   Blattkachel (Bild oben, Name, Zeile darunter) - sie steht ja im selben
   Raster. Nur das Bild ist kein Blatt, sondern ein farbiger Ordner. Waere
   sie kleiner oder anders gebaut, spraenge das Raster bei jeder Mischung. */
.bl-ord-box{ cursor:pointer; border-radius:10px; overflow:hidden;
  border:1px solid var(--line,#e3e8f0); padding:9px;
  background:color-mix(in srgb, var(--ofarbe) 10%, transparent);
  display:grid; place-items:center; aspect-ratio:1 / 1.414;
  transition:border-color .12s, box-shadow .12s, background .12s; }
.bl-ord-box:hover{ border-color:var(--ofarbe);
  box-shadow:0 4px 14px rgba(20,30,50,.10); }
.bl-ord-ico{ width:58%; height:auto; fill:var(--ofarbe); stroke:none;
  opacity:.92; }
/* Restlaufzeit im Papierkorb. Ruhig, nicht rot: es ist eine Angabe, keine
   Warnung - solange noch Tage bleiben, ist nichts zu tun. */
.bl-rest{ font-size:11px; color:var(--muted,#5b6472); }

/* Ziehen: die gezogene Kachel wird blass, das Ziel bekommt einen Rahmen.
   Beides ist noetig - ohne die Rueckmeldung am Ziel laesst man ueber der
   falschen Kachel los und wundert sich. */
.bl-karte.zieht{ opacity:.42; }
.bl-karte[draggable="true"]{ cursor:grab; }
.bl-ueber{ outline:2px dashed var(--brand,#2E5BFF); outline-offset:3px;
  border-radius:12px; }
.bl-krume.bl-ueber{ background:var(--brand-soft,#EAF1FE); outline-offset:0; }

/* Der Dialog fuer Name + Farbe. */
.bl-ord-form{ padding:16px 18px 18px; display:flex; flex-direction:column; gap:14px; }
.bl-ord-form input{ font:inherit; font-size:14px; padding:10px 12px;
  border:1px solid var(--line,#e3e8f0); border-radius:10px;
  background:var(--card,#fff); color:var(--ink); }
.bl-ord-farben{ display:flex; gap:9px; flex-wrap:wrap; }
.bl-ord-f{ width:28px; height:28px; border-radius:50%; border:0; cursor:pointer;
  padding:0; box-shadow:0 0 0 0 rgba(0,0,0,0); transition:box-shadow .12s, transform .12s; }
.bl-ord-f:hover{ transform:scale(1.08); }
.bl-ord-f.an{ box-shadow:0 0 0 3px var(--card,#fff), 0 0 0 5px currentColor;
  color:var(--ink); }
.bl-ord-fuss{ display:flex; align-items:center; justify-content:flex-end; gap:10px; }
.bl-ord-weg{ margin-right:auto; border:0; background:transparent; cursor:pointer;
  font:inherit; font-size:13.5px; font-weight:700; color:#b3261e;
  padding:9px 12px; border-radius:10px; }
.bl-ord-weg:hover{ background:rgba(179,38,30,.10); }

/* „Verschieben nach …" - die flache Liste mit Einrueckung. */
.bl-vm-liste{ max-height:min(58vh, 420px); overflow:auto; padding:8px 8px 14px; }
.bl-vm-liste button{ display:flex; align-items:center; gap:9px; width:100%;
  border:0; background:transparent; cursor:pointer; font:inherit; font-size:13.5px;
  text-align:left; padding:9px 14px; border-radius:9px; color:var(--ink); }
.bl-vm-liste button:hover{ background:var(--brand-soft,#EAF1FE); }
.bl-vm-liste button small{ color:var(--muted,#5b6472); font-size:11.5px; }
.bl-vm-punkt{ width:9px; height:9px; border-radius:50%; flex:none; }

.bl-modal{ position:fixed; inset:0; z-index:10020; background:rgba(19,28,45,.48);
  display:grid; place-items:center; padding:20px; }
/* --vh100 statt 100vh (ARCHITEKTUR §4b): auf iOS zaehlt 100vh die GROESSTE
   Hoehe, also die mit eingeklappter Adressleiste. Ein Dialog, der so gerechnet
   ist, steht mit ausgeklappter Leiste unten aus dem Bild - und genau dort
   sitzen die Knoepfe. */
.bl-modal-k{ width:min(680px,calc(100vw - 32px)); max-height:min(760px,calc(var(--vh100) - 40px));
  overflow:auto; background:#fff; border-radius:18px; box-shadow:0 22px 70px rgba(20,30,50,.3);
  padding:20px; box-sizing:border-box; }
.bl-modal-kopf{ display:flex; align-items:flex-start; justify-content:space-between; gap:12px;
  margin-bottom:16px; }
.bl-modal-kopf>div{ display:flex; flex-direction:column; gap:3px; }
.bl-modal-kopf b{ font-size:20px; color:var(--ink); }
.bl-modal-kopf span{ font-size:13px; color:var(--muted,#7b8494); }
.bl-modal-kopf>button{ border:0; background:var(--paper); border-radius:9px; width:32px;height:32px;
  font-size:21px; cursor:pointer; color:var(--muted); }
/* VIER Einstiege seit v2.245.0 (PDF kam dazu). Bei drei Spalten waere der
   vierte allein in einer zweiten Reihe gelandet; `auto-fit` mit Mindestbreite
   macht daraus je nach Fenster 2x2 oder 4x1, ohne dass eine Zahl im CSS
   steht, die beim fuenften Einstieg wieder falsch waere. */
.bl-quellen{ display:grid; gap:10px;
  grid-template-columns:repeat(auto-fit, minmax(190px, 1fr)); }
.bl-quellen>button,.bl-quellen>.bl-q-pdf{ border:1px solid #e3e8f0; background:#fff;
  border-radius:13px; padding:15px;
  display:flex; align-items:center; gap:11px; text-align:left; cursor:pointer; color:#1b2230; }
.bl-quellen>button:hover,.bl-quellen>.bl-q-pdf:hover{ border-color:#a9c0ff; background:#f4f7ff; }
/* Die Frage vor dem Umwandeln: Text mit übernehmen oder nur das Bild? */
.bl-pdf-frage{ display:flex; flex-direction:column; gap:12px;
  background:#f6f8fb; border:1px solid #e7ebf2; border-radius:12px; padding:14px; }
.bl-pdf-schalter{ display:flex; align-items:flex-start; gap:10px; cursor:pointer; }
.bl-pdf-schalter input{ margin-top:2px; width:17px; height:17px; flex:none; }
.bl-pdf-schalter span{ display:flex; flex-direction:column; gap:3px; min-width:0; }
.bl-pdf-schalter b{ font-size:13px; }
.bl-pdf-schalter small{ font-size:11px; line-height:1.35; color:#7b8494; }
.bl-pdf-frage .bl-neu{ align-self:flex-end; }
.bl-quellen svg{ width:29px; height:29px; flex:0 0 auto; fill:none; stroke:#2E5BFF;
  stroke-width:1.7; stroke-linecap:round; stroke-linejoin:round; }
.bl-quellen span{ display:flex; min-width:0; flex-direction:column; gap:3px; }
.bl-quellen b{ font-size:13px; }.bl-quellen small{ font-size:10px; line-height:1.3; color:#7b8494; }
#bl-quelle-liste{ margin-top:16px; }.bl-quell-titel{ font-size:12px; font-weight:800;
  color:var(--muted); text-transform:uppercase; letter-spacing:.05em; margin-bottom:6px; }
.bl-q-filter{ display:grid; grid-template-columns:1fr 1fr; gap:10px; padding:10px;
  background:#f6f8fb; border:1px solid #e7ebf2; border-radius:12px; }
.bl-q-filter label{ display:flex; flex-direction:column; gap:5px; font-size:10px;
  font-weight:800; color:#697386; text-transform:uppercase; letter-spacing:.04em; }
.bl-q-filter select{ width:100%; min-width:0; border:1px solid #d7dde7; border-radius:8px;
  background:#fff; padding:8px; color:#1b2230; }.bl-q-filter select:disabled{ opacity:.55; }
.bl-q-auswahl{ margin-top:12px; }.bl-q-auswahl>b{ display:block; padding:0 6px 6px;
  font-size:10px; color:#697386; text-transform:uppercase; letter-spacing:.04em; }
.bl-quell-zeile,.bl-version{ width:100%; border:0; border-top:1px solid #eef1f6; background:#fff;
  padding:10px 6px; display:flex; justify-content:space-between; align-items:center; text-align:left;
  cursor:pointer; }.bl-quell-zeile:hover,.bl-version:hover{ background:#f7f9fc; }
.bl-quell-zeile span,.bl-version span{ display:flex; min-width:0; flex-direction:column; gap:2px; }
.bl-quell-zeile b,.bl-version b{ font-size:12.5px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.bl-quell-zeile small,.bl-version small{ font-size:10px; color:#8b93a3; }.bl-quell-zeile i,.bl-version i{ font-style:normal;
  font-size:10px; font-weight:700; color:#2E5BFF; }.bl-quell-laedt,.bl-quell-leer{ padding:18px;
  text-align:center; font-size:12px; color:#8b93a3; }

/* Große Aufgabenwahl: Die 244-px-Werkzeugspalte ist für Fach, Thema,
   Material, Fassung und echte Aufgabenvorschauen zu schmal. */
.st-aq-modal{ width:min(1120px,calc(100vw - 32px));
  height:min(760px,calc(var(--vh100) - 40px)); overflow:hidden;
  display:flex; flex-direction:column; }
.st-aq-modal>.bl-modal-kopf,.st-aq-modal>.st-aq-tabs,
.st-aq-modal>.st-aq-filter{ flex:0 0 auto; }
.st-aq-tabs{ display:flex; gap:7px; margin-bottom:10px; }
.st-aq-tabs button,.st-aq-wahl button{ border:1px solid #dce3ee; background:#fff;
  border-radius:9px; padding:8px 12px; font:700 11px inherit; color:#4d5666; cursor:pointer; }
.st-aq-tabs button.an{ background:#eaf1fe; border-color:#b9ccff; color:#1e3fcc; }
.st-aq-tabs button:last-child{ margin-left:auto; }
.st-aq-filter{ display:grid; grid-template-columns:1fr 1fr; gap:10px; padding:10px;
  background:#f6f8fb; border:1px solid #e7ebf2; border-radius:12px; margin-bottom:10px; }
.st-aq-filter label,.st-aq-fassung{ display:flex; flex-direction:column; gap:4px;
  font-size:10px; font-weight:800; color:#6f7888; text-transform:uppercase; letter-spacing:.04em; }
.st-aq-filter select,.st-aq-fassung select{ min-width:0; border:1px solid #d7dde7;
  border-radius:8px; background:#fff; padding:8px; font:12px inherit; color:#1b2230; }
.st-aq-raster{ display:grid; grid-template-columns:minmax(220px,30%) 1fr; gap:12px;
  flex:1 1 auto; height:auto; min-height:0; overflow:hidden; }
.st-aq-quellen,.st-aq-vorschau{ min-height:0; overflow:auto; border:1px solid #e3e8f0;
  border-radius:12px; background:#fff; }
.st-aq-vorschau{ display:flex; flex-direction:column; overflow:hidden; }
.st-aq-schritt{ padding:9px 12px; font-size:10px; font-weight:800; color:#697386;
  text-transform:uppercase; letter-spacing:.04em; border-bottom:1px solid #edf0f5; }
.st-aq-quellen>button{ width:100%; border:0; border-bottom:1px solid #edf0f5;
  background:#fff; padding:11px 12px; display:flex; flex-direction:column; gap:3px;
  text-align:left; cursor:pointer; color:#1b2230; }
.st-aq-quellen>button:hover{ background:#f3f6fc; }
.st-aq-quellen b{ font-size:12px; }.st-aq-quellen small{ font-size:10px; color:#8b93a3; }
.st-aq-vkopf{ flex:0 0 auto; display:flex; align-items:flex-end;
  justify-content:space-between; gap:12px; padding:12px; background:#fff;
  border-bottom:1px solid #e7ebf2; }
.st-aq-vkopf>div{ display:flex; flex-direction:column; gap:2px; }
.st-aq-vkopf b{ font-size:14px; }.st-aq-vkopf small{ font-size:10px; color:#8b93a3; }
.st-aq-wahl{ display:flex; gap:6px; padding:8px 12px; background:#fafbfd; }
.st-aq-wahl button{ padding:6px 9px; font-size:9px; }
.st-aq-zusaetze{ flex:0 0 auto; display:grid; grid-template-columns:repeat(2,minmax(0,1fr));
  gap:7px; padding:8px 12px; border-bottom:1px solid #edf0f5; background:#fbfcff; }
.st-aq-zusatz{ min-width:0; display:grid; grid-template-columns:20px 1fr; gap:7px;
  padding:8px; border:1px solid #dfe6f1; border-radius:9px; background:#fff; cursor:pointer; }
.st-aq-zusatz input{ margin:2px 0 0; }.st-aq-zusatz span{ min-width:0; display:flex;
  flex-direction:column; gap:4px; }.st-aq-zusatz b{ font-size:10px; }
.st-aq-zusatz i{ max-height:56px; overflow:hidden; font-size:9px; line-height:1.3;
  color:#596273; font-style:normal; }.st-aq-zusatz img{ width:100%; height:56px;
  object-fit:contain; background:#f4f6fa; border-radius:6px; }
.st-aq-fragen{ flex:1 1 auto; min-height:0; overflow:auto; padding:6px 12px; }
.st-aq-frage{ display:grid; grid-template-columns:22px 1fr; gap:8px; align-items:start;
  padding:12px 4px; border-bottom:1px solid #edf0f5; cursor:pointer; }
.st-aq-frage:hover{ background:#fafcff; }.st-aq-frage>input{ margin:4px 0 0; width:16px; height:16px; }
.st-aq-frage>span{ min-width:0; font-size:11px; }
.st-aq-frage .frage{ margin:0; box-shadow:none; border:0; padding:0; }
.st-aq-fuss{ flex:0 0 auto; display:flex; align-items:center;
  justify-content:space-between; gap:12px; padding:10px 12px; background:rgba(255,255,255,.96);
  border-top:1px solid #dfe5ef; box-shadow:0 -6px 18px rgba(20,30,50,.06); }
.st-aq-fuss span{ font-size:11px; color:#6f7888; }.st-aq-fuss button{ border:0;
  border-radius:9px; background:#2e5bff; color:#fff; padding:9px 13px; font:800 11px inherit; cursor:pointer; }
.st-af-kurz{ display:flex; flex-direction:column; gap:6px; padding:4px 1px; }
.st-af-kurz b{ font-size:11px; text-transform:capitalize; }.st-af-kurz span{ font-size:10px;
  color:#7b8494; line-height:1.35; display:-webkit-box; -webkit-line-clamp:3;
  -webkit-box-orient:vertical; overflow:hidden; }
.st-af-kurz button{ border:1px solid #b9ccff; background:#eaf1fe; color:#1e3fcc;
  border-radius:8px; padding:8px; font:800 10px inherit; cursor:pointer; }
.st-af-modal{ width:min(760px,calc(100vw - 32px)); }
#st-af-inhalt{ display:grid; grid-template-columns:1fr 1fr; gap:12px; }
#st-af-inhalt>.st-ki-box{ grid-row:span 6; }
#st-af-inhalt .ab-ed-feld{ min-width:0; }
#st-af-inhalt textarea,#st-af-inhalt input,#st-af-inhalt select{ font-size:12px; }

/* Auf dem Telefon zwei Karten nebeneinander - eine waere eine lange Rolle,
   drei zu klein zum Treffen. Die Aktionen sind dort IMMER sichtbar: es gibt
   keinen Hover, an dem sie sonst haengen wuerden. */
@media (max-width:640px){
  .bl-regal{ grid-template-columns:repeat(2,minmax(0,1fr)); gap:12px; }
  .bl-neu{ width:100%; justify-content:center; }
  .bl-akt{ opacity:1; }
  .bl-quellen{ grid-template-columns:1fr; }
  .st-aq-modal{ overflow:hidden; }.st-aq-raster{ grid-template-columns:1fr;
    grid-template-rows:minmax(90px,28%) minmax(0,1fr); height:auto; }
  .st-aq-quellen{ max-height:none; }.st-aq-vorschau{ max-height:none; }
  .st-aq-tabs{ flex-wrap:wrap; }.st-aq-tabs button:last-child{ margin-left:0; }
  #st-af-inhalt{ grid-template-columns:1fr; }
}

/* ===== DATENTABELLE (v2.364.0) ==============================================
   EIN Tabellen-Baustein fuer die Verwaltungslisten. Vorbild ist die Ansicht,
   die Murat als Massstab genannt hat (22.08.2026: „antona bak, öyle net ki
   anlatamam"): eine Zeile je Datensatz, Spalten mit Ueberschrift, unter jeder
   Ueberschrift ein Suchfeld, Sortierung per Klick, Spaltenbreite ziehbar.

   WARUM EIN BAUSTEIN UND NICHT DREIMAL DASSELBE: Es kommen mindestens vier
   Listen, die genau so aussehen sollen - Lehrkraefte (Z1), Schueler im
   Verzeichnis, die Unterrichtsverteilung (Z2) und spaeter die
   Fehlzeiten-/Mitarbeitsraster. Drei Kopien laufen auseinander, sobald an
   einer eine Spalte dazukommt.

   WARUM `table` UND KEIN GRID: Spaltenbreiten muessen sich ZIEHEN lassen und
   dabei ueber Kopf und Koerper zusammenbleiben. Mit `table-layout:fixed` ist
   das eine Zahl je <col>; mit einem Grid waere es dieselbe Zahl an zwei
   Stellen, die man synchron halten muss.

   MOBIL: Die Tabelle scrollt WAAGERECHT in ihrem eigenen Kasten, die erste
   Spalte bleibt stehen (position:sticky). Die Seite selbst scrollt nie
   seitlich - CLAUDE.md, "schmal aendern heisst SCHMAL aendern".

   MIT WEM: ssTabelle() in static/js/index-app.js. */
/* DIE TABELLE SITZT AUF DER SEITE, NICHT IN EINER ZWEITEN KARTE
   (Befund Murat 22.08.2026: „sen sayfanin üstüne yeni bir sayfa koyuyorsun,
   bunu bu boksun icinden kurtarip zemine gömmen lazim").
   Der Verwaltungsbereich IST schon ein weisses Panel. Eine Tabelle mit
   eigener Flaeche und eigenem Schatten darin sieht aus wie ein Blatt, das
   jemand obendrauf gelegt hat - zwei Ebenen fuer einen Inhalt. Geblieben ist
   nur die duenne Umrandung, damit die Spalten einen Rand haben. */
/* NACHTRAG v2.374.0: auch die duenne Umrandung ist weg (Murat, zum zweiten
   Mal: „icerigi kutudan kurtar, arkadaki beyaz alana göm ve yay"). Sie war
   der letzte Rest der zweiten Ebene - ein Rahmen um den ganzen Inhalt macht
   ihn wieder zu einem Blatt AUF der Seite. Die Spalten haben ihre eigenen
   Linien, die reichen. `width:100%` statt einer Innenbreite: die Tabelle
   soll die Flaeche ausnutzen, nicht in ihrer Mitte sitzen. */
.dtab-wrap{ background:transparent; border:0; border-radius:0;
  box-shadow:none; overflow:visible; width:100%; }
/* ⛔ KEIN RAHMEN UM DIE LISTE (Ansage Murat 06.09.2026, zum zweiten Mal:
   „ben sana o distaki cizgileri sil demistim cerceveyi yani onu heryere
   koymussun").

   v2.678.0 hatte „excel tipi tablo" als „umrahmter Block" gelesen und einen
   Rahmen um jede Verwaltungsliste gelegt. Gemeint war das GEGENTEIL: Excel
   hat Spaltenkanten, aber keinen Kasten außen herum - und jeder Rahmen
   kostet Breite, um die es bei „yerden kazaniriz" ging. Die senkrechten
   Kanten zwischen den Spalten bleiben (v2.376.0), die Klammer außen ist
   wieder weg. Wer sie erneut einführt, macht die Tabelle schmaler. */
.dtab-scroll{ overflow-x:auto; overflow-y:visible; -webkit-overflow-scrolling:touch; }
/* KLEINERE SCHRIFT UND SICHTBARE SPALTENKANTEN (Murat 22.08.2026: „biraz
   daha yaziyi kücültebiliriz ... büyütüp kücültme olayi ama oralar tam belli
   olmuyor, cizgileri biraz daha belirgin bir renkle yaparsan").
   Beides haengt zusammen: In einer Liste mit zehn Spalten passt mehr Inhalt,
   wenn die Schrift eine Stufe kleiner ist - und man findet die Ziehkante nur,
   wenn zwischen den Spalten ueberhaupt eine Linie steht. Die senkrechte
   Trennung ist deshalb sichtbar (--line statt gar nichts), waehrend die
   waagerechte fein bleibt: sonst wird die Tabelle ein Gitter und man liest
   Kaestchen statt Zeilen. */
.dtab{ border-collapse:separate; border-spacing:0; table-layout:fixed; width:100%; min-width:max-content;
  font-size:var(--fs-xs); }
.dtab th, .dtab td{ padding:var(--s-1) var(--s-2); text-align:left; vertical-align:middle;
  border-bottom:1px solid var(--hair); border-right:1px solid var(--line);
  overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.dtab th:last-child, .dtab td:last-child{ border-right:0; }
.dtab thead th{ background:color-mix(in srgb, var(--ink) 3%, transparent); font-weight:750; color:var(--muted); position:relative;
  font-size:var(--fs-2xs); letter-spacing:.02em; user-select:none; }
.dtab thead th.sortierbar{ cursor:pointer; }
.dtab thead th.sortierbar:hover{ color:var(--ink); }
.dtab-sort{ margin-left:var(--s-1); opacity:.45; font-size:10px; }
.dtab thead th.an .dtab-sort{ opacity:1; color:var(--brand); }
/* Der Ziehgriff sitzt AUF der Spaltenkante, nicht daneben - sonst trifft man
   ihn nicht, ohne die Sortierung auszuloesen. */
/* Der Ziehgriff ist im Ruhezustand eine kraeftigere Linie AUF der Kante -
   ohne sie sucht man die Stelle, an der man ziehen kann. Beim Ueberfahren
   wird er breit und farbig, damit klar ist, dass er zieht und nicht sortiert. */
.dtab-griff{ position:absolute; top:0; right:-3px; width:7px; height:100%; cursor:col-resize; z-index:2; }
.dtab-griff::after{ content:""; position:absolute; top:20%; right:3px; width:2px; height:60%;
  background:var(--line); border-radius:1px; }
.dtab-griff:hover::after{ top:0; height:100%; width:3px; right:2px; background:var(--brand); }
/* EIN Suchfeld ueber der Tabelle (v2.371.0) statt eines je Spalte: zehn
   leere Kaesten unter den Ueberschriften sahen aus wie ein kaputtes
   Formular. Daneben die Blaetter-Knoepfe, wenn es mehr als eine Seite gibt. */
/* EINE ZEILE, DIE NICHT UMBRICHT (v2.376.0, Anweisung Murat 23.08.2026:
   „o satirda hepsi büyümeye kücülmeye duyarli olmali alt satira inmemeli").
   `nowrap` allein reicht nicht - ohne `min-width:0` an den Kindern weigert
   sich ein Flex-Element zu schrumpfen und schiebt die Nachbarn hinaus.
   ALLE BEDIENELEMENTE DARIN SIND GLEICH HOCH (`--dtab-h`): Auswahlfeld,
   Suchfeld und Knopf standen vorher auf drei verschiedenen Hoehen, weil
   jedes seine eigene Polsterung mitbrachte - in einer Zeile nebeneinander
   sieht das aus wie ein Fehler, und es IST einer. */
.dtab-kopf{ --dtab-h:34px;
  display:flex; align-items:center; gap:var(--s-2); padding:0 0 var(--s-2);
  border-bottom:1px solid var(--hair); background:transparent; flex-wrap:nowrap; }
.dtab-kopf > *{ min-width:0; }
.dtab-kopf > select, .dtab-kopf .dtab-such, .dtab-kopf .dtab-aktion,
.dtab-kopf .dtab-ausgabe, .dtab-kopf .ss-btn, .dtab-kopf .sv-menuwrap > .ss-btn{
  height:var(--dtab-h); box-sizing:border-box; padding-top:0; padding-bottom:0; }
/* Die beiden Aufklappmenues aus dem Verzeichnis (Filter, Hinzufuegen) stehen
   seit v2.380.0 in dieser Zeile. Sie brachten ihre eigene Hoehe mit - in
   einer Reihe nebeneinander sieht das aus wie ein Fehler, und es IST einer. */
.dtab-kopf .sv-menuwrap{ flex:none; display:inline-flex; align-items:center; }
.dtab-kopf .ss-btn{ display:inline-flex; align-items:center; white-space:nowrap; }
/* Die Zahl links: sie darf als ERSTE schrumpfen und zuletzt ganz weichen -
   sie ist die Auskunft, alles andere sind Handgriffe. */
.dtab-stand{ flex:0 1 auto; min-width:0; font-size:var(--fs-2xs); color:var(--muted);
  white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.dtab-stand b{ color:var(--ink); font-weight:800; }
.dtab-such{ flex:1 1 90px; min-width:0; box-sizing:border-box; border:1px solid var(--line);
  border-radius:var(--r-control); background:var(--card); color:var(--ink);
  font:inherit; font-size:var(--fs-xs); padding:0 10px; }
.dtab-such:focus{ outline:2px solid var(--brand); outline-offset:-1px; border-color:transparent; }
.dtab-blaettern{ display:flex; align-items:center; gap:var(--s-1); font-size:var(--fs-xs);
  color:var(--muted); white-space:nowrap; }
.dtab-blaettern button{ border:1px solid var(--line); background:var(--card); color:var(--ink);
  border-radius:var(--r-control); width:26px; height:26px; font:inherit; cursor:pointer; }
.dtab-blaettern button:disabled{ opacity:.4; cursor:default; }
/* Die Aktion der Liste („+ Lehrkraft", „+ Zuordnung") sitzt in derselben
   Zeile wie die Suche - nicht in einer Ueberschrift darueber. Sie traegt die
   Flaechenfarbe wie alle Hauptknoepfe (v2.373.0). */
.dtab-aktion{ flex:none; border:none; border-radius:var(--r-control);
  /* --card ist im hellen Design Weiss und im dunklen die Kartenflaeche -
     dieselbe Rolle wie ein hartes #fff, aber ohne festen Wert. */
  background:var(--flaeche-akzent, var(--brand)); color:var(--card);
  font:inherit; font-size:var(--fs-xs); font-weight:750; padding:7px 13px; cursor:pointer;
  white-space:nowrap; }
.dtab-aktion:hover{ filter:brightness(1.06); }
/* „Ausgeben" steht LINKS von „+ …" (Wunsch Murat 23.08.2026: „indirme
   tuslari var ya altta, druck tusu koy +fach in soluna oradan indirelim").
   Es ist ein Nebenweg, kein Hauptknopf - deshalb Umriss statt Flaeche. */
.dtab-ausgabe{ flex:none; border:1px solid var(--line); border-radius:var(--r-control);
  background:var(--card); color:var(--ink); font:inherit; font-size:var(--fs-xs);
  font-weight:700; padding:0 12px; cursor:pointer; white-space:nowrap;
  display:inline-flex; align-items:center; gap:6px; }
.dtab-ausgabe:hover{ border-color:var(--flaeche-akzent, var(--brand)); }
/* Das Aufklappmenue am Ausgeben-Knopf (v2.377.0). Dieselbe Bauform wie das
   Menue im Schuelerverzeichnis (`.sv-menu`) - ein Muster, kein neues.
   `position:absolute` in einem `relative` Umschlag, damit es die Kopfzeile
   nicht auseinanderzieht; `z-index` ueber der Tabelle, sonst verschwindet es
   hinter der haftenden Kopfspalte. */
.dtab-menuwrap{ position:relative; flex:none; display:inline-flex; }
.dtab-menu{ display:none; position:absolute; right:0; top:calc(100% + 6px); z-index:70;
  width:274px; max-width:min(300px,88vw); background:var(--card);
  border:1px solid var(--line); border-radius:14px;
  box-shadow:0 14px 38px rgba(27,34,48,.18); padding:6px; }
.dtab-menu.an{ display:block; }
.dtab-menu button{ display:flex; width:100%; align-items:flex-start; gap:10px;
  background:none; border:0; border-radius:10px; padding:8px 10px; font:inherit;
  text-align:left; color:var(--ink); cursor:pointer; }
.dtab-menu button:hover{ background:var(--flaeche-akzent-soft, var(--paper)); }
.dtab-menu button > span{ display:block; min-width:0; }
.dtab-menu b{ display:block; font-size:var(--fs-xs); font-weight:700; }
.dtab-menu i{ display:block; font-style:normal; font-size:var(--fs-2xs);
  color:var(--muted); line-height:1.4; margin-top:1px; }
.dtab-menu svg{ opacity:.7; }
/* Ein Auswahlfeld MITTEN in einer Tabellenzeile - die Lehrkraft je Fach.
   Es sieht bewusst nicht wie ein Formularfeld aus: kein Rahmen, bis man
   darauf zeigt. Sonst haette eine Tabelle mit 18 Zeilen 18 Kaesten, und das
   war genau der Fehler, den die Spaltensuche schon einmal gemacht hat. */
.dtab-zelle-sel{ width:100%; box-sizing:border-box; border:1px solid transparent;
  border-radius:var(--r-control); background:transparent; color:var(--ink);
  font:inherit; font-size:var(--fs-xs); padding:4px 6px; cursor:pointer; }
.dtab-zelle-sel:hover{ border-color:var(--line); background:var(--card); }
.dtab-zelle-sel:focus{ outline:2px solid var(--flaeche-akzent, var(--brand)); outline-offset:-1px; }
/* DREI ZUSTAENDE, DIE MAN OHNE LESEN ERKENNEN MUSS (Fach-Matrix, v2.374.0):
   leer  = hier fehlt noch jemand (blass, damit die Luecken als Muster
           auffallen - das ist der eigentliche Zweck der Matrix)
   offen = zugeordnet, aber die Lehrkraft hat die Klasse noch nicht angelegt;
           gestrichelt in Bernstein, weil dort noch etwas passieren muss
   „!"   = zwei Lehrkraefte im selben Fach - fuers Zeugnis zu klaeren. */
.dtab-zelle-sel.leer{ color:var(--muted); }
/* `.offen` - der gestrichelt orange Rand fuer „noch nicht verknuepft“ -
   ist in v2.675.0 entfallen: am Schuljahresanfang war das der Normalfall und
   sah aus wie ein Fehler. Der Hinweis steht weiter im Tooltip der Zelle. */
.sv-doppel{ flex:none; border:0; background:transparent; padding:2px; font:inherit;
  font-weight:800; color:var(--amber-ink); cursor:pointer; }
/* Die Kursart als Marke in der Zelle (v2.643.0). Zwei Buchstaben, damit man
   sieht, DASS geteilt ist – der volle Name steht im Tooltip des Feldes. Sie
   darf nie wachsen: die Zelle ist 78px breit, und das Auswahlfeld mit der
   Person ist das Wichtige darin. */
.sv-kursmarke{ flex:none; font-size:10px; font-weight:800; letter-spacing:.02em;
  color:var(--kont-plan, var(--brand)); background:var(--brand-soft);
  border-radius:5px; padding:1px 4px; line-height:1.4; }
.dtab-zelle-flex{ display:flex; align-items:center; gap:3px; min-width:0; }
.dtab-zelle-flex > .dtab-zelle-sel{ flex:1; min-width:0; }
.svu-besetzung-neu{ display:grid; grid-template-columns:2fr 1fr; gap:10px; margin-top:12px; }
.svu-besetzung-liste{ display:grid; gap:10px; }
/* Vier Spalten seit v2.643.0: Name · Rolle · Kursart · Mindestbesetzung. */
.svu-besetzung-zeile{ display:grid; grid-template-columns:minmax(110px,1fr) 1.5fr 90px 100px;
  gap:9px; align-items:end; border-bottom:1px solid var(--line); padding-bottom:10px; }
.svu-besetzung-zeile label{ font-size:11px; color:var(--muted); }
.svu-besetzung-zeile select,.svu-besetzung-zeile input{ display:block; width:100%; margin-top:4px;
  border:1px solid var(--line); border-radius:var(--r-control); background:var(--card);
  color:var(--ink); padding:7px; font:inherit; font-size:12px; }
@media (max-width:600px){
  .svu-besetzung-neu,.svu-besetzung-zeile{ grid-template-columns:1fr; }
}
/* Der Hinweiskasten ueber der Matrix - als Klasse, weil er sonst als
   Inline-Style im JavaScript stuende und von aussen nicht zu erreichen waere. */
.sv-hinweis{ background:var(--amber-soft); border:1px solid var(--amber); border-radius:12px;
  padding:11px 13px; margin-bottom:12px; font-size:var(--fs-xs); line-height:1.55; }
/* P1: Bedarf – Stundentafel und Zeitraster (v2.625.0).
   Alles aus dem Wörterbuch, keine festen Farben (DESIGN_SYSTEM.md). */
/* ⛔ KEIN KASTEN MEHR (Ansage Murat 06.09.2026, zweimal: „kutuya degil
   arkaplandaki sayfaya yedir" und dann „sana kutudan kurtar demistim …
   Zeitraster Wochenplan Nach Klassen Nach Räumen Nach Lehrkraft i
   demistim").

   Es war eine Pille mit Rahmen, und der aktive Knopf war eine volle
   Farbfläche darin. Auf einer Seite, die selbst schon eine Karte ist, und
   ÜBER einer Tabelle, war das die dritte Umrandung von außen nach innen.
   Jetzt sind es flache Reiter: die aktive Lage trägt Farbe und einen
   Strich darunter, mehr braucht es nicht - dieselbe Sprache wie ein
   Karteireiter, und sie kostet keine Breite.

   Sie bleiben MITTIG (v2.640.1, „o menüyüde ortaya al") - nur der Kasten
   ist weg, nicht die Lage. */
.sv-bd-schalter{ display:inline-flex; align-items:stretch; gap:2px;
  max-width:100%; overflow-x:auto; scrollbar-width:none; }
.sv-bd-schalter::-webkit-scrollbar{ display:none; }
.sv-bd-schalter button{ border:0; border-bottom:2px solid transparent;
  background:transparent; color:var(--muted); font:inherit;
  font-size:var(--fs-xs); font-weight:650; padding:7px 14px; cursor:pointer;
  white-space:nowrap; border-radius:8px 8px 0 0; }
.sv-bd-schalter button:hover{ color:var(--ink);
  background:color-mix(in srgb, var(--ink) 4%, transparent); }
/* ⛔ DIE FARBE KOMMT AUS DER FLAECHENFARBE, NICHT AUS --brand (Ansage Murat
   06.09.2026: „tema rengine göre button renklerini, yazilari yani
   basliklarin renklerini düzeltiyoduk hep ama burda bi mavi bi yesil").
   Wer sich eine Schale gewaehlt hat, bekam hier trotzdem das Blau der Marke -
   neben Knoepfen, die schon der Schale folgten. */
.sv-bd-schalter button.on{ color:var(--flaeche-akzent, var(--brand));
  border-bottom-color:var(--flaeche-akzent, var(--brand)); background:transparent; }
/* P4: Der Wochenplan. Links die Arbeitsliste, rechts das Gitter – und das
   Gitter scrollt in SICH, die Seite bleibt ruhig. */
/* P6: Die Lehrkraft-Sicht. BEIDE Darstellungen stehen im HTML, das CSS
   zeigt eine – am Computer das Wochengitter, am Telefon die Tagesliste
   (§3b). Kein Umrechnen in JavaScript, kein Neuzeichnen beim Drehen. */
.stp-gitter{ display:none; overflow-x:auto; }
.stp-gitter table{ border-collapse:collapse; width:100%; }
.stp-gitter th{ font-size:11px; color:var(--muted); font-weight:600; padding:3px 5px;
  border-bottom:1px solid var(--line); text-align:center; white-space:nowrap; }
.stp-gitter tbody th{ text-align:right; }
.stp-gitter tbody th i{ display:block; font-style:normal; font-size:9.5px; font-weight:400; }
.stp-gitter td{ border-bottom:1px solid var(--line); border-left:1px solid var(--line);
  padding:2px; vertical-align:top; min-width:66px; }
.stp-g-z{ display:block; border-radius:6px; background:var(--paper); padding:3px 5px;
  margin-bottom:2px; font-size:11.5px; line-height:1.25; }
.stp-g-z.schule{ background:var(--brand-soft); }
.stp-g-z.abo{ background:var(--ok-soft); }
.stp-g-z i{ display:block; font-style:normal; color:var(--muted); font-size:10px; }
.stp-g-z u{ display:block; text-decoration:none; color:var(--muted); font-size:9.5px; }
/* Eine Zeile aus dem Stundenplan der Schule: sie trägt keine Knöpfe, aber
   ein Wort – sonst hält die Lehrkraft die fehlenden Knöpfe für einen Fehler. */
.stp-schule{ font-size:10.5px; color:var(--brand); border:1px solid var(--brand-soft);
  background:var(--brand-soft); border-radius:999px; padding:3px 9px; white-space:nowrap; }
@media (min-width:761px){
  .stp-liste-tage{ display:none; }
  .stp-gitter{ display:block; }
}

/* P7c/d: Die Vertretung bei der Lehrkraft (v2.636.0). Sie steht ÜBER dem
   eigenen Raster im Stundenplan-Fenster – sie gilt für heute, das Raster für
   immer. docs/PLAN_STUNDENPLAN.md §3b/§3d. */
.stp-v-kasten{ border:1px solid var(--line); border-radius:14px; background:var(--paper);
  padding:10px 12px; margin-bottom:12px; }
.stp-v-h{ font-size:var(--fs-xs); color:var(--muted); font-weight:700; margin-bottom:7px; }
.stp-v-zeile{ display:flex; align-items:center; gap:10px; background:var(--card);
  border:1px solid var(--line); border-radius:10px; padding:7px 10px; margin-bottom:6px; }
.stp-v-zeile:last-child{ margin-bottom:0; }
.stp-v-wann{ flex:none; width:64px; font-size:var(--fs-xs); font-weight:700; }
.stp-v-wann i{ display:block; font-style:normal; font-weight:400; font-size:10.5px;
  color:var(--muted); }
.stp-v-was{ flex:1; min-width:0; font-size:var(--fs-xs); }
.stp-v-was i{ display:block; font-style:normal; color:var(--muted); font-size:11px; }
.stp-v-akt{ flex:none; display:flex; align-items:center; gap:6px; flex-wrap:wrap;
  justify-content:flex-end; }
.stp-v-knopf{ border:1px solid var(--line); border-radius:999px; background:var(--card);
  color:var(--ink); font:inherit; font-size:10.5px; padding:4px 11px; cursor:pointer;
  white-space:nowrap; }
.stp-v-knopf:hover{ border-color:var(--brand); color:var(--brand); }
.stp-v-mark{ font-size:10.5px; border-radius:999px; padding:3px 9px; white-space:nowrap; }
.stp-v-mark.ok{ background:var(--ok-soft); color:var(--ok-ink); }
.stp-v-mark.grau{ background:var(--paper); color:var(--muted); }
@media (max-width:640px){
  .stp-v-zeile{ flex-wrap:wrap; }
  .stp-v-akt{ width:100%; justify-content:flex-start; }
}

/* P7c: Das freigegebene Material einer Vertretung (v2.639.0). Es steht in
   der Zeile des Auftrags, nicht in einem eigenen Kasten – es IST der
   Auftrag. docs/PLAN_STUNDENPLAN.md §3c. */
.stp-v-mat{ display:flex; flex-wrap:wrap; gap:6px; margin-top:5px; }
.stp-v-matlink{ font-size:10.5px; border:1px solid var(--line); border-radius:999px;
  padding:3px 9px; color:var(--ink); text-decoration:none; background:var(--paper);
  max-width:100%; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
a.stp-v-matlink:hover{ border-color:var(--brand); color:var(--brand); }
.stpvm-block{ margin-bottom:14px; }
.stpvm-zeile{ display:flex; align-items:flex-start; gap:9px; border:1px solid var(--line);
  border-radius:10px; background:var(--card); padding:7px 10px; margin-bottom:5px;
  cursor:pointer; }
.stpvm-zeile span{ flex:1; min-width:0; font-size:var(--fs-xs); overflow-wrap:anywhere; }
.stpvm-zeile em{ font-style:normal; font-size:10.5px; color:var(--muted); }
.stpvm-zeile input:disabled + span{ color:var(--muted); }

/* P8: Der Fortschritt des Rechners. Er läuft im Browser – deshalb gibt es
   überhaupt einen Balken und einen Abbrechen-Knopf (§2). */
.svpr-bahn{ height:8px; border-radius:999px; background:var(--paper);
  overflow:hidden; }
.svpr-bahn span{ display:block; height:100%; width:0; background:var(--brand);
  transition:width .2s ease; }

/* ⛔ DIE LEISTE IST KEIN KASTEN (Ansage Murat 06.09.2026: „böyle kenarlari
   rund olan bir kutu icinde kutuya degil arkaplandaki sayfaya yedir ve
   genislet tablolari"). Sie stand als gerahmter Kasten auf --paper, und
   DARIN lag noch ein zweiter Kasten - der Umschalter „Nach Klassen / Nach
   Räumen / Nach Lehrkraft". Kasten im Kasten auf einer Seite, die selbst
   schon eine Karte ist; die drei Raender kosteten Breite, die dem Gitter
   fehlte. Jetzt liegt sie direkt auf der Seite - wie die Reiterleiste
   darueber, mit der sie ein Paar bildet. */
.sv-p-veroeff{ display:flex; align-items:center; gap:12px; flex-wrap:wrap;
  padding:2px 0; margin-bottom:10px; font-size:var(--fs-xs); color:var(--muted); }
.sv-p-veroeff select{ border:1px solid var(--line); border-radius:var(--r-control);
  background:var(--card); color:var(--ink); font:inherit; font-size:var(--fs-xs);
  padding:6px 9px; }
/* ⛔ DASSELBE MASS WIE ÜBERALL SONST (v2.640.3, Befund Murat 04.09.2026:
   „wochenplandaki ausgeben var ya digerleriyle aynisi olsun boyutu").
   Der Knopf stand hier in einer Leiste ohne `--dtab-h` und war dadurch
   höher als das „Ausgeben" in Klassen, Unterricht und Lehrkräften – auf
   demselben Bildschirm, zwei Reiter auseinander. Ein Bedienelement, das je
   nach Ort anders groß ist, sieht aus wie ein Fehler, und es IST einer. */
/* Die Geisterknoepfe DIESER Leiste folgen der Schale - sonst stehen in einer
   Zeile ein blaues „Lehrkraefte zuordnen" und ein gruenes „Veroeffentlichen". */
/* Auch der Vertretungstag: „Abwesenheit eintragen" und „Aushang drucken"
   standen im Marken-Blau neben gruenen Vollknoepfen. */
/* ⛔ UND ZWAR MIT `!important` (Befund Murat 06.09.2026: „Lehrkraefte
   zuordnen, Aus Untis uebernehmen ve Abwesenheit eintragen butonlarinda
   thema rengi olsun digerleri gibi. olmadi bi onlar thema rengi").
   Er hat recht, und die Regel darunter war wirkungslos: die Grundregel
   `.btn.ghost` (weiter oben in dieser Datei) setzt Farbe UND Rand mit
   `!important`. Eine spaetere Regel gewinnt nur bei GLEICHER Wichtigkeit -
   ohne `!important` verliert die genauere Auswahl gegen die allgemeinere.
   Deshalb standen diese drei Knoepfe im Markenblau neben gruenen
   Vollknoepfen derselben Leiste, obwohl der Code das Gegenteil sagte. */
.sv-v-knopf.btn.ghost{ color:var(--flaeche-akzent, var(--brand)) !important;
  border-color:var(--flaeche-akzent, var(--brand)) !important; }
.sv-v-knopf.btn.ghost:hover{
  background:var(--flaeche-akzent-soft, var(--brand-soft)) !important; }
.sv-p-veroeff .btn.ghost{ color:var(--flaeche-akzent, var(--brand)) !important;
  border-color:var(--flaeche-akzent, var(--brand)) !important; }
.sv-p-veroeff .btn.ghost:hover{
  background:var(--flaeche-akzent-soft, var(--brand-soft)) !important; }
.sv-p-veroeff .dtab-ausgabe, .sv-p-veroeff .btn.ghost{
  height:34px; box-sizing:border-box; padding-top:0; padding-bottom:0;
  font-size:var(--fs-xs); }
.sv-p-leiste{ display:flex; align-items:center; gap:12px; flex-wrap:wrap; margin-bottom:10px; }
.sv-p-leiste select{ border:1px solid var(--line); border-radius:var(--r-control);
  background:var(--card); color:var(--ink); font:inherit; font-size:var(--fs-xs);
  padding:6px 9px; }
.sv-p-tipp{ font-size:var(--fs-xs); color:var(--muted); }
.sv-p-wrap{ display:flex; gap:12px; align-items:flex-start; }
.sv-p-offenliste{ flex:0 0 190px; border:1px solid var(--line); border-radius:14px;
  background:var(--card); padding:9px; max-height:520px; overflow-y:auto; }
.sv-p-h{ font-size:var(--fs-xs); color:var(--muted); margin-bottom:6px; }
.sv-p-offen{ display:grid; grid-template-columns:minmax(0,1fr) auto; align-items:center;
  gap:7px; width:100%; text-align:left; border:1px solid var(--line);
  border-radius:9px; background:var(--card); color:var(--ink); font:inherit;
  font-size:var(--fs-xs); padding:6px 8px; margin-bottom:5px; cursor:pointer; }
.sv-p-offen.an{ border-color:var(--brand); background:var(--brand-soft); }
.sv-p-offen>span{ min-width:0; }
.sv-p-offen small{ display:block; color:var(--muted); font-size:10.5px; font-weight:400;
  overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.sv-p-offen i{ font-style:normal; color:var(--muted); font-size:11px; white-space:nowrap; }
/* ⛔ KEIN RAHMEN UM DIE RASTER (Ansage Murat 06.09.2026, zum dritten Mal:
   „Nach Klassen Nach Räumen Nach Lehrkraft, zeitraster, wochenplandaki
   tablolarin disindaki kutuyu cikarmamissin … ici kalsin ama disindaki o
   cerceveyi kaldir. ic cizgiler kaliyor ama.")

   Beim ersten Mal hatte ich den falschen erwischt (`.dtab-scroll`, die
   Verwaltungslisten). Gemeint war immer DIESER: die Klammer um Wochenplan,
   Raumraster und Lehrkraftsicht. Die Linien ZWISCHEN den Zellen bleiben -
   sie sind die Tabelle; der Kasten aussen herum ist nur Rand. */
.sv-p-gitter{ flex:1; min-width:0; overflow-x:auto; background:var(--card); }
.sv-p-gitter table{ border-collapse:collapse; width:100%; }
.sv-p-gitter th{ font-size:11px; color:var(--muted); font-weight:600; padding:3px 4px;
  border-bottom:1px solid var(--line); white-space:nowrap; }
.sv-p-gitter td{ padding:1px; border-bottom:1px solid var(--line); }
.sv-p-std{ position:sticky; left:0; background:var(--card); text-align:right;
  padding-right:7px!important; }
.sv-p-std i{ display:block; font-style:normal; font-size:9.5px; font-weight:400; }
.sv-p-eck{ position:sticky; left:0; background:var(--card); }
.sv-p-kl{ font-weight:700; color:var(--ink); }
.sv-p-gitter td button{ width:100%; min-width:44px; height:30px; border:1px solid transparent;
  border-radius:6px; background:transparent; color:var(--ink); font:inherit;
  font-size:11px; cursor:pointer; padding:1px 2px; }
.sv-p-gitter td button.leer:hover{ background:var(--brand-soft); }
.sv-p-gitter td.voll button{ background:var(--brand-soft); border-color:var(--line); }
.sv-p-gitter td.voll.an button{ border-color:var(--brand); background:var(--card); }
.sv-p-gitter td button i{ display:block; font-style:normal; font-size:9px;
  color:var(--muted); }
.sv-p-stapel{ display:grid; gap:2px; }
/* Drei Zeilen brauchen Platz - eine feste Hoehe schnitt Kuerzel und Raum ab
   (v2.673.0). */
.sv-p-gitter td .sv-p-stapel button{ height:auto; min-height:24px;
  padding:3px 4px; line-height:1.2; }
.sv-p-gitter td .sv-p-stapel .sv-p-plus{ height:18px; border-style:dashed;
  color:var(--brand); line-height:1; }
@media (max-width:900px){
  .sv-p-wrap{ flex-direction:column; }
  .sv-p-offenliste{ flex:1 1 auto; width:100%; max-height:190px; }
}

/* P7: Der Admin-Tag der Vertretung (v2.635.0). Eine Zeile je betroffener
   Stunde, links wer fehlt. Alles aus dem Wörterbuch – keine feste Farbe.
   docs/PLAN_STUNDENPLAN.md §3c. */
.sv-v-kopf{ display:flex; align-items:center; gap:9px; flex-wrap:wrap; margin-bottom:11px; }
.sv-v-kopf input[type=date]{ border:1px solid var(--line); border-radius:var(--r-control);
  background:var(--card); color:var(--ink); font:inherit; font-size:var(--fs-xs);
  padding:6px 9px; }
.sv-v-pfeil{ flex:none; width:32px; height:32px; border:1px solid var(--line);
  border-radius:var(--r-control); background:var(--card); color:var(--muted);
  cursor:pointer; display:flex; align-items:center; justify-content:center; padding:0; }
.sv-v-pfeil:hover{ color:var(--ink); border-color:var(--muted); }
.sv-v-pfeil svg{ width:16px; height:16px; }
.sv-v-tag{ font-size:var(--fs-xs); color:var(--muted); font-weight:700; }
.sv-v-knopf{ margin:0!important; width:auto!important; padding:7px 12px!important;
  font-size:var(--fs-xs)!important; display:inline-flex; align-items:center; gap:6px; }
.sv-v-knopf svg{ width:15px; height:15px; }
.sv-v-wrap{ display:flex; gap:12px; align-items:flex-start; }
.sv-v-fehlliste{ flex:0 0 210px; border:1px solid var(--line); border-radius:14px;
  background:var(--card); padding:9px; }
.sv-v-liste{ flex:1; min-width:0; }
.sv-v-fehlt{ display:flex; align-items:center; gap:7px; border:1px solid var(--line);
  border-radius:9px; background:var(--card); padding:6px 8px; margin-bottom:5px; }
.sv-v-fehlt span{ flex:1; min-width:0; font-size:var(--fs-xs); }
.sv-v-fehlt i{ display:block; font-style:normal; color:var(--muted); font-size:11px; }
.sv-v-fehlt .sv-kl-weg{ width:26px; height:26px; }
.sv-v-leer{ font-size:var(--fs-xs); color:var(--muted); padding:8px 2px; }
.sv-v-stand{ font-size:var(--fs-xs); color:var(--muted); margin-bottom:7px; }
.sv-v-zeile{ display:flex; align-items:center; gap:9px; border:1px solid var(--line);
  border-radius:11px; background:var(--card); padding:7px 10px; margin-bottom:6px; }
.sv-v-zeile.hat{ background:var(--paper); }
.sv-v-std{ flex:none; width:26px; text-align:right; font-weight:700;
  font-size:var(--fs-xs); color:var(--muted); }
.sv-v-was{ flex:1; min-width:0; font-size:var(--fs-xs); }
.sv-v-was i{ display:block; font-style:normal; color:var(--muted); font-size:11px; }
.sv-v-akt{ flex:none; display:flex; align-items:center; gap:6px; }
.sv-v-akt .sv-kl-weg{ width:28px; height:28px; }
.sv-v-einteilen{ margin:0!important; width:auto!important; padding:6px 13px!important;
  font-size:var(--fs-xs)!important; }
.sv-v-aendern{ margin:0!important; font-size:var(--fs-xs); }
.sv-v-hat{ display:flex; align-items:center; gap:6px; flex-wrap:wrap;
  font-size:var(--fs-xs); }
/* Der Ausgang der Benachrichtigung steht als Marke DANEBEN – festgehalten
   wird er am Server, weil pf_system_nachricht() Fehler absichtlich
   schluckt (§3c Punkt 3). */
.sv-v-mark{ font-size:10.5px; border-radius:999px; padding:2px 8px; white-space:nowrap; }
.sv-v-mark.ok{ background:var(--ok-soft); color:var(--ok-ink); }
.sv-v-mark.warn{ background:var(--bad-soft); color:var(--bad-ink); font-weight:700; }
.sv-v-mark.grau{ background:var(--paper); color:var(--muted); }
.sv-v-lose{ margin-top:14px; }
.sv-v-check{ display:flex; align-items:center; gap:8px; font-size:var(--fs-xs);
  margin:10px 0 8px; }
.sv-v-arten{ display:flex; gap:14px; flex-wrap:wrap; font-size:var(--fs-xs);
  margin-bottom:11px; }
.sv-v-arten label{ display:flex; align-items:center; gap:6px; }
.sv-v-kand{ display:flex; align-items:flex-start; gap:9px; border:1px solid var(--line);
  border-radius:10px; background:var(--card); padding:8px 10px; margin-bottom:6px;
  cursor:pointer; }
.sv-v-kand input{ margin-top:2px; }
.sv-v-kand span{ flex:1; min-width:0; font-size:var(--fs-xs); }
.sv-v-kand em{ font-style:normal; font-size:10.5px; color:var(--muted); }
.sv-v-kand i{ display:block; font-style:normal; color:var(--muted); font-size:11px; }
@media (max-width:900px){
  .sv-v-wrap{ flex-direction:column; }
  .sv-v-fehlliste{ flex:1 1 auto; width:100%; }
}

/* P1a: Der Untis-Import (v2.638.0). Eine Zeile je Kürzel: was in der Datei
   steht, wie oft, und worauf es zeigt. Die Marke rechts trennt GEFUNDEN von
   VORSCHLAG – geraten darf nie aussehen wie gewusst (§4a). */
.svut-stand{ font-size:var(--fs-xs); color:var(--muted); margin-bottom:10px; }
.svut-block{ margin-top:14px; }
.svut-zeile{ display:flex; align-items:center; gap:9px; border:1px solid var(--line);
  border-radius:10px; background:var(--card); padding:6px 10px; margin-bottom:5px; }
.svut-kz{ flex:0 0 96px; min-width:0; font-size:var(--fs-xs); }
.svut-kz i{ display:block; font-style:normal; color:var(--muted); font-size:10.5px; }
.svut-zeile select{ flex:1; min-width:0; border:1px solid var(--line);
  border-radius:var(--r-control); background:var(--card); color:var(--ink);
  font:inherit; font-size:var(--fs-xs); padding:6px 9px; }
.svut-weg{ font-size:var(--fs-xs); color:var(--muted); padding:4px 2px;
  border-bottom:1px solid var(--line); }
.svut-weg:last-child{ border-bottom:0; }
.svut-weg i{ display:block; font-style:normal; font-size:10.5px; opacity:.8;
  overflow-wrap:anywhere; }
@media (max-width:640px){
  .svut-zeile{ flex-wrap:wrap; }
  .svut-kz{ flex:1 1 100%; }
}

/* P8a: Der Vorschlag der Verteilung, bevor irgendetwas gespeichert wird.
   Eine Zahl wäre nicht prüfbar – man muss sehen, WER wo landen soll. */
.svu-r-liste{ max-height:300px; overflow-y:auto; border:1px solid var(--line);
  border-radius:12px; background:var(--card); padding:7px; }
.svu-r-zeile{ display:flex; align-items:baseline; gap:9px; font-size:var(--fs-xs);
  padding:4px 5px; border-bottom:1px solid var(--line); }
.svu-r-zeile:last-child{ border-bottom:0; }
.svu-r-zeile span{ flex:0 0 42%; min-width:0; }
.svu-r-zeile i{ flex:1; min-width:0; font-style:normal; color:var(--muted); }

/* P3: Die Rückfrage vor einer Zuweisung. Hart und weich sind zu
   unterscheiden – aber beides ist übersteuerbar. */
.svu-hw{ margin:0 0 10px; padding-left:18px; font-size:13px; line-height:1.55; }
.svu-hw.hart li{ color:var(--bad-ink); font-weight:600; }
.svu-hw.weich li{ color:var(--muted); }

/* P2: Die Einsatzplanung (v2.626.0). Alles aus dem Wörterbuch. */
.sv-e-reihe{ display:flex; gap:10px; flex-wrap:wrap; }
.sv-e-feld{ display:flex; flex-direction:column; gap:3px; flex:1 1 120px; min-width:0; }
.sv-e-feld>span{ font-size:var(--fs-xs); color:var(--muted); }
.sv-e-feld>i{ font-style:normal; font-size:10.5px; color:var(--muted); }
.sv-e-feld input,.sv-e-feld select,.sv-e-feld textarea{ width:100%; border:1px solid var(--line);
  border-radius:var(--r-control); background:var(--card); color:var(--ink);
  font:inherit; font-size:var(--fs-xs); padding:7px 9px; }
.sv-e-rest{ font-size:var(--fs-xs); color:var(--muted); }
.sv-e-rest.zuviel{ color:var(--bad-ink); font-weight:600; }
.sv-e-fachz{ display:flex; gap:6px; align-items:center; margin-bottom:5px; }
.sv-e-fachz select{ flex:1; min-width:0; border:1px solid var(--line);
  border-radius:var(--r-control); background:var(--card); color:var(--ink);
  font:inherit; font-size:var(--fs-xs); padding:6px 8px; }
/* Die Wünsche: eine Zeile je Wunsch, mit dem Stand daneben. */
.sv-e-wz{ display:flex; gap:6px; align-items:center; margin-bottom:5px; flex-wrap:wrap; }
.sv-e-wz select,.sv-e-wz input{ min-width:0; border:1px solid var(--line);
  border-radius:var(--r-control); background:var(--card); color:var(--ink);
  font:inherit; font-size:var(--fs-xs); padding:6px 8px; }
.sv-e-wz select:first-child{ flex:0 1 132px; }
.sv-e-wz input{ flex:1 1 110px; }
.sv-e-wz select:nth-of-type(2){ flex:0 1 108px; }
.sv-e-wz>i{ font-style:normal; font-size:11px; color:var(--muted); flex:0 0 auto;
  min-width:74px; }
.sv-e-wz>i.ja{ color:var(--ok-ink); font-weight:600; }
.sv-e-wz>i.nein{ color:var(--amber-ink); }
/* Lehrbefaehigung und Wuensche nebeneinander (v2.657.1). `auto-fit` statt
   einer Media-Regel: auf einem schmalen Schirm brechen sie von selbst
   untereinander, ohne dass eine zweite Stelle davon wissen muss. */
.sv-e-zwei{ display:grid; gap:12px;
  grid-template-columns:repeat(auto-fit,minmax(270px,1fr)); align-items:start; }
.sv-e-vorschlag{ font-size:12px; color:var(--muted); margin-bottom:7px; }
.sv-e-vorschlag button{ border:1px dashed var(--line-kraeftig); border-radius:8px;
  background:transparent; color:var(--brand); font:inherit; font-size:11.5px;
  padding:4px 9px; cursor:pointer; margin-left:4px; }
.sv-e-vorschlag button:hover{ background:var(--brand-soft); }

/* Das Sperrzeiten-Raster: kleine Schalter, kein Text - „angekreuzt heißt
   kann nicht", und mehr steht dort auch nicht (PLAN_STUNDENPLAN.md §5). */
.sv-e-raster table{ border-collapse:collapse; }
.sv-e-raster th{ font-size:11px; color:var(--muted); font-weight:600; padding:2px 6px; }
.sv-e-raster td{ padding:2px; }
.sv-e-raster button{ width:38px; height:24px; border:1px solid var(--line);
  border-radius:6px; background:var(--card); cursor:pointer; }
.sv-e-raster button.an{ background:var(--bad-soft); border-color:var(--bad); }
.sv-e-raster tr.ganz th{ color:var(--ink); }
.sv-e-raster tr.ganz button{ height:20px; }
.sv-e-tage{ display:flex; gap:6px; flex-wrap:wrap; }
.sv-e-tage button{ border:1px solid var(--line); border-radius:8px; background:var(--card);
  color:var(--ink); font:inherit; font-size:var(--fs-xs); padding:6px 13px; cursor:pointer; }
.sv-e-tage button.an{ background:var(--bad-soft); border-color:var(--bad); }
@media (max-width:640px){
  .sv-e-fachz{ flex-wrap:wrap; }
  .sv-e-raster button{ width:30px; }
}

/* Eine DICHTE Tabelle: Zellen, die nur eine Zahl tragen, brauchen die
   übliche Zeilenhöhe nicht (Ansage Murat 04.09.2026). */
.dtab.dicht th,.dtab.dicht td{ padding-top:3px; padding-bottom:3px; }
.dtab.dicht td{ line-height:1.2; }

/* Die Zelle der Stundentafel: Feld und Stand NEBENEINANDER.
   Die TABELLE kommt von `dtabRender` - dieselbe wie überall in der
   Schulverwaltung; eine zweite Bauweise wäre genau das, was
   DESIGN_SYSTEM.md verhindern soll. */
.dtab-kopfnotiz{ display:block; font-style:normal; font-weight:400;
  font-size:10.5px; color:var(--muted); margin-top:1px;
  overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.sv-bd-z{ display:inline-flex; align-items:center; gap:5px;
  border-radius:8px; padding:1px 4px; }
.sv-bd-z.offen{ background:var(--amber-soft); }
.sv-bd-z.voll{ background:var(--ok-soft); }
.sv-bd-z input{ width:42px; border:1px solid var(--line); border-radius:7px;
  background:var(--card); color:var(--ink); font:inherit; font-size:var(--fs-xs);
  padding:3px 3px; text-align:center; }
.sv-bd-z i{ font-style:normal; font-size:10px; color:var(--muted); }
/* ⛔ DIE HANDGRIFFE DES ZEITRASTERS STEHEN OBEN (v2.687.0). Ansage Murat
   06.09.2026: „zeitrasterda speichern i yukari sag üste koy, kücük ikon
   olsun." Ein breiter Speichern-Balken UNTER acht Zeilen ist der Knopf, den
   man sucht, nachdem man schon gescrollt hat. */
.sv-bd-rleiste{ display:flex; align-items:center; gap:8px; flex-wrap:wrap;
  margin:0 0 10px; }
.sv-bd-rk{ display:inline-flex; align-items:center; gap:5px; height:30px;
  border:1px solid var(--line); border-radius:999px; background:var(--card);
  color:var(--ink); font:inherit; font-size:var(--fs-2xs); font-weight:700;
  padding:0 11px; cursor:pointer; }
.sv-bd-rk:hover{ color:var(--flaeche-akzent, var(--brand));
  border-color:var(--flaeche-akzent, var(--brand)); }
.sv-bd-rk svg{ width:13px; height:13px; flex:none; }
.sv-bd-rsave{ display:inline-flex; align-items:center; justify-content:center;
  width:32px; height:32px; flex:none; border:0; border-radius:9px;
  background:var(--flaeche-akzent, var(--brand)); color:var(--card);
  cursor:pointer; }
.sv-bd-rsave:hover{ filter:brightness(1.06); }
.sv-bd-rsave svg{ width:16px; height:16px; }
/* Dasselbe im Zeitraster - er wurde ausdruecklich mitgenannt. */
.sv-bd-raster{ background:var(--card);
  padding:6px 12px; }
.sv-bd-raster:empty{ display:none; }
.sv-bd-rz{ display:flex; align-items:center; gap:9px; padding:6px 0;
  border-bottom:1px solid var(--line); }
.sv-bd-rz:last-child{ border-bottom:none; }
.sv-bd-rz.pause{ opacity:.72; }
.sv-bd-nr{ flex:0 0 74px; font-size:var(--fs-xs); color:var(--muted); }
.sv-bd-bis{ color:var(--muted); }
.sv-bd-rz input{ border:1px solid var(--line); border-radius:var(--r-control);
  background:var(--card); color:var(--ink); font:inherit; font-size:var(--fs-xs);
  padding:6px 8px; }
.sv-bd-rknoepfe{ display:flex; align-items:center; gap:12px; flex-wrap:wrap; margin-top:12px; }
.sv-bd-rknoepfe .ss-lnk{ border:1px solid var(--line); border-radius:var(--r-control);
  background:var(--card); color:var(--brand); font:inherit; font-size:var(--fs-xs);
  padding:7px 11px; cursor:pointer; }
.sv-bd-rknoepfe .ss-lnk:hover{ background:var(--brand-soft); border-color:var(--brand); }
@media (max-width:640px){
  .sv-bd-fach{ min-width:110px; }
  /* Ohne Kasten braucht es auch kein 2x2-Gitter mehr: die Reiter laufen
     waagerecht und scrollen, wenn sie nicht passen. Vier Knoepfe in zwei
     Reihen sahen aus wie vier Kacheln, nicht wie eine Lage. */
  .sv-jahrleiste .sv-bd-schalter{ width:100%; justify-content:flex-start; }
  .sv-jahrleiste .sv-bd-schalter button{ padding:8px 11px; }
  .sv-bd-rz{ position:relative; display:grid;
    grid-template-columns:54px minmax(0,1fr) 10px minmax(0,1fr);
    gap:5px; padding:6px 30px 6px 0; }
  .sv-bd-nr{ min-width:0; }
  .sv-bd-rz input{ width:100%; min-width:0; box-sizing:border-box; padding:6px 4px; }
  .sv-bd-rz .sv-kl-weg{ position:absolute; right:0; top:50%; transform:translateY(-50%); }
}

/* Lehrkräfte als Liste einladen (v2.623.2). Vier Spalten am Rechner,
   untereinander am Telefon - dieselbe Regel wie überall: beides steht im
   HTML, das CSS zeigt eine Form. */
/* Seit v2.858.0: Name | Kürzel | E-Mail (freiwillig) – die Reihenfolge der
   Wichtigkeit. Nur der Name ist Pflicht (Zugangskarte). */
.sv-ein-modal{ max-width:680px; }
.sv-ein-titel{ flex:1; min-width:0; }
.sv-ein-unter{ font-size:12.5px; color:var(--muted); margin-top:2px; line-height:1.45; }
.sv-ein-plusreihe{ margin:8px 0 0; display:flex; flex-wrap:wrap; gap:6px 18px; }
.sv-ein-ohne{ margin-top:12px; }
.sv-ein-kopf,.sv-ein-zeile{ display:grid; grid-template-columns:1.5fr 84px 1.7fr 34px;
  gap:8px; align-items:center; }
.sv-ein-kopf i{ font-style:normal; opacity:.75; }
.sv-ein-kz{ text-transform:uppercase; }
.sv-ein-kz::placeholder{ text-transform:none; }
.sv-ein-kopf{ font-size:var(--fs-xs); color:var(--muted); margin-bottom:4px; }
.sv-ein-zeile{ margin-bottom:6px; }
.sv-ein-zeile input{ width:100%; min-width:0; border:1px solid var(--line);
  border-radius:var(--r-control); background:var(--card); color:var(--ink);
  font:inherit; font-size:var(--fs-xs); padding:7px 9px; }
.sv-ein-erg{ border:1px solid var(--line); border-radius:12px; overflow:hidden; }
.sv-ein-ergz{ display:grid; grid-template-columns:1.2fr 1.6fr auto; gap:10px;
  align-items:center; padding:8px 12px; border-bottom:1px solid var(--line); }
.sv-ein-ergz:last-child{ border-bottom:none; }
.sv-ein-mail{ font-size:var(--fs-xs); color:var(--muted); overflow:hidden;
  text-overflow:ellipsis; }
.sv-ein-ergz code{ font-size:15px; letter-spacing:.06em; }
@media (max-width:640px){
  .sv-ein-kopf{ display:none; }
  .sv-ein-zeile{ grid-template-columns:84px 1fr 34px; grid-auto-rows:auto; }
  .sv-ein-zeile input:nth-child(1){ grid-column:1 / 3; }
  .sv-ein-zeile input:nth-child(2){ grid-column:1 / 2; grid-row:2; }
  .sv-ein-zeile input:nth-child(3){ grid-column:2 / 3; grid-row:2; }
  .sv-ein-zeile > :nth-child(4){ grid-column:3; grid-row:1; }
  .sv-ein-ergz{ grid-template-columns:1fr auto; }
}

/* CSV-Vorschau im Einladen-Fenster (v2.860.0, static/js/lehrkraft-csv.js).
   Der Status als Pille: grün = bereit, blau = schon eingeladen (der Server
   gibt den vorhandenen Code zurück), gelb = wird übersprungen. Die Tabelle
   rollt in sich - 120 Zeilen dürfen das Fenster nicht sprengen, und am
   Telefon rollt sie auch waagerecht. */
.sv-csv-kopf{ display:flex; align-items:center; justify-content:space-between; gap:6px 12px;
  flex-wrap:wrap; font-size:var(--fs-xs); color:var(--muted); margin:0 0 6px; }
.sv-csv-kopf b{ color:var(--ink); }
.sv-csv-ign{ font-size:var(--fs-xs); color:var(--muted); margin:0 0 6px; }
.sv-csv-rahmen{ max-height:min(52vh, 460px); overflow:auto; border:1px solid var(--line);
  border-radius:12px; }
.sv-csv-tab{ width:100%; border-collapse:collapse; font-size:var(--fs-xs); }
.sv-csv-tab th{ position:sticky; top:0; z-index:1; background:var(--paper); color:var(--muted);
  font-weight:700; text-align:left; padding:7px 9px; border-bottom:1px solid var(--line); }
.sv-csv-tab td{ padding:6px 9px; border-bottom:1px solid var(--line); color:var(--ink);
  overflow-wrap:anywhere; vertical-align:top; }
.sv-csv-tab tr:last-child td{ border-bottom:none; }
.sv-csv-tab td:first-child{ color:var(--muted); font-variant-numeric:tabular-nums; }
.sv-csv-st{ display:inline-block; border-radius:99px; padding:2px 8px; font-weight:700;
  line-height:1.35; background:var(--paper); color:var(--muted); }
.sv-csv-ok .sv-csv-st{ background:var(--ok-soft); color:var(--ok-ink); }
.sv-csv-info .sv-csv-st{ background:var(--brand-soft); color:var(--brand); }
.sv-csv-raus td{ color:var(--muted); }
.sv-csv-raus .sv-csv-st{ background:var(--amber-soft); color:var(--amber-ink); }
@media (max-width:640px){
  .sv-csv-tab{ min-width:520px; }
}

/* Klassen ins nächste Jahr übertragen: eine Zeile je Klasse mit ihrem Ziel. */
.sv-ku-zeile{ display:flex; align-items:center; gap:10px; padding:7px 0;
  border-bottom:1px solid var(--line); }
.sv-ku-zeile:last-child{ border-bottom:none; }
.sv-ku-zeile>b{ flex:0 0 74px; }
.sv-ku-pfeil{ color:var(--muted); flex:none; }
.sv-ku-zeile select{ flex:1; min-width:0; border:1px solid var(--line);
  border-radius:var(--r-control); background:var(--card); color:var(--ink);
  font:inherit; font-size:var(--fs-xs); padding:6px 9px; }

/* DAS KLASSEN-FENSTER: Jahrgang, Zug und Vorschau NEBENEINANDER, darunter
   die Klassenleitungen als Liste (Ansage Murat 03.09.2026). Alles aus dem
   Wörterbuch - keine festen Farben (DESIGN_SYSTEM.md). */
.sv-kl-reihe{ display:flex; gap:10px; align-items:flex-end; flex-wrap:wrap; }
.sv-kl-feld{ display:flex; flex-direction:column; gap:4px; flex:1 1 110px; min-width:0; }
.sv-kl-feld>span{ font-size:var(--fs-xs); color:var(--muted); }
.sv-kl-feld select{ width:100%; border:1px solid var(--line); border-radius:var(--r-control);
  background:var(--card); color:var(--ink); font:inherit; padding:8px 10px; }
.sv-kl-vorschau{ background:var(--paper); border:1px solid var(--line);
  border-radius:var(--r-control); padding:6px 12px; flex:0 1 auto; }
.sv-kl-vorschau b{ font-size:16px; }
.sv-kl-leit{ margin-top:14px; }
.sv-kl-leit-t{ font-size:var(--fs-xs); color:var(--muted); }
.sv-kl-leitzeile{ display:flex; gap:8px; align-items:center; margin-top:6px; }
.sv-kl-leitzeile select{ flex:1; min-width:0; border:1px solid var(--line);
  border-radius:var(--r-control); background:var(--card); color:var(--ink);
  font:inherit; padding:8px 10px; }
.sv-kl-weg{ flex:none; width:34px; height:34px; border:1px solid var(--line);
  border-radius:var(--r-control); background:var(--card); color:var(--muted);
  font:inherit; cursor:pointer; }
.sv-kl-weg:hover{ color:var(--ink); border-color:var(--muted); }
/* Auf dem Telefon untereinander - drei Auswahlen nebeneinander sind dort
   drei Daumenbreiten, und die Vorschau fällt aus dem Fenster. */
@media (max-width:640px){
  .sv-kl-reihe{ flex-direction:column; align-items:stretch; }
  .sv-kl-vorschau{ flex:1 1 auto; }
}

/* DIE JAHRESWAHL DER SCHULVERWALTUNG (P0 des Stundenplans).
   Sie steht ueber der Tabelle, weil sie fuer alles darunter gilt. Nur
   Bausteine aus dem Woerterbuch - keine festen Farben (DESIGN_SYSTEM.md);
   das <select> erbt ohnehin die Regel von `.dtab-kopf select` darunter. */
.sv-jahrleiste{ display:flex; align-items:center; gap:10px; flex-wrap:wrap; }
.sv-jahrnote{ font-size:var(--fs-xs); color:var(--muted); line-height:1.5; }
.dtab-kopf select{ flex:none; max-width:190px; border:1px solid var(--line);
  border-radius:var(--r-control); background:var(--card); color:var(--ink);
  font:inherit; font-size:var(--fs-xs); padding:6px 9px; }
.dtab tbody tr{ background:transparent; }
.dtab tbody tr:nth-child(even){ background:color-mix(in srgb, var(--brand) 2.5%, var(--card)); }
.dtab tbody tr.klick{ cursor:pointer; }
.dtab tbody tr.klick:hover{ background:color-mix(in srgb, var(--brand) 7%, var(--card)); }
/* Erste Spalte bleibt beim seitlichen Schieben stehen - ohne sie weiss man
   nach zwei Spalten nicht mehr, WESSEN Zeile man liest. */
.dtab .haft{ position:sticky; left:0; z-index:1; background:inherit;
  box-shadow:1px 0 0 var(--hair); }
.dtab thead .haft{ background:color-mix(in srgb, var(--ink) 3%, var(--card)); z-index:3; }
.dtab-leer{ padding:var(--s-5) var(--s-4); text-align:center; color:var(--muted); }
/* DREI PLAETZE IM FUSS (v2.377.0): Zahl links, Blaettern MITTIG, Nebenwege
   rechts. Das Blaettern steht in der Mitte, weil man es dort sucht, wenn man
   am Ende der Liste angekommen ist - links und rechts stehen Angaben, die
   man liest, nicht drueckt. Die drei Spalten sind gleich breit (`1fr auto
   1fr` waere schief, sobald links mehr Text steht als rechts). */
.dtab-fuss{ display:grid; grid-template-columns:1fr auto 1fr; align-items:center;
  gap:var(--s-3); padding:var(--s-2) 0 0; border-top:1px solid var(--hair);
  background:transparent; font-size:var(--fs-xs); color:var(--muted); }
.dtab-fuss .dtab-stand{ justify-self:start; }
.dtab-fuss .dtab-blaettern{ justify-self:center; }
.dtab-fuss-r{ justify-self:end; display:flex; align-items:center; gap:var(--s-2);
  flex-wrap:wrap; justify-content:flex-end; min-width:0; }
@media (max-width:760px){
  .dtab-fuss{ grid-template-columns:1fr; justify-items:center; text-align:center; }
  .dtab-fuss .dtab-stand, .dtab-fuss .dtab-blaettern, .dtab-fuss-r{ justify-self:center; }
  .dtab-fuss-r{ justify-content:center; }
}
.dtab-fuss .dtab-zahl{ font-weight:700; color:var(--ink); }

/* EIN GESPERRTER FUSSKNOPF SAGT, DASS ER GESPERRT IST (v2.572.6).
   Gebraucht fuer die beiden Zeugnis-Knoepfe: sie stehen da, weil sie
   hingehoeren, sind aber bis zum sicheren Server abgeschaltet. Ohne diese
   Regel saehe ein `disabled`-Knopf genauso aus wie ein anklickbarer - der
   Unterschied waere nur, dass nichts passiert, und das ist der Zustand, den
   wir gerade abschaffen. Der Hinweis daneben traegt den Grund, weil es auf
   dem Handy kein Hover und damit keinen `title` gibt. */
.dtab-fuss-r .ss-lnk[disabled]{ color:var(--muted); cursor:default; opacity:.6; }
.dtab-fuss-r .ss-lnk[disabled]:hover{ text-decoration:none; }
.sv-noch-fertig{ font-size:var(--fs-xs); color:var(--muted); font-style:italic; }

/* DIE ZEUGNIS-FENSTER (v2.573.3).
   Beides sind Listen in einem Modal: die Hindernisse (eine Aufgabenliste,
   kein Fehlertext) und die Zeugnismatrix Kind x Fach.

   DIE MATRIX ROLLT IN SICH SELBST, nicht die Seite. Zwoelf Faecher passen auf
   keinem Handy nebeneinander; ohne `overflow-x` am Kasten schoebe die Tabelle
   das ganze Fenster auseinander. Die Kind-Spalte bleibt dabei stehen - sonst
   weiss beim Rollen niemand mehr, wessen Zeile er liest. */
.sv-hind{ margin:0 0 12px; padding:10px 12px; border-left:3px solid var(--amber-ink);
  background:var(--paper); border-radius:var(--r-control); }
.sv-hind ul{ margin:6px 0 0; padding-left:18px; font-size:var(--fs-xs); color:var(--muted); }
.sv-hind-mehr{ margin-top:4px; font-size:var(--fs-xs); color:var(--muted); font-style:italic; }
.sv-zstand{ font-size:var(--fs-xs); color:var(--muted); margin-bottom:10px; }
.sv-zklasse{ margin:14px 0 6px; }
.sv-zmatrix{ overflow-x:auto; border:1px solid var(--hair); border-radius:var(--r-control); }
.sv-zmatrix table{ border-collapse:collapse; width:100%; font-size:var(--fs-xs); }
.sv-zmatrix th, .sv-zmatrix td{ padding:6px 10px; border-bottom:1px solid var(--hair);
  text-align:center; white-space:nowrap; }
.sv-zmatrix th:first-child, .sv-zmatrix td:first-child{ text-align:left;
  position:sticky; left:0; background:var(--card); }
.sv-zmatrix thead th{ font-weight:700; color:var(--muted); }
@media (max-width:640px){
  .dtab th, .dtab td{ padding:var(--s-2); }
  /* HIER DARF SIE UMBRECHEN. Auf 360 px waeren vier Elemente in einer Zeile
     je 60 Pixel breit - das ist keine Bedienung mehr. Die Ansage „nicht
     umbrechen" galt dem Computer, wo der Platz da ist. */
  .dtab-kopf{ flex-wrap:wrap; }
  .dtab-kopf .dtab-such{ flex:1 1 100%; order:5; }
}

/* ===== FEHLZEITEN-RASTER (v2.375.0, docs/PLAN_FEHLZEITEN.md §5.1) =========
   Ein Monat, eine Klasse, ein Blick. Die Namensspalte bleibt beim
   Seitwaertsschieben stehen (`position:sticky`), der Rest scrollt in seiner
   eigenen Spur - die SEITE scrollt nie waagerecht (CLAUDE.md, „schmal aendern
   heisst SCHMAL aendern").

   DIE ZELLEN SIND ABSICHTLICH KLEIN. Ein Monat hat bis zu 23 Schultage; mit
   Zellen in Knopfgroesse passte keine Woche auf einen Laptop. 26 Pixel sind
   die Breite, bei der 23 Spalten plus Namen auf 1024 px gehen und ein
   Fingertipp trotzdem trifft (die Zeile ist 30 px hoch).

   DIE FARBEN SIND BEDEUTUNGSFARBEN, KEINE THEMENFARBEN: entschuldigt liegt
   auf dem ruhigen Bernstein, unentschuldigt auf Rot. Deshalb steht hier
   NICHT `--flaeche-akzent` - eine gruene Wunschfarbe wuerde „unentschuldigt"
   beruhigen (dieselbe Ueberlegung wie bei `.btn.ok`, siehe Akzent-Abschnitt).
   ========================================================================= */
/* DIE BREITE FOLGT DEM INHALT (v2.377.0, Befund Murat 23.08.2026: „popupin
   saginda bos yer var, oraya dogru düzgünce yaymalisin"). Ein Monat hat
   hoechstens 23 Schultage; bei fester Breite von 1180 px stand rechts ein
   Drittel leer. `width:max-content` laesst das Fenster genau so breit werden
   wie die Tabelle, gedeckelt auf 96 vw. */
.fz-modal{ width:max-content; max-width:min(1180px, 96vw); min-width:min(680px, 96vw); }
/* ALLE BEDIENELEMENTE DIESER ZEILE SIND GLEICH HOCH (v2.380.0, Anweisung
   Murat 23.08.2026: „tüm bu satirdaki butonlarin yükseklik boyutu ayni
   olmali"). Vorher standen sie auf 21, 31, 20 und 32 Pixeln, weil jedes
   Bauteil seine eigene Polsterung mitbrachte - nebeneinander sieht das aus
   wie ein Fehler, und es IST einer. Dieselbe Zahl wie in den
   Tabellen-Kopfzeilen (`--dtab-h`), damit die ganze App EINE Knopfhoehe hat. */
.fz-leiste{ --dtab-h:34px;
  display:flex; align-items:center; gap:var(--s-2); flex-wrap:wrap;
  padding-bottom:var(--s-2); border-bottom:1px solid var(--hair);
  margin-bottom:var(--s-2); position:relative; }
.fz-leiste > .ss-lnk, .fz-leiste > .fz-monatknopf,
.fz-leiste > .dtab-aktion, .fz-leiste .dtab-ausgabe{
  height:var(--dtab-h); box-sizing:border-box; padding-top:0; padding-bottom:0;
  display:inline-flex; align-items:center; }
/* PFEILE UND „HEUTE" TRAGEN DIE THEMENFARBE (v2.381.0, Befund Murat
   23.08.2026: „ok tuslari ve heute neden gri oldu ... thema rengi olsun").
   Beim Angleichen der Hoehen hatte ich ihnen einen neutralen Rahmen gegeben -
   damit sahen sie aus wie abgeschaltet. Es sind Handgriffe, keine Auskunft:
   Schrift und Rahmen kommen aus der gewaehlten Flaechenfarbe, die Flaeche
   bleibt hell, damit sie den Hauptknopf daneben nicht ueberstimmen. */
.fz-leiste > .ss-lnk{ padding-left:12px; padding-right:12px;
  border:1px solid color-mix(in srgb, var(--flaeche-akzent, var(--brand)) 28%, transparent);
  border-radius:var(--r-control); font-weight:700;
  color:var(--flaeche-akzent-ink, var(--brand));
  background:color-mix(in srgb, var(--flaeche-akzent, var(--brand)) 7%, transparent); }
.fz-leiste > .ss-lnk:hover{
  border-color:var(--flaeche-akzent, var(--brand));
  background:color-mix(in srgb, var(--flaeche-akzent, var(--brand)) 15%, transparent); }
/* Der Monatsknopf bleibt tintenfarben: „August 2026" ist die UEBERSCHRIFT
   der Tabelle, kein Bedienelement neben den anderen. Faerbte man ihn wie die
   Pfeile, konkurrierten drei farbige Dinge in einer Zeile um dieselbe
   Aufmerksamkeit. Dass man ihn druecken kann, sagt das Winkelzeichen. */
.fz-scroll{ overflow-x:auto; -webkit-overflow-scrolling:touch; }
.fz-tab{ border-collapse:separate; border-spacing:0; font-size:var(--fs-2xs); }
.fz-tab th, .fz-tab td{ padding:0; text-align:center; vertical-align:middle;
  border-bottom:1px solid var(--hair); border-right:1px solid var(--hair);
  height:30px; }
.fz-tab thead th{ background:color-mix(in srgb, var(--ink) 3%, transparent);
  color:var(--muted); font-weight:700; line-height:1.1; }
.fz-tab .fz-nm{ position:sticky; left:0; z-index:2; background:var(--card);
  min-width:150px; max-width:180px; text-align:left; padding:0 var(--s-2);
  font-size:var(--fs-xs); font-weight:600; white-space:nowrap;
  overflow:hidden; text-overflow:ellipsis; box-shadow:1px 0 0 var(--line); }
.fz-tab thead .fz-nm{ background:color-mix(in srgb, var(--ink) 3%, var(--card)); z-index:3; }
.fz-tab .fz-t{ width:26px; min-width:26px; }
.fz-wt{ display:block; font-size:9px; opacity:.65; }
.fz-tab .fz-t.fz-heute{ color:var(--brand); box-shadow:inset 0 -2px 0 var(--brand); }
.fz-tab .fz-s{ width:34px; min-width:34px; font-weight:800; color:var(--ink);
  background:color-mix(in srgb, var(--ink) 2%, transparent); }
.fz-tab .fz-s.fz-ue{ color:var(--bad-ink); }
/* Die klickbare Zelle. `user-select:none` ist Pflicht: ohne sie markiert das
   Ziehen Text statt Tage, und der Browser zeigt einen blauen Balken quer
   ueber die halbe Tabelle. */
.fz-z{ cursor:pointer; user-select:none; -webkit-user-select:none;
  font-weight:800; font-size:10px; color:var(--muted);
  /* AUF DEM TABLET (v2.417.0): iPadOS blendet beim langen Druck Lupe und
     Auswahlmenue ein - mitten im Eintragen. `-webkit-touch-callout` schaltet
     das ab, `touch-action:manipulation` nimmt zusaetzlich die 300-ms-Pause
     fuers Doppeltippen, sodass zwei schnelle Tippen auch zwei Eintraege
     sind und nicht ein Zoom. */
  -webkit-touch-callout:none; touch-action:manipulation; }
/* DER TIPP-MODUS (v2.417.0). Zwei Knoepfe in der Leiste sagen, was ein
   Tippen setzt - auf dem Tablet der einzige Weg zu "unentschuldigt", am
   Computer eine Ergaenzung zum Rechtsklick. Das Segment ist das vorhandene
   `.seg`-Bauteil; hier stehen nur Groesse und die beiden Bedeutungsfarben,
   damit man am Knopf SIEHT, was gleich passiert. */
/* Der leise Zusatz an einer Beschriftung ("(ein Escape-Room dauert eine
   Unterrichtsstunde)"). Er stand zweimal als Inline-Stil im HTML - genau
   das, was der Waechter in qa/unit/test_design_system.py verhindern soll:
   eine Datei, die sich eine eigene kleine Farbwelt aufmacht. */
.ls-lbl-note{ font-weight:400; color:var(--muted); }
/* Eine Bestellung, die sich nicht fuellen laesst (nur Wahr/Falsch): der
   Hinweis wird zur Warnung, bevor die Erzeugung Kontingent kostet. */
.ls-lbl-note.ls-warn{ color:var(--bad-ink); font-weight:600; }

/* ===== DIKTIEREN STATT TIPPEN (v2.418.0) =============================
   Der Knopf sitzt IM Eingabefeld, unten rechts: dort ist die Hand ohnehin,
   und er nimmt dem Text keinen Platz weg. Waehrend der Aufnahme wird er rot
   und pulsiert - das ist die einzige Stelle, an der eine Farbe hier
   Bedeutung traegt (es laeuft ein Mikrofon mit).
   Die Begruendung des Hinweistextes steht bei ssDiktat() in index-app.js. */
/* KEIN KASTEN (Anweisung Murat 24.08.2026: "o cerceveyi istemiyorum").
   Der Knopf ist ein blankes Zeichen in der Werkzeugleiste - dieselbe
   Bauform wie die Bueroklammer daneben, nur ohne eigene Flaeche. Erst beim
   Zeigen bekommt er einen leisen Untergrund, und waehrend der Aufnahme wird
   das Zeichen selbst rot. Das Icon ist das Lucide-Zeichen "mic"
   (DESIGN_SYSTEM.md §6.2), nicht von Hand gezeichnet. */
.ss-mic{ width:40px; height:40px; flex:none; border:0; background:transparent;
  border-radius:11px; display:flex; align-items:center; justify-content:center;
  color:var(--sub,#475569); cursor:pointer;
  transition:background .15s, color .15s; }
.ss-mic:hover{ background:var(--brand-soft); color:var(--brand); }
.ss-mic.on{ background:transparent; color:var(--bad);
  animation:ss-mic-puls 1.1s ease-in-out infinite; }
@keyframes ss-mic-puls{ 0%,100%{ opacity:1; } 50%{ opacity:.55; } }
@media (prefers-reduced-motion: reduce){ .ss-mic.on{ animation:none; } }
/* In der Eingabekapsel (v2.925.0) rund wie Plus und Senden daneben - die
   Form folgt der Kapsel, der Kasten bleibt weg. */
#screen-upload .leiste .ss-mic{ border-radius:50%; }
#screen-upload .leiste .ss-mic:hover{ background:var(--kapsel-ton-soft, var(--brand-soft));
  color:var(--kapsel-ton-ink, var(--brand)); }
@media(max-width:640px){ #screen-upload .leiste .ss-mic{ width:32px; height:32px; } }
/* Der Satz erscheint erst, wenn das Mikrofon laeuft - vorher waere er eine
   Warnung vor etwas, das gar nicht passiert. */
.ss-mic-hinweis{ display:flex; align-items:flex-start; gap:6px; margin-top:6px;
  padding:7px 9px; border-radius:9px; background:var(--amber-soft);
  font-size:11.5px; line-height:1.4; color:var(--ink); }
.ss-mic-hinweis svg{ flex:none; margin-top:1px; }
.fz-modus-lbl{ font-size:11px; font-weight:700; color:var(--muted);
  margin-left:6px; white-space:nowrap; }
.seg.fz-modus{ flex:none; }
.seg.fz-modus button{ font-size:11.5px; padding:0 10px; height:var(--dtab-h,34px);
  white-space:nowrap; }
.seg.fz-modus button[data-m="e"].on{ background:var(--amber-soft); color:var(--ink); }
.seg.fz-modus button[data-m="ue"].on{ background:var(--bad-soft); color:var(--ink); }
/* Schmal wird aus "E · entschuldigt" ein "E": auf 640px braucht die Leiste
   den Platz fuer Monat und Ausgeben. Der `title` bleibt und sagt es weiter. */
@media (max-width:760px){
  .fz-modus-lbl{ display:none; }
  .fz-mlang{ display:none; }
  .seg.fz-modus button{ padding:0 13px; font-size:12.5px; font-weight:800; }
}
/* DAS FADENKREUZ. Sehr hell in der gewaehlten Flaechenfarbe: es soll die
   Zeile und die Spalte FINDBAR machen, nicht die Eintraege ueberdecken -
   deshalb 12 %, und die Zelle unter dem Zeiger selbst etwas kraeftiger.
   `--flaeche-akzent` steht hier bewusst NICHT im Widerspruch zum
   Akzent-Abschnitt: das ist keine Bedeutungsfarbe, sondern reine Orientierung
   (dieselbe Rolle wie das Zebra in den Listen). */
.fz-kreuz-z{ background:color-mix(in srgb, var(--flaeche-akzent, var(--brand)) 8%, transparent); }
.fz-kreuz-s{ background:color-mix(in srgb, var(--flaeche-akzent, var(--brand)) 8%, transparent); }
.fz-kreuz-z.fz-kreuz-s{ background:color-mix(in srgb, var(--flaeche-akzent, var(--brand)) 18%, transparent); }
/* Gesetzte Zellen behalten ihre Bedeutungsfarbe - sonst verschwaende das
   Fadenkreuz genau die Auskunft, die man sucht. */
.fz-z.fz-e.fz-kreuz-z, .fz-z.fz-e.fz-kreuz-s{ background:var(--amber-soft); }
.fz-z.fz-ue.fz-kreuz-z, .fz-z.fz-ue.fz-kreuz-s{ background:var(--bad-soft); }
.fz-z:hover{ background:color-mix(in srgb, var(--ink) 10%, transparent); }
/* Der Name fuehrt zum Brief, wenn es unentschuldigte Tage gibt. Er sieht aus
   wie Text und verhaelt sich wie ein Link - ein Knopf in jeder Zeile waere
   eine Spalte mehr auf einem ohnehin engen Bildschirm. */
.fz-brief{ border:0; background:none; padding:0; font:inherit; font-weight:600;
  color:var(--flaeche-akzent, var(--brand)); cursor:pointer; text-align:left;
  max-width:100%; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.fz-brief:hover{ text-decoration:underline; }
.fz-z.fz-e{ background:var(--amber-soft); color:var(--amber-ink); }
.fz-z.fz-ue{ background:var(--bad-soft); color:var(--bad-ink); }
/* Aus einer Datei importierte STUNDEN sind bewusst nicht anklickbar - sie
   sagen mehr aus als „war den ganzen Tag weg", und ein Klick wuerde die
   feinere Angabe durch die groebere ersetzen. */
.fz-std{ background:var(--paper); color:var(--muted); font-weight:700; font-size:10px; cursor:help; }
.fz-fuss{ display:flex; align-items:center; gap:var(--s-3); flex-wrap:wrap;
  padding-top:var(--s-2); margin-top:var(--s-2); border-top:1px solid var(--hair);
  font-size:var(--fs-xs); color:var(--muted); }
.fz-stand{ font-size:var(--fs-2xs); color:var(--muted); }
@media (max-width:640px){
  .fz-modal{ max-width:100vw; width:100vw; }
  .fz-tab .fz-nm{ min-width:104px; max-width:104px; font-size:var(--fs-2xs); }
  .fz-tab .fz-t{ width:24px; min-width:24px; }
}
/* Die Zahl aus dem Raster ueber dem Briefformular (F4). Bernstein wie die
   Zellen des Rasters, damit man sieht, dass es dieselbe Angabe ist. */
.fz-briefzahl{ background:var(--amber-soft); border:1px solid var(--amber-line, var(--amber));
  border-radius:11px; padding:9px 12px; margin:0 0 12px;
  font-size:var(--fs-xs); color:var(--amber-ink); line-height:1.5; }
.fz-briefzahl span{ color:var(--muted); font-size:var(--fs-2xs); }

/* ===== SCHULVERWALTUNG: KLASSEN, SCHULJAHR, TITELZUSATZ (v2.376.0) ========
   Der Zusatz „Administration" neben dem Schulnamen. Er steht leiser daneben,
   weil er die Zweitangabe ist: der Name sagt WELCHE Schule, der Zusatz WO man
   in ihr ist (dieselbe Schule hat eine öffentliche Seite und diesen Bereich).

   ⛔ SEIT v2.640.0 WIRD ER NICHT MEHR GESETZT – an seiner Stelle steht die
   Krone (.at-krone). Die Regel bleibt, weil andere Seiten `.at-title-zusatz`
   weiter benutzen dürfen; sie wieder für „Administration" zu verwenden wäre
   dagegen ein Rückschritt: das Wort stand bei jedem, die Krone nur beim
   Schul-Admin. */
.at-title-zusatz{ margin-left:10px; font-size:.62em; font-weight:700;
  color:var(--muted); letter-spacing:.04em; text-transform:uppercase;
  vertical-align:middle; white-space:nowrap; }

/* ===== DIE KRONE UND DAS AKTIVE SCHULJAHR IM TITEL (v2.640.0) =============
   Ansage Murat 04.09.2026: „administration yerine profildeki kronen koy …
   aktiv jahr olarakta her zaman emma ve kronen altindaki kisimda görünsün.
   kücük olsun ama kirmizi görünsün."

   ROT IST HIER KEINE WARNUNG, SONDERN EINE ZUSTÄNDIGKEIT. Das Jahr stellt
   ALLES darunter um – Klassen, Verteilung, Stundentafel. Wer im Vorjahr
   nachschlägt und das nicht sieht, trägt dort etwas ein. Deshalb die einzige
   auffällige Farbe auf diesem Bildschirm; alles andere bleibt ruhig. */
/* ⛔ DIESELBEN WERTE WIE `.av-school-krone svg` (Zeile ~3263) – es ist
   dieselbe Krone an einer zweiten Stelle, nicht eine zweite Krone. Gefüllt
   in `--krone`, Rand in `--krone-rand`: so sieht sie am Profil aus, und
   Murats Ansage war „profildeki kronen koy". Wer die eine Farbe ändert,
   ändert beide. */
.at-krone{ display:inline-flex; flex:none; vertical-align:middle; }
.at-krone svg{ width:.62em; height:.62em; min-width:16px; min-height:16px;
  fill:var(--krone); stroke:var(--krone-rand); stroke-width:1.7;
  stroke-linejoin:round; stroke-linecap:round; }
/* Eigene Zeile unter dem Namen: `display:block` bricht die `nowrap`-Zeile des
   Titels um, ohne dass der Titel selbst zweizeilig wird.

   ⛔ UND DER TITEL GIBT SEIN `overflow:hidden` AB, solange ein Jahr darunter
   steht: das Menü des Chips hängt `position:absolute` darunter und würde
   sonst an der Kante des Titels abgeschnitten – ein Menü, das man aufklappen,
   aber nicht lesen kann. Gekürzt wird stattdessen der NAME (.at-name); er
   ist die Zeile, die lang werden kann. */
.at-title:has(.at-jahr){ overflow:visible; }
.at-kopf{ display:flex; align-items:center; gap:9px; min-width:0; }
/* KURZER SCHULNAME: das Jahr steht DANEBEN (v2.640.3). Bei einem langen
   Namen rutscht es darunter und mittig unter den Namen – dort ist Platz,
   den es neben „Erich-Kaestner-Gesamtschule" nicht gibt. */
.at-kopf-eng .at-jahr-neben{ margin-left:4px; }
.at-jahr-unten{ text-align:center; }
.at-name{ min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.at-jahr{ display:block; margin-top:1px; font-size:11.5px; font-weight:700;
  letter-spacing:0; line-height:1.1; }
.ss-jahrchip-wrap{ position:relative; display:inline-flex; }
.ss-jahrchip{ display:inline-flex; align-items:center; gap:4px;
  border:1px solid var(--bad); border-radius:999px;
  background:var(--bad-soft); color:var(--bad-ink);
  font:inherit; font-size:11.5px; font-weight:800; letter-spacing:.01em;
  padding:1px 8px; cursor:pointer; white-space:nowrap; }
.ss-jahrchip:hover{ filter:brightness(1.06); }
.ss-jahrchip .k-kurz{ display:none; }
/* ⛔ DIE KOPFZEILE MUSS ÜBER DEM INHALT LIEGEN, SOLANGE DAS MENÜ OFFEN IST.
   Befund Murat 04.09.2026 (Bildschirmfoto): das aufgeklappte Jahresmenü lag
   HINTER der Tabelle – „2025/2026" und die Zeile „Fach / Mathematik" standen
   übereinander. Ursache: `.app-topbar` hat keinen eigenen Stapelkontext, und
   `.dtab thead th` steht auf `position:relative`; bei gleichem z-index
   gewinnt, was später im DOM kommt – die Tabelle. Ein `z-index` am Menü
   allein half deshalb nicht.
   Nur solange offen, damit die Kopfzeile sonst nichts überdeckt. */
.app-topbar:has(.ss-jahrmenu.an){ position:relative; z-index:70; }
.ss-jahrmenu{ display:none; position:absolute; top:calc(100% + 5px); left:0; z-index:60;
  min-width:170px; background:var(--card); border:1px solid var(--line);
  border-radius:12px; box-shadow:0 12px 34px rgba(27,34,48,.18); padding:5px;
  max-height:60vh; overflow:auto; }
.ss-jahrmenu.an{ display:block; }
.ss-jahrmenu button{ display:block; width:100%; text-align:left; border:none;
  background:transparent; color:var(--ink); font:inherit; font-size:13px; font-weight:650;
  padding:7px 10px; border-radius:8px; cursor:pointer; white-space:nowrap; }
.ss-jahrmenu button:hover{ background:var(--paper); }
.ss-jahrmenu button.an{ color:var(--bad-ink); font-weight:850; }
.ss-jahrmenu-plus{ border-top:1px solid var(--hair) !important; margin-top:4px;
  color:var(--muted) !important; }

/* ===== DIE REITERLEISTE IN DER KOPFZEILE (v2.640.0) =======================
   Sie sitzt zwischen Titel und Profil und darf den beiden nichts wegnehmen:
   `min-width:0` plus `flex:1 1 auto` heißt „nimm den Rest, gib ihn wieder
   her". Am Telefon bleibt vom Ganzen das Auswahlfeld – die sieben Wörter
   passen dort nie nebeneinander, und ein Rollbalken ist kein Menü. */
#ss-tabs-host.ss-tabs-oben{ flex:1 1 auto; min-width:0; display:flex;
  align-items:center; justify-content:center; }
#ss-tabs-host.ss-tabs-oben .adm-tabs{ margin:0; width:auto; max-width:100%;
  flex:0 1 auto; padding:3px; overflow:hidden; }
#ss-tabs-host.ss-tabs-oben .adm-tab{ flex:0 1 auto; font-size:11.5px;
  padding:6px 11px; white-space:nowrap; }
#ss-tabs-host.ss-tabs-oben .ss-tabs-mob select{ margin:0; padding:8px 32px 8px 11px;
  font-size:13px; }
/* Der Titel gibt Platz frei, sobald die Leiste oben hängt – sonst schöbe er
   Postfach und Profil aus dem Bild (dieselbe Rechnung wie bei #kbx-tb). */
.app-topbar:has(#ss-tabs-host.ss-tabs-oben) .at-title{ flex:0 1 auto; min-width:0;
  font-size:clamp(15px,2.2vw,21px); }
/* ⛔ DAS AUSWAHLFELD BEGINNT HIER SCHON BEI 900px, NICHT ERST BEI 640px.
   In der Karte hatte die Leiste die volle Panelbreite; in der Kopfzeile teilt
   sie sich die Zeile mit Titel, Postfach und Profil-Kapsel. Gemessen: sechs
   Reiter brauchen rund 430px, und unter etwa 750px war „Schülerverzei…"
   abgeschnitten – nicht gekürzt, sondern aus dem Bild geschoben. Ein Reiter,
   den man nicht lesen kann, ist kein Reiter.
   Die 640er-Regel weiter oben gilt weiter für die Leiste IM Inhalt (falls sie
   dort einmal wieder hängt) – deshalb wird sie hier nicht geändert, sondern
   für diesen Ort überschrieben. */
@media (max-width:900px){
  #ss-tabs-host.ss-tabs-oben .adm-tabs.ss-tabs{ display:none; }
  #ss-tabs-host.ss-tabs-oben .ss-tabs-mob{ display:block; width:100%; }
  #ss-tabs-host.ss-tabs-oben{ flex:1 1 130px; min-width:110px; }
  .app-topbar:has(#ss-tabs-host.ss-tabs-oben) .at-title{
    flex:0 1 auto; font-size:clamp(13px,3.6vw,17px); }
}
@media (max-width:640px){
  /* „mübilde orasi acilir menü olur asla asagi kaymaz" – das Auswahlfeld
     bleibt IN der Kopfzeile, es rutscht nicht unter sie.

     ⛔ UND DAFÜR MUSS ETWAS WEICHEN. Auf 375px teilen sich fünf Dinge die
     Zeile: Menü-Knopf, Titel, Reiterwahl, Postfach, Profil-Kapsel. Gemessen
     blieben für die Reiterwahl rund 40px – ein Pfeil ohne Wort, also
     unbedienbar.

     WEICHEN MUSS DER SCHULNAME IN DER KAPSEL, NICHT DER IM TITEL. Er stand
     auf diesem Bildschirm ZWEIMAL: links im Titel und rechts in der Kapsel.
     Das ist keine Rücknahme von v2.414.0 („eskiden burda benim okulum okulum
     ismi dururdu o gitmis") – dort verschwand die Angabe ganz und übrig
     blieb ein Logo. Hier wandert sie nur nach links, zu Krone und Schuljahr,
     wo ohnehin steht, WO man ist. Das Logo in der Kapsel bleibt.

     ⛔ NUR AUF DIESEM BILDSCHIRM: die Regeln hängen alle an
     `:has(#ss-tabs-host.ss-tabs-oben)`. Auf jeder anderen Seite trägt die
     Kapsel ihren Namen weiter. */
  .app-topbar:has(#ss-tabs-host.ss-tabs-oben) .at-title{ flex:0 1 auto;
    min-width:64px; }
  .app-topbar:has(#ss-tabs-host.ss-tabs-oben) .at-name{ max-width:74px;
    font-size:14px; }
  .app-topbar:has(#ss-tabs-host.ss-tabs-oben) .at-kopf{ gap:5px; }
  .app-topbar:has(#ss-tabs-host.ss-tabs-oben) .av-school-name{ display:none; }
  #ss-tabs-host.ss-tabs-oben{ flex:1 1 120px; min-width:92px; }
  #ss-tabs-host.ss-tabs-oben .ss-tabs-mob select{ padding:8px 24px 8px 8px;
    font-size:12px; background-position:right 6px center; background-size:14px 14px; }
  .at-jahr{ font-size:10.5px; }
  /* Kurzform des Jahres: beide stehen im HTML, das CSS zeigt eine
     (Muster `.k-lang`/`.k-kurz`, CLAUDE.md „Die eiserne Regel"). */
  .ss-jahrchip{ padding:1px 6px; }
  .ss-jahrchip .k-lang{ display:none; }
  .ss-jahrchip .k-kurz{ display:inline; }
  .at-krone svg{ min-width:15px; min-height:15px; }
}

/* ===== FACH-ZEILE DER STUNDENTAFEL (v2.640.0) =============================
   Der Stift erscheint erst beim Zeigen. Zwanzig sichtbare Stifte wären
   lauter als die Zahlen, um die es in dieser Tabelle geht – auf dem Telefon
   (kein Zeigen möglich) steht er dagegen immer da, sonst wäre er dort
   unerreichbar. */
.sv-bd-fach{ display:flex; align-items:center; gap:5px; min-width:0; }
.sv-bd-fach > b, .sv-bd-fach > span{ overflow:hidden; text-overflow:ellipsis;
  white-space:nowrap; }
.sv-bd-fstift{ flex:none; border:none; background:transparent; color:var(--muted);
  cursor:pointer; padding:2px; line-height:0; border-radius:6px; opacity:0;
  transition:opacity .12s, color .12s; }
.sv-bd-fstift svg{ width:13px; height:13px; }
.dtab tr:hover .sv-bd-fstift, .sv-bd-fstift:focus-visible{ opacity:1; }
.sv-bd-fstift:hover{ color:var(--flaeche-akzent, var(--brand)); background:var(--paper); }
@media (hover:none){ .sv-bd-fstift{ opacity:.55; } }

/* „Schuljahr ändern" im Klassen-Fenster: ein Nebenweg neben dem Schließen-
   Kreuz, deshalb Umriss statt Fläche. */
.sv-kl-jahr{ flex:none; border:1px solid var(--line); border-radius:var(--r-control);
  background:var(--card); color:var(--ink); font:inherit; font-size:var(--fs-2xs);
  font-weight:700; padding:5px 10px; cursor:pointer; white-space:nowrap; }
.sv-kl-jahr:hover{ border-color:var(--flaeche-akzent, var(--brand));
  color:var(--flaeche-akzent, var(--brand)); }
/* Ein kurzes Aufleuchten der Vorschau: der Knopf ändert eine Auswahl weiter
   unten im Fenster, und ohne Rückmeldung sieht es aus, als sei nichts
   passiert. */
.sv-kl-vorschau b.frisch{ color:var(--flaeche-akzent, var(--brand)); }
/* Die beiden Fenster, die früher Reiter waren (Schulcodes, Klassen
   umbenennen): sie tragen eine Tabelle und brauchen deshalb mehr Breite als
   ein Formular-Fenster. */
.sv-modal.sv-modal-weit{ max-width:940px; width:calc(100vw - 40px); }

/* ===== STUNDENPLAN: SCHALTER MITTIG, STAND DARUNTER (v2.640.1) ===========
   „o menüyüde ortaya al" – der Abschnittsschalter gehört zur Reiterleiste
   darüber, die jetzt ebenfalls mittig steht. Links angeschlagen sah er aus
   wie ein Bedienelement der Tabelle darunter. */
.sv-bd-kopf{ display:flex; justify-content:center; margin:0 0 10px; }

/* Der Freischalt-Streifen ist am 06.09.2026 ERSATZLOS entfallen: er stand
   über vier Abschnitten und sagte auf jedem dasselbe. Den Zustand nennt der
   Wochenplan in seiner eigenen Zeile neben „Veröffentlichen" – dort, wo man
   ihn ändert. Wer ihn wieder einführen will, führe ihn an EINER Stelle ein.

   „+ Fach" im Spaltenkopf der gedrehten Stundentafel: dort steht sonst nur
   ein Wort, also muss der Knopf wie ein Wort aussehen und nicht wie eine
   Schaltfläche mit riesigem Pluszeichen. */
.sv-bd-fplus{ display:inline-flex; align-items:center; gap:4px;
  border:1px dashed var(--line); border-radius:var(--r-control);
  background:transparent; color:var(--brand); cursor:pointer;
  padding:3px 8px; font-size:var(--fs-2xs); font-weight:700;
  white-space:nowrap; }
.sv-bd-fplus svg{ width:13px; height:13px; flex:none; }
.sv-bd-fplus:hover{ background:var(--brand-soft); }

/* Die letzte Zeile einer Tabelle: der Weg zu einer neuen. Sie sieht aus wie
   eine Zeile und nicht wie ein Knopf über der Tabelle – man liest die Liste
   bis zum Ende und findet dort den einen Handgriff, der fehlt. Seit v2.675.0
   heißt sie `dtab-plus` und wird von `dtabRender` selbst gezeichnet
   (`opt.plusZeile`): Stundentafel UND Unterrichtsverteilung benutzen
   dieselbe, statt sie sich nach dem Zeichnen anzuhängen. */
.dtab-plus td{ padding:0 !important; background:var(--paper); }
.dtab-plus button{ display:flex; align-items:center; gap:7px; width:100%;
  border:0; background:transparent; color:var(--flaeche-akzent, var(--brand));
  font:inherit; font-size:var(--fs-xs); font-weight:700; cursor:pointer;
  padding:9px 12px; text-align:left; }
.dtab-plus button:hover{ background:color-mix(in srgb, var(--ink) 4%, transparent); }
.dtab-plus svg{ width:15px; height:15px; flex:none; }
#dtab-schulraeume .dtab-plus td{ background:transparent; }
.sv-raum-hinweis{ color:var(--muted); white-space:nowrap; }

/* ===== R-1: DIE RÄUME (v2.644.0) =========================================
   Die Art ist die Prüfregel, nicht die Zierde – deshalb trägt sie eine
   erkennbare Marke und nicht nur ein Wort. Drei Farben für drei Fragen:
   „wo ist die Klasse zu Hause", „welches Fach braucht diesen Raum", „wo
   liegen die Kurse einer Schiene". */
.sv-raumart{ display:inline-flex; align-items:center; font-size:var(--fs-2xs);
  font-weight:750; border-radius:999px; padding:2px 9px; white-space:nowrap;
  background:var(--paper); color:var(--muted); }
.sv-raumart.klassenraum{ background:var(--ok-soft); color:var(--ok-ink); }
.sv-raumart.fachraum{ background:var(--brand-soft); color:var(--kont-plan, var(--brand)); }
.sv-raumart.kursraum{ background:var(--amber-soft); color:var(--amber-ink); }
.sv-raumfach{ display:inline-block; font-size:var(--fs-2xs); font-weight:650;
  border:1px solid var(--line); border-radius:6px; padding:1px 6px; margin:1px 0; }
/* Die Fächerwahl im Raum-Fenster: Kästchen, die aussehen wie Marken. Ein
   <select multiple> wäre auf dem Tablet nicht bedienbar, und zwanzig
   Zeilen untereinander wären höher als der Bildschirm. */
.sv-raumfach-liste{ display:flex; flex-wrap:wrap; gap:6px; max-height:190px;
  overflow:auto; padding:2px; }
.sv-raumfach-wahl{ display:inline-flex; align-items:center; gap:6px; cursor:pointer;
  border:1px solid var(--line); border-radius:999px; padding:5px 11px;
  font-size:var(--fs-2xs); font-weight:650; color:var(--ink); background:var(--card); }
.sv-raumfach-wahl input{ width:auto; margin:0; accent-color:var(--flaeche-akzent, var(--brand)); }
.sv-raumfach-wahl.an{ border-color:var(--flaeche-akzent, var(--brand));
  color:var(--flaeche-akzent, var(--brand)); background:var(--brand-soft); }

/* ===== R-4: DAS RAUMRASTER (v2.645.0) ====================================
   Derselbe Plan, andere Achse: Raum × Stunde. „frei" steht ausdrücklich da –
   eine leere Zelle heißt „hier steht nichts", „frei" heißt „hier kann etwas
   hin", und das ist der Unterschied, um den es geht. */
.sv-p-ansicht{ display:flex; justify-content:center; margin:0 0 10px; }
.sv-r-gitter th.sv-r-rk{ text-align:left; min-width:150px; max-width:190px;
  position:sticky; left:0; z-index:2; background:var(--card);
  border-right:1px solid var(--line); padding:7px 10px; font-weight:700; }
.sv-r-rk b{ display:block; font-size:var(--fs-xs); }
.sv-r-rk i{ display:block; font-style:normal; font-size:var(--fs-2xs);
  color:var(--muted); margin-top:2px; overflow-wrap:anywhere; }
.sv-r-rk .sv-raumart{ margin-top:3px; }
/* „1. Stunde" ueber „08:20–09:05": die Nummer ist die Frage, die Spanne die
   Antwort. Bis v2.677.0 standen beide in einer Zeile und ergaben „1.08:20". */
.sv-r-gitter th.sv-r-sk{ color:var(--ink); font-weight:700; padding:5px 6px; }
.sv-r-gitter th.sv-r-sk span{ display:block; font-weight:600; font-size:9.5px;
  color:var(--muted); }
.sv-r-z{ vertical-align:top; padding:3px; min-width:96px; }
.sv-r-frei{ display:block; text-align:center; font-size:var(--fs-2xs);
  color:var(--muted); padding:8px 0; }
.sv-r-st{ display:block; border-radius:8px; padding:4px 7px; margin:1px 0;
  background:var(--brand-soft); color:var(--kont-plan, var(--brand));
  font-size:var(--fs-2xs); font-weight:700; line-height:1.3; }
.sv-r-st b{ display:block; font-weight:600; opacity:.85; }
/* Der Raum steht klein unter Klasse und Fach - in der Lehrkraftsicht ist er
   die zweite Frage nach „wann", in der Klassensicht die dritte nach „wer".
   Eigene Farbe bekommt er nicht: er erbt, nur leiser. */
.sv-r-st em{ display:block; font-style:normal; font-weight:600;
  opacity:.7; font-size:9.5px; }
/* Die Kursart im Klassenraster: 8A E und 8A G duerfen zur selben Zeit
   laufen (verschiedene Kinder) - dann stehen sie uebereinander in DERSELBEN
   Zeile, und ohne diesen Buchstaben waeren es zwei gleich aussehende
   Kaesten. */
/* ⛔ DIE WOCHE LAEUFT SENKRECHT (v2.673.0). Die Stammspalte traegt Tag und
   Stunde, die Klassen stehen quer. Ein neuer Tag bekommt eine kraeftigere
   Linie - sonst laeuft Freitag optisch in Montag hinein. */
/* ⛔ EIN BAND IST EINE ZEILE OHNE FELDER (v2.680.0). Die Lautlesezeit steht
   im Plan, weil man sie beim Aushängen sehen will - aber ohne Klassenspalten:
   dort gibt es nichts einzutragen, und eine Reihe leerer Felder wäre eine
   Einladung, es doch zu versuchen. */
/* Die Angebotsform steht in der Kopfzeile der Aufteilung, neben dem
   Bestaetigen - sie gehoert zur Aufteilung, nicht zu einem einzelnen Kurs. */
.svkg-form{ flex:none; }
.svkg-form select{ border:1px solid var(--line); border-radius:var(--r-control);
  background:var(--card); color:var(--ink); font:inherit; font-size:var(--fs-2xs);
  font-weight:700; padding:6px 8px; max-width:160px; }
.sv-p-band > td{ background:var(--paper); color:var(--muted);
  font-size:var(--fs-2xs); font-weight:700; letter-spacing:.02em;
  padding:4px 10px !important; text-align:left; }
.sv-p-band > .sv-p-stamm{ background:var(--paper); }
/* Im Zeitraster trägt die Pause ein Namensfeld – leer heißt Pause. */
.sv-bd-band{ border:1px solid var(--line); border-radius:7px; background:var(--card);
  color:var(--ink); font:inherit; font-size:var(--fs-2xs); font-weight:700;
  padding:5px 7px; min-width:0; }
.sv-p-klsp{ text-align:center; white-space:nowrap; }
.sv-p-gitter tr.sv-p-tagstart > *{ border-top:2px solid var(--line); }
.sv-p-gitter .sv-p-stamm b{ display:block; font-size:var(--fs-2xs); }
.sv-p-gitter .sv-p-stamm span{ display:block; color:var(--muted);
  font-size:9.5px; font-weight:600; }
/* Fach, Kuerzel, Raum - drei Zeilen, absteigend leiser. */
.sv-p-gitter td .sv-p-stapel button b{ display:block; font-weight:700; }
.sv-p-gitter td .sv-p-stapel button i{ display:block; font-style:normal;
  font-weight:700; opacity:.85; }
.sv-p-gitter td .sv-p-stapel button em{ display:block; font-style:normal;
  font-weight:600; opacity:.7; font-size:9px; line-height:1.15; }
/* „ohne Raum" ist eine Auskunft, kein Raumname – deshalb blasser und kursiv.
   Weglassen konnte man die Zeile nicht: dann sieht eine Stunde ohne Raum aus
   wie eine Ansicht ohne Räume (Befund Murat 06.09.2026). */
.sv-p-gitter td .sv-p-stapel button em.ohne{ opacity:.45; font-style:italic;
  font-weight:500; }
.sv-r-kurs{ font-style:normal; font-weight:800; margin-left:4px;
  border:1px solid currentColor; border-radius:4px; padding:0 3px; font-size:9.5px; }
/* Zwei verschiedene KLASSEN in einem Raum sind der harte Konflikt, den die
   Prüfung meldet – hier sieht man ihn, statt ihn nur zu lesen. */
.sv-r-z.streit{ background:var(--bad-soft); border-radius:8px; }
.sv-r-z.streit .sv-r-st{ background:var(--card); color:var(--bad-ink); }

/* Die Vorschläge im Anlegen-Fenster: ein Angebot, kein Auswahlfeld – ein
   <select> hätte „Türkisch als Herkunftssprache" unmöglich gemacht. */
.sv-fach-vor{ margin:0 0 14px; }
.sv-fach-vor > span{ display:block; font-size:var(--fs-2xs); color:var(--muted);
  margin-bottom:6px; }
.sv-fach-vor > div{ display:flex; flex-wrap:wrap; gap:6px; }
.sv-fach-vor button{ border:1px solid var(--line); border-radius:999px;
  background:var(--card); color:var(--ink); font:inherit; font-size:var(--fs-2xs);
  font-weight:650; padding:5px 11px; cursor:pointer; }
.sv-fach-vor button:hover{ border-color:var(--flaeche-akzent, var(--brand));
  color:var(--flaeche-akzent, var(--brand)); }

/* Die Nutzungssumme in der Übersicht. Kein eigener Kasten – der Bereich IST
   schon ein Panel (dieselbe Regel wie bei den Tabellen, v2.374.0). */
.ss-nutzung{ margin:0 0 var(--s-4); }
.ss-nutz-kopf{ display:flex; align-items:baseline; gap:var(--s-2); flex-wrap:wrap;
  font-weight:800; font-size:var(--fs-md); margin-bottom:var(--s-2); }
.ss-nutz-kopf span{ font-weight:600; font-size:var(--fs-2xs); color:var(--muted); }

/* Der Schuljahreswechsel als SEITE. Feste Spaltenbreiten, damit die Pfeile
   untereinander stehen – bei zwanzig Zeilen ist eine ausgefranste Mitte der
   Unterschied zwischen „prüfbar" und „irgendwie durchklicken". */
.svjahr-liste{ border-top:1px solid var(--hair); }
.svjahr-zeile{ display:flex; align-items:center; gap:var(--s-2);
  padding:7px 0; border-bottom:1px solid var(--hair); }
.svjahr-alt{ flex:0 0 92px; font-weight:800; font-size:var(--fs-xs); }
.svjahr-anz{ flex:0 0 76px; color:var(--muted); font-size:var(--fs-2xs); }
.svjahr-pfeil{ flex:none; color:var(--muted); }
.svjahr-neu{ flex:1; min-width:80px; box-sizing:border-box; height:34px;
  padding:0 10px; border:1px solid var(--line); border-radius:var(--r-control);
  background:var(--card); color:var(--ink); font:inherit; font-size:var(--fs-xs); }
.svjahr-neu:focus{ outline:2px solid var(--flaeche-akzent, var(--brand)); outline-offset:-1px; }
@media (max-width:640px){
  .svjahr-alt{ flex:0 0 60px; }
  .svjahr-anz{ display:none; }
}

/* Mehrfachauswahl in einer Verwaltungsliste (v2.377.0). Der Streifen erscheint
   erst, wenn etwas ausgewählt IST – ein leerer Balken über jeder Liste wäre
   eine Zeile Platz für nichts. */
/* ⛔ DAS FELD IST GROESSER ALS DAS KAESTCHEN (v2.640.3). Vorher traf man
   auf 38px Zellenbreite ein 15px-Kästchen – und daneben fing die ZEILE den
   Klick und öffnete das Kinderfenster. Das Label füllt die Zelle, damit
   „daneben" nicht mehr existiert; 44px Höhe ist die übliche Fingerfläche. */
.dtab-wahlfeld{ display:flex; align-items:center; justify-content:center;
  width:100%; min-height:32px; margin:-6px 0; cursor:pointer; }
.dtab-wahl{ width:17px; height:17px; cursor:pointer; accent-color:var(--flaeche-akzent, var(--brand)); }
.dtab-wahlleiste{ display:flex; align-items:center; gap:var(--s-2); flex-wrap:wrap;
  padding:var(--s-2) var(--s-2); margin-bottom:var(--s-2);
  border-radius:var(--r-control); font-size:var(--fs-xs);
  background:var(--flaeche-akzent-soft, var(--brand-soft));
  color:var(--flaeche-akzent-ink, var(--brand-dk)); }
.dtab-wahlleiste b{ font-weight:800; }

/* ===== HINWEIS UND RÜCKFRAGE (v2.380.0) ==================================
   `alert()` und `confirm()` sind Fenster des BROWSERS: sie tragen die Adresse
   der Seite als Überschrift, ignorieren jede Farbe und jeden Radius und
   stehen auf dem iPad mitten im Bild. In einer App, die sonst auf jeden Rand
   achtet, waren sie der eine Ort, der aussah wie 1998
   (Befund Murat 23.08.2026).

   Das Symbol trägt die Bedeutung, nicht der Text: bernstein = „schau hin",
   rot = „hier verschwindet etwas", grün = „hat geklappt", blau = Auskunft.
   Diese vier sind BEDEUTUNGSFARBEN und folgen deshalb nicht der
   Flächenfarbe (dieselbe Regel wie bei `.btn.ok`, siehe Akzent-Abschnitt). */
.ss-mb-k{ max-width:440px; padding:20px; }
.ss-mb-h{ display:flex; align-items:flex-start; gap:12px; margin-bottom:10px; }
.ss-mb-h b{ font-size:var(--fs-lg); line-height:1.35; padding-top:5px; }
.ss-mb-i{ flex:none; display:flex; align-items:center; justify-content:center;
  width:36px; height:36px; border-radius:11px; }
.ss-mb-i svg{ width:19px; height:19px; }
.ss-mb-info .ss-mb-i{ background:var(--brand-soft); color:var(--brand); }
.ss-mb-warn .ss-mb-i{ background:var(--amber-soft); color:var(--amber-ink); }
.ss-mb-bad  .ss-mb-i{ background:var(--bad-soft);   color:var(--bad-ink); }
.ss-mb-ok   .ss-mb-i{ background:var(--ok-soft);    color:var(--ok-ink); }
.ss-mb-t{ font-size:var(--fs-xs); color:var(--muted); line-height:1.6;
  margin:0 0 16px; max-height:52vh; overflow:auto; }
.ss-mb-t b{ color:var(--ink); }
.ss-mb-f{ display:flex; gap:9px; justify-content:flex-end; flex-wrap:wrap; }
.ss-mb-f .btn{ width:auto; margin:0; padding:10px 18px; font-size:var(--fs-xs); }
/* Der gefährliche Weg sieht gefährlich aus – hier zählt die Bedeutung, nicht
   die Wunschfarbe. */
.ss-mb-gefahr{ background:var(--bad) !important; }
.ss-mb-gefahr:hover{ background:var(--bad-ink) !important; }
/* Ein Knopf, der ein LINK ist (Tablet spiegeln: App-Link, Tafeladresse). */
.ss-mb-f a.btn{ text-decoration:none; }

/* TABLET SPIEGELN – die Codezeile im Fenster (index-app.js spiegelnZeigen):
   für eine Tafel ohne Anmeldung, die /spiegeln zeigt. */
.sp-code-zeile{ display:flex; flex-wrap:wrap; align-items:center; gap:var(--s-2);
  margin-top:var(--s-4); padding-top:var(--s-3); border-top:1px solid var(--line); }
.sp-code-zeile label{ font-size:var(--fs-sm); color:var(--sub); }
.sp-code-zeile input{ width:7.5em; font:inherit; font-size:var(--fs-md); letter-spacing:.1em;
  text-align:center; padding:var(--s-2); border:1px solid var(--line-kraeftig);
  border-radius:var(--r-control); background:var(--card); color:var(--ink); }
.sp-code-zeile .btn{ width:auto; margin:0; padding:8px 14px; font-size:var(--fs-xs); }
.sp-code-meldung{ margin-top:var(--s-2); font-size:var(--fs-sm); color:var(--sub); }

/* Freie Tage im Fehlzeiten-Raster: sichtbar, aber nicht anklickbar. Ohne sie
   sprangen die Spaltenköpfe (3, 4, 5, 6, 7, 10, 11) und man verzählte sich –
   mit ihnen ist die 12. Spalte auch der 12. */
.fz-t.fz-frei{ color:var(--muted); opacity:.55; }
.fz-z.fz-frei{ background:color-mix(in srgb, var(--ink) 4%, transparent);
  cursor:default; }
.fz-z.fz-frei:hover{ background:color-mix(in srgb, var(--ink) 4%, transparent); }

/* Der Monatswähler: Jahr mit zwei Pfeilen, darunter zwölf Monate. Kein
   `<input type="month">` – der sieht auf jedem Gerät anders aus und öffnet
   auf dem Mac gar nichts. */
.fz-monatknopf{ display:inline-flex; align-items:center; gap:6px; border:0;
  background:none; font:inherit; font-weight:800; font-size:var(--fs-md);
  color:var(--ink); cursor:pointer; padding:4px 8px; border-radius:var(--r-control);
  min-width:150px; justify-content:center; }
.fz-monatknopf:hover{ background:color-mix(in srgb, var(--ink) 5%, transparent); }
.fz-mwahl{ display:none; position:fixed; z-index:480;
  background:var(--card); border:1px solid var(--line); border-radius:14px;
  box-shadow:0 14px 38px rgba(27,34,48,.18); padding:10px; width:240px; }
.fz-mwahl.an{ display:block; }
.fz-mw-jahr{ display:flex; align-items:center; justify-content:space-between;
  margin-bottom:8px; }
.fz-mw-jahr b{ font-size:var(--fs-md); font-weight:800; }
.fz-mw-jahr button{ border:1px solid var(--line); background:var(--card);
  border-radius:9px; width:28px; height:28px; font:inherit; color:var(--ink);
  cursor:pointer; }
.fz-mw-jahr button:hover{ border-color:var(--flaeche-akzent, var(--brand)); }
.fz-mw-gitter{ display:grid; grid-template-columns:repeat(3, 1fr); gap:5px; }
.fz-mw-m{ border:1px solid transparent; background:var(--paper); border-radius:9px;
  padding:8px 0; font:inherit; font-size:var(--fs-xs); font-weight:650;
  color:var(--ink); cursor:pointer; }
.fz-mw-m:hover{ background:var(--flaeche-akzent-soft, var(--brand-soft)); }
.fz-mw-m.heute{ border-color:var(--flaeche-akzent, var(--brand)); }
.fz-mw-m.an{ background:var(--flaeche-akzent, var(--brand)); color:var(--on-brand); }

/* Die Datumsliste über dem Briefformular. */
.fz-briefzahl-t{ margin-top:6px; font-size:var(--fs-2xs); line-height:1.6; }
.fz-briefzahl-t.fz-leise{ color:var(--muted); }


/* ===========================================================================
   UNTERRICHTSBUCH / „SchlauHeft" – DAS PANO IM KALENDER
   (v2.421.0 – v2.423.2 als eigener Bildschirm, ab v2.426.0 im Kalender)
   ---------------------------------------------------------------------------
   KURSKORREKTUR 24.08.2026: Es gibt keinen Bildschirm „SchlauHeft" und keinen
   Bildschirm „Mein Stundenplan" mehr. Das Modul WOHNT im Kalender – links die
   Tagesspalte, rechts diese ein- und ausklappbare Spalte. Alles Weitere ist
   ein FENSTER darueber (Stundenplan, Reihe verteilen).

   ALLE FARBEN KOMMEN AUS DEM WOERTERBUCH (static/css/design-tokens.css).
   In diesem ganzen Abschnitt steht kein fester Hex-Wert; das prueft
   qa/unit/test_unterrichtsbuch_faz1.py / _faz2.py.
   ======================================================================== */

/* ---- Der Kalender bekommt eine zweite Spalte --------------------------- */
/* Die Breite steht in EINER Variablen, nicht in vier Regeln: Vollbild und
   Telefon ueberschreiben sie, statt jede Regel einzeln nachzuziehen. */
/* Der Kasten soll bis zur Unterkante reichen (Befund Murat 24.08.2026:
   „icerik alani en alta kadar gelmeli"). Dafuer muss die Kette
   Bildschirm -> Karte -> Split durchgehend eine Flex-Spalte sein, sonst
   bleibt unten Weiss stehen und der Kalender bekommt eine geratene Hoehe. */
#screen-kalender{ display:flex; flex-direction:column; min-height:0;
  /* Die Hoehe setzt kalSchirmHoehe() - hier steht nur, dass nichts
     ueberlaufen darf: gescrollt wird IN den beiden Spalten, nicht auf der
     Seite. Sonst wandert beim Scrollen die Kopfzeile mit. */
  overflow:hidden; }
#screen-kalender > .card{ display:flex; flex-direction:column; flex:1 1 auto;
  min-height:0; }
/* DAS HEFT REICHT VON DER KOPFZEILE BIS ZUR UNTERKANTE (v2.891.2, Ansage
   Murat 29.09.2026 mit Bild: „sayfa üst sınıra alt sınıra dayansın … tam
   dayamamışsın"). Oben und unten stand noch der Rand, den ALLE Bildschirme
   am Computer bekommen (--pl-oben 20 px, --pl-unten 36 px) - ueber und unter
   Tagesspalte und Heft je ein weisser Streifen. Der Kalender traegt ihn
   nicht mehr: die Karte sitzt direkt unter der Kopfzeile und reicht bis
   unten (die Hoehe setzt kalSchirmHoehe()). Die ID schlaegt die lange
   Allgemeinregel; ab 900 px wie sie - schmaler bleibt alles, wie es war. */
@media (min-width:900px){
  body.has-sidebar[data-screen="kalender"]:not(.lh-fullscreen) .wrap > section#screen-kalender{
    padding-top:0; padding-bottom:0; }
}
#screen-kalender .kal-split{ --kh-breite:460px; display:flex; align-items:stretch;
  gap:0; flex:1 1 auto; min-height:0; }
#screen-kalender .kal-links{ flex:1 1 auto; min-width:0; }

/* Der Trenner. Schmal, aber mit einer Greiffläche, die man auch am
   Touchscreen trifft - eine 1-px-Linie zum Ziehen findet niemand. */
/* DER TRENNER IST DIE SPIRALE DES HEFTS (v3.8.0, Ansage Murat 13.10.2026:
   „ortadaki yer defter teli oluyor ya, onun gibi bir izlenim verelim, oraya
   tutup sağa sola"). Ringe uebereinander statt eines Strichs: man sieht, wo
   das Heft gebunden ist und wo man es anfasst. Gezeichnet aus zwei
   Verlaeufen in den Farben der Oberflaeche - kein Bild, keine feste Farbe.
   Ziehen aendert die Breite, zweimal antippen schlaegt den Kalender zu
   (index-app.js uhTrennerBinden, uhAgenda). */
#screen-kalender{ --kh-draht:color-mix(in srgb, var(--ink) 80%, var(--regenbogen-4)); }
#screen-kalender .kh-trenner{ flex:0 0 20px; cursor:col-resize; position:relative; z-index:2;
  touch-action:none; }
#screen-kalender .kh-trenner:hover{ --kh-draht:color-mix(in srgb, var(--brand) 70%, var(--ink)); }
/* DAS AUFGESCHLAGENE HEFT (v3.10.0, Ansage Murat 14.10.2026 zu den Ringen
   aus v3.8.2: „sol taraf sol sayfa, sağ taraf sağ sayfa … sağda böyle
   delikler, solda böyle delikler … açmışım defter, önümde duruyor … ortada
   da teller"). Bis v3.8.2 griff ein halber Ring von links ueber die Kante
   in EIN Loch rechts - das Heft sah aus wie ein Block, nicht wie ein
   aufgeschlagenes Buch. Jetzt:
     - die Kalenderspalte ist die LINKE Seite, das Papier die RECHTE; jede
       hat am Bund einen schmalen Rand, in dem ihre Loecher sitzen
       (`.kal-links` padding-right, `.kh-pano` padding-left),
     - jeder Ring ist ein Drahtbogen VON einem Loch der linken Seite UEBER
       den Bund IN ein Loch der rechten (::before, Glanz ::after), die
       beiden Loecher sind der Grund des Rings - zwei Kreise aus Verlaeufen,
     - der Bund selbst wirft einen weichen Schatten auf beide Seiten
       (`.kh-trenner::after`, nimmt keinen Zeiger).
   Gezeichnet aus Raendern und Verlaeufen in den Farben der Oberflaeche,
   kein Bild, keine feste Farbe. Wie viele Ringe, rechnet uhSpiraleZeichnen
   aus der Hoehe. In der Agenda (Kalender zugeschlagen) gibt es nur die
   rechte Seite: dort greift der Ring wie frueher von der Kante ins Loch. */
#screen-kalender{ --kh-loch:color-mix(in srgb, var(--ink) 58%, var(--paper));
  --kh-bundrand:15px; }
#screen-kalender .kh-trenner::after{ content:""; position:absolute; top:0; bottom:0;
  left:calc(-1 * var(--kh-bundrand) - 6px); right:calc(-1 * var(--kh-bundrand) - 6px); pointer-events:none;
  background:linear-gradient(90deg, transparent 0,
    color-mix(in srgb, var(--ink) 4%, transparent) 30%,
    color-mix(in srgb, var(--ink) 11%, transparent) 50%,
    color-mix(in srgb, var(--ink) 4%, transparent) 70%, transparent 100%); }
/* Der Rand am Bund nur, solange das Heft aufgeschlagen neben dem Tag liegt
   (`body.uh-buch`, uhSichtbarkeit) - in Woche, Monat und Jahr und hochkant
   gibt es keinen Bund. */
@media (min-width:901px){
  body.uh-buch:not(.uh-schmaltag) #screen-kalender .kal-links{ padding-right:var(--kh-bundrand); }
  body.uh-buch:not(.uh-schmaltag) #screen-kalender .kh-pano{ padding-left:var(--kh-bundrand); }
}
.kh-spirale{ position:absolute; z-index:1; top:16px; bottom:16px; left:calc(-1 * var(--kh-bundrand));
  right:calc(-1 * var(--kh-bundrand)); display:flex; flex-direction:column; justify-content:space-between;
  pointer-events:none; }
/* Die Loecher - links in der linken, rechts in der rechten Seite - sind der
   Grund des Rings selbst: zwei Kreise aus Verlaeufen. */
.kh-ring{ position:relative; display:block; height:18px; flex:none;
  background:radial-gradient(circle at 8px 13px, var(--kh-loch) 0 2.6px, color-mix(in srgb, var(--kh-loch) 55%, transparent) 3.3px, transparent 3.9px),
             radial-gradient(circle at calc(100% - 8px) 13px, var(--kh-loch) 0 2.6px, color-mix(in srgb, var(--kh-loch) 55%, transparent) 3.3px, transparent 3.9px); }
/* Der Draht: die obere Haelfte einer Ellipse, deren Enden in den Loechern
   verschwinden (Lochmitte 8 px vom Rand, 13 px von oben). */
.kh-ring::before{ content:""; position:absolute; z-index:1; left:5px; right:5px; top:2px; height:12px;
  border:3.4px solid var(--kh-draht); border-bottom-color:transparent; border-radius:50% 50% 0 0 / 100% 100% 0 0;
  box-sizing:border-box; filter:drop-shadow(0 1.5px 1px color-mix(in srgb, var(--ink) 30%, transparent));
  transition:border-color .15s; }
/* Der Glanz auf dem Draht: ein heller Strich auf seiner Mittellinie, der zu
   den Enden hin auslaeuft - so wirkt er rund wie Metall. */
.kh-ring::after{ content:""; position:absolute; z-index:2; left:6px; right:6px; top:3px; height:11px;
  border:1.3px solid transparent; border-top-color:color-mix(in srgb, var(--card) 62%, transparent);
  border-radius:50% 50% 0 0 / 100% 100% 0 0; box-sizing:border-box; }
/* Agenda: nur die rechte Seite - der Draht kommt hinter der Kante hervor. */
body.uh-agenda #screen-kalender .kh-spirale{ left:-4px; }
body.uh-agenda #screen-kalender .kh-trenner::after{ left:0; background:linear-gradient(90deg,
  color-mix(in srgb, var(--ink) 9%, transparent), transparent); }
body.uh-agenda .kh-ring{ background:radial-gradient(circle at calc(100% - 8px) 13px, var(--kh-loch) 0 2.6px,
  color-mix(in srgb, var(--kh-loch) 55%, transparent) 3.3px, transparent 3.9px); }
body.uh-agenda .kh-ring::before, body.uh-agenda .kh-ring::after{ left:-6px; border-left-color:transparent;
  border-radius:0 50% 0 0 / 0 100% 0 0; }
@media (prefers-reduced-motion:reduce){ .kh-ring::before{ transition:none; } }
/* Ohne Pano kein Trenner. Die Klasse setzt uhSichtbarkeit(); `:has()`
   waere kuerzer, fehlt aber in aelteren Android-WebViews - dort
   staende ein Strich ins Nichts. */
#screen-kalender .kh-trenner.hidden{ display:none; }
/* KEIN KASTEN (v2.890.1, Ansage Murat 29.09.2026: „kutuda değil, üst
   sınıra ve alt sınıra dayalı olsun, olabilecek tüm alanları kullanalım"):
   die Spalte hat keinen Rahmen und keinen Innenrand mehr - die Seite reicht
   von oben bis unten und so breit, wie die Spalte ist. */
.kh-pano{ flex:0 0 var(--kh-breite); width:var(--kh-breite);
  min-width:0; display:flex; flex-direction:column; gap:10px;
  border:0; border-radius:0; background:var(--card);
  padding:0; min-height:0; overflow:auto; }
.kh-pano.hidden{ display:none; }

/* Die Kopfzeile der SEITE, nicht der App (§6b Nr. 3). */
.kh-kopf{ display:flex; align-items:center; gap:8px; flex-wrap:wrap; }
.kh-kopf-txt{ flex:1 0 100%; min-width:0; order:2; padding:9px 34px 9px 11px;
  border:1px solid var(--line); border-radius:11px; background:var(--paper);
  position:relative; }
.kh-kopf-txt.hidden{ display:none; }
/* Das Minus oben rechts klappt den Kopf ein (v2.729.0, uhKontextZu); das
   „i" in der Werkzeugzeile holt ihn zurueck. Grau wie die Werkzeuge, erst
   beim Zeigen farbig. */
.kh-kontext-zu{ position:absolute; top:6px; right:6px; appearance:none;
  border:0; background:transparent; color:var(--muted); width:26px; height:26px;
  border-radius:var(--r-control); cursor:pointer; padding:0;
  display:inline-flex; align-items:center; justify-content:center; }
.kh-kontext-zu:hover{ color:var(--brand); background:var(--brand-soft); }
.kh-kontext-zu svg{ width:16px; height:16px; fill:none; stroke:currentColor;
  stroke-width:2.2; stroke-linecap:round; stroke-linejoin:round; }
/* Fahrplan und Stunde als letzte Zeile des Kopfs (v2.729.0). Der Titel ist
   ein Knopf in den Plan - ohne Rahmen, wie ein Link, damit die Zeile eine
   Angabe bleibt und kein Bedienfeld. */
.kh-plan{ display:block; margin-top:6px; font-size:12px; color:var(--muted); }
.kh-plan.hidden{ display:none; }
.kh-plan-btn{ appearance:none; border:0; background:transparent; padding:0;
  font:inherit; color:var(--ink); cursor:pointer; text-align:left; }
.kh-plan-btn b{ font-weight:700; }
.kh-plan-btn:hover b{ color:var(--brand); text-decoration:underline; }
.kh-titel{ display:inline; font-size:15.5px; font-weight:800;
  color:var(--ink); overflow:hidden; text-overflow:ellipsis; }
.kh-sub{ display:block; font-size:12px; color:var(--muted);
  margin-top:2px; }
.kh-thema{ display:block; margin-top:7px; padding-top:7px;
  border-top:1px solid var(--line); color:var(--ink); font-size:13px;
  font-weight:700; line-height:1.4; }
.kh-thema.hidden{ display:none; }
/* Die Wiederholung aus der Nachbereitung (v2.728.3). Dieselbe Kante wie die
   Vorschau im Nachbereitungsfenster (.nb-vorschau): die Lehrkraft erkennt den
   Satz wieder, den sie dort bestaetigt hat. Nur Tokens - `--brand-soft` und
   `--ink` sind im Dunkelmodus beide umdefiniert. Steht sie da, ersetzt ihre
   Flaeche die Trennlinie ueber dem Thema; zwei Grenzen uebereinander waeren
   eine zu viel. */
.kh-wdh{ display:block; margin-top:7px; padding:5px 9px;
  border-left:3px solid var(--brand); border-radius:0 8px 8px 0;
  background:var(--brand-soft); color:var(--ink); font-size:13px;
  font-weight:700; line-height:1.4; }
.kh-wdh.hidden{ display:none; }
.kh-wdh:not(.hidden) + .kh-thema{ border-top:0; padding-top:0; }
/* UNTIS HAT DIESE STUNDE GESTRICHEN (v2.885.0). Bernstein, weil es ein
   Hinweis ist (DESIGN_SYSTEM §3.1) - und nicht im einklappbaren Kopf: die
   Frage darf nicht hinter dem „i" verschwinden. Ein Satz, zwei Knoepfe;
   was dahinter passiert, steht im Handbuch. Nur Tokens. */
.kh-entfall{ display:flex; flex-wrap:wrap; align-items:center; gap:8px 10px;
  margin:0 0 10px; padding:9px 12px; border-radius:var(--r-card);
  border-left:3px solid var(--amber); background:var(--amber-soft);
  color:var(--ink); font-size:13px; line-height:1.4; }
.kh-entfall.hidden{ display:none; }
.kh-entfall-txt{ flex:1 1 220px; font-weight:650; }
.kh-entfall-txt small{ display:block; font-weight:500; color:var(--muted); }
.kh-entfall-knoepfe{ display:flex; flex-wrap:wrap; gap:6px; }
.kh-entfall-knoepfe button{ appearance:none; font:inherit; font-size:12.5px;
  font-weight:700; border-radius:var(--r-control); padding:6px 11px;
  cursor:pointer; border:1.5px solid var(--line); background:var(--card);
  color:var(--ink); }
.kh-entfall-knoepfe button.an{ border-color:var(--amber-ink);
  background:var(--amber-ink); color:var(--card); }
.kh-entfall-knoepfe button:disabled{ opacity:.6; cursor:default; }
/* Das Fach steht NEBEN dem Klassennamen, nicht darunter: es ist die zweite
   Haelfte der Antwort auf „welches Heft ist das". */
.kh-fachbox{ display:inline-block; margin-left:7px;
  vertical-align:middle; }
.kh-fach{ appearance:none; border:1.5px solid var(--line);
  background:var(--card); color:var(--ink); border-radius:999px;
  padding:2px 24px 2px 10px; font-family:inherit; font-size:12px; font-weight:700;
  cursor:pointer; max-width:min(190px, 46vw);
  background-image:linear-gradient(45deg, transparent 50%, var(--muted) 50%),
    linear-gradient(135deg, var(--muted) 50%, transparent 50%);
  background-position:calc(100% - 13px) 50%, calc(100% - 9px) 50%;
  background-size:4px 4px, 4px 4px; background-repeat:no-repeat; }
.kh-fach:hover{ border-color:var(--brand); color:var(--brand); }
.kh-fach-fest{ display:inline-block; padding-right:10px; cursor:default;
  background-image:none; }
.kh-fach-fest:hover{ border-color:var(--line); color:var(--ink); }
/* DIE WERKZEUGE STEHEN GENAU IN DER MITTE (v2.892.0, Ansage Murat
   30.09.2026: „o araç çubuğunu ortalayacaksın … tam ortasında olacak").
   Zwei gleich breite Seitenspalten um die Mitte: solange beide Seiten in
   ihre Haelfte passen, steht die Leiste exakt mittig. Die rechte Seite
   (Auge, Zahnrad, Vollbild, X) schrumpft nie; wird es eng, gibt die linke
   nach und rollt. */
.kh-akt{ display:grid; grid-template-columns:minmax(0,1fr) auto minmax(max-content,1fr); grid-template-areas:"links mitte rechts";
  gap:4px; flex:1 1 100%; order:1; align-items:center; min-width:0; }
/* Bei wenig Platz rollt nur die Werkzeuggruppe. Plan und Schliessen
   behalten ihren Platz; die 44-px-Schreibknöpfe bleiben gut antippbar. */
.kh-akt-links{ grid-area:links; justify-self:start; display:flex; align-items:center; gap:4px;
  min-width:0; max-width:100%; overflow-x:auto; scrollbar-width:thin; }
.kh-akt-links > *{ flex-shrink:0; }
.kh-akt-mitte{ grid-area:mitte; justify-self:center; display:flex; align-items:center; gap:4px; }
.kh-akt-rechts{ grid-area:rechts; justify-self:end; display:flex; align-items:center; gap:4px; }
/* Ein Werkzeug sagt mit einem Wort, was es tut. Nur das Plus bleibt ein
   nacktes Zeichen: seine Bedeutung ist eindeutig, und die weisse Scheibe
   dahinter war ein zweiter, bedeutungsloser Gegenstand. */
.kh-ib{ appearance:none; border:0; background:transparent;
  color:var(--muted); min-height:32px; border-radius:var(--r-control); cursor:pointer;
  font-family:inherit; font-size:var(--fs-sm); font-weight:700;
  display:inline-flex; align-items:center; justify-content:center; gap:6px;
  flex:none; padding:4px 8px; white-space:nowrap; }
.kh-ib:hover{ color:var(--brand); background:var(--brand-soft); }
.kh-ib-plus{ width:32px; padding:0; background:transparent; }
.kh-ib-plus{ color:var(--brand); }
.kh-ib-plus:hover{ color:var(--brand); background:var(--brand-soft); }
.kh-ib-icon{ width:32px; padding:0; }
/* Das Loeschen bleibt GRAU wie seine Nachbarn und wird erst beim Zeigen rot.
   Ein dauerhaft rotes Zeichen in einer Werkzeugzeile liest sich als Warnung
   und zieht den Blick von dem weg, was man staendig braucht. */
.kh-ib-weg:hover{ color:var(--bad); background:var(--bad-soft); }
.kh-ib svg{ width:17px; height:17px; fill:none; stroke:currentColor;
  stroke-width:1.9; stroke-linecap:round; stroke-linejoin:round; }
.kh-ib-plus svg{ width:21px; height:21px; stroke-width:2.25; }
/* Alle Werkzeuge gehoeren in EINE ruhige Zeile. Die Heftspalte ist dafuer
   etwas breiter; der vorhandene Ziehgriff bleibt die persoenliche
   Feinabstimmung. Zwei Zeilen liessen Vollbild/Schliessen oben und die beiden
   wichtigsten Planungswege darunter schweben - genau dadurch wirkte die
   Kopfzeile jedes Mal anders. */
.kh-pano .kh-akt{ grid-template-areas:"links mitte rechts"; }
/* DIE ZEILE PASST IN IHRE BREITE (v2.835.1, erster Browserlauf 25.09.2026).
   Seit links der Stift steht, reichte die Spalte in ihrer Grundbreite nicht
   mehr fuer „Stundenplan" und „Reihe verteilen" MIT Wort: die Mitte lief
   ueber ihre Nachbarn, und der Stift lag UNTER „Stundenplan" - ein Tipp auf
   den Stift oeffnete den Stundenplan. Auf dem Telefon stand die Mitte schon
   vorher halb ueber Zurueck und Plus. Ist die ZEILE schmaler als der Platz
   fuer alles mit Wort (Vollbild mit Seitenknopf, allen Stiftwerkzeugen und
   dem laengsten Stand), tragen die beiden mittleren Wege nur ihr Zeichen;
   Titel und aria-label sagen weiter, was sie tun. Gemessen an der Zeile
   selbst (Container), nicht am Schirm: die Spalte ist auf jedem Schirm
   schmal, das Vollbild quer auf keinem. */
.kh-akt{ container-type:inline-size; }
/* SEIT v2.892.0 stehen Stundenplan, Reihe, „Klasse sieht mit" und „Hefte
   der Klasse" im Zahnrad - in der Zeile gibt es kein Wort mehr, das
   ausgeblendet werden muesste. Wird sie eng (iPad hochkant), ruecken die
   Schreibwerkzeuge zusammen, statt seitlich wegzurollen; getippt werden
   sie weiter bequem (38 px, darunter 34 px). */
@container (max-width:939px){
  .kh-akt .sw-schale .hb-knopf.nur-icon{ width:36px; height:38px; min-width:0; min-height:0; }
  .kh-akt .sw-schale .hb-knopf.nur-icon svg{ width:20px; height:20px; }
  .kh-akt .sw-trenner{ margin:0 3px; }
}
@container (max-width:759px){
  .kh-akt .sw-schale .hb-knopf.nur-icon{ width:32px; height:34px; min-width:0; min-height:0; }
  .kh-akt .sw-trenner{ margin:0 1px; }
}
.kh-leer{ padding:26px 14px; text-align:center; color:var(--muted);
  font-size:13.5px; }
.kh-fuss{ display:flex; align-items:center; gap:8px; flex-wrap:wrap; }
.kh-fuss .btn{ width:auto; margin:0; }

/* ---- Die Bloecke: freie Prozentflaeche --------------------------------- */
/* Position und Groesse liegen in Prozent dieser Buehne. Pixel waeren eine
   zweite Wahrheit: rechts ist die Spalte oft 390 px breit, im Vollbild der
   ganze Beamer. Die Mindesthoehe gibt y/h einen stabilen Bezug und macht die
   Flaeche innerhalb des Pano scrollbar, ohne unten Inhalt abzuschneiden. */
.kh-raster{ display:block; position:relative; flex:0 0 auto;
  width:100%; height:680px; min-height:680px; }
.kh-raster.hidden{ display:none; }
/* `container-type:size` gibt Flaechenwerkzeugen beide Achsen: Text folgt der
   Breite, Ampel/Uhr/Timer duerfen zusaetzlich die echte Hoehe nutzen. */
/* ⛔ KEIN RAHMEN UM EINEN KASTEN - NIE (Ansage Murat 14.09.2026: „su can
   sikici mavi cerceve görünüyor yani onu asla ve asla istemiyorum ... su an
   asiri bayagi duruyor"). Bis v2.728.3 bekam ein angefasster Kasten einen
   blauen Rand und einen Knopf „Bearbeiten"; das sah nach Formular aus, nicht
   nach Tafel. Der Rand bleibt an ALLEN Zustaenden durchsichtig; was einen
   angefassten Kasten zeigt, sind der Griff oben links, der Stift oben rechts
   und die Groessengriffe an den Kanten. `border` bleibt als Platzhalter, damit
   die Geometrie beim Wechsel der Zustaende nicht springt. */
/* KEIN KOPF, KEIN GRUND, KEIN GRIFF (v2.896.0, Ansage Murat 30.09.2026 mit
   Classroomscreen: „çerçevesiz … taşıma yeri gösterme yok … kareli
   papierde kutu berbat"). Der Kasten ist nur sein Inhalt - auch angefasst
   und im Bearbeiten bekommt er keinen weissen Grund mehr. Gewaehlt zeigt
   er vier Eckwinkel (die Griffe fuer die Groesse), die Knoepfe stehen in
   der Leiste darueber (index-app.js uhBlockLeiste). Kaesten duerfen sich
   ueberlappen; der gewaehlte liegt oben. Die SCHRIFT liegt ueber allen
   Kaesten (.hs-tinte z-index) - wer auf einem Bild oder PDF-Kasten
   schreibt, sieht, was er schreibt. */
.kh-block{ position:absolute; container-type:size; z-index:1;
  border:1.5px solid transparent; border-radius:var(--r-card); background:transparent;
  display:flex; flex-direction:column; min-width:0; min-height:0;
  overflow:hidden; box-sizing:border-box; }
.kh-raster:not(.hs-schreiben) .kh-block{ cursor:grab; }
.kh-block.kh-gewaehlt{ border-color:transparent; cursor:grab; touch-action:none; z-index:2; }
.kh-block.kh-aktiv{ border-color:transparent; background:transparent; }
.kh-block.kh-aktiv{ cursor:auto; touch-action:auto; }
.kh-block.zieht{ border-color:transparent; }

/* DER INHALT WAECHST UND SCHRUMPFT MIT DEM KASTEN – und zwar ueber cqw,
   NICHT ueber transform:scale(). scale() zoomt zwar alles mit, macht aber
   Schrift unscharf, verzerrt Klickflaechen gegenueber dem, was man sieht,
   und bricht die Auswahl in Eingabefeldern. Ein Kasten, dessen Text bei
   jedem Ziehen weichgezeichnet wird, sieht nach Fehler aus.
   `clamp()` ist Pflicht: ohne Untergrenze wird ein schmaler Kasten unlesbar,
   ohne Obergrenze sieht ein breiter aus wie ein Plakat.
   Die feste Zeile davor ist der Rueckfall fuer WebViews ohne cqw – dort
   waere der ganze clamp() ungueltig und die Schrift bliebe geerbt. */
/* DIE KOPFZEILE IST DER GRIFF (v2.435.0, Befund Murat „tasiyamiyorum").
   Sie sieht deshalb aus wie einer: gepunkteter Anfasser links, `grab` als
   Zeiger, und das X erscheint erst beim Ueberfahren - eine Reihe von acht
   Kreuzen ist kein Heft, sondern eine Baustelle. Am Tablet (kein Hover)
   bleibt es sichtbar, siehe die Regel unter der Medienabfrage. */
/* Seit v2.896.0 UNSICHTBAR: nur noch der Knopf fuer die Tastatur (Tab,
   Enter). Mit dem Fokus zeigt der Kasten seine Eckwinkel wie gewaehlt. */
.kh-bk-kopf{ position:absolute; z-index:6; top:0; left:0;
  width:1px; height:1px; overflow:hidden; clip-path:inset(50%); padding:0; margin:0;
  font-size:0; white-space:nowrap; }
.kh-block:has(> .kh-bk-kopf:focus-visible){ outline:2px solid var(--brand); outline-offset:2px; }
.kh-bk-name{ flex:1; min-width:0; overflow:hidden; text-overflow:ellipsis;
  white-space:nowrap; display:none; }
/* DER STIFT (v2.729.0) - ein Zeichen, kein Wort, grau wie die Werkzeuge der
   Kopfzeile; beim Zeigen und im Bearbeiten-Zustand mit dem Hauch hinterlegt.
   Sichtbar erst am angefassten Kasten, wie vorher der Knopf. */
.kh-bk-bearbeiten{ appearance:none; border:0; background:transparent;
  color:var(--muted); width:28px; height:28px; border-radius:var(--r-control);
  padding:0; cursor:pointer; display:none; margin-left:auto;
  align-items:center; justify-content:center; flex:none; }
.kh-bk-bearbeiten svg{ width:16px; height:16px; fill:none; stroke:currentColor;
  stroke-width:2; stroke-linecap:round; stroke-linejoin:round; }
.kh-bk-bearbeiten:hover{ color:var(--brand); background:var(--brand-soft); }
.kh-block.kh-gewaehlt .kh-bk-bearbeiten{ display:inline-flex; }
.kh-block.kh-aktiv .kh-bk-bearbeiten{ background:var(--brand-soft);
  color:var(--brand); }
.kh-bk-x{ display:none; opacity:0; transition:opacity .12s; }
.kh-block.kh-aktiv .kh-bk-x{ display:block; opacity:1; }
/* Ein Kasten, der gerade umzieht, ist sichtbar unterwegs - sonst weiss man
   beim Loslassen nicht, was man bewegt hat. Halb durchsichtig, kein Rand. */
.kh-block.kh-zieht{ border-color:transparent; opacity:.75; }
.kh-bk-kopf label{ font:inherit; color:inherit; margin:0; display:block; }
/* DIE SCHRIFT WAECHST MIT DEM KASTEN, ABER NICHT INS PLAKATHAFTE
   (Befund Murat 25.08.2026: „öyle basit ki ilkokul cocugu kodlamis gibi").
   5.5cqw hiess: in einem Kasten ueber drei Spalten stand der Titel in
   Ueberschriftgroesse - das sah nicht gross aus, sondern unfertig. */
.kh-bk-inhalt{ flex:1; min-height:0; overflow:auto;
  font-size:13px; font-size:clamp(11.5px,3.2cqw,15px);
  padding:clamp(8px,3cqw,13px); }
.kh-bk-inhalt input,
.kh-bk-inhalt textarea{ font-size:inherit; }
.kh-bk-inhalt .hint{ font-size:.82em; margin:0 0 6px; }
/* Der Anfasser. IMMER sichtbar, nicht erst beim Ueberfahren: am Tablet gibt
   es kein Hover, und einen unsichtbaren Anfasser findet niemand (dieselbe
   Lehre wie bei den Kalender-Resizern, §4c 2.93.0). */
.kh-griff{ position:absolute; z-index:4; touch-action:none; opacity:0;
  pointer-events:none; }
.kh-block.kh-gewaehlt .kh-griff{ opacity:1; pointer-events:auto; }
.kh-griff-n,.kh-griff-s{ left:14px; right:14px; height:9px; cursor:ns-resize; }
.kh-griff-n{ top:0; } .kh-griff-s{ bottom:0; }
.kh-griff-e,.kh-griff-w{ top:14px; bottom:14px; width:9px; cursor:ew-resize; }
.kh-griff-e{ right:0; } .kh-griff-w{ left:0; }
.kh-griff-ne,.kh-griff-nw,.kh-griff-se,.kh-griff-sw{ width:22px; height:22px; box-sizing:border-box; }
.kh-griff-ne{ right:0; top:0; cursor:nesw-resize; }
.kh-griff-nw{ left:0; top:0; cursor:nwse-resize; }
.kh-griff-se{ right:0; bottom:0; cursor:nwse-resize; }
.kh-griff-sw{ left:0; bottom:0; cursor:nesw-resize; }
/* DIE ECKEN SIND DIE EINZIGE SPUR DER AUSWAHL (v2.896.0): vier kurze
   Winkel in der Markenfarbe - kein Rahmen, keine Kanten. Die Kanten bleiben
   unsichtbar greifbar. */
.kh-block.kh-gewaehlt .kh-griff-nw{ border-top:2.5px solid var(--brand); border-left:2.5px solid var(--brand);
  border-top-left-radius:8px; }
.kh-block.kh-gewaehlt .kh-griff-ne{ border-top:2.5px solid var(--brand); border-right:2.5px solid var(--brand);
  border-top-right-radius:8px; }
.kh-block.kh-gewaehlt .kh-griff-se{ border-bottom:2.5px solid var(--brand); border-right:2.5px solid var(--brand);
  border-bottom-right-radius:8px; }
.kh-block.kh-gewaehlt .kh-griff-sw{ border-bottom:2.5px solid var(--brand); border-left:2.5px solid var(--brand);
  border-bottom-left-radius:8px; }
/* Die Leiste ueber dem gewaehlten Kasten (uhBlockLeiste). */
.kh-bk-leiste{ position:fixed; z-index:9003; display:none; align-items:center; gap:2px; padding:3px;
  background:var(--card); border:1px solid var(--line); border-radius:12px; box-shadow:var(--shadow); }
.kh-bk-leiste button{ appearance:none; border:0; background:transparent; width:36px; height:36px; padding:0;
  border-radius:9px; color:var(--muted); cursor:pointer; display:inline-flex; align-items:center;
  justify-content:center; touch-action:manipulation; }
.kh-bk-leiste button svg{ width:18px; height:18px; fill:none; stroke:currentColor; stroke-width:2;
  stroke-linecap:round; stroke-linejoin:round; }
.kh-bk-leiste button.an, .kh-bk-leiste button.zu{ color:var(--brand); background:var(--brand-soft); }
@media (hover:hover){
  .kh-bk-leiste button:hover{ color:var(--brand); background:var(--brand-soft); }
  .kh-bk-leiste button.weg:hover{ color:var(--bad); background:var(--bad-soft); }
}
body.kh-zieht{ user-select:none; -webkit-user-select:none; }

/* ---- DIE HANDSCHRIFT (heft-stift.js, v2.835.0) --------------------------
   Die Schreibebene liegt seit v2.896.0 UEBER den Kaesten (z-index 3, die
   Kaesten 1, der gewaehlte 2). Bis dahin lag sie darunter - dann war, was
   auf ein Bild, ein PDF oder einen Timer geschrieben wurde, unsichtbar
   (Ansage Murat 30.09.2026: „bazı Werkzeugları … çizmek işime gelebilir").
   „Auswahl": die Schrift nimmt keinen Zeiger - die Kaesten darunter
   bleiben bedienbar. Stift/Radierer: nur die Schrift nimmt ihn, die
   Kaesten keinen - ein Strich verschiebt keinen Kasten. */
.kh-raster .hs-tinte{ position:absolute; left:0; top:0; width:100%; height:100%;
  pointer-events:none; z-index:3; }
.kh-raster.hs-schreiben .hs-tinte{ pointer-events:auto; touch-action:none; cursor:crosshair;
  -webkit-user-select:none; user-select:none; -webkit-touch-callout:none; }
.kh-raster.hs-radieren .hs-tinte{ cursor:cell; }
/* Der Laserpointer (v2.892.0): sein Punkt IST der Zeiger. */
.kh-raster.hs-laser .hs-tinte{ cursor:none; }
/* DIE LICHTEBENE (heft-stift.js Abschnitt 9): Laserpunkt und der gezogene
   Textmarker, fest ueber dem sichtbaren Teil der Seite. Nimmt keinen Zeiger;
   ueber dem Vollbild (9000), unter jedem Menue (10020). */
.hs-licht{ position:fixed; z-index:9001; pointer-events:none; display:none; }
/* DAS EINFUEGEFELD (index-app.js uhEinfuegeFeld, v2.896.0): wenn der Knopf
   die Zwischenablage nicht lesen darf, fuegt das Geraet hier selbst ein. */
.kh-einfuegefeld{ position:fixed; z-index:10020; display:flex; flex-direction:column; gap:8px; padding:10px;
  background:var(--card); border:1px solid var(--line); border-radius:var(--r-card); box-shadow:var(--shadow); }
.kh-ef-satz{ font-size:var(--fs-sm); color:var(--muted); }
.kh-ef-feld{ min-height:64px; border:1.5px dashed var(--line); border-radius:10px; padding:8px;
  outline:none; -webkit-user-select:text; user-select:text; }
.kh-ef-feld:focus{ border-color:var(--brand); }
/* Der Papierkorb an der Lasso-Auswahl (heft-stift.js hsLassoKnopf, v2.895.0). */
.hs-lasso-weg{ position:fixed; z-index:9002; display:none; align-items:center; justify-content:center;
  width:36px; height:36px; padding:0; border:1px solid var(--line); border-radius:50%; cursor:pointer;
  background:var(--card); color:var(--bad); box-shadow:var(--shadow); touch-action:manipulation; }
.hs-lasso-weg svg{ width:18px; height:18px; fill:none; stroke:currentColor; stroke-width:2;
  stroke-linecap:round; stroke-linejoin:round; }
.kh-raster.hs-schreiben .kh-block{ pointer-events:none; }
/* KEINE MARKIERUNG IM STIFTMODUS (v2.839.0, Befund Murat 25.09.2026: am
   Tablet wurde beim Schreiben der Text der Kopfzeile markiert). Nur das
   Heft und seine zwei Menues, nur solange Stift/Radierer gewaehlt sind
   (`body.hs-stiftmodus`, hsLayout). Keine `touch-action` hier - Knoepfe,
   Tippen und Scrollen bleiben, wie sie sind; nur Markieren und das
   iOS-Langdruckmenue sind aus. Echte Eingabefelder und editierbare Kaesten
   markieren weiter normal. JS-Gegenstueck: hsSchreibzone (heft-stift.js). */
body.hs-stiftmodus #kh-pano, body.hs-stiftmodus #kh-pano *,
body.hs-stiftmodus #hs-stiftmenue, body.hs-stiftmodus #hs-stiftmenue *,
body.hs-stiftmodus #hs-markermenue, body.hs-stiftmodus #hs-markermenue *,
body.hs-stiftmodus #hs-seiten, body.hs-stiftmodus #hs-seiten *{
  -webkit-user-select:none; user-select:none; -webkit-touch-callout:none; }
body.hs-stiftmodus #kh-pano :is(input, textarea, select, [contenteditable]:not([contenteditable="false"])),
body.hs-stiftmodus #kh-pano [contenteditable]:not([contenteditable="false"]) *{
  -webkit-user-select:text; user-select:text; -webkit-touch-callout:default; }
/* DIE BESCHRIEBENE SEITE WAECHST NACH UNTEN (v2.842.0, PLAN_HEFT_HANDSCHRIFT
   §7). Bis dahin eine 16:9-Seite mit Kante, in den Schirm eingepasst -
   hochkant ein Drittel des Schirms, und ausserhalb der Kante schrieb der
   Stift nicht (Murat: „o kutucuk disina yazamiyorum"). Jetzt ein Stapel
   16:9-Boegen in voller Breite ohne Kante; die Hoehe setzt hsEinpassen()
   (Boegen * Breite * 9/16) und gibt `--kh-bogen-h` an die Kaesten. */
.kh-raster.hs-fest{ min-height:0; aspect-ratio:auto; }
body.uh-vollbild #kh-pano .kh-raster.hs-fest{ flex:0 0 auto; min-height:0; width:100%; }
/* Die Leinwand ist so hoch wie der sichtbare Teil und bleibt oben stehen,
   waehrend die Seite unter ihr durchlaeuft (hsGroesse, hsScrollt) - eine
   Leinwand fuer zwanzig Boegen ueberschritte die Grenze von Safari. */
.kh-raster.hs-fest .hs-tinte{ position:sticky; display:block; top:0; left:0; width:100%; }
/* Im Vollbild bleibt die Kopfzeile mit den Werkzeugen stehen, wenn die
   Seite scrollt. */
body.uh-vollbild #kh-pano .kh-kopf{ position:sticky; top:calc(-18px - env(safe-area-inset-top));
  z-index:20; background:var(--card);
  margin:calc(-18px - env(safe-area-inset-top)) -18px 0;
  padding:calc(18px + env(safe-area-inset-top)) 18px 10px; }
.hs-werkzeuge{ display:inline-flex; align-items:center; gap:2px; }
/* Die Werkzeuge (Menue der Kaesten) stehen bei den Schreibwerkzeugen
   (v2.870.0). Der Ersatzknopf in der Leiste ist nur fuer das Telefon da,
   wo index.css die Schreibwerkzeuge ausblendet. */
.kh-ib-werkzeuge.kh-nur-telefon{ display:none; }
.kh-ib.hs-knopf.on{ color:var(--brand); background:var(--brand-soft); }
/* DER STAND IST EIN FELD FESTER GROESSE (hsStandHtml, v2.840.0): ein
   Zeichen, nie ein Wort. Er darf die Kopfzeile nie breiter oder schmaler
   machen - sonst misst der ResizeObserver die Seite mitten im Schreiben neu.
   Auch leer behaelt er seinen Platz. */
.hs-stand{ display:inline-flex; align-items:center; justify-content:center; flex:none;
  width:28px; height:28px; overflow:hidden; color:var(--muted); position:relative; }
.hs-stand svg{ width:17px; height:17px; fill:none; stroke:currentColor; stroke-width:2;
  stroke-linecap:round; stroke-linejoin:round; }
.hs-stand.gut{ color:var(--ok); }
.hs-stand.laeuft{ color:var(--brand); }
.hs-stand.warnt{ color:var(--bad); }
/* Das Stiftmenue ist das des PDF-Blatts (ha-blatt.css) - nur liegt es hier
   ueber dem Vollbild des Hefts (z-index 9000) statt auf der Blatt-Ebene. */
.hb-stiftmenue.hs-stiftmenue{ position:fixed; z-index:10020; }

/* ---- DIE SEITEN DER STUNDE (heft-stift.js Abschnitt 2b) -----------------
   Der Knopf ganz links (Lucide PanelLeft) traegt ab zwei Seiten „2/3". Seit
   v2.888.0 oeffnet er die SEITENLEISTE (Ansage Murat 29.09.2026: „solda
   bir bölüm açılır … önizleme gibi"): jede Seite klein, die offene
   markiert, Griff zum Verschieben, Auge, ×, unten das Plus. Sie haengt am
   body wie Stift- und Blockmenue, liegt ueber dem Vollbild (9000) und
   sieht aus wie die Menues: Karte, Linie, Aufklapp-Schatten (--e-2,
   DESIGN_SYSTEM §5). Im Vollbild SCHIEBT sie die Seite (`hs-leiste-offen`,
   dieselbe Breite `--hs-leiste-b`) und liegt flach daneben. */
#kh-pano, .hs-seiten{ --hs-leiste-b:156px; }
.kh-ib.hs-seitenknopf{ gap:4px; }
.kh-ib.hs-seitenknopf.on{ color:var(--brand); background:var(--brand-soft); }
.hs-seitenzahl{ font-variant-numeric:tabular-nums; }
.hs-seiten{ position:fixed; z-index:10020; width:var(--hs-leiste-b); max-width:calc(100vw - 16px);
  display:flex; flex-direction:column; gap:6px; padding:8px 6px; overscroll-behavior:contain;
  background:var(--card); border:1px solid var(--line); border-radius:var(--r-card);
  box-shadow:var(--e-2); }
body.uh-vollbild .hs-seiten{ box-shadow:none; }
body.uh-vollbild #kh-pano.hs-leiste-offen .kh-buehne{ margin-left:calc(var(--hs-leiste-b) + 10px); }
.hs-vs-kopf{ padding:0 6px; font-size:12px; font-weight:800; color:var(--muted); }
.hs-vs-liste{ flex:1 1 auto; min-height:0; overflow:auto; overscroll-behavior:contain;
  display:flex; flex-direction:column; gap:10px; padding:4px 6px; }
.hs-vs{ display:flex; flex-direction:column; gap:2px; flex:none; }
.hs-vs.zieht{ position:relative; z-index:2; opacity:.92; }
.hs-vs-bild{ appearance:none; border:0; padding:0; margin:0; background:transparent; display:block;
  width:100%; cursor:pointer; border-radius:4px; }
.hs-vs-blatt{ position:relative; display:block; width:100%; overflow:hidden; background-color:var(--card);
  box-shadow:0 0 0 1px var(--line); border-radius:3px; }
.hs-vs-bild:hover .hs-vs-blatt{ box-shadow:0 0 0 1px var(--brand); }
.hs-vs.an .hs-vs-blatt{ box-shadow:0 0 0 2px var(--brand); }
.hs-vs.zieht .hs-vs-blatt{ box-shadow:0 0 0 2px var(--brand), var(--e-2); }
.hs-vs.verborgen .hs-vs-blatt{ opacity:.55; }
.hs-vs-blatt.laedt{ opacity:.7; }
.hs-vs-blatt svg{ position:absolute; left:0; top:0; width:100%; height:100%; overflow:hidden; }
.hs-vs-blatt path{ fill:none; stroke-linecap:round; stroke-linejoin:round; }
.hs-vs-kasten{ position:absolute; background:var(--brand-soft); border:1px solid var(--line); border-radius:2px; }
.hs-vs-fuss{ display:flex; align-items:center; gap:0; min-height:28px; }
.hs-vs-nr{ flex:1 1 auto; text-align:center; font-size:12px; font-weight:700; color:var(--muted);
  font-variant-numeric:tabular-nums; }
.hs-vs.an .hs-vs-nr{ color:var(--brand); }
.hs-vs-griff{ flex:none; width:28px; height:28px; appearance:none; border:0; background:transparent;
  color:var(--muted); border-radius:var(--r-control); cursor:grab; padding:0; touch-action:none;
  display:inline-flex; align-items:center; justify-content:center; }
.hs-vs-griff:hover, .hs-vs-griff:focus-visible{ color:var(--brand); background:var(--brand-soft); }
.hs-vs.zieht .hs-vs-griff{ cursor:grabbing; }
.hs-vs-fuss .hs-seite-auge, .hs-vs-fuss .hs-seite-weg{ width:28px; height:28px; }
.hs-vs-griff svg{ width:16px; height:16px; fill:none; stroke:currentColor; stroke-width:2;
  stroke-linecap:round; stroke-linejoin:round; }
.hs-seite-weg{ flex:none; width:36px; height:36px; appearance:none; border:0; background:transparent;
  color:var(--muted); border-radius:var(--r-control); cursor:pointer; padding:0;
  display:inline-flex; align-items:center; justify-content:center; }
.hs-seite-weg:hover{ color:var(--bad); background:var(--bad-soft); }
.hs-vs-neu-feld{ position:relative; flex:none; }
.hs-vs-plus{ width:100%; min-height:38px; appearance:none; border:1px dashed var(--line); background:transparent;
  color:var(--brand); display:flex; align-items:center; justify-content:center; gap:6px; padding:6px 8px;
  font-family:inherit; font-size:var(--fs-sm); font-weight:700; border-radius:var(--r-control); cursor:pointer; }
.hs-vs-plus:hover, .hs-vs-plus.an{ background:var(--brand-soft); border-color:var(--brand); }
.hs-vs-plus:disabled{ opacity:.55; cursor:progress; }
/* Das Plus fragt „hochkant oder quer" - die Wahl steht ueber dem Knopf. */
.hs-vs-neu{ display:flex; flex-direction:column; gap:2px; margin-bottom:6px; padding:4px;
  background:var(--paper); border-radius:var(--r-control); }
.hs-seite-neu{ min-height:36px; appearance:none; border:0; background:transparent; color:var(--brand);
  display:flex; align-items:center; gap:8px; padding:6px 8px; font-family:inherit; font-size:var(--fs-sm);
  font-weight:700; border-radius:var(--r-control); cursor:pointer; text-align:left; }
.hs-seite-neu:hover{ background:var(--brand-soft); }
.hs-seite-neu:disabled{ opacity:.55; cursor:progress; }
.hs-seite-weg svg, .hs-seite-neu svg, .hs-vs-plus svg{ width:16px; height:16px; fill:none; stroke:currentColor;
  stroke-width:2; stroke-linecap:round; stroke-linejoin:round; }
.hs-seiten-fehler{ margin:4px 8px 2px; font-size:12.5px; color:var(--bad); line-height:1.4; }
.hs-seiten-hinweis{ margin:4px 8px 2px; font-size:12.5px; color:var(--muted); line-height:1.4; }
/* EIN PDF ALS SEITE (v2.889.0, heft-stift.js Abschnitt 3c): das Bild der
   PDF-Seite liegt UNTER der Schrift - erstes Kind des Rasters, ohne
   z-index, wie die Schreibebene selbst. Es nimmt keinen Zeiger und laesst
   sich nicht wegziehen. Am Telefon ist die Seite eine Liste: dort traegt
   die Leinwand das Bild als Hintergrund (hsPdfHintergrund). */
.kh-raster .hs-pdf{ position:absolute; left:0; top:0; width:100%; height:100%; display:block;
  pointer-events:none; -webkit-user-select:none; user-select:none; -webkit-user-drag:none; }
.kh-raster.hs-pdf-fehlt{ outline:1px dashed var(--line); }
.hs-vs-blatt .hs-vs-pdf{ position:absolute; left:0; top:0; width:100%; height:100%; display:block; }
/* ---- DIE KLASSE SIEHT MIT (PLAN_HEFT_KLASSE H1c, index-app.js uhTeilen) ----
   Das Zeichen im Kopf ist ein Wort auf dem Hauch der Marke - kein Absatz,
   kein Banner. Das Auge sitzt im Griff des Kastens neben dem Stift und
   erscheint wie er erst am angefassten Kasten; ein verborgener Kasten traegt
   in der Ecke ein kleines durchgestrichenes Auge - KEINEN Rahmen und keine
   Blaesse (Ansage Murat 14.09.2026; am Beamer zeigt die Lehrkraft ihn weiter). */
.kh-ib.kh-ib-teilen{ color:var(--brand); background:var(--brand-soft); }
.kh-ib.kh-ib-teilen:hover{ color:var(--brand); background:var(--brand-soft);
  box-shadow:inset 0 0 0 1px var(--brand); }
.kh-bk-auge{ appearance:none; border:0; background:transparent; color:var(--muted);
  width:28px; height:28px; border-radius:var(--r-control); padding:0; cursor:pointer;
  display:none; align-items:center; justify-content:center; flex:none; margin-left:auto; }
.kh-bk-auge + .kh-bk-bearbeiten{ margin-left:0; }
.kh-bk-auge svg{ width:16px; height:16px; fill:none; stroke:currentColor; stroke-width:2;
  stroke-linecap:round; stroke-linejoin:round; }
.kh-bk-auge:hover{ color:var(--brand); background:var(--brand-soft); }
.kh-block.kh-gewaehlt .kh-bk-auge{ display:inline-flex; }
.kh-block.kh-verborgen .kh-bk-auge{ color:var(--brand); }
.kh-bk-verborgen{ position:absolute; z-index:5; top:6px; right:6px; width:22px; height:22px;
  border-radius:50%; background:var(--card); color:var(--muted); box-shadow:var(--e-1);
  display:inline-flex; align-items:center; justify-content:center; pointer-events:auto; }
.kh-bk-verborgen svg{ width:13px; height:13px; fill:none; stroke:currentColor; stroke-width:2;
  stroke-linecap:round; stroke-linejoin:round; }
.kh-block.kh-gewaehlt .kh-bk-verborgen{ display:none; }
.hs-seite-auge{ flex:none; width:36px; height:36px; appearance:none; border:0; background:transparent;
  color:var(--muted); border-radius:var(--r-control); cursor:pointer; padding:0;
  display:inline-flex; align-items:center; justify-content:center; }
.hs-seite-auge:hover{ color:var(--brand); background:var(--brand-soft); }
.hs-seite-auge.zu{ color:var(--brand); }
.hs-seite-auge:disabled{ opacity:.55; cursor:progress; }
.hs-seite-auge svg{ width:16px; height:16px; fill:none; stroke:currentColor; stroke-width:2;
  stroke-linecap:round; stroke-linejoin:round; }
/* SEHR SCHMALE LEISTE (Telefon 375, mit Zurueck, „i" und Seitenknopf): die
   Knoepfe ruecken zusammen, und die Seitenzahl steht nur in der Liste -
   sonst liefe die Mitte wieder ueber ihre Nachbarn. */
@container (max-width:339px){
  .kh-akt, .kh-akt-links, .kh-akt-mitte, .kh-akt-rechts{ gap:2px; }
  .kh-akt .kh-ib-icon, .kh-akt .kh-ib-plus, .kh-akt-mitte .kh-ib, .kh-akt .hs-seitenknopf{ width:30px; padding:0; }
  .kh-akt .hs-seitenzahl{ display:none; }
}

.uh-gemerkt{ font-size:12.5px; color:var(--muted); }

/* ---- VOLLBILD GILT NUR DEM SCHLAUHEFT ---------------------------------
   „sadece schlauheft kısmını vollbild yapabiliyorum." Der Knopf schaltet die
   RECHTE SPALTE gross - nicht den Kalender, nicht die App. Die Kaesten
   behalten ihre Groessen RELATIV; genau dafuer sind die Container-Queries da:
   derselbe Kasten wird auf dem Beamer einfach groesser, statt dass ein
   zweites Layout noetig waere. Escape schliesst (uhVollbild). */
/* WICHTIG: Im Vollbild haengt #kh-pano am BODY, nicht mehr in
   #screen-kalender (uhVollbild verschiebt es dorthin). Die Regeln hier
   duerfen deshalb NICHT mit `#screen-kalender ...` beginnen - genau daran
   ist v2.427.0 gescheitert: der Kasten war fixiert, aber ohne Hintergrund,
   und die App schien durch („arkaplan hala görünüyor"). */
body.uh-vollbild .topbar,
body.uh-vollbild .app-topbar,
body.uh-vollbild #app-sidebar,
body.uh-vollbild #main-nav,
body.uh-vollbild #feedback-fab{ display:none !important; }
body.uh-vollbild .wrap{ visibility:hidden; }
body.uh-vollbild #kh-pano{ position:fixed; left:0; right:0; top:0; bottom:0;
  width:auto; max-width:none; max-height:none; height:100dvh; z-index:9000;
  visibility:visible; border:0; border-radius:0; background:var(--card);
  padding:18px; padding-top:calc(18px + env(safe-area-inset-top));
  overflow:hidden; display:flex; flex-direction:column; gap:12px; }
/* DIE BUEHNE ROLLT, NICHT DAS HEFT (v2.886.0, heft-stift.js Abschnitt 3b):
   die Kopfzeile steht fest darueber, und eine gezoomte Seite rollt auch
   waagerecht, ohne die Leiste mitzunehmen. In der Spalte ist die Buehne
   kein Kasten - dort rollt das Heft wie immer. `scrollbar-gutter`: eine
   auftauchende Leiste macht die Seite nicht schmaler (sonst misst sie
   sich mitten im Schreiben neu). */
.kh-buehne{ display:contents; }
body.uh-vollbild #kh-pano .kh-buehne{ display:block; position:relative; flex:1 1 auto; min-height:0;
  overflow:auto; overscroll-behavior:contain; scrollbar-gutter:stable; }
/* Kleiner als die Breite (gezoomt): mittig, wie ein Blatt auf dem Tisch -
   sonst saehe niemand, wo eine Seite ohne Kante aufhoert (hsEinpassen). */
body.uh-vollbild #kh-pano .kh-buehne > .kh-raster.hs-fest{ margin-left:auto; margin-right:auto; }
body.uh-vollbild #kh-pano .kh-buehne.hs-tisch{ background:var(--paper); padding:16px 0 24px; }
body.uh-vollbild #kh-pano .kh-buehne.hs-tisch > .kh-raster.hs-fest{ background-color:var(--card); box-shadow:var(--e-1); }
/* Die Hand neben dem Blatt rollt und zoomt nicht nativ, solange mit dem
   Stift geschrieben wird - sonst bricht iPadOS den Pencil-Zug ab
   (heft-stift.js hsTischAktiv, v2.982.0). Geschoben wird wie auf der Seite. */
body.uh-vollbild #kh-pano .kh-buehne.hs-stifttisch{ touch-action:none; }
/* DIE TAGESSEITE DIREKT IN DER SPALTE (v3.5.0, index-app.js uhDirektSetzen,
   heft-stift.js hsDirekt). Ohne gewaehlte Stunde steht rechts die Seite des
   Tages - ein Blatt, auf dem sofort geschrieben wird („direkt yazılabilir
   olmalı … büyütme falan olmasın"). Dafuer ist die Buehne auch hier ein
   Kasten: die feste Seite wird GANZ in ihn eingepasst (hsPassZoom), nichts
   rollt. Nur eine Seite ohne Format („Endlos") rollt weiter nach unten. */
#kh-pano.kh-direkt{ overflow:hidden; gap:8px; }
#kh-pano.kh-direkt .kh-buehne{ display:block; position:relative; flex:1 1 auto; min-height:0;
  overflow:auto; overscroll-behavior:contain; }
#kh-pano.kh-direkt .kh-buehne > .kh-raster.hs-fest{ margin-left:auto; margin-right:auto; flex:0 0 auto; }
#kh-pano.kh-direkt .kh-buehne.hs-tisch{ background:var(--paper); padding:14px 14px 18px; overflow:hidden; }
#kh-pano.kh-direkt .kh-buehne.hs-tisch > .kh-raster.hs-fest{ background-color:var(--card); box-shadow:var(--e-1); }
#kh-pano.kh-direkt .kh-buehne.hs-stifttisch{ touch-action:none; }
/* Die Tagesseite ist in ihrer Vorgabe eine TAFEL (heft-stift.js
   HS_TAG_PAPIER): Papier von Rand zu Rand, ohne Blattkante und ohne grauen
   Grund („etrafı gri boşluk … her noktasına yazılabilmeli"). */
#kh-pano.kh-direkt.hs-tafel{ gap:0; }
#kh-pano.kh-direkt.hs-tafel .kh-buehne{ padding:0; overflow:hidden; background:var(--card); }
#kh-pano.kh-direkt.hs-tafel .kh-raster.hs-fest{ margin:0 auto; box-shadow:none; }
/* DER SEITENTEXT (v3.6.0, index-app.js uhSeitentext): ein Textkasten mit
   `ganz`, der UEBER DER GANZEN SEITE liegt - getippt wird wie in einem
   Schreibprogramm, von oben links, mit Umbruch am Seitenrand. Seine
   gespeicherte Geometrie zaehlt nicht. Solange nicht getippt wird, nimmt er
   keinen Zeiger an: Stift, Auswahl und die anderen Kaesten arbeiten durch
   ihn hindurch. Die Zeile kommt vom Papier (`--kh-zeile`, heft-stift.js
   hsZeilenMass): auf Linien steht der Text auf der Linie. */
.kh-raster .kh-block[data-ganz="1"]{ left:0 !important; top:0 !important; width:100% !important;
  height:100% !important; z-index:0; border:0; border-radius:0; overflow:visible; container-type:normal;
  pointer-events:none; cursor:auto; }
.kh-raster .kh-block[data-ganz="1"].kh-aktiv{ pointer-events:auto; cursor:text; }
.kh-block[data-ganz="1"] .kh-bk-kopf,
.kh-block[data-ganz="1"] .kh-griff{ display:none !important; }
.kh-block[data-ganz="1"] .kh-bk-inhalt{ padding:0; overflow:visible; }
.kh-block[data-ganz="1"] .kh-tafel{ font-size:calc(var(--kh-zeile, 30px) * .62); line-height:var(--kh-zeile, 30px);
  font-weight:400; height:auto; min-height:100%; overflow:visible; box-sizing:border-box;
  padding:0 var(--kh-rand, 24px);
  /* DIE GRUNDLINIE AUF DIE LINIE: bei Schriftgroesse 0,62 Zeilen liegt die
     Grundlinie 0,725 Zeilen unter der Oberkante ihrer Zeile. Die erste
     Textzeile steht auf der ZWEITEN Linie des Papiers (erste Linie + eine
     Zeile - 0,725) - auf der ersten klebte sie an der Oberkante. */
  padding-top:calc(var(--kh-zeile-oben, 0px) + var(--kh-zeile, 30px) * .275); }
.kh-block[data-ganz="1"] .kh-tafel:empty::before{ content:""; }
.kh-block[data-ganz="1"].kh-aktiv .kh-tafel:empty::before{ content:"Schreib los …"; color:var(--muted); }
/* Fett, kursiv, unterstrichen - fuer Finger und Stift, die kein ⌘B haben.
   Unten rechts auf der Seite (oben laege sie auf der ersten Zeile), nur
   waehrend getippt wird. */
.kh-block[data-ganz="1"] .kh-text-leiste{ position:absolute; z-index:5; bottom:12px; right:12px; margin:0;
  padding:4px; border-radius:var(--r-control); background:var(--card); box-shadow:var(--e-1); }
/* ===== DIE AGENDA UND DAS BLAETTERN (v3.8.0, index-app.js uhAgenda) ========
   In der Agenda ist der Kalender links zugeschlagen: das Papier nimmt die
   ganze Breite, die Spirale steht am linken Rand und die Reiter rechts
   bleiben. `body.uh-agenda` setzt uhSichtbarkeit - nur neben dem Tag und
   nicht hochkant (dort steht ohnehin eins unter dem anderen). */
body.uh-agenda #screen-kalender .kal-links{ display:none; }
body.uh-agenda #screen-kalender .kh-pano{ flex:1 1 auto; width:auto; }
.kh-agenda-datum{ font-family:"Chalkboard SE","Segoe Print","Comic Sans MS",cursive; font-size:15px; font-weight:500;
  color:var(--brand); padding:4px 8px; }
/* Die Pfeile am Blattrand (die Seitenanzeige unten ist seit v3.8.2 weg): sie haengen am Heft,
   ueber der Seite, und nehmen selbst den Zeiger - das Papier dazwischen
   bleibt frei zum Schreiben. Still, bis man hinzeigt. */
.kh-pano{ position:relative; }
.kh-blattrand{ position:absolute; inset:0; pointer-events:none; z-index:7; }
.kh-blattpfeil{ appearance:none; position:absolute; top:50%; width:34px; height:56px; margin-top:-28px; padding:0;
  border:0; border-radius:var(--r-control); background:transparent; color:var(--muted); cursor:pointer;
  pointer-events:auto; opacity:.38; display:flex; align-items:center; justify-content:center;
  transition:opacity .15s ease, background-color .15s ease; touch-action:manipulation; }
.kh-blattpfeil.links{ left:2px; } .kh-blattpfeil.rechts{ right:2px; }
.kh-blattpfeil:hover{ opacity:1; background:var(--paper); color:var(--ink); }
.kh-blattpfeil:disabled{ opacity:.12; cursor:default; background:transparent; }
.kh-blattpfeil svg{ width:22px; height:22px; fill:none; stroke:currentColor; stroke-width:2; stroke-linecap:round; stroke-linejoin:round; }
/* DAS BLATT, DAS SICH WENDET: ein eigenes Element ueber der Seite, das einmal
   darueber zieht - nie ein transform an der Seite selbst (die Leinwand der
   Handschrift misst sich an ihr). Ein heller Bogen mit weichem Schatten an
   der Kante, die vorausgeht. */
.kh-wende{ position:fixed; z-index:9500; pointer-events:none; overflow:hidden; }
.kh-wende::before{ content:""; position:absolute; top:0; bottom:0; width:100%;
  background:linear-gradient(90deg, transparent 0, color-mix(in srgb, var(--ink) 9%, transparent) 46%,
    var(--card) 50%, var(--card) 100%); }
.kh-wende.vor::before{ left:0; animation:kh-wende-vor .34s cubic-bezier(.3,.7,.3,1) both; }
.kh-wende.zurueck::before{ left:0; transform:scaleX(-1); animation:kh-wende-zurueck .34s cubic-bezier(.3,.7,.3,1) both; }
@keyframes kh-wende-vor{ 0%{ transform:translateX(100%); opacity:1; } 70%{ opacity:1; } 100%{ transform:translateX(-100%); opacity:0; } }
@keyframes kh-wende-zurueck{ 0%{ transform:scaleX(-1) translateX(100%); opacity:1; } 70%{ opacity:1; } 100%{ transform:scaleX(-1) translateX(-100%); opacity:0; } }
@media (prefers-reduced-motion:reduce){ .kh-wende{ display:none; } .kh-blattpfeil{ transition:none; } }
/* DIE WERKZEUGZEILE BLEIBT EINE ZEILE (v3.5.1, index-app.js uhAktEinpassen):
   was nicht passt, steht hinter „…". `kh-ueber` verbirgt den Knopf in der
   Zeile - er bleibt im Dokument, das Menue drueckt ihn. Das Menue selbst
   ist das Zahnradmenue (`.kh-zahnrad`), nur an einem anderen Knopf. */
.kh-akt .kh-ueber{ display:none !important; }
.kh-akt .kh-ib-mehr[hidden]{ display:none !important; }
/* Neben dem Heft steht „Unterrichtsplanung" im Zahnrad (kalPlanungPlatzieren);
   `.kal-flach` setzt `display` und gewoenne sonst gegen das Attribut. */
#kal-btn-planung[hidden]{ display:none !important; }
.kh-mehr .kh-zr-e:disabled{ opacity:.45; cursor:default; }
/* DIE REITER DES SCHULJAHRES STEHEN RECHTS NEBEN DEM PAPIER (v3.7.0,
   index-app.js kalReiterRender): Jahr und die zwoelf Monate von August bis
   Juli, wie die Griffe an einem Lehrerkalender - sie ragen aus der Seite in
   den Rand des Panels. Das Papier reicht bis an sie heran.
   ⛔ KEIN NEGATIVER AUSSENABSTAND, um bis an die Panelkante zu kommen:
   `#screen-kalender` schneidet ab (overflow:hidden) - die Reiter standen im
   ersten Browserlauf halb abgeschnitten da, und die Spalte der Tagesseite
   aus v3.5.1 ragte aus demselben Grund nur rechnerisch hinaus.
   Der Reiter des Monats, in dem das aufgeschlagene Blatt liegt, ist
   gefuellt; der laufende Monat traegt einen Punkt. Alle gleich hoch und so
   hoch, wie Platz ist. */
.kal-reiter{ flex:0 0 auto; align-self:stretch; display:flex; flex-direction:column; gap:4px;
  min-height:0; overflow:visible; padding:4px 0 6px; width:50px; margin-left:-14px; position:relative; z-index:0; }
.kal-reiter[hidden]{ display:none; }
/* DIE REITER STECKEN HINTER DEM PAPIER (v3.8.2, Ansage Murat 14.10.2026:
   „ayları boyuta göre otomatik yay … aktif olan düz görünür, diğerleri
   içeri girik, küçük, yan yatmış … biraz kreatif"). Sie teilen sich die
   ganze Hoehe; jeder steckt mit seinem linken Teil hinter dem Blatt
   (`margin-left` der Leiste, Papier und Kalender liegen darueber). Der
   aufgeschlagene Monat ragt ganz heraus, ist breiter und gefuellt, sein Name
   steht gerade; die anderen sind eingeschoben, blass, ihr Name steht quer.
   Jeder traegt die Farbe seiner Jahreszeit und eine gestrichelte Naht wie
   ein Register aus Pappe. */
#screen-kalender .kh-pano{ position:relative; z-index:1; }
#screen-kalender .kal-links{ position:relative; z-index:1; background:var(--card); }
.kal-rt{ --rt-ton:var(--brand); appearance:none; border:0; margin:0; padding:0 5px 0 0; width:40px; flex:1 1 0; min-height:22px;
  border-radius:0 12px 12px 0; background:color-mix(in srgb, var(--rt-ton) 17%, var(--card));
  color:color-mix(in srgb, var(--rt-ton) 58%, var(--ink)); cursor:pointer;
  font-family:inherit; font-size:10.5px; font-weight:800; letter-spacing:.05em; line-height:1;
  display:flex; align-items:center; justify-content:flex-end; position:relative; transform:translateX(-7px);
  box-shadow:inset 6px 0 7px -6px color-mix(in srgb, var(--ink) 45%, transparent);
  transition:transform .24s cubic-bezier(.2,.8,.3,1), width .24s cubic-bezier(.2,.8,.3,1), flex-grow .24s ease,
    background-color .18s ease, color .18s ease; }
.kal-rt > span{ writing-mode:vertical-rl; transform:rotate(180deg); white-space:nowrap; }
.kal-rt::before{ content:""; position:absolute; top:3px; bottom:3px; left:12px; right:3px; pointer-events:none;
  border:1px dashed color-mix(in srgb, var(--rt-ton) 45%, transparent); border-left:0; border-radius:0 9px 9px 0; }
.kal-rt:hover{ transform:translateX(-2px); color:var(--ink); }
.kal-rt.an{ width:52px; flex-grow:1.7; transform:translateX(0); background:var(--rt-ton); color:var(--on-brand);
  font-size:12px; justify-content:center; padding:0 0 0 14px; z-index:2;
  box-shadow:0 2px 8px color-mix(in srgb, var(--rt-ton) 40%, transparent); }
.kal-rt.an > span{ writing-mode:horizontal-tb; transform:none; }
.kal-rt.an::before{ border-color:color-mix(in srgb, var(--on-brand) 55%, transparent); }
.kal-rt[data-jz="herbst"]{ --rt-ton:color-mix(in srgb, var(--regenbogen-4) 62%, var(--regenbogen-3)); }
.kal-rt[data-jz="winter"]{ --rt-ton:var(--regenbogen-6); }
.kal-rt[data-jz="fruehling"]{ --rt-ton:var(--regenbogen-2); }
.kal-rt[data-jz="sommer"]{ --rt-ton:color-mix(in srgb, var(--regenbogen-3) 82%, var(--ink)); }
.kal-rt.heute:not(.an)::after{ content:""; position:absolute; right:6px; top:6px; width:5px; height:5px;
  border-radius:50%; background:var(--bad); }
/* Das Schuljahr zum Waehlen: zwei Zahlen uebereinander („26" ueber „27"),
   kein Reiter - es steckt nicht hinter dem Blatt. */
.kal-rt-jahrwahl{ flex:0 0 40px; flex-direction:column; justify-content:center; gap:1px; padding:0 0 0 14px;
  background:transparent; color:var(--ink); font-size:12.5px; transform:none; box-shadow:none; }
.kal-rt-jahrwahl::before{ display:none; }
.kal-rt-jahrwahl:hover{ transform:none; }
.kal-rt-jahrwahl i{ font-style:normal; color:var(--muted); font-weight:600; }
.kal-rt-jahrwahl b{ font-weight:800; }
/* Ein anderes Schuljahr als das laufende ist aufgeschlagen. */
.kal-rt-fremd .kal-rt-jahrwahl{ background:var(--brand-soft); border-radius:0 10px 10px 0; }
.kal-jahrwahl .kh-zr-e.gewaehlt{ font-weight:800; color:var(--brand); }
@media (prefers-reduced-motion:reduce){ .kal-rt{ transition:none; } }
/* DAS SCHULJAHR ZEIGT TAGE, KEINE TERMINE (v3.10.0, index-app.js Ansicht
   `schuljahr`): zwoelf kleine Monate von August bis Juli. `eventDisplay:
   "none"` reicht nicht - die Termine vom Server bringen ihre eigene Anzeige
   mit, und ein Monat von 280 px voller „+1 mehr" war unlesbar. Ein Tipp auf
   die Tageszahl fuehrt zum Tag (kalZumTag). */
#kal-host .fc-schuljahr-view .fc-daygrid-day-events,
#kal-host .fc-schuljahr-view .fc-daygrid-day-bottom{ display:none; }
/* Die Wochennummer klebte im kleinen Monat an der ersten Tageszahl („W323"). */
#kal-host .fc-schuljahr-view .fc-daygrid-week-number{ display:none; }
/* DIE ANSICHT STEHT AM DATUM (v3.7.0, kalBarInTitelzeile): zweite Zeile des
   Datumsfelds - links Zahnrad und Tag · Liste · Woche, rechts „‹ Heute ›".
   Die Leiste selbst ist dieselbe wie frueher oben; hier nur ihr Platz. */
.kal-datumfeld{ flex-wrap:wrap; row-gap:8px; }
.kal-zeile2{ flex:1 0 100%; min-width:0; display:flex; align-items:center; justify-content:space-between; gap:8px 10px;
  flex-wrap:wrap; }
.kal-zeile2 .kal-blattern{ margin-top:0; flex:none; }
.kal-ansichtplatz{ min-width:0; flex:1 1 auto; display:flex; align-items:center; }
#kal-bar.kal-bar-links{ margin:0; width:auto; min-width:0; display:flex; align-items:center; }
#kal-bar.kal-bar-links .kal-topbar{ margin:0; gap:6px; flex-wrap:nowrap; justify-content:flex-start; min-width:0; }
#kal-bar.kal-bar-links .kal-mitte{ position:static; transform:none; display:flex; align-items:center; gap:6px; min-width:0; }
#kal-bar.kal-bar-links .kal-seg{ margin:0; }
/* KLEIN UND VIER (v3.10.0, Ansage Murat 14.10.2026: „Tag Liste Woche Jahr
   oraya geçsin … orayı küçült … tekstleri de küçült … orası küçük olsun").
   Eine schmale Kapsel: Zahnrad, dann Tag · Liste · Woche · Jahr in gleich
   breiten Feldern (das wandernde helle Feld rechnet mit `--kal-zahl`).
   Die Wahl schrumpft nicht unter ihre vier Woerter - wird die Spalte eng,
   rutscht das Blaettern darunter (`.kal-zeile2` bricht um). */
#kal-bar.kal-bar-links .kal-seg.kal-views{ flex:none; }
body.kal-titel-aus #kal-bar.kal-bar-links .kal-mitte{ width:auto; gap:2px; padding:2px 3px 2px 2px; border-radius:16px;
  box-shadow:none; }
body.kal-titel-aus #kal-bar.kal-bar-links #kal-btn-anpassen{ flex:0 0 24px; width:24px; height:24px; padding:4px; }
body.kal-titel-aus #kal-bar.kal-bar-links #kal-btn-anpassen svg{ width:15px; height:15px; }
body.kal-titel-aus #kal-bar.kal-bar-links .kal-seg.kal-views{ flex:none; width:172px; min-width:0; padding:2px; }
body.kal-titel-aus #kal-bar.kal-bar-links .kal-seg.kal-views::before{ left:2px; top:2px; bottom:2px;
  width:calc((100% - 4px)/var(--kal-zahl,4)); border-radius:13px; }
body.kal-titel-aus #kal-bar.kal-bar-links .kal-seg.kal-views button{ flex:1 1 0; padding:3px 0; font-size:10.5px;
  line-height:1.25; }
.kal-ansichtplatz{ flex:0 1 auto; }
/* `body.kal-titel-aus` davor: die alte Regel fuer die Titelzeile stellte den
   Knopf absolut an den rechten Rand und wiegt sonst schwerer - er lag im
   ersten Browserlauf ueber der Ansichtswahl. */
body.kal-titel-aus #kal-bar.kal-bar-links .kal-topbar > #kal-btn-planung{ position:static; margin:0; }
/* Vier kleine Ansichten passen ueberall - das Auswahlfeld des Tablets entfaellt. */
#kal-bar.kal-bar-links .kal-views-wahl{ display:none !important; }
#kal-bar.kal-bar-links .kal-seg.kal-views{ display:flex !important; }
/* EINE FESTE SEITE HAT EINE KANTE (v2.887.0, Format A4/16:9 im Papiermenue):
   anders als die lange Seite (§7, „ohne Kante") endet sie irgendwo - das
   soll man sehen, auch in der Spalte. */
.kh-raster.hs-fest.hs-blatt{ background-color:var(--card); box-shadow:0 0 0 1px var(--line); }
/* „150 %" unten rechts, solange die Seite nicht bei 100 % liegt - ein
   Tipp fuehrt auf die Breite zurueck; bei 100 % „Ganze Seite", wenn die
   Seite nicht ganz zu sehen ist (v2.982.0, hsZoomAnzeigen). Keine Knoepfe
   in der Leiste (Ansage Murat 29.09.2026). `touch-action:none`: ein
   Handballen auf dem Knopf rollt nichts - sonst bricht iPadOS den Strich
   des Pencils ab (wie am Tisch, hs-stifttisch). Getippt wird trotzdem. */
.hs-zoomwert{ position:absolute; right:calc(22px + env(safe-area-inset-right)); bottom:calc(22px + env(safe-area-inset-bottom));
  z-index:25; appearance:none; border:1px solid var(--line); background:var(--card); color:var(--ink);
  border-radius:999px; padding:6px 12px; font:inherit; font-size:13px; font-weight:700;
  box-shadow:var(--e-2); cursor:pointer; font-variant-numeric:tabular-nums; touch-action:none; }
.hs-zoomwert:hover{ color:var(--brand); border-color:var(--brand); }
/* VOLLBILD HEISST MEHR, NICHT GROESSER (Befund Murat 25.08.2026:
   „büyütünce öyle bok gibi duruyo ... büyük ekranda hala büyük gösterrsek
   nasil bi sürü sey sogdircam ki").

   Er hat recht, und es war ein Denkfehler von mir: bis v2.434.0 wuchs im
   Vollbild die SCHRIFT (bis 30 px) und die Kaesten blieben zu dritt in der
   Reihe. Ergebnis: drei riesige Kaesten auf einem 27-Zoll-Schirm - weniger
   Uebersicht als vorher, obwohl mehr Platz da ist. Der Beamer will grosse
   Schrift, der Schreibtisch will viele Kaesten; entschieden wird das an der
   BREITE, nicht am Zustand. Die Prozentflaeche nutzt die zusaetzliche
   Breite direkt; es gibt kein zweites Vollbildraster mehr. */
body.uh-vollbild{ overflow:hidden; }
body.uh-vollbild #kh-pano .kh-raster{ height:calc(100dvh - 92px);
  min-height:520px; }
body.uh-vollbild #kh-pano .kh-titel{ font-size:22px; }
body.uh-vollbild #kh-pano .kh-bk-inhalt{ font-size:clamp(13px,2.1cqw,19px); }
body.uh-vollbild #kh-pano .kh-bk-kopf{ font-size:12.5px; }
body.uh-vollbild #kh-pano .kh-fach{ font-size:15px; padding:4px 26px 4px 12px; }
/* Das Blockraster bekommt den Platz, den es im Vollbild gibt - sonst stuende
   unten die Haelfte des Schirms leer. */
body.uh-vollbild #kh-pano .kh-raster{ flex:1 1 auto; }

/* ---- Die Fenster ueber dem Kalender ------------------------------------ */
/* Zwei Overlays mit derselben z-Ebene waeren ein Zufall, kein Entwurf: das
   Eingabefenster gehoert ueber die Liste, aus der es gerufen wurde. */
#stp-fenster.kh-fenster-oben{ z-index:10010; }
.kh-fenster-akt{ display:flex; gap:8px; flex-wrap:wrap; margin:0 0 12px; }

/* ---- Auf schmalen Schirmen steht das Heft VOR der Terminliste -----------
   Befund auf echtem Schul-iPad und iPhone, 25.08.2026: „untereinander"
   allein reicht nicht. Der 24-Stunden-Tag stand weiterhin zuerst und nahm
   fast die ganze Hoehe; das offene Heft lag ausserhalb des sichtbaren
   Bildes. JS schaltet in diesem Zustand FullCalendars vorhandenes listDay
   ein und setzt `body.uh-schmaltag`. Hier wird nur die Reihenfolge gebaut:
   Heft oben, kompakte Terminliste unten. Kein zweiter Kalenderzeichner. */
@media (max-width:900px){
  #screen-kalender .kal-split{ flex-direction:column; }
  .kh-pano{ flex:1 1 auto; width:100%; max-height:none; }
  body.uh-schmaltag #screen-kalender .kal-split{ gap:8px; overflow:hidden; }
  body.uh-schmaltag #screen-kalender .kh-pano{ order:1; flex:1 1 0;
    min-height:0; }
  /* Datum und Liste duerfen zusammen hoeher als die untere Tabletzeile
     sein. Der Bereich rollt dann, statt die letzten Stunden abzuschneiden. */
  body.uh-schmaltag #screen-kalender .kal-links{ order:2;
    flex:0 0 clamp(168px,28dvh,260px); min-height:0; overflow-x:hidden;
    overflow-y:auto; overscroll-behavior-y:contain; }
  body.uh-schmaltag #screen-kalender .kh-trenner{ display:none; }
  /* Im offenen schmalen Heft ist „Tag" immer die Terminliste. Der
     Stundenraster-Knopf wuerde einen Zustand anbieten, der sofort wieder
     korrigiert wird. Woche, Monat und Jahr bleiben erreichbar; dort geht
     das Heft wie bisher zu. */
  body.uh-schmaltag .app-topbar .kal-views button[data-v="timeGridDay"],
  body.uh-schmaltag #kal-bar.kal-bar-links .kal-views button[data-v="timeGridDay"]{
    display:none; }
  /* ===== TABLET HOCHKANT UND TELEFON: EINS NACH DEM ANDEREN (v3.7.1) ========
     Ansage Murat 13.10.2026: „dik iPad ve telefon da önemli … onları özel
     görünümü yapmalıyız." Quer stehen Kalender, Papier und Reiter
     nebeneinander; hochkant ist dafuer kein Platz. Hier deshalb:
       1. die Reiter des Schuljahres als EINE waagerechte Zeile ganz oben
          (sie rollt seitlich, statt umzubrechen),
       2. das Papier,
       3. darunter Datum, Ansicht und die Termine des Tages.
     Der kleine Monat faellt weg - die Reiter und „‹ Heute ›" blaettern. */
  #screen-kalender .kal-reiter{ order:0; flex:0 0 auto; flex-direction:row; align-self:auto; gap:4px;
    padding:0 0 2px; overflow-x:auto; overflow-y:hidden; scrollbar-width:none; }
  #screen-kalender .kal-reiter::-webkit-scrollbar{ display:none; }
  #screen-kalender .kal-reiter{ margin-left:0; width:auto; }
  #screen-kalender .kal-rt, #screen-kalender .kal-rt.an{ flex:0 0 auto; width:auto; min-width:38px; height:30px; min-height:30px;
    max-height:30px; padding:0 10px; border-radius:var(--r-control); transform:none; justify-content:center; box-shadow:none; }
  #screen-kalender .kal-rt > span{ writing-mode:horizontal-tb; transform:none; }
  #screen-kalender .kal-rt::before{ display:none; }
  #screen-kalender .kal-rt:hover{ transform:none; }
  #screen-kalender .kal-rt-jahrwahl{ flex-direction:row; gap:0; padding:0 8px; }
  #screen-kalender .kal-rt-jahrwahl i::before{ content:"/"; }
  #screen-kalender .kal-rt.heute:not(.an)::after{ right:4px; top:4px; }
  #screen-kalender .kal-minibereich{ display:none; }
  #screen-kalender .kal-datumfeld{ padding:4px 6px 6px; row-gap:4px; }
  #screen-kalender .kal-datumfeld-tag .kal-datumtext{ flex-direction:row; align-items:baseline; gap:8px; flex-wrap:wrap; }
  #screen-kalender .kal-datumfeld-tag .kal-datumtext strong{ font-size:38px; letter-spacing:-1px; transform:none; }
  /* Mit verborgenem „Tag" stimmt das wandernde Feld hinter der Wahl nicht
     mehr - die gewaehlte Ansicht traegt ihren Grund selbst. */
  body.uh-schmaltag #kal-bar.kal-bar-links .kal-seg.kal-views::before{ display:none; }
  body.uh-schmaltag #kal-bar.kal-bar-links .kal-seg.kal-views button.on{ background:var(--card); border-radius:17px; }
  body.uh-schmaltag #kal-bar.kal-bar-links .kal-seg.kal-views{ min-width:0; }
}
@media (max-width:640px){
  /* Auf dem Telefon ist freie Positionierung kein Gewinn: jeder Kasten steht
     in gespeicherter Reihenfolge unter dem vorigen, mit voller Breite. Die
     Prozentwerte bleiben unveraendert fuer den naechsten grossen Schirm.
     Ausnahme: die volle Tafel behaelt Schrift und Kaesten zusammen. */
  .kh-raster{ display:flex; flex-direction:column; gap:8px;
    height:auto; min-height:0; }
  .kh-raster:not(.hs-tafel) .kh-block{ position:relative !important; left:auto !important;
    top:auto !important; width:100% !important; height:auto !important;
    min-height:150px; flex:0 0 auto; }
  .kh-raster:not(.hs-tafel) .kh-block[data-block="status"],
  .kh-raster:not(.hs-tafel) .kh-block[data-block="stoff"]{ min-height:104px; }
  .kh-raster .kh-griff{ display:none; }
  /* In der Liste hat der Kasten keine feste Hoehe - die Tafelbild-Buehne
     nimmt ihre Hoehe dann aus der viewBox, nicht aus dem Kasten. Und der
     Inhalt darf den Kasten ueber die 150px hinaus wachsen lassen
     (flex-basis 0 haette ihn bei 150px abgeschnitten: ein Bild rollt
     nicht wie eine Liste). */
  .kh-raster:not(.hs-tafel) .kh-block[data-block="tafelbild"]{ container-type:inline-size; }
  .kh-raster:not(.hs-tafel) .kh-block[data-block="tafelbild"] .kh-bk-inhalt{ flex-basis:auto; }
  .kh-raster:not(.hs-tafel) .kh-block[data-block="tafelbild"] .tb{ height:auto; }
  .kh-raster:not(.hs-tafel) .kh-block[data-block="tafelbild"] .tb-svg{ height:auto; max-height:62vh; }
  .kh-pano{ padding:10px; }
  /* DIE HANDSCHRIFT AUF DEM TELEFON (v2.835.0): kein Stift - die Kaesten
     stehen hier als Liste und haben keine Stelle, neben der eine Schrift
     liegen koennte. Traegt die Seite Schrift, steht sie als Bild oben. */
  .hs-werkzeuge{ display:none; }
  .kh-ib-werkzeuge.kh-nur-telefon{ display:inline-flex; }
  /* Die Kante gehoert hier dem Bild der Schrift, nicht der ganzen Liste. */
  .kh-raster.hs-fest{ aspect-ratio:auto; outline:0; }
  /* Die Kante einer festen Seite (v2.887.0) gehoert am Telefon dem Bild der
     Schrift, nicht der Liste. */
  .kh-raster.hs-fest.hs-blatt{ box-shadow:none; background-color:transparent; }
  /* Das Bild einer PDF-Seite (v2.889.0) steht hier als Hintergrund der
     Leinwand - in der Liste haette ein Bild ueber die ganze Flaeche keinen Ort. */
  .kh-raster .hs-pdf{ display:none; }
  /* Die ganze Seite als ein Bild (nur benutzte Boegen, die Hoehe setzt
     hsGroesse) - am Telefon klein genug fuer eine Leinwand. */
  .kh-raster.hs-fest:not(.hs-tafel) .hs-tinte{ position:relative; order:-1; flex:0 0 auto; width:100%;
    outline:1px solid var(--line); }
}

/* ---- Mein Stundenplan (Faz 1) – jetzt im Fenster ----------------------
   Die Woche als LISTE, nicht als Gitter. Ein 5x10-Raster sieht auf dem
   Schreibtisch nach Stundenplan aus und ist auf dem Telefon unbenutzbar -
   man zoomt in eine Zelle, die drei Woerter fasst. Eine Liste je Tag liest
   sich auf jeder Breite gleich. */
#stp-plan-fenster .stp-tag{ margin:0 0 18px; }
#stp-plan-fenster .stp-tag-kopf{ display:flex; align-items:baseline; gap:10px;
  margin:0 0 8px; padding-bottom:6px; border-bottom:1px solid var(--line); }
#stp-plan-fenster .stp-tag-name{ font-size:15px; font-weight:800; color:var(--ink); }
#stp-plan-fenster .stp-tag-zahl{ font-size:12px; color:var(--muted); }
#stp-plan-fenster .stp-zeile{ display:flex; align-items:center; gap:12px;
  padding:9px 10px; border-radius:10px; }
#stp-plan-fenster .stp-zeile:hover{ background:var(--paper); }
#stp-plan-fenster .stp-zeit{ font-variant-numeric:tabular-nums; font-size:13px;
  font-weight:700; color:var(--ink); white-space:nowrap; min-width:104px; }
#stp-plan-fenster .stp-nr{ font-size:11px; color:var(--muted); display:block; font-weight:500; }
#stp-plan-fenster .stp-was{ flex:1; min-width:0; }
#stp-plan-fenster .stp-fach{ font-size:14px; font-weight:700; color:var(--ink);
  overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
#stp-plan-fenster .stp-sub{ font-size:12px; color:var(--muted); }
#stp-plan-fenster .stp-akt{ display:flex; gap:4px; flex:none; }
#stp-plan-fenster .stp-ib{ appearance:none; border:0; background:transparent;
  color:var(--muted); cursor:pointer; width:32px; height:32px; border-radius:8px;
  display:inline-flex; align-items:center; justify-content:center; font-family:inherit; }
#stp-plan-fenster .stp-ib:hover{ background:var(--paper); color:var(--ink); }
#stp-plan-fenster .stp-ib svg{ width:16px; height:16px; fill:none; stroke:currentColor;
  stroke-width:1.9; stroke-linecap:round; stroke-linejoin:round; }
/* Eine Zeile ohne Klasse (Aufsicht, Konferenz) bekommt KEINE Stundenseite.
   Das muss man hier schon sehen, sonst sucht man den Eingang vergeblich. */
#stp-plan-fenster .stp-ohne{ opacity:.72; }
#stp-plan-fenster .stp-leer{ padding:26px 14px; text-align:center; color:var(--muted);
  font-size:14px; }
@media (max-width:640px){
  #stp-plan-fenster .stp-zeile{ gap:9px; padding:8px 6px; }
  #stp-plan-fenster .stp-zeit{ min-width:86px; font-size:12.5px; }
}
/* Das freie Fach-Feld steht UNTER der Auswahl, nicht daneben - es erscheint
   erst, wenn "Anderes Fach" gewaehlt ist, und soll die Zeile nicht sprengen. */
#stp-fenster .stp-fach-frei{ margin-top:7px; }

/* Knopf mit Symbol UND Wort in der Kopfzeile einer Seite. Ein Symbol allein
   sagt nicht, wohin es fuehrt - Befund Murat 24.08.2026 zum Stundenplan-
   Knopf im SchlauHeft, dieselbe Entscheidung wie bei den
   Klassenbuch-Knoepfen (v2.355.0: Beschriftung DAUERHAFT, nicht erst bei
   Hover - am Tablet gibt es kein Hover). */
.k-textbtn{
  display:inline-flex; align-items:center; gap:7px;
  font-family:inherit; font-size:13px; font-weight:650; color:var(--ink);
  background:var(--card); border:1.5px solid var(--line); border-radius:10px;
  padding:7px 13px; cursor:pointer; white-space:nowrap;
}
.k-textbtn:hover{ border-color:var(--brand); color:var(--brand); }
.k-textbtn svg{ width:16px; height:16px; flex:none; }
@media (max-width:640px){
  /* Am Telefon zaehlt die Breite mehr als das Wort - aber das Wort bleibt,
     nur kleiner. Es ganz auszublenden waere derselbe Fehler noch einmal. */
  .k-textbtn{ font-size:12px; padding:6px 10px; gap:5px; }
}

/* ---- Fahrplan auf Termine legen (Faz 3) – jetzt im Fenster ------------- */
/* Die Woche als Kasten, die Stunden darin als Zeilen - dieselbe Gliederung
   wie im Themenfahrplan selbst. Wer von dort kommt, erkennt sie wieder. */
#upl-fenster .upl-zurueck{ display:inline-flex; align-items:center; gap:6px;
  background:none; border:0; color:var(--muted); font:inherit; font-size:12.5px;
  font-weight:650; cursor:pointer; padding:0; margin:0 0 12px; }
#upl-fenster .upl-zurueck:hover{ color:var(--brand); }
#upl-fenster .modal-card{ max-width:960px; }
/* Der Fahrplan ist eine Auswahlliste, keine Kartenwand. `pl-cards` ist im
   Planungswerkzeug absichtlich auto-fill; hier erzeugte dieselbe globale
   Regel dagegen zwei Karten und eine einsame dritte. Eine Spalte bleibt bei
   jeder Fensterbreite stabil. */
#upl-fenster .pl-cards{ grid-template-columns:1fr; gap:8px; }
#upl-fenster .pl-card{ min-height:0; flex-direction:row; align-items:center;
  gap:12px; padding:12px 16px; }
#upl-fenster .pl-card-fach{ flex:0 0 112px; }
#upl-fenster .pl-card-title{ flex:1 1 auto; min-width:0; }
#upl-fenster .pl-card-info{ flex:0 1 180px; }
#upl-fenster .pl-card-datum{ flex:none; margin:0; padding:0; }
#upl-fenster .pl-card.neu{ min-height:56px; flex-direction:row; }
#upl-fenster .upl-woche{ border:1px solid var(--line); border-radius:var(--r-card);
  padding:12px 16px; margin-bottom:10px; }
#upl-fenster .upl-woche.pruef{ border-color:var(--amber); }
#upl-fenster .upl-wkopf{ display:flex; align-items:baseline; gap:9px; flex-wrap:wrap;
  margin-bottom:8px; }
#upl-fenster .upl-wnr{ font-weight:800; font-size:13px; color:var(--brand); }
#upl-fenster .upl-wthema{ font-weight:700; font-size:14px; color:var(--ink); }
#upl-fenster .upl-kw{ margin-left:auto; font-size:12px; color:var(--muted);
  font-variant-numeric:tabular-nums; }
#upl-fenster .upl-skip{ appearance:none; background:none; border:1px solid var(--line);
  color:var(--muted); border-radius:999px; padding:3px 11px; font:inherit; font-size:11.5px;
  font-weight:650; cursor:pointer; }
#upl-fenster .upl-skip:hover{ border-color:var(--amber); color:var(--amber); }
#upl-fenster .upl-zeile{ display:grid; align-items:center;
  grid-template-columns:70px minmax(200px,1fr) 142px 100px 100px;
  gap:10px; padding:8px 0; border-top:1px solid var(--line); }
#upl-fenster .upl-zeile:first-child{ border-top:0; }
#upl-fenster .upl-snr{ font-size:12px; font-weight:700; color:var(--muted); }
#upl-fenster .upl-thema{ min-width:0; font-size:13.5px; color:var(--ink); }
#upl-fenster .upl-datum{ appearance:none; border:1.5px solid var(--line);
  background:var(--card); color:var(--ink); border-radius:9px; padding:5px 8px;
  font-family:inherit; font-size:12.5px; font-variant-numeric:tabular-nums;
  width:100%; min-width:0; box-sizing:border-box; }
#upl-fenster .upl-zeitfeld{ width:100%; min-width:0; box-sizing:border-box; }
#upl-fenster .upl-zeit{ font-size:12px; color:var(--muted);
  font-variant-numeric:tabular-nums; min-width:92px; }
/* Ein Vorschlag sieht anders aus als eine Zusage - sonst weiss man nach dem
   Speichern nicht, was man selbst entschieden hat. */
#upl-fenster .upl-zeile.vorschlag .upl-datum{ border-style:dashed; color:var(--muted); }
#upl-fenster .upl-hinweis{ font-size:13px; color:var(--muted); margin:0 0 14px; max-width:70ch; }
#upl-fenster .upl-fuss{ display:flex; align-items:center; gap:12px; flex-wrap:wrap;
  margin-top:16px; padding-top:14px; border-top:1px solid var(--line); }
#upl-fenster .upl-fuss .btn{ width:auto; margin:0; }
@media (max-width:640px){
  #upl-fenster .pl-card{ align-items:flex-start; flex-direction:column; gap:4px; }
  #upl-fenster .pl-card-fach{ flex-basis:auto; }
  #upl-fenster .pl-card-info{ flex-basis:auto; }
  #upl-fenster .pl-card.neu{ align-items:center; flex-direction:row; }
  #upl-fenster .upl-zeile{ display:flex; flex-wrap:wrap; gap:7px; }
  #upl-fenster .upl-snr{ min-width:58px; }
  #upl-fenster .upl-thema{ flex:1; min-width:calc(100% - 66px); }
  #upl-fenster .upl-datum{ flex:1 0 100%; }
  #upl-fenster .upl-zeitfeld{ flex:1 1 calc(50% - 4px); width:auto; }
}

/* ===== THEMENFAHRPLAN BEARBEITEN (v2.713.0) =================================
   Auftrag Murat 13.09.2026: „bu sayfa einfach text sayfasi yani". Die Seite
   liest sich wie vorher - Text, keine Formularkaesten. Dass ein Satz
   bearbeitbar ist, zeigt erst der Zeiger (leichte Flaeche) und beim
   Schreiben der Markenrand. Ein Kasten um jeden Satz waere dieselbe Falle
   wie die „18 Kaesten" der Fach-Matrix (.dtab-zelle-sel).
   SEIT v2.953.0 EINE TAFEL (Murat/Yusuf 05.10.2026: „Kanban şeklinde …
   kutular yan yana"): die Wochen sind Spalten nebeneinander, die Stunden
   Karten darauf, gezogen wird am Griff (Block DIE TAFEL weiter unten).
   JS-Gegenstueck: renderFahrplan, fplWocheHtml, fplStundenHtml, fplEd*,
   fplZug* (index-app.js). Keine festen Farben - geprueft von
   qa/unit/test_fahrplan_bearbeiten.py und test_fahrplan_tafel.py. */
/* DER KOPF IN ZWEI ZEILEN (v2.955.0, renderFahrplan): Zurueck · Word ·
   Teilen, darunter Titel · Kennzeile · „Alle zuklappen". Im Ergebnis faellt
   die Leiste ueber der Karte weg, samt der Luft unter der (hier leeren)
   Kopflinie - der Zurueck-Weg steht in der Karte selbst.
   ⛔ NICHT `.card:first-child` (bis v2.975.0): am Telefon zieht
   mlKopfPlatzieren die Kopfzeile `.app-topbar` als ERSTES Kind in den
   Bildschirm - die Leiste war dann nicht mehr first-child und stand
   doppelt da („Zurück zur Eingabe" zweimal, Murat 07.10.2026). */
#screen-fahrplan.fpl-ergebnis{ --pl-oben:0px; }
#screen-fahrplan.fpl-ergebnis > .card:not(#fpl-result){ display:none; }
#fpl-result .fpl-kopfleiste{ display:flex; align-items:center; gap:8px; flex-wrap:wrap; }
#fpl-result .fpl-zurueck{ margin:0; }
/* Die Speicheranzeige meldet sich nur, wenn etwas schiefging - dann als
   Knopf „Nicht gespeichert – erneut versuchen" (fplEdStand). */
#fpl-result .fpl-stand{ display:none; margin:0; border:0; font-family:inherit; cursor:pointer; }
#fpl-result .fpl-stand.fehler{ display:inline-flex; background:var(--bad-soft); color:var(--bad-ink); }
#fpl-result .fpl-kopfaktionen{ display:inline-flex; align-items:center; gap:6px; }
#fpl-result .fpl-symbol{ appearance:none; display:inline-flex; align-items:center; justify-content:center;
  width:34px; height:34px; padding:0; border:1px solid var(--line); border-radius:var(--r-control);
  background:var(--card); color:var(--brand); cursor:pointer; }
#fpl-result .fpl-symbol:hover{ border-color:var(--brand); background:var(--brand-soft); }
#fpl-result .fpl-ed{ border-radius:var(--r-control); padding:0 4px; margin-left:-4px; outline:none;
  cursor:text; overflow-wrap:anywhere; transition:background-color .12s ease, box-shadow .12s ease; }
#fpl-result .fpl-ed:hover{ background:var(--surface-subtle); }
#fpl-result .fpl-ed:focus{ background:var(--card); box-shadow:0 0 0 2px var(--brand); }
#fpl-result .fpl-ed:empty::before{ content:attr(data-leer); color:var(--muted); font-weight:400; }
#fpl-result .fpl-titelzeile{ display:flex; align-items:baseline; gap:4px 12px; flex-wrap:wrap; margin:8px 0 10px; }
#fpl-result .fpl-titel{ display:block; flex:0 1 auto; min-width:4ch; font-weight:800; font-size:var(--fs-lg); }
#fpl-result .fpl-kopf{ font-size:var(--fs-xs); color:var(--muted); white-space:nowrap; }
#fpl-result .fpl-alle-zu{ appearance:none; display:inline-flex; align-items:center; gap:4px; margin:0;
  background:none; border:0; color:var(--muted); font:inherit; font-size:var(--fs-xs); font-weight:700;
  padding:4px 8px; border-radius:var(--r-control); cursor:pointer; }
#fpl-result .fpl-alle-zu:hover{ background:var(--surface-subtle); color:var(--ink); }
#fpl-result .fpl-voraus{ margin-top:0; margin-bottom:12px; }
#fpl-result .fpl-voraus .fpl-ed{ margin-left:0; }

/* ===== DIE TAFEL (v2.953.0) =====
   Die Wochen als Spalten nebeneinander - so viele, wie der Bildschirm fasst
   (auto-fill), danach die naechste Reihe; am Telefon ergibt das von selbst
   EINE Spalte. Die Spalte traegt --paper, die Stunden liegen als Karten
   (--card) darauf - --surface-subtle waere im Dunkelmodus so hell wie die
   Karte (gemessen 05.10.2026: ein Unterschied von EINER Farbstufe), --paper
   ist in beiden Modi deutlich abgesetzt. align-items:start - eine kurze Woche wird nicht auf die Hoehe der
   laengsten gezogen. position:relative an #fpl-result: dort haengt beim
   Ziehen der Geist (fplZugAnfangen). */
#fpl-result{ position:relative; }
#fpl-result .fpl-tafel{ display:grid; grid-template-columns:repeat(auto-fill, minmax(236px, 1fr));
  gap:12px; align-items:start; margin-bottom:16px; }
#fpl-result .fpl-woche{ display:flex; flex-direction:column; gap:6px; min-width:0;
  background:var(--paper); border:1px solid var(--line); border-radius:var(--r-card);
  padding:8px; transition:border-color .12s ease, box-shadow .12s ease, opacity .12s ease; }
#fpl-result .fpl-woche.pruef{ border-color:var(--amber); }
#fpl-result .fpl-w-kopf{ display:flex; align-items:center; gap:4px; flex-wrap:wrap; min-height:28px;
  margin-bottom:-4px; }
/* Der Name der Woche ist ihr Klappknopf; der Pfeil dreht sich mit. */
#fpl-result .fpl-w-zu{ appearance:none; display:inline-flex; align-items:center; gap:2px; margin-left:-4px;
  padding:2px 6px 2px 2px; background:none; border:0; border-radius:var(--r-control); font:inherit;
  color:var(--brand); cursor:pointer; }
#fpl-result .fpl-w-zu:hover{ background:var(--card); }
#fpl-result .fpl-w-zu .ic{ transition:transform .32s cubic-bezier(.2,.8,.2,1); }
#fpl-result .fpl-woche.zu .fpl-w-zu .ic{ transform:rotate(-90deg); }
#fpl-result .fpl-w-nr{ font-weight:800; font-size:var(--fs-sm); color:var(--brand); }
#fpl-result .fpl-w-std{ font-size:var(--fs-xs); color:var(--muted); }
#fpl-result .fpl-w-pruef{ align-self:flex-start; margin:0; background:var(--amber-soft); color:var(--amber-ink); }
#fpl-result .fpl-luecke{ flex:1 1 auto; min-width:0; }
#fpl-result .fpl-w-titel{ font-weight:700; font-size:var(--fs-sm); line-height:1.35; }
/* Ziel und Idee der Woche stehen hinter dem „i" (fplEdInfo). Ausgegraut,
   solange beides leer ist - die Luecke soll man sehen, aber nicht laut. */
#fpl-result .fpl-info{ appearance:none; display:inline-flex; align-items:center; justify-content:center;
  width:28px; height:28px; padding:0; background:none; border:0; color:var(--muted); cursor:pointer;
  border-radius:var(--r-control); }
#fpl-result .fpl-info:hover{ background:var(--card); color:var(--brand); }
#fpl-result .fpl-info.leer{ opacity:.5; }
#fpl-result .fpl-woche.info-auf .fpl-info{ background:var(--brand-soft); color:var(--brand); opacity:1; }
#fpl-result .fpl-w-info{ display:none; flex-direction:column; gap:2px; padding:8px 10px;
  background:var(--card); border:1px solid var(--line); border-radius:var(--r-control); }
#fpl-result .fpl-woche.info-auf .fpl-w-info{ display:flex; }
#fpl-result .fpl-w-label{ font-size:var(--fs-2xs); font-weight:800; letter-spacing:.04em;
  text-transform:uppercase; color:var(--muted); }
#fpl-result .fpl-w-kompetenz{ font-size:var(--fs-xs); line-height:1.45; margin-bottom:6px; }
#fpl-result .fpl-w-idee{ font-size:var(--fs-xs); color:var(--muted); line-height:1.45; }
/* ZUKLAPPEN (fplEdZuklappen): dieselbe Kurve wie das Bearbeiten-Blatt im
   Cockpit (.32s cubic-bezier(.2,.8,.2,1)). Abgeschnitten wird nur zu und
   waehrend des Gleitens - offen ragen die „…"-Menues der Karten heraus.
   visibility wartet beim Zuklappen das Gleiten ab und nimmt dann den Inhalt
   aus der Tab-Reihenfolge. */
#fpl-result .fpl-w-koerper{ display:grid; grid-template-rows:1fr;
  transition:grid-template-rows .32s cubic-bezier(.2,.8,.2,1), margin-top .32s cubic-bezier(.2,.8,.2,1); }
#fpl-result .fpl-woche.zu .fpl-w-koerper{ grid-template-rows:0fr; margin-top:-6px; }
#fpl-result .fpl-w-innen{ display:flex; flex-direction:column; gap:6px; min-height:0; opacity:1;
  visibility:visible; transition:opacity .24s ease, visibility 0s linear 0s; }
#fpl-result .fpl-woche.zu .fpl-w-innen{ opacity:0; visibility:hidden; overflow:hidden;
  transition:opacity .2s ease, visibility 0s linear .32s; }
#fpl-result .fpl-woche.gleitet .fpl-w-innen{ overflow:hidden; }
#fpl-result .fpl-woche.zu .fpl-info{ display:none; }
/* Material der Woche: EINE Zeile, Stand links, Knopf rechts. */
#fpl-result .fpl-mat{ font-size:var(--fs-xs); color:var(--muted); }
#fpl-result .fpl-mat-zeile{ display:flex; align-items:center; gap:6px; flex-wrap:wrap; }
#fpl-result .fpl-mat-da{ color:var(--ok-ink); font-weight:700; }
#fpl-result .fpl-mat-knopf{ appearance:none; display:inline-flex; align-items:center; gap:4px;
  margin-left:auto; background:var(--card); border:1px solid var(--line); color:var(--brand);
  border-radius:var(--r-control); font:inherit; font-size:var(--fs-xs); font-weight:700;
  padding:3px 8px; cursor:pointer; }
#fpl-result .fpl-mat-knopf:hover{ border-color:var(--brand); }
#fpl-result .fpl-std{ display:flex; flex-direction:column; gap:6px; font-size:var(--fs-sm); }

/* Eine Stunde: eine Karte. Kopf (Griff · Nummer · Art · „…"), Thema, Fuss
   (Vorlage · Wege). Gezogen wird NUR am Griff - touch-action:none steht nur
   dort, die Karte selbst rollt mit dem Finger weiter. */
#fpl-result .fpl-s{ display:flex; flex-direction:column; gap:0; padding:2px 8px 2px;
  background:var(--card); border:1px solid var(--line); border-radius:var(--r-control);
  box-shadow:var(--e-1); }
#fpl-result .fpl-s-kopf{ display:flex; align-items:center; gap:4px; min-height:26px; }
#fpl-result .fpl-s-kopf .fpl-mehr{ width:24px; height:24px; margin-right:-4px; }
#fpl-result .fpl-griff{ display:inline-flex; align-items:center; gap:2px; align-self:stretch;
  margin-left:-6px; padding:0 6px 0 2px; border-radius:var(--r-control); color:var(--muted);
  cursor:grab; touch-action:none; user-select:none; -webkit-user-select:none;
  -webkit-touch-callout:none; }
#fpl-result .fpl-griff:hover{ background:var(--surface-subtle); color:var(--ink); }
#fpl-result .fpl-griff .ic{ opacity:.6; }
#fpl-result .fpl-griff:hover .ic{ opacity:1; }
#fpl-result .fpl-s-nr{ font-size:var(--fs-2xs); font-weight:700; color:var(--muted); white-space:nowrap; }
#fpl-result .fpl-s-thema{ display:block; font-weight:600; font-size:var(--fs-xs); line-height:1.35;
  min-height:1.35em; }
#fpl-result .fpl-s-fuss{ display:flex; align-items:center; justify-content:center; min-height:22px; }
#fpl-result .fpl-s-wege{ flex:none; display:inline-flex; align-items:center; gap:2px; }
#fpl-result .fpl-s-wege .fpl-weg{ font-size:var(--fs-2xs); padding:2px 6px; }

/* Beim Ziehen: die Karte ist weg, ein Platzhalter haelt ihren Platz, der
   Geist folgt dem Finger. Eine Spalte, in die sie nicht darf, wird blass. */
#fpl-result .fpl-s.zieht{ display:none; }
#fpl-result .fpl-s-platz{ box-sizing:border-box; flex:none; border:2px dashed var(--brand);
  border-radius:var(--r-control); background:var(--brand-soft); }
#fpl-result .fpl-s-geist{ position:absolute; z-index:80; margin:0; box-sizing:border-box;
  pointer-events:none; transform:rotate(1.5deg); box-shadow:var(--e-2); }
#fpl-result .fpl-woche.zug-ziel{ border-color:var(--brand); box-shadow:0 0 0 1px var(--brand); }
#fpl-result .fpl-woche.zug-nein{ opacity:.55; }
body.fpl-zug-an, body.fpl-zug-an *{ cursor:grabbing !important; user-select:none !important;
  -webkit-user-select:none !important; }
@media (prefers-reduced-motion: reduce){
  #fpl-result .fpl-s-geist{ transform:none; }
  #fpl-result .fpl-woche, #fpl-result .fpl-w-koerper, #fpl-result .fpl-w-innen,
  #fpl-result .fpl-woche.zu .fpl-w-innen, #fpl-result .fpl-w-zu .ic{ transition:none; }
}
#fpl-result .fpl-weg{ appearance:none; background:none; border:0; color:var(--brand); font:inherit;
  font-size:var(--fs-xs); font-weight:700; cursor:pointer; padding:4px; border-radius:var(--r-control); }
#fpl-result .fpl-weg:hover{ background:var(--brand-soft); }
#fpl-result .fpl-punkt{ color:var(--line); }
/* Die Vorlage des Schritts (v2.725.0): nur Art und Zahl, gepflegt im
   SchlauHeft - hier ein stilles Abzeichen neben der Stundenart. */
/* Das Buch oeffnet die Seite dieser Stunde im SchlauHeft (fplHeftZeigen). */
#fpl-result .fpl-s-vorl{ appearance:none; flex:none; display:inline-flex; align-items:center; justify-content:center;
  width:22px; height:20px; padding:0; border:0; color:var(--brand); border-radius:var(--r-control);
  background:var(--brand-soft); cursor:pointer; }
#fpl-result .fpl-s-vorl:hover{ background:var(--brand); color:var(--card); }
#fpl-result .fpl-fehlerzeile{ margin-bottom:4px; }
#fpl-result .fpl-fehler{ color:var(--bad-ink); }
#fpl-result .fpl-laeuft{ color:var(--muted); }

/* Die Art ist ein Knopf in der Form des bisherigen blauen Etiketts.
   Leer: gestrichelt mit „+" - die Luecke soll auffallen. */
#fpl-result .fpl-menuwrap{ position:relative; display:inline-flex; flex:none; }
#fpl-result .fpl-art{ appearance:none; display:inline-flex; align-items:center; gap:4px;
  border:1px solid transparent; background:var(--brand-soft); color:var(--brand-dk);
  font:inherit; font-size:var(--fs-2xs); font-weight:700; line-height:1.6; white-space:nowrap;
  padding:0 8px; border-radius:999px; cursor:pointer; }
#fpl-result .fpl-art:hover{ border-color:var(--brand); }
#fpl-result .fpl-art.pruef{ background:var(--amber-soft); color:var(--amber-ink); }
#fpl-result .fpl-art.pruef:hover{ border-color:var(--amber); }
#fpl-result .fpl-art.leer{ background:none; border:1px dashed var(--line); color:var(--muted); padding:2px 8px; }
#fpl-result .fpl-art.leer:hover{ border-color:var(--brand); color:var(--brand); }
#fpl-result .fpl-mehr{ appearance:none; display:inline-flex; align-items:center; justify-content:center;
  width:28px; height:28px; background:none; border:0; color:var(--muted); cursor:pointer;
  border-radius:var(--r-control); }
#fpl-result .fpl-mehr:hover,
#fpl-result .fpl-menuwrap.offen > .fpl-mehr{ background:var(--surface-subtle); color:var(--ink); }

#fpl-result .fpl-menu{ position:absolute; left:0; top:calc(100% + 4px); z-index:70;
  min-width:232px; max-width:min(320px, 88vw); background:var(--card); border:1px solid var(--line);
  border-radius:var(--r-card); box-shadow:var(--e-2); padding:4px; }
#fpl-result .fpl-menu.rechts{ left:auto; right:0; }
#fpl-result .fpl-menu button{ display:flex; width:100%; align-items:center; gap:8px; background:none;
  border:0; border-radius:var(--r-control); padding:8px 12px; font:inherit; font-size:var(--fs-sm);
  text-align:left; color:var(--ink); cursor:pointer; }
#fpl-result .fpl-menu button:hover{ background:var(--surface-subtle); }
#fpl-result .fpl-menu button.an{ background:var(--brand-soft); }
#fpl-result .fpl-menu button.gefahr{ color:var(--bad-ink); }
#fpl-result .fpl-menu button.leise{ color:var(--muted); }
#fpl-result .fpl-menu.oben{ top:auto; bottom:calc(100% + 4px); }
/* Die Arten: zwei Spalten, ein Klick. */
#fpl-result .fpl-menu.arten{ display:grid; grid-template-columns:1fr 1fr; gap:4px; min-width:0;
  width:240px; }
#fpl-result .fpl-menu .fpl-menu-art{ justify-content:center; padding:8px; font-size:var(--fs-xs);
  font-weight:700; color:var(--brand-dk); background:var(--surface-subtle); }
#fpl-result .fpl-menu .fpl-menu-art:hover{ background:var(--brand-soft); }
#fpl-result .fpl-menu .fpl-menu-art.pruef{ color:var(--amber-ink); }
#fpl-result .fpl-menu .fpl-menu-art.pruef:hover{ background:var(--amber-soft); }
#fpl-result .fpl-menu .fpl-menu-art.an{ background:var(--brand); color:var(--card); }
#fpl-result .fpl-menu .fpl-menu-art.pruef.an{ background:var(--amber-ink); color:var(--card); }
#fpl-result .fpl-menu .fpl-menu-breit{ grid-column:1 / -1; justify-content:center; }

#fpl-result .fpl-std-leer{ display:flex; flex-direction:column; gap:6px; }
#fpl-result .fpl-knopf{ appearance:none; display:inline-flex; align-items:center; justify-content:center; gap:4px;
  background:var(--card); border:1px solid var(--line); color:var(--ink); border-radius:var(--r-control);
  font:inherit; font-size:var(--fs-xs); font-weight:600; padding:4px 12px; cursor:pointer; }
#fpl-result .fpl-knopf:hover{ border-color:var(--brand); }
#fpl-result .fpl-knopf.leise{ border-style:dashed; color:var(--muted); }
#fpl-result .fpl-plus{ appearance:none; display:inline-flex; align-items:center; justify-content:center; gap:4px;
  background:none; border:1px dashed var(--line); color:var(--muted); border-radius:var(--r-control);
  font:inherit; font-size:var(--fs-xs); font-weight:700; padding:4px 12px; cursor:pointer; }
#fpl-result .fpl-plus:hover{ border-color:var(--brand); color:var(--brand); }

/* Unten: die naechste Woche. Gestrichelt wie jede Stelle, an der etwas
   dazukommt. */
#fpl-result .fpl-neu{ display:flex; align-items:center; gap:8px; flex-wrap:wrap;
  border:1px dashed var(--line); border-radius:var(--r-card); padding:12px 16px; }
#fpl-result .fpl-neu-wunsch{ flex:1 1 260px; min-width:0; box-sizing:border-box; border:1px solid var(--line);
  border-radius:var(--r-control); background:var(--card); color:var(--ink); font:inherit;
  font-size:var(--fs-sm); padding:8px 12px; }
#fpl-result .fpl-neu-wunsch:focus{ outline:2px solid var(--brand); outline-offset:-1px; }
#fpl-result .fpl-neu .btn{ width:auto; margin:0; padding:8px 16px; font-size:var(--fs-sm); }
#fpl-result .fpl-neu-hinweis{ flex:1 0 100%; font-size:var(--fs-xs); color:var(--muted); }
#fpl-result .fpl-neu-hinweis:empty{ display:none; }
#fpl-result .fpl-neu-hinweis.fehler{ color:var(--bad-ink); }

/* Schmal: die Tafel hat von selbst EINE Spalte (auto-fill). Hier nur, was
   der Daumen braucht: ein Griff, den man trifft, und volle Knoepfe unten.
   Tablet und Rechner bleiben, wie sie sind. */
@media (max-width:640px){
  #fpl-result .fpl-griff{ min-height:40px; padding:0 10px 0 4px; }
  #fpl-result .fpl-neu .btn{ flex:1 1 100%; }
}
/* ===== /THEMENFAHRPLAN BEARBEITEN ===== */

/* Persoenliche Fahrplan-Freigabe: dieselbe Ueberlagerungssprache wie die
   kleinen Auswahlfenster, aber mit einer scrollbaren Personenliste. */
.fpl-share-overlay{ position:fixed; inset:0; z-index:10040; display:flex; align-items:center;
  justify-content:center; padding:18px; background:color-mix(in srgb,var(--ink) 38%,transparent); }
.fpl-share-dialog{ width:min(480px,100%); max-height:min(680px,calc(var(--vh100) - 36px)); display:flex;
  flex-direction:column; background:var(--card); color:var(--ink); border:1px solid var(--line);
  border-radius:var(--r-card); box-shadow:var(--e-3); padding:18px; }
.fpl-share-dialog > p{ margin:8px 0 14px; color:var(--muted); font-size:var(--fs-sm); }
.fpl-share-head,.fpl-share-fuss{ display:flex; align-items:center; justify-content:space-between; gap:10px; }
.fpl-share-head > button{ appearance:none; border:0; background:none; color:var(--muted);
  cursor:pointer; padding:6px; border-radius:var(--r-control); }
.fpl-share-head > button:hover{ background:var(--surface-subtle); color:var(--ink); }
.fpl-share-list{ min-height:96px; overflow:auto; border-block:1px solid var(--line); padding:6px 0; }
.fpl-share-person{ display:flex; align-items:center; gap:10px; padding:8px; cursor:pointer;
  border-radius:var(--r-control); }
.fpl-share-person:hover{ background:var(--surface-subtle); }
.fpl-share-person input{ width:18px; height:18px; accent-color:var(--brand); }
.fpl-share-avatar{ display:inline-flex; align-items:center; justify-content:center; width:34px; height:34px;
  border-radius:50%; background:var(--brand-soft); color:var(--brand-dk); font-weight:800; flex:none; }
/* Der Stand je Person (v2.731.0): eine offene Einladung traegt statt des
   Hakens den Knopf „Zurueckziehen"; die Zeile ist dann kein Label mehr. */
.fpl-share-name{ display:flex; flex-direction:column; min-width:0; flex:1 1 auto; }
.fpl-share-stand{ font-style:normal; font-size:var(--fs-xs); color:var(--muted); }
.fpl-share-offen{ cursor:default; }
.fpl-share-zurueck{ appearance:none; border:1px solid var(--line); background:var(--card);
  color:var(--ink); border-radius:999px; padding:5px 10px; font-family:inherit;
  font-size:var(--fs-xs); font-weight:700; cursor:pointer; flex:none;
  display:inline-flex; align-items:center; gap:5px; }
.fpl-share-zurueck:hover{ border-color:var(--bad); color:var(--bad); background:var(--bad-soft); }
.fpl-share-fuss{ justify-content:flex-end; padding-top:14px; }
.fpl-share-fuss .btn{ width:auto; margin:0; }
.fpl-share-leer{ padding:18px 8px; color:var(--muted); text-align:center; font-size:var(--fs-sm); }
.fpl-invite-actions{ display:inline-flex; align-items:center; gap:6px; margin-left:auto; flex:none; }
.fpl-invite-actions button{ appearance:none; border:1px solid var(--line); background:var(--card);
  color:var(--ink); border-radius:var(--r-control); padding:6px 10px; font:inherit;
  font-size:var(--fs-xs); font-weight:700; cursor:pointer; white-space:nowrap; }
.fpl-invite-actions button:hover{ border-color:var(--brand); }
.fpl-invite-actions button.annehmen{ background:var(--brand); border-color:var(--brand); color:var(--card); }
.pf-fpl-actions{ margin:10px 0 0; }
.t-ico-fpl{ background:var(--brand-soft); color:var(--brand); }
.mtl-ico-fpl{ background:var(--brand-soft); color:var(--brand); }
@media (max-width:640px){
  .fpl-invite-actions{ flex-direction:column; align-items:stretch; }
  .fpl-invite-actions button{ padding:5px 8px; }
}

/* ===========================================================================
   DIE BLOCKARTEN (Unterrichtsbuch Faz 3b, v2.427.0)
   ---------------------------------------------------------------------------
   Sechs Kaesten: Ablauf, Liste, Tabelle, Ampel, Timer, Link. Alle leben im
   Blockraster der rechten Kalenderspalte und skalieren mit ihm - die Groessen
   sind deshalb durchweg in `em` bzw. `cqw` angegeben und NICHT in festen
   Pixeln. Ein fester Wert hier waere die eine Zeile, die beim Schrumpfen
   stehen bleibt und den Kasten sprengt.

   KEIN FESTER FARBWERT. Auch die Ampel nicht: ihre drei Toene kommen aus dem
   Woerterbuch (--ok / --amber / --bad).
   ======================================================================== */

/* Kopfzeile eines freien Kastens: Name links, Wegwerfen rechts. */
.kh-bk-kopf{ display:flex; align-items:center; gap:6px; }
.kh-bk-name{ flex:1; min-width:0; overflow:hidden;
  text-overflow:ellipsis; white-space:nowrap; }
.kh-bk-x{ appearance:none; border:0; background:transparent;
  color:var(--muted); cursor:pointer; font-size:1.15em; line-height:1;
  padding:0 .2em; flex:none; font-family:inherit; }
.kh-bk-x:hover{ color:var(--bad); }

/* Der Titel eines Kastens - eine Zeile, ohne Rahmen, damit er wie eine
   Ueberschrift aussieht und nicht wie ein Formularfeld. */
.kh-bk-titel{ appearance:none; border:0; background:transparent;
  color:var(--ink); font-family:inherit; font-size:1em; font-weight:700;
  width:100%; padding:0 0 .35em; margin:0; }
.kh-bk-titel::placeholder{ color:var(--muted); font-weight:600; }

/* Kleine Felder in Kaesten - eine gemeinsame Sprache fuer alle Arten. */
.kh-bk-inhalt input[type="text"],
.kh-bk-inhalt input[type="url"],
.kh-bk-inhalt input[type="number"]{
  appearance:none; border:1px solid var(--line); background:var(--paper);
  color:var(--ink); border-radius:.5em; padding:.25em .45em;
  font-family:inherit; font-size:1em; min-width:0; }
.kh-bk-inhalt input:focus{ outline:none; border-color:var(--brand); }
/* PRAESENTIEREN IST DER GRUNDZUSTAND. Eingabeflaechen, Hinzufuegen- und
   Entfernen-Knoepfe werden erst nach dem Griff sichtbar. Der gespeicherte
   Text bleibt davor lesbar, aber sieht nicht wie ein Formular aus. */
.kh-block:not(.kh-aktiv) .kh-bk-inhalt input[type="text"],
.kh-block:not(.kh-aktiv) .kh-bk-inhalt input[type="url"],
.kh-block:not(.kh-aktiv) .kh-bk-inhalt input[type="number"],
.kh-block:not(.kh-aktiv) .kh-bk-inhalt textarea{
  border-color:transparent; background:transparent; padding-left:0;
  padding-right:0; pointer-events:none; }
.kh-block:not(.kh-aktiv) .kh-bk-inhalt input::placeholder,
.kh-block:not(.kh-aktiv) .kh-bk-inhalt textarea::placeholder{ color:transparent; }
.kh-block:not(.kh-aktiv) .kh-bk-inhalt [data-feld$="-neu"],
.kh-block:not(.kh-aktiv) .kh-bk-inhalt [data-feld$="-weg"],
.kh-block:not(.kh-aktiv) .kh-tab-akt,
.kh-block:not(.kh-aktiv) .kh-bild-x{ display:none; }
.kh-block:not(.kh-aktiv) .kh-bk-inhalt .hint{ display:none; }
.kh-zeile-neu,
.kh-zeile-x{ appearance:none; border:1px solid var(--line);
  background:var(--card); color:var(--muted); border-radius:999px;
  padding:.18em .7em; font-family:inherit; font-size:.85em; font-weight:650;
  cursor:pointer; flex:none; line-height:1.5; }
.kh-zeile-neu:hover{ border-color:var(--brand); color:var(--brand); }
.kh-zeile-x:hover{ border-color:var(--amber); color:var(--amber-ink); }

/* ---- Ablauf: Thema, Bildwahl, Inhalt und Zeit haben eigene Flaechen ---- */
.kh-block[data-block="ablauf"] .kh-bk-inhalt{ overflow:auto; }
.kh-ablauf{ --ab-ink:var(--ink); --ab-muted:var(--muted); --ab-linie:var(--line);
  display:flex; flex-direction:column; gap:.75em; min-width:0; padding:1em;
  border-radius:var(--r-card); color:var(--ab-ink); }
.kh-ab-grund-weiss{ background:var(--card); }
.kh-ab-grund-creme{ background:var(--amber-soft); }
.kh-ab-grund-gruen{ background:var(--brand-soft); }
.kh-ab-grund-blau{ background:var(--fach-mathematik-soft); }
.kh-ab-dunkel{ --ab-ink:var(--on-brand); --ab-muted:rgb(255 255 255 / .76); --ab-linie:rgb(255 255 255 / .25); }
.kh-ablauf .kh-ab-thema,.kh-ablauf .kh-ab-was{ display:block; box-sizing:border-box;
  width:100%; min-width:0; min-height:0; margin:0; padding:.25em 0; resize:none; overflow:hidden;
  border:1px solid transparent; border-radius:.35em; background:transparent; color:var(--ab-ink);
  font:inherit; line-height:1.35; }
.kh-ablauf .kh-ab-thema{ flex:none; font-size:1.35em; font-weight:800; text-align:center;
  padding:.25em .35em .6em; border-bottom:1px solid var(--ab-linie); }
.kh-ab-thema:placeholder-shown:not(:focus){ display:none; }
.kh-aktiv .kh-ab-thema:placeholder-shown{ display:block; }
.kh-ab-zeile{ display:grid; grid-template-columns:3.7em minmax(0,1fr) auto;
  align-items:center; gap:.8em; min-width:0; padding:.65em .5em; border:1px solid transparent;
  border-radius:1em; transition:box-shadow .2s,background-color .2s,opacity .2s; }
.kh-ab-symbol{ display:grid; place-items:center; width:3.7em; height:3.7em; flex:none;
  padding:.15em; border:1px solid var(--ab-linie); border-radius:.9em;
  background:rgb(255 255 255 / .58); cursor:default; color:var(--ab-ink); }
#kh-raster .kh-ab-symbol img{ display:block; width:100%; height:100%; min-width:0; min-height:0; max-height:100%; object-fit:contain; }
.kh-block:not(.kh-aktiv) .kh-ab-symbol{ pointer-events:none; }
.kh-aktiv .kh-ab-symbol{ cursor:pointer; border-style:dashed; }
.kh-aktiv .kh-ab-symbol:hover{ border-color:var(--brand); box-shadow:var(--e-1); }
.kh-ab-schritt{ min-width:0; display:grid; gap:.55em; }
.kh-ablauf .kh-ab-was{ font-weight:650; }
.kh-aktiv .kh-ab-was:focus,.kh-aktiv .kh-ab-thema:focus{ background:rgb(255 255 255 / .12); border-color:var(--brand); }
.kh-ab-steuerung{ display:grid; grid-template-columns:2.3em 3.6em; align-items:center; gap:.12em .4em; }
.kh-ab-steuerung output{ font-size:1.3em; font-weight:800; text-align:right; font-variant-numeric:tabular-nums; line-height:1.3; }
.kh-ab-zeit{ grid-column:2; display:flex; align-items:center; justify-content:flex-end; gap:.2em;
  margin:0; font-size:.85em; color:var(--ab-muted); font-variant-numeric:tabular-nums; }
.kh-ablauf input.kh-ab-min{ background:transparent; width:2.4em; min-width:0 !important; text-align:right; color:inherit;
  font-size:inherit; font-weight:650; padding:0; appearance:textfield !important; }
.kh-ab-min::-webkit-inner-spin-button,.kh-ab-min::-webkit-outer-spin-button{ appearance:none; margin:0; }
.kh-ab-play,.kh-ab-einstellung button{ display:grid; place-items:center; appearance:none; border:0;
  background:rgb(255 255 255 / .6); color:var(--brand); cursor:pointer; border-radius:50%; padding:.5em; }
.kh-ab-play{ pointer-events:auto; width:2.3em; height:2.3em; min-width:32px; min-height:32px; }
.kh-ab-play:hover{ background:var(--brand-soft); }
.kh-ab-play svg,.kh-ab-einstellung svg{ width:1.15em; height:1.15em; fill:none; stroke:currentColor; stroke-width:2; }
.kh-ab-zeile .kh-zeile-x{ grid-column:3; justify-self:end; }
.kh-ab-einstellung{ display:none; }
.kh-aktiv .kh-ab-einstellung{ display:flex; flex:none; justify-content:space-between; gap:.5em; align-items:center; }
.kh-ab-einstellung label{ display:flex; align-items:center; gap:.6em; margin:0; font-size:.85em; color:var(--ab-muted); }
.kh-ab-einstellung input[type="color"]{ display:block; width:36px; height:30px; padding:2px;
  border:1px solid var(--ab-linie); border-radius:8px; cursor:pointer; background:transparent; }
.kh-ab-schritt progress{ display:block; width:100%; height:.45em; border:0; border-radius:999px;
  overflow:hidden; accent-color:var(--brand); background:var(--ab-linie); }
.kh-ab-schritt progress::-webkit-progress-bar{ background:var(--ab-linie); border-radius:999px; }
.kh-ab-schritt progress::-webkit-progress-value{ background:var(--brand); border-radius:999px; }
.kh-ab-schritt progress::-moz-progress-bar{ background:var(--brand); border-radius:999px; }
.kh-ab-laeuft{ border-color:var(--brand); background:color-mix(in srgb,var(--brand-soft) 25%,transparent);
  box-shadow:0 0 0 1px color-mix(in srgb,var(--brand) 55%,transparent),0 0 16px color-mix(in srgb,var(--brand) 40%,transparent),inset 0 0 12px color-mix(in srgb,var(--brand) 10%,transparent); }
.kh-ab-laeuft .kh-ab-play{ background:var(--brand); color:var(--on-brand); }
.kh-ab-laeuft progress::-webkit-progress-value{ background:color-mix(in srgb,var(--brand) 65%,var(--card)); box-shadow:0 0 8px var(--brand); }
.kh-ab-fertig{ opacity:.48; }
.kh-ab-fertig .kh-ab-was{ text-decoration:line-through; text-decoration-thickness:1px; }
.kh-aktiv .kh-ab-fertig{ opacity:.7; }
#kh-ab-bedienung{ position:absolute; inset:0; z-index:4; pointer-events:none; overflow:hidden; }
#kh-ab-bedienung button{ position:absolute; pointer-events:auto; opacity:0; border:0; padding:0; touch-action:manipulation; cursor:pointer; }
#kh-ab-symbolwahl{ z-index:10030; }
.kh-ab-ohnezeit progress,.kh-ab-ohnezeit .kh-ab-steuerung{ display:none; }
.kh-aktiv .kh-ab-ohnezeit .kh-ab-steuerung{ display:block; }
.kh-ab-ohnezeit .kh-ab-play,.kh-ab-ohnezeit output{ display:none; }

/* Ein Titel je Phase. Die ganze Zeile schaltet, auch im Stiftmodus. */
.kh-ab-smart{ position:relative; grid-template-columns:3.7em minmax(0,1fr); }
.kh-ab-smartablauf .kh-ab-was{ text-align:center; }
.kh-ab-smart .kh-ab-phasenknopf{ position:absolute; inset:0; z-index:1;
  width:100%; height:100%; padding:0; border:0; border-radius:inherit;
  background:transparent; cursor:pointer; touch-action:manipulation; }
.kh-ab-phasenknopf:focus-visible{ outline:2px solid var(--brand); outline-offset:3px; }
.kh-ab-smart .kh-ab-steuerung:empty{ display:none; }
.kh-aktiv .kh-ab-smart{ grid-template-columns:3.7em minmax(0,1fr) auto; }
.kh-ab-smart .kh-ab-steuerung{ grid-template-columns:1.8em; }
.kh-ab-abschluss{ display:grid; place-items:center; width:1.8em; height:1.8em;
  border:0; border-radius:var(--r-control); background:transparent; color:var(--brand); cursor:pointer; }
.kh-ab-abschluss svg{ width:1.3em; height:1.3em; }
.kh-bk-leiste select{ max-width:14em; font:inherit; color:var(--ink); background:var(--card); border:1px solid var(--line); border-radius:var(--r-control); }


/* Dieselbe glaeserne Palette fuer alle Papierformate. Nur die Tafel
   fuellt die Schreibflaeche; A4/16:9/Endlos behalten ihre Abmessungen. */
body.uh-vollbild #kh-pano{ padding:0; gap:0; }
body.uh-vollbild #kh-pano .kh-kopf{ position:absolute; top:calc(12px + env(safe-area-inset-top)); left:50%; transform:translateX(-50%); z-index:30;
  width:min(820px, calc(100% - 24px)); max-width:calc(100% - 24px); padding:6px 10px; margin:0; border:1px solid rgb(255 255 255 / .65);
  border-radius:var(--r-pill); background:rgb(255 255 255 / .72); backdrop-filter:blur(18px) saturate(1.3); -webkit-backdrop-filter:blur(18px) saturate(1.3); box-shadow:var(--e-2); }
body.uh-vollbild #kh-pano .kh-akt{ display:flex; width:100%; gap:8px; justify-content:space-between; }
body.uh-vollbild #kh-pano.hs-tafel .kh-buehne{ width:100%; height:100%; min-height:0; margin:0; padding:0; scrollbar-gutter:auto; background:var(--card); }
body.uh-vollbild #kh-pano.hs-tafel .kh-raster.hs-fest{ min-height:100%; margin:0; box-shadow:none; }
body.uh-vollbild #kh-pano .kh-kopf:has(.kh-kopf-txt:not(.hidden)){ border-radius:var(--r-card); width:min(900px, calc(100% - 24px)); }
@media(max-width:640px){
  body.uh-vollbild #kh-pano.hs-tafel .kh-raster.hs-fest{ display:block; }
  body.uh-vollbild #kh-pano.hs-tafel .kh-raster .kh-block{ position:absolute; }
  body.uh-vollbild #kh-pano .kh-kopf{ padding:4px; max-width:calc(100% - 12px); }
  body.uh-vollbild #kh-pano .kh-akt{ gap:2px; }
}

/* ---- Liste ------------------------------------------------------------- */
.kh-liste{ display:flex; flex-direction:column; gap:.3em; }
.kh-li-zeile{ display:flex; align-items:center; gap:.4em; }
.kh-li-zeile input[type="checkbox"]{ width:1em; height:1em;
  flex:none; accent-color:var(--brand); }
.kh-li-text{ flex:1; min-width:0; }

/* ---- Tabelle -----------------------------------------------------------
   Sie darf breiter sein als der Kasten - dann scrollt SIE, nicht die Seite.
   Eine Tabelle, die den Kasten sprengt, verschiebt das ganze Raster. */
.kh-block[data-block="tabelle"] .kh-bk-inhalt{ display:flex; flex-direction:column; }
.kh-tab-huelle{ overflow-x:auto; -webkit-overflow-scrolling:touch;
  flex:1 1 auto; min-height:0; display:flex; }
.kh-tab{ border-collapse:collapse; width:100%; height:100%; }
.kh-tab th,
.kh-tab td{ border:1px solid var(--line); padding:0; }
.kh-tab input{ border:0 !important; border-radius:0 !important;
  background:transparent !important; width:100%; padding:.3em .4em !important; }
.kh-tab th input{ font-weight:700; }
.kh-tab-akt{ display:flex; gap:.35em; flex-wrap:wrap; margin-top:.4em; }

/* ---- Ampel -------------------------------------------------------------
   Drei Kreise aus dem Woerterbuch - KEINE fremden Piktogramme. Die des
   Vorbilds tragen ARASAAC · CC BY-NC-SA; das NC heisst nicht-kommerziell,
   und SchlauStart verkauft Lizenzen (PLAN §9). */
/* EIN GEGENSTAND, KEIN BEDIENELEMENT (v2.436.0). Drei graue Punkte in einer
   Reihe muss man deuten; ein Gehaeuse mit drei Lampen erkennt jedes Kind aus
   der letzten Reihe. Alles CSS - kein Bild, keine fremde Datei, keine
   Lizenzfrage (PLAN §9: ARASAAC & Co. sind gesperrt). */
.kh-block[data-block="ampel"] .kh-bk-inhalt{ padding:0; overflow:hidden; }
.kh-ampel{ display:flex; align-items:center; justify-content:center;
  width:100%; height:100%; padding:0; }
/* Die Ampel rechnet mit Breite UND Hoehe des Kastens. `em` war hier der
   Fehler: es band den Gegenstand an eine gedeckelte Schriftgroesse und liess
   ihn in einem grossen Kasten winzig stehen. */
.kh-am-box{ display:grid; grid-template-rows:repeat(3,minmax(0,1fr));
  height:min(90cqh,180cqw); width:auto; aspect-ratio:.43; gap:5%;
  padding:9% 11%; box-sizing:border-box; border-radius:18%;
  background:var(--ink); }
.kh-am{ appearance:none; border:0; padding:0; cursor:pointer;
  width:100%; height:auto; min-height:0; aspect-ratio:1; border-radius:50%;
  background:color-mix(in srgb, var(--card) 16%, transparent);
  transition:background .15s, box-shadow .15s; }
.kh-am:hover{ background:color-mix(in srgb, var(--card) 30%, transparent); }
.kh-am-rot{ background:color-mix(in srgb, var(--bad) 52%, var(--ink)); }
.kh-am-gelb{ background:color-mix(in srgb, var(--amber) 58%, var(--ink)); }
.kh-am-gruen{ background:color-mix(in srgb, var(--ok) 58%, var(--ink)); }
.kh-am-rot.an{ background:var(--bad);
  box-shadow:0 0 .7em color-mix(in srgb, var(--bad) 70%, transparent); }
.kh-am-gelb.an{ background:var(--amber);
  box-shadow:0 0 .7em color-mix(in srgb, var(--amber) 70%, transparent); }
.kh-am-gruen.an{ background:var(--ok);
  box-shadow:0 0 .7em color-mix(in srgb, var(--ok) 70%, transparent); }

/* ---- Timer -------------------------------------------------------------
   Er laeuft im Browser. Einen Zaehler auf dem Server zu fuehren hiesse, alle
   zwei Sekunden zu fragen, wie spaet es ist - genau die Hintergrund-Last,
   die in 2.14.0 das Rechenkontingent gekostet hat. */
.kh-timer{ display:flex; flex-direction:column; align-items:center;
  justify-content:center; gap:.35em; height:100%; }
.kh-ti-zeile{ display:flex; align-items:center; gap:.45em; }
.kh-ti-stand{ font-size:2.6em; font-weight:800; color:var(--ink);
  font-variant-numeric:tabular-nums; line-height:1; letter-spacing:-.02em; }
.kh-ti-stand{ font-size:clamp(26px,16cqw,72px); }
.kh-ti-stand.aus{ color:var(--bad-ink); }
.kh-ti-pm{ appearance:none; border:0; background:transparent; color:var(--muted);
  font-family:inherit; font-size:1.4em; line-height:1; cursor:pointer;
  padding:.1em .25em; border-radius:.4em; }
.kh-ti-pm:hover{ color:var(--brand); background:var(--paper); }
.kh-ti-akt{ display:flex; gap:.5em; }
.kh-ti-rund{ appearance:none; border:0; cursor:pointer; padding:0;
  width:2.1em; height:2.1em; border-radius:50%; background:var(--brand);
  color:var(--on-brand); display:inline-flex; align-items:center; justify-content:center; }
.kh-ti-rund svg{ width:1.1em; height:1.1em; fill:currentColor; stroke:none; }
.kh-ti-rund.still{ background:var(--paper); color:var(--muted);
  border:1.5px solid var(--line); }
.kh-ti-rund:hover{ filter:brightness(1.06); }

/* ---- Link -------------------------------------------------------------- */
.kh-link{ display:flex; flex-direction:column; gap:.35em; }
.kh-link-go{ align-self:flex-start; color:var(--brand);
  font-weight:700; text-decoration:none; font-size:.92em; }
.kh-link-go:hover{ text-decoration:underline; }
.kh-link-warn{ color:var(--amber-ink); font-size:.85em; }

/* ---- Das Menue „Block hinzufügen" -------------------------------------- */
/* ---- WIE GETEILT WIRD (uhTeilen, v2.871.0) --------------------------------
   Ein kleines Fenster unter dem Knopf mit den zwei Personen: zwei Arten zu
   teilen, beenden, ein Satz, was Kinder nie sehen. Wie das Stiftmenue ueber
   dem Vollbild (z-index). Das Auge der Stunde steht daneben im Kopf. */
.kh-teilen{ position:fixed; z-index:10020; width:min(340px, calc(100vw - 16px));
  display:flex; flex-direction:column; gap:6px; padding:10px; border-radius:16px;
  background:var(--card); border:1px solid var(--line); box-shadow:var(--shadow); }
.kh-teilen-kopf{ display:flex; flex-direction:column; padding:2px 4px 6px; border-bottom:1px solid var(--line); }
.kh-teilen-kopf b{ font-size:var(--fs-sm); font-weight:800; color:var(--ink); }
.kh-teilen-kopf span{ font-size:var(--fs-xs); color:var(--muted); }
.kh-teilen-art{ appearance:none; display:flex; align-items:flex-start; gap:10px; width:100%; text-align:left;
  padding:8px; border:1px solid transparent; border-radius:12px; background:transparent; font:inherit;
  color:var(--ink); cursor:pointer; }
.kh-teilen-art:hover{ background:var(--brand-soft); }
.kh-teilen-art.on{ border-color:var(--brand); background:var(--brand-soft); }
.kh-teilen-ico{ flex:none; width:32px; height:32px; border-radius:10px; display:inline-flex; align-items:center;
  justify-content:center; background:var(--paper); color:var(--brand); }
.kh-teilen-art.on .kh-teilen-ico{ background:var(--brand); color:var(--on-brand); }
.kh-teilen-ico svg, .kh-teilen-aus svg{ width:18px; height:18px; fill:none; stroke:currentColor; stroke-width:2;
  stroke-linecap:round; stroke-linejoin:round; }
.kh-teilen-txt{ display:flex; flex-direction:column; gap:2px; min-width:0; }
.kh-teilen-txt b{ font-size:var(--fs-sm); font-weight:780; }
.kh-teilen-txt span{ font-size:var(--fs-xs); color:var(--muted); line-height:1.35; }
.kh-teilen-aus{ appearance:none; display:inline-flex; align-items:center; gap:8px; align-self:flex-start;
  padding:6px 8px; border:0; border-radius:10px; background:transparent; font:inherit; font-size:var(--fs-sm);
  font-weight:700; color:var(--muted); cursor:pointer; }
.kh-teilen-aus:hover{ color:var(--bad); background:var(--bad-soft); }
.kh-teilen-fuss{ margin:2px 4px 0; font-size:var(--fs-xs); color:var(--muted); }
/* Das Auge der Stunde: offen in der Farbe von „Klasse sieht mit", zu grau. */
.kh-ib.kh-ib-auge.on{ color:var(--brand); background:var(--brand-soft); }
.kh-ib.kh-ib-auge.zu{ color:var(--muted); }
/* DAS ZAHNRAD (index-app.js uhZahnrad, v2.892.0): ein kleines Menue unter
   dem Zahnrad, rechtsbuendig. „Klasse sieht mit" traegt sein Zeichen gruen,
   solange geteilt ist - wie die gruene Wolke „gespeichert"; das Loeschen
   wird erst beim Zeigen rot (wie vorher der Knopf in der Zeile). */
.kh-ib.kh-ib-zahnrad.on{ color:var(--brand); background:var(--brand-soft); }
.kh-zahnrad{ position:fixed; z-index:10020; min-width:230px; max-width:calc(100vw - 16px);
  display:flex; flex-direction:column; gap:2px; padding:6px; background:var(--card);
  border:1px solid var(--line); border-radius:var(--r-card); box-shadow:var(--shadow); }
.kh-zr-e{ appearance:none; display:flex; align-items:center; gap:10px; min-height:44px; padding:0 12px;
  border:0; border-radius:10px; background:transparent; font:inherit; font-size:var(--fs-sm); font-weight:700;
  color:var(--ink); text-align:left; cursor:pointer; white-space:nowrap; }
.kh-zr-e svg{ width:18px; height:18px; flex:none; fill:none; stroke:currentColor; stroke-width:2;
  stroke-linecap:round; stroke-linejoin:round; color:var(--muted); }
.kh-zr-e:hover{ background:var(--paper); }
.kh-zr-e.an svg{ color:var(--ok); }
.kh-zr-e.weg:hover{ color:var(--bad); background:var(--bad-soft); }
.kh-zr-e.weg:hover svg{ color:var(--bad); }
.kh-menue{ position:fixed; z-index:10020; overflow:auto;
  overscroll-behavior:contain; background:var(--card); border:1px solid var(--line);
  border-radius:var(--r-card); padding:10px;
  display:grid; grid-template-columns:repeat(auto-fit,minmax(76px,1fr)); gap:5px; }
.kh-menue-kopf{ grid-column:1/-1; padding:2px 5px 7px; font-size:12px;
  font-weight:750; color:var(--muted); border-bottom:1px solid var(--line);
  margin-bottom:2px; }
.kh-menue-e{ display:flex; flex-direction:column; align-items:center;
  justify-content:flex-start; gap:5px; min-width:0;
  appearance:none; border:0; background:transparent; color:var(--ink);
  font-family:inherit; text-align:center; padding:7px 3px; border-radius:10px;
  cursor:pointer; width:100%; }
.kh-menue-e:hover{ background:var(--paper); }
.kh-menue-ico{ width:40px; height:40px; flex:none; display:grid; place-items:center;
  border-radius:10px; color:var(--brand); background:var(--brand-soft); }
.kh-menue-ico.kh-mi-gruen{ color:var(--ok); background:color-mix(in srgb,var(--ok) 14%,var(--card)); }
.kh-menue-ico.kh-mi-orange{ color:var(--amber-ink); background:color-mix(in srgb,var(--amber) 18%,var(--card)); }
.kh-menue-ico.kh-mi-rot{ color:var(--bad-ink); background:color-mix(in srgb,var(--bad) 13%,var(--card)); }
.kh-menue-ico.kh-mi-tuerkis{ color:var(--brand); background:color-mix(in srgb,var(--brand) 10%,var(--card)); }
.kh-menue-ico.kh-mi-pink{ color:var(--brand); background:color-mix(in srgb,var(--brand) 11%,var(--card)); }
.kh-menue-ico.kh-mi-violett{ color:var(--brand); background:color-mix(in srgb,var(--brand) 15%,var(--card)); }
.kh-menue-e svg{ width:22px; height:22px; flex:none; fill:none;
  stroke:currentColor; stroke-width:1.8; stroke-linecap:round; stroke-linejoin:round;
  color:inherit; }
.kh-menue-e b{ display:block; width:100%; overflow:hidden; text-overflow:ellipsis;
  white-space:nowrap; font-size:11.5px; line-height:1.2; font-weight:650; }
/* Die rechtliche Zusage steht genau dort, wo ein neues Textfeld entsteht. */
.kh-menue-recht{ grid-column:1/-1; margin:7px 4px 2px; font-size:11px;
  color:var(--muted); line-height:1.45; }
/* Zweite Ebene: die Tafelbilder, nach Fach gruppiert (uhTafelbildWahl). */
.kh-tbw-kopf{ display:flex; align-items:center; gap:8px; }
.kh-tbw-zurueck{ appearance:none; border:0; background:transparent; padding:2px 6px 2px 2px;
  display:inline-flex; align-items:center; gap:2px; font-family:inherit; font-size:12px;
  font-weight:650; color:var(--brand); border-radius:var(--r-control); cursor:pointer; }
.kh-tbw-zurueck:hover{ background:var(--paper); }
.kh-tbw-zurueck svg{ width:16px; height:16px; fill:none; stroke:currentColor;
  stroke-width:2; stroke-linecap:round; stroke-linejoin:round; }
.kh-tbw-fach{ grid-column:1/-1; margin:4px 4px 0; font-size:11px; font-weight:750;
  letter-spacing:.02em; text-transform:uppercase; color:var(--muted); }
/* Zwei Woerter („Bruch erweitern") duerfen umbrechen - abgeschnitten
   („Bruch erw…") unterscheidet sie niemand mehr. */
.kh-tbw-e b{ white-space:normal; line-height:1.15; }

/* Im Vollbild ist mehr Platz - das Menue bleibt trotzdem in Griffweite oben
   rechts, wo der Knopf steht, der es geoeffnet hat. */
body.uh-vollbild .kh-menue{ z-index:10020; }

/* ===========================================================================
   DIE TAGESSPALTE WIRD SCHMAL (v2.428.0)
   ---------------------------------------------------------------------------
   Befund Murat 24.08.2026: „soldaki saatler ve satirlari daralt ve text
   boyutunu 7px filan yap. kücük olsun."

   WARUM DAS RICHTIG IST UND NICHT NUR EIN WUNSCH: Die Uhrzeiten sind
   Beiwerk. Sie sagen, WO man im Tag ist - der Platz gehoert dem, was in der
   Stunde passiert, und seit die rechte Spalte daneben steht, ist jeder
   Millimeter links echter Verlust rechts.

   8px STATT 7px: Unter 8px wird die Zeitachse auf einem Retina-Schirm zwar
   noch gerendert, auf einem gewoehnlichen 1x-Bildschirm aber matschig, und
   iOS beginnt ab dieser Grenze eigenmaechtig zu vergroessern. 8px ist die
   kleinste Groesse, die ueberall dasselbe zeigt.

   NUR IN DER TAGESANSICHT. In Woche und Monat steht die Achse neben fuenf
   bzw. dreissig Spalten; dort ist sie nicht der Engpass, und eine winzige
   Achse waere dort nur schlechter lesbar. */
#kal-host .fc-timeGridDay-view .fc-timegrid-slot-label-cushion,
#kal-host .fc-timeGridDay-view .fc-timegrid-axis-cushion{
  font-size:8px; padding:0 3px; letter-spacing:-.02em;
}
#kal-host .fc-timeGridDay-view .fc-timegrid-axis-cushion{ max-width:34px; }
/* Die Zeilen selbst niedriger: bei 06–20 Uhr sind das ueber 100 px Gewinn. */
#kal-host .fc-timeGridDay-view .fc-timegrid-slot{ height:1.35em; }
#kal-host .fc-timeGridDay-view .fc-timegrid-slot-minor{ border-top-style:none; }

/* ===========================================================================
   DER ORT/RAUM ALS ZWEITE ZEILE IM TERMIN (v2.700.0)
   ---------------------------------------------------------------------------
   Befund Murat 10.09.2026: „konum bilgisi yazilmamis." Der Raum steht jetzt
   unter dem Titel - ruhiger als dieser (kleiner, gedimmt), damit die Zeile
   Auskunft gibt und nicht mit dem Fach um Aufmerksamkeit ringt. Eine Zeile,
   kein Umbruch: in einem Kaestchen von 40 px ist Platz fuer genau eine.

   In der LISTENANSICHT steht er dagegen hinter dem Titel - dort ist die
   Zeile breit und eine zweite Zeile je Termin machte die Liste doppelt so
   lang, ohne mehr zu sagen. */
#kal-host .kal-ev-ort{ display:block; font-size:.92em; opacity:.72;
  overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
#kal-host .fc-list-event-title .kal-ev-ort{ display:inline; margin-left:7px; }
#kal-host .fc-list-event-title .kal-ev-ort::before{ content:"· "; }

/* ===========================================================================
   DIE KALENDER-KOPFLEISTE IN DER TITELZEILE (v2.428.0)
   ---------------------------------------------------------------------------
   „o yukaridaki menü kismini kalender yazili basligin oldugu yere koysak
   nasil olur? böylelikle daha cok icerik kalir." Die Leiste stand als eigene
   Zeile IN der Karte und kostete dort rund 50 px Hoehe. Neben „Kalender ·
   24. August 2026" ist der Platz ohnehin leer.

   Verschoben wird das ELEMENT (kalBarInTitelzeile), nicht eine zweite
   Fassung gebaut - deshalb reichen hier ein paar Abstandsregeln. */
.app-topbar .kal-bar-oben{ margin:0 0 0 auto; display:flex; align-items:center;
  min-width:0; }
.app-topbar .kal-bar-oben .kal-topbar{ margin:0; gap:7px; flex-wrap:nowrap; }
.app-topbar .kal-bar-oben .kal-mitte{ display:flex; align-items:center; gap:7px; }
.app-topbar .kal-bar-oben .kal-seg{ margin:0; }
.app-topbar .kal-bar-oben .kal-navgrp{ margin-left:6px; }
/* Buch + Ansichtssegment liegen auf grossen Schirmen wirklich in der
   Fenstermitte, nicht nur irgendwo zwischen Datum und Profil. Die
   Navigation bleibt rechts. Unter 1100 px geht die Gruppe in den normalen
   Fluss zurueck, damit nichts das Profil ueberdeckt. */
@media (min-width:1100px){
  .app-topbar:has(#kal-tb){ position:relative; }
  .app-topbar .kal-bar-oben .kal-mitte{ position:absolute; left:50%;
    transform:translateX(-50%); }
  .app-topbar .kal-bar-oben .kal-navgrp{ margin-left:auto; }
}
@media (max-width:900px){
  /* Am Telefon bricht die Zeile ohnehin um - dann darf die Leiste wieder
     die volle Breite nehmen, statt sich neben den Titel zu quetschen. */
  .app-topbar .kal-bar-oben{ margin:8px 0 0; width:100%; flex:1 0 100%; }
  .app-topbar .kal-bar-oben .kal-topbar{ flex-wrap:wrap; }
  /* DIE KOPFZEILE MUSS DAFUER UMBRECHEN DUERFEN (v2.838.0). Die Regel oben
     setzte seit v2.428.0 voraus, dass `.app-topbar` umbricht - sie tat es
     nie. Folge auf dem iPad hochkant und am Telefon: die Leiste nahm die
     ganze Breite IN derselben Zeile, `#kal-tb` schrumpfte auf 2 px (das
     Datum war weg) und Postfach/Profil standen rechts neben dem Bildschirm.
     Jetzt: Zeile 1 Menue · Datum · Profil, Zeile 2 die Kalenderleiste. */
  body.has-sidebar:not(.lh-fullscreen) .app-topbar:has(#kal-bar.kal-bar-oben){
    flex-wrap:wrap; row-gap:0; }
  /* Die Leiste steht im DOM VOR #authbar; ohne `order` rutschte das Profil
     in eine dritte Zeile. Blaettern rechtsbuendig wie das Profil darueber. */
  .app-topbar #kal-bar.kal-bar-oben{ order:1; }
  /* Basis 0: das Datum kuerzt, statt das Profil in die naechste Zeile zu
     schieben - in einer umbrechenden Zeile bricht Flex sonst VOR dem
     Schrumpfen um. */
  .app-topbar:has(#kal-bar.kal-bar-oben) #kal-tb{ flex:1 1 0; }
  .app-topbar .kal-bar-oben .kal-topbar{ width:100%; }
  .app-topbar .kal-bar-oben .kal-navgrp{ margin-left:auto; }
}
@media (max-width:640px){
  /* Am Telefon teilt sich das Datum Zeile 1 jetzt mit Postfach und Profil -
     etwas kleiner, damit „September 2026" ganz stehen bleibt. */
  .app-topbar:has(#kal-bar.kal-bar-oben) #kal-tb{ gap:2px; margin-left:4px; }
  .app-topbar:has(#kal-bar.kal-bar-oben) #kal-tb .kal-datum{ font-size:16px; }
  .app-topbar:has(#kal-bar.kal-bar-oben) #kal-tb .kal-flach{ padding:4px 5px; }
  #kal-tb .kal-wort{ display:none; }
}

/* ===========================================================================
   KALENDER-KOPF AUF DEM TABLET (v2.838.0)
   ---------------------------------------------------------------------------
   Befund Murat 25.09.2026: „kalenderde yeni ipadlerde üst taraftaki menüler
   birbirine giriyor ... menüdekilerin boyutlarini kücült gerekirse tag
   liste monat jahr i dik ve yatayda sik secim kutusuna cevir."

   Quer (1133-1376 px) lag das Segment ab 1100 px ABSOLUT in der
   Fenstermitte - ein absolut gesetztes Element haelt keinem Nachbarn Platz
   frei. Mit aufgeklappter Seitenleiste oder der Schul-Kapsel im Profil lief
   das Datum darunter. Hochkant (744-834 px) siehe den Umbruch oben.

   WAS HIER GILT: statt fuenf Segmentknoepfen EIN Auswahlfeld
   (`.kal-views-wahl`, kalBarRender), die Mitte zurueck in den Fluss, alle
   Knoepfe etwas kleiner. Das Datum darf dann kuerzen, aber nichts
   ueberdeckt mehr etwas.

   WELCHE SCHIRME: bis 1099 px jeder (dort war schon am Computer das Datum
   angeschnitten), darueber bis 1400 px nur mit Finger als Hauptzeiger -
   das iPad quer, nicht das Notebook mit 1280 px. Das Telefon (<= 640 px)
   behaelt sein aufklappendes Segment (kalSegAuf). */
.kal-views-wahl{ display:none; }
@media (min-width:641px) and (max-width:1099.98px),
       (min-width:641px) and (max-width:1400px) and (pointer:coarse){
  #kal-bar .kal-seg.kal-views{ display:none; }
  #kal-bar .kal-views-wahl{ display:inline-flex; align-items:center; position:relative;
    flex:none; margin:0; }
  #kal-bar .kal-views-wahl select{ appearance:none; -webkit-appearance:none; margin:0;
    border:0; border-radius:999px; cursor:pointer;
    background:var(--flaeche-akzent,var(--brand)); color:var(--on-brand);
    box-shadow:var(--kal-schatten);
    font-family:inherit; font-size:13.5px; font-weight:700; line-height:1.2;
    padding:7px 32px 7px 15px; }
  #kal-bar .kal-views-wahl select:focus-visible{
    outline:2px solid var(--flaeche-akzent,var(--brand)); outline-offset:2px; }
  #kal-bar .kal-views-wahl::after{ content:""; position:absolute; right:14px; top:50%;
    width:6px; height:6px; margin-top:-5px; pointer-events:none;
    border-right:2px solid var(--on-brand); border-bottom:2px solid var(--on-brand);
    transform:rotate(45deg); }

  .app-topbar .kal-bar-oben .kal-mitte{ position:static; transform:none; gap:4px; }
  .app-topbar .kal-bar-oben .kal-topbar{ gap:4px; }
  .app-topbar .kal-bar-oben .kal-navgrp{ gap:2px; }
  #kal-tb{ gap:4px; }
  #kal-tb .kal-datum{ font-size:clamp(18px,2vw,21px); }
  #kal-tb .kal-flach, #kal-bar .kal-flach{ padding:5px 6px; }
  #kal-tb .kal-flach svg, #kal-bar .kal-flach svg{ width:17px; height:17px; }
  #kal-tb .kal-flach-plus svg{ width:21px; height:21px; }
  /* „Planung" (v2.898.0) nur als Zeichen - das Wort liesse die Titelzeile
     am iPad wieder ueberlaufen. */
  #kal-tb .kal-wort{ display:none; }
  #kal-bar .kal-pfeil{ padding:3px 7px; }
  #kal-bar .kal-today{ font-size:13.5px; padding:5px 8px; }
}

/* Der Knopf, der die fehlende Klasse an Ort und Stelle nachtraegt. */
#upl-fenster .upl-zuordnen{ appearance:none; margin-top:8px; border:1.5px solid var(--brand);
  background:var(--card); color:var(--brand); border-radius:10px; padding:6px 13px;
  font-family:inherit; font-size:13px; font-weight:650; cursor:pointer; }
#upl-fenster .upl-zuordnen:hover{ background:var(--brand-soft); }

/* ===========================================================================
   DER KLEINE TERMIN-DIALOG (v2.429.0)
   ---------------------------------------------------------------------------
   „iki kere tikladigim saat ile baslatan resimdeki gibi minnos bi popupla
   hemen kayit yapabilmeliyim ... mantikli kücük ikonlar kücücük yazilar."

   Er steht dort, wo geklickt wurde, ist rund 300 px breit und zeigt je Zeile
   ein Symbol und ein Feld. Seit v2.504.3 bleiben Art, Fach und eine kurze
   Notiz auch im schnellen Weg erreichbar; Kind und weitere Details liegen
   weiter unter „Mehr …".
   ======================================================================== */
.kt-pop{ position:fixed; z-index:10500; width:300px; max-width:92vw;
  background:var(--card); border-radius:16px; padding:10px;
  box-shadow:0 2px 8px rgba(0,0,0,.10), 0 18px 50px rgba(0,0,0,.22);
  display:flex; flex-direction:column; gap:8px; }
/* Zwei Reiter, keine drei: eine „Erinnerung" taete dasselbe wie „Ereignis". */
.kt-tabs{ display:flex; background:var(--paper); border-radius:999px; padding:2px; gap:2px; }
.kt-tabs button{ flex:1; appearance:none; border:0; background:transparent;
  color:var(--muted); font-family:inherit; font-size:11.5px; font-weight:700;
  padding:5px 6px; border-radius:999px; cursor:pointer; white-space:nowrap; }
.kt-tabs button.on{ background:var(--brand); color:var(--on-brand); }
.kt-body{ display:flex; flex-direction:column; gap:6px;
  max-height:calc(var(--vh100) - 90px); overflow-y:auto; }
.kt-titel{ appearance:none; border:0; border-bottom:1.5px solid var(--line);
  background:transparent; color:var(--ink); font-family:inherit; font-size:14px;
  font-weight:700; padding:3px 2px 6px; width:100%; }
.kt-titel:focus{ outline:none; border-bottom-color:var(--brand); }
.kt-zeile{ display:flex; align-items:center; gap:7px; min-width:0; }
.kt-ico{ flex:none; width:16px; height:16px; color:var(--muted); }
.kt-ico svg{ width:16px; height:16px; fill:none; stroke:currentColor;
  stroke-width:1.8; stroke-linecap:round; stroke-linejoin:round; }
.kt-pop input, .kt-pop select, .kt-pop textarea{ appearance:none; border:1px solid var(--line);
  background:var(--paper); color:var(--ink); border-radius:8px; padding:4px 7px;
  font-family:inherit; font-size:12px; min-width:0; }
.kt-pop input:focus, .kt-pop select:focus, .kt-pop textarea:focus{ outline:none; border-color:var(--brand); }
.kt-notiz{ width:100%; box-sizing:border-box; resize:vertical; min-height:44px; }
.kt-zeit{ width:62px; text-align:center; font-variant-numeric:tabular-nums; }
/* Eine Uhrzeit, die nicht eindeutig ist, wird MARKIERT und nicht geraten -
   dieselbe Regel wie im Server seit Faz 1. */
.kt-zeit.kt-falsch{ border-color:var(--bad); color:var(--bad-ink); }
.kt-bis{ color:var(--muted); font-size:12px; flex:none; }
.kt-datum{ font-size:12px; color:var(--ink); font-weight:650; flex:1; }
.kt-ganz{ display:inline-flex; align-items:center; gap:4px; font-size:11px;
  color:var(--muted); cursor:pointer; flex:none; }
/* Ein Kaestchen ist kein Eingabefeld: die Regel oben gibt allen `input`
   Rahmen, Fond und Radius - auf einer Checkbox wird daraus ein grauer
   Punkt, den niemand als Kaestchen erkennt. */
.kt-pop input[type="checkbox"]{ appearance:auto; -webkit-appearance:checkbox;
  border:0; background:none; padding:0; width:auto; min-width:0;
  accent-color:var(--brand); }
.kt-sel{ flex:1; min-width:0; }
.kt-klein{ flex:1; min-width:0; }
.kt-fachbox{ flex:1; min-width:0; display:flex; gap:5px; }
.kt-fachbox .hidden{ display:none; }
.kt-hinweis{ font-size:11px; color:var(--muted); line-height:1.45; }
.kt-err{ font-size:11.5px; color:var(--bad-ink); }
.kt-fuss{ display:flex; align-items:center; gap:8px; margin-top:2px; }
.kt-mehr{ appearance:none; border:0; background:transparent; color:var(--muted);
  font-family:inherit; font-size:11.5px; font-weight:650; cursor:pointer; padding:4px 2px; }
.kt-mehr:hover{ color:var(--brand); }
.kt-ok{ appearance:none; border:0; background:var(--brand); color:var(--on-brand);
  font-family:inherit; font-size:12.5px; font-weight:700; border-radius:9px;
  padding:6px 16px; cursor:pointer; margin-left:auto; flex:none; }
.kt-ok:hover{ background:var(--brand-dk); }
@media (max-width:640px){
  /* Am Telefon ist „bei der Klickstelle" kein Vorteil - dort ist unten am
     Rand der Ort, den der Daumen erreicht. */
  .kt-pop{ left:8px !important; right:8px; width:auto; top:auto !important;
    bottom:calc(10px + env(safe-area-inset-bottom)); }
}

/* ===========================================================================
   DER TAG ALS LISTE (v2.430.0)
   ---------------------------------------------------------------------------
   „mobilde solda tag görünümünü liste haline getirebilmem mümkün olsun …
   Tag liste gibi saatleriyle aciklamalariyla gösterilir."

   Auf 390 px ist ein Zeitraster von 06 bis 20 Uhr fast leer: vierzehn
   Stunden Linien fuer drei Termine. Die Liste zeigt dieselben drei mit
   Uhrzeit und Titel auf einem Schirm. Es ist FullCalendars eigene Ansicht
   (`listDay`) - eine selbstgebaute Liste waere eine zweite Fassung des
   Tages, und spaeter saehe eine davon anders aus als die andere.
   ======================================================================== */
#kal-host .fc-list{ border-radius:12px; overflow:hidden; }
#kal-host .fc-list-day-cushion{ background:var(--paper); font-size:var(--kal-fs-kopf);
  font-weight:800; color:var(--ink); padding:8px 12px; }
#kal-host .fc-list-event td{ padding:9px 12px; }
#kal-host .fc-list-event-time{ font-size:var(--kal-fs-klein); color:var(--muted);
  font-variant-numeric:tabular-nums; white-space:nowrap; width:1%; }
#kal-host .fc-list-event-title{ font-size:var(--kal-fs-basis); color:var(--ink);
  font-weight:600; }
#kal-host .fc-list-event-title a{ color:inherit; text-decoration:none; }
/* Der farbige Punkt IST die Legende - dieselbe Farbe wie im Raster. */
#kal-host .fc-list-event-dot{ border-width:5px; }
#kal-host .fc-list-empty{ background:transparent; color:var(--muted);
  font-size:var(--kal-fs-basis); padding:26px 12px; }
/* Der Umschalter zwischen Raster und Liste steht neben dem Segment und nur
   im Tag - ein fuenfter Segmentknopf waere auf dem Telefon die Zeile, die
   wieder umbricht. */
#screen-kalender .kal-tagform, .app-topbar .kal-tagform{ width:34px; height:34px; flex:none; }
#screen-kalender .kal-tagform svg, .app-topbar .kal-tagform svg{ width:17px; height:17px; }

/* ===========================================================================
   DER MATERIAL-BLOCK (Unterrichtsbuch Faz 4, v2.431.0)
   ---------------------------------------------------------------------------
   „Verknuepfen, nicht kopieren" (PLAN §4). Der Block zeigt eine Liste von
   VERWEISEN - Kuerzel, Titel, ein Pfeil dorthin, wo das Material lebt. Er
   zeigt das Material NICHT selbst: eine zweite Anzeige waere die zweite
   Fassung, gegen die §4 steht.
   ======================================================================== */
.kh-mat{ display:flex; flex-direction:column; gap:.3em; }
.kh-mat-leer{ margin:0 0 .3em; color:var(--muted); font-size:.9em; }
.kh-mat-z{ display:flex; align-items:center; gap:.4em; min-width:0; }
/* Das Kuerzel ist bewusst ein BUCHSTABE und kein Bild: es muss in einem
   1-Spalten-Kasten mit 11 px noch lesbar sein, und ein Symbolsatz fuer acht
   Materialarten waere acht Entscheidungen, die keine Frage beantworten. */
.kh-mat-ico{ flex:none; width:1.5em; height:1.5em; border-radius:.35em;
  background:var(--brand-soft); color:var(--brand-dk); font-size:.78em;
  font-weight:800; display:inline-flex; align-items:center; justify-content:center; }
.kh-mat-ico svg{ width:70%; height:70%; fill:none; stroke:currentColor;
  stroke-width:1.9; stroke-linecap:round; stroke-linejoin:round; }
.kh-mat-t{ flex:1; min-width:0; overflow:hidden; text-overflow:ellipsis;
  white-space:nowrap; }
.kh-mat-go{ appearance:none; border:0; background:transparent; color:var(--brand);
  font-family:inherit; font-size:1.2em; font-weight:800; line-height:1;
  cursor:pointer; padding:0 .2em; flex:none; }
/* Ein Verweis, dessen Ziel es nicht mehr gibt, SAGT DAS - er verschwindet
   nicht. Stillschweigend zu verschwinden waere schlimmer: dann sucht die
   Lehrkraft ein Blatt, das sie nachweislich verknuepft hatte. */
.kh-mat-z.fehlt .kh-mat-t{ color:var(--muted); text-decoration:line-through; }
.kh-mat-z.fehlt .kh-mat-ico{ background:var(--paper); color:var(--muted); }

/* Der Auswaehler: die eigene Liste mit einem Suchfeld. Eine Baumansicht
   waere hier der falsche Aufwand - man sucht ein Blatt, das man im Kopf
   hat, nicht einen Ordner. */
.ubm-card{ max-width:520px; }
.ubm-pdf-oben{ display:flex; align-items:center; gap:9px; margin:0 0 9px; }
.ubm-pdf-oben .mini-btn{ width:auto; margin:0; flex:none; }
.ubm-pdf-oben span{ min-width:0; font-size:12px; color:var(--muted);
  overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.ubm-pdf-filter{ display:grid; grid-template-columns:1fr 1fr; gap:8px;
  margin-bottom:8px; }
.ubm-pdf-filter.ubm-pdf-filter-eins{ grid-template-columns:1fr; }
.ubm-pdf-filter select{ min-width:0; width:100%; border:1.5px solid var(--line);
  border-radius:9px; background:var(--card); color:var(--ink); padding:8px 9px;
  font:inherit; font-size:13px; }
.ubm-suche{ width:100%; border:1.5px solid var(--line); border-radius:10px;
  padding:9px 11px; font-family:inherit; font-size:14px; color:var(--ink);
  background:var(--card); margin-bottom:10px; }
.ubm-suche:focus{ outline:none; border-color:var(--brand); }
.ubm-liste{ max-height:48vh; overflow:auto; display:flex; flex-direction:column; gap:2px; }
.ubm-e{ display:flex; align-items:center; gap:10px; appearance:none; border:0;
  background:transparent; color:var(--ink); font-family:inherit; text-align:left;
  padding:8px 10px; border-radius:10px; cursor:pointer; width:100%; }
.ubm-e:hover{ background:var(--paper); }
.ubm-e .kh-mat-ico{ font-size:11px; width:22px; height:22px; }
.ubm-e-t{ flex:1; min-width:0; }
.ubm-e-t b{ display:block; font-size:13.5px; font-weight:650; overflow:hidden;
  text-overflow:ellipsis; white-space:nowrap; }
.ubm-e-t i{ display:block; font-size:11.5px; color:var(--muted); font-style:normal;
  overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }

/* Ein eigener Inhalt ist ein WERKZEUG, keine Linkliste. Die Buehne nimmt die
   ganze Flaeche; nur im Bearbeitungszustand liegt oben eine kleine Auswahl.
   Unausgewaehlt bleibt ausschliesslich der Inhalt sichtbar - genauso wie bei
   Ampel, Uhr und den anderen Flaechenwerkzeugen. */
.kh-mat-werkzeug{ width:100%; height:100%; min-height:0; position:relative; }
.kh-mat-leerbox{ width:100%; height:100%; display:flex; align-items:center;
  justify-content:center; color:var(--muted); text-align:center; }
.kh-mat-steuer{ display:flex; align-items:center; gap:5px; min-width:0;
  position:absolute; z-index:3; top:0; left:0; right:0; padding:5px;
  background:color-mix(in srgb,var(--card) 94%,transparent); }
.kh-block:not(.kh-aktiv) .kh-mat-steuer{ display:none; }
.kh-mat-steuer select{ min-width:0; max-width:42%; height:28px; border:1px solid var(--line);
  border-radius:var(--r-control); background:var(--card); color:var(--ink);
  padding:3px 22px 3px 7px; font:inherit; font-size:.75em; }
.kh-mat-steuer button{ width:28px; height:28px; padding:5px; flex:none;
  display:inline-flex; align-items:center; justify-content:center; appearance:none;
  border:0; border-radius:var(--r-control); background:transparent; color:var(--muted); cursor:pointer; }
.kh-mat-steuer button:hover{ background:var(--paper); color:var(--brand); }
.kh-mat-steuer svg{ width:17px; height:17px; fill:none; stroke:currentColor;
  stroke-width:1.9; stroke-linecap:round; stroke-linejoin:round; }
.kh-mat-buehne{ width:100%; height:100%; min-height:0; overflow:auto; box-sizing:border-box; }
.kh-block.kh-aktiv .kh-mat-buehne{ padding-top:34px; }
.kh-mat-zaehler{ position:absolute; top:.15em; right:.2em; color:var(--muted);
  font-size:clamp(9px,2.3cqw,12px); font-weight:700; }
.kh-mat-frage,.kh-mat-karten,.kh-mat-folie{ width:100%; min-height:100%; position:relative;
  display:flex; flex-direction:column; justify-content:center; padding:clamp(12px,5cqw,30px); }
.kh-mat-fragetext{ font-size:clamp(16px,5.6cqw,34px); font-weight:750;
  line-height:1.25; text-wrap:balance; }
.kh-mat-frage ol{ list-style:none; margin:clamp(8px,3cqh,18px) 0 0; padding:0;
  display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:clamp(5px,2cqw,11px); }
.kh-mat-frage li{ min-width:0; display:flex; align-items:center; gap:.5em; line-height:1.25; }
.kh-mat-frage li span{ flex:none; width:1.7em; height:1.7em; border-radius:50%;
  display:inline-flex; align-items:center; justify-content:center; background:var(--brand-soft);
  color:var(--brand-dk); font-weight:800; }
.kh-mat-loesung{ margin-top:clamp(7px,2cqh,14px); padding:.55em .75em;
  border-left:3px solid var(--ok); background:color-mix(in srgb,var(--ok) 8%,transparent);
  color:var(--ink); font-weight:700; line-height:1.35; }
.kh-mat-nav{ display:flex; align-items:center; justify-content:center; gap:8px;
  margin-top:auto; padding-top:clamp(8px,3cqh,18px); }
.kh-mat-nav button{ min-width:34px; min-height:30px; display:inline-flex; align-items:center;
  justify-content:center; appearance:none; border:0; border-radius:var(--r-control);
  background:transparent; color:var(--ink); font:inherit; font-weight:700; cursor:pointer; }
.kh-mat-nav button:hover{ background:var(--paper); }
.kh-mat-nav button:disabled{ opacity:.25; cursor:default; }
.kh-mat-nav svg{ width:20px; height:20px; fill:none; stroke:currentColor;
  stroke-width:2; stroke-linecap:round; stroke-linejoin:round; }
.kh-mat-karte{ appearance:none; border:0; background:transparent; color:var(--ink);
  width:100%; flex:1; min-height:0; padding:clamp(12px,5cqw,32px); font:inherit;
  display:flex; flex-direction:column; align-items:center; justify-content:center;
  text-align:center; cursor:pointer; }
.kh-mat-karte small{ color:var(--muted); font-size:clamp(9px,2.4cqw,12px);
  font-weight:800; letter-spacing:.06em; text-transform:uppercase; }
.kh-mat-karte span{ margin-top:.5em; font-size:clamp(17px,5.8cqw,36px);
  line-height:1.3; font-weight:700; white-space:pre-wrap; }
.kh-mat-tabelle{ width:100%; height:100%; overflow:auto; }
.kh-mat-tabelle table{ width:100%; border-collapse:collapse; font-size:clamp(10px,2.8cqw,15px); }
.kh-mat-tabelle th,.kh-mat-tabelle td{ padding:.55em .7em; text-align:left;
  vertical-align:top; border-bottom:1px solid var(--line); line-height:1.35; }
.kh-mat-tabelle th{ width:36%; font-weight:750; }
.kh-mat-mindmap{ width:100%; min-height:100%; display:flex; flex-direction:column;
  align-items:center; justify-content:center; padding:clamp(10px,4cqw,26px); }
.kh-mat-mindmap>strong{ max-width:55%; padding:.65em 1.1em; border-radius:999px;
  background:var(--ink); color:var(--card); text-align:center;
  font-size:clamp(14px,4.2cqw,27px); }
.kh-mat-mindmap>div{ width:100%; display:grid; grid-template-columns:repeat(2,minmax(0,1fr));
  gap:clamp(5px,2cqw,12px); margin-top:clamp(8px,3cqh,20px); }
.kh-mat-mindmap span{ min-width:0; padding:.55em .7em; border-left:3px solid var(--brand);
  background:var(--brand-soft); line-height:1.25; }
.kh-mat-mindmap b,.kh-mat-mindmap i{ display:block; overflow:hidden; text-overflow:ellipsis; }
.kh-mat-mindmap i{ margin-top:.2em; color:var(--muted); font-style:normal; font-size:.82em; }
.kh-mat-blatt{ width:min(92%,760px); min-height:100%; margin:0 auto; padding:clamp(12px,4cqw,28px);
  color:var(--ink); }
.kh-mat-blatt h2{ margin:0 0 .5em; font-size:clamp(17px,5cqw,30px); }
.kh-mat-blatt p{ line-height:1.45; }
.kh-mat-blatt ol{ padding-left:1.5em; }
.kh-mat-blatt li{ padding:.45em 0; line-height:1.4; border-bottom:1px solid var(--line); }
.kh-mat-folie{ aspect-ratio:16/9; min-height:100%; justify-content:flex-start;
  border-top:clamp(4px,1.5cqh,10px) solid var(--folie-akzent); }
.kh-mat-folie>small{ color:var(--folie-akzent); font-weight:850; letter-spacing:.08em;
  font-size:clamp(8px,2.2cqw,12px); }
.kh-mat-folie h2{ margin:.25em 0 .5em; font-size:clamp(18px,6cqw,38px); line-height:1.12; }
.kh-mat-folie .frage{ font-size:clamp(14px,4.3cqw,27px); font-weight:700; line-height:1.3; }
.kh-mat-folie ul{ margin:.2em 0 0; padding-left:1.3em; line-height:1.45;
  font-size:clamp(11px,3.2cqw,19px); }
.kh-mat-qr{ width:100%; height:100%; display:flex; flex-direction:column; align-items:center;
  justify-content:center; gap:.65em; padding:clamp(8px,3cqw,18px); text-align:center; }
.kh-mat-qr .kh-qr-bild{ flex:none; width:min(70cqw,50cqh); height:min(70cqw,50cqh);
  aspect-ratio:1; }
.kh-mat-qr .kh-qr-bild img,.kh-mat-qr .kh-qr-bild canvas{ width:100%!important;
  height:100%!important; display:block; }
.kh-mat-dateibild{ width:100%; height:100%; object-fit:contain; display:block; }
.kh-mat-datei{ width:100%; height:100%; display:flex; flex-direction:column; align-items:center;
  justify-content:center; gap:.7em; text-align:center; }
.kh-mat-datei>span svg{ width:clamp(34px,18cqw,88px); height:clamp(34px,18cqw,88px);
  fill:none; stroke:var(--muted); stroke-width:1.5; }
.kh-mat-datei button{ appearance:none; border:0; background:transparent; color:var(--brand);
  font:inherit; font-weight:700; cursor:pointer; }
@container (max-width:260px){
  .kh-mat-frage ol,.kh-mat-mindmap>div{ grid-template-columns:1fr; }
  .kh-mat-steuer select{ max-width:50%; }
}

/* ===========================================================================
   DER VIDEOBLOCK (Unterrichtsbuch Faz 4b, v2.431.0)
   ---------------------------------------------------------------------------
   Zwei Verhalten, weil es zwei Rechtslagen gibt: ein Video aus einer
   deutschen Bildungsmediathek ist kein Drittlandtransfer und wird direkt
   gezeigt; YouTube und Vimeo liegen hinter ZWEI Klicks.

   DER PLATZHALTER LAEDT NICHTS. Kein Bild, keine Hintergrundgrafik, keine
   fremde Schrift - sonst waere der erste Klick schon der Transfer, den der
   zweite erst erlauben soll. Das Dreieck ist eine CSS-Form, kein Symbol von
   irgendwoher.
   ======================================================================== */
.kh-vid-eingabe{ margin-bottom:.4em; }
.kh-vid-eingabe input{ width:100%; }
.kh-vid-hilfe{ margin:0; font-size:.85em; color:var(--muted); line-height:1.45; }
.kh-vid-rahmen{ position:relative; width:100%; aspect-ratio:16/9;
  border-radius:.6em; overflow:hidden; border:1px solid var(--line);
  background:var(--paper); }
.kh-vid-rahmen iframe{ position:absolute; inset:0; width:100%; height:100%; border:0; }
.kh-vid-platz{ appearance:none; width:100%; aspect-ratio:16/9; border:1.5px dashed var(--line);
  border-radius:.6em; background:var(--paper); color:var(--ink); font-family:inherit;
  cursor:pointer; display:flex; flex-direction:column; align-items:center;
  justify-content:center; gap:.4em; padding:.6em; text-align:center; }
.kh-vid-platz:hover{ border-color:var(--brand); }
/* Reine CSS-Form: ein Dreieck aus Raendern. Ein Symbol waere eine Datei, und
   eine Datei waere eine Anfrage. */
.kh-vid-play{ width:0; height:0; border-style:solid; border-width:.7em 0 .7em 1.2em;
  border-color:transparent transparent transparent var(--brand); }
.kh-vid-txt{ font-size:.95em; font-weight:700; }
.kh-vid-warn{ font-size:.72em; color:var(--muted); line-height:1.4; max-width:26em; }

/* ===========================================================================
   DER AUFGABEN-BLOCK (Unterrichtsbuch v2.456.0)
   ---------------------------------------------------------------------------
   Eine knappe Stundenliste: Titel, Typ/Thema/Frist, Abgabenstand und Sprung
   in die vorhandene Aufgabenzentrale. Kein QR, keine nachgebaute
   Schueleransicht und vor allem keine zweite Ergebnisverwaltung.
   ======================================================================== */
.kh-auf{ width:100%; height:100%; min-height:0; display:flex;
  flex-direction:column; overflow:hidden; }
.kh-auf-kopf{ display:flex; align-items:center; gap:5px; flex:0 0 auto;
  padding-bottom:.45em; border-bottom:1px solid var(--line); }
.kh-auf-kopf>b{ min-width:0; flex:1; font-size:.92em; }
.kh-auf-kopf button{ appearance:none; min-height:29px; border:0;
  border-radius:var(--r-control); background:transparent; color:var(--muted);
  display:inline-flex; align-items:center; justify-content:center; gap:4px;
  padding:4px 7px; font:inherit; font-size:.78em; font-weight:750; cursor:pointer; }
.kh-auf-kopf button:hover{ color:var(--brand); background:var(--brand-soft); }
.kh-auf-kopf .kh-auf-neu{ color:var(--brand); }
.kh-auf-kopf [data-feld="auf-neu"]{ display:inline-flex !important; }
.kh-auf-kopf svg{ width:16px; height:16px; fill:none; stroke:currentColor;
  stroke-width:1.9; stroke-linecap:round; stroke-linejoin:round; }
.kh-auf-leer{ flex:1; display:flex; align-items:center; justify-content:center;
  color:var(--muted); text-align:center; font-size:.85em; }
.kh-auf-liste{ min-height:0; overflow:auto; scrollbar-width:none; }
.kh-auf-liste::-webkit-scrollbar{ display:none; }
.kh-auf-zeile{ display:flex; align-items:center; gap:4px; min-width:0;
  border-bottom:1px solid var(--line); }
.kh-auf-zeile.beendet{ opacity:.68; }
.kh-auf-zeile.fehlt{ min-height:38px; color:var(--muted); }
.kh-auf-zeile.fehlt>span{ flex:1; min-width:0; }
.kh-auf-sprung{ appearance:none; border:0; background:transparent; color:var(--ink);
  min-width:0; flex:1; padding:.52em .15em; display:grid;
  grid-template-columns:minmax(0,1fr) auto auto; align-items:center; gap:.55em;
  text-align:left; font:inherit; cursor:pointer; }
.kh-auf-sprung:hover{ color:var(--brand); }
.kh-auf-sprung>span{ min-width:0; }
.kh-auf-sprung b,.kh-auf-sprung i{ display:block; overflow:hidden;
  text-overflow:ellipsis; white-space:nowrap; }
.kh-auf-sprung b{ font-size:.9em; }
.kh-auf-sprung i{ color:var(--muted); font-size:.7em; font-style:normal; margin-top:.1em; }
.kh-auf-sprung strong{ color:var(--brand); font-size:.8em;
  font-variant-numeric:tabular-nums; white-space:nowrap; }
.kh-auf-sprung svg,.kh-auf-zeile .kh-zeile-x svg{ width:16px; height:16px;
  fill:none; stroke:currentColor; stroke-width:1.9; stroke-linecap:round;
  stroke-linejoin:round; }

/* Alte Inhaltsbloecke bleiben als echte CONNECTOREN lesbar. */
.kh-verbindungen{ height:100%; min-height:0; overflow:auto; scrollbar-width:none; }
.kh-verbindungen::-webkit-scrollbar{ display:none; }
.kh-verbindungen-leer{ display:flex; align-items:center; justify-content:center;
  flex-direction:column; gap:.5em; color:var(--muted); text-align:center; }
.kh-verbindung{ display:flex; align-items:center; gap:4px; min-width:0;
  border-bottom:1px solid var(--line); }
.kh-verbindung.fehlt{ opacity:.62; }
.kh-verbindung-ziel{ appearance:none; border:0; background:transparent; color:var(--ink);
  min-width:0; flex:1; padding:.55em .15em; display:grid;
  grid-template-columns:auto minmax(0,1fr) auto; align-items:center; gap:.55em;
  text-align:left; font:inherit; cursor:pointer; }
.kh-verbindung-ziel:hover{ color:var(--brand); }
.kh-verbindung-ziel:disabled{ cursor:default; }
.kh-verbindung-ziel>svg,.kh-verbindung-weg svg{ width:17px; height:17px;
  fill:none; stroke:currentColor; stroke-width:1.9; stroke-linecap:round;
  stroke-linejoin:round; }
.kh-verbindung-ziel>span{ min-width:0; }
.kh-verbindung-ziel b,.kh-verbindung-ziel i{ display:block; overflow:hidden;
  text-overflow:ellipsis; white-space:nowrap; }
.kh-verbindung-ziel b{ font-size:.9em; }
.kh-verbindung-ziel i{ color:var(--muted); font-size:.72em; font-style:normal; }
.kh-verbindung-neu{ margin-top:.5em; }

/* ===========================================================================
   DIE KALENDER-KOPFZEILE (v2.434.0)
   ---------------------------------------------------------------------------
   Wunsch Murat 25.08.2026, und er hat in einem Satz beschrieben, was falsch
   war: „o arkalanindaki sey olmasin sadece indirdigin ikon arkaplansiz."
   Jeder Knopf trug seine eigene Pille - bei sieben Knoepfen wird daraus
   eine Perlenkette, und das Auge findet nichts mehr. Jetzt tragen nur noch
   das SEGMENT und das offene Popover eine Flaeche; alles andere ist ein
   Zeichen auf dem Papier, das erst beim Zeigen eine Flaeche bekommt.

   Und das Datum ist die Ueberschrift dieses Bildschirms - nicht das Wort
   „Kalender", das dasselbe sagt wie der Menuepunkt daneben.
   ======================================================================== */
body.kal-titel-aus #page-title{ display:none; }
#kal-tb{ display:flex; align-items:center; gap:10px; }
.kal-datum{ font-size:24px; font-weight:800; color:var(--ink); white-space:nowrap;
  letter-spacing:-.02em; }
.kal-flach{ appearance:none; border:0; background:transparent; color:var(--ink);
  font-family:inherit; font-size:14px; font-weight:600; cursor:pointer;
  display:inline-flex; align-items:center; justify-content:center; gap:7px;
  padding:6px 8px; border-radius:10px; position:relative; flex:none;
  transition:background .15s, color .15s; }
.kal-flach svg{ width:19px; height:19px; }
.kal-flach:hover{ background:var(--kal-fill); }
.kal-flach.on{ color:var(--flaeche-akzent,var(--brand)); }
.kal-flach-plus svg{ width:23px; height:23px; }
.kal-pfeil{ font-size:19px; line-height:1; padding:4px 9px; }
.kal-today{ padding:6px 12px; }
/* DAS HEFT LEUCHTET, WENN ES OFFEN IST (Wunsch Murat 25.08.2026: „kitap
   böyle paril paril parlasin ... aktifken parlasin kapatildiginda sönsün").
   Kein Hintergrundfleck, sondern das Zeichen selbst: in der Kennfarbe und
   mit einem Schein darum. Aus ist es einfach grau - man sieht auf einen
   Blick, ob die Spalte gerade da ist. */
.kal-heftbtn{ color:var(--muted); }
.kal-heftbtn svg{ width:21px; height:21px; }
.kal-heftbtn.on{ color:var(--flaeche-akzent,var(--brand)); }
.kal-heftbtn.on svg{
  filter:drop-shadow(0 0 5px color-mix(in srgb, var(--flaeche-akzent,var(--brand)) 65%, transparent)); }
/* Der erklaerende Satz im kleinen Termin-Dialog: leise, aber lesbar - er
   erklaert eine Auswahl, er ist nicht selbst eine. */
.kt-hinweis-klein{ font-size:11.5px; line-height:1.45; color:var(--muted);
  margin:2px 0 0; }

/* ===========================================================================
   DER REFLEXIONS-BLOCK (Unterrichtsbuch Faz 5b, v2.436.0)
   ---------------------------------------------------------------------------
   „kücücük bir boxta gösterebiliyoz sonuclari" - im Kasten steht der
   Zwischenstand klein; der QR fuer die Klasse gehoert an die Wand und
   oeffnet deshalb die vorhandene grosse Ansicht.

   Die Balken sind Flaechen, keine Zahlenkolonne: waehrend die Klasse tippt,
   schaut man im Vorbeigehen hin.
   ======================================================================== */
.kh-ref{ display:flex; flex-direction:column; gap:.35em; }
.kh-ref-eingabe{ width:100%; }
.kh-ref-z{ display:flex; align-items:center; gap:.3em; }
.kh-ref-z input{ flex:1; min-width:0; }
.kh-ref-akt{ display:flex; gap:.4em; flex-wrap:wrap; margin-top:.15em; }
.kh-ref-los{ border-color:var(--brand); color:var(--brand); font-weight:700; }
.kh-ref-hin{ margin:.1em 0 0; font-size:.78em; line-height:1.4; color:var(--muted); }
.kh-ref-frage{ font-weight:700; color:var(--ink); line-height:1.3; }
.kh-ref-zahl{ font-size:.85em; color:var(--muted); }
.kh-ref-zahl b{ font-size:1.5em; color:var(--brand); font-weight:800; }
.kh-ref-bars{ display:flex; flex-direction:column; gap:.25em; }
.kh-ref-bar{ display:flex; align-items:center; gap:.4em; font-size:.85em; }
.kh-ref-bt{ flex:0 0 38%; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.kh-ref-bl{ flex:1; height:.5em; border-radius:999px; background:var(--line);
  overflow:hidden; }
.kh-ref-bl i{ display:block; height:100%; background:var(--brand); border-radius:999px;
  transition:width .3s; }
.kh-ref-bn{ flex:none; font-weight:700; color:var(--muted); min-width:1.2em;
  text-align:right; }

/* ===========================================================================
   DIE WERKZEUGE DER STUNDE (v2.437.0)
   ---------------------------------------------------------------------------
   Ein Werkzeug fuellt seinen Kasten und erklaert sich nicht. Wer eine Uhr
   sieht, weiss, was sie ist; wer ein PDF sieht, sucht die Pfeile. Deshalb:
   keine Ueberschriften, keine Hinweiszeilen - Flaeche, Zahl, Pfeil.
   ======================================================================== */
.kh-leerbox{ height:100%; display:flex; flex-direction:column; gap:.4em;
  align-items:center; justify-content:center; text-align:center; }
.kh-leer{ margin:0; color:var(--muted); font-size:.9em; }

/* ---- Uhr ---- */
.kh-uhr{ height:100%; display:flex; align-items:center; justify-content:center;
  cursor:pointer; }
.kh-uhr-svg{ width:100%; height:100%; max-height:100%; }
.kh-uhr-rand{ fill:var(--card); stroke:var(--line); stroke-width:2; }
.kh-uhr-st{ stroke:var(--line); stroke-width:1; }
.kh-uhr-st.gross{ stroke:var(--muted); stroke-width:2; }
.kh-uhr-h, .kh-uhr-m{ stroke:var(--ink); stroke-width:4; stroke-linecap:round; }
.kh-uhr-m{ stroke-width:3; }
.kh-uhr-s{ stroke:var(--brand); stroke-width:1.6; stroke-linecap:round; }
.kh-uhr-mitte{ fill:var(--brand); }
.kh-uhr-zahl{ fill:var(--ink); font-family:inherit; font-size:7px;
  font-weight:750; text-anchor:middle; pointer-events:none; }
.kh-uhr-dig{ font-size:clamp(26px,18cqw,84px); font-weight:800; color:var(--ink);
  font-variant-numeric:tabular-nums; letter-spacing:-.02em; }

/* ---- DIE KLASSENLISTE (v3.9.0, index-app.js uhBlockKlassenliste) ----
   Namen untereinander, je Zeile ein Stift fuer eine Notiz ins Profil. Ruhig
   wie eine Liste auf Papier: keine Rahmen, nur feine Linien; der Stift tritt
   zurueck, bis man die Zeile beruehrt. */
.kh-kl{ display:flex; flex-direction:column; gap:6px; height:100%; min-height:0; }
.kh-kl-kopf{ display:flex; align-items:center; gap:8px; }
.kh-kl-kopf b{ font-size:1.05em; color:var(--ink); }
.kh-kl-kopf span{ color:var(--muted); font-size:.85em; font-weight:700; }
.kh-kl-wechseln{ margin-left:auto; }
.kh-kl-wechseln, .kh-kl-stift, .kh-kl-feld button{ appearance:none; border:0; background:transparent; color:var(--muted);
  width:28px; height:28px; border-radius:var(--r-control); display:inline-flex; align-items:center; justify-content:center;
  cursor:pointer; flex:none; padding:0; }
.kh-kl-wechseln:hover, .kh-kl-stift:hover, .kh-kl-feld button:hover{ color:var(--brand); background:var(--brand-soft); }
.kh-kl svg{ width:16px; height:16px; fill:none; stroke:currentColor; stroke-width:2; stroke-linecap:round; stroke-linejoin:round; }
.kh-kl-liste{ list-style:none; margin:0; padding:0; overflow:auto; min-height:0; flex:1 1 auto; }
.kh-kl-kind{ display:flex; align-items:center; gap:6px; min-height:32px; border-bottom:1px solid var(--line); }
.kh-kl-name{ flex:1 1 auto; min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.kh-kl-stift{ opacity:.35; }
.kh-kl-kind:hover .kh-kl-stift, .kh-kl-stift:focus-visible{ opacity:1; }
.kh-kl-haken{ color:var(--ok); display:inline-flex; }
.kh-kl-kind.auf{ flex-wrap:wrap; padding:4px 0; }
.kh-kl-feld{ flex:1 0 100%; display:flex; align-items:center; gap:4px; }
.kh-kl-feld input{ flex:1 1 auto; min-width:0; font:inherit; padding:5px 8px; border:1px solid var(--line);
  border-radius:var(--r-control); background:var(--card); color:var(--ink); }
.kh-kl-frage{ margin:0; color:var(--muted); }
.kh-kl-wahl{ display:flex; flex-wrap:wrap; gap:6px; }
.kh-kl-klasse{ appearance:none; border:1px solid var(--line); background:var(--card); color:var(--ink);
  border-radius:var(--r-pill); padding:5px 12px; font:inherit; font-weight:700; cursor:pointer; }
.kh-kl-klasse:hover{ background:var(--brand-soft); color:var(--brand); }

/* ---- Tafel ---- */
.kh-block[data-block="text"] .kh-bk-inhalt{ overflow:hidden; display:flex;
  flex-direction:column; }
.kh-text-leiste{ display:none; align-items:center; gap:4px; flex-wrap:wrap;
  flex:0 0 auto; margin:0 0 7px; }
.kh-block.kh-aktiv .kh-text-leiste{ display:flex; }
.kh-text-leiste button{ appearance:none; min-width:30px; min-height:28px;
  border:1px solid var(--line); border-radius:var(--r-control); background:var(--paper);
  color:var(--ink); font-family:inherit; cursor:pointer; }
.kh-text-leiste button:hover{ border-color:var(--brand); color:var(--brand); }
.kh-tafel{ width:100%; height:100%; min-height:3em; border:0; overflow:hidden;
  scrollbar-width:none; background:transparent; color:var(--ink); font-family:inherit;
  font-size:1.6em; font-weight:650; line-height:1.3; padding:0; white-space:pre-wrap;
  overflow-wrap:anywhere; }
.kh-tafel::-webkit-scrollbar{ display:none; }
.kh-tafel:focus{ outline:none; }
.kh-tafel:empty::before{ content:attr(data-placeholder); color:var(--muted); }
.kh-block:not(.kh-aktiv) .kh-tafel{ pointer-events:none; }

/* ---- Tafelbild (v2.716.0, static/js/tafelbild.js) ----
   Die Buehne ist EIN SVG mit viewBox: sie fuellt den Kasten und waechst im
   Vollbild mit, Schrift eingeschlossen - am Beamer ist das der Sinn. Die
   Leiste darunter sind gewoehnliche Knoepfe, die in JEDEM Zustand des
   Kastens bedienbar bleiben (live). Farben: Zaehler Bernstein, Nenner Blau,
   Fuellung ein helles Bernstein - dieselbe Zuordnung in Zahl, Wort und Bild. */
.kh-block[data-block="tafelbild"] .kh-bk-inhalt{ overflow:hidden; }
.tb{ height:100%; display:flex; flex-direction:column; gap:6px; min-height:0; }
.tb-buehne{ flex:1 1 auto; min-height:72px; display:flex; align-items:center;
  justify-content:center; }
.tb-svg{ width:100%; height:100%; max-height:100%; font-family:inherit; }
.tb-leiste{ flex:0 0 auto; display:flex; flex-wrap:wrap; gap:5px 8px;
  align-items:center; justify-content:center; padding-bottom:2px; }
.tb-gruppe{ display:inline-flex; align-items:center; gap:1px; padding:2px;
  border:1px solid var(--line); border-radius:999px; background:var(--card); }
.tb-gruppe b{ font-size:12px; font-weight:650; color:var(--muted);
  padding:0 5px; white-space:nowrap; }
.tb-knopf{ appearance:none; border:0; background:transparent; color:var(--ink);
  min-width:32px; min-height:32px; padding:0 8px; border-radius:999px;
  display:inline-grid; place-items:center; font-family:inherit; font-size:17px;
  font-weight:800; line-height:1; cursor:pointer; }
.tb-schalter .tb-knopf{ font-size:12.5px; font-weight:650; }
.tb-knopf:hover{ background:var(--paper); }
.tb-knopf.on{ background:var(--brand-soft); color:var(--brand); }
.tb-knopf[disabled]{ opacity:.35; cursor:default; }
.tb-knopf svg{ width:19px; height:19px; fill:none; stroke:currentColor;
  stroke-width:1.9; stroke-linecap:round; stroke-linejoin:round; }
.tb-leer{ display:flex; align-items:center; justify-content:center; }
/* Die Buehne */
.tb-zaehler{ fill:var(--amber-ink); }
.tb-nenner{ fill:var(--brand); }
.tb-strich{ stroke:var(--ink); stroke-width:4; stroke-linecap:round; }
.tb-wort{ fill:var(--ink); font-weight:750; }
.tb-teil{ fill:var(--card); stroke:var(--ink); stroke-width:1.6;
  stroke-linejoin:round; cursor:pointer; }
.tb-teil.voll{ fill:color-mix(in srgb,var(--amber) 42%,var(--card)); }
.tb-grob{ stroke:var(--ink); stroke-width:3.6; stroke-linecap:round; pointer-events:none; }
.tb-grob-rand{ fill:none; stroke:var(--ink); stroke-width:3.2; pointer-events:none; }
.tb-zs-linie{ stroke:var(--ink); stroke-width:3; stroke-linecap:round; }
.tb-zs-strich{ stroke:var(--ink); stroke-width:2; }
.tb-zs-strich.gross{ stroke-width:3; }
.tb-zs-klick{ fill:transparent; cursor:pointer; }
.tb-zs-zahl{ fill:var(--ink); font-weight:750; }
.tb-zs-punkt{ fill:var(--amber-ink); pointer-events:none; }
.tb-zs-balken{ stroke:color-mix(in srgb,var(--amber) 62%,var(--card)); stroke-width:10; }
.tb-pfeil{ fill:none; stroke:var(--ink); stroke-width:3.5; stroke-linecap:round; }
.tb-pfeil-spitze{ fill:var(--ink); }
.tb-faktor, .tb-gleich{ fill:var(--ink); }
.tb-hinweis{ fill:var(--muted); font-weight:650; }
/* Pizza: Boden, Rand, Belag; gegessene Stuecke bleiben als Umriss. */
.tb-pz-boden{ fill:color-mix(in srgb,var(--amber) 34%,var(--card)); stroke:var(--ink);
  stroke-width:1.6; stroke-linejoin:round; cursor:pointer; }
.tb-pz-rand{ fill:none; stroke:color-mix(in srgb,var(--amber-ink) 72%,var(--ink));
  stroke-width:9; pointer-events:none; }
.tb-pz-salami{ fill:color-mix(in srgb,var(--bad) 72%,var(--ink)); pointer-events:none; }
.tb-pz-weg{ fill:transparent; stroke:var(--muted); stroke-width:1.2;
  stroke-dasharray:4 4; cursor:pointer; }
/* Ein kleiner Kasten (HINTER den Grundregeln: gleiche Spezifitaet,
   die spaetere gewinnt) (der freie Rest neben einem grossen) bekommt eine
   kompaktere Leiste, die seitlich rollt statt die Buehne zu verdraengen -
   der Kasten ist ein Container (container-type:size am .kh-block). */
@container (max-width:460px){
  .tb-leiste{ flex-wrap:nowrap; overflow-x:auto; justify-content:flex-start;
    gap:4px; scrollbar-width:none; }
  .tb-leiste::-webkit-scrollbar{ display:none; }
  .tb-gruppe{ flex:none; }
  .tb-gruppe b{ font-size:10.5px; padding:0 3px; }
  .tb-knopf{ min-width:26px; min-height:26px; padding:0 5px; font-size:14px; }
  .tb-schalter .tb-knopf{ font-size:11px; }
  .tb-knopf svg{ width:15px; height:15px; }
}

.kh-block.kh-datei-darueber{ border-color:var(--brand); background:var(--brand-soft); }
.kh-block.kh-datei-laedt::after{ content:"Wird geladen …"; position:absolute;
  inset:0; z-index:8; display:flex; align-items:center; justify-content:center;
  background:color-mix(in srgb,var(--card) 88%,transparent); color:var(--brand);
  font-weight:750; }

/* ---- QR ---- */
.kh-qr{ height:100%; display:flex; flex-direction:column; gap:.4em;
  align-items:center; justify-content:center; }
.kh-qr-bild{ flex:1; min-height:0; display:flex; align-items:center;
  justify-content:center; }
.kh-qr-bild img, .kh-qr-bild canvas{ max-width:100%; max-height:100%;
  height:auto; width:auto; }
.kh-qr input{ width:100%; }

/* ---- Bild ---- */
.kh-sticker{ width:100%; height:100%; display:flex; align-items:center; justify-content:center; background:transparent; }
.kh-sticker img{ width:100%; height:100%; object-fit:contain; user-select:none; -webkit-user-drag:none; }
#kh-stickerpalette{ position:fixed; z-index:100100; width:min(448px,calc(100vw - 16px));
  max-height:min(620px,calc(100dvh - 100px)); display:flex; flex-direction:column; gap:16px;
  padding:20px; border:1px solid var(--line); border-radius:24px; color:var(--ink);
  background:var(--card); box-shadow:0 18px 60px rgba(20,40,30,.18); }
#kh-stickerpalette header{ display:flex; justify-content:space-between; align-items:center; font-size:18px; flex:none; }
#kh-stickerpalette header button{ display:grid; place-items:center; border:0; background:var(--surface-subtle); color:var(--muted); width:32px; height:32px; padding:6px; border-radius:10px; }
#kh-stickerpalette header svg{ width:20px; height:20px; }
#kh-stickerpalette .kh-stickersuche{ display:flex; align-items:center; gap:10px; margin:0; padding:0 12px;
  min-height:46px; border:1px solid var(--line); border-radius:14px; background:var(--surface-subtle); flex:none; }
#kh-stickerpalette .kh-stickersuche svg{ width:18px; height:18px; flex:none; color:var(--muted); }
#kh-stickerpalette .kh-stickersuche:focus-within{ border-color:var(--brand); box-shadow:0 0 0 3px var(--brand-soft); }
#kh-stickerpalette input{ flex:1; min-width:0; width:100%; border:0; outline:0; border-radius:0; padding:12px 0; font:inherit; font-size:13px; color:var(--ink); background:transparent; box-shadow:none; }
#kh-stickerpalette input::placeholder{ color:var(--muted); opacity:1; }
#kh-stickerpalette .kh-stickerfilter{ display:flex; align-items:center; gap:12px; flex:none; }
#kh-stickerpalette .kh-stickerfilter label{ margin:0; font-size:12px; color:var(--muted); }
#kh-stickerpalette select{ flex:1; min-width:0; padding:9px 12px; min-height:40px; border:1px solid var(--line); border-radius:12px; background:var(--card); color:var(--ink); font-size:13px; }
#kh-stickerpalette .kh-stickertreffer{ display:flex; justify-content:space-between; align-items:center; gap:8px; font-size:13px; flex:none; }
#kh-stickerpalette .kh-stickertreffer span{ color:var(--muted); font-size:12px; }
#kh-stickerpalette .kh-stickerwahl{ min-height:0; overflow:auto; overscroll-behavior:contain; scrollbar-width:thin;
  display:grid; grid-template-columns:repeat(3,minmax(0,1fr)); align-content:start; gap:10px; padding:1px; }
#kh-stickerpalette .kh-stickerwahl button{ display:flex; flex-direction:column; align-items:center; justify-content:center; gap:8px; padding:12px 8px;
  min-width:0; height:144px; border:1px solid var(--line); border-radius:16px; background:var(--surface-subtle); color:var(--ink); font-size:12px; cursor:pointer; }
#kh-stickerpalette .kh-stickerwahl button:hover{ background:var(--brand-soft); border-color:var(--brand); }
#kh-stickerpalette button:focus-visible,#kh-stickerpalette select:focus-visible{ outline:2px solid var(--brand); outline-offset:2px; }
#kh-stickerpalette .kh-stickerwahl img{ width:100%; height:82px; object-fit:contain; pointer-events:none; flex:none; }
#kh-stickerpalette .kh-stickerwahl span{ display:-webkit-box; -webkit-box-orient:vertical; -webkit-line-clamp:2; overflow:hidden;
  min-height:30px; width:100%; text-align:center; font-weight:600; line-height:1.25; overflow-wrap:anywhere; }
#kh-stickerpalette .kh-stickerwahl .kh-sticker-mehr{ grid-column:1/-1; height:auto; min-height:40px; }
#kh-stickerpalette .kh-stickerleer{ grid-column:1/-1; padding:24px 12px; margin:0; text-align:center; color:var(--muted); font-size:13px; }
@media (max-width:420px){
  #kh-stickerpalette{ padding:16px; gap:12px; }
  #kh-stickerpalette .kh-stickerwahl{ grid-template-columns:repeat(2,minmax(0,1fr)); }
}
.kh-bild{ position:relative; height:100%; display:flex; align-items:center;
  justify-content:center; }
.kh-bild img{ max-width:100%; max-height:100%; object-fit:contain;
  border-radius:.5em; }
.kh-bild-x{ position:absolute; top:0; right:0; appearance:none; border:0;
  background:var(--paper); color:var(--muted); border-radius:50%;
  width:1.5em; height:1.5em; line-height:1; cursor:pointer; opacity:0;
  transition:opacity .12s; font-family:inherit; }
.kh-block:hover .kh-bild-x{ opacity:1; }

/* ---- PDF: blaettern, nicht herunterladen ---- */
.kh-pdf{ height:100%; display:flex; flex-direction:column; gap:.35em; }
.kh-pdf-blatt{ flex:1; min-height:0; width:100%; object-fit:contain;
  border:1px solid var(--line); border-radius:.4em; background:var(--card); }
.kh-pdf-leiste{ display:flex; align-items:center; justify-content:center;
  gap:.5em; }
.kh-pdf-pf{ appearance:none; border:0; background:var(--paper); color:var(--ink);
  font-family:inherit; font-size:1.3em; line-height:1; cursor:pointer;
  width:1.7em; height:1.7em; border-radius:50%; }
.kh-pdf-pf:hover{ background:var(--brand); color:var(--on-brand); }
.kh-pdf-nr{ font-size:.85em; color:var(--muted); font-variant-numeric:tabular-nums;
  min-width:4em; text-align:center; }

/* ---- Zufallsschueler ---- */
.kh-zufall{ height:100%; display:flex; flex-direction:column; gap:.45em;
  align-items:center; justify-content:center; }
.kh-zufall-name{ font-size:clamp(20px,11cqw,58px); font-weight:800; color:var(--ink);
  text-align:center; line-height:1.15; word-break:break-word; }
.kh-zufall-name.leer{ color:var(--line); }
.kh-zufall-los{ border-color:var(--brand); color:var(--brand); font-weight:700; }

/* ---- Lautstaerke ---- */
.kh-laut{ height:100%; display:flex; flex-direction:column; gap:.4em;
  align-items:center; justify-content:center; }
.kh-laut-saeule{ flex:1; min-height:1.5em; width:clamp(24px,12cqw,72px); border-radius:999px;
  background:var(--paper); border:1.5px solid var(--line);
  display:flex; align-items:flex-end; overflow:hidden; }
.kh-laut-saeule i{ display:block; width:100%; background:var(--ok);
  transition:height .15s, background .15s; }
.kh-laut-saeule i.laut{ background:var(--bad); }
.kh-laut-txt{ font-size:.85em; color:var(--muted); }

/* ---- Faz 6: die gewaehlte Stunde im Tag (v2.438.0) ----------------------
   Sie ist nicht „ausgewaehlt" im Sinne eines Formulars, sondern die Stunde,
   deren SEITE gerade rechts steht. Bis v2.728.3 trug sie einen blauen Rand
   (Ansage Murat 14.09.2026: „soldaki secildiginde mavi cerceve oluyor ya
   termin onuda istemiyorum ... thema rengi olsun secili termin"). Jetzt ist
   sie in der Akzentfarbe der Flaeche GEFUELLT, mit weisser Schrift - die
   Regel steht im Akzent-Abschnitt am Dateiende (Nr. 10), weil dort die
   vollstaendige Liste aller Stellen mit Akzent gefuehrt wird. Hier bleibt
   nur, was keine Farbe ist. */
#kal-host .fc-event.kh-gewaehlt{ outline:0; }

/* ---- Faz 7: die Zuordnungsmaske ---- */
.uts-card{ max-width:720px; }
.uts-z{ display:flex; align-items:center; gap:.5em; padding:.5em 0;
  border-top:1px solid var(--line); flex-wrap:wrap; }
.uts-t{ flex:1 1 190px; min-width:0; }
.uts-t b{ display:block; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.uts-t i{ display:block; font-style:normal; font-size:12px; color:var(--muted); }
.uts-klasse{ flex:0 1 190px; min-width:160px; }
.uts-fach{ flex:0 1 170px; min-width:145px; }

/* Der Knopf im leeren Bereich - ein Satz, der nur sagt, was fehlt, laesst
   die Lehrkraft den Rueckweg selbst suchen. */
.kh-leer-btn{ appearance:none; margin-top:.6em; border:1.5px solid var(--line);
  background:var(--card); color:var(--ink); border-radius:999px;
  padding:.35em 1em; font-family:inherit; font-size:.92em; font-weight:650;
  cursor:pointer; }
.kh-leer-btn:hover{ border-color:var(--brand); color:var(--brand); }
/* Das Aufgaben-Fenster der Stunde (v2.440.0). Es traegt das ECHTE Formular
   der Aufgabenzentrale - deshalb dieselbe Breite wie dort, sonst braechen
   die Felder anders um als gewohnt. */
.uba-card{ max-width:760px; }
.uba-card .az-form{ margin:0; }
/* Die beiden Zeitfelder in der Reihen-Verteilung (v2.440.0). Schmal, damit
   Datum und Zeit in eine Zeile passen - eine umbrechende Zeile je Stunde
   macht aus zwoelf Stunden eine Seite zum Scrollen. */
.upl-zeitfeld{ flex:0 0 92px; width:92px; border:1.5px solid var(--line);
  border-radius:10px; padding:5px 7px; font-family:inherit; font-size:13px;
  color:var(--ink); background:var(--card); }
.upl-zeitfeld:focus{ outline:none; border-color:var(--brand); }

/* ===== DAS QUELLEN-REGAL (v2.459.0) ======================================
   Eine Liste von Kapiteln, die die Lehrkraft einmal eingelesen hat. Bewusst
   eine Auswahlliste und keine Kachelwand: Es wird GENAU EINE Quelle benutzt,
   und das soll man sehen, ohne zu zaehlen.
   Alle Farben kommen aus den Tokens (docs/DESIGN_SYSTEM.md) - eine feste
   Farbe waere im Dunkelmodus dieselbe und damit falsch. */
.qu-zeile{display:flex;align-items:flex-start;gap:10px;padding:11px 12px;
  border:1.5px solid var(--line);border-radius:11px;margin-bottom:8px;
  background:var(--card);cursor:pointer;}
.qu-zeile.on{border-color:var(--brand);background:var(--brand-soft);}
.qu-zeile input{margin-top:3px;flex:none;}
.qu-text{display:flex;flex-direction:column;gap:2px;min-width:0;flex:1;}
.qu-text b{font-size:14.5px;}
.qu-text small{font-size:11.5px;color:var(--muted);}
/* Der Anriss ist EIN Ausschnitt zum Wiedererkennen, kein Lesetext - deshalb
   auf eine Zeile begrenzt. Wer hier den ganzen Text zeigte, machte aus dem
   Regal eine Leseansicht des Schulbuchs. */
.qu-text i{font-size:12px;color:var(--muted);font-style:normal;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.qu-weg{flex:none;border:none;background:none;color:var(--muted);
  font-size:20px;line-height:1;cursor:pointer;padding:0 4px;}
.qu-weg:hover{color:var(--brand);}
.qu-merk{margin:10px auto 0;display:block;}
@media (max-width:640px){
  .qu-text i{display:none;}   /* auf dem Handy zaehlt der Name, nicht der Anriss */
}

/* ===== DIE QUELLE BEFRAGEN (v2.461.0) ==================================== */
.qu-frage-zeile{display:flex;gap:8px;align-items:stretch;}
.qu-frage-zeile input{flex:1;min-width:0;border:1.5px solid var(--line);
  border-radius:10px;padding:11px 12px;font:inherit;background:var(--card);}
.qu-frage-zeile .btn{flex:none;width:auto;margin:0;padding:11px 18px;}
/* Die Antwort ist ein Zitat aus fremdem Material, kein Fliesstext der App -
   deshalb abgesetzt und mit Rand statt als gewoehnlicher Absatz. */
.qu-antwort{margin-top:10px;padding:12px 14px;border-left:3px solid var(--brand);
  background:var(--brand-soft);border-radius:0 10px 10px 0;font-size:14px;
  line-height:1.55;white-space:pre-wrap;}
.qu-antwort small{display:block;margin-top:8px;color:var(--muted);font-size:11.5px;}
@media (max-width:640px){
  .qu-frage-zeile{flex-direction:column;}
  .qu-frage-zeile .btn{width:100%;}
}

/* ===== ERKLÄRBLATT-VORSCHAU ===============================================
   „Ansehen" zeigt die echten Seiten in einem Pop-up (Befund Murat
   27.08.2026: „normal bir pop-up gibi çıkarıp bana bütün sayfayı
   göstermeliydi"). Gezeichnet wird mit `studioDruckSeiteHtml` - demselben
   Zeichner, der auch druckt; deshalb muss die Seite hier ihre ECHTEN Masse
   behalten (210mm) und darf nur als Ganzes verkleinert werden.

   `zoom` statt `transform:scale()`: eine Skalierung liesse die Seite ihren
   vollen Platz beanspruchen, und unter dem verkleinerten Blatt stuende ein
   Streifen Leere, so hoch wie die Differenz. `zoom` rechnet den Fluss mit -
   in Chrome, Safari und seit 2024 auch in Firefox.
   MIT WEM: static/js/erklaerblatt-ui.js (ebVorschauZeigen/ebSeitenHtml). */
/* BREIT WIE EIN DOKUMENTBETRACHTER, NICHT WIE EIN HINWEISFENSTER (Befund
   Murat 27.08.2026: „hala extra bir blok icierisinde icerikler … gösterimde
   cikacak pdf in önizlemesi olmaliydi fakat bu degisik bisey"). Bei 1040 px
   stand eine A4-Seite in einem Rahmen, der kaum breiter war als sie selbst -
   das sah aus wie ein Kasten mit einem Blatt darin. Jetzt derselbe Wert wie
   im Entwurf-Fenster daneben: zwei Fenster, die dasselbe zeigen, sollen
   dieselbe Groesse haben. */
.eb-vorschau-karte{max-width:min(1180px,97vw);width:100%;}
/* MITTIG UEBER DEN BEHAELTER, NICHT UEBER `margin:auto` AN DER SEITE.
   `zoom` verkleinert die Seite erst NACH der Randberechnung: `margin:0 auto`
   rechnet mit den vollen 210 mm, findet keinen Platz uebrig und setzt beide
   Raender auf 0 - das verkleinerte Blatt klebte links, rechts stand ein
   grauer Streifen. Ein Flex-Behaelter richtet das Kind nach seiner
   TATSAECHLICHEN Groesse aus und trifft damit jeden Zoomschritt. */
.eb-vorschau-blatt{max-height:78vh;overflow:auto;background:var(--paper);
  border-radius:var(--r-control);padding:var(--s-3);
  display:flex;flex-direction:column;align-items:center;}
/* DER MASSSTAB HAENGT AN EINER VARIABLEN, NICHT AN EINER KLASSE. `--ebz`
   steht am Behaelter (gesetzt von `ebZoomAnwenden`) und wird vererbt; die
   Seite liest sie hier. Deshalb kostet ein Zoomschritt kein Neuzeichnen -
   und im Entwurf-Fenster behaelt das Textfeld rechts seinen Cursor. */
.eb-vorschau-blatt{--ebz:1;}
.eb-vorschau-seite{width:210mm;min-height:297mm;margin:0 auto var(--s-3);
  background:var(--card);box-shadow:0 2px 12px rgba(15,20,35,.16);
  position:relative;overflow:hidden;zoom:var(--ebz,1);}
/* SEIT v2.504.0 IST DAS BLATT SELBST DIE SEITE. `.ebb` bringt seine A4-Maße
   mit (erklaerblatt-designs.css); hier bekommt es nur noch den Maßstab und
   den Abstand zum nächsten. `.eb-vorschau-seite` bleibt daneben stehen: die
   STUDIO-KOPIEN werden weiterhin so gezeichnet, und zwei verschiedene Dinge
   dürfen zwei Regeln haben. */
.eb-vorschau-blatt > .ebb,
.eb-vorschau-blatt .ebb{zoom:var(--ebz,1);margin-bottom:var(--s-3);}
/* Auf schmalen Schirmen passt eine A4-Seite nie. Der feste Wert von frueher
   (`zoom:.42`) ist weg: `ebZoomEinpassung` rechnet ihn aus der wirklichen
   Behaelterbreite aus und trifft damit jedes Geraet, nicht nur das eine. */
@media (max-width:640px){
  .eb-vorschau-blatt{max-height:66vh;}
}

/* Die Huelle um eine Seite: das Blatt und darunter seine Nummer. Ohne diese
   Zeile sieht ein zweiseitiges Erklaerblatt aus wie ein sehr langes
   einseitiges - man sieht die Kante zwischen den Blaettern erst, wenn man
   danach sucht. */
.eb-vorschau-blatt-hu{display:flex;flex-direction:column;align-items:center;}
.eb-vorschau-nr{font-size:12px;color:var(--muted);margin:0 0 var(--s-3);
  font-variant-numeric:tabular-nums;}

/* ===== DIE WERKZEUGLEISTE IM KOPF DER BEIDEN FENSTER =====================
   Wunsch Murat 27.08.2026: „tuslari uestte x in soluna ikon olarak koyalim,
   kuecuek pdf altta aksin." Die Handlungen standen unter dem Blatt - bei
   einem dreiseitigen Erklaerblatt hiess das erst scrollen, dann druecken.
   MIT WEM: static/js/erklaerblatt-ui.js (ebWzKnopf, ebZoomLeiste). */
.eb-wz-kopf{gap:var(--s-3);flex-wrap:wrap;}
.eb-wz-t{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.eb-wz{display:flex;align-items:center;gap:6px;margin-left:auto;flex-wrap:wrap;}
.eb-wz .btn{margin:0;width:auto;}
.eb-wz-k{appearance:none;display:inline-flex;align-items:center;
  justify-content:center;width:32px;height:32px;padding:0;border-radius:9px;
  border:1px solid var(--line);background:var(--card);color:var(--ink);
  cursor:pointer;}
.eb-wz-k:hover:not(:disabled){border-color:var(--brand);color:var(--brand);
  background:var(--brand-soft);}
.eb-wz-k:disabled{opacity:.4;cursor:not-allowed;}
.eb-wz-k svg{width:17px;height:17px;fill:none;stroke:currentColor;
  stroke-width:2;stroke-linecap:round;stroke-linejoin:round;}
.eb-wz-zoom{display:inline-flex;align-items:center;gap:4px;}
/* Feste Breite, sonst huepft die ganze Leiste bei jedem Schritt: „50 %" ist
   schmaler als „125 %". Tabellenziffern, damit auch die Ziffern nicht wandern. */
.eb-wz-z{min-width:52px;text-align:center;font-size:12px;color:var(--muted);
  font-variant-numeric:tabular-nums;}
.eb-wz-tr{width:1px;height:22px;background:var(--line);margin:0 2px;}
/* Das Vorlagen-Feld in der Kopfzeile des Entwurf-Fensters. Schmal, weil hier
   gewechselt und nicht ausgesucht wird - ausgesucht wurde im Erzeuger. */
.eb-wz-design{max-width:190px;padding:6px 9px;font-size:12.5px;
  border:1px solid var(--line);border-radius:var(--r-control);
  background:var(--card);color:var(--ink);font-family:inherit;}
.eb-wz-design:hover{border-color:var(--brand);}
@media (max-width:640px){ .eb-wz-design{max-width:130px;} }

/* ===== ERKLÄRBLATT: die Klassen, die es nie gab ==========================
   BEFUND MURAT 27.08.2026: „butonlar ... bitisik yapiyosun", „sacma sapan bir
   text", „o bloklar biraz normallestir".

   Alle drei hatten dieselbe Ursache: `erklaerblatt-ui.js` benutzte
   `modal-foot` und `ab-ed-hinweis` – KLASSEN, DIE IN DIESER DATEI NICHT
   EXISTIEREN. Ohne Regel sind Knöpfe Blockelemente (also untereinander statt
   nebeneinander) und ein Hinweiskasten nackter Fliesstext, der oben auf dem
   Bildschirm klebt. Der Fehler ist im Quelltext unsichtbar: die Klasse steht
   ja da.
   MIT WEM: static/js/erklaerblatt-ui.js. */

/* Fusszeile eines Erklärblatt-Fensters: Knöpfe NEBENEINANDER, rechtsbündig,
   die Hauptaktion zuletzt (Leserichtung). */
.eb-foot{display:flex;gap:var(--s-2);justify-content:flex-end;
  align-items:center;margin-top:var(--s-4);flex-wrap:wrap;}
.eb-foot .btn{margin:0;width:auto;}

/* Ein Feld im Erzeugen-Fenster. Schmaler als das Standard-`.field`: hier
   stehen sechs Felder untereinander, und mit dem grossen Abstand wurde das
   Fenster höher als der Bildschirm. */
.eb-feld{margin:0 0 var(--s-3);}
.eb-feld label{display:block;font-size:12.5px;font-weight:600;
  color:var(--muted);margin:0 0 4px;}
.eb-feld select{width:100%;box-sizing:border-box;padding:9px 11px;
  border:1px solid var(--line);border-radius:var(--r-control);
  background:var(--card);color:var(--ink);font:inherit;font-size:14px;}
.eb-feld select:disabled{color:var(--muted);background:var(--paper);}
/* EIN Satz unter einem Feld - nie ein Absatz (Entscheidung Murat 2026-07:
   erklaerende Absaetze werden nicht gelesen, sie gehoeren ins Handbuch). */
.eb-feld-satz{margin:6px 0 0;font-size:12px;line-height:1.45;
  color:var(--muted);}

/* ===== NEUES ERKLAERBLATT: DREI SCHRITTE ================================
   WUNSCH MURAT 27.08.2026: „asama asama cocugu hedefe yönlendirirsin."
   Vorher standen fuenf gleich aussehende Auswahlfelder untereinander - alle
   gleich wichtig, keines erklaert. Jetzt drei benannte Schritte, jeder
   beantwortet EINE Frage. Es entsteht KEINE eigene Farbwelt: alles haengt an
   den Grundstand-Variablen (--line, --paper, --brand, --muted), wie es
   docs/DESIGN_SYSTEM.md verlangt.
   MIT WEM: static/js/erklaerblatt-ui.js (`ebNeuHtml`). */
/* BREITER (Wunsch Murat 27.08.2026: „popup i da biraz genislet"). Bei
   680 px standen die Auswahlfelder untereinander und die Vorlagenauswahl
   war eine einspaltige Liste - man scrollte durch 23 Kacheln, statt sie zu
   vergleichen. */
.eb-neu-karte{max-width:min(940px,97vw);width:100%;
  display:flex;flex-direction:column;max-height:92vh;}
/* Der Körper scrollt, Kopf und Fuß stehen. Sonst wandert der Knopf
   „Erklärblatt erzeugen" hinter den unteren Bildschirmrand, sobald die
   Vorlagenauswahl offen ist. */
.eb-neu-koerper{overflow-y:auto;min-height:0;flex:1 1 auto;
  padding-right:4px;margin-right:-4px;}
/* Ein Platzhalter, damit das zweispaltige Raster nicht einspaltig wird,
   wenn es kein Unterthema gibt. */
.eb-feld-leer{margin:0;}
/* Mittig (Wunsch Murat: „o asagidaki buttonlarida ortala tema renginde
   yap"). Die Hauptaktion trägt ohnehin `--brand`; sie bekommt hier nur mehr
   Gewicht, damit sie als Ziel der vier Schritte erkennbar ist. */
.eb-foot-mitte{justify-content:center;}
.eb-foot-mitte .btn{min-width:170px;justify-content:center;}

/* ===== DIE SPERRE WÄHREND DER ERZEUGUNG =================================
   BEFUND MURAT 27.08.2026: „wird erzeugt ekraninda her tusa basabiliyom mk
   ne alaka?" Ein deaktivierter Knopf allein reicht nicht - die Felder
   darüber blieben bedienbar, und das Blatt kam mit anderen Angaben als
   denen, die dann dastanden. Die Fläche liegt ÜBER dem ganzen Fenster.
   MIT WEM: static/js/erklaerblatt-ui.js (`ebNeuHtml`). */
.eb-sperre{position:absolute;inset:0;z-index:5;border-radius:inherit;
  background:color-mix(in srgb, var(--card) 78%, transparent);
  display:flex;align-items:center;justify-content:center;
  /* Ohne diese Zeile klickt man durch die Fläche hindurch - genau der
     Fehler, den sie verhindern soll. */
  pointer-events:auto;backdrop-filter:blur(1.5px);}
.eb-sperre-k{display:flex;flex-direction:column;align-items:center;gap:8px;
  text-align:center;max-width:340px;padding:22px;}
.eb-sperre-k b{font-size:15px;color:var(--ink);}
.eb-sperre-k span{font-size:12.5px;color:var(--muted);line-height:1.5;}
.eb-sperre-rad{width:26px;height:26px;border-radius:50%;
  border:2.5px solid var(--line);border-top-color:var(--brand);
  animation:eb-dreht .8s linear infinite;}
@keyframes eb-dreht{to{transform:rotate(360deg);}}
@media (prefers-reduced-motion:reduce){ .eb-sperre-rad{animation:none;} }
/* DAS WARTENDE MASKOTTCHEN. Derselbe Kasten wie auf der Ladekarte
   (.ss-lade-maskottchen): leer hat er keine Hoehe, gefuellt
   waechst er mit der Figur. Der Ring liegt darin, bis die Figur da ist -
   deshalb `min-height`, sonst huepfte der Text beim Austausch. */
.eb-sperre-maskottchen{width:190px;max-width:64%;min-height:30px;
  display:flex;align-items:center;justify-content:center;}
.eb-sperre-maskottchen svg{display:block;width:100%;height:auto;}

/* ===== SCHRITT 4: DIE VORLAGEN-BÜHNE ====================================
   WUNSCH MURAT 28.08.2026: „Wie soll es aussehen? kismini daha toparli
   sekilde yapsak mesela böyle yan yana sahne … saga sola basarak ilerletip
   geri getirsem öyle heryi alt alta koymasak."

   Vorher standen 37 Kacheln in fünf Gruppen UNTEREINANDER - der vierte
   Schritt war länger als die drei davor zusammen, und wer die letzte Gruppe
   sehen wollte, scrollte an allem vorbei. Jetzt: eine Reihe Gruppen oben,
   darunter EINE Bühne, die seitwärts läuft. Man sieht immer gleich viel,
   egal wie viele Vorlagen eine Gruppe hat.

   WARUM SEITWÄRTS SCROLLEN UND KEIN SEITENZÄHLER: die Spur ist ein
   gewöhnlicher `overflow-x`-Bereich mit Scroll-Rasterung. Damit funktioniert
   sie auch mit Wischen, mit Trackpad und mit der Tastatur - drei Bedienarten,
   die ein selbstgebauter Seitenzähler alle einzeln nachbauen müsste. Die
   Pfeile schieben um genau eine Kachelbreite (`ebBuehneSchieben`).

   MIT WEM: static/js/erklaerblatt-ui.js (`ebDesignWahlHtml`,
   `ebBuehneSchieben`, `ebSpurWiederherstellen`),
   static/css/erklaerblatt-designs.css (`.ebb-mini`). */
.eb-dz-buehne{display:flex;flex-direction:column;gap:var(--s-2);}
/* Dieselbe Bühne im Entwurf-Fenster (v2.980.0), auf Knopfdruck unter der
   Kopfzeile – erklaerblatt-ui.js `ebEntwurfVorlagen`. */
.eb-entwurf-vorlagen{padding:var(--s-2) 0 var(--s-3);margin-bottom:var(--s-3);
  border-bottom:1px solid var(--line);}
.eb-entwurf-vorlagen[hidden]{display:none;}
.eb-dz-tabs{display:flex;flex-wrap:wrap;gap:6px;}
.eb-dz-tab{appearance:none;cursor:pointer;font:inherit;font-size:12px;
  font-weight:600;color:var(--muted);background:var(--card);
  border:1px solid var(--line);border-radius:999px;padding:5px 11px;
  display:inline-flex;align-items:center;gap:6px;
  transition:border-color .12s,background .12s,color .12s;}
.eb-dz-tab:hover{border-color:var(--brand);color:var(--ink);}
.eb-dz-tab.an{border-color:var(--brand);background:var(--brand-soft);
  color:var(--ink);box-shadow:inset 0 0 0 1px var(--brand);}
.eb-dz-tab i{font-style:normal;font-size:10.5px;font-weight:700;
  color:var(--muted);}
.eb-dz-tab.an i{color:var(--brand);}

.eb-dz-lauf{display:flex;align-items:stretch;gap:6px;min-width:0;}
/* Die Pfeile stehen NEBEN der Spur und nicht darüber: über der Spur wären
   sie zwei weitere Zeilen, und genau die sollte dieser Umbau abschaffen. */
.eb-dz-pfeil{appearance:none;flex:none;width:30px;cursor:pointer;padding:0;
  display:inline-flex;align-items:center;justify-content:center;
  border:1px solid var(--line);border-radius:var(--r-control);
  background:var(--card);color:var(--muted);
  transition:border-color .12s,color .12s;}
.eb-dz-pfeil:hover{border-color:var(--brand);color:var(--brand);}
.eb-dz-pfeil svg{width:16px;height:16px;fill:none;stroke:currentColor;
  stroke-width:2;stroke-linecap:round;stroke-linejoin:round;}

/* WEDER SCROLL-RASTERUNG NOCH `scroll-behavior:smooth` - beides ist hier
   ausprobiert und wieder herausgenommen (gemessen im Browser, 28.08.2026):
   mit `scroll-snap-type:x` zog die Rasterung einen Sprung auf 200 px wieder
   auf 32 px zurück, und mit `scroll-behavior:smooth` bewegte sich der
   Bereich beim Setzen von `scrollLeft` GAR NICHT. Ein Karussell, dessen
   Pfeile manchmal nichts tun, ist schlimmer als eines ohne Weichzeichner. */
.eb-dz-spur{flex:1 1 auto;min-width:0;display:flex;gap:12px;
  overflow-x:auto;overflow-y:hidden;padding:2px 2px 8px;
  scrollbar-width:thin;}
.eb-dz{position:relative;flex:0 0 168px;width:168px;}
@media (max-width:560px){ .eb-dz{flex-basis:150px;width:150px;} }
/* Die Kachel steht jetzt HOCHKANT: Vorschau oben, Name und Satz darunter.
   In einer Reihe nebeneinander ist das Blatt das, was man vergleicht -
   der Name sagt es nur noch einmal. */
.eb-dz-w{appearance:none;width:100%;height:100%;display:flex;
  flex-direction:column;gap:8px;align-items:stretch;
  text-align:left;cursor:pointer;font:inherit;color:var(--ink);
  border:1px solid var(--line);border-radius:var(--r-control);
  background:var(--card);padding:8px;transition:border-color .12s,background .12s;}
.eb-dz-w:hover{border-color:var(--brand);}
.eb-dz.an .eb-dz-w{border-color:var(--brand);background:var(--brand-soft);
  box-shadow:inset 0 0 0 1px var(--brand);}
/* Die Vorschau füllt die Kachelbreite. 150 px von 794 px (= 210 mm) ergeben
   den Maßstab; die Rechnung steht hier und nicht im Blatt-Stylesheet, weil
   die Breite hier festgelegt wird. */
.eb-dz-mini{flex:none;display:block;width:150px;margin:0 auto;
  --ebb-mini-skala:.1889;}
@media (max-width:560px){ .eb-dz-mini{width:132px;--ebb-mini-skala:.1662;} }
.eb-dz-tx{min-width:0;flex:1 1 auto;display:flex;flex-direction:column;gap:2px;}
.eb-dz-tx b{font-size:12.5px;font-weight:700;line-height:1.3;}
.eb-dz-tx i{font-style:normal;font-size:11px;color:var(--muted);line-height:1.35;}
.eb-dz.an .eb-dz-tx i{color:var(--ink);}
/* Die Lupe ist ein EIGENER Knopf: ein Klick auf die Kachel wählt, ein Klick
   auf die Lupe zeigt gross. Eine Fläche, die je nach Stelle etwas anderes
   tut, ist die zuverlässigste Art, Leute zu ärgern. */
.eb-dz-lupe{position:absolute;top:6px;right:6px;width:26px;height:26px;
  display:inline-flex;align-items:center;justify-content:center;padding:0;
  border:1px solid var(--line);border-radius:8px;background:var(--card);
  color:var(--muted);cursor:pointer;opacity:0;transition:opacity .12s;}
.eb-dz:hover .eb-dz-lupe,.eb-dz-lupe:focus-visible{opacity:1;}
.eb-dz-lupe:hover{color:var(--brand);border-color:var(--brand);}
.eb-dz-lupe svg{width:14px;height:14px;fill:none;stroke:currentColor;
  stroke-width:2;stroke-linecap:round;stroke-linejoin:round;}
/* Am Telefon gibt es kein Hover - dort steht sie immer da. */
@media (hover:none){ .eb-dz-lupe{opacity:1;} }

/* Die grosse Ansicht einer Vorlage - über dem Erzeuger, damit die Auswahl
   darunter stehen bleibt. */
.eb-dgross-karte{max-width:min(920px,96vw);width:100%;max-height:94vh;
  display:flex;flex-direction:column;}
.eb-dgross-akt{display:flex;align-items:center;gap:var(--s-2);margin-left:auto;}
.eb-dgross-akt .btn{margin:0;width:auto;}
.eb-dgross-blatt{overflow:auto;min-height:0;flex:1 1 auto;
  background:var(--paper);border-radius:var(--r-control);padding:var(--s-3);
  display:flex;flex-direction:column;align-items:center;}
/* Das Blatt in der grossen Ansicht passt sich der Fensterbreite an. `zoom`
   und nicht `transform:scale()`: eine Skalierung liesse das Blatt seinen
   vollen Platz beanspruchen, und darunter stünde ein Streifen Leere.
   Dieselbe Begründung wie bei der Blattvorschau. */
.eb-dgross-blatt .ebb{zoom:.72;}
@media (max-width:900px){ .eb-dgross-blatt .ebb{zoom:.42;} }

.eb-schritt{border-top:1px solid var(--line);padding-top:var(--s-3);
  margin-top:var(--s-3);}
.eb-schritt:first-of-type{border-top:0;margin-top:0;}
.eb-schritt-k{display:flex;align-items:center;gap:9px;font-weight:700;
  font-size:14.5px;color:var(--ink);margin:0 0 var(--s-3);}
/* Die Ziffer traegt den Schritt. Sie ist der einzige Grund, warum man beim
   Ueberfliegen merkt, dass es eine Reihenfolge gibt. */
.eb-schritt-nr{display:inline-flex;align-items:center;justify-content:center;
  width:22px;height:22px;border-radius:50%;background:var(--brand-soft);
  color:var(--brand);font-size:12.5px;font-weight:700;flex:none;}
/* Zwei Felder nebeneinander, am Telefon untereinander. */
.eb-zwei{display:grid;grid-template-columns:1fr 1fr;gap:var(--s-3);}
@media (max-width:640px){ .eb-zwei{grid-template-columns:1fr;gap:0;} }

/* Die Vorlagen als Knoepfe und nicht als Auswahlfeld: jede braucht ihren
   Satz, und in einem <select> sieht man den Satz erst nach dem Aufklappen -
   also genau dann nicht, wenn man waehlt. */
.eb-vorlagen{display:grid;grid-template-columns:1fr 1fr;gap:var(--s-2);}
@media (max-width:640px){ .eb-vorlagen{grid-template-columns:1fr;} }
.eb-vorlage{appearance:none;text-align:left;cursor:pointer;
  border:1px solid var(--line);border-radius:var(--r-control);
  background:var(--card);color:var(--ink);padding:10px 12px;
  display:flex;flex-direction:column;gap:2px;font:inherit;}
.eb-vorlage b{font-size:13.5px;font-weight:700;}
.eb-vorlage span{font-size:12px;line-height:1.4;color:var(--muted);}
.eb-vorlage:hover{border-color:var(--brand);}
.eb-vorlage.an{border-color:var(--brand);background:var(--brand-soft);}
.eb-vorlage.an span{color:var(--ink);}

/* Was gleich entsteht - Name, Seitenzahl, Gesicht. Vor dem Klick, nicht
   danach: sie ersetzt das Vorstellungsvermoegen, das man sonst braucht. */
.eb-ergebnis{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap;
  border:1px solid var(--line);border-radius:var(--r-control);
  background:var(--paper);padding:10px 12px;margin-top:var(--s-4);}
.eb-ergebnis b{font-size:13.5px;color:var(--ink);}
.eb-ergebnis span{font-size:12.5px;color:var(--muted);}

/* Hinweise. Sie standen als nackter Text OBEN auf dem Bildschirm - dort, wo
   man seine Blätter sucht, nicht seine Meldungen. Jetzt ein ruhiger Kasten,
   und gezeigt wird er da, wo die Meldung hingehört. */
.eb-hinweis{border:1px solid var(--line);border-left:3px solid var(--brand);
  border-radius:var(--r-control);background:var(--paper);
  padding:var(--s-2) var(--s-3);margin:var(--s-3) 0;
  font-size:13px;line-height:1.5;color:var(--ink);}
.eb-hinweis.warn{border-left-color:var(--bad);}
.eb-hinweis ul{margin:0;padding-left:18px;}

/* Die Handlungen der Detailkarte: untereinander MIT Abstand. Vorher klebten
   sie aneinander, weil `.btn` in dieser Umgebung keinen Aussenabstand hat. */
.eb-akt{display:flex;flex-direction:column;gap:var(--s-2);
  margin:var(--s-3) 0;}
.eb-akt .btn{margin:0;width:100%;gap:8px;}
/* EIN SYMBOL IN EINEM `.btn` HAT KEINE GROESSE - `.btn` ist `inline-flex`,
   aber es gibt NIRGENDS eine Regel `.btn svg`. Ein <svg> mit viewBox und
   ohne Masse ist dann 300 x 150 px: aus dem Stift in „Ich habe es fachlich
   geprueft" wurde ein handflaechengrosser schwarzer Klecks (schwarz, weil
   ohne `fill:none` die Umrisslinie GEFUELLT wird). Betroffen waren alle
   Knoepfe dieser Spalte - auch „Wiederherstellen" und „Aus dem Archiv
   holen". Die Werte sind die von `.dqd-haupt svg`, damit beide Karten
   dieselben Symbole in derselben Groesse zeigen. */
.eb-akt .btn svg{width:16px;height:16px;flex:none;fill:none;stroke:currentColor;
  stroke-width:2.2;stroke-linecap:round;stroke-linejoin:round;}

/* ===== TITELZEILE MIT WERKZEUGMENUE ======================================
   Die drei Punkte stehen NEBEN der Ueberschrift, ganz rechts - wie in der
   Aufgabenliste (Wunsch Murat 27.08.2026). Vorher hingen sie als fuenfter
   Knopf unter den Handlungen und sahen aus, als gehoerten sie zu ihnen.
   MIT WEM: static/js/erklaerblatt-ui.js (ebDetail). */
.eb-kopf{display:flex;align-items:flex-start;justify-content:space-between;
  gap:var(--s-2);}
.eb-kopf .dqd-t{min-width:0;flex:1 1 auto;}
.eb-kopf .kebab-wrap{flex:none;}

/* ===== DIE VIER HANDLUNGEN ALS SYMBOLREIHE ===============================
   Vier gleich breite Felder nebeneinander, jedes mit seinem Namen klein
   darunter (Wunsch Murat 27.08.2026: „o dördü sag tarafta kutuya sigmali").
   Vier volle Knoepfe untereinander fuellten vorher die halbe Karte.
   `grid` statt `flex`, damit alle vier gleich breit bleiben - bei `flex`
   bestimmte die Laenge des Wortes die Breite des Feldes. */
/* FUENF statt vier, seit „Aendern" dazugekommen ist (Befund Murat
   27.08.2026: „fachlich geprueft diyoz ama ben burada duezenleyemiyom").
   Die Zahl steht hier und nicht im JavaScript: waechst die Reihe, waechst
   die Regel mit - `auto-fit` waere bequemer und wuerde bei vier Symbolen
   vier verschieden breite Felder ergeben. */
.eb-ikonen{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));
  gap:var(--s-2);}
.eb-ik{appearance:none;display:flex;flex-direction:column;align-items:center;
  justify-content:flex-start;gap:6px;padding:10px 4px 8px;
  border:1.5px solid var(--line);border-radius:var(--r-control);
  background:var(--card);color:var(--ink);font:inherit;font-size:11.5px;
  font-weight:600;line-height:1.2;text-align:center;cursor:pointer;
  transition:border-color .12s,background .12s,color .12s;}
.eb-ik:hover:not(:disabled){border-color:var(--brand);background:var(--brand-soft);
  color:var(--brand-dk);}
/* Gesperrt heisst: noch nicht geprueft (§6). Der Grund steht im `title` -
   ein blasser Knopf ohne Begruendung ist ein Raetsel. */
.eb-ik:disabled{opacity:.45;cursor:not-allowed;}
.eb-ik svg{width:19px;height:19px;fill:none;stroke:currentColor;stroke-width:2;
  stroke-linecap:round;stroke-linejoin:round;}
.eb-ik-ico{position:relative;display:inline-flex;}
.eb-ik-n{display:block;max-width:100%;overflow:hidden;text-overflow:ellipsis;
  white-space:nowrap;}
/* Der Haken am Symbol: „das ist geteilt". Er sitzt AM Symbol und nicht
   daneben, damit die vier Felder gleich hoch bleiben. */
.eb-ik-mark{position:absolute;right:-6px;bottom:-4px;display:inline-flex;
  align-items:center;justify-content:center;width:13px;height:13px;
  border-radius:99px;background:var(--ok);color:var(--card);}
.eb-ik-mark svg{width:9px;height:9px;stroke-width:3.4;}
.eb-ik.an{border-color:var(--ok);color:var(--ok);}
.eb-ik.an:hover:not(:disabled){border-color:var(--ok);color:var(--ok);
  background:var(--paper);}
/* Am Telefon bleiben es vier - sie passen, weil nur ein kurzes Wort
   darunter steht. Nur die Luft wird knapper. */
@media (max-width:640px){
  .eb-ikonen{gap:6px;}
  .eb-ik{padding:9px 2px 7px;font-size:10.5px;}
}

/* ===== DIE PDF-SPALTE DER LISTE ==========================================
   Fuenfte Spalte statt vier: der direkte Weg zum Ausdruck, ohne den Umweg
   ueber die Detailkarte oder das Studio (Befund Murat 27.08.2026). Sie steht
   nur unter „Aktiv", deshalb haengt das Raster an einer eigenen Klasse und
   nicht an `#eb-list` - im Archiv gilt wieder das geerbte vierspaltige.
   MIT WEM: static/js/erklaerblatt-ui.js (ebListe). */
#eb-list.eb-list-pdf .dq-kopf,#eb-list.eb-list-pdf .dq-row{
  grid-template-columns:minmax(0,1fr) 76px 116px 74px 44px;}
.dq-row .dq-dl{display:flex;justify-content:center;}
.dq-row .dq-dl-b{display:inline-flex;align-items:center;justify-content:center;
  width:30px;height:30px;padding:0;border:1px solid var(--line);
  border-radius:var(--r-control);background:var(--card);color:var(--muted);
  cursor:pointer;transition:color .12s,border-color .12s,background .12s;}
.dq-row .dq-dl-b:hover{color:var(--brand-dk);border-color:var(--brand);
  background:var(--brand-soft);}
.dq-row .dq-dl-b svg{width:15px;height:15px;fill:none;stroke:currentColor;
  stroke-width:2;stroke-linecap:round;stroke-linejoin:round;}
/* Am Telefon faellt sie mit den uebrigen Spalten weg - die Zeile ist dort
   einspaltig, und ein Knopf am Zeilenende waere ein zweites Ziel neben dem
   Antippen der Zeile selbst. Der Weg bleibt: Zeile antippen, in der Karte
   „Als PDF herunterladen".
   DIESE REGEL MUSS HIER STEHEN, nicht oben im grossen Telefon-Block: die
   Regeln darueber sind gleich spezifisch und stehen frueher in der Datei -
   die spaetere gewaenne sonst, und die Spalte bliebe am Telefon stehen. */
@media (max-width:900px){
  #eb-list.eb-list-pdf .dq-kopf,#eb-list.eb-list-pdf .dq-row{
    grid-template-columns:minmax(0,1fr);}
  .dq-row .dq-dl{display:none;}
}

/* DRUCKEN AUS DER VORSCHAU (Wunsch Murat: „direkt indirme yok mesela bu
   sayfada listede o da olmali studio ya atmak sitiyor sürekli").
   Beim Drucken bleibt NUR das Blatt stehen; alles andere der App wird
   ausgeblendet. Dasselbe Muster wie `body.st-druckt` im Blatt-Studio. */
@media print{
  body.eb-druckt > *{display:none !important;}
  body.eb-druckt #eb-vorschau{display:block !important;position:static;
    background:none;padding:0;}
  body.eb-druckt #eb-vorschau .modal-head,
  body.eb-druckt #eb-vorschau .eb-foot{display:none !important;}
  /* HIER WURDE DAS PDF ABGESCHNITTEN (Befund Murat 27.08.2026: „önizlemede
     düzgün ama pdfte gerisi yok ikinci sayfa yok yani ayrica köselerden
     kesiliyo").

     `.modal-card` trägt `max-height:82vh; overflow-y:auto; border-radius:18px`
     (index.css:5757) - für ein Fenster genau richtig. Beim Drucken heisst das
     aber: alles unterhalb einer Bildschirmhöhe wird ABGESCHNITTEN, und die
     Schnittkante ist an den Ecken rund. Genau das kam aus dem Drucker: die
     erste Seite bis zur Fensterhöhe, mit runden Ecken, und danach nichts.

     Die vorige Fassung setzte hier `padding` und `background` zurück, aber
     nicht die HÖHE und nicht das ÜBERLAUFEN - und das sind die beiden, auf
     die es ankommt. Ein Blatt, das mehrere Seiten hoch ist, braucht einen
     Behälter, der mitwächst. */
  body.eb-druckt #eb-vorschau .modal-card{box-shadow:none;border:0;
    max-width:none;width:auto;padding:0;background:none;
    max-height:none !important;overflow:visible !important;
    border-radius:0;animation:none;}
  /* Auch der Behälter darunter. `display:block` statt `flex`: ein
     Flex-Behälter zwischen Papier und Seitenumbruch bringt manche Browser
     dazu, `page-break` zu ignorieren - dieselbe Begründung wie bei
     `.eb-vorschau-blatt-hu` weiter unten. */
  body.eb-druckt #eb-vorschau .eb-vorschau-blatt{max-height:none !important;
    overflow:visible !important;padding:0;background:none;display:block;}
  /* DER ZOOM IST EINE BILDSCHIRMSACHE. Ohne diese Zeile kaeme das Blatt in
     der zuletzt gewaehlten Groesse aus dem Drucker - also meist auf
     Briefmarkengroesse, weil die Vorschau eingepasst startet. */
  body.eb-druckt #eb-vorschau .eb-vorschau-blatt{--ebz:1;}
  /* Das HTML-Blatt bekommt seine Druckform aus erklaerblatt-designs.css.
     Hier wird nur der Bildschirm-Maßstab abgeräumt - sonst käme das Blatt in
     der zuletzt gewählten Größe aus dem Drucker, also meist winzig. */
  body.eb-druckt #eb-vorschau .ebb{zoom:1 !important;margin:0 !important;}
  /* Die Seitennummer der VORSCHAU ist Bildschirmsache. Auf dem Papier steht
     sie im Fuss des Blattes selbst (ebSeitenschmuck) - zweimal waere einmal
     zu viel, und zwischen zwei Blaettern gedruckt waere sie schlicht falsch. */
  body.eb-druckt #eb-vorschau .eb-vorschau-nr{display:none !important;}
  /* Die Huelle um Blatt und Nummer darf den Seitenumbruch nicht stoeren:
     ein Flex-Behaelter zwischen Papier und Umbruch bringt manche Browser
     dazu, `page-break-after` zu ignorieren - und dann stehen zwei A4-Seiten
     auf einem Blatt. Im Druck ist sie schlicht ein Block ohne Eigenschaften. */
  body.eb-druckt #eb-vorschau .eb-vorschau-blatt-hu{display:block;margin:0;}
  body.eb-druckt #eb-vorschau .eb-vorschau-seite{box-shadow:none;margin:0;
    zoom:1 !important;page-break-after:always;}
}

/* ===== ERKLÄRBLATT-ENTWURF: links das Blatt, rechts sein Inhalt ==========
   Links steht die gesetzte Seite (dieselbe wie im Druck), rechts die Felder
   dazu. Wer rechts tippt, sieht links sofort, ob es noch auf die Seite passt –
   das ist der Sinn der Messung.
   MIT WEM: static/js/erklaerblatt-ui.js (ebEntwurfZeichnen). */
.eb-entwurf-karte{max-width:min(1180px,97vw);width:100%;}
/* VOLLBILD (Wunsch Murat: „bu popup genisletilebilir olsun"). Ein Fenster mit
   1180 px traegt ein A4 und seine Felder nicht gleichzeitig - und genau
   dafuer ist dieses Fenster da. `max-height` mit, sonst waere es breit und
   weiterhin kurz. */
.eb-entwurf-karte.eb-gross{max-width:99vw;max-height:96vh;}
.eb-entwurf-karte.eb-gross .eb-vorschau-blatt,
.eb-entwurf-karte.eb-gross .eb-entwurf-inhalt{max-height:78vh;}
.eb-entwurf-kopf{display:flex;align-items:center;justify-content:space-between;
  gap:var(--s-3);flex-wrap:wrap;}
.eb-entwurf-akt{display:flex;align-items:center;gap:var(--s-2);}
.eb-entwurf-akt .btn{margin:0;width:auto;}
/* DIE SPALTENBREITEN STEHEN AM ELEMENT, NICHT HIER: sie werden gezogen
   (`ebSplitStart`) und sind damit ein Zustand, keine Gestaltungsregel.
   Hier steht nur, was sich NICHT verschiebt. */
.eb-entwurf-split{display:grid;
  grid-template-columns:minmax(0,1.45fr) 12px minmax(0,1fr);
  gap:0;align-items:start;}
.eb-entwurf-inhalt{max-height:72vh;overflow:auto;padding:0 4px 0 var(--s-3);}
/* Der Griff zwischen beiden Spalten. Ein sichtbarer Strich in der Mitte -
   ohne ihn sucht man die anfassbare Stelle. */
.eb-entwurf-teiler{align-self:stretch;min-height:120px;cursor:col-resize;
  position:relative;border-radius:3px;}
.eb-entwurf-teiler::before{content:"";position:absolute;left:50%;top:8px;
  bottom:8px;width:3px;transform:translateX(-50%);border-radius:2px;
  background:var(--line);}
.eb-entwurf-teiler:hover::before{background:var(--brand);}
/* Waehrend des Ziehens darf nichts markiert werden - sonst faerbt sich das
   halbe Fenster blau, sobald der Zeiger ueber Text laeuft. */
body.eb-zieht{user-select:none;-webkit-user-select:none;cursor:col-resize;}

/* ===== DAS LEITBILD IM ENTWURF-FENSTER ==================================
   Befund Murat 27.08.2026: „leitbild bos, burda istersem resim
   yueklyebileyim." Das Feld war leer, weil ein Leitbild der Art „bild" gar
   kein `text` hat - es hat Quelle, Alternativtext und Bildunterschrift.
   MIT WEM: static/js/erklaerblatt-ui.js (ebLeitbildFelderHtml). */
.eb-lb-bild{border:1px solid var(--line);border-radius:var(--r-control);
  background:var(--paper);padding:6px;margin:0 0 var(--s-2);text-align:center;}
.eb-lb-bild img{max-width:100%;max-height:150px;border-radius:6px;
  display:inline-block;}
.eb-lb-leer{border:1px dashed var(--line);border-radius:var(--r-control);
  background:var(--paper);padding:var(--s-3);margin:0 0 var(--s-2);
  font-size:12.5px;color:var(--muted);line-height:1.45;}
.eb-lb-akt{display:flex;gap:var(--s-2);flex-wrap:wrap;}
.eb-lb-akt .btn{margin:0;width:auto;gap:6px;}
.eb-lb-akt .btn svg{width:15px;height:15px;fill:none;stroke:currentColor;
  stroke-width:2;stroke-linecap:round;stroke-linejoin:round;}
/* Ein `<label>` mit verstecktem `<input type=file>`: der Dateiwaehler des
   Browsers laesst sich nicht gestalten, ein Knopf davor schon. */
.eb-lb-waehl{position:relative;overflow:hidden;cursor:pointer;}
.eb-lb-waehl input{position:absolute;inset:0;opacity:0;cursor:pointer;
  width:100%;height:100%;}
.eb-lb-stand{font-size:12px;color:var(--muted);min-height:16px;margin-top:4px;}
/* Die Hinweispflicht aus PLAN_ARBEITSBLATT_EDITOR.md §10.6 - EIN Satz,
   sichtbar, nicht hinter einem „i". */
.eb-lb-satz{font-size:11.5px;color:var(--muted);margin:2px 0 var(--s-2);
  line-height:1.4;}
.eb-lb-hoehe{width:100%;margin:0 0 var(--s-2);accent-color:var(--brand);}
/* Ein Block: Rollenname klein darüber, darunter seine Felder. */
.eb-ef{border:1px solid var(--line);border-radius:var(--r-control);
  padding:var(--s-2) var(--s-3);margin:0 0 var(--s-2);background:var(--card);}
.eb-ef-rolle{font-size:11px;font-weight:700;letter-spacing:.08em;
  text-transform:uppercase;color:var(--muted);margin:0 0 6px;}
.eb-ef-l{display:block;font-size:11.5px;color:var(--muted);margin:6px 0 3px;}
.eb-ef-in,.eb-ef-ta{width:100%;box-sizing:border-box;padding:7px 9px;
  border:1px solid var(--line);border-radius:var(--r-control);
  background:var(--paper);color:var(--ink);font:inherit;font-size:13.5px;
  line-height:1.45;}
.eb-ef-ta{resize:vertical;}
.eb-ef-in:focus,.eb-ef-ta:focus{outline:2px solid var(--brand);outline-offset:1px;}
/* Auf dem Telefon untereinander: zwei Spalten à 160px sind keine zwei
   Spalten mehr, sondern zwei Streifen. */
@media (max-width:900px){
  /* `!important`, weil die Spaltenbreiten am Element stehen (gezogen, siehe
     oben) - eine Regel ohne es waere auf dem Telefon wirkungslos, und dort
     ist nebeneinander ohnehin keine Anordnung, sondern zwei Streifen. */
  .eb-entwurf-split{grid-template-columns:minmax(0,1fr) !important;}
  .eb-entwurf-inhalt{max-height:none;padding-left:0;}
  .eb-entwurf-teiler{display:none;}
}

/* ===== NACHBEREITUNG (docs/PLAN_NACHBEREITUNG.md, Faz 2) ==================
   Das Fenster nach der gehaltenen Stunde. Es benutzt die vorhandene
   Modal-Huelle (.modal-overlay/.modal-card/.modal-head) und faerbt NICHTS
   selbst - alle Farben kommen aus den Tokens, damit Hell und Dunkel ohne
   zweite Pflege stimmen (DESIGN_SYSTEM.md §2).
   Bewusst schmal (420px): hier stehen zwei Knoepfe und hoechstens ein
   Dutzend Zeilen. Ein breites Fenster liesse es nach mehr Arbeit aussehen,
   als es ist - und genau das soll es nicht. */
/* Das Symbol der Nachbereitungs-Zeile in „Meine Aufgaben". Die anderen
   Zeilen dort tragen ihre Farbe noch als festen Wert im JavaScript (Altbestand
   vor dem Design-System); diese hier kommt aus Tokens und stimmt deshalb im
   Dunkelmodus ohne zweite Pflege. */
.t-ico-nb{ background:var(--brand-soft); color:var(--brand); }
/* Frist abgelaufen, Abgaben fehlen (v2.875.0): Rot, weil eine Entscheidung
   der Lehrkraft aussteht - nicht, weil jemand etwas falsch gemacht hat. */
.t-ico-frist{ background:var(--bad-soft); color:var(--bad-ink); }
/* Automatische 6 pruefen (v2.877.0): Bernstein - abwaegen, nicht Alarm. */
.t-ico-pruefen{ background:var(--amber-soft); color:var(--amber-ink); }
/* Untis hat eine Reihenstunde gestrichen (v2.885.0): Bernstein - eine Frage,
   kein Fehler. */
.t-ico-entfall{ background:var(--amber-soft); color:var(--amber-ink); }
/* Fällige Lernstände (v2.780.0). Bernstein statt Rot: es ist eine
   Erinnerung, kein Fehler – niemand hat etwas falsch gemacht, es ist nur
   eine Weile her. Dieselbe Farbe trägt der Knopf am Kind. */
.t-ico-lstd{ background:var(--amber-soft); color:var(--amber-ink); }
.nb-card{ max-width:420px; }
.nb-kopf{ font-size:12.5px; color:var(--muted); margin:0 0 14px; }
.nb-kopf span{ display:block; color:var(--ink); font-weight:600; margin-top:2px; }
.nb-frage{ font-size:15px; font-weight:700; margin:0 0 14px; }
.nb-gut{ font-size:15px; font-weight:700; margin:0 0 12px; color:var(--ok); }
.nb-fehler{ font-size:13.5px; color:var(--bad); margin:0; }
.nb-laed{ font-size:13.5px; color:var(--muted); padding:8px 0; }
.nb-hinweis{ font-size:12.5px; color:var(--muted); margin:12px 0 0; line-height:1.45; }
/* `.btn` ist im Grundstand ein Block über die volle Breite. Hier stehen aber
   zwei gleichrangige Antworten nebeneinander – ein Knopf über die ganze Zeile
   und ein kleiner darunter läse sich wie eine Empfehlung, und die wollen wir
   nicht geben: „Etwas fehlt" ist keine schlechtere Antwort als „Ja". */
.nb-akt{ display:flex; gap:8px; flex-wrap:wrap; align-items:center; margin-top:16px; }
.nb-akt .btn{ width:auto; }
/* Eine Zeile, keine zweite Unterrichtsdokumentation. Der Browser und der
   Server setzen dieselbe 120-Zeichen-Grenze. */
.nb-text{ width:100%; min-height:42px; border:1px solid var(--line);
  border-radius:10px; background:var(--bg); color:var(--ink); padding:9px 11px;
  font:inherit; }
.nb-text:focus{ outline:2px solid var(--brand); outline-offset:1px; }
/* Die Vorschau der Folgestunde. Sie ist ein Zitat, keine Eingabe - deshalb
   die Kante links statt eines vollen Kastens. */
.nb-vorschau{ border-left:3px solid var(--brand); background:var(--brand-soft);
  border-radius:0 10px 10px 0; padding:10px 12px; font-size:13.5px; line-height:1.45; }
.nb-vorschau span{ color:var(--muted); }
/* --muted und NICHT --brand-dk: `--brand-soft` wird im Dunkelmodus auf ein
   tiefes Blau umdefiniert, `--brand-dk` aber nicht - die Marke bliebe dort
   dunkelblau auf dunkelblau und waere praktisch unsichtbar. --muted ist in
   beiden Modi gepflegt. */
/* KEIN text-transform:uppercase. Hier steht ein Datum („Sa, 5.4."), kein
   Etikett - „SA, 5.4." liest sich im Deutschen wie ein Schreifehler. */
.nb-vs-tag{ font-size:11.5px; font-weight:700; color:var(--muted);
  letter-spacing:.2px; margin-bottom:3px; }
@media (max-width:640px){
  .nb-card{ max-width:100%; }
  .nb-akt .btn, .nb-akt .mini-btn{ flex:1 1 auto; justify-content:center; }
}


/* ===== KLASSENRENNEN: DIE EINGEBETTETE BUEHNE (R5, Plan §2.4) =============
   Die Maße sind eine Zusage, keine Geschmacksfrage: 100 % Breite, etwa 16:9,
   am Rechner zwischen 280 und 520 px hoch. Darunter ist eine Figur bei vier
   Kindern nicht mehr zu erkennen, darüber frisst die Bühne auf einem kleinen
   Laptop die halbe Seite.

   UND DER WICHTIGE TEIL: „Vergrößern" hängt das Iframe NICHT um. Ein
   verschobener Iframe-Knoten wird vom Browser neu geladen - Rennen, Figuren
   und Punktestand wären weg. Stattdessen bleibt der Knoten, wo er ist, und
   nur seine Darstellung wechselt. */
#krnn-buehne{
  position:relative; width:100%;
  height:clamp(280px, 42vh, 520px);
  border-radius:12px; overflow:hidden; background:var(--ink);
  border:1px solid var(--line);
}
#krnn-buehne iframe{ width:100%; height:100%; border:0; display:block; }

/* Der Rückfall, wenn die Fullscreen-API fehlt oder abgelehnt wird. */
#krnn-buehne.krnn-voll{
  position:fixed; inset:0; z-index:9999;
  width:100vw; height:100dvh; max-height:100dvh;
  border-radius:0; border:0;
}
/* Und derselbe Zustand, wenn die echte Fullscreen-API greift. */
#krnn-buehne:fullscreen{ width:100vw; height:100dvh; border-radius:0; border:0; }

/* Der Ausstieg muss im Vollbild sichtbar bleiben - sonst sucht eine
   Lehrkraft vor der Klasse nach der Escape-Taste. */
#krnn-raus{
  position:absolute; top:12px; right:12px; z-index:2; display:none;
  background:var(--ink); color:var(--on-brand); border:0; border-radius:10px;
  padding:8px 14px; font-weight:800; font-size:14px; cursor:pointer;
}
#krnn-buehne.krnn-voll #krnn-raus, #krnn-buehne:fullscreen #krnn-raus{ display:block; }

.krnn-thema{
  border:2px solid var(--line); border-radius:10px; padding:8px 6px;
  background:var(--card); cursor:pointer; text-align:center; font-size:12.5px;
  font-weight:700; color:var(--ink);
}
.krnn-thema.aktiv{ border-color:var(--brand); color:var(--brand); }
.krnn-thema-name{ display:block; }
.krnn-thema-story{ display:block; margin-top:3px; color:var(--muted); font-size:10.5px;
  font-weight:500; line-height:1.25; }
.krnn-thema.aktiv .krnn-thema-story{ color:var(--brand); }
.krnn-vorschau{ width:100%; height:46px; border-radius:6px; margin-bottom:5px;
  background-repeat:no-repeat; image-rendering:pixelated;
  background-color:var(--surface-subtle); }
/* „Zufaellig" als Collage aus vier Strecken (v2.979.0) statt Wuerfel. */
.krnn-collage{ display:grid; grid-template-columns:1fr 1fr; grid-template-rows:1fr 1fr; gap:2px;
  overflow:hidden; background:var(--line); }
.krnn-collage i{ display:block; background-repeat:no-repeat; image-rendering:pixelated; }

/* §6.1: der schmale Bereich UEBERSCHREIBT, er ersetzt die Grundregel nicht.
   Am Telefon ist eine 42-vh-Buehne zu hoch, weil darueber schon die
   Kopfzeile und darunter die fuenf Knoepfe stehen. */
@media (max-width:640px){
  #krnn-buehne{ height:clamp(200px, 34vh, 320px); }
  #krnn-knoepfe .btn{ flex:1 1 100%; }
}
@media (prefers-reduced-motion: reduce){
  .krnn-thema{ transition:none; }
}

/* Der Rest des Renn-Panels: Klassen statt Inline-Stil. Inline-Stil im HTML
   ist der Weg, auf dem eine eigene Farbwelt entsteht (DESIGN_SYSTEM §6) -
   der Waechter zaehlt sie deshalb, und er hat hier zu Recht angeschlagen. */
.krnn-panel{ margin-top:16px; text-align:left; background:var(--surface-subtle);
  border-radius:14px; overflow:hidden; }
.krnn-kopf{ display:flex; align-items:center; justify-content:space-between;
  cursor:pointer; padding:14px 16px; font-weight:700; }
.krnn-kopf .krnn-acc{ color:var(--brand); font-size:13px; font-weight:700; }
.krnn-badge{ font-size:12px; font-weight:600; color:var(--brand); margin-left:4px; }
.krnn-body{ padding:0 16px 16px; }
.krnn-hinweis{ font-size:12.5px; color:var(--muted); line-height:1.5; margin:6px 0 12px; }
.krnn-thema-label{ margin-bottom:6px; }
.krnn-zeile{ cursor:pointer; padding:0 16px 14px; font-size:13px; color:var(--muted); }
.krnn-reihe{ display:flex; gap:8px; flex-wrap:wrap; align-items:center; margin-bottom:12px; }
.krnn-label{ font-size:13px; font-weight:700; }
.krnn-modus{ max-width:none; flex:1; min-width:210px; margin:0; }
.krnn-gitter{ display:grid; grid-template-columns:repeat(auto-fill,minmax(104px,1fr));
  gap:8px; margin-bottom:12px; }
.krnn-schalter{ display:flex; gap:14px; flex-wrap:wrap; margin-bottom:12px; font-size:13px; }
.krnn-schalter label{ display:flex; align-items:center; gap:6px; }
.krnn-code{ font-size:30px; font-weight:800; letter-spacing:.12em; color:var(--brand); }
.krnn-klein{ font-size:13px; color:var(--muted); margin-bottom:6px; }
.krnn-liste{ font-size:13px; color:var(--muted); margin:8px 0; }
.krnn-fehler{ margin-top:10px; color:var(--bad-ink); font-size:13px; }
.krnn-knoepfe{ display:flex; gap:8px; margin-top:12px; flex-wrap:wrap; }
.krnn-knoepfe .btn{ margin:0; flex:1; min-width:130px; }
.krnn-start{ margin:0; }
.krnn-lobby{ margin-bottom:12px; }

/* ===== EINSTELLUNGS-AKKORDEON, LOBBY UND 3-2-1 (v2.587.0) ================
   Anweisungen Murat 02.09.2026. Die Einstellungen werden einmal vor der
   Stunde gesetzt und liegen deshalb zugeklappt; die Kinder, die gerade
   beitreten, stehen offen darunter - die Reihenfolge folgt dem, was man
   waehrend der Stunde ansieht. */
.krnn-acc-kopf{ display:flex; align-items:center; justify-content:space-between;
  gap:8px; cursor:pointer; padding:10px 12px; margin-bottom:10px;
  border:1px solid var(--line); border-radius:11px; background:var(--card);
  font-size:13px; font-weight:700; color:var(--ink); }
.krnn-acc-kopf:hover{ border-color:var(--brand); }
.krnn-acc-info{ font-weight:600; color:var(--muted); margin-left:6px; }
.krnn-acc-chev{ color:var(--brand); font-weight:700; }
.krnn-acc-body{ padding-top:2px; }

/* Die Lobby: EIN Gesicht je Kind. Ein festes Raster statt einer Reihe -
   bei 25 Kindern soll die Bedienung darunter nicht weggeschoben werden,
   deshalb rollt die Flaeche ab einer gewissen Hoehe. */
.krnn-kinder{ display:grid; grid-template-columns:repeat(auto-fill,minmax(62px,1fr));
  gap:8px; max-height:186px; overflow-y:auto; padding:2px; }
.krnn-kind{ display:flex; flex-direction:column; align-items:center; gap:3px;
  text-align:center; font-size:11px; font-weight:700; color:var(--ink);
  animation:krnnRein .28s ease-out; }
/* OHNE KREIS UND OHNE GRUND (v2.979.0, Murat: „kisiler arkaplanli
   ekleniyor bu asla ve asla istenmiyor"): die Figur steht frei. */
.krnn-kind img, .krnn-kind-ohne{ width:48px; height:48px; object-fit:contain;
  background:none; border:0; border-radius:0; }
.krnn-kind-ohne{ display:flex; align-items:center; justify-content:center; font-size:20px; }
.krnn-kind span{ max-width:100%; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.krnn-leer{ grid-column:1/-1; font-size:12.5px; color:var(--muted); line-height:1.5; }
/* DIE GRUPPEN IN DER LOBBY (v2.850.0): eine Spalte je Gruppe, Rand und
   Punkt in der Farbe der Gruppe (`--gruppe`, vom Server - dieselbe Farbe wie
   der Rand der Blase auf der Bühne und die Farbe auf dem Kindertablet). Ein
   Kind ist ein Knopf: tippen setzt es in die naechste Gruppe. */
.krnn-gruppen-lobby{ margin-bottom:10px; }
.krnn-gruppen-leiste{ display:flex; align-items:center; gap:8px; flex-wrap:wrap; margin-bottom:10px; }
.krnn-mischen{ display:inline-flex; align-items:center; gap:6px; border:1px solid var(--line);
  background:var(--card); color:var(--ink); border-radius:999px; padding:6px 12px;
  font:inherit; font-size:var(--fs-sm,13px); font-weight:700; cursor:pointer; }
.krnn-mischen:hover{ border-color:var(--brand); color:var(--brand); }
.krnn-mischen svg{ width:16px; height:16px; fill:none; stroke:currentColor; stroke-width:2;
  stroke-linecap:round; stroke-linejoin:round; }
.krnn-gruppen-spalten{ display:grid; grid-template-columns:repeat(auto-fit,minmax(150px,1fr)); gap:10px; }
.krnn-gruppe{ border:2px solid var(--gruppe, var(--line)); border-radius:12px; background:var(--card); padding:8px; }
.krnn-gruppe-kopf{ display:flex; align-items:center; gap:6px; font-weight:800;
  font-size:var(--fs-sm,13px); color:var(--ink); margin-bottom:6px; }
.krnn-gruppe-kopf i{ width:12px; height:12px; border-radius:50%; background:var(--gruppe, var(--line)); }
.krnn-gruppe-kopf b{ margin-left:auto; color:var(--muted); font-weight:700; }
.krnn-gruppe-kinder{ display:flex; flex-wrap:wrap; gap:4px; min-height:48px; }
.krnn-gruppe .krnn-kind{ width:52px; border:0; background:none; padding:2px; font:inherit;
  cursor:pointer; border-radius:10px; }
.krnn-gruppe .krnn-kind:hover{ background:var(--surface-subtle); }
.krnn-gruppe .krnn-kind:disabled{ cursor:default; background:none; }
.krnn-gruppe .krnn-leer{ font-size:var(--fs-xs,12px); color:var(--muted); align-self:center; }
.krnn-gruppen-hinweis{ margin:8px 0 0; }

/* „baglanan oraya aninda düssün" - ein Kind, das beitritt, soll SICHTBAR
   dazukommen. Ohne die kleine Bewegung erscheint es einfach, und bei
   fuenfundzwanzig Gesichtern sieht niemand, welches neu ist. */
@keyframes krnnRein{ from{ opacity:0; transform:scale(.72); } to{ opacity:1; transform:none; } }

/* Der Countdown liegt IN der Buehne (damit er im Vollbild mitzaehlt) und
   ueber dem Iframe. `pointer-events:none`, weil er nichts bedient. */
.krnn-count{ position:absolute; inset:0; z-index:3; display:flex;
  align-items:center; justify-content:center; pointer-events:none;
  background:rgba(8,16,30,.52); }
.krnn-count span{ font-size:clamp(64px,18vh,190px); font-weight:800; color:var(--on-brand);
  letter-spacing:-.03em; text-shadow:0 6px 26px rgba(0,0,0,.55); }
.krnn-count span.an{ animation:krnnZaehl .9s ease-out; }
@keyframes krnnZaehl{ from{ opacity:0; transform:scale(1.7); } 60%{ opacity:1; } to{ opacity:.85; transform:scale(1); } }

@media (prefers-reduced-motion: reduce){
  .krnn-kind, .krnn-count span.an{ animation:none; }
}

/* Die Symbolleiste des Renn-Panels (v2.585.3). Kein Text auf der Buehne -
   die Beschriftung steht in title/aria-label. */
.krnn-icons{ display:flex; gap:6px; align-items:center; }
.krnn-ic{ width:34px; height:34px; border:0; border-radius:9px; cursor:pointer;
  background:var(--brand-soft); color:var(--brand); display:flex;
  align-items:center; justify-content:center; padding:0; }
.krnn-ic svg{ width:18px; height:18px; fill:none; stroke:currentColor;
  stroke-width:2; stroke-linecap:round; stroke-linejoin:round; }
.krnn-ic-los svg{ fill:currentColor; stroke:none; }
/* DER STOPP IST GEFUELLT UND ROT (Anweisung Murat 02.09.2026: „stop karesi
   kare olsun. büyütme gibi duruyor su an ... kirmizi olsun yani"). Als
   Umriss-Quadrat war er vom Vergroessern daneben nicht zu unterscheiden -
   zwei Knoepfe, dasselbe Bild. Derselbe Lucide-Pfad, nur gefuellt: ein
   ausgefuelltes Quadrat IST das Stoppzeichen. */
.krnn-ic-stop{ background:var(--bad-soft); color:var(--bad); }
.krnn-ic-stop svg{ fill:currentColor; stroke:none; }
/* DER POKAL IST GOLDEN, NICHT ROT (v2.603.0). Er steht neben dem Stopp und
   tut das Gegenteil: er WERTET das Rennen aus, statt es zu loeschen. Zwei
   Knoepfe in derselben Warnfarbe waeren vor der Klasse eine Falle. Die Farbe
   kommt aus dem Design-System (Amber), nicht als eigener Hexwert. */
.krnn-ic-pokal{ background:var(--amber-soft); color:var(--amber); }
.krnn-info{ font-size:12.5px; color:var(--muted); line-height:1.5;
  margin:-6px 0 12px; }
/* Die Ergebnisliste der Lehrkraft - Text neben dem Treppchen auf der
   Leinwand, damit die Reihenfolge nicht nur am Beamer steht. */
.krnn-ergebnis{ margin:12px 0 4px; border:1px solid var(--line);
  border-radius:12px; overflow:hidden; background:var(--card); }
.krnn-erg-kopf{ padding:8px 12px; font-size:12px; font-weight:800;
  letter-spacing:.04em; text-transform:uppercase; color:var(--muted);
  border-bottom:1px solid var(--line); }
.krnn-erg-zeile{ display:flex; align-items:center; gap:10px; padding:7px 12px;
  font-size:13.5px; border-top:1px solid var(--line); }
.krnn-erg-zeile:first-of-type{ border-top:0; }
.krnn-erg-platz{ min-width:26px; font-weight:800; color:var(--brand); }
.krnn-erg-zeile img{ width:26px; height:26px; border-radius:50%;
  border:1px solid var(--line); object-fit:cover; }
.krnn-erg-name{ flex:1; min-width:0; overflow:hidden; text-overflow:ellipsis;
  white-space:nowrap; font-weight:700; }
.krnn-erg-punkte{ font-variant-numeric:tabular-nums; color:var(--muted);
  font-weight:700; }
.krnn-ic:disabled{ opacity:.42; cursor:default; }
.krnn-kopf{ cursor:default; }
.krnn-titel{ font-weight:700; }
#krnn-raus{ display:none; }
#krnn-raus svg{ width:20px; height:20px; fill:none; stroke:currentColor;
  stroke-width:2; stroke-linecap:round; stroke-linejoin:round; }
#krnn-buehne.krnn-voll #krnn-raus, #krnn-buehne:fullscreen #krnn-raus{
  display:flex; align-items:center; justify-content:center; }

/* DER KOPF IM VOLLBILD: QR-Code und Startknopf oben in der Mitte (Anweisung
   Murat 26.09.2026). Nur im Vollbild UND nur in der Lobby - im Rennen stuende
   er den Figuren im Weg, und beitreten kann dann ohnehin niemand mehr. Er
   liegt ueber dem Iframe (z-index 2) und unter dem 3-2-1 (z-index 3). Der
   QR braucht eine helle Flaeche: auf dem Himmel eines Themas ist er sonst
   nicht zu lesen. */
.krnn-voll-kopf{ display:none; }
#krnn-buehne.krnn-voll.krnn-in-lobby .krnn-voll-kopf,
#krnn-buehne:fullscreen.krnn-in-lobby .krnn-voll-kopf{
  position:absolute; top:clamp(10px,2.5vh,26px); left:50%; transform:translateX(-50%);
  z-index:2; display:flex; flex-direction:column; align-items:center; gap:12px; }
.krnn-voll-qr{ display:flex; flex-direction:column; align-items:center; gap:6px;
  padding:10px 10px 8px; border-radius:16px; background:var(--card);
  box-shadow:0 10px 30px rgba(0,0,0,.35); }
.krnn-voll-qr span{ font-size:var(--fs-sm,13px); font-weight:800; color:var(--ink); }
.krnn-voll-qr-bild img, .krnn-voll-qr-bild canvas{
  width:clamp(120px,19vh,230px) !important; height:auto !important; display:block; }
.krnn-voll-start{ border:0; border-radius:999px; cursor:pointer;
  padding:clamp(10px,1.6vh,16px) clamp(22px,3vw,40px);
  font:inherit; font-size:clamp(17px,2.4vh,26px); font-weight:800;
  background:var(--ok); color:var(--on-brand); box-shadow:0 8px 24px rgba(0,0,0,.35); }
.krnn-voll-start:disabled{ background:rgba(8,16,30,.62); cursor:default; box-shadow:none; }

/* ===== ROBI – DIE WARTEFIGUR (v2.590.0) ==================================
   Loest die Lottie-Katze auf der Ladekarte und im Erklaerblatt ab. Robi ist
   ECHTE Pixelgrafik: ein Sprite-Streifen, den static/js/robi-warten.js ueber
   `background-position` weiterschaltet. Deshalb steht hier kein Bild-Layout,
   sondern nur Lage und `image-rendering` - Groesse und Ausschnitt setzt das
   Skript, weil beides von der Kastenbreite abhaengt.

   Die Bilddateien stehen HIER und nicht im Skript, damit der Pfad an einer
   Stelle liegt und der Dunkelmodus die Zeichenkacheln tauschen kann.
   VERBUNDEN MIT: static/js/robi-warten.js, static/images/robi/*,
   scripts/build_robi_sprite.py, .ss-lade-maskottchen, .eb-sperre-maskottchen. */
/* Waagerecht abgeschnitten, senkrecht frei (v2.992.0, Murat: „robi üretim
   yaparken o sayılar kesiliyor"): die Zeichen steigen über die Bahn hinaus. */
.robi-bahn{position:relative;width:100%;overflow:hidden;overflow-x:clip;overflow-y:visible;}
.robi-figur{position:absolute;left:0;bottom:5px;
  background-image:url("/static/images/robi/robi-streifen.png");
  background-repeat:no-repeat;image-rendering:pixelated;will-change:transform;}
.robi-blatt{position:absolute;
  background-image:url("/static/images/robi/robi-blatt.png");
  background-repeat:no-repeat;background-size:100% 100%;image-rendering:pixelated;}
.robi-zeichen{position:absolute;
  background-image:url("/static/images/robi/robi-zeichen-hell.png");
  background-repeat:no-repeat;image-rendering:pixelated;pointer-events:none;}
@media (prefers-color-scheme:dark){
  .robi-zeichen{background-image:url("/static/images/robi/robi-zeichen-dunkel.png");}
}

/* ===== ROBI ALS ASSISTENT (v2.911.0: der neue Robi) =====================
   Bis v2.910.0 standen hier die Pixel-Streifen des alten Assistenten
   (.robi-fig, .robi-kopf, .robi-knopf, .robi-menue mit robi-assistent.png
   und robi-icon.png). Seit v2.911.0 zeichnet static/js/robi-figur.js alle
   drei Robis auf eine Leinwand: den Knopf (.asst-mk-figur, oben), das stille
   Gesicht im Fensterkopf (.robi-kopf-figur, oben) und die abgelegte Zeile in
   der Leiste (.robi-leiste-figur, unten). Die beiden PNG bleiben fuer den
   Escape-Raum und das Handbuch liegen.
   VERBUNDEN MIT: static/js/robi-figur.js, asstFigurLaden()/asstIconeSetzen()
   (index-app.js), qa/unit/test_robi_figur.py. */

/* ===== ROBI ABLEGEN UND FREILASSEN (v2.593.0) ============================
   Das Minus im Fensterkopf legt den schwebenden Knopf in die Seitenleiste,
   das Plus holt ihn zurueck. Der Knopf sieht aus wie der Schliessen-Knopf
   daneben - zwei Knoepfe in einer Kopfzeile, die verschieden aussehen, aber
   dasselbe Gewicht haben, lesen sich wie ein Fehler.
   VERBUNDEN MIT: asstDockUmschalten()/asstIconeSetzen() (index-app.js),
   #asst-andocken (templates/index.html), qa/unit/test_assistent_andocken.py. */
.asst-andocken{background:none;border:none;cursor:pointer;padding:6px;
  border-radius:8px;color:var(--muted);display:flex;align-items:center;
  justify-content:center;line-height:0;}
/* Robis Farbknopf traegt dieselbe Klasse und bleibt weg, solange er nichts
   umfaerben kann (asstIconeSetzen setzt `hidden`). */
.asst-andocken[hidden]{display:none;}
.asst-andocken:hover{background:color-mix(in srgb,var(--brand) 12%,var(--card));color:var(--ink);}
.asst-andocken svg{width:18px;height:18px;}
/* Abgelegt: der schwebende Knopf ist weg. Die Klasse liegt am <body>, damit
   auch ein spaeter eingehaengter Knopf sie mitbekommt. */
body.asst-angedockt .asst-mk{display:none !important;}
/* Robi als Menuezeichen (v2.595.0, seit v2.911.0 die kleine Leinwandfigur).
   Er ist ein Bild und keine Strichzeichnung, deshalb faerbt sich das
   Plaettchen beim Ueberfahren NICHT ein - eine farbige Flaeche hinter einer
   farbigen Figur waere Farbe auf Farbe. */
.robi-leiste{display:block;width:34px;height:34px;}
.robi-leiste-figur{width:34px;height:34px;display:block;}

/* ===== ROBI GROSS (v2.950.0) =================================================
   Murat 04.10.2026: „ortada büyük bir pencere … geniş bir pencere … arka
   taraf buğulu … Robi'ye odak." DASSELBE Fenster (#asst-widget), nur mittig
   und breit; dahinter der Schleier #asst-schleier, weichgezeichnet wie die
   Ladekarte (.ss-lade): blur + saturate, mit deckendem Rückfall. Ein
   Vollbild-Filter ist hier vertretbar (DESIGN_SYSTEM §5.1): er liegt nur,
   solange Robi groß offen ist, über einer stillstehenden Seite – nicht wie
   v2.647.0 dauerhaft an einer rollenden Leiste mit Animation darin.
   Am Telefon gibt es den Knopf nicht (dort ist Robi schon eine Fläche über
   die volle Breite).
   VERBUNDEN MIT: asstGrossAnwenden/asstGrossUmschalten (index-app.js),
   templates/index.html (#asst-gross, #asst-schleier),
   qa/unit/test_robi_gross.py. */
.asst-schleier{ position:fixed; inset:0; z-index:1199;
  background:color-mix(in srgb,color-mix(in srgb,var(--brand) 12%,var(--paper)) 58%,transparent);
  -webkit-backdrop-filter:blur(14px) saturate(1.08); backdrop-filter:blur(14px) saturate(1.08); }
.asst-schleier[hidden]{ display:none; }
@supports not ((backdrop-filter:blur(2px)) or (-webkit-backdrop-filter:blur(2px))){
  .asst-schleier{ background:color-mix(in srgb,var(--paper) 94%,transparent); }
}
.asst-widget.asst-gross{ top:50%; left:50%; right:auto; bottom:auto; transform:translate(-50%,-50%);
  width:min(1000px,calc(100vw - 64px)); height:min(780px,calc(var(--vh100) - 64px));
  border-radius:24px; box-shadow:var(--e-3); }
.asst-widget.asst-gross .asst-kopf{ padding:14px 20px; }
.asst-widget.asst-gross .asst-messages{ padding:24px clamp(20px,5%,56px); gap:14px; }
.asst-widget.asst-gross .asst-msg{ max-width:min(72%,640px); font-size:var(--fs-md); padding:11px 16px; border-radius:16px; }
.asst-widget.asst-gross .asst-input{ padding:14px clamp(16px,4%,48px) 18px; }
.asst-widget.asst-gross .asst-input input{ font-size:var(--fs-md); padding:12px 18px; }
body.asst-gross-offen .asst-mk{ display:none; }
@media (prefers-reduced-motion:no-preference){
  .asst-widget.asst-gross{ animation:asst-gross-ein .22s cubic-bezier(.2,.8,.2,1); }
  .asst-schleier:not([hidden]){ animation:asst-schleier-ein .22s ease; }
}
@keyframes asst-gross-ein{ from{ opacity:0; transform:translate(-50%,-48%) scale(.97); } }
@keyframes asst-schleier-ein{ from{ opacity:0; } }
@media (max-width:640px){ #asst-gross{ display:none; } }

/* ===== ROBIS GESPRÄCHE (v2.951.0) ============================================
   Murat 04.10.2026: „geçmiş konuşmalar soldaki". Nur im GROSSEN Fenster: das
   Fenster wird ein Raster aus zwei Spalten – links #asst-verlauf über die
   ganze Höhe, rechts alles wie bisher (Kopf, Nachrichten, Vorschläge,
   Eingabe). Klein bleibt die Leiste unsichtbar; die Gespräche werden trotzdem
   gemerkt. Fläche und Kante aus den Tokens, keine eigene Farbe.
   VERBUNDEN MIT: asstVerlauf* (index-app.js, ROBIS GESPRÄCHE),
   templates/index.html (#asst-verlauf), robi_gespraeche.py,
   qa/unit/test_robi_gespraeche_browser.py. */
.asst-verlauf{ display:none; }
.asst-widget.asst-gross{ display:grid; grid-template-columns:clamp(200px,26%,270px) minmax(0,1fr);
  grid-template-rows:auto minmax(0,1fr) auto auto auto; }
.asst-widget.asst-gross > *{ grid-column:2; }
.asst-widget.asst-gross > .asst-verlauf{ grid-column:1; grid-row:1 / -1; display:flex; flex-direction:column; min-height:0;
  border-right:1px solid var(--asst-kante); background:var(--asst-hauch); }
.asst-vl-kopf{ display:flex; align-items:center; justify-content:space-between; gap:8px; padding:16px 12px 10px 18px; }
.asst-vl-kopf b{ font-size:var(--fs-sm); font-weight:800; color:var(--ink); }
.asst-vl-neu{ display:inline-flex; align-items:center; gap:6px; height:32px; padding:0 12px; border:1px solid transparent;
  border-radius:var(--r-pill); background:var(--brand-soft); color:var(--brand-dk); font:inherit; font-size:var(--fs-xs); font-weight:700; cursor:pointer; }
.asst-vl-neu:hover{ border-color:var(--asst-kante); background:color-mix(in srgb,var(--brand) 22%,var(--card)); }
.asst-vl-liste{ flex:1 1 auto; min-height:0; overflow-y:auto; overscroll-behavior:contain; padding:2px 8px 8px;
  display:flex; flex-direction:column; gap:2px; }
.asst-vl-zeile{ display:flex; align-items:center; border-radius:10px; }
.asst-vl-zeile:hover,.asst-vl-zeile.an{ background:var(--card); }
.asst-vl-zeile.an{ box-shadow:inset 0 0 0 1px var(--asst-kante), inset 3px 0 0 var(--brand); }
.asst-vl-titel{ flex:1; min-width:0; display:flex; flex-direction:column; gap:2px; padding:8px 6px 8px 10px; border:0;
  background:transparent; color:var(--ink); font:inherit; text-align:left; cursor:pointer; }
.asst-vl-titel span{ font-size:var(--fs-sm); font-weight:600; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.asst-vl-titel small{ font-size:var(--fs-2xs); color:var(--muted); }
.asst-vl-weg{ flex:none; display:grid; place-items:center; width:30px; height:30px; margin-right:4px; padding:0; border:0;
  border-radius:8px; background:transparent; color:var(--muted); cursor:pointer; opacity:0; }
.asst-vl-zeile:hover .asst-vl-weg,.asst-vl-zeile.an .asst-vl-weg,.asst-vl-weg:focus-visible{ opacity:1; }
/* Ohne Zeiger (iPad) gibt es kein Überfahren – der Papierkorb steht immer da. */
@media (hover:none){ .asst-vl-weg{ opacity:1; } }
.asst-vl-weg:hover{ color:var(--bad); background:var(--surface-subtle); }
.asst-vl-leer{ margin:6px 10px; font-size:var(--fs-xs); color:var(--muted); }
.asst-vl-alle{ align-self:flex-start; margin:4px 12px 14px; padding:4px 6px; border:0; background:transparent;
  color:var(--muted); font:inherit; font-size:var(--fs-xs); text-decoration:underline; cursor:pointer; }
.asst-vl-alle[hidden]{ display:none; }
.asst-vl-alle:hover{ color:var(--bad); }
#app-sidebar .sb-robi:hover .sb-ico{background:transparent;}
/* ===== AM RECHNER STEHT ROBI GROSS UND OHNE NAMEN (v2.920.0) ===========
   Befund Murat 01.10.2026: „robi kücüldügünde cok kücülüyor … robi
   yazmasin ama boyutu büyük olsun, sonucta orda da hareket yapiyo,
   görünsün." Zugeklappt standen 34 px Figur in 68 px Breite, darunter das
   Wort „Robi" in 9,5 px - die Figur bewegt sich, und man sah es kaum.
   Jetzt fuellt die Figur die Spalte (54 px) und das Wort entfaellt;
   aufgeklappt steht es weiter neben ihr. Auf kurzen Fenstern wird sie in
   zwei Stufen kleiner, damit sie den Eintraegen keinen Platz nimmt.
   Die Leinwand wird in robi-figur.js mit 56 px gezeichnet (ssRobiLeiste-
   Einsetzen) - groesser anzeigen als zeichnen hiesse unscharf.
   Die Schublade (unter 900 px) behaelt ihre 34 px Zeile.
   VERBUNDEN MIT: renderMainNav() (robiItem), qa/unit/test_assistent_andocken.py. */
@media (min-width:900px){
  #app-sidebar .sb-robi{--robi-gr:54px;}
  #app-sidebar .sb-robi .robi-leiste,
  #app-sidebar .sb-robi .robi-leiste-figur{width:var(--robi-gr);height:var(--robi-gr);}
  /* `.sb-item.sb-robi` und nicht nur `.sb-robi`: die eingeklappte Regel
     `body:not(.sb-open) #app-sidebar .sb-ico` (30x26) wiegt sonst mehr,
     und die Figur ragte aus ihrem Plaettchen. */
  #app-sidebar .sb-item.sb-robi .sb-ico{width:auto;height:auto;}
  body:not(.sb-open) #app-sidebar .sb-robi{padding:4px 0;}
  body:not(.sb-open) #app-sidebar .sb-robi .sb-label{display:none;}
  body.sb-open #app-sidebar .sb-robi .sb-label-full{font-size:15px;}
}
@media (min-width:900px) and (max-height:760px){
  #app-sidebar .sb-robi{--robi-gr:46px;}
}
@media (min-width:900px) and (max-height:620px){
  #app-sidebar .sb-robi{--robi-gr:38px;}
}

/* ===== ROBIS FARBE (v2.911.0) ===========================================
   Eine kleine Reihe unter dem Fensterkopf, rechts unter dem Farbknopf. Die
   Muster bekommen ihre Toene als Variablen aus ssRobiFarbListe()
   (robi-figur.js) - hier steht kein eigener Farbwert. Gewaehlt ist das
   Muster mit dem Ring in der Markenfarbe.
   VERBUNDEN MIT: asstFarbwahlUmschalten/asstFarbeWaehlen (index-app.js),
   #asst-farbe/#asst-farbwahl (templates/index.html). */
.asst-farbwahl{position:absolute;top:calc(100% + 6px);right:52px;z-index:3;
  display:flex;flex-wrap:wrap;justify-content:center;gap:8px;max-width:252px;padding:8px 10px;
  background:var(--card);border:1px solid var(--line);border-radius:var(--r-card);box-shadow:var(--e-2);}
.asst-farbwahl[hidden]{display:none;}
.asst-farbpunkt{width:28px;height:28px;padding:0;border-radius:50%;cursor:pointer;
  border:2px solid var(--robi-rand);
  background:linear-gradient(145deg,var(--robi-hell),var(--robi-dunkel));}
.asst-farbpunkt[aria-checked="true"]{box-shadow:0 0 0 2px var(--card),0 0 0 4px var(--brand);}
.asst-farbpunkt:focus-visible{outline:2px solid var(--brand);outline-offset:3px;}
/* Die Farben und der Lautsprecher fuer Robis Toene (v2.912.0) teilen sich die
   Reihe; ein senkrechter Strich trennt Auswahl und Schalter. */
.asst-farbreihe{display:flex;gap:8px;}
.asst-farbtrenner{width:1px;align-self:stretch;margin:2px 2px;background:var(--line);}
.asst-tonknopf{width:28px;height:28px;padding:0;border:none;border-radius:50%;
  background:none;color:var(--muted);cursor:pointer;display:flex;
  align-items:center;justify-content:center;line-height:0;}
.asst-tonknopf[hidden]{display:none;}
.asst-tonknopf:hover{background:var(--paper);color:var(--ink);}
.asst-tonknopf[aria-pressed="true"]{color:var(--ink);}
.asst-tonknopf:focus-visible{outline:2px solid var(--brand);outline-offset:2px;}
/* ROBIS KLEIDERSCHRANK (v2.962.0): eine zweite Zeile unter Farben und Ton,
   je Stueck ein kleines Bild von Robi (ssRobiKleidVorschau, robi-figur.js).
   „Passend zur Jahreszeit" traegt ein Kalenderzeichen (Lucide calendar-heart).
   Kein eigener Farbwert - nur Variablen. */
.asst-kleidreihe{flex-basis:100%;display:grid;grid-template-columns:repeat(6,32px);gap:6px;
  justify-content:center;padding-top:8px;border-top:1px solid var(--line);}
.asst-kleidpunkt{position:relative;width:32px;height:32px;padding:0;cursor:pointer;
  display:flex;align-items:center;justify-content:center;
  border:1px solid var(--line);border-radius:var(--r-control);background:var(--paper);}
.asst-kleidpunkt canvas{display:block;width:30px;height:30px;}
.asst-kleidpunkt[aria-checked="true"]{box-shadow:0 0 0 2px var(--card),0 0 0 4px var(--brand);}
.asst-kleidpunkt:focus-visible{outline:2px solid var(--brand);outline-offset:3px;}
.asst-kleid-auto{position:absolute;right:-5px;bottom:-5px;width:16px;height:16px;border-radius:50%;
  display:flex;align-items:center;justify-content:center;line-height:0;
  background:var(--card);color:var(--brand);box-shadow:var(--e-1);}
/* ===== ROBI STEHT IN DER LEISTE MITTIG (v2.862.3) =======================
   Befund Murat 26.09.2026: „robiyi kücültünce cok sacma duruyo … acik
   haldeyken sadece robi sola kücültüldüyse ortali dursun."
   Aufgeklappt (und in der mobilen Schublade) war Robi eine Menuezeile wie
   die Bereiche darueber: Gesicht ganz links, Name daneben - und darunter
   die Fassungsnummer MITTIG. Robi ist aber kein Bereich, den man
   durchblaettert, sondern ein abgelegter Knopf; er steht deshalb wie die
   Nummer unter ihm in der Mitte der Leiste. Zugeklappt stand er schon
   mittig (Spalte), seit v2.862.2 auch genau mittig zwischen Rand und
   Panel.
   ⛔ `.sb-desc` MUSS HIER WEG, nicht nur unsichtbar sein: sie ist
   `display:block` mit `max-height:0` - unsichtbar, aber so breit wie
   „Fragen, Melden, Codes". Die Beschriftung waere damit rund 110 px breit,
   und die Gruppe aus Gesicht und Name stuende sichtbar links der Mitte.
   VERBUNDEN MIT: renderMainNav() (robiItem), qa/unit/test_assistent_andocken.py. */
#app-sidebar .sb-robi{justify-content:center;}
#app-sidebar .sb-robi .sb-desc{display:none;}

/* ===========================================================================
   LESESTUNDE – das Fenster „Mit Klasse teilen" (PLAN_LESESTUNDE §B2)
   =========================================================================== */
.ls-quelle{margin:0 0 14px;font-size:13px;color:var(--muted);}
.ls-lab{display:block;font-weight:700;font-size:13.5px;margin:10px 0 6px;}
.ls-feld{width:100%;padding:9px 11px;border:1px solid var(--line);
  border-radius:var(--r-control);background:var(--card);color:var(--ink);
  font:inherit;font-size:14px;}
/* Ab/Bis nebeneinander - untereinander wäre es eine Liste aus zwei Dingen,
   die zusammengehören. */
.ls-zeile{display:flex;gap:10px;}
.ls-zeile>div{flex:1;min-width:0;}
.ls-haken{display:flex;align-items:center;gap:8px;margin:12px 0 0;
  font-size:13.5px;cursor:pointer;}
.ls-haken input{width:auto;margin:0;}
.ls-err{font-size:13px;color:var(--bad);margin-top:10px;}
.ls-schon{margin-top:14px;padding-top:12px;border-top:1px solid var(--line);
  font-size:13px;}
.ls-schon-z{display:flex;align-items:center;justify-content:space-between;
  gap:10px;margin-top:8px;color:var(--muted);}
/* „Zum Lesen": dieselbe Kachel wie eine Aufgabe, nur ohne Frist-Zeile.
   Eine gelesene bleibt sichtbar und ruhig - sie verschwindet nicht, damit
   ein Kind sie wieder aufschlagen kann. */
.sl-task.sl-lesen.ist-gelesen{opacity:.72;}
.ls-stand{flex:1;text-align:right;font-size:12.5px;color:var(--muted);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
/* Die Kopfzeile des LEEREN Verzeichnisses: nur der Hinzufügen-Knopf, rechts
   wie in der gefüllten Tabelle. Ohne eigene Regel stünde er linksbündig und
   spränge beim ersten Kind auf die andere Seite. */
.sv-kopf-leer{display:flex;justify-content:flex-end;margin-bottom:10px;}

/* Personal: Zellen statt großer Dialoge, Einsatz mit Platz für Auswahlfelder. */
.sv-person-zelle{border:0;background:transparent;color:inherit;font:inherit;text-align:left;cursor:pointer;width:100%;min-height:28px;padding:2px 0}
.sv-person-zelle:hover,.sv-person-zelle:focus-visible{color:var(--brand);text-decoration:underline}
/* ⛔ KLEINER, UND ALS LUCIDE STATT EMOJI (Befund Murat 06.09.2026:
   „Disliyi lucida yap cirkin duruyo bu yazilari biraz daha kücült
   boyutlarida kücült ikonlarin cöp kutusu filan"). Weil beide Symbole jetzt
   <svg> sind und kein Emoji mehr, zaehlt die Kantenlaenge des SVG - eine
   Schriftgroesse haette darauf keine Wirkung mehr. */
.sv-person-icon,.icon-act.sv-person-icon{border:0;background:transparent;box-shadow:none;cursor:pointer;width:24px;height:24px;color:var(--muted);padding:3px}
.sv-person-icon svg{width:16px;height:16px;display:block;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.sv-person-icon:hover{color:var(--ink)}
.icon-act.danger.sv-person-icon:hover{color:var(--bad)}
.icon-act.danger.sv-person-icon{color:var(--bad)}
.sv-person-feld{position:fixed;z-index:10050;width:min(360px,calc(100vw - 16px));max-height:calc(var(--vh100) - 24px);overflow:auto;background:var(--card);border:1px solid var(--line);border-radius:12px;padding:14px;box-shadow:var(--shadow);display:grid;gap:10px;font-size:13px}
.sv-person-feld label{display:grid;gap:5px}.sv-person-feld input:not([type=checkbox]),.sv-person-feld select{width:100%;min-height:34px;border:1px solid var(--line);border-radius:7px;padding:6px;background:var(--card);color:var(--ink)}
.sv-person-auswahl{display:flex;gap:8px 16px;flex-wrap:wrap;max-height:260px;overflow:auto}.sv-person-auswahl label{display:flex;align-items:center;gap:5px}
.sv-person-menu{display:grid;gap:3px}.sv-person-menu button{border:0;background:transparent;font:inherit;text-align:left;cursor:pointer;padding:9px;border-radius:6px}.sv-person-menu button:hover{background:var(--paper)}.sv-person-menu .danger{color:var(--bad)}
.sv-person-fuss{display:flex;gap:8px}.sv-person-fuss .btn{margin:0;flex:1;font-size:13px;padding:8px}
#sve-modal .sv-e-profil{width:calc(100vw - 40px);max-width:1200px}
#sve-modal .sv-kl-weg,#sve-modal .sv-modal-x{border:0;box-shadow:none;background:transparent;color:var(--bad)}
#sve-modal .sv-e-zwei{grid-template-columns:minmax(360px,0.9fr) minmax(530px,1.3fr)}
#sve-modal .sv-e-wz{display:grid;grid-template-columns:minmax(130px,1fr) minmax(130px,1fr) 105px auto 26px;align-items:center;gap:7px}
#sve-modal .sv-e-wz select{min-width:0;width:100%}
#sve-modal .sv-e-fachz{display:grid;grid-template-columns:minmax(140px,1.5fr) minmax(95px,1fr) minmax(105px,1fr) 26px;gap:7px}
@media(max-width:1000px){#sve-modal .sv-e-zwei{grid-template-columns:1fr}}
@media(max-width:600px){#sve-modal .sv-e-wz{grid-template-columns:1fr 1fr 26px}#sve-modal .sv-e-wz>button{grid-column:3;grid-row:1}#sve-modal .sv-e-fachz{grid-template-columns:1fr 1fr}#sve-modal .sv-e-profil{width:calc(100vw - 16px)}}

/* Schulplanung: viele Klassen wachsen nach unten, die Wochenachse bleibt stabil. */
.sv-p-veroeff { display:flex; align-items:center; gap:12px; flex-wrap:wrap; }
.sv-p-veroeff > .sv-p-ansicht { margin:0; }
.sv-p-veroeff > span { flex:1; text-align:center; }
.sv-p-aktionen { display:flex; align-items:center; justify-content:flex-end; gap:8px; margin-left:auto; flex-wrap:wrap; }
.sv-p-aktionen .btn { width:auto; margin:0; padding:7px 13px; font-size:13px; }
.sv-plan-filter{ position:relative; flex:none; }
.sv-plan-filter-knopf{ display:inline-flex; align-items:center; gap:6px; height:34px;
  border:0; background:transparent; color:var(--ink); font:inherit;
  font-size:var(--fs-xs); font-weight:700; padding:0 4px; cursor:pointer; }
.sv-plan-filter-knopf:hover,.sv-plan-filter-knopf[aria-expanded="true"]{
  color:var(--flaeche-akzent, var(--brand)); }
.sv-plan-filter-knopf svg{ width:16px; height:16px; flex:none; }
.sv-plan-filter-menue{ position:absolute; top:calc(100% + 7px); left:0; z-index:70;
  width:250px; max-width:min(280px,88vw); display:grid; gap:9px; padding:11px;
  border:1px solid var(--line); border-radius:12px; background:var(--card);
  box-shadow:0 14px 38px rgba(27,34,48,.18); color:var(--ink); }
.sv-plan-filter-menue label{ display:grid; gap:4px; font-size:var(--fs-2xs); font-weight:700; }
.sv-plan-filter-menue select{ width:100%; min-width:0; }
.sv-p-bedienhinweis{ margin:0 0 10px; color:var(--muted); font-size:var(--fs-xs); }

/* ⛔ DER STAND OBEN, ALS FARBE. Rot heisst offen, gruen heisst fertig -
   dieselbe Lesart wie `.sv-stand` in der Verteilungsmatrix. Er ist zugleich
   der Griff zur schwebenden Arbeitsliste (Begruendung im Code bei
   `svPlanVorratHtml`). */
.sv-p-standknopf{ height:34px; box-sizing:border-box; border:1px solid var(--line);
  border-radius:999px; background:var(--card); font:inherit; font-size:var(--fs-xs);
  font-weight:700; padding:0 13px; cursor:pointer; white-space:nowrap; flex:none; }
.sv-p-standknopf.voll{ color:var(--ok); border-color:var(--ok); }
.sv-p-standknopf.offen{ color:var(--bad); border-color:var(--bad); }
.sv-p-standknopf[aria-expanded="true"]{
  box-shadow:0 0 0 3px var(--flaeche-akzent-soft, var(--brand-soft)); }

/* ⛔ DIE ARBEITSLISTE SCHWEBT UEBER DEM GITTER, statt es nach unten zu
   schieben. Sie ist kein Modal - waehrend sie offen ist, wird ins Gitter
   geklickt; genau darin besteht die Bedienung. Verschoben wird sie an der
   Kopfzeile (`touch-action:none`, sonst scrollt darunter die Seite weg). */
.sv-p-vorrat-fl{ position:fixed; z-index:80; width:300px;
  max-width:calc(100vw - 24px); max-height:min(60vh, 520px);
  display:flex; flex-direction:column; border:1px solid var(--line);
  border-radius:14px; background:var(--card); overflow:hidden;
  box-shadow:0 18px 46px rgba(27,34,48,.22); }
.sv-p-vorrat-kopf{ display:flex; align-items:center; gap:8px; padding:9px 11px;
  border-bottom:1px solid var(--line); background:var(--paper);
  cursor:grab; touch-action:none; user-select:none; }
.sv-p-vorrat-kopf b{ font-size:var(--fs-xs); color:var(--ink); }
.sv-p-vorrat-kopf i{ flex:1; min-width:0; font-style:normal;
  font-size:var(--fs-2xs); color:var(--muted); }
.sv-p-vorrat-kopf button{ border:0; background:transparent; color:var(--muted);
  font:inherit; line-height:1; padding:3px 5px; border-radius:6px; cursor:pointer; }
.sv-p-vorrat-kopf button:hover{ color:var(--ink); background:var(--card); }
.sv-p-vorrat-liste{ padding:9px; overflow:auto; display:grid; gap:6px;
  align-content:start; }
.sv-p-vorrat-liste .sv-p-offen{ width:100%; margin:0; }

/* Drucken ist ein Handgriff, kein Satz - Symbol, rechts angeschlagen. */
/* Zwei Knoepfe, weil es zwei Fragen sind: DIESE Person oder ALLE. Der erste
   schiebt sich nach rechts, der zweite haengt sich an ihn. */
.sv-p-druck{ display:inline-flex; align-items:center; justify-content:center;
  gap:4px; height:34px; min-width:34px; padding:0 8px; flex:none;
  border:1px solid var(--line); border-radius:9px; background:var(--card);
  color:var(--ink); cursor:pointer; }
.sv-p-druck:first-of-type{ margin-left:auto; }
.sv-p-druck:hover{ color:var(--flaeche-akzent, var(--brand));
  border-color:var(--flaeche-akzent, var(--brand)); }
.sv-p-druck svg{ width:17px; height:17px; flex:none; }
.sv-p-druck i{ font-style:normal; font-size:var(--fs-2xs); font-weight:700; }
/* ⛔ DAS GITTER NIMMT DEN PLATZ, DER DA IST (Befund Murat 06.09.2026:
   „altta cok bosluk var … mesela o bosluga dogru niye uzatmiyoz ki tabloyu.
   beyaz alana bak alttaki"). Es stand auf festen `65vh` - auf einem hohen
   Bildschirm endete die Tabelle also bei 65 % der Fensterhoehe, und darunter
   lag der Rest der Karte weiss und leer, waehrend man IM Gitter scrollte.
   Zwei Rollbalken fuer eine Tabelle, und der untere Teil des Fensters
   verschenkt.

   Jetzt zaehlt der Abstand vom oberen Rand des Gitters bis zum Fensterende.
   `--sv-p-oben` misst `svPlanHoeheSetzen()` nach jedem Zeichnen und bei
   jeder Groessenaenderung; der Wert hier ist nur der Startwert fuer den
   ersten Bildaufbau. `--vh100` statt `100vh` ist die Hausregel dieser Datei
   (siehe „SICHERHEITSNETZ" weiter oben): auf dem Tablet zaehlt `100vh` die
   Adressleiste mit und das Gitter ragte unten heraus.

   Die Untergrenze bleibt, damit ein kleines Fenster oder eine aufgeklappte
   Filterzeile das Gitter nicht auf zwei Zeilen zusammendrueckt. */
.sv-p-schulraster { max-height:max(320px, calc(var(--vh100) - var(--sv-p-oben, 320px)));
  overflow:auto; width:100%; }
.sv-p-schulraster table { width:max-content; min-width:100%; table-layout:fixed; border-collapse:separate; border-spacing:0; }
.sv-p-schulraster td, .sv-p-schulraster th { min-width:86px; width:86px; }
.sv-p-schulraster thead { position:sticky; top:0; z-index:3; background:var(--card); }
.sv-p-schulraster th small { display:block; color:var(--muted); font-weight:normal; }
.sv-p-schulraster .sv-p-stamm { position:sticky; left:0; width:170px; min-width:170px; max-width:170px; white-space:normal; background:var(--card); z-index:2; text-align:left; padding:10px; }
.sv-p-schulraster thead .sv-p-stamm { z-index:4; }
.sv-p-schulraster .sv-p-stapel button { min-height:40px; cursor:grab; }
.sv-p-schulraster .sv-p-stapel button.an { outline:2px solid var(--brand); }
.sv-kursbedarf { display:flex; flex-wrap:wrap; gap:8px; margin-top:14px; }
.sv-kursbedarf > * { padding:10px; border:1px solid var(--line); border-radius:10px; background:var(--card); color:var(--ink); }
/* ⛔ EIN GESPERRTES FELD IST KEIN LEERES FELD (Befund Murat 06.09.2026:
   „eksi yerine o hücre böyle citik cizik olsun hani kapali oldugu
   göszterilir ya"). Ein „–" sah aus wie „hier fehlt noch jemand" und lud
   zum Klicken ein - dabei ist die Klasse in Kurse aufgeteilt und an DIESER
   Stelle gibt es nichts mehr zu besetzen. Die Schraffur sagt das ohne Wort
   und ohne eine zweite Farbe: dieselbe --line, nur schräg. */
/* ⛔ ROT HEISST OFFEN, GRUEN HEISST FERTIG (Befund Murat 06.09.2026:
   „kirmizi yazariz metini sonucta erledigt degil 3 te 3 olunca mesela
   yesile döner"). Vorher stand dort eine graue Zahl - im Vorbeigehen
   nicht zu lesen, und grau sagt nichts darueber, ob noch Arbeit ansteht. */
/* ⛔ DIE HANDGRIFFE AM FACH (v2.674.0). Sie erscheinen erst beim Zeigen -
   in einer Tabelle mit zwanzig Faechern waeren sechzig sichtbare Symbole
   lauter als die Zuordnungen, um die es geht. Auf dem Telefon gibt es kein
   Zeigen, deshalb dort immer sichtbar. */
.svu-fkopf{ display:inline-flex; align-items:center; gap:6px; min-width:0; }
/* ⛔ DIE WERKZEUGE AM FACH SIND IMMER ZU SEHEN (v2.701.0)
   Befund Murat 10.09.2026: „su unterricht kismi var ya yukarsa fachlarin
   yaninda üstüne gelince acilan yüc tusu görünür yapsak asko ya. cünki su an
   oralar görünmüyo ya ben bile kirk saat aradim."

   Er hat sie selbst gebaut und sie selbst nicht gefunden - deutlicher wird
   ein Befund nicht. `opacity:0` bis zum Hover heisst: es GIBT keinen Hinweis,
   dass an dieser Spalte etwas zu tun ist. Auf einem Touchscreen gibt es
   ueberhaupt keinen Hover; dort war der Weg zur Aufteilung schlicht nicht
   vorhanden (deshalb stand im schmalen Bereich schon `opacity:1`).

   Sie stehen jetzt dauerhaft da, aber ZURUECKGENOMMEN (.5) - sichtbar genug,
   um sie zu finden, leise genug, dass zwanzig Fachspalten nicht zur
   Knopfleiste werden. Beim Hover werden sie voll deckend. */
/* ===========================================================================
   DER WIZARD „AUS MEINEM STUNDENPLAN" (v2.705.0, neu gefasst v2.707.0)
   ---------------------------------------------------------------------------
   Befund Murat 11.09.2026: „liste … anlasilir halde degil, ne nerde ne var
   hic belli degil". Die Liste stand in einem 620px-Fenster, jede Zeile mit
   vier Auswahlfeldern - was am Ende ENTSTEHT, stand nirgends.

   Jetzt ein grosses Fenster mit ZWEI Spalten:
     links   die Woche wie in Untis (Tage x Stunden); jede Stunde traegt die
             Farbe dessen, was mit ihr passiert;
     rechts  je Unterricht eine Zeile in den Spalten von WebUntis „Mein
             Unterricht" (Klasse · Fach · Wst) und daneben, was daraus wird:
             die Klasse gross, darunter das Fach. Die Auswahlfelder stehen
             hinter „Ändern" - sofort offen nur bei „Bitte prüfen".
   Zeigen auf eine Zeile hebt ihre Stunden hervor, ein Klick auf eine Stunde
   springt zu ihrer Zeile.

   Die Farbe ist die Aussage und kommt nur aus Tokens (DESIGN_SYSTEM §3):
   gruen = wird angelegt, bernstein = anfassen, gestrichelt = geht hier nicht
   (auch Aufsichten), blau = schon verbunden, weiss = abgewaehlt.

   Die gesperrten Zeilen werden NICHT ausgeblendet. Sie stehen mit ihrem
   Grund da; sonst fehlte der halbe Stundenplan ohne Erklaerung.
   =========================================================================== */
.utw-card{ max-width:1320px; width:100%; height:min(880px, calc(var(--vh100) - 36px));
  max-height:none; padding:0;
  display:flex; flex-direction:column; overflow:hidden; }
.utw-card.klein{ max-width:620px; height:auto; max-height:82vh; overflow-y:auto; }
.utw-head{ padding:var(--s-4) var(--s-5); margin:0; }
.utw-head-text{ display:flex; flex-direction:column; gap:2px; min-width:0; }
.utw-head-text b{ font-size:var(--fs-lg); }
.utw-head-text span{ font-size:var(--fs-sm); color:var(--muted); }
.utw-body{ flex:1; min-height:0; display:flex; flex-direction:column; }
.utw-card.klein .utw-body{ display:block; padding:0 var(--s-5) var(--s-5); }
.utw-card.klein .utw-leiste{ padding-left:0; padding-right:0; }
.utw-satz{ margin:0; font-size:var(--fs-sm); color:var(--muted); line-height:1.5; }

/* Die Leiste: welcher Kalender, welche Woche - und was darin steht. */
.utw-leiste{ display:flex; align-items:flex-end; gap:var(--s-3); flex-wrap:wrap;
  padding:var(--s-3) var(--s-5); border-bottom:1px solid var(--line); }
.utw-feld{ display:flex; flex-direction:column; gap:var(--s-1); width:200px; max-width:100%; }
.utw-feld > span{ font-size:var(--fs-2xs); font-weight:700; color:var(--muted); }
.utw-feld select{ width:100%; margin:0; padding:var(--s-2) var(--s-3); font-size:var(--fs-sm);
  border:1px solid var(--line); border-radius:var(--r-control); background:var(--card); color:var(--ink); }
.utw-zahlen{ margin-left:auto; display:flex; gap:var(--s-2); flex-wrap:wrap; align-items:center; }
.utw-zahl{ display:inline-flex; align-items:center; gap:var(--s-1); font-size:var(--fs-xs); color:var(--muted);
  border:1px solid var(--line); border-radius:var(--r-pill); padding:var(--s-1) var(--s-3); background:var(--card); }
.utw-zahl b{ color:var(--ink); }
.utw-zahl.ok::before, .utw-zahl.warn::before, .utw-zahl.stop::before,
.utw-zahl.aufs::before, .utw-zahl.schon::before{ content:""; width:8px; height:8px; border-radius:var(--r-pill); }
.utw-zahl.ok::before{ background:var(--ok); }
.utw-zahl.warn::before{ background:var(--amber); }
.utw-zahl.stop::before{ background:var(--bad); }
.utw-zahl.aufs::before{ background:var(--line-kraeftig); }
.utw-zahl.schon::before{ background:var(--brand); }

/* Die zwei Spalten. Jede scrollt in SICH - Leiste und Fuss bleiben stehen. */
.utw-split{ flex:1; min-height:0; display:grid; grid-template-columns:minmax(0,1fr) minmax(0,1.2fr); }
.utw-links, .utw-rechts{ display:flex; flex-direction:column; min-height:0; min-width:0; }
.utw-links{ border-right:1px solid var(--line); background:var(--surface-subtle); }
.utw-spalte-kopf{ display:flex; align-items:baseline; gap:var(--s-2); flex-wrap:wrap;
  padding:var(--s-3) var(--s-5) var(--s-2); }
.utw-spalte-kopf b{ font-size:var(--fs-md); }
.utw-spalte-kopf span{ font-size:var(--fs-xs); color:var(--muted); }
.utw-woche-scroll{ flex:1; min-height:0; overflow:auto; padding:0 var(--s-5) var(--s-3); }
.utw-liste{ flex:1; min-height:0; overflow:auto; padding:0 var(--s-5) var(--s-4);
  --utw-spalten:20px 48px minmax(0,1fr) 40px 14px minmax(0,1.5fr); }

/* Die Woche. Gitterlinien sind leere Felder unter den Stunden - so hat auch
   eine freie Stunde ihren Platz, wie im Untis-Plan. */
.utw-woche{ display:grid; gap:3px; min-width:420px; }
.utw-w-tag{ position:sticky; top:0; z-index:3; background:var(--surface-subtle);
  text-align:center; padding:var(--s-1) 0 var(--s-2); }
.utw-w-tag b{ display:block; font-size:var(--fs-sm); }
.utw-w-tag span{ display:block; font-size:var(--fs-2xs); color:var(--muted); }
.utw-w-zeit{ display:flex; flex-direction:column; justify-content:center; text-align:right;
  padding-right:var(--s-2); font-variant-numeric:tabular-nums; }
.utw-w-zeit b{ font-size:var(--fs-xs); }
.utw-w-zeit span{ font-size:var(--fs-3xs); color:var(--muted); }
.utw-w-zeit.kurz b{ font-weight:600; color:var(--muted); }
.utw-w-feld{ background:var(--card); border:1px solid var(--hair); border-radius:var(--r-control); }
.utw-w-feld.kurz{ background:transparent; border-style:dashed; border-color:var(--line); }
.utw-w-stapel{ z-index:1; display:flex; flex-direction:column; gap:2px; min-width:0; }
.utw-w-karte{ flex:1; min-width:0; display:flex; flex-direction:column; justify-content:center; gap:1px;
  margin:0; padding:var(--s-1) var(--s-2); font:inherit; text-align:left; cursor:pointer;
  border:1px solid var(--line); border-left:3px solid var(--line-kraeftig); border-radius:var(--r-control);
  background:var(--card); color:var(--ink); transition:opacity .15s ease, box-shadow .15s ease; }
.utw-w-karte b{ font-size:var(--fs-xs); font-weight:750; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.utw-w-karte span{ font-size:var(--fs-3xs); color:var(--muted); white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.utw-w-karte.an{ background:var(--ok-soft); border-color:color-mix(in srgb, var(--ok) 35%, transparent);
  border-left-color:var(--ok); }
.utw-w-karte.offen{ background:var(--amber-soft); border-color:color-mix(in srgb, var(--amber) 35%, transparent);
  border-left-color:var(--amber); }
.utw-w-karte.schon{ background:var(--brand-soft); border-color:color-mix(in srgb, var(--brand) 30%, transparent);
  border-left-color:var(--brand); }
.utw-w-karte.gesperrt{ background:var(--paper); border-style:dashed; border-left-style:solid;
  border-left-color:var(--line-kraeftig); color:var(--muted); }
.utw-w-karte.aus{ background:var(--card); color:var(--muted); }
.utw-w-karte:hover, .utw-w-karte:focus-visible, .utw-w-karte.hl{ outline:none;
  box-shadow:0 0 0 2px var(--brand); }
.utw-woche.hat-hl .utw-w-karte:not(.hl){ opacity:.35; }
.utw-legende{ display:flex; flex-wrap:wrap; gap:var(--s-1) var(--s-4); padding:var(--s-2) var(--s-5) var(--s-3);
  border-top:1px solid var(--line); font-size:var(--fs-2xs); color:var(--muted); }
.utw-legende span{ display:inline-flex; align-items:center; gap:var(--s-1); }
.utw-legende i{ width:12px; height:12px; border-radius:3px; border:1px solid var(--line);
  border-left:3px solid var(--line-kraeftig); background:var(--card); }
.utw-legende i.an{ background:var(--ok-soft); border-left-color:var(--ok); }
.utw-legende i.offen{ background:var(--amber-soft); border-left-color:var(--amber); }
.utw-legende i.gesperrt{ background:var(--paper); border-style:dashed; border-left-style:solid; }
.utw-legende i.schon{ background:var(--brand-soft); border-left-color:var(--brand); }

/* Die Liste - Kopfzeile in den Spalten von „Mein Unterricht". */
.utw-listenkopf{ position:sticky; top:0; z-index:2; display:grid; grid-template-columns:var(--utw-spalten);
  column-gap:var(--s-3); padding:var(--s-2) calc(var(--s-3) + 1px) var(--s-2) calc(var(--s-3) + 3px);
  margin-bottom:var(--s-3); background:var(--card); border-bottom:1px solid var(--line);
  font-size:var(--fs-2xs); font-weight:700; color:var(--muted); }
.utw-listenkopf span:nth-child(4){ text-align:center; }
.utw-gruppe{ margin-bottom:var(--s-4); }
.utw-gruppe.ok{ --utw-ton:var(--ok); }
.utw-gruppe.warn{ --utw-ton:var(--amber); }
.utw-gruppe.stop{ --utw-ton:var(--bad); }
.utw-gruppe.aufs{ --utw-ton:var(--line-kraeftig); }
.utw-gruppe.schon{ --utw-ton:var(--brand); }
.utw-gkopf{ display:flex; align-items:center; gap:var(--s-2); margin:0 0 var(--s-2);
  font-weight:750; font-size:var(--fs-sm); }
.utw-gkopf i{ flex:none; width:8px; height:8px; border-radius:var(--r-pill); background:var(--utw-ton); }
.utw-gkopf span{ background:var(--paper); border-radius:var(--r-pill); padding:0 var(--s-2);
  font-size:var(--fs-2xs); color:var(--muted); }
.utw-ghint{ margin:0 0 var(--s-2); font-size:var(--fs-xs); color:var(--muted); line-height:1.5; }
.utw-z{ margin-bottom:var(--s-2); padding:var(--s-3); background:var(--card);
  border:1px solid var(--line); border-left:3px solid var(--utw-ton, var(--line)); border-radius:var(--r-card);
  transition:background-color .15s ease, box-shadow .15s ease; }
.utw-z.gesperrt, .utw-z.schon{ background:var(--surface-subtle); }
.utw-z.hl{ box-shadow:0 0 0 2px color-mix(in srgb, var(--brand) 45%, transparent); }
.utw-z.blink{ animation:utwBlink 1.2s ease; }
@keyframes utwBlink{ 0%, 35%{ background-color:var(--brand-soft); } 100%{ background-color:var(--card); } }
@media (prefers-reduced-motion:reduce){ .utw-z.blink{ animation:none; } }
.utw-z-zeile{ display:grid; grid-template-columns:var(--utw-spalten); column-gap:var(--s-3); row-gap:var(--s-2);
  align-items:center; grid-template-areas:"hak kl fach wst pfeil ziel"; }
.utw-z .utw-hak, .utw-hak-platz{ grid-area:hak; width:18px; height:18px; margin:0; padding:0; }
.utw-z .utw-hak{ accent-color:var(--ok); cursor:pointer; }
.utw-q-kl{ grid-area:kl; min-width:0; font-weight:750; font-size:var(--fs-sm); line-height:1.3;
  overflow-wrap:anywhere; }
.utw-q-fach{ grid-area:fach; display:flex; flex-direction:column; gap:2px; min-width:0; }
.utw-q-fach b{ font-size:var(--fs-md); font-weight:750; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.utw-q-fach span{ font-size:var(--fs-xs); color:var(--muted); line-height:1.4; }
.utw-q-wst{ grid-area:wst; text-align:center; font-weight:800; font-size:var(--fs-md);
  font-variant-numeric:tabular-nums; }
.utw-q-wst-wort{ display:none; font-weight:600; font-size:var(--fs-xs); color:var(--muted); }
label.utw-q-kl, label.utw-q-fach, label.utw-q-wst{ cursor:pointer; }
.utw-pfeil{ grid-area:pfeil; color:var(--muted); }
.utw-ziel{ grid-area:ziel; display:flex; align-items:center; gap:var(--s-2); min-width:0; }
.utw-ziel-inhalt{ flex:1; display:flex; align-items:center; gap:var(--s-3); min-width:0;
  transition:opacity .15s ease; }
.utw-badge{ flex:none; min-width:48px; height:48px; padding:0 var(--s-2); border-radius:var(--r-card);
  display:inline-flex; align-items:center; justify-content:center; font-weight:800; font-size:var(--fs-lg);
  background:var(--brand-soft); color:var(--brand-dk); border:1px solid color-mix(in srgb, var(--brand) 25%, transparent); }
/* „8ABC" ist vier Zeichen breit und drueckte das Fach daneben in die
   Auslassungspunkte („Mathem…", Browserlauf 11.09.2026). Kleinere Schrift
   statt schmaleres Schild: die Klasse bleibt das Erste, was man liest. */
.utw-badge.lang{ font-size:var(--fs-md); letter-spacing:-.02em; }
.utw-badge.leer{ background:var(--amber-soft); color:var(--amber-ink); border:1.5px dashed var(--amber); }
.utw-badge.da{ background:var(--card); color:var(--ink); border-color:var(--line-kraeftig); }
.utw-ziel-text{ display:flex; flex-direction:column; gap:2px; min-width:0; }
.utw-ziel-fach{ font-size:var(--fs-md); font-weight:750; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.utw-ziel-fach.leer{ color:var(--amber-ink); font-weight:650; }
.utw-ziel-meta{ display:flex; flex-wrap:wrap; align-items:center; gap:var(--s-1) var(--s-2);
  font-size:var(--fs-xs); color:var(--muted); }
.utw-tag{ font-style:normal; font-size:var(--fs-2xs); font-weight:700; border-radius:var(--r-pill); padding:0 var(--s-2);
  white-space:nowrap; }
.utw-tag.neu{ background:var(--ok-soft); color:var(--ok-ink); }
.utw-tag.da{ background:var(--paper); color:var(--muted); }
.utw-aendern{ flex:none; display:inline-flex; align-items:center; gap:var(--s-1); margin:0;
  padding:var(--s-1) var(--s-2); font:inherit; font-size:var(--fs-xs); font-weight:650; color:var(--brand);
  background:none; border:1px solid transparent; border-radius:var(--r-control); cursor:pointer; }
.utw-aendern:hover, .utw-aendern[aria-expanded="true"]{ background:var(--brand-soft); }
.utw-z.ist-aus .utw-ziel-inhalt{ opacity:.4; }
.utw-z.gesperrt .utw-q-fach b, .utw-z.gesperrt .utw-q-kl{ color:var(--muted); }
.utw-grund{ font-size:var(--fs-xs); color:var(--muted); line-height:1.45; }
.utw-z > .utw-grund{ margin:var(--s-2) 0 0 calc(18px + var(--s-3)); }
.utw-z.pruefen > .utw-grund{ color:var(--amber-ink); }
.utw-felder{ display:grid; grid-template-columns:minmax(0,1fr) minmax(0,1fr) minmax(0,2fr) minmax(0,1.3fr);
  gap:var(--s-2); margin:var(--s-3) 0 0 calc(18px + var(--s-3)); padding:var(--s-3);
  background:var(--surface-subtle); border-radius:var(--r-control); }
.utw-felder[hidden]{ display:none; }
.utw-felder label{ display:flex; flex-direction:column; gap:var(--s-1); min-width:0; }
.utw-felder label > span{ font-size:var(--fs-2xs); font-weight:700; color:var(--muted); }
.utw-felder select{ width:100%; min-width:0; margin:0; padding:var(--s-2); font:inherit; font-size:var(--fs-sm);
  border:1px solid var(--line); border-radius:var(--r-control); background:var(--card); color:var(--ink); }
.utw-felder select:disabled{ opacity:.45; }
/* Beim Kurs stehen an der Stelle des einen Zuges die Chips (v2.708.0). Sie
   sitzen in der zweiten Spalte des Rasters und verhalten sich wie ein Feld -
   Beschriftung oben, Inhalt darunter. */
.utw-zuege{ display:flex; flex-direction:column; gap:var(--s-1); min-width:0; }
.utw-zuege > span:first-child{ font-size:var(--fs-2xs); font-weight:700; color:var(--muted); }
.utw-felder .kkl-chips{ gap:4px; }
.utw-felder .kkl-chip{ font-size:var(--fs-xs); min-width:30px; padding:5px 7px; }

/* Der Fuss: was insgesamt entsteht, und der eine Knopf. */
.utw-fuss{ display:flex; align-items:center; gap:var(--s-4); padding:var(--s-3) var(--s-5);
  border-top:1px solid var(--line); background:var(--card); }
.utw-fuss-text{ flex:1; min-width:0; display:flex; flex-direction:column; gap:var(--s-1); }
.utw-summe{ display:flex; flex-wrap:wrap; align-items:center; gap:var(--s-2) var(--s-4); font-size:var(--fs-sm); }
.utw-s-teil{ display:inline-flex; flex-wrap:wrap; align-items:center; gap:var(--s-1); }
.utw-s-teil > b{ margin-right:var(--s-1); }
.utw-chip{ border:1px solid var(--line); border-radius:var(--r-pill); padding:0 var(--s-2);
  font-size:var(--fs-xs); font-weight:750; background:var(--surface-subtle); }
.utw-s-teil.neu .utw-chip{ background:var(--ok-soft); color:var(--ok-ink);
  border-color:color-mix(in srgb, var(--ok) 30%, transparent); }
.utw-s-leer{ color:var(--muted); }
.utw-s-warn{ color:var(--amber-ink); font-weight:600; }
.utw-err{ font-size:var(--fs-sm); color:var(--bad-ink); }
.utw-err:empty{ display:none; }
.utw-los{ flex:none; width:auto; height:46px; margin:0; padding:0 var(--s-6); font-size:var(--fs-md); }
.utw-los:disabled{ opacity:.5; cursor:default; }

/* Laden, leer, Fehler - und der Abschluss (P4): er endet nicht mit
   „fertig", sondern mit der naechsten Frage, denn eine Klasse ohne Kinder
   kann nichts. */
.utw-skelett{ flex:1; display:grid; grid-template-columns:minmax(0,1fr) minmax(0,1.2fr); gap:var(--s-4);
  padding:var(--s-4) var(--s-5); }
.utw-skelett .ck-skel{ min-height:240px; border-radius:var(--r-card); }
.utw-leer{ display:flex; flex-direction:column; align-items:center; gap:var(--s-3); padding:var(--s-5) 0;
  text-align:center; }
.utw-leer .ic{ --ic-px:32px; --ic-sw:1.2; color:var(--muted); }
.utw-leer .btn{ width:auto; height:44px; margin:0; padding:0 var(--s-5); }
.utw-fehler{ color:var(--bad-ink); }
.utw-fertig{ padding-top:var(--s-4); }
.utw-fertig-kopf{ font-weight:800; font-size:var(--fs-md); }
.utw-fertig-zwei{ margin-top:var(--s-4); }
.utw-fertig-sub{ margin:var(--s-1) 0 var(--s-3); font-size:var(--fs-sm); color:var(--muted); line-height:1.55; }
.utw-klassen{ display:flex; gap:var(--s-2); flex-wrap:wrap; margin-bottom:var(--s-1); }
.utw-klassen span{ border:1px solid var(--line); border-radius:var(--r-pill); padding:var(--s-1) var(--s-3);
  font-size:var(--fs-sm); font-weight:700; background:var(--paper); }
.utw-wege{ display:flex; gap:var(--s-2); flex-wrap:wrap; }
.utw-wege .btn{ flex:1 1 auto; width:auto; margin:0; }
.utw-spaeter{ margin:var(--s-4) 0 0; }

/* Mittlere Breite (Tablet, kleines Fenster): die zwei Spalten werden zu zwei
   Abschnitten untereinander - die Woche oben, die Liste darunter, EIN
   Scrollbalken fuer beides. Die Woche scrollt dann nur noch seitlich. */
@media (max-width:1000px){
  .utw-split{ display:block; overflow-y:auto; }
  .utw-links{ border-right:0; border-bottom:1px solid var(--line); }
  .utw-woche-scroll{ overflow-x:auto; overflow-y:hidden; }
  .utw-liste{ overflow:visible; }
  .utw-listenkopf{ position:static; }
  .utw-skelett{ grid-template-columns:minmax(0,1fr); }
}
/* Telefon: das grosse Fenster ist der ganze Schirm, und die Zeile bricht -
   die Vorschau steht UNTER der Untis-Zeile statt daneben. */
@media (max-width:640px){
  #utw-modal.voll{ padding:0; }
  #utw-modal.voll .utw-card{ max-width:none; height:100%; border-radius:0; }
  .utw-head, .utw-leiste, .utw-spalte-kopf, .utw-legende, .utw-fuss{ padding-left:var(--s-4); padding-right:var(--s-4); }
  .utw-woche-scroll, .utw-liste{ padding-left:var(--s-3); padding-right:var(--s-3); }
  .utw-feld{ flex:1 1 140px; width:auto; }
  .utw-zahlen{ margin-left:0; }
  .utw-listenkopf{ display:none; }
  .utw-z-zeile{ grid-template-columns:20px auto minmax(0,1fr) auto;
    grid-template-areas:"hak kl fach wst" ". ziel ziel ziel"; }
  .utw-pfeil{ display:none; }
  .utw-q-wst-wort{ display:inline; }
  .utw-felder{ grid-template-columns:repeat(2, minmax(0,1fr)); margin-left:0; }
  .utw-z > .utw-grund{ margin-left:0; }
  .utw-fuss{ flex-direction:column; align-items:stretch; gap:var(--s-2); }
  .utw-los{ width:100%; }
}

/* ===========================================================================
   DAS WILLKOMMEN IM KLASSENBUCH (neu gefasst v2.707.0)
   ---------------------------------------------------------------------------
   Befund Murat 11.09.2026: „buttonlar dar". Die Knoepfe trugen inline
   `padding:0 22px` - damit nahm der Inline-Stil `.btn` die senkrechte
   Polsterung, und die Hoehe fiel auf die Zeilenhoehe zusammen: 16px Schrift
   in einem knapp 20px hohen Streifen. Jetzt stehen Hoehe und Abstaende hier,
   aus dem Woerterbuch; der Verlaufsrahmen bleibt, aber aus Tokens statt aus
   vier festen Farben. */
.kbx-willkommen{ border:1.5px solid transparent; border-radius:var(--r-panel); padding:var(--s-5);
  background:linear-gradient(var(--card),var(--card)) padding-box,
    linear-gradient(135deg,var(--brand),var(--violett),var(--ok),var(--amber)) border-box; }
.kbx-w-titel{ font-weight:800; font-size:var(--fs-lg); }
.kbx-w-sub{ margin:var(--s-1) 0 var(--s-4); font-size:var(--fs-sm); color:var(--muted); }
.kbx-w-schritte{ list-style:none; margin:0; padding:0; display:grid;
  grid-template-columns:repeat(auto-fit, minmax(200px, 1fr)); gap:var(--s-3); }
.kbx-w-schritt{ display:flex; flex-direction:column; gap:var(--s-1); padding:var(--s-4);
  background:var(--surface-subtle); border:1px solid var(--line); border-radius:var(--r-card); }
.kbx-w-nr{ width:28px; height:28px; margin-bottom:var(--s-1); border-radius:var(--r-pill);
  display:inline-flex; align-items:center; justify-content:center;
  font-weight:800; font-size:var(--fs-sm); color:var(--on-brand); background:var(--brand); }
.kbx-w-schritt:nth-child(2) .kbx-w-nr{ background:var(--violett); }
.kbx-w-schritt:nth-child(3) .kbx-w-nr{ background:var(--ok); }
.kbx-w-schritt b{ font-size:var(--fs-md); }
.kbx-w-schritt span:last-child{ font-size:var(--fs-sm); color:var(--muted); line-height:1.5; }
.kbx-w-akt{ display:flex; align-items:center; gap:var(--s-3); flex-wrap:wrap; margin-top:var(--s-5); }
.kbx-w-akt .btn{ width:auto; height:44px; margin:0; padding:0 var(--s-5); font-size:var(--fs-md); gap:var(--s-2); }
.kbx-w-weg{ margin-left:auto; padding:var(--s-2); border:0; background:none; font:inherit;
  font-size:var(--fs-sm); color:var(--muted); cursor:pointer; text-decoration:underline; }
.kbx-w-weg:hover{ color:var(--ink); }
@media (max-width:640px){
  .kbx-willkommen{ padding:var(--s-4); }
  .kbx-w-akt .btn{ width:100%; }
  .kbx-w-weg{ margin:0 auto; }
}

/* ===========================================================================
   „WOHER KOMMT DEIN STUNDENPLAN?" – die Anbieterkarten (v2.703.0)
   ---------------------------------------------------------------------------
   Das Fenster „Externe Kalender" bestand aus einem Feld „Abo-Adresse (ICS)"
   und dem Satz „Untis, iServ oder Google". Wer nicht WEISS, dass es diesen
   Link gibt, liest darin keine Anleitung, sondern eine Pruefung. Die Schritte
   stehen jetzt da – aufklappbar, damit das Fenster nicht dreimal so lang ist
   wie vorher.

   Die Zahlen der Liste sind der Inhalt, nicht der Schmuck: die Lehrkraft
   arbeitet sie in einem ZWEITEN Fenster ab und muss die Stelle wiederfinden,
   an der sie war. */
.kal-anb-frage{ font-weight:700; font-size:13.5px; margin-bottom:8px; }
.kal-anb-reihe{ display:flex; gap:7px; flex-wrap:wrap; margin-bottom:10px; }
.kal-anb{ flex:1 1 auto; border:1.5px solid var(--line); background:var(--card);
  color:var(--ink); font:inherit; font-size:13px; font-weight:650;
  border-radius:11px; padding:9px 12px; cursor:pointer; }
.kal-anb:hover{ border-color:var(--brand); }
.kal-anb.an{ border-color:var(--brand); background:var(--brand-soft);
  color:var(--brand-dk); font-weight:800; }
.kal-anb-schritte{ margin:0 0 12px; padding:11px 12px 11px 30px;
  border:1px solid var(--line); border-radius:11px; background:var(--paper);
  font-size:12.5px; line-height:1.6; }
.kal-anb-schritte li{ margin:0 0 4px; }
.kal-anb-schritte li:last-child{ margin-bottom:0; }
.kal-anb-schritte code{ font-size:11.5px; word-break:break-all; }
.kal-anb-warn{ margin:-6px 0 12px; font-size:12px; color:var(--amber-ink); }
.kal-anb-erkannt{ font-size:12px; font-weight:700; color:var(--ok-ink);
  margin-top:6px; min-height:1em; }

/* ===========================================================================
   DAS FENSTER „FAECHER DER KLASSE" (v2.701.0)
   ---------------------------------------------------------------------------
   Es war eine Kette von Bedienelementen, die sich alle auf ein unsichtbar
   gewaehltes Fach bezogen. Jetzt: oben die Handlung, die man am haeufigsten
   braucht, darunter die LISTE - jede Zeile zeigt ihr Fach, ihre Kursart und
   ihre zwei Handgriffe.

   ⛔ `.fachman-addbtn` IST BEWUSST KEIN `.btn`. Genau daran ist die alte
   Fassung gescheitert: `.btn` traegt `width:100%`, und der Knopf schob das
   Auswahlfeld daneben auf null Pixel. Wer hier einen `.btn` einsetzt,
   braucht zwingend `flex:1` - dann lieber eine eigene Klasse, die von
   vornherein die richtige Breite hat. */
.fachman-add{ display:flex; gap:8px; align-items:stretch; margin-bottom:8px; }
/* ⛔ `display:flex` SCHLAEGT DAS `hidden`-ATTRIBUT (v2.709.1). Beide Kaesten
   werden ueber `el.hidden` auf- und zugeklappt - und blieben trotzdem
   stehen, weil die Browser-Grundregel `[hidden]{display:none}` schwaecher
   ist als eine Klassenregel mit `display`. Gefunden im Browserlauf am
   11.09.2026: im Kurs stand das gesperrte „Hinzufuegen" weiter da (neu),
   und das Umbenennen-Feld jeder Zeile war dauerhaft offen (seit v2.701.0 -
   `kbFachManUmbenennen` schaltete ins Leere). Dieselbe Zeile gibt es fuer
   `.utw-felder` schon; hier fehlte sie. */
.fachman-add[hidden], .fachman-um[hidden]{ display:none; }
.fachman-addsel{ flex:1 1 auto; min-width:0; padding:10px 12px;
  border:1.5px solid var(--line); border-radius:10px; font:inherit; font-size:14px;
  background:var(--card); color:var(--ink); }
.fachman-addbtn{ flex:0 0 auto; width:auto; border:0; border-radius:10px;
  background:var(--brand); color:var(--on-brand); font:inherit; font-size:13.5px; font-weight:750;
  padding:10px 16px; cursor:pointer; }
.fachman-addbtn:hover{ filter:brightness(1.07); }
.fachman-frei{ width:100%; box-sizing:border-box; margin-bottom:8px; padding:10px 12px;
  border:1.5px solid var(--line); border-radius:10px; font:inherit; font-size:14px;
  background:var(--card); color:var(--ink); }
.fachman-kopf{ display:flex; align-items:center; gap:7px; margin:14px 0 6px;
  font-size:12px; font-weight:700; color:var(--muted); text-transform:uppercase;
  letter-spacing:.04em; }
.fachman-kopf span{ background:var(--paper); border-radius:999px; padding:1px 8px;
  font-size:11.5px; letter-spacing:0; }
.fachman-leer{ margin:14px 0 2px; font-size:13px; color:var(--muted); }
.fachman-z{ border:1px solid var(--line); border-radius:12px; padding:9px 11px;
  margin-bottom:7px; background:var(--card); }
.fachman-z-kopf{ display:flex; align-items:center; gap:8px; }
.fachman-z-kopf b{ font-size:14.5px; min-width:0; overflow:hidden;
  text-overflow:ellipsis; white-space:nowrap; }
/* „Schule" ist kein Schmuck: es sagt, warum der Loeschknopf gesperrt ist. */
.fachman-quelle{ flex:0 0 auto; font-size:10.5px; font-weight:750; color:var(--muted);
  border:1px solid var(--line); border-radius:999px; padding:1px 7px; }
.fachman-werk{ margin-left:auto; display:inline-flex; gap:2px; flex:0 0 auto; }
.fachman-werk button{ border:0; background:transparent; padding:4px; cursor:pointer;
  color:var(--muted); border-radius:7px; line-height:0; }
.fachman-werk button:hover{ color:var(--ink); background:var(--paper); }
.fachman-werk button.danger:hover{ color:var(--bad); }
.fachman-werk button.aus{ opacity:.32; cursor:not-allowed; }
.fachman-werk svg{ width:15px; height:15px; fill:none; stroke:currentColor;
  stroke-width:2; stroke-linecap:round; stroke-linejoin:round; }
.fachman-kurs{ display:flex; gap:5px; flex-wrap:wrap; margin-top:7px; }
.fachman-chip{ border:1.5px solid var(--line); background:var(--card); color:var(--ink);
  font:inherit; font-size:11.5px; font-weight:650; border-radius:999px;
  padding:3px 10px; cursor:pointer; }
.fachman-chip:hover{ border-color:var(--brand); }
.fachman-chip.an{ border-color:var(--brand); background:var(--brand);
  color:var(--on-brand); font-weight:800; }
/* ===== KURS AUS MEHREREN ZUEGEN - der Anlege-/Umbenenn-Dialog (v2.708.0)
   Die Zuege sind Chips und kein <select multiple>: es sind sechs Antworten,
   nicht eine, und ein Mehrfach-Auswahlfeld ist auf dem Telefon kaum zu
   bedienen. Beim Jahrgang bleibt es beim <select> - 16 Werte waeren eine
   Chipwand (DESIGN_SYSTEM.md: nicht nachbauen, was das Geraet besser kann). */
.kkl-mehr{ border:1.5px dashed var(--line); background:transparent; color:var(--muted);
  font:inherit; font-size:12.5px; font-weight:650; border-radius:10px;
  padding:7px 12px; cursor:pointer; width:100%; }
.kkl-mehr:hover{ border-color:var(--brand); color:var(--brand); }
.kkl-kurs{ margin-top:10px; padding:12px; border:1.5px solid var(--line);
  border-radius:12px; background:var(--bg-soft, rgba(0,0,0,.02)); }
.kkl-chips{ display:flex; flex-wrap:wrap; gap:6px; }
.kkl-chip{ border:1.5px solid var(--line); background:var(--card); color:var(--ink);
  font:inherit; font-size:13px; font-weight:700; border-radius:10px;
  min-width:38px; padding:7px 10px; cursor:pointer; }
.kkl-chip:hover{ border-color:var(--brand); }
.kkl-chip.an{ border-color:var(--brand); background:var(--brand);
  color:var(--on-brand); }

.fachman-um{ display:flex; gap:6px; align-items:stretch; margin-top:8px; }
.fachman-um input{ flex:1 1 auto; min-width:0; padding:8px 11px;
  border:1.5px solid var(--line); border-radius:10px; font:inherit; font-size:13.5px;
  background:var(--card); color:var(--ink); }
.fachman-x{ flex:0 0 auto; border:1.5px solid var(--line); background:var(--card);
  color:var(--muted); border-radius:10px; font:inherit; font-size:17px; line-height:1;
  padding:0 11px; cursor:pointer; }
.fachman-x:hover{ color:var(--ink); }

.svu-fwerk{ display:inline-flex; gap:2px; opacity:.5; transition:opacity .12s; }
th:hover .svu-fwerk, td:hover .svu-fwerk, .svu-fkopf:focus-within .svu-fwerk{ opacity:1; }
.svu-fwerk button{ border:0; background:transparent; padding:2px; cursor:pointer;
  color:var(--muted); line-height:0; border-radius:5px; }
.svu-fwerk button:hover{ color:var(--ink); background:var(--paper); }
.svu-fwerk button.danger:hover{ color:var(--bad); }
.svu-fwerk svg{ width:14px; height:14px; fill:none; stroke:currentColor;
  stroke-width:2; stroke-linecap:round; stroke-linejoin:round; }
.sv-stand{ font-weight:700; font-size:12.5px; color:var(--bad); }
.sv-stand.voll{ color:var(--ok); }
.sv-ziel-zu{ display:block; min-height:22px; border-radius:6px;
  background:repeating-linear-gradient(135deg, transparent 0 5px,
    var(--line) 5px 6px); }
.sv-ziel-inaktiv { color:var(--muted); font-size:12px; }
@media(max-width:700px){
  .sv-p-veroeff > span { flex-basis:100%; text-align:left; }
  .sv-p-aktionen { margin-left:0; justify-content:flex-start; }
  .sv-p-schulraster .sv-p-stamm { min-width:115px; width:115px; max-width:115px; }
  .sv-raum-hinweis{ white-space:normal; }
}

/* ===== ZWEI FRAGEN IN EINER ZELLE (v2.676.0) ==============================
   Die Verteilungsmatrix trägt jetzt beides: WIE VIELE Stunden (links, das
   frühere Stundentafel-Feld) und WER sie hält (rechts). Sie sind nebeneinander
   und nicht untereinander, damit die Zeilenhöhe bleibt – zwanzig Fächer mal
   zwei Zeilen wären drei Bildschirme.

   Rot/grün am Stundenfeld sagt dasselbe wie in der alten Tafel: „offen" heißt,
   von den gebrauchten Stunden ist noch nicht alles vergeben. Die Zahl in
   Klammern nennt, wie viel davon steht. */
/* ⛔ EINE ZEILE JE MENSCH, NACH UNTEN (v2.686.0). Ansage Murat 06.09.2026:
   „sonra o kisi icin ikinci ayni kisim gelsin o hücreye tam alta, yukarda
   hauptlehrer altinda yardimci" - und dazu: „sütun uzunluklari sabit olsun
   mecburen burada." Die Zelle waechst also nach UNTEN, nie in die Breite;
   die Spaltenbreiten bleiben, wie sie gesetzt sind. */
.svu-plan-zelle{ display:flex; flex-direction:column; align-items:stretch;
  gap:3px; min-width:0; width:100%; }
.svu-bz{ display:flex; align-items:center; gap:6px; min-width:0; width:100%; }
.svu-bz > .dtab-zelle-flex, .svu-bz > select{ flex:1; min-width:0; }
/* Die zweite und dritte Zeile sind ZUSATZ - leiser, leicht eingerueckt, mit
   einem kurzen Strich davor: man sieht auf einen Blick, wer die Stunde haelt
   und wer dazukommt. */
.svu-bz.zusatz{ padding-left:9px; position:relative; }
.svu-bz.zusatz::before{ content:""; position:absolute; left:2px; top:50%;
  width:4px; height:1px; background:var(--line); }
.svu-bz.zusatz select{ font-size:var(--fs-2xs); color:var(--muted); }
.svu-plus{ flex:none; width:20px; height:20px; border:1px dashed var(--line);
  border-radius:6px; background:transparent; color:var(--muted); font:inherit;
  font-size:13px; font-weight:800; line-height:1; cursor:pointer; padding:0; }
.svu-plus:hover{ color:var(--flaeche-akzent, var(--brand));
  border-color:var(--flaeche-akzent, var(--brand)); border-style:solid;
  background:var(--flaeche-akzent-soft, var(--brand-soft)); }
.svu-bz-weg{ flex:none; width:18px; height:18px; border:0; background:transparent;
  color:var(--muted); font:inherit; font-size:11px; line-height:1; cursor:pointer;
  padding:0; border-radius:5px; }
.svu-bz-weg:hover{ color:var(--bad); background:var(--bad-soft); }
.svu-plan-zelle > .dtab-zelle-flex, .svu-plan-zelle > select{ flex:1; min-width:0; }
/* ⛔ SOL IST EINE MARKE, KEIN FELD (v2.679.0). Sie sitzt rechts in der
   Unterrichtszelle: gruen heisst „eine dieser Stunden ist selbstorganisiert",
   grau heisst nein - dieselbe Lesart wie `.sv-stand`. Sie ist bewusst so
   klein wie ein Kuerzel: in einer Matrix mit zwanzig Faechern ist jedes
   Bedienelement, das groesser ist als sein Inhalt, im Weg. */
/* Der Titel in der Kollegiumsliste: „Lehrkraft" ist der Normalfall und
   bleibt still; alles andere - Referendariat, Vertretung, Schulbegleitung -
   ist die Auskunft, wegen der man die Spalte liest. */
/* Teilzeit und Ermäßigung klappen auf - sie sind der Ausnahmefall. Ein
   GESETZTER Wert steht in der Zusammenfassung und der Kasten ist offen;
   eine Angabe, die das Soll halbiert, darf sich nicht verstecken. */
.sv-e-mehr{ margin:8px 0 0; border:1px solid var(--line); border-radius:10px;
  background:var(--card); }
.sv-e-mehr > summary{ cursor:pointer; list-style:none; padding:8px 11px;
  font-size:var(--fs-2xs); font-weight:700; color:var(--ink); }
.sv-e-mehr > summary::-webkit-details-marker{ display:none; }
.sv-e-mehr > summary::before{ content:"▸"; display:inline-block; width:14px;
  color:var(--muted); }
.sv-e-mehr[open] > summary::before{ content:"▾"; }
.sv-e-mehr > summary i{ font-style:normal; font-weight:600; color:var(--muted); }
.sv-e-mehr > .sv-e-reihe{ padding:0 11px 11px; }
/* ⛔ DIE ROLLE SAGT AUCH, OB JEMAND SCHON DRIN IST (Ansage Murat 06.09.2026:
   „giris yapinca tik gelir … eingeladen durumude Lehrkraft kücük ama
   kücücük 7 px ucak ikonu olsun"). Ein Haken wie bei Instagram fuer ein
   fertiges Konto, ein winziges Flugzeug fuer eine offene Einladung. Die
   fruehere Titel-Spalte sagte dasselbe wie die Rolle und ist entfallen. */
.sv-rolle{ display:inline-flex; align-items:center; gap:4px;
  font-size:var(--fs-2xs); color:var(--muted); }
.sv-rolle.admin{ color:var(--ink); font-weight:700; }
.sv-rolle-tik{ width:13px; height:13px; flex:none;
  fill:var(--flaeche-akzent, var(--brand));
  stroke:var(--card); stroke-width:1.6; stroke-linecap:round;
  stroke-linejoin:round; }
.sv-rolle-flug{ width:9px; height:9px; flex:none; fill:none;
  stroke:var(--muted); stroke-width:2.2; stroke-linecap:round;
  stroke-linejoin:round; opacity:.75; }
/* „extern" hinter der Funktion: die Person ist bei einem Träger beschäftigt.
   BEWUSST KEIN WARNROT - sie tut nichts Falsches; es ist eine Angabe zum
   Beschäftigungsverhältnis, und sie sagt, warum die Zuweisung an ein Kind
   für sie zu bleibt. Der Träger selbst steht nur im Tooltip und im Fenster. */
/* Begleitung eines Kindes (Kind-Akte, v2.779.0). Eine Zeile je Person: Name,
   die zwei Rechte, Beenden. Keine eigene Farbwelt - alles aus dem Wörterbuch. */
.svbg{ display:grid; gap:var(--s-2); }
.svbg-zeile{ display:flex; align-items:center; gap:var(--s-3); flex-wrap:wrap;
  border:1px solid var(--line); border-radius:var(--r-card); padding:var(--s-2) var(--s-3); }
.svbg-name{ font-weight:700; flex:1 1 160px; min-width:0; }
.svbg-haken{ display:inline-flex; align-items:center; gap:var(--s-1);
  font-size:var(--fs-sm); color:var(--muted); cursor:pointer; }
.svbg-haken input{ accent-color:var(--brand); cursor:pointer; margin:0; }
.svbg-haken input:disabled{ cursor:default; }
.svbg-weg{ border:1px solid var(--line); background:transparent; color:var(--bad);
  border-radius:var(--r-control); padding:var(--s-1) var(--s-2);
  font:inherit; font-size:var(--fs-sm); font-weight:700; cursor:pointer; }
.svbg-neu{ display:flex; align-items:flex-end; gap:var(--s-2); flex-wrap:wrap; }
.svbg-neu .lstd-feld{ flex:1 1 220px; }
.sv-funkzelle{ display:flex; align-items:center; gap:var(--s-1); min-width:0; }
.sv-funkzelle .sv-person-zelle{ min-width:0; overflow:hidden;
  text-overflow:ellipsis; white-space:nowrap; }
.sv-extern{ display:inline-flex; align-items:center; flex:none;
  padding:1px var(--s-1);
  border:1px solid var(--line); border-radius:var(--r-pill);
  font-size:var(--fs-3xs); font-weight:700; color:var(--muted);
  letter-spacing:.02em; cursor:help; }
/* ⛔ EINE LUECKE MUSS AUFFALLEN. Rot heisst „hier fehlen Stunden", grün
   „Soll erreicht", bernstein „über dem Soll" - dieselbe Lesart wie
   `.sv-stand`. Ohne Soll gibt es nichts zu vergleichen: dann bleibt es grau. */
/* ⛔ KEINE FARBE, KEINE FLAECHE - NUR FETT (Ansage Murat 06.09.2026: „hem
   arkaplan kirmizi hem metin … renkleri kaldir, kalin yaz"). Rote Schrift
   auf rotem Grund war zweimal dasselbe Signal, und laut. Fett heisst: hier
   fehlen noch Stunden; ist das Soll erreicht, steht die Zahl still da. */
.sv-istsoll{ display:inline-flex; align-items:center; }
.sv-istsoll.fehlt{ font-weight:800; color:var(--ink); }
.sv-istsoll .ss-lnk{ color:inherit; font-weight:inherit; }
/* Der Vorschlag hat zwei Abschnitte: erst der Unterricht, dann die
   Zusatzkraefte. Untereinander in EINER Liste saehe beides gleich aus - und
   „zusatzlehrer gercek lehrer degil" ist genau die Unterscheidung, die auf
   dem Bildschirm fehlen wuerde. */
.svu-r-kopf{ font-size:var(--fs-2xs); font-weight:800; letter-spacing:.03em;
  text-transform:uppercase; color:var(--muted); margin:12px 0 6px; }
.svu-r-kopf:first-child{ margin-top:0; }
.svu-r-kopf small{ display:block; font-size:11px; font-weight:500;
  letter-spacing:0; text-transform:none; margin-top:2px; }
.svu-sol{ flex:none; border:1px solid var(--line); border-radius:6px;
  background:transparent; color:var(--muted); font:inherit; font-size:9.5px;
  font-weight:800; letter-spacing:.03em; line-height:1; padding:3px 4px;
  cursor:pointer; }
.svu-sol:hover{ border-color:var(--ok); color:var(--ok); }
.svu-sol.an{ border-color:var(--ok); color:var(--ok); background:var(--ok-soft); }
/* Im Raster steht sie hinter dem Fachnamen - klein, damit die drei Zeilen
   der Zelle nicht zu vier werden. */
/* ⛔ „x2" STATT ZWEIER GLEICH AUSSEHENDER KARTEN (v2.681.0). Zwei Personen in
   derselben Stunde sind EINE Stunde - gestapelt las man eine Doppelstunde,
   wo eine Doppelbesetzung stand. Die Namen stehen im `title`; ein Fenster
   dafür wäre eine zweite Ebene für eine Auskunft von drei Wörtern. */
.sv-p-mehr{ margin-left:5px; font-size:9px; font-weight:800; opacity:.9;
  border:1px solid currentColor; border-radius:4px; padding:0 3px; }
.sv-p-sol{ margin-left:4px; font-size:8.5px; font-weight:800; letter-spacing:.03em;
  border:1px solid currentColor; border-radius:4px; padding:0 2px;
  vertical-align:middle; opacity:.75; }
/* ⛔ DIE MARKEN SIND ANFASSBAR (v2.689.0, Ansage Murat 06.09.2026: „x2 ve SOL
   filan üstüne geldigim an kaliteli bir hoverla gözükmeli"). Sie sitzen in
   einem Knopf, der selbst schon zieh- und klickbar ist - deshalb nur ein
   Zeigerwechsel und ein deutlicherer Rand, keine zweite Schaltflaeche.
   `tabindex="0"` steht im HTML, damit die Auskunft auch ohne Maus erreichbar
   ist; der Fokusring kommt vom Grundstand. */
.sv-p-mehr, .sv-p-sol{ cursor:help; }
.sv-p-mehr:hover, .sv-p-sol:hover,
.sv-p-mehr:focus-visible, .sv-p-sol:focus-visible{ opacity:1; }

/* ⛔ EIN EINZIGES SCHWEBENDES ELEMENT AN `body`, KEIN TOOLTIP IN DER ZELLE.
   Das Gitter hat `overflow:auto` - alles, was in einer Zelle absolut
   positioniert wird, wird an seinem Rand abgeschnitten, und zwar genau bei
   den Zellen rechts und unten, bei denen man nachsieht. `position:fixed`
   kennt diese Grenze nicht. Begruendung ausfuehrlich bei
   `svPlanHoverKarte()` in index-app.js. */
.sv-p-hover{ position:fixed; z-index:120; max-width:260px; pointer-events:none;
  border:1px solid var(--line); border-radius:12px; background:var(--card);
  color:var(--ink); padding:10px 12px; font-size:var(--fs-2xs); line-height:1.45;
  box-shadow:0 14px 38px rgba(27,34,48,.20); }
.sv-p-hover b{ display:block; font-size:var(--fs-xs); font-weight:800;
  margin-bottom:6px; }
.sv-p-hover p{ margin:0; color:var(--muted); }
.sv-p-hover ul{ list-style:none; margin:0; padding:0; display:grid; gap:4px; }
.sv-p-hover li{ display:flex; align-items:baseline; justify-content:space-between;
  gap:10px; }
.sv-p-hover li span{ font-weight:700; }
.sv-p-hover li i{ font-style:normal; color:var(--muted); font-size:9.5px;
  white-space:nowrap; }
.sv-p-hover em{ display:block; margin-top:6px; font-style:normal;
  color:var(--muted); font-size:9.5px; }
.svu-stunden{ display:inline-flex; align-items:center; gap:3px; flex:none;
  border-radius:7px; padding:1px 3px; }
.svu-stunden.offen{ background:var(--amber-soft); }
.svu-stunden.voll{ background:var(--ok-soft); }
.svu-stunden input{ width:34px; min-width:0; text-align:center;
  border:1px solid var(--line); border-radius:6px; background:var(--card);
  color:var(--ink); font:inherit; font-size:var(--fs-xs); padding:3px 2px; }
.svu-stunden i{ font-style:normal; font-size:10px; color:var(--muted); }
.svu-stunden small{ font-size:10px; color:var(--muted); }
/* Die Kursform steht als AUSKUNFT im Besetzungsfenster, nicht als zweite
   Auswahl: E/G entsteht an der Aufteilung des Fachs und nirgends sonst. */
.svu-kursform{ font-size:var(--fs-2xs); color:var(--muted); }

/* Der Darstellungs-Umschalter der Teilen-Seite ist NUR bei einem
   Escape-Room zu sehen; eingeblendet wird er unten im Escape-Abschnitt.
   Die Versteck-Regel steht HIER, weil dort jeder Selektor am Escape-Koerper
   haengen muss (qa/unit/test_escape_modus.py). */
#share-darstellung{display:none;}
#share-esc-bearb-btn{display:none;}

/* ===========================================================================
   LERNSTAND UND TEXTZEUGNIS (docs/PLAN_FOERDERPLAN_ZEUGNIS.md) – Pilot
   ===========================================================================
   Nur Wörterbuch-Farben (design-tokens.css), keine feste Farbe: diese Regeln
   sind neu und tragen deshalb keine Altlast (DESIGN_SYSTEM.md §9).
   MIT WEM: static/js/lernstand.js (.lstd-*).
   ⛔ NICHT ans Dateiende haengen: ab „ESCAPE-MODUS" bis zum Ende liest
   qa/unit/test_escape_modus.py alles als Escape-CSS (nur body.has-escape). */
.lstd-bg{border-top:1px solid var(--line);margin:0 0 14px;padding-top:12px;}
.lstd-bg-titel{font-weight:800;font-size:13px;color:var(--ink);margin-bottom:4px;}
.lstd-bg-zeile{font-size:13px;color:var(--ink);line-height:1.5;}
.lstd-bg-wert{font-weight:700;}
.lstd-hinweis{font-size:12px;color:var(--muted);line-height:1.5;}
.lstd-bg-satz{margin-top:8px;padding:8px 10px;border:1px solid var(--line);border-radius:10px;
  background:var(--paper);font-size:12.5px;line-height:1.5;color:var(--ink);}
.lstd-bg-form{display:grid;gap:9px;margin-top:10px;}
.lstd-feld{display:grid;gap:4px;font-size:12px;font-weight:700;color:var(--muted);}
.lstd-in{width:100%;box-sizing:border-box;padding:8px 10px;border:1.5px solid var(--line);border-radius:10px;
  font:inherit;font-size:13px;background:var(--card);color:var(--ink);}
.lstd-bg-fs{display:flex;flex-wrap:wrap;gap:6px;}
.lstd-chip{display:inline-flex;align-items:center;gap:5px;padding:5px 10px;border:1.5px solid var(--line);
  border-radius:999px;font-size:12px;font-weight:600;color:var(--ink);background:var(--card);cursor:pointer;}
.lstd-chip input{margin:0;}
/* Ein allgemeines `label{margin-bottom}` weiter oben gilt auch hier - in einer
   Chip-Reihe macht es aus 6 px Abstand 13 px. Deshalb ausdruecklich 0. */
.lstd-bg-fs .lstd-chip{margin:0;}
.lstd-feld label{margin:0;}
.lstd-akt{display:flex;align-items:center;gap:10px;flex-wrap:wrap;}
.lstd-btn{margin:0;width:auto;padding:8px 14px;font-size:13px;}
.lstd-bg-verlauf{margin-top:8px;font-size:12px;color:var(--muted);}
.lstd-bg-verlauf summary{cursor:pointer;font-weight:700;}
.lstd-bg-verlauf ul{margin:6px 0 0;padding-left:18px;}

/* Das 🌱-Fenster „Förderbedarf" (index-app.js kbFoerderEnsureModal) in ZWEI
   Spalten (v2.789.3): links die Notiz der Lehrkraft, rechts die Angaben der
   Schule. Der Bildungsgang-Block verliert hier seine obere Trennlinie - die
   Spalte trennt schon. Unter 640px steht alles untereinander, und die Linie
   kommt zurueck. */
.foerder-karte{max-width:min(860px,96vw);}
.foerder-spalten{display:flex;flex-wrap:wrap;gap:var(--s-4) var(--s-6);align-items:flex-start;}
.foerder-spalte{flex:1 1 300px;min-width:0;}
.foerder-spalte-titel{font-size:var(--fs-2xs);font-weight:800;letter-spacing:.06em;text-transform:uppercase;
  color:var(--muted);margin-bottom:var(--s-2);}
.foerder-spalte-schule{border-left:1px solid var(--line);padding-left:var(--s-6);}
.foerder-spalten .lstd-bg{border-top:0;padding-top:0;margin:0;}
@media (max-width:640px){
  .foerder-spalte-schule{border-left:0;padding-left:0;border-top:1px solid var(--line);padding-top:var(--s-3);}
}

/* C3 – Raster und Kindseite. Die Zellauswahl liegt ÜBER dem Fenster
   (modal-overlay hat 10000), sonst verschwände sie dahinter. */
.lstd-fenster{max-width:min(1100px,96vw);}
.lstd-fenster .modal-head h3{display:flex;align-items:center;gap:8px;}
.lstd-fenster .modal-head svg[data-ic],.lstd-kind svg[data-ic]{width:20px;height:20px;fill:none;stroke:currentColor;
  stroke-width:2;stroke-linecap:round;stroke-linejoin:round;}
.lstd-leiste{display:flex;gap:12px;flex-wrap:wrap;align-items:flex-end;margin-bottom:10px;}
.lstd-leiste .lstd-feld{min-width:180px;flex:0 1 240px;}
.lstd-leiste .lstd-feld span{font-size:12px;font-weight:700;color:var(--muted);}
/* „Alle Kinder" im Raster: das Raster beginnt bei den begleiteten Kindern,
   dieses Kästchen holt die ganze Klasse dazu (lstdKinderSicht). Es steht nur
   da, wo es eine Wahl ist. */
.lstd-nurbegleitet{flex:0 1 auto;min-width:0;}
/* Fällige Lernstände (v2.780.0): je Klasse ein Block, je Kind eine Zeile,
   je Fach ein Chip mit dem Datum der letzten Beobachtung. Das Datum steht
   AM FACH und nicht am Kind – fällig ist immer ein Fach, nicht ein Kind. */
.lstd-f-liste{display:grid;gap:var(--s-3);max-height:56vh;overflow:auto;}
.lstd-f-klasse h4{margin:0 0 var(--s-2);font-size:var(--fs-sm);color:var(--muted);
  text-transform:uppercase;letter-spacing:.04em;}
.lstd-f-kind{display:flex;align-items:center;gap:var(--s-3);flex-wrap:wrap;
  border:1px solid var(--line);border-radius:var(--r-card);
  padding:var(--s-2) var(--s-3);margin-bottom:var(--s-2);}
.lstd-f-name{font-weight:700;flex:0 1 160px;min-width:0;overflow:hidden;
  text-overflow:ellipsis;white-space:nowrap;}
.lstd-f-faecher{display:flex;gap:var(--s-1);flex-wrap:wrap;flex:1 1 200px;min-width:0;}
.lstd-f-fach{display:inline-flex;align-items:baseline;gap:var(--s-1);
  background:var(--amber-soft);color:var(--amber-ink);border-radius:var(--r-pill);
  padding:2px var(--s-2);font-size:var(--fs-2xs);font-weight:700;cursor:help;}
.lstd-f-fach i{font-style:normal;font-weight:400;opacity:.85;}
.lstd-f-los{flex:none;}
.lstd-f-frist{display:inline-flex;align-items:center;gap:var(--s-2);
  font-size:var(--fs-sm);color:var(--muted);flex-wrap:wrap;}
.lstd-f-frist .lstd-in{width:72px;}
/* Übersicht Kind × Fach (v2.781.0). Die Zelle trägt ein DATUM, nie einen
   Namen – wer eingetragen hat, steht hier bewusst nicht (§ 72 Abs. 3 Nr. 2
   LPVG NRW). Bernstein = länger nichts eingetragen, dieselbe Bedeutung wie
   am Knopf im Klassenbuch. */
.lstd-u .lstd-u-kind{position:sticky;left:0;background:var(--card);text-align:left;
  min-width:140px;max-width:200px;}
.lstd-u-rolle{display:block;font-style:normal;font-weight:400;font-size:var(--fs-3xs);
  color:var(--muted);}
.lstd-u-fach{white-space:nowrap;}
.lstd-u-zelle{text-align:center;white-space:nowrap;}
.lstd-u-zelle b{font-weight:700;}
.lstd-u-zelle i{font-style:normal;color:var(--muted);font-size:var(--fs-3xs);margin-left:var(--s-1);}
.lstd-u-zelle.faellig{background:var(--amber-soft);color:var(--amber-ink);}
.lstd-u-bericht{white-space:nowrap;text-align:center;}
/* F7 – Stand des Förderplans in der Übersicht, ein Knopf zum Plan. */
.lstd-u-fplan{white-space:nowrap;text-align:center;}
.lstd-u-fplan-knopf{border:1px solid var(--line);border-radius:var(--r-pill);background:var(--card);font:inherit;
  font-size:var(--fs-xs);font-weight:600;color:var(--ink);padding:2px var(--s-2);cursor:pointer;margin:0;}
.lstd-u-fplan-knopf:hover{border-color:var(--brand);color:var(--brand);}
.lstd-u-fplan-knopf.faellig{border-color:var(--amber-ink);background:var(--amber-soft);color:var(--amber-ink);}
.lstd-u-b{display:inline-flex;align-items:center;border-radius:var(--r-pill);
  padding:1px var(--s-2);font-size:var(--fs-2xs);font-weight:700;color:var(--muted);}
.lstd-u-b.fertig{background:var(--ok-soft);color:var(--ok-ink);}
.lstd-u-b.offen{background:var(--amber-soft);color:var(--amber-ink);}
/* „Bericht" statt Note (C5): kein Warnton – es ist kein schlechteres
   Ergebnis, sondern ein anderes Zeugnis (AO-SF §§ 32/33). Deshalb die
   ruhige Markenfarbe und nicht die Notenskala. */
/* DaZ der Schule im 🌱-Fenster: Anzeige, kein Feld (v2.789.0). */
.kbx-daz{display:grid;gap:2px;border:1px solid var(--line);border-radius:var(--r-card);
  padding:var(--s-2) var(--s-3);margin-bottom:var(--s-3);}
.kbx-daz b{font-size:var(--fs-sm);}
.kbx-daz span{font-size:var(--fs-sm);color:var(--text);}
.kbx-daz i{font-style:normal;font-size:var(--fs-2xs);color:var(--muted);}
.kbx-daz .btn{justify-self:start;width:auto;padding:var(--s-2) var(--s-3);font-size:var(--fs-sm);margin-top:var(--s-1);}
.sv-zbericht{color:var(--brand);font-weight:700;font-size:var(--fs-2xs);}
.kbx-bericht{display:inline-block;padding:1px var(--s-2);border-radius:var(--r-pill);
  background:var(--brand-soft);color:var(--brand);font-size:var(--fs-3xs);
  font-weight:700;letter-spacing:.02em;}
.lstd-bg-wer{font-style:normal;color:var(--muted);font-size:var(--fs-2xs);}
.lstd-u-los{text-align:right;white-space:nowrap;}
.lstd-u-los .lstd-btn{margin:0;}
/* Das eigenstaendige Kind-Fenster (v2.783.0): derselbe Rahmen wie das
   Raster, damit es nicht wie ein zweites Modul aussieht. */
#lstd-kindfenster .lstd-kind{margin-top:var(--s-2);}
.lstd-anhaken{display:inline-flex;align-items:center;gap:7px;font-size:12.5px;font-weight:700;
  color:var(--text);cursor:pointer;padding:9px 0;white-space:nowrap;}
.lstd-anhaken input{width:16px;height:16px;accent-color:var(--brand);cursor:pointer;margin:0;}
.lstd-anhaken .lstd-hinweis{font-weight:400;}
.lstd-bereiche{margin-top:4px;overflow-x:auto;scrollbar-width:none;}
/* Das Ueberfachliche hat seit v2.823.0 sechs Bereiche (Kognition,
   Emotionen). Gleich breite Reiter schnitten dann ab („Lern- und
   Arbeitsv…"): hier richtet sich jeder Reiter nach seinem Text, und wird
   es zu eng, scrollt die Leiste waagerecht – wie schmal schon. */
.lstd-bereiche .kbp-tab{flex:1 0 auto;}
.lstd-tab-rahmen{overflow:auto;max-height:52vh;border:1px solid var(--line);border-radius:12px;}
.lstd-tab{border-collapse:separate;border-spacing:0;font-size:12.5px;min-width:100%;}
.lstd-tab th,.lstd-tab td{border-bottom:1px solid var(--line);padding:4px;background:var(--card);}
.lstd-tab thead th{position:sticky;top:0;z-index:2;font-weight:700;color:var(--ink);}
.lstd-tab .lstd-tab-fert{position:sticky;left:0;z-index:1;text-align:left;min-width:150px;max-width:220px;
  font-weight:600;color:var(--ink);white-space:normal;}
.lstd-tab thead .lstd-tab-fert{z-index:3;}
.lstd-tab-kind{min-width:84px;max-width:110px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.lstd-zelle{width:100%;min-height:34px;border:1.5px solid var(--line);border-radius:9px;background:var(--card);
  font:inherit;font-size:12px;font-weight:600;color:var(--ink);cursor:pointer;padding:4px 6px;}
.lstd-zelle:hover{border-color:var(--brand);}
.lstd-zelle.lstd-grau{background:var(--paper);color:var(--muted);border-style:dashed;}
.lstd-zelle.lstd-neu{border-color:var(--brand);background:var(--brand-soft);}
.lstd-zelle:disabled{cursor:not-allowed;opacity:.45;}
.lstd-wahl{position:fixed;z-index:10050;min-width:210px;max-width:260px;background:var(--card);
  border:1px solid var(--line);border-radius:12px;box-shadow:var(--e-3);padding:10px;}
.lstd-wahl-kopf{font-size:12.5px;color:var(--ink);margin-bottom:6px;}
.lstd-wahl-liste{display:grid;gap:6px;margin-top:6px;}
.lstd-wahl-knopf{border:1.5px solid var(--line);border-radius:9px;background:var(--card);font:inherit;
  font-size:13px;font-weight:600;color:var(--ink);padding:7px 10px;text-align:left;cursor:pointer;}
.lstd-wahl-knopf:hover{border-color:var(--brand);background:var(--brand-soft);}
.lstd-wahl-knopf.lstd-leer{color:var(--muted);font-weight:500;}
.lstd-fuss{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-top:12px;}
.lstd-fuss .lstd-hinweis{flex:1;min-width:160px;}
.lstd-eigen{display:grid;gap:8px;margin-top:12px;padding:12px;border:1px dashed var(--line);border-radius:12px;}
.lstd-kind{background:var(--card);border:1px solid var(--line);border-radius:12px;padding:14px;margin-bottom:14px;}
.lstd-belege{font-size:12.5px;color:var(--ink);margin:4px 0 10px;}
.lstd-bereich-titel{font-weight:800;font-size:13px;color:var(--ink);margin-bottom:4px;}
/* Kindseite, Fassung 2 (v2.790.0, lernstand.js lstdKindHtml): Leiste mit
   Fach und zwei Knoepfen, darunter die Trendkarte in der Form des
   Noten-Trends (index-app.js kbBuildSparkline: --paper, 12px Radius, Kopf
   mit Richtung rechts, Fusszeile aelteste/neueste), dann die Zeilen. */
.lstd-kopf{display:flex;align-items:flex-end;justify-content:space-between;gap:var(--s-3);flex-wrap:wrap;margin-bottom:var(--s-3);}
.lstd-kopf .lstd-feld{min-width:180px;flex:0 1 240px;}
/* Das Fach-Feld hat dieselbe Hoehe und Rundung wie die zwei Knoepfe daneben
   (Befund Murat 20.09.2026: „tuşu diğerleriyle aynı yap … yüksekliği aynı").
   Die Knoepfe sind .lstd-btn: 8px 14px Innenabstand, 13px Schrift, Radius
   des .btn (13px). Das Feld bekommt genau das. */
.lstd-kopf .lstd-in{padding:9px 12px;font-size:13px;font-weight:600;border-radius:13px;min-height:40px;}
.lstd-kopf-akt{display:flex;gap:var(--s-2);flex-wrap:wrap;margin-left:auto;}
.lstd-kopf-akt .lstd-btn{display:inline-flex;align-items:center;gap:6px;min-height:40px;}
.lstd-kopf-akt svg[data-ic]{width:16px;height:16px;}
.lstd-trend-karte{background:var(--paper);border-radius:12px;padding:10px 12px;margin-bottom:10px;}
.lstd-trend-kopf{display:flex;align-items:center;justify-content:space-between;gap:var(--s-2);margin-bottom:5px;font-size:13px;flex-wrap:wrap;}
.lstd-trend-kopf b{font-weight:700;}
/* Der Ausschnitt: drei kleine Pillen im Kopf der Karte (4 Wochen · Halbjahr
   · Alles). Dieselbe Bauart wie die Stufen-Knoepfe im Fenster, nur kleiner. */
.lstd-trend-wahl{display:inline-flex;gap:3px;margin-left:auto;margin-right:var(--s-2);}
.lstd-trend-z{border:1px solid var(--line);border-radius:999px;background:var(--card);font:inherit;font-size:11px;
  font-weight:700;color:var(--muted);padding:3px 9px;cursor:pointer;white-space:nowrap;}
.lstd-trend-z:hover{border-color:var(--brand);color:var(--brand);}
.lstd-trend-z.an{border-color:var(--brand);background:var(--brand);color:var(--card);}
.lstd-trend-kopf .lstd-trend-richtung{min-width:84px;text-align:right;}
.lstd-zeilen-titel{font-size:var(--fs-2xs);font-weight:800;letter-spacing:.06em;text-transform:uppercase;
  color:var(--muted);margin:var(--s-3) 0 var(--s-2);}
.lstd-wo{margin-top:var(--s-3);}
.lstd-trend-richtung{font-weight:700;font-size:12px;color:var(--muted);}
.lstd-trend-auf{color:var(--ok-ink);}
.lstd-trend-ab{color:var(--bad-ink);}
.lstd-trend-gleich{color:var(--muted);}
.lstd-trend-svg{width:100%;max-width:820px;height:150px;display:block;margin:0 auto;overflow:visible;}
.lstd-tk-gitter{stroke:var(--line);stroke-width:1;stroke-dasharray:3 3;}
.lstd-tk-tag{stroke:var(--line-kraeftig);stroke-width:1;}
.lstd-tk-achse,.lstd-tk-datum{fill:var(--muted);font-size:11px;font-family:inherit;}
.lstd-tk-datum{font-size:10px;}
.lstd-tk-flaeche{fill:var(--brand);opacity:.08;}
.lstd-tk-linie{fill:none;stroke:var(--brand);stroke-width:1.6;stroke-linecap:round;stroke-linejoin:round;}
.lstd-tk-punkt{fill:var(--brand);}
.lstd-tk-punkt-auf{fill:var(--ok);}
.lstd-tk-punkt-ab{fill:var(--bad);}
.lstd-tk-punkt-gleich{fill:var(--muted);}
.lstd-trend-fuss{display:flex;justify-content:space-between;font-size:10.5px;color:var(--muted);margin-top:3px;}
.lstd-trend-leer .lstd-hinweis{padding:var(--s-2) 0;}
/* Die Beobachtungszeile - dieselbe Form wie .kb-attempt (Notenzeile im
   Profil), in der zweiten Kategoriefarbe Rosa (DESIGN_SYSTEM.md §3.5). Die
   Zeile in der chronologischen Liste (index-app.js) benutzt dieselben
   Klassen fuer Marke und Stufe. */
.lstd-zeilen{margin-top:var(--s-3);}
/* RUHIGER GRUND, ROSA NUR AN DER KANTE (Ansage Murat 20.09.2026: „onlarin
   arkaplanini beyaz yap … soldaki pembe sol cerceve kalsin cok pembe pembe
   duruyor"). Eine Beobachtung ist eine normale Zeile der Liste, kein
   Warnton; die Kategorie steht am linken Balken und an der Marke. */
.lstd-zeile{display:flex;align-items:center;gap:var(--s-3);padding:var(--s-2) var(--s-3);margin-bottom:var(--s-1);
  background:var(--card);border:1px solid var(--line);border-left:3px solid var(--rosa);
  border-radius:var(--r-control);}
.lstd-zeile-text{flex:1;min-width:0;}
.lstd-zeile-titel{font-weight:700;font-size:13px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--ink);}
.lstd-zeile-meta{display:flex;align-items:center;gap:7px;margin-top:2px;flex-wrap:wrap;}
.lstd-marke{display:inline-flex;align-items:center;gap:4px;font-size:11px;font-weight:700;color:var(--rosa-ink);
  background:var(--rosa-soft);border-radius:999px;padding:1px 8px;}
.lstd-marke::before{content:"";width:6px;height:6px;border-radius:50%;background:var(--rosa);}
.lstd-marke-rand{background:transparent;border:1px solid var(--rosa);color:var(--rosa-ink);}
.lstd-marke-rand::before{display:none;}
.lstd-zeile-datum{font-size:12px;color:var(--muted);}
/* „eingetragen 20.09. 12:15" bzw. der Name der fremden Lehrkraft - leise,
   weil es die Herkunft der Zeile ist und nicht ihr Inhalt. */
.lstd-zeile-wer{font-size:11px;color:var(--muted);}
/* Der Anhang-Dialog ist seit v2.795.6 nach BEREICHEN gegliedert - so wie das
   fertige Blatt. Je Gruppe die Fertigkeiten und darunter der Kommentar der
   Lehrkraft zu genau diesem Bereich. */
.lstd-a-bgrp{margin-bottom:var(--s-3);padding-bottom:var(--s-2);border-bottom:1px solid var(--line);}
.lstd-a-bgrp:last-child{border-bottom:0;margin-bottom:0;}
.lstd-a-bname{font-size:var(--fs-2xs);font-weight:800;text-transform:uppercase;letter-spacing:.04em;
  color:var(--muted);margin:var(--s-2) 0 var(--s-1);}
.lstd-a-bfrei{margin-top:var(--s-2);}

/* ===== BAUSTEINE IN DER EINSCHAETZUNG (v2.795.4) ==========================
   Ansage Murat 20.09.2026: „förderempfehlungtakilerin aynialrini getirsene
   burayada … orda secili facha göre ilgili kisimalr geliyordu onlari böyle
   baglantilis ekilde yazabiliyoduk."

   Deshalb stehen hier fast KEINE eigenen Regeln: die Liste benutzt
   `.fo-acc`, `.fo-acc-head`, `.fo-acc-count`, `.fo-acc-body`, `.fo-grp` und
   `.fo-item` der Foerderempfehlung - dieselben Klassen, dasselbe Aussehen,
   dieselbe Bedienung. Eine zweite Optik fuer dieselbe Sache waere genau der
   Fehler, den „eine Themenseite hat einen Zeichner" schon einmal gekostet
   hat. Nur der Rahmen und die Fusszeile gehoeren hierher.
   MIT WEM: static/js/index-app.js (kbBst*), foerder_katalog.py. */
.kb-bst{margin-top:var(--s-2);border:1px solid var(--line);border-radius:var(--r-card);
  padding:var(--s-3);background:var(--paper);}
.kb-bst-fuss{display:flex;align-items:center;gap:var(--s-2);flex-wrap:wrap;margin-top:var(--s-2);}
.kb-bst-hinweis{font-size:var(--fs-2xs);color:var(--muted);line-height:1.5;}
.lstd-zeile-rechts{display:flex;align-items:center;gap:var(--s-2);flex:none;}
.lstd-stufe{display:inline-block;padding:3px 10px;border-radius:999px;background:var(--card);border:1px solid var(--line);
  font-size:12px;font-weight:700;color:var(--ink);white-space:nowrap;}
.lstd-zeile-x{width:26px;height:26px;border:1px solid var(--line);border-radius:8px;background:var(--card);color:var(--muted);
  cursor:pointer;display:inline-flex;align-items:center;justify-content:center;padding:0;}
.lstd-zeile-x svg{width:14px;height:14px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;}
.lstd-zeile-x:hover{border-color:var(--bad);color:var(--bad-ink);}
/* Das Fenster „Beobachtung eintragen": breit, kleine Schrift, die Stufen als
   Knopfreihe je Fertigkeit. Es liegt UEBER dem Kind-Fenster der Begleitung
   (#lstd-kindfenster, modal-overlay 10000). */
.lstd-dialog-overlay{z-index:10060;}
.lstd-dialog{max-width:min(940px,96vw);max-height:88vh;overflow:auto;}
.lstd-dialog .modal-head h3{display:flex;align-items:center;gap:8px;font-size:var(--fs-md);}
.lstd-dialog .modal-head svg[data-ic]{width:20px;height:20px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;}
.lstd-d-leiste{align-items:flex-end;}
.lstd-d-hinweis{flex:1 1 220px;align-self:center;}
.lstd-d-bereich{margin-top:var(--s-3);}
.lstd-d-bereich-titel{font-weight:800;font-size:12px;letter-spacing:.04em;text-transform:uppercase;color:var(--muted);
  padding-bottom:4px;border-bottom:1px solid var(--line);margin-bottom:2px;}
.lstd-d-zeile{display:flex;align-items:center;gap:var(--s-3);padding:6px 0;border-bottom:1px solid var(--hair);flex-wrap:wrap;}
.lstd-d-name{flex:1 1 220px;min-width:0;font-size:13px;font-weight:600;color:var(--ink);display:grid;gap:1px;}
.lstd-d-name small{font-size:11px;font-weight:500;color:var(--muted);}
.lstd-d-stufen{display:inline-flex;flex-wrap:wrap;gap:4px;flex:0 1 auto;}
.lstd-d-stufe{border:1.5px solid var(--line);border-radius:999px;background:var(--card);font:inherit;font-size:12px;
  font-weight:600;color:var(--ink);padding:5px 11px;cursor:pointer;white-space:nowrap;}
.lstd-d-stufe:hover{border-color:var(--brand);background:var(--brand-soft);}
.lstd-d-stufe.an{border-color:var(--brand);background:var(--brand);color:var(--card);}
.lstd-d-stufe:focus-visible{outline:2px solid var(--brand);outline-offset:2px;}
/* C4 – Verlauf. Die Linienfarbe kommt je Reihe über --lstd-f aus dem
   Wörterbuch; Polyline, Punkt und Legende lesen dieselbe Variable. */
.lstd-linie-0{--lstd-f:var(--brand);}
.lstd-linie-1{--lstd-f:var(--ok);}
.lstd-linie-2{--lstd-f:var(--amber);}
.lstd-linie-3{--lstd-f:var(--bad);}
.lstd-linie-4{--lstd-f:var(--ink);}
.lstd-kurve{display:block;max-width:100%;height:auto;overflow:visible;}
.lstd-kurve .lstd-gitter{stroke:var(--line);stroke-width:1;}
.lstd-kurve .lstd-achse-y,.lstd-kurve .lstd-achse-x{fill:var(--muted);font-size:11px;font-family:inherit;}
.lstd-kurve polyline.lstd-linie{fill:none;stroke:var(--lstd-f);stroke-width:2;stroke-linejoin:round;stroke-linecap:round;}
.lstd-kurve circle.lstd-punkt{fill:var(--lstd-f);stroke:var(--card);stroke-width:1.5;}
.lstd-bereich-kurve{margin:6px 0 8px;padding:8px;border:1px solid var(--line);border-radius:10px;background:var(--paper);}
.lstd-legende{display:flex;flex-wrap:wrap;gap:10px;font-size:11.5px;color:var(--ink);margin-top:4px;}
.lstd-legende span{display:inline-flex;align-items:center;gap:5px;}
.lstd-farbe{display:inline-block;width:10px;height:10px;border-radius:3px;background:var(--lstd-f);}
.lstd-sp-fach{margin-top:8px;}
.lstd-sp-bereich{font-size:12px;margin-top:6px;}
/* C7 – Anhang zum Zeugnis. */
.foerder-listbtn svg[data-ic]{width:16px;height:16px;fill:none;stroke:currentColor;stroke-width:2;
  stroke-linecap:round;stroke-linejoin:round;}
.lstd-kind-akt{display:flex;justify-content:flex-end;margin:-4px 0 6px;}
.lstd-kind-akt .lstd-btn{display:inline-flex;align-items:center;gap:6px;}
.lstd-kind-akt svg[data-ic]{width:16px;height:16px;}
.lstd-a-stand{align-self:center;font-size:12.5px;font-weight:700;color:var(--muted);}
.lstd-a-fach{border:1px solid var(--line);border-radius:12px;padding:12px;margin-top:12px;background:var(--card);}
.lstd-a-alle{float:right;margin-top:-4px;}
.lstd-a-ferts{clear:both;display:grid;gap:4px;margin-top:6px;}
.lstd-a-fert{display:grid;grid-template-columns:minmax(120px,1.2fr) 160px minmax(150px,1fr) minmax(110px,1fr);
  gap:8px;align-items:center;font-size:13px;padding:4px 0;border-bottom:1px solid var(--line);}
.lstd-a-fert.lstd-aus{grid-template-columns:minmax(120px,1.2fr) 1fr;opacity:.65;}
.lstd-a-themen{display:flex;flex-wrap:wrap;gap:6px;align-items:center;margin-top:10px;}
.lstd-a-themen .lstd-chip{margin:0;}
.lstd-a-neu{margin-top:6px;max-width:320px;}
/* (0,2,0) statt (0,1,0): die Grundregel input[type=number]/textarea hat
   (0,1,1) und machte die Zahlfelder 100 % breit, das Textfeld 120px hoch. */
.lstd-a-fach .lstd-a-frei{margin-top:8px;resize:vertical;min-height:64px;}
.lstd-a-vorschau{margin-top:8px;padding:8px 10px;border-radius:10px;background:var(--paper);font-size:13px;
  line-height:1.55;color:var(--ink);}
.lstd-a-hinweise{margin-top:6px;font-size:12px;color:var(--amber-ink,var(--ink));}
.lstd-a-zeile{display:flex;align-items:center;gap:8px;flex-wrap:wrap;font-size:13px;margin:6px 0;}
/* F8 – Förderziele im Anhang: Hinweis mit Knopf „Als Satz übernehmen". */
.lstd-a-ziel{display:flex;align-items:center;gap:var(--s-2);flex-wrap:wrap;margin:var(--s-1) 0;padding:var(--s-1) var(--s-2);
  border-radius:var(--r-control);background:var(--brand-soft);font-size:var(--fs-sm);color:var(--ink);}
.lstd-a-ziel > span:first-of-type{flex:1 1 260px;min-width:0;}
.lstd-a-ziel svg[data-ic],.lstd-a-fert svg[data-ic="flag"]{width:13px;height:13px;fill:none;stroke:var(--brand);
  stroke-width:2.2;stroke-linecap:round;stroke-linejoin:round;flex:none;vertical-align:-1px;}
.lstd-a-zeile.lstd-a-rb{align-items:flex-start;}
.lstd-a-zeile .lstd-a-zahl{width:76px;flex:0 0 76px;padding:6px 8px;margin:0;}
.lstd-a-zeile .lstd-a-lang{flex:1 1 220px;width:auto;min-height:0;margin:0;}
.lstd-a-zeile input[type=checkbox]{margin:0;}
/* v2.775.0 – der Knopf „Lernstand" am Namen eines Förderkindes in der
   Klassenliste (kbLernstandKnopf, index-app.js). Der Name kürzt sich, der
   Knopf bleibt ganz sichtbar. */
.kbx-namezeile{display:flex;align-items:center;gap:var(--s-2);min-width:0;}
.kbx-nametxt{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
/* Aus dem Wörterbuch, nicht aus der Hand (v2.777.0 nachgezogen): die Zeile
   trug 11.5px, 999px und 9px und machte damit vier Wächter in
   qa/unit/test_klassenbuch_design.py rot - eingeschleppt in v2.775.0, weil
   der Lauf damals nur die Lernstand-Tests umfasste. */
.kbx-lstd{flex:none;display:inline-flex;align-items:center;gap:var(--s-1);padding:2px var(--s-2);
  border-radius:var(--r-pill);
  border:1.5px solid var(--brand);background:var(--brand-soft);color:var(--brand);font:inherit;
  font-size:var(--fs-2xs);font-weight:700;line-height:1.5;cursor:pointer;}
.kbx-lstd:hover{background:var(--brand);color:var(--card);}
/* Fällig: bernstein = Hinweis, nicht Fehler (design-tokens.css §3.1). */
.kbx-lstd.faellig{border-color:var(--amber-ink);background:var(--amber-soft);
  color:var(--amber-ink);}
.kbx-lstd.faellig:hover{background:var(--amber-ink);color:var(--card);}
.kbx-lstd svg[data-ic]{width:13px;height:13px;fill:none;stroke:currentColor;stroke-width:2.2;
  stroke-linecap:round;stroke-linejoin:round;}
@media (max-width:640px){
  .lstd-leiste .lstd-feld,.lstd-kopf .lstd-feld{flex:1 1 100%;}
  .lstd-kopf-akt{margin-left:0;width:100%;}
  .lstd-kopf-akt .lstd-btn{flex:1 1 auto;justify-content:center;}
  .lstd-zeile{flex-wrap:wrap;}
  .lstd-zeile-rechts{margin-left:auto;}
  .lstd-tab .lstd-tab-fert{min-width:108px;}
  .lstd-a-fert{grid-template-columns:1fr auto;}
  .kbx-lstd span{display:none;}
  .kbx-lstd{padding:3px var(--s-1);}
  .lstd-a-fert > .lstd-hinweis{grid-column:1 / -1;}
  .lstd-a-kurve{display:none;}
  .lstd-a-alle{float:none;display:block;margin:4px 0;}
}

/* ===========================================================================
   DER FÖRDERPLAN (static/js/foerderplan.js, F4 – PLAN_FOERDERPLAN_ZEUGNIS §F)
   ===========================================================================
   Der Reiter im Profil / im Kindfenster und das Fenster „+ Ziel". Geteilte
   Bausteine kommen vom Lernstand (.lstd-in, .lstd-feld, .lstd-btn,
   .lstd-d-stufe, .lstd-dialog) – hier steht nur, was der Plan zusätzlich
   braucht. Ein Ziel zeigt die Spalten des BRMS-Rasters (Abb. 5) als drei
   Blöcke nebeneinander; unter 640px untereinander.
   Nur Wörterbuch-Farben (DESIGN_SYSTEM.md), keine feste Farbe. */
.fplan-kind{display:grid;gap:var(--s-3);}
.fplan-kind svg[data-ic],.fplan-dialog svg[data-ic]{width:16px;height:16px;fill:none;stroke:currentColor;
  stroke-width:2;stroke-linecap:round;stroke-linejoin:round;flex:none;}
.fplan-dialog .modal-head svg[data-ic]{width:20px;height:20px;}
.fplan-kopf{display:flex;align-items:center;justify-content:space-between;gap:var(--s-3);flex-wrap:wrap;}
.fplan-akt{display:flex;gap:var(--s-2);flex-wrap:wrap;margin-left:auto;}
.fplan-akt .lstd-btn,.fplan-ziel-akt .lstd-btn,.fplan-leer .lstd-btn{display:inline-flex;align-items:center;gap:6px;}
.fplan-status{display:inline-flex;align-items:center;gap:6px;padding:4px var(--s-3);border-radius:var(--r-pill);
  font-size:var(--fs-xs);font-weight:700;border:1.5px solid var(--line);color:var(--muted);background:var(--card);}
.fplan-status.entwurf{border-color:var(--amber-ink);color:var(--amber-ink);background:var(--amber-soft);}
.fplan-status.aktiv{border-color:var(--ok-ink);color:var(--ok-ink);background:var(--ok-soft);}
.fplan-info{display:grid;grid-template-columns:repeat(auto-fit,minmax(170px,1fr));gap:var(--s-2) var(--s-4);
  margin:0;padding:var(--s-3);border:1px solid var(--line);border-radius:var(--r-card);background:var(--paper);}
.fplan-info div{min-width:0;}
.fplan-info dt{font-size:var(--fs-2xs);font-weight:800;letter-spacing:.04em;text-transform:uppercase;color:var(--muted);}
.fplan-info dd{margin:2px 0 0;font-size:var(--fs-sm);color:var(--ink);}
.fplan-karte{padding:var(--s-3);border:1px solid var(--line);border-radius:var(--r-card);background:var(--card);}
.fplan-titel{display:flex;align-items:center;gap:6px;font-size:var(--fs-2xs);font-weight:800;letter-spacing:.04em;
  text-transform:uppercase;color:var(--muted);margin-bottom:var(--s-1);}
.fplan-text{white-space:pre-line;font-size:var(--fs-sm);line-height:1.5;color:var(--ink);}
.fplan-hinweise{margin:0;padding:var(--s-2) var(--s-3) var(--s-2) var(--s-6);border-radius:var(--r-card);
  background:var(--amber-soft);color:var(--amber-ink);font-size:var(--fs-xs);line-height:1.5;}
.fplan-loesch{padding:var(--s-2) var(--s-3);border-radius:var(--r-card);background:var(--amber-soft);
  color:var(--amber-ink);font-size:var(--fs-xs);font-weight:600;}
/* 409 – jemand war schneller (foerderplan.js fplanKonflikt): die Eingabe
   bleibt stehen, der Hinweis sagt es, „Neu laden" holt den frischen Stand. */
.fplan-konflikt{display:flex;align-items:center;justify-content:space-between;gap:var(--s-3);flex-wrap:wrap;
  padding:var(--s-2) var(--s-3);border:1.5px solid var(--amber-ink);border-radius:var(--r-card);
  background:var(--amber-soft);color:var(--amber-ink);font-size:var(--fs-sm);font-weight:600;line-height:1.5;}
.fplan-konflikt div{flex:1 1 240px;}
.fplan-bereich{display:grid;gap:var(--s-2);}
.fplan-bereich-titel{font-weight:800;font-size:var(--fs-xs);letter-spacing:.04em;text-transform:uppercase;
  color:var(--muted);padding-bottom:4px;border-bottom:1px solid var(--line);}
.fplan-ziel{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1.2fr) minmax(0,1.2fr) auto;gap:var(--s-3);
  padding:var(--s-3);border:1px solid var(--line);border-radius:var(--r-card);background:var(--card);align-items:start;}
.fplan-spalte{min-width:0;font-size:var(--fs-sm);line-height:1.5;color:var(--ink);display:grid;gap:2px;}
.fplan-spalte-titel{font-size:var(--fs-2xs);font-weight:800;letter-spacing:.04em;text-transform:uppercase;color:var(--muted);}
.fplan-zielsatz{font-weight:700;}
.fplan-bis{display:inline-flex;align-items:center;gap:6px;font-size:var(--fs-xs);color:var(--brand);font-weight:600;}
.fplan-massnahmen{margin:0;padding-left:var(--s-4);display:grid;gap:4px;}
.fplan-m-meta{display:block;font-size:var(--fs-2xs);color:var(--muted);}
.fplan-ziel-akt{display:flex;gap:var(--s-1);align-items:flex-start;}
/* F6 – die Auswertung als Leiste über die ganze Breite des Ziels. */
.fplan-eval{grid-column:1 / -1;display:flex;align-items:center;gap:var(--s-3);flex-wrap:wrap;
  padding-top:var(--s-2);border-top:1px dashed var(--line);font-size:var(--fs-sm);color:var(--ink);}
.fplan-eval .fplan-spalte-titel{flex:0 0 auto;}
.fplan-eval-inhalt{flex:1 1 240px;min-width:0;}
.fplan-eval-form{display:grid;gap:var(--s-2);align-items:start;}
/* F7 – Karte „Förderziele" im Lernstand-Reiter und Flagge an der Rasterzelle. */
.fplan-lstd-karte{display:grid;gap:var(--s-2);margin-bottom:var(--s-3);}
.fplan-lstd-ziel{display:grid;gap:2px;font-size:var(--fs-sm);}
.fplan-lstd-karte svg[data-ic]{width:14px;height:14px;fill:none;stroke:currentColor;stroke-width:2;
  stroke-linecap:round;stroke-linejoin:round;}
.lstd-zelle.lstd-ziel{border-color:var(--brand);}
.lstd-zelle svg[data-ic="flag"]{width:11px;height:11px;fill:none;stroke:var(--brand);stroke-width:2.2;
  stroke-linecap:round;stroke-linejoin:round;vertical-align:-1px;margin-right:2px;}
.fplan-alt-kopf{display:flex;align-items:center;justify-content:space-between;gap:var(--s-3);flex-wrap:wrap;
  padding:var(--s-2) var(--s-3);border:1px solid var(--brand);border-radius:var(--r-card);background:var(--brand-soft);
  font-size:var(--fs-sm);color:var(--ink);}
.fplan-ziel-akt .fplan-ikon{padding:7px;}
.fplan-weg:hover{border-color:var(--bad);color:var(--bad-ink);}
.fplan-leer{display:flex;align-items:center;justify-content:space-between;gap:var(--s-3);flex-wrap:wrap;
  padding:var(--s-4);border:1px dashed var(--line);border-radius:var(--r-card);font-size:var(--fs-sm);color:var(--ink);}
.fplan-verlauf ul{margin:0;padding:0;list-style:none;display:grid;gap:var(--s-1);}
.fplan-verlauf li{display:flex;gap:var(--s-2);flex-wrap:wrap;align-items:baseline;font-size:var(--fs-sm);}
.fplan-link{display:inline-flex;align-items:center;gap:4px;border:0;background:none;padding:0;margin:0;
  font:inherit;font-size:var(--fs-xs);font-weight:700;color:var(--brand);cursor:pointer;}
.fplan-link:hover{text-decoration:underline;}
.fplan-link svg[data-ic]{width:14px;height:14px;}
.fplan-form{display:grid;gap:var(--s-3);padding:var(--s-3);border:1px solid var(--line);border-radius:var(--r-card);
  background:var(--paper);}
.fplan-form-zeile{display:flex;gap:var(--s-3);flex-wrap:wrap;}
.fplan-form-zeile .lstd-feld{flex:0 1 200px;min-width:160px;}
.lstd-feld .fplan-lang{min-height:0;resize:vertical;margin:0;}
.lstd-feld small{font-weight:500;}
.fplan-rollen{display:flex;flex-wrap:wrap;gap:4px;}
.fplan-rolle{border:1.5px solid var(--line);border-radius:var(--r-pill);background:var(--card);font:inherit;
  font-size:var(--fs-xs);font-weight:600;color:var(--ink);padding:4px 10px;cursor:pointer;white-space:nowrap;margin:0;}
.fplan-rolle:hover{border-color:var(--brand);background:var(--brand-soft);}
.fplan-rolle.an{border-color:var(--brand);background:var(--brand);color:var(--card);}
.fplan-rolle:focus-visible{outline:2px solid var(--brand);outline-offset:2px;}
/* Das Fenster „+ Ziel". */
.fplan-dialog{display:grid;gap:var(--s-3);align-content:start;}
/* Gesperrt muss man SEHEN: das globale .btn dimmt nicht, „Speichern" ohne
   Zielstufe sah aus wie bereit (Browserlauf F4). */
.fplan-dialog .lstd-btn:disabled{opacity:.5;}
.fplan-dialog .lstd-d-bereich{margin-top:0;}
.fplan-fliste{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:6px;margin-top:6px;}
.fplan-f{display:grid;gap:1px;text-align:left;padding:8px 10px;border:1.5px solid var(--line);border-radius:var(--r-control);
  background:var(--card);font:inherit;font-size:var(--fs-sm);font-weight:600;color:var(--ink);cursor:pointer;margin:0;}
.fplan-f small{font-size:var(--fs-2xs);font-weight:500;color:var(--muted);}
.fplan-f:hover{border-color:var(--brand);background:var(--brand-soft);}
.fplan-f:disabled{opacity:.55;cursor:default;background:var(--paper);border-color:var(--line);}
.fplan-gewaehlt{display:flex;align-items:center;justify-content:space-between;gap:var(--s-3);flex-wrap:wrap;
  padding:var(--s-2) var(--s-3);border:1px solid var(--brand);border-radius:var(--r-card);background:var(--brand-soft);
  font-size:var(--fs-sm);color:var(--ink);}
.fplan-vorschau{padding:var(--s-2) var(--s-3);border-radius:var(--r-card);background:var(--paper);font-size:var(--fs-sm);
  font-weight:700;line-height:1.5;color:var(--ink);}
.fplan-m{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:6px;padding:var(--s-2);border:1px solid var(--line);
  border-radius:var(--r-card);background:var(--card);margin-top:6px;}
.fplan-m .lstd-in{margin:0;}
/* Zwei Zeilen statt einer: ein Satz aus dem Katalog ist oft länger als die
   Breite, schmal wurde er im einzeiligen Feld abgeschnitten (Browserlauf F4). */
.fplan-m .fplan-m-text{min-height:0;resize:vertical;}
.fplan-m-unten{grid-column:1 / -1;display:flex;gap:var(--s-2);flex-wrap:wrap;align-items:center;}
.fplan-m-unten .fplan-m-umfang{flex:1 1 180px;width:auto;}
.fplan-m-x{border:1.5px solid var(--line);border-radius:var(--r-control);background:var(--card);color:var(--muted);
  padding:6px;cursor:pointer;display:inline-flex;align-items:center;margin:0;}
.fplan-m-x:hover{border-color:var(--bad);color:var(--bad-ink);}
.fplan-vorschlaege{display:flex;flex-wrap:wrap;gap:6px;}
.fplan-vorschlag{border:1.5px dashed var(--line);border-radius:var(--r-pill);background:var(--card);font:inherit;
  font-size:var(--fs-xs);font-weight:600;color:var(--ink);padding:4px 10px;cursor:pointer;margin:0;text-align:left;}
.fplan-vorschlag:hover{border-color:var(--brand);color:var(--brand);}
.fplan-vorschlag-frei{border-style:solid;color:var(--brand);}
/* F10 – die Einzelaufgaben einer Maßnahme (foerderplan.js fplanAufgabenHtml):
   Titel, Frist, erledigt/offen – nie ein Ergebnis. */
.fplan-aufgaben{list-style:none;margin:4px 0 0;padding:0;display:grid;gap:4px;}
.fplan-aufgabe{display:flex;align-items:center;gap:6px;padding:4px 6px;border:1px solid var(--line);
  border-radius:var(--r-control);background:var(--paper);font-size:var(--fs-xs);line-height:1.4;}
.fplan-aufgabe span{flex:1 1 auto;min-width:0;overflow-wrap:anywhere;}
.fplan-aufgabe small{font-size:var(--fs-2xs);font-weight:500;color:var(--muted);}
.fplan-aufgabe.fertig{border-color:var(--ok-ink);background:var(--ok-soft);}
.fplan-aufgabe.fertig > svg[data-ic]{color:var(--ok-ink);}
.fplan-kind .fplan-aufgabe svg[data-ic]{width:14px;height:14px;}
.fplan-aufgabe .fplan-m-x{padding:3px;}
.fplan-m-akt{display:flex;gap:var(--s-3);flex-wrap:wrap;margin-top:4px;}
/* F11 – „Für das Kind" am Ziel (Lehrkraft, foerderplan.js fplanKindZeileHtml):
   eine Leiste über die ganze Breite wie die Auswertung. */
.fplan-kindzeile{grid-column:1 / -1;display:flex;align-items:center;gap:var(--s-3);flex-wrap:wrap;
  padding-top:var(--s-2);border-top:1px dashed var(--line);font-size:var(--fs-sm);color:var(--ink);}
.fplan-kindzeile .fplan-spalte-titel{flex:0 0 auto;}
.fplan-kindzeile-inhalt{flex:1 1 240px;min-width:0;display:grid;gap:2px;}
.fplan-kindzeile-inhalt svg[data-ic]{width:14px;height:14px;vertical-align:-2px;}
.fplan-kind-form{display:grid;gap:var(--s-2);align-items:start;}
/* F11 – die Seite des KINDES „Woran ich arbeite" (fplanKindSeiteHtml, im
   Schülerarbeitsplatz): größere Flächen, weniger Text, für Berührung gebaut
   (DESIGN_SYSTEM.md, Gesicht „Kind"). */
.fplan-woran{display:grid;gap:var(--s-4);max-width:760px;}
.fplan-woran-karte{display:grid;gap:var(--s-2);padding:var(--s-5);border:1px solid var(--line);
  border-radius:var(--r-panel);background:var(--card);}
.fplan-woran-satz{font-size:var(--fs-lg);font-weight:800;line-height:1.35;color:var(--ink);}
.fplan-woran-bis{font-size:var(--fs-sm);font-weight:700;color:var(--brand);}
.fplan-woran-frage{margin-top:var(--s-2);font-size:var(--fs-sm);font-weight:700;color:var(--muted);}
.fplan-woran-antworten{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:var(--s-2);}
.fplan-woran-antwort{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;
  min-height:88px;padding:var(--s-3);border:2px solid var(--line);border-radius:var(--r-card);background:var(--card);
  font:inherit;font-size:var(--fs-sm);font-weight:700;line-height:1.3;color:var(--ink);cursor:pointer;margin:0;
  text-align:center;}
.fplan-woran-antwort svg[data-ic]{width:30px;height:30px;fill:none;stroke:currentColor;stroke-width:2;
  stroke-linecap:round;stroke-linejoin:round;color:var(--brand);flex:none;}
.fplan-woran-antwort:hover{border-color:var(--brand);background:var(--brand-soft);}
.fplan-woran-antwort.an{border-color:var(--brand);background:var(--brand);color:var(--card);}
.fplan-woran-antwort.an svg[data-ic]{color:var(--card);}
.fplan-woran-antwort:focus-visible{outline:3px solid var(--brand);outline-offset:2px;}
@media (max-width:640px){
  .fplan-ziel{grid-template-columns:1fr;}
  .fplan-ziel-akt{justify-content:flex-end;}
  .fplan-akt{margin-left:0;width:100%;}
  .fplan-akt .lstd-btn{flex:1 1 auto;justify-content:center;}
  .fplan-form-zeile .lstd-feld{flex:1 1 100%;}
  .fplan-fliste{grid-template-columns:1fr;}
  .fplan-m .fplan-m-text{min-height:78px;}
  .fplan-woran-karte{padding:var(--s-4);}
  .fplan-woran-antworten{grid-template-columns:1fr;}
  .fplan-woran-antwort{flex-direction:row;justify-content:flex-start;min-height:56px;text-align:left;}
}

/* ===========================================================================
   DAS HEFT DER KLASSE – die Seite des Kindes (static/js/heft-klasse.js, H1b)
   ===========================================================================
   Die Seite selbst ist die der Lehrkraft: `.kh-raster.hs-fest` mit ihren
   `.kh-block`-Kaesten, im Lesemodus gezeichnet (uhBlockInhalt(b, true)). Hier
   steht nur, was drumherum ist – Kopf, Tage, Blattkopf – und die Schrift als
   SVG statt Leinwand. Die Hefte selbst sind Karten wie in der Buecherei
   (`.sl-bib-fach`): ein Heft ist ein Fach, das man aufschlaegt. */
.hk-jahr{ font-size:var(--fs-sm); font-weight:800; color:var(--muted); margin:var(--s-4) 0 var(--s-2); }
.hk{ display:flex; flex-direction:column; gap:var(--s-3); min-width:0; }
.hk-kopf{ display:flex; align-items:center; gap:var(--s-3); flex-wrap:wrap; }
.hk-zurueck{ appearance:none; display:inline-flex; align-items:center; gap:var(--s-1); min-height:36px;
  border:1px solid var(--line); background:var(--card); color:var(--ink); border-radius:var(--r-pill);
  padding:var(--s-1) var(--s-3) var(--s-1) var(--s-2); font:inherit; font-size:var(--fs-sm); font-weight:700;
  cursor:pointer; }
.hk-zurueck:hover{ border-color:var(--brand); color:var(--brand); }
.hk-zurueck svg, .hk-blaettern svg{ width:18px; height:18px; fill:none; stroke:currentColor; stroke-width:2;
  stroke-linecap:round; stroke-linejoin:round; }
.hk-name{ display:flex; flex-direction:column; min-width:0; }
.hk-name b{ font-size:var(--fs-lg); font-weight:830; color:var(--ink); line-height:1.2; }
.hk-name span{ font-size:var(--fs-sm); color:var(--muted); }
.hk-rumpf{ display:grid; grid-template-columns:minmax(150px, 200px) minmax(0, 1fr); gap:var(--s-4);
  align-items:start; }
.hk-tage{ display:flex; flex-direction:column; gap:var(--s-1); position:sticky; top:0;
  max-height:calc(100dvh - 200px); overflow:auto; scrollbar-width:thin; }
.hk-tag{ appearance:none; text-align:left; border:1px solid transparent; background:transparent;
  border-radius:var(--r-card); padding:var(--s-2) var(--s-3); font:inherit; color:var(--ink); cursor:pointer;
  display:flex; flex-direction:column; gap:2px; min-height:44px; }
.hk-tag:hover{ background:var(--paper); }
.hk-tag.on{ background:var(--brand-soft); border-color:var(--brand); }
.hk-tag b{ font-size:var(--fs-sm); font-weight:800; }
.hk-tag span{ font-size:var(--fs-xs); color:var(--muted); overflow:hidden; text-overflow:ellipsis;
  white-space:nowrap; }
.hk-blatt{ min-width:0; display:flex; flex-direction:column; gap:var(--s-2); }
.hk-blatt-kopf{ display:flex; align-items:center; gap:var(--s-2); flex-wrap:wrap; }
.hk-datum{ flex:1; min-width:0; display:flex; flex-direction:column; }
.hk-datum b{ font-size:var(--fs-base); font-weight:800; color:var(--ink); }
.hk-datum span{ font-size:var(--fs-sm); color:var(--muted); overflow:hidden; text-overflow:ellipsis;
  white-space:nowrap; }
.hk-blaettern{ appearance:none; flex:none; width:36px; height:36px; border-radius:50%;
  border:1px solid var(--line); background:var(--card); color:var(--ink); cursor:pointer;
  display:inline-flex; align-items:center; justify-content:center; }
.hk-blaettern:hover:not(:disabled){ border-color:var(--brand); color:var(--brand); }
.hk-blaettern:disabled{ opacity:.35; cursor:default; }
.hk-seiten{ display:flex; gap:var(--s-1); }
.hk-seitenknopf{ appearance:none; min-width:32px; height:32px; border-radius:var(--r-control);
  border:1px solid var(--line); background:var(--card); color:var(--ink); font:inherit; font-weight:700;
  cursor:pointer; }
.hk-seitenknopf.on{ background:var(--brand); border-color:var(--brand); color:var(--on-brand); }
/* Die Seite liegt wie ein Blatt da. Ohne Inhalt (laden, leer) nimmt sie
   nicht die 680 px der Lehrkraft-Flaeche ein. */
.hk-seite.kh-raster{ background:var(--card); border:1px solid var(--line); border-radius:var(--r-card);
  overflow:hidden; }
.hk-seite.kh-raster:not(.hs-fest){ height:auto; min-height:0; }
/* Die Schrift der Lehrkraft liegt UEBER den Kaesten - wie bei ihr selbst
   (v2.896.0, .kh-raster .hs-tinte). */
.hk-seite .hk-tinte{ position:absolute; left:0; top:0; width:100%; height:100%; pointer-events:none; z-index:3; }
.hk-seite .hk-tinte path{ fill:none; stroke-linecap:round; stroke-linejoin:round; }
.hk-leer{ padding:var(--s-6) var(--s-4); }
/* Der Lesemodus der Kaesten – nur, was die Bedienknoepfe ersetzt. */
.kh-li-haken{ flex:none; width:1em; height:1em; margin-top:.15em; border:1.5px solid var(--line);
  border-radius:.25em; display:inline-flex; align-items:center; justify-content:center; color:var(--on-brand); }
.kh-li-zeile.ok .kh-li-haken{ background:var(--brand); border-color:var(--brand); }
.kh-li-zeile.ok .kh-li-text{ color:var(--muted); text-decoration:line-through; }
.kh-li-haken svg{ width:.8em; height:.8em; fill:none; stroke:currentColor; stroke-width:3;
  stroke-linecap:round; stroke-linejoin:round; }
.kh-liste-lesen .kh-li-zeile{ align-items:flex-start; }
.kh-tab-lesen th, .kh-tab-lesen td{ padding:.3em .5em; text-align:left; vertical-align:top;
  overflow-wrap:anywhere; }
.kh-tab-lesen th{ font-weight:700; background:var(--paper); }
.kh-link-lesen .kh-link-go{ display:inline-flex; align-items:center; gap:.4em; max-width:100%; }
.kh-link-lesen .kh-link-go span{ overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.kh-link-lesen .kh-link-go svg{ flex:none; width:1em; height:1em; fill:none; stroke:currentColor;
  stroke-width:2; stroke-linecap:round; stroke-linejoin:round; }
.kh-auf-lesen .kh-auf-sprung{ width:100%; }
.kh-auf-lesen .kh-auf-zeile.erledigt{ opacity:.68; }
.kh-auf-lesen .kh-auf-sprung:disabled{ cursor:default; }
.kh-tb-lesen{ height:100%; }
/* ---- Formel und Abbildung im Heft (v2.868.0, uhBlockFormel/uhBlockGrafik) ---
   Der Inhalt fuellt den Kasten; der Stift zum Aendern erscheint erst am
   Kasten in „Bearbeiten" - wie die Felder der anderen Werkzeuge. */
.kh-block[data-block="formel"] .kh-bk-inhalt,
.kh-block[data-block="grafik"] .kh-bk-inhalt{ position:relative; display:flex; align-items:center;
  justify-content:center; overflow:hidden; }
.kh-formel{ max-width:100%; overflow-x:auto; color:var(--ink); font-size:1.4em; text-align:center; }
.kh-formel.abgesetzt{ width:100%; }
.kh-grafik{ width:100%; height:100%; display:flex; align-items:center; justify-content:center; }
.kh-grafik svg{ max-width:100%; max-height:100%; width:auto; height:auto; }
.kh-formel-edit{ position:absolute; top:4px; right:4px; width:28px; height:28px; padding:0;
  display:none; align-items:center; justify-content:center; border:0; border-radius:var(--r-control);
  background:var(--card); color:var(--muted); cursor:pointer; box-shadow:var(--e-1); }
.kh-formel-edit svg{ width:15px; height:15px; fill:none; stroke:currentColor; stroke-width:2;
  stroke-linecap:round; stroke-linejoin:round; }
.kh-block.kh-aktiv .kh-formel-edit{ display:inline-flex; }
.kh-tb-lesen .tb-leiste{ display:none; }
/* ---- Tafel | Meine Seite (heft-klasse.js, H2a v2.869.0) ------------------
   Die eigene Seite des Kindes: A4-Blaetter untereinander (schreib-flaeche.js
   setzt Breite, Hoehe und Papier), darueber die Schale der Schreibleiste. */
.hk-ansicht{ display:inline-flex; gap:2px; padding:3px; border-radius:var(--r-control);
  background:var(--paper); border:1px solid var(--line); }
.hk-ansicht-knopf{ appearance:none; border:0; background:transparent; min-height:32px; padding:0 var(--s-3);
  border-radius:calc(var(--r-control) - 2px); font:inherit; font-size:var(--fs-sm); font-weight:750;
  color:var(--muted); cursor:pointer; }
.hk-ansicht-knopf.on{ background:var(--card); color:var(--brand-dk); box-shadow:var(--e-1); }
.hk-meine-kopf{ display:flex; align-items:center; gap:var(--s-2); flex-wrap:wrap; }
.hk-meine-stand{ display:inline-flex; align-items:center; color:var(--muted); }
.hk-meine-stand.warnt{ color:var(--bad); }
.hk-meine-stand.gut{ color:var(--ok); }
.hk-meine-stand.laeuft{ color:var(--brand); }
.hk-meine-stand svg{ width:18px; height:18px; fill:none; stroke:currentColor; stroke-width:2;
  stroke-linecap:round; stroke-linejoin:round; }
.hk-meine-hinweis{ margin:0; font-size:var(--fs-sm); color:var(--muted); }
/* Gezoomt (v2.872.0) wird die Flaeche breiter als ihr Platz: sie rollt dann
   seitlich. `margin:auto` statt `align-items:center` - ein breiteres Blatt
   beginnt so links und bleibt ganz erreichbar. */
.hk-meine{ display:flex; flex-direction:column; align-items:flex-start; gap:var(--s-4); width:100%;
  padding:var(--s-2) 0; overflow-x:auto; overscroll-behavior-x:contain; }
.sw-blatt{ position:relative; flex:none; margin:0 auto; background:var(--card); border:1px solid var(--line);
  border-radius:4px; box-shadow:var(--e-1); overflow:hidden; }
.sw-zoom{ margin-left:auto; }
.sw-zoom .sw-zoom-wert{ min-width:58px; height:44px; border:0; background:transparent; font-size:13px;
  font-weight:750; color:var(--ink); font-variant-numeric:tabular-nums; }
.sw-tinte{ position:absolute; inset:0; width:100%; height:100%; touch-action:none;
  -webkit-user-select:none; user-select:none; -webkit-touch-callout:none; cursor:crosshair; }
.hk-ue-gross .sw-tinte{ cursor:default; }
.hk-blatt-neu{ appearance:none; align-self:center; display:inline-flex; align-items:center; gap:var(--s-1);
  min-height:40px; padding:0 var(--s-4); border:1px dashed var(--line); border-radius:var(--r-control);
  background:transparent; font:inherit; font-weight:750; color:var(--ink); cursor:pointer; }
.hk-blatt-neu:hover:not(:disabled){ border-color:var(--brand); color:var(--brand); }
.hk-blatt-neu:disabled{ opacity:.4; cursor:default; }
.hk-blatt-neu svg{ width:18px; height:18px; fill:none; stroke:currentColor; stroke-width:2;
  stroke-linecap:round; stroke-linejoin:round; }
/* ---- Die Hefte der Klasse (hkUebersichtOeffnen, H2b) ----------------------
   Ein Vollbild ueber dem Arbeitsplatz: Karten mit dem ersten Blatt, antippen
   zeigt die Seite gross (nur lesen). Ueber dem Maskottchen (1201) UND ueber
   dem Vollbild des Hefts (9000) - mit 1210 ging sie dahinter auf, und
   „Hefte der Klasse" schien am Beamer nichts zu tun (v2.892.0). */
.hk-ue{ position:fixed; inset:0; z-index:9050; background:var(--paper); overflow-y:auto;
  padding:var(--s-4) max(var(--s-4), env(safe-area-inset-right)) max(var(--s-6), env(safe-area-inset-bottom))
  max(var(--s-4), env(safe-area-inset-left)); display:flex; flex-direction:column; gap:var(--s-4); }
.hk-ue-kopf{ display:flex; align-items:center; gap:var(--s-3); padding-top:env(safe-area-inset-top); }
.hk-ue-kopf .hk-name{ flex:1; }
.hk-ue-raster{ display:grid; grid-template-columns:repeat(auto-fill, minmax(150px, 1fr)); gap:var(--s-4); }
.hk-ue-karte{ appearance:none; display:flex; flex-direction:column; align-items:stretch; gap:var(--s-2);
  padding:var(--s-2); border:1px solid var(--line); border-radius:var(--r-card); background:var(--card);
  font:inherit; color:var(--ink); text-align:left; cursor:pointer; }
.hk-ue-karte:hover:not(.leer){ border-color:var(--brand); }
.hk-ue-karte.leer{ cursor:default; }
.hk-ue-bild{ position:relative; display:block; width:100%; aspect-ratio:210 / 297; border-radius:3px;
  border:1px solid var(--line); background:var(--card); overflow:hidden; }
.hk-ue-bild canvas{ position:absolute; left:0; top:0; }
.hk-ue-karte.leer .hk-ue-bild{ opacity:.5; }
.hk-ue-name{ font-size:var(--fs-sm); font-weight:780; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.hk-ue-leer{ font-size:var(--fs-xs); color:var(--muted); }
/* Schmaler als ein Querformat-Tablet mit Leiste: die Tage als Reihe oben,
   die Seite bekommt die ganze Breite. */
@media (max-width:1100px){
  .hk-rumpf{ grid-template-columns:minmax(0, 1fr); }
  .hk-tage{ flex-direction:row; position:static; max-height:none; overflow-x:auto; overflow-y:hidden;
    scrollbar-width:none; padding-bottom:2px; }
  .hk-tage::-webkit-scrollbar{ display:none; }
  .hk-tag{ flex:none; min-height:0; border-color:var(--line); }
  .hk-tag span{ display:none; }
}
/* Am Telefon wie bei der Lehrkraft (`.kh-raster` ist dort eine Liste): die
   Schrift als Bild oben, die Hoehe aus dem Seitenformat (heft-klasse.js
   hkEinpassen setzt aspect-ratio), darunter die Kaesten. */
@media (max-width:640px){
  .hk-seite .hk-tinte{ position:relative; order:-1; flex:0 0 auto; height:auto; }
  .hk-blatt-kopf{ gap:var(--s-1); }
}

/* ===========================================================================
   DIE KLASSENWELT (static/js/klassenwelt.js, #kw-overlay in index.html)
   ===========================================================================
   Vollbild ueber allem: die Klasse als Aquarium, Garten oder Nachthimmel am
   Beamer. Eine Zeile Bedienung, darunter nur das Bild.

   WARUM SO WENIG: Der Bildschirm haengt im Unterricht an der Wand. Alles,
   was dort steht und nicht das Bild ist, steht sechs Meter weit weg im Weg.
   Die Regler fuer Zahlen und Mischung gehoeren in die Klasseneinstellungen.

   KEINE FESTE #hex-FARBE (Design-Waechter) - hsl() oder Marken-Variablen.
   =========================================================================== */
/* ⛔ DIESE EINE ZEILE HAT DIE SEITE ZUGEDECKT (v2.797.0, live am 20.09.2026).
   `<div id="kw-overlay" hidden>` bekommt sein display:none aus dem
   Standard-Stylesheet des Browsers - und eine AUTORENREGEL schlaegt das
   immer, egal wie sie heisst. `display:flex` unten hat `hidden` also
   ueberstimmt: das Overlay lag von der ersten Sekunde an ueber dem Cockpit,
   schwarz, ohne dass jemand es geoeffnet hatte.
   Die Attributregel steht DESHALB zuerst und ist staerker (0,2,0 gegen
   0,1,0) - ohne !important, aber unmissverstaendlich. Wer hier ein weiteres
   `display` ergaenzt, prueft zuerst, ob `hidden` noch wirkt.
   Festgenagelt in qa/unit/test_klassenwelt.py. */
.kw-overlay[hidden]{ display:none; }

.kw-overlay{
  position:fixed; inset:0; z-index:9000;
  display:block;                    /* Leiste und Buehne liegen uebereinander */
  background:hsl(210 45% 8%);
  /* Die Leiste darf nicht unter der Statusleiste des Telefons kleben. */
  padding-top:env(safe-area-inset-top, 0px);
  padding-bottom:env(safe-area-inset-bottom, 0px);
}
/* Solange die Welt laeuft, scrollt die Seite darunter nicht mit. */
body.kw-offen{ overflow:hidden; }

/* ⛔ DIE LEISTE SCHWEBT UEBER DEM BILD, sie steht nicht davor (Ansage Murat
   20.09.2026: „yukaridaki menü kismi seffaf olsun"). Vorher war sie ein
   massiver Balken, der dem Beamerbild oben einen Streifen wegnahm - bei
   einer Welt, die die ganze Flaeche braucht, ist das der falsche Handel.
   Jetzt liegt sie DARUEBER: `position:absolute`, durchsichtig, mit einem
   weichen Verlauf nach unten, damit die Schrift auch vor hellem Wasser
   lesbar bleibt. Die Buehne beginnt dafuer ganz oben. */
.kw-kopf{
  position:absolute; top:0; left:0; right:0; z-index:2;
  display:flex; align-items:center; gap:14px; flex-wrap:wrap;
  padding:calc(10px + env(safe-area-inset-top, 0px)) 14px 22px;
  background:linear-gradient(180deg, hsl(210 45% 6% / .62) 0%,
                                     hsl(210 45% 6% / .34) 55%,
                                     hsl(210 45% 6% / 0) 100%);
  color:hsl(0 0% 100%);
  text-shadow:0 1px 3px hsl(210 50% 8% / .7);
  pointer-events:none;              /* das Bild darunter bleibt klickbar */
}
/* ... nur die Bedienelemente selbst nehmen Klicks an. */
.kw-kopf > *{ pointer-events:auto; }
.kw-titel{ font-weight:800; font-size:15px; letter-spacing:.2px; }
.kw-klasse{ font-size:14px; opacity:.72; }

.kw-namen{ display:flex; align-items:center; gap:7px; font-size:14px; cursor:pointer; }
.kw-namen input{ width:18px; height:18px; margin:0; cursor:pointer; }
.kw-overlay.kw-namen-aus .kw-buehne .drei-schild,
.kw-overlay.kw-namen-aus .kw-buehne .schild{ display:none; }

.kw-welten{ display:flex; gap:6px; flex-wrap:wrap; }
.kw-weltknopf{
  border:1px solid hsl(200 40% 70% / .35); background:hsl(210 40% 12% / .55);
  -webkit-backdrop-filter:blur(6px); backdrop-filter:blur(6px);
  color:hsl(200 20% 88%); border-radius:999px;
  padding:6px 14px; font:inherit; font-size:14px; font-weight:600;
  cursor:pointer; transition:background .15s, color .15s, border-color .15s;
}
.kw-weltknopf:hover{ border-color:hsl(200 45% 52%); color:hsl(0 0% 100%); }
/* Auswahl = gefuellt, KEIN Rahmen in Markenblau (DESIGN_SYSTEM, Notiz
   „Kein Rahmen, keine Wort-Knoepfe"). */
.kw-weltknopf[aria-pressed="true"]{
  background:hsl(196 72% 46%); border-color:hsl(196 72% 46%);
  color:hsl(205 60% 10%);
}

.kw-musik{ display:flex; align-items:center; gap:7px; font-size:14px; opacity:.9; }
.kw-musik select{
  font:inherit; font-size:14px; padding:5px 8px; border-radius:8px;
  border:1px solid hsl(200 40% 70% / .35); background:hsl(210 40% 12% / .72);
  -webkit-backdrop-filter:blur(6px); backdrop-filter:blur(6px);
  color:hsl(0 0% 100%);
}

/* Das X steht ganz rechts - `margin-left:auto` schiebt es dorthin, egal wie
   viele Welten daneben stehen. */
.kw-zu{
  margin-left:auto; flex:none;
  width:38px; height:38px; display:grid; place-items:center;
  border:1px solid hsl(200 40% 70% / .35); background:hsl(210 40% 12% / .55);
  -webkit-backdrop-filter:blur(6px); backdrop-filter:blur(6px);
  border-radius:10px; cursor:pointer; color:hsl(0 0% 100%);
}
.kw-zu:hover{ background:hsl(0 55% 42%); border-color:hsl(0 55% 42%); }
.kw-zu svg{
  width:20px; height:20px; fill:none; stroke:currentColor; stroke-width:2;
  stroke-linecap:round; stroke-linejoin:round;
}

.kw-buehne{ position:absolute; inset:0; overflow:hidden; }
.kw-leer{
  position:absolute; inset:0; display:grid; place-items:center;
  color:hsl(200 18% 78%); font-size:15px; margin:0; padding:20px;
  text-align:center;
}

/* Auf dem Telefon bricht die Zeile um; das X bleibt trotzdem aussen rechts. */
@media (max-width:640px){
  .kw-kopf{ gap:8px 10px; padding:8px 10px; }
  .kw-titel{ font-size:14px; }
  .kw-klasse{ width:100%; order:2; }
  .kw-weltknopf{ padding:5px 11px; font-size:13px; }
  .kw-musik{ font-size:13px; }
}

/* ---------------------------------------------------------------------------
   DER MOTOR DER KLASSENWELT - Figuren, Schilder, Kulisse, 3D-Schicht
   ---------------------------------------------------------------------------
   ⛔ DIESE REGELN HABEN IN v2.797.0 GEFEHLT, und das war der teuerste Teil
   des Fehlers: sie lagen im <style>-Block der Vorschau und sind beim Umzug
   in das Modul nicht mitgekommen. Ergebnis live: die 2D-Welten zeichneten
   zwar ihre Bausteine, aber ohne Positionierung - also nichts zu sehen -,
   und unter den Fischen standen keine Namen, weil `.schild` keine Gestalt
   hatte. Befund Murat: „2d lerin hicbiri yok ... baliklarin altinda cocuk
   isimleri yok."

   ⛔ UND SIE HAENGEN ALLE UNTER `.kw-buehne`. `.figur`, `.boden`, `.schild`
   sind generische Namen; frei im Dokument wuerden sie in eine Seite von
   640 KB hineinregieren und irgendwo anders etwas zerschieben. Wer hier eine
   Regel ergaenzt, haengt sie genauso ein.
   --------------------------------------------------------------------------- */
  .kw-buehne .himmel{ position:absolute; inset:0; }
  .kw-buehne .boden{ position:absolute; left:0; right:0; bottom:0; }
  .kw-buehne .kulisse{ position:absolute; bottom:0; transform-origin:50% 100%;
            pointer-events:none; user-select:none; }
  .kw-buehne .vignette{ position:absolute; inset:0; pointer-events:none; }

  /* Teilchen: Blasen / Pollen / Sternstaub */
  .kw-buehne .teilchen{ position:absolute; border-radius:50%; pointer-events:none; }

  /* ---------- Eine Figur = ein Kind ---------- */
  .kw-buehne .figur{
    position:absolute; left:0; top:0;
    display:flex; flex-direction:column; align-items:center; gap:4px;
    transform-origin:50% 100%;
    will-change:transform;
  }
  .kw-buehne .koerper{
    position:relative;
    transition:transform .9s cubic-bezier(.22,1,.36,1);
    transform-origin:50% 100%;
    line-height:0;
  }
  .kw-buehne .koerper img{ display:block; width:100%; height:auto; }
  .kw-buehne .koerper svg{ display:block; overflow:visible; }

  /* Das Schild waechst NICHT mit – sonst wird der Name der Kleinen unlesbar. */
  .kw-buehne .schild{
    display:flex; align-items:center; gap:6px;
    background:hsl(215 30% 12% / .55);
    -webkit-backdrop-filter:blur(3px); backdrop-filter:blur(3px);
    border-radius:999px; padding:3px 9px 3px 3px;
    color:hsl(0 0% 100%); white-space:nowrap;
    box-shadow:0 2px 8px hsl(215 40% 10% / .30);
  }
  /* Die Portraits sind 240x324 – eine BUESTE mit Schultern. Mittig
     beschnitten sieht man das T-Shirt statt des Gesichts; deshalb oben
     ausrichten. */
  .kw-buehne .schild .ava{
    width:26px; height:26px; border-radius:50%; flex:none;
    background:hsl(0 0% 100% / .94);
    object-fit:cover; object-position:50% 12%;
  }
  .kw-buehne .schild .nm{ font-size:13px; font-weight:700; letter-spacing:.1px; }
  .kw-buehne .schild .zahl{ font-size:11.5px; opacity:.82; font-variant-numeric:tabular-nums; }
  .kw-buehne .zahlen-aus .schild .zahl{ display:none; }

  /* Regel 4: "diese Woche" ist der eigentliche Preis. */
  .kw-buehne .figur.woche .koerper{ filter:drop-shadow(0 0 9px hsl(48 100% 70% / .95))
                                 drop-shadow(0 0 20px hsl(45 100% 60% / .55)); }
  .kw-buehne .figur.woche .schild{ background:hsl(45 90% 45% / .88);
                        color:hsl(40 60% 12%); }
  .kw-buehne .woche-aus .figur.woche .koerper{ filter:none; }
  .kw-buehne .woche-aus .figur.woche .schild{ background:hsl(215 30% 12% / .55);
                                   color:hsl(0 0% 100%); }

  /* Futter / Wassertropfen / Funke */
  .kw-buehne .gabe{ position:absolute; pointer-events:none; border-radius:50%;
         box-shadow:0 0 10px hsl(45 100% 70% / .8); }

  /* Die Quittung. Ein einzelner Stern bewegt die Groesse nur um rund ein
     halbes Prozent – richtig so, denn ueber ein Halbjahr ergibt das die
     ganze Spanne. Sichtbar sein muss die Vergabe trotzdem, sonst klickt
     die Lehrkraft und glaubt, es sei nichts passiert. */
  .kw-buehne .quittung{ position:absolute; pointer-events:none; font-weight:800;
             font-size:15px; color:hsl(45 100% 62%); white-space:nowrap;
             text-shadow:0 1px 6px hsl(215 60% 8% / .85); }

  /* ---------- Die 3D-Welt ---------- */
  .kw-buehne .drei-bild{ position:absolute; inset:0; width:100%; height:100%; display:block; }
  /* Das Schild schwebt ueber dem Bild und wird je Bild neu gesetzt. `left/top`
     bleiben 0 – die Stelle steckt komplett im transform, das spart je Fisch
     zwei Layout-Rechnungen pro Bild. */
  .kw-buehne .drei-schild{ position:absolute; left:0; top:0; will-change:transform, opacity;
                transition:opacity .25s; }
  .kw-buehne .drei-schild .schild{ display:grid; grid-template-columns:22px auto;
    column-gap:5px; row-gap:0; padding:4px 9px 4px 4px;
    border:1px solid hsl(180 45% 85% / .15); border-radius:13px;
    background:hsl(202 45% 13% / .64); }
  .kw-buehne .drei-schild .ava{ width:22px; height:22px; grid-row:1 / 3; }
  .kw-buehne .drei-schild .nm{ font-size:12px; }
  .kw-buehne .drei-schild .zahl{ grid-column:2; font-size:9px; }
  .kw-buehne .drei-schild:hover{ z-index:5; }
  .kw-buehne .drei-schild:hover .schild{ background:hsl(195 48% 22% / .94); }
  .kw-buehne .drei-schild.woche .schild{ background:hsl(45 90% 45% / .88); color:hsl(40 60% 12%); }
  .kw-buehne .woche-aus .drei-schild.woche .schild{ background:hsl(215 30% 12% / .55);
                                         color:hsl(0 0% 100%); }
  .kw-buehne .drei-laden{ position:absolute; inset:0; display:flex; align-items:center;
               justify-content:center; color:hsl(0 0% 100% / .88); font-size:15px; }
  .kw-buehne .drei-hinweis{
    position:absolute; inset:0; display:flex; flex-direction:column;
    align-items:center; justify-content:center; gap:8px; text-align:center;
    padding:24px; background:hsl(214 60% 12% / .82); color:hsl(0 0% 100%);
  }
  .kw-buehne .drei-hinweis b{ font-size:16px; }
  .kw-buehne .drei-hinweis p{ margin:0; max-width:46ch; font-size:14px; opacity:.88; line-height:1.55; }
  .kw-buehne .drei-hinweis code{ background:hsl(0 0% 100% / .14); padding:5px 11px;
                      border-radius:7px; font-size:13.5px; }



/* Eine Meldung ueber der Buehne - sie erscheint nur, wenn etwas NICHT
   geklappt hat (z. B. ein Stern, den der Server nicht annehmen konnte).
   Ohne sie sieht ein verlorener Stern genauso aus wie ein angekommener. */
.kw-buehne .kw-meldung{
  position:absolute; left:50%; bottom:22px; transform:translateX(-50%);
  z-index:4; max-width:min(90%, 520px);
  background:hsl(0 60% 34% / .92); color:hsl(0 0% 100%);
  padding:10px 16px; border-radius:11px; font-size:14px; font-weight:600;
  box-shadow:0 6px 22px hsl(210 50% 6% / .45);
}

/* Schmuck der 2D-Welten: Lichtbuendel, Wolken, Milchstrasse, Flieger.
   Vier Arten, die der Motor generisch zeichnet (`welt.schmuck`) - eine
   fuenfte Welt bekommt damit Ausstattung, ohne dass Code dazukommt. */
.kw-buehne .schmuck{ position:absolute; pointer-events:none; }
.kw-buehne .s-strahl{ top:-12%; height:135%; transform-origin:50% 0;
                      filter:blur(7px); mix-blend-mode:screen; }
.kw-buehne .s-wolke{ left:0; border-radius:50%; filter:blur(5px); }
.kw-buehne .s-band{ left:-30%; width:160%; height:46%;
                    filter:blur(22px); mix-blend-mode:screen; }
.kw-buehne .s-flieger{ left:0; width:9px; height:9px; border-radius:50%;
                       filter:blur(.4px); }

/* ===========================================================================
   DER VORHANG UEBER DER KLASSE (v2.798.0)
   ===========================================================================
   Ansage Murat 20.09.2026: „kapali oldugunda isimler notlar filan böyle
   bugulu olsun ... varsayilan kapali olur ögretmen ona basar acilir."

   WAS VERHUELLT WIRD: Namen und Noten - also genau das, was eine Klasse vom
   Beamer ablesen koennte. NICHT verhuellt werden Zeilennummern, Faecher-
   Ueberschriften und Knoepfe: die Lehrkraft muss weiter arbeiten koennen,
   waehrend der Vorhang zu ist, sonst macht sie ihn auf und laesst ihn auf.

   WARUM `blur` UND NICHT `display:none`: Ein leeres Klassenbuch sieht kaputt
   aus, ein verschleiertes sieht abgeschaltet aus. Man erkennt weiter, DASS
   dort Namen und Noten stehen - nur nicht, welche. Das ist der Unterschied
   zwischen „geschuetzt" und „weg".

   ⛔ `user-select:none` gehoert dazu. Ein Schleier ist Optik; ohne diese
   Zeile liesse sich der Text darunter markieren und kopieren, und ein Kind
   am Lehrer-Notebook haette ihn in zwei Handgriffen.
   =========================================================================== */
/* ZWEI DINGE AM SELEKTOR SIND ABSICHT:
   1. `td.` - die Ueberschriften (`<th class="kbx-cfach">`, „Sterne") tragen
      DIESELBEN Klassen wie die Zellen. Ohne `td.` waeren auch „Mathe" und
      „Sterne" verschleiert, und Sortieren ginge nur bei offenem Vorhang.
   2. `.kbx-nmtxt` statt der ganzen Namenszelle - so bleibt die Zeilennummer
      scharf. Ein `filter` am <td> traefe sie mit, und `filter:none` am Kind
      hebt den Filter des Elternteils NICHT auf (so funktioniert `filter`). */
#kb-content.kb-vorhang .kbx-nmtxt,
#kb-content.kb-vorhang td.kbx-cfach,
#kb-content.kb-vorhang td.kbx-cstar{
  filter:blur(5px);
  user-select:none; -webkit-user-select:none;
  transition:filter .18s ease;
}

/* Das Auge: NUR das Icon, kein Kasten, kein Rahmen (Ansage Murat). */
.kbx-auge{
  flex:none; display:grid; place-items:center;
  width:34px; height:34px; padding:0;
  border:none; background:none; cursor:pointer;
  color:var(--muted); transition:color .15s, transform .12s;
}
.kbx-auge:hover{ color:var(--brand); transform:scale(1.08); }
/* Zu = auffaellig. Offen ist der Ausnahmezustand, und der soll man sehen. */
.kbx-auge.zu{ color:var(--brand); }
.kbx-auge svg{
  width:21px; height:21px; fill:none; stroke:currentColor; stroke-width:2;
  stroke-linecap:round; stroke-linejoin:round;
}

/* ===== PERSOENLICHE EINLADUNG IM ADMIN-FENSTER (v2.973.0) ================
   „Lehrkraft hinzufügen“ ohne Schule (index-app.js adminPersEinladung*).
   Nur Tokens; screen-admin.html bekommt keine neuen style-Attribute. */
.at-pers{display:flex;flex-direction:column;gap:8px;}
.at-pers-premium{display:flex;align-items:center;gap:8px;font-size:13.5px;}
.at-pers-knoepfe{display:flex;gap:8px;flex-wrap:wrap;}
.at-pers-knoepfe .btn{flex:1 1 180px;width:auto;margin:0;padding:10px 14px;font-size:14px;}
.at-pers-alt{appearance:none;border:0;background:none;padding:0;font:inherit;font-size:12px;
  color:var(--muted);text-decoration:underline;cursor:pointer;align-self:flex-start;}
.at-pers-karte{background:var(--ok-soft);border:1px solid var(--line);border-radius:10px;padding:11px 13px;}
.at-pers-titel{font-weight:800;font-size:13px;color:var(--ok-ink);margin-bottom:4px;}
.at-pers-code{font-family:ui-monospace,Menlo,monospace;font-size:20px;font-weight:800;letter-spacing:.06em;}
.at-pers-info{font-size:12px;color:var(--muted);margin-top:4px;line-height:1.5;}
.at-pers-info.ok{color:var(--ok-ink);font-weight:700;}
.at-pers-aktionen{display:flex;gap:6px;flex-wrap:wrap;margin-top:8px;}
.at-pers-mini{appearance:none;border:1px solid var(--line);background:var(--card);color:var(--brand);
  border-radius:8px;padding:5px 10px;font:inherit;font-size:12.5px;font-weight:600;cursor:pointer;}
.at-pers-mini:hover{border-color:var(--brand);}
.at-pers-mini:disabled{opacity:.6;cursor:default;}
.at-pers-mini.weg{color:var(--bad);}
.at-pers-liste{margin-top:14px;}
.at-pers-liste:empty{display:none;}
.at-pers-liste-h{font-size:12px;font-weight:800;text-transform:uppercase;letter-spacing:.05em;
  color:var(--muted);margin-bottom:6px;}
.at-pers-zeile{padding:9px 11px;background:var(--paper);border-radius:9px;margin-bottom:6px;}
.at-pers-wer b{display:block;font-size:13.5px;}
.at-pers-wer span{font-size:11.5px;color:var(--muted);word-break:break-all;}
.at-pers-zeile .at-pers-aktionen{margin-top:6px;}
.sv-modal-bg.at-pers-oben{z-index:10050;}

/* ===== ZUGANGSKARTE EINLOESEN (v2.858.0) ===================================
   Der Block auf der Anmeldeseite (index-app.js ktZeichnen). Dieselben drei
   Schritte wie auf der gedruckten Karte (karten_druck.py) - „Scannen" ist
   hier schon erledigt. Nur Tokens, keine feste Farbe.
   SEIT v2.859.5 VOR DEM ESCAPE-BLOCK (dort gehoert jeder Selektor bis zum
   Dateiende zu body.has-escape, test_escape_modus) und `.kt-ico` nur unter
   `.kt`: dieselbe Klasse traegt das Termin-Fenster des Kalenders (.kt-pop). */
.kt{margin-top:4px;}
/* ⛔ JEDE REGEL HIER BEGINNT MIT `.kt ` (v2.928.2). Das Termin-Fenster des
   Kalenders benutzt dieselben Namen (.kt-hinweis, .kt-fuss, Block „DER
   KLEINE TERMIN-DIALOG"), und beide liefen ineinander: dessen
   `.kt-fuss{display:flex}` stellte „Andere Adresse · Code erneut senden"
   linksbuendig (text-align wirkt in einem Flex-Behaelter nicht - Befund
   Murat 03.10.2026), umgekehrt bekam der Kalender-Hinweis unseren
   grauen Kasten. Mit dem Vorsatz `.kt` gilt das hier nur auf der Karte. */
.kt .kt-kopf{margin:2px 0 16px;text-align:center;}
.kt .kt-gruss{display:flex;flex-direction:column;align-items:center;gap:2px;
  font-size:21px;font-weight:850;color:var(--ink);letter-spacing:-.015em;line-height:1.2;}
.kt .kt-gruss-wort{font-size:13px;font-weight:700;letter-spacing:.02em;color:var(--muted);}
.kt .kt-gruss-name{font-size:24px;font-weight:850;color:var(--ink);letter-spacing:-.02em;overflow-wrap:anywhere;}
.kt .kt-schule{font-size:13px;font-weight:650;color:var(--muted);margin-top:7px;
  display:flex;align-items:center;justify-content:center;gap:7px;flex-wrap:wrap;}
.kt .kt-kz{display:inline-block;font-size:11.5px;font-weight:800;letter-spacing:.08em;color:var(--brand);
  background:var(--brand-soft);border-radius:99px;padding:2px 10px;
  box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--brand) 22%,transparent);}
.kt .kt-schritte{list-style:none;display:flex;align-items:flex-start;gap:0;margin:0 0 18px;padding:0;}
.kt .kt-s{flex:1;display:flex;flex-direction:column;align-items:center;gap:5px;position:relative;
  font-size:11.5px;color:var(--muted);}
.kt .kt-s b{width:26px;height:26px;border-radius:50%;display:grid;place-items:center;font-size:12px;
  background:var(--card);color:var(--muted);position:relative;z-index:1;
  box-shadow:inset 0 0 0 1.5px var(--line),0 1px 2px color-mix(in srgb,var(--ink) 8%,transparent);}
.kt .kt-s:not(:last-child)::after{content:"";position:absolute;top:13px;left:calc(50% + 17px);right:calc(-50% + 17px);
  border-top:1.5px dashed var(--line);}
/* Der erledigte Weg ist durchgezogen und gruen - der offene bleibt gestrichelt. */
.kt .kt-s.fertig:not(:last-child)::after{border-top-style:solid;border-top-color:var(--ok);}
.kt .kt-s.an{color:var(--ink);font-weight:700;}
.kt .kt-s.an b{background:var(--brand);color:var(--on-brand);
  box-shadow:inset 0 1px 0 color-mix(in srgb,var(--on-brand) 35%,transparent),
             0 0 0 4px var(--brand-soft),
             0 4px 10px -3px color-mix(in srgb,var(--brand) 60%,transparent);}
.kt .kt-s.fertig b{background:var(--ok);color:var(--on-brand);
  box-shadow:inset 0 1px 0 color-mix(in srgb,var(--on-brand) 35%,transparent),
             0 3px 8px -3px color-mix(in srgb,var(--ok) 60%,transparent);}
.kt .kt-lbl{display:block;font-size:13px;color:var(--muted);margin:0 0 8px;text-align:center;line-height:1.45;}
.kt .kt-hinweis{display:flex;align-items:flex-start;gap:9px;font-size:13px;line-height:1.45;color:var(--ink);
  background:var(--brand-soft);border:1px solid color-mix(in srgb,var(--brand) 16%,transparent);
  border-radius:12px;padding:10px 12px;margin:0 0 12px;text-align:left;}
.kt .kt-hinweis.gut{background:var(--ok-soft);border-color:color-mix(in srgb,var(--ok) 22%,transparent);}
.kt .kt-ico{display:inline-flex;flex:none;color:var(--brand);margin-top:1px;}
.kt .kt-hinweis.gut .kt-ico{color:var(--ok);}
.kt .kt-ico svg{width:17px;height:17px;}
/* Code von der Karte und Code aus der Mail: Zeichen fuer Zeichen lesbar. */
.kt #kt-code,.kt #kt-otp{text-align:center;font-weight:800;font-variant-numeric:tabular-nums;}
.kt #kt-code{letter-spacing:.12em;text-transform:uppercase;}
.kt #kt-otp:not(:placeholder-shown){letter-spacing:.32em;}
.kt .kt-zustimmung{display:flex;align-items:flex-start;gap:8px;cursor:pointer;font-size:11px;line-height:1.45;
  font-weight:500;color:var(--muted);margin:2px 0 14px;text-align:left;}
.kt .kt-zustimmung input{width:16px;height:16px;margin-top:2px;flex:none;cursor:pointer;accent-color:var(--brand);}
.kt .kt-zustimmung a{color:var(--brand);font-weight:650;text-underline-offset:2px;}
.kt .kt-los{width:100%;margin:0;}
.kt .kt-fuss{display:flex;align-items:center;justify-content:center;flex-wrap:wrap;gap:2px 8px;
  margin-top:14px;font-size:13px;color:var(--muted);text-align:center;}
.kt .kt-fuss a{color:var(--brand);font-weight:700;cursor:pointer;padding:4px 2px;}
.kt .kt-fuss a:hover{text-decoration:underline;}
.kt .kt-status{min-height:0;font-size:13px;margin-top:12px;color:var(--muted);text-align:center;}
.kt .kt-status:empty{display:none;}
.kt .kt-status.err{color:var(--bad);font-weight:600;}

/* ===== BENACHRICHTIGUNGEN: EINSTELLUNGEN (v2.874.0) =========================
   Gegenstueck zu kontoSubBenachrichtigungen in index-app.js. Zwei Ebenen:
   „Dieses Gerät" (Status + Knoepfe) und „Worüber"/„Wann" (je Konto). Die
   Zeilen sind die vorhandenen .knav/.kswitch der Einstellungen - nur ohne
   Klickflaeche und ohne Seitenpolster. Keine eigene Farbe: nur Variablen. */
.bn-einst{ padding:12px 4px 4px; }
.bn-abschnitt{ font-weight:800; font-size:15px; color:var(--ink); margin:22px 0 6px; }
.bn-abschnitt:first-child{ margin-top:0; }
.bn-abschnitt span{ font-weight:600; font-size:12px; color:var(--muted); margin-left:6px; }
.bn-status{ padding:13px; border:1px solid var(--line); border-radius:12px; margin-bottom:12px;
  font-size:13px; line-height:1.45; }
.bn-gut{ color:var(--ok-ink); }
.bn-neutral{ color:var(--ink); }
.bn-hinweis{ font-size:12.5px; color:var(--muted); margin:10px 0 0; line-height:1.5; }
.bn-knopf{ margin:0; width:auto; padding:9px 16px; }
.bn-knopf:disabled{ opacity:.5; cursor:default; }
.bn-zeile{ cursor:default; padding-left:0; padding-right:0; }
.bn-zeit-eingabe{ display:flex; gap:8px; align-items:center; flex-wrap:wrap; margin:8px 0 2px;
  font-size:13px; color:var(--muted); }
.bn-zeit-eingabe input{ width:auto; margin:0; padding:6px 8px; }
.bn-wahl{ width:auto; max-width:48%; margin:0; flex:none; }
@media (max-width:640px){
  .bn-wahl{ max-width:55%; }
}
/* „Deine Geräte" (v2.876.0): eine Zeile je angemeldetem Gerät, rechts der
   Stand des letzten Tests. Schmal rutscht der Stand unter den Namen. */
.bn-schlecht{ color:var(--bad-ink); }
.bn-geraete{ border:1px solid var(--line); border-radius:12px; margin-bottom:12px; }
.bn-geraet{ display:flex; align-items:center; gap:12px; padding:11px 13px; }
.bn-geraet + .bn-geraet{ border-top:1px solid var(--line); }
.bn-geraet-text{ flex:1; min-width:0; }
.bn-geraet-name{ font-size:13.5px; font-weight:700; color:var(--ink); }
.bn-geraet-dieses{ font-size:11.5px; font-weight:700; color:var(--brand); background:var(--brand-soft);
  border-radius:999px; padding:1px 8px; margin-left:4px; white-space:nowrap; }
.bn-geraet-sub{ font-size:12px; color:var(--muted); margin-top:2px; }
.bn-geraet-stand{ font-size:12.5px; font-weight:600; text-align:right; }
.bn-geraet-leer{ padding:13px; font-size:13px; color:var(--muted); }
@media (max-width:640px){
  .bn-geraet{ flex-wrap:wrap; gap:4px; }
  .bn-geraet-stand{ flex-basis:100%; text-align:left; }
}


/* Telefonleisten: feste Gruppen statt zufaelliger Umbrueche (v2.922.2). */
@media (max-width:640px){
  body.ml-an #boerse-toolbar > .dtb-drop > .dtb-btn{
    width:100%; justify-content:space-between;
  }
  body.ml-an .app-topbar:has(#kal-bar.kal-bar-oben){
    display:flex; flex-wrap:wrap; gap:8px; align-items:center;
  }
  body.ml-an .app-topbar #kal-tb{ flex:1 0 100%; margin:0; gap:4px; }
  body.ml-an #kal-tb .kal-datum{ margin-left:auto; font-size:16px; min-width:0;
    flex:1; white-space:normal; text-align:right; line-height:1.25; }
  body.ml-an .app-topbar #kal-bar.kal-bar-oben{ flex:1 0 100%; width:100%; margin:0; }
  body.ml-an .app-topbar .kal-bar-oben .kal-topbar{
    display:flex; flex-wrap:nowrap; justify-content:space-between; gap:8px; width:100%;
  }
  body.ml-an .app-topbar .kal-bar-oben .kal-mitte{
    position:static; transform:none; min-width:0; gap:4px;
  }
  /* Das native Auswahlfeld braucht auch aufgeklappt nur seinen Platz.
     Das alte Segment verbreiterte beim Oeffnen die ganze Leiste. */
  body.ml-an #kal-bar .kal-seg.kal-views{ display:none; }
  body.ml-an #kal-bar .kal-views-wahl{ display:inline-flex; min-width:0; }
  body.ml-an #kal-bar .kal-views-wahl select{
    font:inherit; font-size:13px; color:var(--ink); background:var(--card);
    border:1px solid var(--line); border-radius:12px; padding:0 8px; height:36px; max-width:116px;
  }
  body.ml-an .app-topbar .kal-bar-oben .kal-navgrp{ margin-left:auto; gap:2px; }
  body.ml-an #kal-tb .kal-flach, body.ml-an #kal-bar .kal-flach{ min-height:36px; }
}

/* Navigation und Arbeitsleisten – Murats Rückmeldung vom 02.10.2026. */
body.ml-an #ml-alles .ml-verbunden{ display:grid; grid-template-columns:56px minmax(0,1fr) 56px;
  align-items:center; gap:10px; padding:8px 2px 12px; background:transparent; border:0; border-radius:0; box-shadow:none; }
body.ml-an #ml-alles .ml-profilkreis,
body.ml-an #ml-alles .ml-schulkreis{ padding:0; border:0; border-radius:50%; background:transparent;
  cursor:pointer; width:56px; height:56px; display:grid; place-items:center; }
body.ml-an #ml-alles .ml-ich-av{ width:56px; height:56px; }
body.ml-an #ml-alles .ml-schullogo{ position:relative; display:flex; }
body.ml-an #ml-alles .ml-schullogo .av-school-logo{ width:52px; height:52px; border-radius:50%; }
body.ml-an #ml-alles .ml-person{ min-width:0; text-align:center; display:flex; flex-direction:column; gap:5px; }
body.ml-an #ml-alles .ml-person button{ border:0; padding:0; background:transparent; color:var(--ink); font:inherit;
  font-weight:750; text-align:center; cursor:pointer; overflow-wrap:anywhere; }
body.ml-an #ml-alles .ml-person small{ display:block; color:var(--muted); font-size:11px; font-weight:500; }
body.ml-an #ml-alles .ml-person .ml-schulname{ font-size:12px; }
/* Nutzungs-Karte: Themenlicht, echter Fortschritt, keine zusätzliche Filterebene. */
body.ml-an #ml-alles .ml-nutzung{ position:relative; padding:12px 14px; border-radius:20px; border:1px solid var(--ma-kante);
  background:linear-gradient(145deg,var(--ma-innen),var(--ma-oben) 50%,var(--ma-unten)); flex:none;
  box-shadow:inset 0 1px 0 var(--glas-licht),0 8px 18px -14px var(--sb-tief); }
body.ml-an #ml-alles .ml-nutzung-kopf{ display:flex; align-items:center; gap:8px; margin-bottom:8px; }
body.ml-an #ml-alles .ml-nutzung-kopf b{ font-size:13px; letter-spacing:-.02em; }
body.ml-an #ml-alles .ml-nutzung-funke{ width:24px; height:24px; display:grid; place-items:center; border-radius:8px;
  background:var(--brand-soft); color:var(--brand); box-shadow:inset 0 1px 0 var(--glas-licht); }
body.ml-an #ml-alles .ml-nutzung-funke svg{ width:20px; height:20px; }
body.ml-an #ml-alles .ml-nutzung-zahlen{ display:flex; align-items:baseline; justify-content:space-between; gap:12px; }
body.ml-an #ml-alles .ml-nutzung-zahlen > span{ font-size:13px; font-weight:650; }
body.ml-an #ml-alles .ml-nutzung-zahlen strong{ font-size:24px; font-weight:800; letter-spacing:-.05em; line-height:1.1; font-variant-numeric:tabular-nums; }
body.ml-an #ml-alles .ml-nutzung-zahlen strong small{ font-size:12px; font-weight:500; color:var(--muted); letter-spacing:-.02em; }
body.ml-an #ml-alles .ml-nutzung-zahlen .ml-unendlich{ font-size:30px; color:var(--brand); }
body.ml-an #ml-alles .ml-nutzung-rest,body.ml-an #ml-alles .ml-nutzung-frei{ display:flex; justify-content:space-between; gap:8px; margin-top:6px; font-size:10px; color:var(--muted); }
body.ml-an #ml-alles .ml-nutzung-frei{ color:var(--ink); font-weight:650; margin-top:5px; }
body.ml-an #ml-alles .ml-nutzung-frei span{ color:var(--muted); font-weight:500; }
body.ml-an #ml-alles .ml-nutzung progress{ display:block; appearance:none; width:100%; height:5px; border:0; border-radius:20px; overflow:hidden; margin-top:6px; background:var(--line); color:var(--brand); }
body.ml-an #ml-alles progress::-webkit-progress-bar{ background:var(--line); border-radius:20px; box-shadow:inset 0 1px 2px var(--sb-tief); }
body.ml-an #ml-alles progress::-webkit-progress-value{ background:linear-gradient(90deg,var(--brand),var(--brand-hi,var(--brand))); border-radius:20px; }
body.ml-an #ml-alles progress::-moz-progress-bar{ background:linear-gradient(90deg,var(--brand),var(--brand-hi,var(--brand))); border-radius:20px; }
body.ml-an #ml-alles .ml-nutzung .ml-nutzung-balken{ height:7px; margin-top:8px; }
body.ml-an #ml-alles .ml-nutzung-details{ border-top:1px solid var(--ma-kante); margin-top:10px; padding-top:8px; }
body.ml-an #ml-alles .ml-nutzung summary{ list-style:none; display:flex; align-items:center; justify-content:space-between; cursor:pointer; font-size:11px; color:var(--muted); font-weight:650; }
body.ml-an #ml-alles .ml-nutzung summary::-webkit-details-marker{ display:none; }
body.ml-an #ml-alles .ml-nutzung summary svg{ width:16px; height:16px; transition:transform .2s; }
body.ml-an #ml-alles .ml-nutzung-details[open] summary svg{ transform:rotate(180deg); }
body.ml-an #ml-alles #ml-nutzung-inhalt{ font-size:12px; padding-top:14px; }
body.ml-an #ml-alles .ml-nutzung-laden{ font-size:12px; color:var(--muted); }
body.ml-an #ml-alles .ml-verbrauch{ margin-bottom:12px; }
body.ml-an #ml-alles .ml-verbrauch:last-child{ margin-bottom:0; }
body.ml-an #ml-alles .ml-verbrauch > div{ display:flex; justify-content:space-between; gap:10px; }
body.ml-an #ml-alles .ml-verbrauch b{ white-space:nowrap; font-size:11px; font-weight:650; }
body.ml-an #ml-alles .ml-verbrauch small{ color:var(--muted); font-size:10px; }
body.ml-an #ml-alles .ml-upgrade{ display:flex; align-items:center; justify-content:space-between; gap:12px; padding:9px 12px; margin-top:10px; border-radius:12px; text-decoration:none;
  background:linear-gradient(125deg,var(--brand),var(--brand-hi,var(--brand))); color:var(--on-brand); font-size:12px; font-weight:750;
  box-shadow:inset 0 1px 0 var(--glas-licht),0 6px 12px -8px var(--brand); transition:transform .15s; }
body.ml-an #ml-alles .ml-upgrade span{ display:flex; align-items:center; gap:8px; }
body.ml-an #ml-alles .ml-upgrade svg{ width:18px; height:18px; }
body.ml-an #ml-alles .ml-upgrade:hover{ transform:translateY(-1px); }
body.ml-an #ml-alles .ml-upgrade:focus-visible{ outline:2px solid var(--brand); outline-offset:3px; }
/* Nachrichten und der abgelegte Robi neben „Nutzung heute" (am Rechner,
   v2.983.0): zwei Knöpfe in derselben Zeile rechts der Karte, oben bündig. */
body.ml-an #ml-alles .ml-nutzung-reihe{ display:flex; align-items:flex-start; gap:10px; flex:none; }
body.ml-an #ml-alles .ml-nutzung-reihe .ml-nutzung{ flex:1; min-width:0; }
body.ml-an #ml-alles .ml-schnell{ display:flex; gap:8px; flex:none; }
body.ml-an #ml-alles .ml-post,
body.ml-an #ml-alles .ml-robi-klein{ position:relative; width:48px; height:48px; padding:0; border:1px solid var(--ma-kante);
  border-radius:16px; display:grid; place-items:center; cursor:pointer; color:var(--ink); background:var(--ma-innen);
  box-shadow:inset 0 1px 0 var(--glas-licht),0 2px 6px -3px var(--sb-tief); transition:transform .15s; }
body.ml-an #ml-alles .ml-post:hover,
body.ml-an #ml-alles .ml-robi-klein:hover{ transform:translateY(-1px); }
body.ml-an #ml-alles .ml-post svg{ width:22px; height:22px; fill:none; stroke:currentColor; stroke-width:1.75;
  stroke-linecap:round; stroke-linejoin:round; }
body.ml-an #ml-alles .ml-robi-klein svg{ width:24px; height:24px; fill:none; stroke:currentColor; stroke-width:1.6;
  stroke-linecap:round; stroke-linejoin:round; }
body.ml-an #ml-alles .ml-post .ml-zahl{ position:absolute; top:-6px; right:-6px; min-width:18px; height:18px; padding:0 4px;
  border-radius:9px; background:var(--bad); color:var(--on-brand); font-size:10px; font-weight:800; line-height:14px;
  text-align:center; border:2px solid var(--card); box-sizing:border-box; }
body.ml-an #ml-alles .ml-post .ml-zahl[hidden]{ display:none; }
@media(prefers-reduced-motion:reduce){ body.ml-an #ml-alles .ml-post, body.ml-an #ml-alles .ml-robi-klein{ transition:none; } }

body.ml-an .ck2-kpis{ grid-template-columns:1.5fr repeat(5,minmax(0,1fr)); }
body.ml-an .ck2-willkommen{ display:flex; align-items:center; justify-content:center; padding:14px; background:transparent; color:var(--ink); text-align:center; }
body.ml-an .ck2-willkommen .ck2-gruss{ display:block; font-size:clamp(16px,1.5vw,23px); line-height:1.2; font-weight:800; }
body.ml-an .kbx-head{ flex-wrap:nowrap; overflow-x:auto; scrollbar-width:none; }
body.ml-an .kbx-head-ck{ display:flex; flex:none; flex-wrap:nowrap; }
body.ml-an .kbx-head .kbx-acts{ flex:0 0 auto; order:0; margin-left:auto; overflow:visible; }
body.ml-an .kbx-head .kbx-acts > .kbx-auge{ margin-right:0; }
/* KLASSEN-KOPF AB TABLET: EINE ZEILE, DIE KLASSE GROESSER (v2.965.1).
   Anlass Murat 05.10.2026: „yukarida bos yerimiz var … klassen kismini
   biraz daha büyük yapalim … aninda jahr kismi olsun".
   ⛔ VERWORFEN IST v2.965.0 („tek satir olmali … arkaplandaki o gri alan
   kutu ayri facia ikonlar apayri facia su anki hali daha iyi"): Klasse und
   Werkzeuge auf ZWEI Zeilen, die Werkzeuge in einer grauen Kapsel, jedes
   Zeichen in einem Farbkreis. Nicht wieder bauen – keine zweite Zeile,
   keine Kapsel um die Knoepfe, keine Farbkreise.
   Was bleibt: dieselbe EINE Zeile, dieselben Knoepfe. Der Klassen-Chip
   ist groesser, der Zeitraum steht daneben in Knopfhoehe, und die Zeile
   rueckt in die leere Luft darueber (--pl-oben 0: oben bleiben die 24 px
   des Panels, so viel wie seitlich). Telefon (bis 640 px) unberuehrt;
   bewacht von qa/unit/test_klassen_kopf_eine_zeile.py. */
@media (min-width:641px){
  body.ml-an #screen-klassenbuch:has(.kbx-head){ --pl-oben:0px; }
  body.ml-an .kbx-head{ margin-bottom:var(--s-4); }
  body.ml-an .kbx-head .kbx-chip{ height:48px; height:calc(var(--kbl-d) + 2px); padding:0 clamp(var(--s-2), calc(1.1vw), var(--s-4));
    font-size:var(--fs-xl); font-size:clamp(var(--fs-md), calc(6px + 1.25vw), var(--fs-xl));
    letter-spacing:-.01em; }
  body.ml-an .kbx-head .kbx-chip svg{ width:18px; height:18px; }
  body.ml-an .kbx-head .kbz-kbtn{ height:34px; height:clamp(26px, calc(var(--kbl-d) - 12px), 34px);
    padding:0 clamp(var(--s-2), .8vw, var(--s-3)); font-size:var(--fs-sm); font-size:clamp(var(--fs-2xs), calc(7px + .42vw), var(--fs-sm)); }
  body.ml-an .kbx-head .kbz-kbtn svg{ width:13px; height:13px; }
}
/* WAS NICHT IN DIE ZEILE PASST, GEHT INS ZAHNRAD (v2.966.0, Murat
   05.10.2026: „asla ikinci satira düsmemeli disliye girmeli").
   kbxKopfEinpassen (index-app.js) misst die Kopfzeile und gibt den Knoepfen,
   die keinen Platz haben, `kbx-im-rad`; im Schubfach zeigt kbxRadAbgleichen
   genau diese (`kbv-zeigen`) und blendet die uebrigen aus (`kbv-weg`).
   `!important` und die ID mit Absicht: die Messung schlaegt JEDE
   Bildschirmregel (z. B. `body.ml-an .kbx-act.kbx-nurbreit`), sonst stuende
   ein Knopf an beiden Stellen oder an keiner. `kbv-nurrad` = Eintraege, die
   es im Schubfach NUR fuer das Zahnrad gibt (Timer, SchlauHeft, Bewerten). */
.kbx-head .kbx-act.kbx-im-rad{ display:none !important; }
.kbv-item.kbv-nurrad{ display:none; }
#kb-verw-ov .kbv-item.kbv-zeigen{ display:flex; }
#kb-verw-ov .kbv-item.kbv-weg{ display:none; }
/* AM TELEFON KLEIN, DAMIT DIE WICHTIGEN PASSEN (v2.966.0, Murat 05.10.2026:
   „bewerten schlauheft gruppen zufall umfrage seklinde gitsin yani telefonda
   kücük sigdirilsin"). Eine Zeile: Klasse, Zeitraum (kurz, siehe
   kbxZeitBand), Auge, die Werkzeuge als kleine Zeichen, Zahnrad. Was auch so
   nicht passt, nimmt das Zahnrad (kbxKopfEinpassen) - bei 375 px Breite
   bleiben Bewerten bis Umfrage stehen. */
.kbz-kbtn .kbz-kurz{ display:none; }
@media (max-width:640px){
  .kbz-kbtn .kbz-lang{ display:none; }
  .kbz-kbtn .kbz-kurz{ display:inline; }
  body.ml-an .kbx-head .kbx-chip{ height:28px; height:var(--kbl-d); padding:0 var(--s-2); gap:2px; font-size:var(--fs-md); }
  body.ml-an .kbx-head .kbx-chip svg{ width:12px; height:12px; }
  body.ml-an .kbx-head .kbz-kbtn{ height:28px; height:calc(var(--kbl-d) - 4px); padding:0 var(--s-2); gap:2px; font-size:var(--fs-2xs); }
  body.ml-an .kbx-head .kbz-kbtn svg{ width:11px; height:11px; }
  body.ml-an .kbx-head .kbx-acts{ gap:2px; }
  body.ml-an .kbx-head .kbx-act{ width:28px; height:28px; padding:0; justify-content:center; }
  body.ml-an .kbx-head .kbx-act svg{ width:16px; height:16px; }
  body.ml-an .kbx-head .kbx-acts > .kbx-auge:not(.kbl-auge){ width:28px; height:28px; }
  body.ml-an .kbx-head .kbx-auge:not(.kbl-auge) svg{ width:19px; height:19px; }
}
@media(min-width:900px){
  body.sb-fest .wrap:has(> section:not(.hidden) > .sam-reiter){ --pl-oben:0px; padding-top:12px; }
  /* Dieselbe knappe Oberkante für die Fächer (v3.13.0, Murat: „yukarıda
     biraz fazla boşluk var"): vorher Panel 20 + Bildschirm 20 + Kopf 12 px
     über dem Weg. Den Rest regelt das Portal selbst (fach-navigation.css). */
  body.sb-fest[data-screen="unterrichtsfaecher"] .wrap{ --pl-oben:0px; padding-top:14px; }
}
@media(max-width:1199.98px){
  body.ml-an .ck2-kpis{ grid-template-columns:repeat(5,minmax(0,1fr)); }
  body.ml-an .ck2-willkommen{ grid-column:1 / -1; min-height:70px; }
}
@media(max-width:640px){
  body.ml-an .ck2-card.ck2-uhr{ display:flex; align-items:center; }
}

body.ml-an #ml-alles .ml-version{ display:block; text-align:center; font-size:10px; color:var(--muted); line-height:1.2; padding:2px 0 0; }

/* Cockpit v4: offene Arbeitsfläche, Karten im gemeinsamen Themenraster.
   Nur dieses Screen entfernt das Außenpanel; alle anderen behalten es. */
body.ml-an.has-sidebar.sb-fest[data-screen="cockpit"]:not(.lh-fullscreen) .wrap,
body.ml-an[data-screen="cockpit"] #screen-cockpit > .card{ background:transparent; border:0; box-shadow:none; backdrop-filter:none; -webkit-backdrop-filter:none; }
body.ml-an[data-screen="cockpit"] #cockpit-content{ padding-top:0; }
body.ml-an.has-sidebar.sb-fest[data-screen="cockpit"]:not(.lh-fullscreen) .wrap{ padding-top:0; border-radius:0; }
#cockpit-fit{ --ck-akzent:var(--flaeche-akzent,var(--brand)); --ck-soft:var(--flaeche-akzent-soft,var(--brand-soft)); --ck-ink:var(--flaeche-akzent-ink,var(--brand)); --ck-hauch:var(--flaeche-akzent-hauch,var(--paper)); --ck-kante:color-mix(in srgb,var(--ck-akzent) 20%,var(--line)); --ck-hover:color-mix(in srgb,var(--ck-soft) 48%,var(--card)); }
.ck4-kopf{ display:flex; align-items:center; justify-content:center; gap:24px; position:relative; min-height:76px; padding:16px 0 22px; }
.ck4-kopf .ck2-gruss{ display:block; flex:1; text-align:center; font-size:clamp(18px,2vw,27px); font-weight:650; line-height:1.4; }
.ck4-grid{ align-items:stretch; gap:16px; }
.ck4-grid > .ck2-card{ min-width:0; height:100%; border-radius:22px; background:var(--card); background:color-mix(in srgb,var(--card) 92%,var(--ck-akzent)); border:1px solid var(--ck-kante); box-shadow:0 4px 18px -14px var(--sb-tief); backdrop-filter:none; -webkit-backdrop-filter:none; }

.ck4-grid .c-h{ padding:16px 20px 10px; gap:10px; margin:0; border:0; }
.ck4-grid .c-h b{ font-size:15px; font-weight:700; }
.ck4-grid .ck4-link{ margin-left:auto; }
.ck4-grid .ck4-refresh{ margin-left:0; }
.ck4-link{ display:inline-flex; align-items:center; justify-content:center; gap:7px; border:0; background:transparent; color:var(--ck-ink); font-size:12px; font-weight:650; cursor:pointer; padding:8px; border-radius:10px; text-decoration:none; }
.ck4-link:hover{ background:var(--ck-soft); }
.ck4-grid svg,.ck4-kopf svg{ flex:none; }
.ck4-tag-leer{ display:flex; flex-direction:column; align-items:flex-start; justify-content:center; gap:12px; padding:16px 22px 24px; min-height:120px; color:var(--muted); }
.ck4-tag-leer svg{ color:var(--ck-ink); }
.ck4-tag-leer b{ font-size:15px; font-weight:500; }
.ck4-tag-leer .ck4-link{ margin:0; padding-left:0; }
.ck4-stunde{ width:calc(100% - 24px); margin:0 12px 8px; padding:14px 12px; display:flex; align-items:center; gap:14px; border:0; border-radius:16px; background:transparent; color:var(--ink); text-align:left; cursor:pointer; }
.ck4-stunde:last-child{ margin-bottom:16px; }
.ck4-stunde:hover,.ck4-stunde.ist-jetzt{ background:var(--ck-soft); }
.ck4-stunde-zeit{ flex:none; width:46px; font-size:15px; font-weight:750; font-variant-numeric:tabular-nums; }
.ck4-stunde-zeit small{ display:block; font-size:11px; color:var(--muted); font-weight:500; margin-top:4px; }
.ck4-stunde-text{ flex:1; min-width:0; }
.ck4-stunde-text b{ display:block; font-size:14px; overflow-wrap:anywhere; }
.ck4-stunde-text small{ display:block; font-size:11px; color:var(--muted); margin-top:5px; }
.ck4-stunde > svg{ color:var(--ck-ink); }
.ck4-tagzahl{ padding:0 22px 6px; font-size:11px; color:var(--muted); }
.ck4-grid .ck2-todo{ padding-bottom:4px; }
.ck4-grid .ck2-todo-head{ flex-wrap:wrap; }
.ck4-grid .ck2-todo .t-row{ padding:12px 16px; }
.ck4-grid .ck2-todo .ck2-empty{ padding:12px 20px; }
.ck4-grid .ck2-todo-foot{ margin-top:auto; }
.ck4-grid .ck2-rec #cockpit-recent{ margin:0; padding:4px 14px 16px; overflow:visible; }
.ck4-grid .r-row{ width:100%; padding:10px 8px; min-height:44px; }
.ck4-grid .r-row b{ font-size:13px; }
.ck4-grid .ck2-check .ck2-legend{ flex-wrap:wrap; gap:8px; }
.ck4-grid .ck2-check .c-h{ flex-wrap:wrap; }
.ck4-grid .ck2-check .ck2-empty{ padding:14px 20px 24px; }
#cockpit-fit > .ck2-quick{ padding:4px 0 12px; }
@media(max-width:619.98px){
 .ck4-kopf{ flex-direction:column; gap:14px; padding:16px 0 20px; }
 .ck4-kopf .ck2-gruss{ width:100%; font-size:20px; }
 .ck4-grid{ gap:12px; }
 .ck4-grid > .ck2-card{ border-radius:22px; }
}

.ck4-grid .ck2-rec .c-h{ flex-wrap:nowrap; align-items:flex-start; }
.ck4-rec-kopf{ flex:1; display:flex; align-items:center; flex-wrap:wrap; gap:8px 12px; min-width:0; }
.ck4-grid .ck2-ctx{ margin:0; padding:4px 8px; font-size:10px; line-height:1.4; border:1px solid color-mix(in srgb,var(--ck-akzent) 14%,transparent); background:color-mix(in srgb,var(--ck-hauch) 50%,transparent); color:var(--muted); border-radius:8px; flex-wrap:wrap; }
.ck4-grid .ck2-ctx b{ font-size:10px; font-weight:600; color:var(--ck-ink); }
.ck4-grid .ck2-todo-foot,.ck4-grid .ck2-tbl th{ background:color-mix(in srgb,var(--ck-hauch) 24%,var(--card)); }
.ck4-grid .ck2-todo-foot{ color:var(--ck-ink); }
.ck4-grid .ck2-todo-hico{ stroke:var(--ck-ink); }
.ck4-grid .r-row .r-kz{ background:var(--ck-soft); color:var(--ck-ink); }

/* Einheitliche ruhige Flächen, klarer Themenakzent nur bei Aktionen. */
#cockpit-fit .r-row:hover,#cockpit-fit .t-row:hover,#cockpit-fit .ck2-todo-head:hover,#cockpit-fit .ck2-todo-foot:hover{ background:var(--ck-hover); }
#cockpit-fit .ck2-check .ckh-arr{ background:var(--ck-hauch); color:var(--ck-ink); }
#cockpit-fit .ck2-tbl tbody tr:hover td{ background:var(--ck-hover); }
#cockpit-fit .ck2-tbl tr:hover .ckh-arr{ background:var(--ck-soft); color:var(--ck-ink); }
#cockpit-fit .lx-card{
  background:linear-gradient(145deg,color-mix(in srgb,var(--card) 24%,transparent),transparent 48%),color-mix(in srgb,var(--card) 38%,transparent);
  color:var(--ink); border:1px solid color-mix(in srgb,var(--card) 56%,transparent); border-radius:16px;
  box-shadow:inset 0 2px 1px color-mix(in srgb,var(--card) 58%,transparent),inset 1px 0 1px var(--glas-licht),inset 0 -1px 2px var(--glas-kante),0 0 0 .5px var(--glas-kante),0 12px 28px -20px var(--sb-tief);
}
/* Dieselbe Füllung wie an den Widgets. Nur die fünf kleinen Karten auf
   der festen Fläche filtern; Standard und mobile Liste ohne neue Filter. */
html:not([data-theme="dark"]) body.ck-hg-an:not(.ck-hg-standard)[data-screen="cockpit"] #cockpit-content.ck5-fest #cockpit-fit .lx-card{ background:linear-gradient(145deg,color-mix(in srgb,var(--card) 20%,transparent),transparent 48%),color-mix(in srgb,var(--card) 30%,transparent); -webkit-backdrop-filter:var(--ck-glas-schliff); backdrop-filter:var(--ck-glas-schliff); }
html:not([data-theme="dark"]) body.ck-hg-foto[data-screen="cockpit"] #cockpit-content #cockpit-fit .lx-card{ background:linear-gradient(145deg,color-mix(in srgb,var(--card) 18%,transparent),transparent 48%),color-mix(in srgb,var(--card) 64%,transparent); }
html:not([data-theme="dark"]) body.ck-hg-dunkel[data-screen="cockpit"] #cockpit-content #cockpit-fit .lx-card{ background:linear-gradient(145deg,color-mix(in srgb,var(--card) 18%,transparent),transparent 48%),color-mix(in srgb,var(--card) 72%,transparent); }
@supports not ((backdrop-filter:blur(1px)) or (-webkit-backdrop-filter:blur(1px))){ html:not([data-theme="dark"]) body.ck-hg-an:not(.ck-hg-standard)[data-screen="cockpit"] #cockpit-content.ck5-fest #cockpit-fit .lx-card{ background:color-mix(in srgb,var(--card) 92%,transparent); } }
#cockpit-fit .lx-card:hover{ filter:none; }
#cockpit-fit button:focus-visible,#cockpit-fit [role="button"]:focus-visible{ outline:2px solid var(--ck-akzent); outline-offset:3px; }

#cockpit-fit .lx-grid{ grid-template-columns:repeat(auto-fit,minmax(140px,1fr)); }
@media(max-width:619.98px){ #cockpit-fit .lx-grid{ grid-template-columns:repeat(auto-fit,minmax(62px,1fr)); } }
/* SCHNELLZUGRIFF AUF DER FLÄCHE: FÜNF PLÄTZE, EINE REIHE (v2.941.0, Murat:
   „5 taneyle sınırlı kalsın, çünkü aşağıya kayar"). Höchstens fünf
   Angeheftete (LX_PINS_MAX) auf fünf gleich breiten Plätzen. Ist nichts
   angeheftet, ist der Schnellzugriff leer – und nimmt keinen Platz
   (v2.942.0: kein Leerhinweis, keine Phasen-Leiste mehr). */
#cockpit-content.ck5-fest #cockpit-fit .lx-grid{ grid-template-columns:repeat(5,minmax(0,1fr)); }
#cockpit-fit #cockpit-launcher:empty{ margin:0; }
#cockpit-fit > .ck2-quick:has(> #cockpit-launcher:empty){ padding:0; }

/* ===== COCKPIT-FLÄCHE (W0a, docs/PLAN_COCKPIT_WIDGETS.md §1d, §3 Nr. 9) =====
   Die Fläche ist 750 logische Pixel hoch und 8 Spalten × 5 Zeilen groß
   (seit v2.968.0 – jedes Feld halbiert, ungefähr ein Quadrat; vorher 4)
   (dieselben Zahlen wie CK_FLAECHE in index-app.js; die fünfte Zeile seit
   v2.944.0); ihre Breite setzt ckFitScale()
   je Schirm (Grundwert 1320 hier), und skaliert wird sie als Ganzes – per
   transform am Element, ohne Rollleiste. Seit v2.967.0 nie über Maßstab 1:
   auf großen Schirmen setzt ckFitScale() stattdessen eine größere HÖHE
   (Grundwert 750 hier), und die Felder wachsen.
   #cockpit-content.ck5-fest = Flächenmodus · #cockpit-fit.ck5-liste =
   Listenmodus (unter 900 px oder unter dem Mindestmaßstab, rollt wie früher).
   Die Widgets stehen über --ck-x/--ck-y/--ck-b/--ck-h, nicht über benannte
   Bereiche: welches Widget wo steht, entscheidet die Anordnung, nicht das CSS.
   ⛔ Kein will-change an .ck5-flaeche – die Schrift würde unscharf.
   ⛔ Nichts mit position:fixed in der Fläche – es verrutscht mit dem Maßstab.
   Die doppelte ID in den Regeln zum Rollen ist Absicht: die Hülle ab 900 px
   (body.has-sidebar[data-screen="cockpit"] … #cockpit-content) trägt drei
   Klassen und muss überstimmt werden. */
/* Kennung für ckFitScale(): fehlt sie, läuft das Skript mit einem fremden
   (älteren) Stylesheet – dann Liste statt Fläche (v2.932.1). */
#cockpit-fit{ --ck5-css:1; }
#cockpit-fit .ck5-flaeche > [data-widget]{ grid-area:auto; min-width:0; }
#screen-cockpit #cockpit-content.ck5-fest{ overflow:hidden; }
#cockpit-content.ck5-fest > #cockpit-fit{ flex:1 1 auto; min-height:0; margin-block:0; display:flex; flex-direction:column; gap:16px; }
#cockpit-content.ck5-fest .ck5-buehne{ flex:1 1 auto; min-height:0; position:relative; overflow:hidden; }
#cockpit-content.ck5-fest .ck5-flaeche{ position:absolute; left:0; top:0; width:1320px; height:750px; transform-origin:0 0; grid-template-columns:repeat(8,minmax(0,1fr)); grid-template-rows:repeat(5,minmax(0,1fr)); grid-template-areas:none; gap:16px; }
#cockpit-content.ck5-fest .ck5-flaeche > [data-widget]{ grid-column:var(--ck-x) / span var(--ck-b); grid-row:var(--ck-y) / span var(--ck-h); height:auto; min-height:0; overflow-y:auto; overscroll-behavior:contain; scrollbar-width:thin; }
#cockpit-content.ck5-fest > #cockpit-fit > .ck2-quick{ flex:none; }
#cockpit-fit.ck5-liste .ck5-flaeche{ grid-template-columns:repeat(auto-fill,minmax(130px,1fr)); grid-template-rows:none; grid-template-areas:none; grid-auto-flow:row dense; }
#cockpit-fit.ck5-liste .ck5-flaeche > [data-widget]{ height:auto; }
/* IN DER LISTE STEHEN KLEINE NEBENEINANDER (v2.971.1, Befund Murat
   06.10.2026: „browseri daraltınca tekli olan kutular yayılıyor … en
   alttaki werkzeug kısmı gibi durmalıydılar"): Spalten wie der
   Schnellzugriff darunter. Mini nimmt eine, Klein und Quadrat zwei, Mittel
   und Groß die ganze Breite. `dense` lässt ein kleines in eine Lücke
   nachrücken; sonst bleibt die Lesereihenfolge der Anordnung. Am Telefon
   sind es zwei Spalten – Klein und Quadrat stehen dort wie vorher allein. */
#cockpit-fit.ck5-liste .ck5-flaeche > [data-widget]{ grid-column:1 / -1; }
#cockpit-fit.ck5-liste .ck5-flaeche > [data-widget][data-groesse="mini"]{ grid-column:auto; min-height:120px; }
#cockpit-fit.ck5-liste .ck5-flaeche > [data-widget]:is([data-groesse="k"],[data-groesse="quadrat"]){ grid-column:span 2; }
/* Zeilen, die eine Liste nur zeigt, wenn ihr Kasten Platz hat (ckEinpassen,
   v2.967.0). Die Zeilen selbst setzen display:flex – das stärkere Selektor-
   gewicht hier sorgt dafür, dass `hidden` auch wirklich versteckt. */
#cockpit-fit .ck5-flaeche [data-ck-mehr][hidden]{ display:none; }

/* ===== COCKPIT BEARBEITEN (W0c, docs/PLAN_COCKPIT_WIDGETS.md §1c, §3 Nr. 4/13) =====
   Gezeichnet von static/js/cockpit-bearbeiten.js. Was hier steht, erscheint
   NUR im Bearbeiten-Modus (#cockpit-fit.ckw-an) oder während eines Zuges –
   im Alltag ist an den Widgets nichts zu sehen (§1c). Felder, Rahmen und
   Platzhalter sind eigene Rasterelemente auf denselben Feldern wie die
   Widgets: deren Zeichner überschreiben className und innerHTML.
   ⛔ Kein Dauerwackeln (DESIGN_SYSTEM.md, sbWob v2.413.0): keine Animation
   mit „infinite" in diesem Abschnitt. Bewegung macht das Skript, und nur
   als Antwort auf eine Handlung. */
#cockpit-fit{ position:relative; }
.ckw-eingang{ position:absolute; top:3px; right:2px; z-index:3; display:inline-flex; align-items:center; gap:7px; height:30px; padding:0 12px; border:0; border-radius:var(--r-pill); background:transparent; color:var(--muted); font:inherit; font-size:var(--fs-xs); font-weight:650; cursor:pointer; transition:background-color .15s ease,color .15s ease; }
.ckw-eingang:hover,.ckw-eingang:focus-visible{ background:var(--ck-soft); color:var(--ck-ink); }
#cockpit-fit.ck5-liste .ckw-eingang,#cockpit-fit.ckw-an .ckw-eingang{ display:none; }
#cockpit-content.ck5-fest .ck5-flaeche > .ckw-feld,
#cockpit-content.ck5-fest .ck5-flaeche > .ckw-rahmen,
#cockpit-content.ck5-fest .ck5-flaeche > .ckw-platz{ grid-column:var(--ck-x) / span var(--ck-b); grid-row:var(--ck-y) / span var(--ck-h); min-width:0; min-height:0; }
#cockpit-fit.ck5-liste .ckw-feld,#cockpit-fit.ck5-liste .ckw-rahmen,#cockpit-fit.ck5-liste .ckw-platz{ display:none; }
.ckw-feld{ z-index:0; border:2px dashed color-mix(in srgb,var(--ck-akzent) 22%,transparent); border-radius:22px; pointer-events:none; }
#cockpit-fit.ckw-an .ck5-flaeche > [data-widget]{ z-index:1; pointer-events:none; overflow:hidden; }
/* Im Modus gehört die rechte obere Ecke dem „⋯": die eigenen Knöpfe des
   Widgets (Öffnen, Neu laden, Legende) treten so lange zurück. */
#cockpit-fit.ckw-an .ck5-flaeche > [data-widget] .c-h :is(button, .ck2-legend, .ck2-chev){ visibility:hidden; }
/* „−" sitzt IN der Ecke, nicht wie am Mac halb außerhalb: die Bühne und
   #cockpit-content schneiden am Rand ab (die Fläche rollt nie), dort wäre
   er halbiert. Der Kopf des Widgets rückt dafür ein Stück nach rechts. */
#cockpit-fit.ckw-an .ck5-flaeche > [data-widget] .c-h{ padding-left:52px; }
.ckw-rahmen{ position:relative; z-index:2; border-radius:22px; outline:2px dashed color-mix(in srgb,var(--ck-akzent) 55%,transparent); outline-offset:3px; cursor:grab; touch-action:none; -webkit-user-select:none; user-select:none; -webkit-touch-callout:none; }
.ckw-rahmen:focus-visible{ outline-style:solid; outline-color:var(--ck-akzent); }
.ckw-weg,.ckw-mehr,.ckw-ecke{ position:absolute; display:grid; place-items:center; padding:0; border:0; font:inherit; cursor:pointer; box-shadow:var(--e-1); }
.ckw-weg{ top:12px; left:12px; width:30px; height:30px; border-radius:50%; background:var(--ink); color:var(--card); }
.ckw-weg:hover{ background:var(--bad); color:var(--card); }
.ckw-mehr{ top:11px; right:12px; width:32px; height:32px; border-radius:50%; background:var(--card); color:var(--ink); }
.ckw-ecke{ right:10px; bottom:10px; width:30px; height:30px; border-radius:10px; background:var(--card); color:var(--ck-ink); }
.ckw-mehr:hover,.ckw-ecke:hover{ background:var(--ck-soft); }
.ckw-weg:focus-visible,.ckw-mehr:focus-visible,.ckw-ecke:focus-visible{ outline:2px solid var(--ck-akzent); outline-offset:2px; }
.ckw-platz{ z-index:1; border-radius:22px; border:2px dashed var(--ck-akzent); background:color-mix(in srgb,var(--ck-soft) 55%,transparent); pointer-events:none; }
.ck5-flaeche > [data-ckw-zieht]{ z-index:5; box-shadow:var(--e-3); }
.ck5-flaeche > .ckw-rahmen[data-ckw-zieht]{ z-index:6; box-shadow:none; cursor:grabbing; }
html.ckw-greift,html.ckw-greift *{ cursor:grabbing !important; -webkit-user-select:none !important; user-select:none !important; }
.kebab-menu.ckw-menue{ position:fixed; top:auto; right:auto; z-index:1200; min-width:210px; }
.ckw-menue button[role="menuitemradio"] > svg:last-child{ margin-left:auto; }
.ckw-menue button.ckw-aus{ opacity:.45; cursor:default; }
/* Die Galerie liegt über dem Schnellzugriff – er nimmt am Bearbeiten nicht
   teil und behält seine Höhe, damit die Fläche beim Hineingehen nicht
   springt. Wird sie höher als er, wächst sie nach oben. */
#cockpit-fit > .ck2-quick{ position:relative; }
#cockpit-fit.ckw-an > .ck2-quick > #cockpit-launcher{ visibility:hidden; }
/* Ist die Galerie höher als der Schnellzugriff, rückt die Fläche über sie
   zusammen (ckFitScale rechnet ihre Höhe ein, v2.941.0) – beim Hinein- und
   Hinausgehen kurz weich, sonst sofort (ein Fenster, das man zieht, soll
   nicht hinterherlaufen). */
#cockpit-fit.ckw-gleiten .ck5-flaeche{ transition:transform .32s cubic-bezier(.2,.8,.2,1), width .32s cubic-bezier(.2,.8,.2,1); }
.ckw-gal-zahl{ margin-left:2px; font-size:var(--fs-2xs); font-weight:650; color:var(--muted); font-variant-numeric:tabular-nums; }
/* ===== BEARBEITEN: DAS GLAS-BLATT VON UNTEN (v2.943.0) =====
   Murat 04.10.2026 mit „Widgets bearbeiten" am Mac als Vorbild: „alttan
   açılan popup gibi … yukarı doğru uzat … ilgili butonları tek satıra
   sığdır … küçült textleri kutuları … camsı". Das Blatt hängt unten an
   #cockpit-fit (cockpit-bearbeiten.js ckwGalerieZeigen gleitet es hoch),
   oben EINE Zeile, darunter ein Raster kleiner Kacheln – keine lange
   Querreihe mehr. Die Fläche rückt darüber zusammen (ckFitScale).
   GLAS nach DESIGN_SYSTEM §5.1: halbdurchsichtig, haarfeine Kante, heller
   Innenrand, tragender Schatten. Die Unschärfe NUR, wenn dahinter etwas
   liegt – ein Verlauf oder Foto (body.ck-hg-an); über der glatten
   Flächenfarbe wäre sie Aufwand ohne Bild (v2.647.1, Safari fror). */
#cockpit-fit > .ckw-galerie{ position:absolute; left:0; right:0; bottom:0; z-index:6; display:flex; flex-direction:column; gap:12px; max-height:min(56%,440px); padding:12px 14px 14px; border-radius:24px; background:color-mix(in srgb,var(--card) 76%,transparent); border:1px solid color-mix(in srgb,var(--card) 80%,transparent); box-shadow:inset 0 1px 0 var(--glas-licht),0 0 0 .5px var(--glas-kante),0 22px 54px -22px var(--sb-tief); container-type:inline-size; }
body.ck-hg-an[data-screen="cockpit"] #cockpit-fit > .ckw-galerie{ background:color-mix(in srgb,var(--card) 58%,transparent); -webkit-backdrop-filter:var(--ck-glas-schliff); backdrop-filter:var(--ck-glas-schliff); }
@supports not ((backdrop-filter:blur(1px)) or (-webkit-backdrop-filter:blur(1px))){ body.ck-hg-an[data-screen="cockpit"] #cockpit-fit > .ckw-galerie{ background:color-mix(in srgb,var(--card) 94%,transparent); } }
.ckw-gal-zeile{ flex:none; display:flex; align-items:center; justify-content:space-between; gap:12px; min-width:0; }
.ckw-gal-tabs{ display:flex; gap:2px; padding:3px; border-radius:var(--r-pill); background:color-mix(in srgb,var(--ink) 7%,transparent); }
.ckw-gal-tabs button{ display:inline-flex; align-items:center; gap:6px; height:30px; padding:0 13px; border:0; border-radius:var(--r-pill); background:transparent; color:var(--muted); font:inherit; font-size:var(--fs-xs); font-weight:700; cursor:pointer; transition:background-color .15s ease,color .15s ease; }
.ckw-gal-tabs button:hover{ color:var(--ink); }
.ckw-gal-tabs button[aria-selected="true"]{ background:var(--card); color:var(--ink); box-shadow:var(--e-1); }
.ckw-gal-aktionen{ flex:none; display:flex; align-items:center; gap:8px; }
.ckw-gal-aktionen .btn{ display:inline-flex; align-items:center; gap:6px; width:auto; height:34px; padding:0 14px; font-size:var(--fs-xs); white-space:nowrap; }
@container (max-width:760px){ .ckw-lang{ display:none; } .ckw-gal-tabs button{ padding:0 10px; } }
.ckw-gal-zahl{ margin-left:2px; font-size:var(--fs-2xs); font-weight:650; color:var(--muted); font-variant-numeric:tabular-nums; }
.ckw-gal-inhalt{ min-height:0; overflow-y:auto; overscroll-behavior:contain; scrollbar-width:thin; }
.ckw-gal-raster{ display:grid; grid-template-columns:repeat(auto-fill,minmax(150px,1fr)); gap:8px; }
.ckw-gal-karte{ display:flex; flex-direction:column; justify-content:space-between; gap:8px; min-width:0; padding:9px 10px; border-radius:14px; background:color-mix(in srgb,var(--card) 70%,transparent); box-shadow:inset 0 1px 0 var(--glas-licht),0 0 0 .5px var(--glas-kante); }
.ckw-gal-karte.ist-voll{ opacity:.72; }
.ckw-gal-kopf{ display:flex; align-items:center; gap:8px; min-width:0; }
.ckw-gal-kopf > svg{ flex:none; width:18px; height:18px; color:var(--ck-ink); }
.ckw-gal-kopf b{ flex:1; min-width:0; font-size:var(--fs-xs); font-weight:750; color:var(--ink); white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.ckw-gal-groessen{ display:flex; gap:4px; }
.ckw-gal-groessen button{ flex:1; display:inline-flex; align-items:center; justify-content:center; gap:4px; min-width:0; height:24px; padding:0 4px; border:0; border-radius:8px; background:color-mix(in srgb,var(--ink) 6%,transparent); color:var(--ck-ink); font:inherit; font-size:var(--fs-2xs); font-weight:700; cursor:pointer; }
.ckw-gal-groessen button:hover{ background:var(--ck-soft); }
.ckw-gal-groessen button[aria-disabled="true"]{ opacity:.45; cursor:default; }
/* Die Form einer Größe (v2.969.0): ein Rahmen im Verhältnis ihrer Felder –
   Mini ein Quadrat, Klein zwei nebeneinander, … Groß 4 × 4. */
.ckw-form{ display:block; width:calc(var(--b) * 4px + 2px); height:calc(var(--h) * 4px + 2px); border:1.5px solid currentColor; border-radius:2px; }
.ckw-gal-tabs button:focus-visible,.ckw-gal-groessen button:focus-visible,.ckw-gal-aktionen .btn:focus-visible{ outline:2px solid var(--ck-akzent); outline-offset:2px; }
@media(prefers-reduced-motion:reduce){ .ckw-eingang{ transition:none; } #cockpit-fit.ckw-gleiten .ck5-flaeche{ transition:none; } .ckw-gal-tabs button{ transition:none; } }
/* Am Tablet: langer Druck ohne Lupe und Auswahlmenü (v2.417.0). */
@media(hover:none){ #cockpit-content.ck5-fest .ck5-flaeche > [data-widget]{ -webkit-touch-callout:none; -webkit-user-select:none; user-select:none; } }

/* ===== DREI GRÖSSEN DER KARTEN (W2, docs/PLAN_COCKPIT_WIDGETS.md §1b, §4) =====
   „Mittel" ist die Karte von heute und bleibt unverändert. „Klein"
   beantwortet EINE Frage (Jetzt dran: die Zahl; Klassen-Check: die Ampeln;
   Unterricht heute: die nächste Stunde; Weiterarbeiten: das Letzte),
   „Groß" zeigt die Einzelheiten (der ganze Tag, acht mit Fach und Datum).
   Die Zeichner fragen ckWidgetGroesse() (index-app.js). */
.ck4-klein{ display:flex; flex-direction:column; justify-content:center; gap:6px; width:100%; height:100%; min-height:0; padding:14px 20px; border:0; background:transparent; color:var(--ink); font:inherit; text-align:left; cursor:pointer; }
.ck4-klein-kopf{ font-size:var(--fs-sm); font-weight:700; color:var(--muted); }
.ck4-klein-zahl{ display:flex; align-items:baseline; gap:8px; font-size:44px; font-weight:800; line-height:1; letter-spacing:-.02em; color:var(--ck-ink); font-variant-numeric:tabular-nums; }
.ck4-klein-zahl small{ font-size:14px; font-weight:650; letter-spacing:0; color:var(--muted); }
.ck4-klein-zeile{ min-width:0; font-size:var(--fs-xs); color:var(--muted); white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.ck4-klein-leer{ font-size:var(--fs-base); font-weight:650; color:var(--ink); }
/* Mini (ein Quadrat, v2.969.0): dieselbe Ansicht wie Klein, enger. */
#cockpit-fit [data-groesse="mini"] .ck4-klein{ gap:4px; padding:12px 14px; }
#cockpit-fit [data-groesse="mini"] .ck4-klein-zahl{ flex-direction:column; align-items:flex-start; gap:2px; font-size:34px; }
#cockpit-fit [data-groesse="mini"] .ck4-klein-zahl small{ font-size:var(--fs-xs); }
#cockpit-fit [data-groesse="mini"] .ck4-klein-leer{ font-size:var(--fs-sm); }
/* Im Quadrat ist der Kopf von „Unterricht heute" aus – die erste Zeile der
   Ansicht sagt, was es ist (v2.970.0). Bei Weiterarbeiten fällt nur der
   Kontext-Chip weg; leer bleibt der Tag knapp. */
#cockpit-fit [data-widget="heute"][data-groesse="mini"] > .c-h{ display:none; }
#cockpit-fit [data-widget="heute"][data-groesse="mini"] > #ck4-stunden{ height:100%; }
#cockpit-fit [data-widget="weiter"][data-groesse="mini"] .ck2-ctx{ display:none !important; }
#cockpit-fit [data-groesse="mini"] .ck4-tag-leer{ gap:6px; padding:10px 12px; font-size:var(--fs-sm); }
#cockpit-fit [data-groesse="mini"] .ck4-klein.ist-entfallen .ck4-klein-zahl{ text-decoration:line-through; color:var(--muted); }
/* Kopf im Quadrat: enger, damit Titel, Auge und Pfeil in eine Zeile passen. */
#cockpit-fit .ck4-grid > [data-groesse="mini"] .c-h{ padding:12px 10px 4px 14px; gap:2px; }
#cockpit-fit .ck4-grid > [data-groesse="mini"] .c-h b{ font-size:var(--fs-sm); }
#cockpit-fit .ck4-grid > [data-groesse="mini"] .c-h .ck4-link{ padding:5px; }
#cockpit-fit .ck4-grid > [data-groesse="mini"] .c-h .ck5-auge{ width:26px; height:26px; }
#cockpit-fit [data-groesse="mini"] .ck5-erster{ gap:8px; padding:2px 12px 10px; }
#cockpit-fit [data-groesse="mini"] .ck5-erster-rang{ width:30px; height:30px; font-size:var(--fs-md); }
#cockpit-fit [data-groesse="mini"] .ck5-erster b{ font-size:var(--fs-sm); }
/* KLEINE ANZEIGEN (K4, v2.971.0): Zahl rechts in der Zeile, Balken der
   Pizza-Kasse aus den Cockpit-Farben. */
.ck5-zeile-zahl{ flex:none; min-width:28px; font-size:var(--fs-lg); font-weight:800; color:var(--ck-ink); text-align:right; font-variant-numeric:tabular-nums; }
.ck5-ks-zeile .ck5-zeile-zahl{ font-size:var(--fs-sm); }
.ck5-ks-balken{ display:block; width:100%; height:6px; margin-top:6px; border-radius:var(--r-pill); background:color-mix(in srgb,var(--ck-akzent) 16%,transparent); overflow:hidden; }
.ck5-ks-balken > i{ display:block; width:var(--anteil); height:100%; border-radius:inherit; background:var(--ck-akzent); }
.ck4-ampeln{ display:flex; flex-wrap:wrap; align-content:flex-start; gap:6px; padding:0 16px 14px; overflow:hidden; }
.ck4-ampel{ display:inline-flex; align-items:center; gap:6px; max-width:100%; padding:5px 10px; border:1px solid var(--ck-kante); border-radius:var(--r-pill); background:var(--card); color:var(--ink); font:inherit; font-size:var(--fs-xs); font-weight:650; cursor:pointer; }
.ck4-ampel:hover{ background:var(--ck-soft); }
.ck4-ampel .ck2-dot{ flex:none; }
#cockpit-fit [data-groesse="k"] .ck4-tag-leer{ min-height:0; flex-direction:row; align-items:center; gap:10px; padding:2px 20px 10px; }
#cockpit-fit [data-groesse="k"] .ck4-tag-leer b{ font-size:var(--fs-sm); }
#cockpit-fit [data-groesse="k"] .ck4-stunde{ margin-bottom:6px; }
.ck4-stunde.ist-vorbei{ opacity:.55; }
#cockpit-fit .r-row .r-wann{ flex:none; margin-left:auto; padding-left:10px; font-size:var(--fs-2xs); color:var(--muted); white-space:nowrap; }
#cockpit-fit .r-row > b{ min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }

/* ===== WEITERE ANSICHTEN (W3): NACHRICHTEN, BÖRSE, PODIUM =====================
   Dieselbe Karte wie die vier von heute (.ck4-grid > .ck2-card), Zeilen wie
   „Weiterarbeiten". Der Vorhang (#cockpit-fit.ck5-vorhang-zu) verschleiert
   alles mit .ck5-verhuellt – Namen und Ergebnisse –, wie in „Klassen"
   (#kb-content.kb-vorhang). Gezeichnet in index-app.js (WEITERE ANSICHTEN). */
.ck5-auge{ display:inline-grid; place-items:center; flex:none; width:32px; height:32px; margin-left:auto; padding:0; border:0; border-radius:50%; background:transparent; color:var(--muted); cursor:pointer; }
.ck5-auge:hover{ background:var(--ck-soft); color:var(--ck-ink); }
.ck5-auge:focus-visible{ outline:2px solid var(--ck-akzent); outline-offset:2px; }
#cockpit-fit .c-h .ck5-auge + .ck4-link{ margin-left:0; }
#cockpit-fit.ck5-vorhang-zu .ck5-verhuellt{ filter:blur(6px); -webkit-user-select:none; user-select:none; }
.ck4-klein-titel{ min-width:0; font-size:var(--fs-md); font-weight:700; color:var(--ink); white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.ck5-grp{ padding:2px 20px 4px; font-size:var(--fs-2xs); font-weight:750; letter-spacing:.04em; text-transform:uppercase; color:var(--muted); }
.ck5-zeilen{ display:flex; flex-direction:column; padding:0 10px 10px; }
.ck5-zeile{ display:flex; align-items:center; gap:12px; width:100%; min-height:44px; padding:9px 10px; border:0; border-radius:14px; background:transparent; color:var(--ink); font:inherit; text-align:left; cursor:pointer; }
.ck5-zeile:hover{ background:var(--ck-hover); }
.ck5-zeile-text{ flex:1; min-width:0; }
.ck5-zeile-text b{ display:block; font-size:var(--fs-sm); white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.ck5-zeile-text small{ display:-webkit-box; margin-top:3px; font-size:var(--fs-xs); color:var(--muted); overflow:hidden; -webkit-line-clamp:2; -webkit-box-orient:vertical; }
.ck5-zeile-wann{ flex:none; font-size:var(--fs-2xs); color:var(--muted); white-space:nowrap; }
.ck5-erster{ display:flex; align-items:center; gap:14px; padding:2px 20px 14px; min-width:0; }
.ck5-erster > span:last-child{ min-width:0; }
.ck5-erster-rang{ flex:none; display:grid; place-items:center; width:44px; height:44px; border-radius:50%; background:color-mix(in srgb,var(--ck-akzent) 28%,var(--card)); color:var(--ck-ink); font-size:var(--fs-lg); font-weight:800; }
.ck5-erster b{ display:block; font-size:var(--fs-md); white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.ck5-erster small{ display:block; margin-top:3px; font-size:var(--fs-xs); color:var(--muted); }
/* Das Treppchen füllt in Mittel die Karte (Plan §1b: nichts bleibt leer);
   die Stufen wachsen mit ihr. In Groß und in der Liste hat es eine feste Höhe. */
.ck5-treppchen{ display:flex; align-items:stretch; justify-content:center; gap:10px; height:220px; padding:6px 20px 16px; }
#cockpit-content.ck5-fest .ck5-podium[data-groesse="m"] .ck5-treppchen{ flex:1 1 auto; height:auto; min-height:0; }
.ck5-platz{ flex:1; min-width:0; max-width:160px; display:flex; flex-direction:column; align-items:center; justify-content:flex-end; gap:4px; text-align:center; }
.ck5-platz-name{ max-width:100%; font-size:var(--fs-sm); font-weight:700; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.ck5-platz-wert{ max-width:100%; font-size:var(--fs-2xs); color:var(--muted); white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.ck5-platz-stufe{ display:grid; place-items:center; flex:none; width:100%; height:28%; min-height:32px; margin-top:4px; border-radius:12px 12px 4px 4px; background:var(--ck-soft); color:var(--ck-ink); font-size:var(--fs-lg); font-weight:800; }
.ck5-platz-1 .ck5-platz-stufe{ height:50%; background:color-mix(in srgb,var(--ck-akzent) 28%,var(--card)); }
.ck5-platz-2 .ck5-platz-stufe{ height:38%; }
.ck5-klassen-podium{ display:flex; flex-direction:column; gap:8px; padding:0 20px 14px; }
.ck5-kp-zeile{ display:flex; align-items:baseline; gap:10px; min-width:0; font-size:var(--fs-xs); }
.ck5-kp-zeile b{ flex:none; min-width:48px; font-size:var(--fs-sm); }
.ck5-kp-zeile span{ min-width:0; color:var(--muted); white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }

/* ===== EINGABEN (W4): MATERIAL UND ROBI ======================================
   Die zwei Widgets, in die man schreibt. Felder wie die Kapsel der
   Materialseite: --card, --ck-kante, Fokus in --ck-akzent; der Knopf eine
   Pille in --ck-akzent. Klein legt Feld und Knopf nebeneinander. Robi ist
   ein Standbild auf der Karte, kein bewegter zweiter Knopf. */
.ck5-mat{ flex:1; min-height:0; display:flex; flex-direction:column; gap:10px; padding:0 18px 16px; }
.ck5-mat-text{ width:100%; box-sizing:border-box; min-height:42px; padding:10px 14px; border:1px solid var(--ck-kante); border-radius:var(--r-card); background:var(--card); color:var(--ink); font:inherit; font-size:var(--fs-md); resize:none; }
textarea.ck5-mat-text{ flex:1 1 auto; }
.ck5-mat-text:focus,.ck5-mat-wahl select:focus,.ck5-mat-anzahl input:focus,.ck5-robi-frage input:focus{ outline:2px solid var(--ck-akzent); outline-offset:1px; }
.ck5-mat-wahl{ display:flex; flex-wrap:wrap; gap:8px; }
.ck5-mat-wahl select{ flex:1 1 120px; min-width:0; height:36px; padding:0 10px; border:1px solid var(--ck-kante); border-radius:var(--r-control); background:var(--card); color:var(--ink); font:inherit; font-size:var(--fs-sm); }
.ck5-mat-anzahl{ display:inline-flex; align-items:center; gap:6px; font-size:var(--fs-sm); color:var(--muted); }
.ck5-mat-anzahl input{ width:64px; height:36px; box-sizing:border-box; padding:0 8px; border:1px solid var(--ck-kante); border-radius:var(--r-control); background:var(--card); color:var(--ink); font:inherit; }
.ck5-mat-los{ align-self:flex-end; flex:none; display:inline-flex; align-items:center; justify-content:center; gap:8px; height:38px; padding:0 18px; border:0; border-radius:var(--r-pill); background:var(--ck-akzent); color:var(--on-brand); font:inherit; font-size:var(--fs-sm); font-weight:700; cursor:pointer; }
.ck5-mat-los:focus-visible,.ck5-robi-frage button:focus-visible,.ck5-robi-figur:focus-visible{ outline:2px solid var(--ck-akzent); outline-offset:2px; }
.ck5-material[data-groesse="k"] .ck5-mat{ flex-direction:row; align-items:center; }
.ck5-material[data-groesse="k"] .ck5-mat-text{ flex:1; min-width:0; }
.ck5-material[data-groesse="k"] .ck5-mat-los{ width:42px; padding:0; }
.ck5-material[data-groesse="k"] .ck5-mat-los span{ display:none; }
#cockpit-fit .ck5-robi{ flex-direction:row; align-items:center; gap:16px; padding:14px 18px; }
#cockpit-fit .ck5-robi[data-groesse="k"],#cockpit-fit .ck5-robi[data-groesse="mini"]{ justify-content:center; }
#cockpit-fit .ck5-robi[data-groesse="mini"]{ padding:8px; }
#cockpit-fit .ck5-robi[data-groesse="g"],#cockpit-fit .ck5-robi[data-groesse="quadrat"]{ flex-direction:column; justify-content:center; }
.ck5-robi-figur{ flex:none; display:grid; place-items:center; padding:0; border:0; border-radius:var(--r-card); background:transparent; cursor:pointer; }
.ck5-robi-leinwand{ display:block; width:96px; height:auto; }
.ck5-robi[data-groesse="m"] .ck5-robi-leinwand{ width:130px; }
.ck5-robi[data-groesse="g"] .ck5-robi-leinwand{ width:190px; }
.ck5-robi[data-groesse="mini"] .ck5-robi-leinwand{ width:72px; }
.ck5-robi[data-groesse="quadrat"] .ck5-robi-leinwand{ width:104px; }
/* Rückfall ohne Leinwand und das Zeichen in der Galerie: Robis Linienzeichen
   (ssRobiLinie) bringt keine Strichfarbe mit – es folgt der Umgebung. */
.ck5-robi-figur > svg,.ckw-gal-kopf > svg:not(.ic){ fill:none; stroke:currentColor; stroke-width:1.6; stroke-linecap:round; stroke-linejoin:round; color:var(--ck-ink); }
.ck5-robi-figur > svg{ width:64px; height:64px; }
.ckw-gal-kopf > svg:not(.ic){ width:20px; height:20px; }
.ck5-robi-rechts{ flex:1; min-width:0; display:flex; flex-direction:column; gap:10px; }
.ck5-robi[data-groesse="g"] .ck5-robi-rechts,.ck5-robi[data-groesse="quadrat"] .ck5-robi-rechts{ flex:none; width:100%; }
.ck5-robi-rechts > b{ font-size:var(--fs-md); color:var(--ink); }
.ck5-robi-frage{ display:flex; gap:8px; }
.ck5-robi-frage input{ flex:1; min-width:0; height:40px; box-sizing:border-box; padding:0 14px; border:1px solid var(--ck-kante); border-radius:var(--r-pill); background:var(--card); color:var(--ink); font:inherit; font-size:var(--fs-sm); }
.ck5-robi-frage button{ flex:none; display:grid; place-items:center; width:40px; height:40px; padding:0; border:0; border-radius:50%; background:var(--ck-akzent); color:var(--on-brand); cursor:pointer; }
.ck5-robi-beispiele{ display:flex; flex-direction:column; gap:6px; }
.ck5-robi-beispiele button{ padding:8px 12px; border:1px solid var(--ck-kante); border-radius:var(--r-card); background:var(--card); color:var(--ink); font:inherit; font-size:var(--fs-sm); text-align:left; cursor:pointer; }
.ck5-robi-beispiele button:hover{ background:var(--ck-soft); }

/* ===== HINTERGRUND DES COCKPITS (W5, docs/PLAN_COCKPIT_WIDGETS.md §3 Nr. 14) =====
   Der Wert steht in --ck-hg-flaeche (eine Farbe, ein eigener Verlauf, der
   Standard-Verlauf aus der Oberfläche oder das Foto des Geräts), gesetzt von
   ckHintergrundAnwenden (index-app.js).
   WO ER LIEGT (seit v2.949.0, Murat: „bütün her yere bu uygulanabilir …
   önerini uygula"): auf JEDER Seite der Lehrkraft, also überall, wo die
   Leiste steht (body.ml-an) – auf den anderen Seiten im RAHMEN um das
   weiße Panel (.wrap bleibt deckend, gemessen an allen 39 Bildschirmen
   mit Leiste), nur im Cockpit (kein Panel) unter allem. Seiten ohne Leiste
   (Editor, Vorschau, Teilen, Laden, das Kind) nehmen `ml-an` weg und
   behalten die Flächenfarbe – dort stünde Text direkt auf dem Grund.
   Das Cockpit steht zusätzlich im Selektor, weil es vor mlAnwenden zu
   sehen sein kann.
   Auf dunklem Grund (ck-hg-dunkel) schreiben die rahmenlosen Widgets und
   der Eingang hell, und der Rahmen (Kapsel, Logo) wird dunkles Glas – siehe
   „DER RAHMEN AUF DUNKLEM GRUND" unten. Kein neues backdrop-filter
   (DESIGN_SYSTEM.md: Safari fror). Im dunklen Design gilt der Hintergrund
   nicht – wie die Wunsch-Flächenfarbe. */
html:not([data-theme="dark"]):has(> body.ck-hg-an:is([data-screen="cockpit"],.ml-an)),
html:not([data-theme="dark"]) body.ck-hg-an:is([data-screen="cockpit"],.ml-an){ background:var(--ck-hg-flaeche); background-attachment:fixed; }
html:not([data-theme="dark"]) body.ck-hg-an[data-screen="cockpit"] .wrap{ background:transparent; }
html:not([data-theme="dark"]) body.ck-hg-dunkel[data-screen="cockpit"] #cockpit-fit .ck5-anzeige,
html:not([data-theme="dark"]) body.ck-hg-dunkel[data-screen="cockpit"] #cockpit-fit .ck5-zw-zahl,
html:not([data-theme="dark"]) body.ck-hg-dunkel[data-screen="cockpit"] #cockpit-fit .kh-uhr-dig,
html:not([data-theme="dark"]) body.ck-hg-dunkel[data-screen="cockpit"] .app-topbar .at-title{ color:var(--card); }
html:not([data-theme="dark"]) body.ck-hg-dunkel[data-screen="cockpit"] #cockpit-fit .ckw-eingang{ color:color-mix(in srgb,var(--card) 88%,transparent); }
html:not([data-theme="dark"]) body.ck-hg-dunkel[data-screen="cockpit"] #cockpit-fit .ckw-feld{ border-color:color-mix(in srgb,var(--card) 40%,transparent); }
html:not([data-theme="dark"]) body.ck-hg-dunkel[data-screen="cockpit"] #cockpit-fit .ckw-weg{ background:var(--card); color:var(--ink); }
html:not([data-theme="dark"]) body.ck-hg-dunkel[data-screen="cockpit"] #cockpit-fit .ckw-rahmen{ outline-color:color-mix(in srgb,var(--card) 70%,transparent); }
/* DER RAHMEN AUF DUNKLEM GRUND (v2.947.1, Murat 04.10.2026 mit
   Bildschirmfoto: „seçili olan menü … şişiyor … balonlar … logo … kare
   gibi"). Bis v2.947.0 bekamen Kapsel und Logo hier eine deckende
   --card-Fläche. Die Kapsel besteht aber aus ZWEI Teilen: .ml-glas (der
   gerade Streifen, trägt die Unschärfe) und die SVG-Form .ml-flaeche mit
   dem Hügel um die Wahl. Deckend wurde nur der Streifen, der Hügel blieb
   Glas – auf dunklem Grund standen zwei Stoffe nebeneinander, als Ballons;
   das Logo saß in einer weißen Kachel. Jetzt wechselt der GANZE Rahmen den
   Stoff: das dunkle Glas (--glas-dunkel-*, dasselbe Rezept wie der
   Dunkelmodus), helle Zeichen, der Ring um den Tropfen (--ml-ring) dunkel
   statt in --shell-bg, und das Logo in seiner hellen Fassung (logo-hell.png,
   derselbe Tausch wie im Dunkelmodus) ohne Kachel. Seit v2.949.0 auf
   jeder Seite mit Leiste (.ml-an) – auch am Telefon, wo die Leiste über dem
   weißen Panel schwebt: dunkler Grund, dunkle Leiste, überall gleich. */
html:not([data-theme="dark"]) body.ck-hg-dunkel.ml-an :is(#ml-leiste,#ml-rand){ --sb-tief:var(--glas-dunkel-tief); --glas-kapsel:var(--glas-dunkel-kapsel); --glas-kante:var(--glas-dunkel-kante); --glas-licht:var(--glas-dunkel-licht); --ml-ring:color-mix(in srgb,var(--ink) 55%,transparent); }
html:not([data-theme="dark"]) body.ck-hg-dunkel.ml-an #ml-leiste .ml-platz{ color:color-mix(in srgb,var(--card) 78%,transparent); }
html:not([data-theme="dark"]) body.ck-hg-dunkel.ml-an #ml-leiste .ml-name{ color:var(--card); }
html:not([data-theme="dark"]) body.ck-hg-dunkel.ml-an #ml-rand img.logo-tausch-marke{ content:url("/static/images/logo-hell.png"); }
/* Ein Foto ist nie gleichmäßig hell: ein weicher Saum in der Gegenfarbe
   hält Uhr, Timer und Eingang auch über einer unruhigen Stelle lesbar (W6).
   EINE FORM, EIN STOFF (v2.947.1): die ganze Kapselform samt Hügel trägt
   dieselbe fast deckende Füllung, der Streifen darunter nur noch seinen
   Glanz – sonst stünde der Hügel als durchsichtiger Ballon am deckenden
   Streifen, und durch ihn sähe man das Foto ungeschärft. Das Logo bekommt
   statt der Kachel einen Lichthof in der Gegenfarbe (drop-shadow folgt den
   Buchstaben, keine Fläche). */
html:not([data-theme="dark"]) body.ck-hg-foto.ml-an #ml-leiste{ --glas-kapsel:color-mix(in srgb,var(--card) 76%,transparent); }
html:not([data-theme="dark"]) body.ck-hg-foto.ck-hg-dunkel.ml-an #ml-leiste{ --glas-kapsel:color-mix(in srgb,var(--ink) 70%,var(--glas-dunkel-kapsel)); }
html:not([data-theme="dark"]) body.ck-hg-foto.ml-an #ml-rand .ml-marke img{ filter:drop-shadow(0 0 2px var(--card)) drop-shadow(0 0 7px var(--card)); }
html:not([data-theme="dark"]) body.ck-hg-foto.ck-hg-dunkel.ml-an #ml-rand .ml-marke img{ filter:drop-shadow(0 0 2px var(--ink)) drop-shadow(0 0 7px color-mix(in srgb,var(--ink) 70%,transparent)); }
html:not([data-theme="dark"]) body.ck-hg-foto[data-screen="cockpit"] #cockpit-fit .ck5-anzeige,
html:not([data-theme="dark"]) body.ck-hg-foto[data-screen="cockpit"] #cockpit-fit .ckw-eingang{ text-shadow:0 1px 2px color-mix(in srgb,var(--card) 85%,transparent), 0 0 12px color-mix(in srgb,var(--card) 60%,transparent); }
html:not([data-theme="dark"]) body.ck-hg-foto.ck-hg-dunkel[data-screen="cockpit"] #cockpit-fit .ck5-anzeige,
html:not([data-theme="dark"]) body.ck-hg-foto.ck-hg-dunkel[data-screen="cockpit"] #cockpit-fit .ckw-eingang{ text-shadow:0 1px 3px color-mix(in srgb,var(--ink) 75%,transparent), 0 0 14px color-mix(in srgb,var(--ink) 50%,transparent); }
/* Die Wahl in der Galerie */
/* VIER GRUPPEN NEBENEINANDER, KLEINER (v2.947.0, Murat: „dördünü yan yana
   gösteririz, daha küçük"): Oberfläche · Farben · Verläufe · Foto. */
.ckw-hg{ display:flex; flex-wrap:wrap; gap:12px 22px; align-items:flex-start; }
.ckw-hg-gruppe{ flex:none; display:flex; flex-direction:column; gap:7px; }
.ckw-hg-gruppe > span{ font-size:var(--fs-2xs); font-weight:750; letter-spacing:.04em; text-transform:uppercase; color:var(--muted); }
.ckw-hg-reihe{ display:flex; flex-wrap:wrap; gap:7px; max-width:420px; }
.ckw-hg-ober .ckw-hg-reihe{ max-width:170px; }
.ckw-hg-farben .ckw-hg-reihe{ max-width:200px; }
.ckw-hg-verlaeufe .ckw-hg-reihe{ max-width:490px; }
.ckw-hg-wahl,.ckw-hg-eigen{ position:relative; flex:none; display:grid; place-items:center; width:32px; height:32px; padding:0; border:1px solid var(--line); border-radius:50%; background:var(--shell-bg); color:var(--ck-ink); cursor:pointer; }
.ckw-hg-wahl.ist-verlauf{ width:47px; border-radius:11px; }
/* Die Oberfläche in den Formen der Einstellungen: kleine Quadrate. */
.ckw-hg-wahl.ist-klein,.ckw-hg-eigen.ist-klein{ width:26px; height:26px; border-radius:8px; }
.ckw-hg-wahl.ist-flach::after{ content:""; width:16px; height:2px; border-radius:2px; background:var(--muted); transform:rotate(-45deg); }
.ckw-hg-wahl[aria-pressed="true"],.ckw-hg-eigen.an{ outline:2px solid var(--ck-akzent); outline-offset:2px; }
.ckw-hg-wahl:focus-visible,.ckw-hg-eigen:focus-within{ outline:2px solid var(--ck-akzent); outline-offset:2px; }
.ckw-hg-eigen{ overflow:hidden; background:var(--card); }
.ckw-hg-eigen input[type="color"],.ckw-hg-eigen input[type="file"]{ position:absolute; inset:0; width:100%; height:100%; opacity:0; cursor:pointer; border:0; padding:0; }
.ckw-hg-wahl.ist-foto{ background-size:cover; background-position:center; }
.ckw-hg-reihe small{ align-self:center; font-size:var(--fs-xs); color:var(--muted); }

/* ===== DIE WIDGETS IN GLAS (v2.945.0) =====
   Klareres, dickes Glas (Murat 13.10.2026): weniger weiße Füllung,
   Licht an der oberen/seitlichen Kante und ein leiser Innenrand unten.
   Nur der Hintergrund ist transparent, Schrift und Bedienung bleiben
   deckend. Der Stoff folgt dem Widget beim Ziehen ohne zweite Ebene.
   Filter weiterhin nur auf der festen Fläche mit Verlauf/Foto, nie auf
   glattem Grund, über dem Standard oder in der rollenden Liste (Safari).
   Dunkle Hintergründe und Browser ohne Filter tragen mehr Füllung für
   lesbare Hinweise. MIT WEM: DESIGN_SYSTEM §5.1, Cockpit-Browserprüfung,
   test_cockpit_bearbeiten/test_cockpit_hintergrund. */
#cockpit-fit .ck5-flaeche > .ck2-card{
  --muted:color-mix(in srgb,var(--ink) 88%,var(--card));
  background:linear-gradient(145deg,color-mix(in srgb,var(--card) 24%,transparent),transparent 48%),color-mix(in srgb,var(--card) 38%,transparent);
  border:1px solid color-mix(in srgb,var(--card) 56%,transparent);
  box-shadow:inset 0 2px 1px color-mix(in srgb,var(--card) 58%,transparent),inset 1px 0 1px var(--glas-licht),inset 0 -1px 2px var(--glas-kante),0 0 0 .5px var(--glas-kante),0 12px 28px -20px var(--sb-tief);
}
#cockpit-fit .ck5-flaeche > .ck2-card :is(.ck2-todo-foot,.ck2-tbl th){ background:color-mix(in srgb,var(--ck-hauch) 18%,transparent); }
html:not([data-theme="dark"]) body.ck-hg-an:not(.ck-hg-standard)[data-screen="cockpit"] #cockpit-content.ck5-fest .ck5-flaeche > .ck2-card{ background:linear-gradient(145deg,color-mix(in srgb,var(--card) 20%,transparent),transparent 48%),color-mix(in srgb,var(--card) 30%,transparent); -webkit-backdrop-filter:var(--ck-glas-schliff); backdrop-filter:var(--ck-glas-schliff); }
/* Ein Foto kann innerhalb derselben Karte von Weiß nach Schwarz wechseln.
   Die mittlere Bildhelligkeit schützt die dunklen Stellen nicht: dort
   etwas mehr Füllung, damit die durchsichtige Fläche lesbar bleibt. */
html:not([data-theme="dark"]) body.ck-hg-foto[data-screen="cockpit"] #cockpit-content #cockpit-fit .ck5-flaeche > .ck2-card{ background:linear-gradient(145deg,color-mix(in srgb,var(--card) 18%,transparent),transparent 48%),color-mix(in srgb,var(--card) 64%,transparent); }
html:not([data-theme="dark"]) body.ck-hg-dunkel[data-screen="cockpit"] #cockpit-content #cockpit-fit .ck5-flaeche > .ck2-card{ background:linear-gradient(145deg,color-mix(in srgb,var(--card) 18%,transparent),transparent 48%),color-mix(in srgb,var(--card) 72%,transparent); }
@supports not ((backdrop-filter:blur(1px)) or (-webkit-backdrop-filter:blur(1px))){ html:not([data-theme="dark"]) body.ck-hg-an:not(.ck-hg-standard)[data-screen="cockpit"] #cockpit-content.ck5-fest .ck5-flaeche > .ck2-card{ background:color-mix(in srgb,var(--card) 92%,transparent); } }

/* Monatskalender: die Monatsfläche bleibt in jeder Größe vollständig.
   Mittel = Monat + ausgewählter Tag; Groß = Agenda unter dem Monat.
   Nur die Termine rollen innen, nie die Cockpit-Fläche. */
#cockpit-fit .ckm{ padding:16px; gap:12px; }
.ckm-kopf,.ckm-blaettern,.ckm-agenda-kopf{ display:flex; align-items:center; gap:6px; min-width:0; }
.ckm-kopf > b{ flex:1; font-size:var(--fs-md); text-transform:capitalize; }
.ckm-blaettern button{ display:grid; place-items:center; min-width:28px; height:28px; padding:0 6px; border:0; border-radius:var(--r-control); background:transparent; color:var(--ink); font:inherit; font-size:var(--fs-xs); cursor:pointer; }
.ckm button:focus-visible{ outline:2px solid var(--ck-akzent); outline-offset:2px; }
.ckm-blaettern button:hover,.ckm-termin:hover{ background:var(--ck-hover); }
.ckm-inhalt{ display:flex; gap:20px; flex:1; min-height:0; }
.ckm-monat{ display:flex; flex-direction:column; flex:1; min-width:0; min-height:0; }
.ckm-wochentage,.ckm-tage{ display:grid; grid-template-columns:repeat(7,minmax(0,1fr)); text-align:center; }
.ckm-wochentage{ flex:none; margin-bottom:4px; color:var(--muted); font-size:var(--fs-2xs); font-weight:700; }
.ckm-tage{ flex:1; grid-auto-rows:minmax(0,1fr); gap:2px; }
.ckm-tag{ position:relative; display:grid; place-items:center; min-width:0; min-height:26px; padding:0; border:0; background:transparent; color:var(--ink); font:inherit; font-size:var(--fs-sm); cursor:pointer; border-radius:var(--r-control); }
.ckm-tag > span{ display:grid; place-items:center; width:28px; height:28px; border-radius:50%; }
.ckm-tag.ist-wochenende{ color:var(--muted); }
/* KEIN QUADRAT, NUR DER RING VON HEUTE (v3.13.1, Murat 15.10.2026: „kare
   bir seçim renkli kısmı var onu kaldır, tek kırmızı yuvarlak bugünü
   göstersin"): Zeigen tönt nur den runden Kreis der Zahl, der gewählte Tag
   (Mittel/Groß) steht fett – sein Datum steht ohnehin über den Terminen.
   Auch der Tastaturfokus liegt rund an der Zahl statt eckig am Knopf. */
.ckm-tag:hover > span{ background:var(--ck-hover); }
.ckm-tag.ist-gewaehlt{ color:var(--ink); font-weight:800; }
#cockpit-fit .ckm-tag:focus-visible{ outline:none; }
.ckm-tag:focus-visible > span{ outline:2px solid var(--ck-akzent); outline-offset:2px; }
.ckm-tag.ist-heute > span{ background:color-mix(in srgb,var(--card) 65%,transparent); box-shadow:inset 0 0 0 2px var(--bad-ink); color:var(--bad-ink); font-weight:800; }
.ckm-punkt,.ckm-legende{ width:4px; height:4px; border-radius:50%; background:var(--ck-ink); }
.ckm-punkt{ position:absolute; left:calc(50% - 2px); bottom:0; }
.ckm-agenda{ flex:1; display:flex; flex-direction:column; min-width:0; min-height:0; overflow-y:auto; scrollbar-width:thin; border-left:1px solid var(--glas-kante); padding-left:16px; }
.ckm-agenda-kopf{ flex:none; justify-content:space-between; margin-bottom:8px; }
.ckm-agenda-kopf b{ font-size:var(--fs-sm); }
.ckm-termin{ flex:none; display:flex; align-items:center; gap:8px; padding:10px 0; border:0; border-bottom:1px solid var(--glas-kante); background:transparent; text-align:left; font:inherit; color:var(--ink); cursor:pointer; }
.ckm-termin small{ flex:none; min-width:46px; color:var(--muted); font-size:var(--fs-xs); }
.ckm-termin b{ flex:1; min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; font-size:var(--fs-sm); }
.ckm-termin svg{ flex:none; color:var(--ck-ink); }
.ckm-termin.ist-entfallen b{ text-decoration:line-through; color:var(--muted); }
.ckm-leer{ color:var(--muted); font-size:var(--fs-xs); line-height:1.5; }
.ckm-fuss{ flex:none; display:flex; align-items:center; gap:6px; color:var(--muted); font-size:var(--fs-2xs); line-height:1.4; }
.ckm-fuss button{ border:0; background:transparent; padding:0; font:inherit; color:var(--ck-ink); cursor:pointer; text-decoration:underline; }
.ckm[data-groesse="quadrat"] .ckm-kopf{ flex-wrap:wrap; }
.ckm[data-groesse="g"] .ckm-inhalt{ flex-direction:column; }
.ckm[data-groesse="g"] .ckm-monat{ flex:0 0 54%; }
.ckm[data-groesse="g"] .ckm-agenda{ border-left:0; border-top:1px solid var(--glas-kante); padding:12px 0 0; }
#cockpit-fit.ck5-liste .ckm{ min-height:300px; }
#cockpit-fit.ck5-liste .ckm-inhalt{ min-height:220px; }
@media(max-width:480px){
  #cockpit-fit.ck5-liste .ckm-inhalt{ flex-direction:column; }
  #cockpit-fit.ck5-liste .ckm-monat{ flex:none; min-height:220px; }
  #cockpit-fit.ck5-liste .ckm-agenda{ border-left:0; border-top:1px solid var(--glas-kante); padding:12px 0 0; max-height:220px; }
}

/* ===== COCKPIT-ANZEIGEN (W1, docs/PLAN_COCKPIT_WIDGETS.md §3 Nr. 2/3, §4) =====
   Uhr und Timer stehen OHNE Karte auf der Fläche (Murat: „arka plansız
   einfach saat") und wachsen mit ihrem Kasten: die Schrift rechnet in
   Containereinheiten des Widgets (cqw/cqh), nie in Bildschirmeinheiten –
   dieselbe Größe sieht am Rechner, am iPad und am Beamer gleich aus (§1b).
   Die festen px-Werte davor sind der Rückfall für Browser ohne
   Containereinheiten. Gezeichnet in index-app.js (Abschnitt DIE ANZEIGEN). */
#cockpit-fit .ck5-anzeige{ container-type:size; display:flex; flex-direction:column; align-items:center; justify-content:center; gap:12px; min-width:0; min-height:0; color:var(--ink); }
#cockpit-content.ck5-fest .ck5-flaeche > .ck5-anzeige{ overflow:hidden; }
/* IN DER LISTE eine feste Höhe je Größe (v2.941.1): container-type:size
   nimmt dem Kasten jede Höhe aus dem Inhalt. Die Liste setzt für ALLE
   Widgets height:auto (`#cockpit-fit.ck5-liste .ck5-flaeche >
   [data-widget]`, stärker als eine Regel nur mit Klasse) – Uhr und Timer
   fielen damit auf null, und ihr Inhalt lag hinter dem nächsten Widget
   (Befund Murat 04.10.2026: Browser schmaler gezogen und iPad hochkant).
   Deshalb hier derselbe Selektor plus .ck5-anzeige – er gewinnt immer. */
#cockpit-fit.ck5-liste .ck5-flaeche > [data-widget].ck5-anzeige{ height:200px; }
#cockpit-fit.ck5-liste .ck5-flaeche > [data-widget].ck5-anzeige[data-groesse="k"]{ height:150px; }
#cockpit-fit.ck5-liste .ck5-flaeche > [data-widget].ck5-anzeige[data-groesse="mini"]{ height:130px; }
#cockpit-fit.ck5-liste .ck5-flaeche > [data-widget].ck5-anzeige[data-groesse="quadrat"]{ height:220px; }
#cockpit-fit.ck5-liste .ck5-flaeche > [data-widget].ck5-anzeige[data-groesse="g"]{ height:280px; }
.ck5-uhr .kh-uhr{ width:100%; height:100%; padding:4%; box-sizing:border-box; }
.ck5-uhr .kh-uhr-dig{ font-size:56px; font-size:min(19cqw,56cqh); line-height:1; }
.ck5-zw-zahl{ appearance:none; border:0; background:transparent; padding:0; color:var(--ink); font:inherit; font-weight:800; letter-spacing:-.02em; font-variant-numeric:tabular-nums; line-height:1; cursor:pointer; font-size:96px; font-size:min(22cqw,36cqh); }
.ck5-timer[data-groesse="k"] .ck5-zw-zahl{ font-size:56px; font-size:min(24cqw,44cqh); }
.ck5-timer[data-groesse="g"] .ck5-zw-zahl{ font-size:120px; font-size:min(21cqw,30cqh); }
/* Mini (ein Quadrat, v2.969.0): die Zahl und ein Knopf, enger gesetzt. */
#cockpit-fit .ck5-timer[data-groesse="mini"]{ gap:6px; }
.ck5-timer[data-groesse="mini"] .ck5-zw-zahl{ font-size:32px; font-size:min(27cqw,34cqh); }
.ck5-timer[data-groesse="mini"] .ck5-zw-symbole button{ width:34px; height:34px; }
.ck5-timer[data-groesse="quadrat"] .ck5-zw-zahl{ font-size:64px; font-size:min(24cqw,34cqh); }
/* Ab einer Stunde (oder mit Zehnteln) ist die Zahl länger – dann kleiner,
   statt über den Rand zu laufen (data-lang setzt ckZwZahlSetzen). */
.ck5-timer .ck5-zw-zahl:has([data-lang]){ font-size:48px; font-size:min(13cqw,30cqh); }
.ck5-timer[data-zw-aus] .ck5-zw-zahl{ color:var(--amber-ink); animation:ckZwAus 1s ease-in-out 4; }
@keyframes ckZwAus{ 0%,100%{ opacity:1; } 50%{ opacity:.45; } }
.ck5-zw-knoepfe,.ck5-zw-minuten{ display:flex; flex-wrap:wrap; align-items:center; justify-content:center; gap:8px; }
.ck5-zw-knoepfe button,.ck5-zw-minuten button,.ck5-zw-tabs button{ appearance:none; display:inline-flex; align-items:center; justify-content:center; gap:6px; padding:9px 16px; border:1px solid var(--ck-kante); border-radius:var(--r-pill); background:var(--card); color:var(--ink); font:inherit; font-size:var(--fs-sm); font-weight:700; cursor:pointer; transition:background-color .15s ease,color .15s ease; }
.ck5-zw-knoepfe button:hover,.ck5-zw-minuten button:hover{ background:var(--ck-soft); }
.ck5-zw-knoepfe button.haupt{ border-color:transparent; background:var(--ck-akzent); color:var(--on-brand); }
.ck5-zw-knoepfe button.haupt.laeuft{ border-color:var(--ck-kante); background:var(--card); color:var(--ck-ink); }
.ck5-zw-symbole button{ width:40px; height:40px; padding:0; }
.ck5-zw-tabs{ display:flex; gap:4px; padding:3px; border-radius:var(--r-pill); background:color-mix(in srgb,var(--card) 70%,transparent); }
.ck5-zw-tabs button{ padding:7px 14px; border-color:transparent; background:transparent; color:var(--muted); }
.ck5-zw-tabs button.an{ background:var(--card); color:var(--ink); box-shadow:var(--e-1); }
.ck5-anzeige button:focus-visible{ outline:2px solid var(--ck-akzent); outline-offset:2px; }
@media(prefers-reduced-motion:reduce){
 .ck5-timer[data-zw-aus] .ck5-zw-zahl{ animation:none; }
 .ck5-zw-knoepfe button,.ck5-zw-minuten button,.ck5-zw-tabs button{ transition:none; }
}

.ck4-taghinweis{ padding:4px 20px 12px; font-size:11px; color:var(--muted); }
.ck4-stunde.ist-entfallen .ck4-stunde-text b{ text-decoration:line-through; color:var(--muted); }
#ml-rand{ display:none; }
@media(min-width:900px){
 body.ml-an.sb-fest #ml-rand{ display:flex; position:fixed; top:16px; bottom:16px; left:var(--sb-leiste-links,10px); width:72px; z-index:590; flex-direction:column; align-items:center; justify-content:space-between; pointer-events:none; }
 #ml-rand .ml-marke{ width:64px; height:48px; padding:5px; border:0; background:transparent; cursor:pointer; pointer-events:auto; }
 #ml-rand .ml-marke img{ display:block; width:100%; height:100%; object-fit:contain; }
 #ml-konto{ display:flex; flex-direction:column; align-items:center; gap:10px; pointer-events:auto; }
 #ml-konto .ml-kontoplatz{ display:grid; place-items:center; position:relative; width:64px; height:64px; padding:2px; border:0; border-radius:50%; background:transparent; cursor:pointer; color:var(--ink); transition:transform .18s ease; }
 #ml-konto .ml-kontoplatz::before{ content:""; position:absolute; inset:0; border:2px solid var(--flaeche-akzent,var(--brand)); border-radius:50%; opacity:0; transform:scale(.8); transition:opacity .18s ease,transform .18s ease; }
 #ml-konto .ml-kontoplatz.an::before{ opacity:1; transform:scale(1); }
 #ml-konto .ml-kontoplatz:hover{ transform:scale(1.04); }
 #ml-konto .ml-av{ display:grid; place-items:center; width:56px; height:56px; border-radius:50%; font-weight:700; font-size:18px; color:var(--on-brand); }
 #ml-rand button:focus-visible{ outline:2px solid var(--flaeche-akzent,var(--brand)); outline-offset:2px; }
 /* Die Zahl ungelesener Nachrichten oben rechts am Profilbild - seit
    v2.983.0 stehen Nachrichten am Rechner im Blatt „Alles". */
 #ml-konto .ml-zahl{ position:absolute; top:2px; right:2px; z-index:1; min-width:20px; height:20px;
   padding:0 5px; border-radius:10px; background:var(--bad); color:var(--on-brand);
   font-size:11px; font-weight:800; line-height:16px; text-align:center;
   border:2px solid var(--card); box-sizing:border-box; pointer-events:none; }
 #ml-konto .ml-zahl[hidden]{ display:none; }
 /* Mittig zwischen Logo (bis 64 px) und Profil (ab 100 % - 80 px); unten
    steht nur das Profil. */
 body.sb-fest.ml-an.has-sidebar #ml-leiste{ top:calc(50% - 8px); height:var(--ml-nav-hoch,400px); }
}
@media(prefers-reduced-motion:reduce){ #ml-konto .ml-kontoplatz,#ml-konto .ml-kontoplatz::before{ transition:none; } }

/* Zentrierte runde Auswahl (v2.924.17): keine Verschiebung nach außen.
   Das Glas bleibt eine einfache Kapsel, die Kontur weitet beide Kanten. */
#ml-leiste .ml-blase{ width:52px; height:52px; }
#ml-leiste .ml-blase > .ml-av{ width:52px; height:52px; }
#ml-leiste .ml-platz.an > svg,#ml-leiste .ml-platz.an > .ml-av{ transform:scale(.6); }
@media(max-width:899.98px){
 body.ml-an.has-sidebar #ml-leiste{ height:108px; }
 #ml-leiste .ml-glas{ top:28px; bottom:auto; height:60px; }
 #ml-leiste .ml-plaetze{ top:28px; bottom:auto; height:60px; }
 #ml-leiste .ml-name{ top:calc(50% + 34px); bottom:auto; line-height:12px; }
}
@media(min-width:900px){
 body.sb-fest.ml-an.has-sidebar #ml-leiste{ width:72px; }
 body.sb-fest #ml-leiste .ml-glas{ left:6px; background:linear-gradient(90deg, var(--glas-licht), transparent 32%, transparent 68%, var(--glas-licht)); }
 body.sb-fest #ml-leiste .ml-form{ left:-14px; height:108px; transform:rotate(90deg) translateY(-108px); }
 body.sb-fest #ml-leiste .ml-platz{ padding-left:0; align-items:center; }
 body.sb-fest #ml-leiste .ml-name{ left:36px; top:calc(50% + 32px); line-height:10px; }
 body.sb-fest #ml-leiste .ml-platz.an > svg,body.sb-fest #ml-leiste .ml-platz.an > .ml-av{ transform:scale(.6); }
}

/* ===== VORSCHAU BEIM ZEIGEN (v3.4.2) =================================
   Sanft, Phosphor Duotone (Murat 13.10.2026): Licht und Schatten folgen
   der Kontur des Icons. Hover vergrößert das Zeichen, ohne Hintergrundkreis
   oder zweite Wölbung. Nur der Klick setzt den bestehenden Tropfen.
   Die SVGs benutzen ein gemeinsames selbst gehostetes Sprite (ssMenueIcon).
   Keine neuen Flächen/Filter hinter dem Icon, keine Daueranimation. */
#ml-leiste{
  --ml-icon-ton:color-mix(in srgb,var(--ink) 82%,var(--card));
  --ml-icon-schatten:drop-shadow(.6px 1.3px 1.1px color-mix(in srgb,var(--ink) 20%,transparent)) drop-shadow(-.6px -.6px .5px color-mix(in srgb,var(--card) 85%,transparent));
}
#ml-leiste :is(.ml-platz,.ml-blase) > .ss-menue-icon,
#app-sidebar .ss-menue-icon,#main-nav .ss-menue-icon{ fill:currentColor; stroke:none; }
#ml-leiste .ml-platz:not(.an) > .ss-menue-icon{ color:var(--ml-icon-ton); filter:var(--ml-icon-schatten); }
#ml-leiste .ml-blase > .ss-menue-icon{ filter:drop-shadow(0 1px 1px color-mix(in srgb,var(--ink) 18%,transparent)); }
html:not([data-theme="dark"]) body.ck-hg-dunkel.ml-an #ml-leiste .ml-platz:not(.an) > .ss-menue-icon{ color:color-mix(in srgb,var(--card) 94%,transparent); }
@media(min-width:900px){
 body.sb-fest #ml-leiste .ml-platz::before{ content:none; display:none; }
 body.sb-fest #ml-leiste .ml-platz > svg,body.sb-fest #ml-leiste .ml-platz > .ml-av{ position:relative; }
 body.sb-fest #ml-leiste .ml-platz.vorschau{ color:var(--ink); }
 body.sb-fest #ml-leiste .ml-platz.vorschau .ml-name{ opacity:1; transform:translate(-50%, 0); }
 body.sb-fest #ml-leiste .ml-platz:not(.an) > svg{ transition:transform 180ms cubic-bezier(.2,.7,.3,1),filter 180ms ease,color 150ms ease; }
 body.sb-fest #ml-leiste .ml-platz.vorschau:not(.an) > .ss-menue-icon{ color:var(--ink); }
}
@media(min-width:900px) and (prefers-reduced-motion:reduce){
 body.sb-fest #ml-leiste .ml-platz:not(.an) > svg{ transition:none; }
}

/* Schnellbewertung: ein rollender Inhalt zwischen festem Kopf und Fuß. */
#bewgrid-modal{ padding:calc(12px + env(safe-area-inset-top,0px)) 12px calc(12px + env(safe-area-inset-bottom,0px)); }
#bewgrid-modal .modal-card{ display:flex; flex-direction:column; max-height:calc(var(--vh100,100dvh) - 24px - env(safe-area-inset-top,0px) - env(safe-area-inset-bottom,0px)); overflow:hidden; background:var(--card); }
#bewgrid-modal .modal-head{ flex:none; }
.bewgrid-inhalt{ min-height:0; overflow-y:auto; overscroll-behavior:contain; }
#bewgrid-list{ margin:8px 0; }
.bewgrid-aktionen{ display:flex; flex:none; gap:8px; align-items:center; flex-wrap:wrap; padding-top:12px; border-top:1px solid var(--line); }
.bewgrid-row{ display:flex; align-items:center; gap:8px; padding:10px 4px; border-bottom:1px solid var(--line); }
.bewgrid-person{ flex:1; min-width:0; font-size:14px; overflow-wrap:anywhere; }
.bewgrid-person > b{ display:block; font-weight:600; }
.bewgrid-fachnote{ display:block; margin-top:4px; color:var(--muted); font-size:12px; }
.bewgrid-noten{ display:flex; gap:4px; flex:none; }
.bewgrid-noten button{ flex:none; width:34px; height:34px; border-radius:8px; }
.kb-fachnote{ display:inline-flex; gap:var(--s-1); align-items:baseline; flex-wrap:wrap; }
@media(max-width:899.98px){
 /* Nur schmal: dort verdeckte die untere Leiste die Knöpfe des Fensters
    (v2.924.17). Breit liegt die Leiste wie bei jedem Fenster unter dem
    Schleier – bis v3.14.0 verschwand sie auch dort (Murat: „bewertene
    basınca soldaki nav kayboluyor"). */
 body:has(#bewgrid-modal:not(.hidden)) #ml-leiste,body:has(#bewgrid-modal:not(.hidden)) #ml-rand{ visibility:hidden; pointer-events:none; }
 .kbx-table .kbx-cname,.kbx-table .kbx-nametxt{ white-space:normal; overflow-wrap:anywhere; }
 body.ml-an .kbx-table th:first-child{ width:auto !important; }
 .bewgrid-row{ flex-wrap:wrap; gap:10px; padding:12px 2px; }
 .bewgrid-person{ flex-basis:100%; }
 .bewgrid-noten{ width:100%; }
 .bewgrid-noten button{ flex:1; width:auto; height:42px; }
 #bewgrid-count{ flex-basis:100% !important; }
 .bewgrid-aktionen .btn{ flex:1; }
}

/* Cockpit: freie Höhe gleichmäßig ober- und unterhalb des Inhalts.
   Auto-Ränder werden bei Überhöhe null: der Anfang bleibt erreichbar. */
@media(min-width:900px){
 body.ml-an.has-sidebar[data-screen="cockpit"]:not(.lh-fullscreen) #cockpit-content{ padding-top:0; }
 body.ml-an.has-sidebar[data-screen="cockpit"]:not(.lh-fullscreen) #cockpit-fit{
   flex:0 0 auto; margin-block:auto; padding-top:var(--pl-unten);
 }
 /* UNTEN SO VIEL LUFT WIE OBEN (v3.13.1, Befund Murat 15.10.2026: „üst
    taraftaki boşluk ile alttaki boşluk farklı … alta doğru uzatsak"): auf
    der Fläche lagen unter dem Schnellzugriff noch 20 px Rand des Launchers
    und 12 px Polster ZUSÄTZLICH zu --pl-unten – unten 68 px, oben 36 px.
    Beide fallen auf der Fläche weg; ckFitScale misst den Schnellzugriff
    und gibt die 32 px der Fläche. In der Liste (sie rollt) bleiben sie. */
 #cockpit-content.ck5-fest > #cockpit-fit > .ck2-quick{ padding-bottom:0; }
 #cockpit-content.ck5-fest #cockpit-launcher{ margin-bottom:0; }
}

/* Sterne eines Tages als Liste (v2.926.0, kalSterneDetail). Das Fenster legt
   sich ans angetippte Bündel (kalAmAnkerLegen) - deshalb ein heller Grund
   statt der dunklen Abdeckung eines mittigen Dialogs. */
.modal-overlay.kal-stern-ov{background:transparent;}
.kal-stern-karte{width:320px;max-width:calc(100vw - 16px);max-height:70vh;overflow:auto;
  box-shadow:0 2px 8px rgba(0,0,0,.08),0 24px 60px rgba(0,0,0,.20);}
.kal-stern-zeile{display:flex;align-items:center;justify-content:space-between;gap:12px;
  padding:8px 2px;border-top:1px solid var(--line);font-size:14px;}
.kal-stern-zeile:first-child{border-top:0;}
.kal-stern-name{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}

/* SchlauHeft: ruhiger Kopf, Datum und Navigation beim Inhalt. */
body.kal-titel-aus #kal-tb{flex:0 0 auto;order:0;}
body.kal-titel-aus #kal-tb .kal-datum{display:none;}
body.kal-titel-aus .app-topbar .kal-bar-oben{flex:1 1 auto;width:auto;margin:0 0 0 12px;}
body.kal-titel-aus .kal-topbar{justify-content:center;}
body.kal-titel-aus .kal-mitte{position:static;transform:none;}
body.kal-titel-aus #kal-btn-planung{position:absolute;right:0;}
body.kal-titel-aus #kal-tb{position:relative;padding-right:110px;}
body.kal-titel-aus #kal-btn-anpassen{order:-1;}
body.kal-titel-aus #kal-bar .kal-seg.kal-views{display:flex;gap:2px;padding:3px;border-radius:18px;background:var(--paper);}
body.kal-titel-aus #kal-bar .kal-views-wahl{display:none;}
body.kal-titel-aus #kal-bar .kal-seg.kal-views button{display:block;padding:6px 14px;border-radius:15px;background:transparent;color:var(--muted);transition:background-color .18s ease,color .18s ease,box-shadow .18s ease;}
body.kal-titel-aus #kal-bar .kal-seg.kal-views button.on{color:var(--ink);background:var(--card);box-shadow:0 1px 4px color-mix(in srgb, var(--ink) 5%, transparent);}
#screen-kalender .kal-links{display:flex;flex-direction:column;min-height:0;}
.kal-datumfeld{display:flex;justify-content:space-between;align-items:center;gap:18px;padding:12px 16px 16px;flex:none;}
.kal-datumtext{font-family:"Chalkboard SE","Segoe Print","Comic Sans MS",cursive;display:flex;flex-direction:column;gap:3px;color:var(--muted);}
.kal-datumtext strong{font-size:24px;font-weight:500;color:var(--ink);line-height:1.1;}
.kal-datumfeld-tag .kal-datumtext strong{font-size:76px;font-weight:400;letter-spacing:-3px;transform:rotate(-3deg);transform-origin:left bottom;color:var(--brand);}
.kal-datumtext span{font-size:13px;}.kal-datumtext small{font-size:12px;}
.kal-minibereich{flex:0 0 auto;}.kal-mini{width:168px;}
.kal-miniwoche,.kal-minitage{display:grid;grid-template-columns:repeat(7,1fr);text-align:center;}
.kal-miniwoche{font-size:9px;color:var(--muted);margin-bottom:4px;}
.kal-minitage button{border:0;background:transparent;color:var(--ink);font-family:inherit;font-size:10px;width:23px;height:23px;border-radius:7px;cursor:pointer;transition:background-color .18s,color .18s;}
.kal-minitage button.nebenmonat{opacity:.4;}.kal-minitage button.wochenende,.kal-minitage button.feiertag{color:var(--bad);}
.kal-minitage button.heute{box-shadow:inset 0 0 0 1px var(--bad);border-radius:50%;}
.kal-minitage button:hover{background:var(--flaeche-akzent-soft,var(--brand-soft));}
.kal-minitage button.gewaehlt{position:relative;background:transparent;color:var(--bad);opacity:1;box-shadow:none;}
.kal-minitage button.gewaehlt::before{content:"";position:absolute;inset:1px -1px 0;border:1.7px solid var(--bad);border-radius:48% 54% 43% 57% / 55% 42% 58% 46%;transform:rotate(-12deg);pointer-events:none;}
.kal-minitage button.gewaehlt::after{content:"";position:absolute;inset:0 0 1px -1px;border:1px solid var(--bad);border-right-color:transparent;border-bottom-color:transparent;border-radius:53% 46% 55% 44%;transform:rotate(9deg);opacity:.5;pointer-events:none;}
#kal-host .kal-freier-tag .fc-daygrid-day-number,#kal-host .kal-freier-tag .fc-col-header-cell-cushion{color:var(--bad);}
.kal-miniwoche span:nth-last-child(-n+2){color:var(--bad);}
.kal-blattern{display:flex;justify-content:center;gap:12px;margin-top:9px;align-items:center;}
.kal-blattern button{border:1px solid var(--line);background:transparent;color:var(--muted);border-radius:50%;min-width:30px;height:30px;font-size:20px;cursor:pointer;transition:background-color .18s,color .18s;}
.kal-blattern button:hover{background:var(--paper);color:var(--ink);}.kal-blattern .kal-zumheute{border:0;font-size:11px;border-radius:8px;}
#screen-kalender .fc{--fc-border-color:var(--line);--fc-today-bg-color:var(--flaeche-akzent-soft,var(--brand-soft));}
#screen-kalender .fc-listDay-view .fc-list-day{display:none;}
@media(max-width:640px){
 body.kal-titel-aus .app-topbar .kal-bar-oben{margin:0;flex:1;}
 body.kal-titel-aus #kal-tb{flex:0 0 auto!important;padding-right:0;}
 body.kal-titel-aus #kal-btn-planung .kal-wort{display:none;}
 body.kal-titel-aus #kal-btn-planung{position:static;}
 body.kal-titel-aus #kal-bar .kal-seg.kal-views button{padding:5px 7px;font-size:11px;}
 .kal-datumfeld{padding:6px 8px;gap:8px;}.kal-datumfeld-tag .kal-datumtext strong{font-size:46px;}
 .kal-mini{width:140px;}.kal-minitage button{width:20px;height:19px;}
 body.uh-schmaltag #screen-kalender .kal-links{flex:0 0 300px;}
}
@media(prefers-reduced-motion:reduce){.kal-datumfeld button,body.kal-titel-aus #kal-bar .kal-seg.kal-views button{transition:none;}}
body.kal-titel-aus #kal-tb{padding-right:0;}
body.kal-titel-aus #kal-btn-planung{position:static;margin-left:auto;}
body.kal-titel-aus .kal-topbar{width:100%;}
body.kal-titel-aus .kal-mitte{margin-left:auto;}
#kh-leer:not(.hidden){flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;padding:18px 20px;color:var(--muted);}
#kh-leer h3{font-size:16px;color:var(--ink);font-weight:600;margin:8px 0 2px;}
#kh-leer p{max-width:330px;line-height:1.5;font-size:12px;margin:5px 0;}
#kh-leer small{max-width:330px;font-size:11px;line-height:1.5;}
.kh-startsymbol{color:var(--brand);background:none;padding:0;border-radius:0;}
.kh-startsymbol svg{width:30px;height:30px;fill:none;stroke:currentColor;stroke-width:1.5;}

/* Planung und Heftaktionen bilden im Tag eine einzige ruhige Werkzeugzeile. */
#kh-pano .kh-akt-rechts{gap:5px;}
#kh-pano #kal-btn-planung{display:inline-flex;align-items:center;gap:6px;color:var(--muted);font-size:12px;font-weight:500;height:32px;margin:0 7px 0 0;padding:0 10px 0 0;border-right:1px solid var(--line);border-radius:0;}
#kh-pano #kal-btn-planung svg{width:17px;height:17px;}
#kh-pano .kh-ib{transition:color .18s ease,background-color .18s ease;}
@media(max-width:640px){#kh-pano #kal-btn-planung .kal-wort{display:none;}#kh-pano .kh-akt-rechts{gap:2px;}}
@media(prefers-reduced-motion:reduce){#kh-pano .kh-ib{transition:none;}}

/* Zentrierte Ansichtsgruppe: Zahnrad und fuenf Ansichten bleiben zusammen. */
body.kal-titel-aus .app-topbar{flex-wrap:wrap;}
body.kal-titel-aus .app-topbar #kal-tb{display:none;}
body.kal-titel-aus .app-topbar #kal-bar.kal-bar-oben{flex:1 0 100%;width:100%;margin:0;padding:0 0 12px;}
body.kal-titel-aus #kal-bar .kal-topbar{position:relative;display:flex;justify-content:center;width:100%;}
body.kal-titel-aus #kal-bar .kal-mitte{position:relative;left:auto;transform:none;margin:0 auto;display:flex;gap:5px;width:min(420px,100%);padding:4px 7px;border:1px solid var(--line);border-radius:24px;background:var(--paper);box-shadow:0 2px 7px color-mix(in srgb, var(--ink) 4%, transparent);box-sizing:border-box;}
body.kal-titel-aus #kal-bar #kal-btn-anpassen{position:relative;flex:0 0 32px;width:32px;height:32px;padding:5px;order:0;}
body.kal-titel-aus #kal-bar #kal-btn-anpassen svg{width:19px;height:19px;}
body.kal-titel-aus #kal-bar .kal-seg.kal-views{position:relative;flex:1;min-width:0;display:flex;gap:0;padding:4px;background:none;border:0;box-shadow:none;}
body.kal-titel-aus #kal-bar .kal-seg.kal-views::before{content:"";position:absolute;left:4px;top:4px;bottom:4px;width:calc((100% - 8px)/var(--kal-zahl,5));border-radius:17px;background:var(--card);box-shadow:0 1px 5px color-mix(in srgb, var(--ink) 7%, transparent);transform:translateX(calc(var(--kal-wahl,0)*100%));transition:transform .28s cubic-bezier(.22,.8,.28,1),opacity .15s ease;pointer-events:none;}
/* Im Monat ist keine der Ansichten am Datum gewaehlt (v3.7.0; Jahr seit v3.10.0 am Datum). */
body.kal-titel-aus #kal-bar .kal-seg.kal-views.kal-ohne::before{opacity:0;}
body.kal-titel-aus #kal-bar .kal-seg.kal-views button{position:relative;z-index:1;flex:1;min-width:0;padding:5px 6px;font-size:12px;background:transparent;border:0;box-shadow:none;}
body.kal-titel-aus #kal-bar .kal-seg.kal-views button.on{background:transparent;box-shadow:none;color:var(--flaeche-akzent-ink,var(--brand));}
body.kal-titel-aus #kal-bar .kal-topbar > #kal-btn-planung{position:absolute;right:0;margin:0;}
@media(max-width:640px){
 body.kal-titel-aus .app-topbar #kal-bar.kal-bar-oben{padding-bottom:12px;}
 body.kal-titel-aus #kal-bar .kal-mitte{width:min(360px,100%);gap:2px;padding:3px 5px;}
 body.kal-titel-aus #kal-bar .kal-seg.kal-views button{font-size:11px;padding:5px 2px;}
}
@media(prefers-reduced-motion:reduce){body.kal-titel-aus #kal-bar .kal-seg.kal-views::before{transition:none;}}

/* Das Kalenderdatum steht auf derselben vertikalen Mitte wie der Minimonat. */
.kal-datumfeld-tag .kal-datumtext{align-self:stretch;justify-content:center;}
@media(max-width:640px){body.kal-titel-aus #kal-bar .kal-topbar:has(> #kal-btn-planung){padding:0 36px;box-sizing:border-box;}}

/* ===== DATEIEN, KLASSENBERICHT-ANHANG, STUNDENHERKUNFT (v2.927.0–v2.928.0) ====
   Stand bis v2.928.2 HINTER dem Escape-Block am Dateiende und machte
   qa/unit/test_escape_modus.py rot; in v2.928.3 unveraendert hierher
   geholt (dazwischen liegen nur body.has-escape-Regeln, die Kaskade
   bleibt dieselbe). */
/* Dateien: Ordnerbaum und Inhalt, mit denselben Tokens wie die Sammlung. */
/* Die Sammlung bleibt stehen; Baum, Liste und Vorschau rollen getrennt. */
body.has-sidebar:not(.lh-fullscreen) .wrap > section#screen-materialien{display:flex;flex-direction:column;overflow:hidden;padding-bottom:0;}
@media(max-width:899.98px){body.ml-an.has-sidebar:not(.lh-fullscreen) .wrap > section#screen-materialien{padding-bottom:calc(104px + env(safe-area-inset-bottom,0px));}}
#screen-materialien > .card:has(.da-workspace){padding:0;overflow:hidden;display:flex;flex:1;min-height:0;margin:0;}
#materialien-content{flex:1;min-width:0;min-height:0;display:flex;flex-direction:column;}
.da-workspace{display:grid;grid-template-columns:260px minmax(0,1fr);flex:1;min-height:0;overflow:hidden;color:var(--ink);}
.da-workspace button,.da-workspace input,.da-dialog button,.da-dialog input,.da-dialog select{font-family:inherit;}
.da-sidebar{box-sizing:border-box;display:flex;flex-direction:column;padding:12px 12px 8px;border-right:1px solid var(--line);background:transparent;min-width:0;min-height:0;overflow:hidden;}
.da-side-title{display:flex;align-items:center;justify-content:space-between;font-size:16px;font-weight:750;padding:0 12px 18px;}
.da-button{display:inline-flex;align-items:center;justify-content:center;gap:7px;padding:9px 12px;background:none;border:1px solid transparent;border-radius:var(--r-sm,10px);color:var(--ink);font-size:13px;font-weight:600;cursor:pointer;text-decoration:none;white-space:nowrap;}
.da-button:hover{background:var(--paper);}
.da-button svg{width:17px;height:17px;flex:none;}
.da-button:focus-visible,.da-tree-name:focus-visible,.da-tree-file:focus-visible,.da-expand:focus-visible,.da-row-open:focus-visible,.da-avatar-stack:focus-visible{outline:2px solid var(--flaeche-akzent,var(--brand));outline-offset:2px;}
.da-section{justify-content:flex-start;width:100%;font-weight:700;margin:4px 0;}
.da-section svg{color:var(--muted);}
.da-section.is-active,.da-tree-row.is-active,.da-tree-file.is-active{background:var(--flaeche-akzent-soft,var(--brand-soft));color:var(--flaeche-akzent,var(--brand));}
.da-tree,.da-tree ul{list-style:none;padding:0;margin:0;}
.da-tree>li{margin:2px 0;}
.da-tree ul{padding-left:16px;}
.da-tree-row{display:flex;align-items:center;min-height:38px;border-radius:var(--r-sm,10px);}
.da-tree-row:hover{background:var(--card);}
.da-tree-row.is-active:hover{background:var(--flaeche-akzent-soft,var(--brand-soft));}
.da-expand,.da-expand-spacer{flex:none;width:22px;height:30px;}
.da-expand{display:flex;align-items:center;justify-content:center;border:0;background:none;color:var(--muted);cursor:pointer;padding:0;}
.da-expand svg{width:14px;height:14px;}
.da-tree-name,.da-tree-file{display:flex;align-items:center;gap:8px;min-width:0;flex:1;border:0;background:none;color:inherit;text-align:left;padding:8px 0;font-size:13px;cursor:pointer;}
.da-tree-name span,.da-tree-file span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.da-tree-name svg,.da-tree-file svg{width:16px;height:16px;flex:none;color:var(--muted);}
.da-tree-row.is-active .da-tree-name svg{color:var(--flaeche-akzent,var(--brand));}
.da-tree-file{width:100%;padding:9px 6px 9px 23px;border-radius:var(--r-sm,10px);font-size:12px;}
.da-tree-file:hover{background:var(--card);}
.da-icon-only{font-size:0;padding:7px;flex:none;}
.da-row-menu{opacity:0;}
.da-tree-row:hover .da-row-menu,.da-tree-row:focus-within .da-row-menu{opacity:1;}
.da-nav-scroll{overflow:auto;min-height:0;flex:1;overscroll-behavior:contain;}
.da-side-bottom{flex:none;margin-top:auto;padding-top:14px;display:flex;flex-direction:column;align-items:flex-start;gap:4px;}
.da-side-bottom .da-button{width:100%;justify-content:flex-start;color:var(--muted);}
.da-content{display:flex;flex-direction:column;min-width:0;min-height:0;overflow:hidden;padding:12px 0 0 22px;}
.da-list-scroll{flex:1;min-height:0;overflow:auto;overscroll-behavior:contain;}
.da-breadcrumb{display:flex;gap:5px;align-items:center;flex-wrap:nowrap;overflow-x:auto;scrollbar-width:none;white-space:nowrap;color:var(--muted);font-size:12px;margin-top:5px;margin-bottom:0;}
.da-breadcrumb .da-button{font-size:12px;color:var(--muted);padding:3px 5px;font-weight:500;}
.da-heading{display:flex;justify-content:space-between;gap:20px;align-items:center;margin-bottom:12px;flex:none;}
.da-heading-title{min-width:0;flex:1;}
.da-heading h2{font-size:25px;line-height:1.3;letter-spacing:-.5px;margin:0;font-weight:750;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.da-heading p{margin:7px 0 0;font-size:13px;color:var(--muted);}
.da-sharing{display:flex;gap:7px;align-items:center;flex:none;}
.da-avatar-stack{display:flex;align-items:center;border:0;background:none;padding:4px;cursor:pointer;}
.da-avatar{display:flex;align-items:center;justify-content:center;width:31px;height:31px;flex:none;border-radius:50%;background:var(--flaeche-akzent-soft,var(--brand-soft));border:2px solid var(--card);color:var(--flaeche-akzent,var(--brand));font-size:10px;font-weight:750;overflow:hidden;}
.da-avatar-stack .da-avatar+.da-avatar{margin-left:-8px;}
.da-avatar img{width:100%;height:100%;object-fit:cover;}
.da-toolbar{display:flex;gap:16px;align-items:center;justify-content:space-between;padding-bottom:20px;}
.da-toolbar-actions{display:flex;align-items:center;gap:6px;flex-wrap:wrap;justify-content:flex-end;}
.da-primary{background:var(--flaeche-akzent,var(--brand));color:var(--on-brand,var(--card));}
.da-primary:hover{background:var(--flaeche-akzent,var(--brand));filter:brightness(.96);}
.da-search{display:flex;gap:9px;align-items:center;min-width:140px;max-width:320px;flex:1;color:var(--muted);border:1px solid var(--line);border-radius:var(--r-sm,10px);padding:9px 12px;}
.da-search:focus-within{border-color:var(--flaeche-akzent,var(--brand));}
.da-search svg{width:17px;height:17px;flex:none;}
.da-search input{min-width:0;width:100%;border:0;background:none;color:var(--ink);outline:none;font-size:13px;padding:0;}
.da-list-head,.da-row{display:grid;grid-template-columns:minmax(0,1fr) 80px 34px;gap:16px;align-items:center;}
.da-list-head{font-size:11px;color:var(--muted);padding:10px 12px;border-bottom:1px solid var(--line);}
.da-row{padding:7px 12px;min-height:60px;border-bottom:1px solid var(--line);}
.da-row:hover,.da-row.is-selected{background:var(--paper);}
.da-row-open{display:flex;align-items:center;gap:14px;text-align:left;border:0;background:none;min-width:0;width:100%;color:var(--ink);cursor:pointer;padding:7px 0;}
.da-row-open>svg{width:23px;height:23px;flex:none;color:var(--muted);}
.da-folder-row .da-row-open>svg{color:var(--flaeche-akzent,var(--brand));}
.da-row-open>span{min-width:0;}
.da-row strong,.da-trash-row strong{font-size:13px;font-weight:600;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.da-row small,.da-trash-row small{display:block;margin-top:4px;color:var(--muted);font-size:11px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.da-type{font-size:11px;color:var(--muted);}
.da-file-cell{display:flex;align-items:center;gap:12px;min-width:0;}
.da-file-cell input{accent-color:var(--flaeche-akzent,var(--brand));width:14px;height:14px;margin:0;flex:none;}
.da-drop-hint{font-size:11px;color:var(--muted);margin:20px 12px;}
.da-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;min-height:290px;padding:32px;color:var(--muted);}
.da-empty>svg{width:42px;height:42px;margin-bottom:16px;opacity:.6;}
.da-empty h3{font-size:16px;color:var(--ink);margin:0 0 8px;}
.da-empty p{font-size:13px;line-height:1.6;max-width:340px;margin:0 0 18px;}
.da-preview-bar{display:flex;align-items:center;gap:12px;flex:none;min-height:42px;flex-wrap:wrap;}
.da-preview-bar strong{flex:1;min-width:100px;font-size:13px;overflow-wrap:anywhere;}
.da-preview{background:var(--paper);border:1px solid var(--line);border-radius:var(--r-sm,10px);overflow:hidden;min-height:0;flex:1;display:flex;flex-direction:column;}
.da-preview>.da-empty{flex:1;min-height:0;overflow:auto;overscroll-behavior:contain;}
.da-pdf{display:block;width:100%;height:calc(100dvh - 360px);min-height:440px;border:0;}
.da-image-scroll{flex:1;min-height:0;overflow:auto;overscroll-behavior:contain;}
.da-image{display:block;max-width:100%;object-fit:contain;margin:auto;}
.da-status{font-size:12px;color:var(--muted);line-height:1.6;overflow-wrap:anywhere;margin-top:0;flex:none;}
.da-status:not(:empty){padding:6px 0;}
.da-status.is-error,.da-modal-status{color:var(--bad);}
.da-selection{display:flex;align-items:center;gap:10px;padding:8px 12px;background:var(--flaeche-akzent-soft,var(--brand-soft));border-radius:var(--r-sm,10px);font-size:12px;flex-wrap:wrap;}
.da-drop-target{outline:2px solid var(--flaeche-akzent,var(--brand));outline-offset:-2px;background:var(--flaeche-akzent-soft,var(--brand-soft));}
.da-mobile-only{display:none;}
.da-dialog{max-width:500px;width:min(500px,calc(100vw - 32px));max-height:85dvh;overflow:auto;}
.da-dialog-head{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:16px;}
.da-dialog-head h3{margin:0;}
.da-dialog label{display:block;font-size:12px;font-weight:600;margin-bottom:8px;}
.da-dialog input,.da-dialog select{width:100%;padding:10px 12px;border:1px solid var(--line);border-radius:var(--r-sm,10px);background:var(--card);color:var(--ink);font-size:13px;box-sizing:border-box;}
.da-share-description{font-size:12px;color:var(--muted);line-height:1.6;margin:0 0 18px;}
.da-member{display:flex;align-items:center;gap:12px;padding:12px 0;border-bottom:1px solid var(--line);font-size:13px;}
.da-member>span:nth-child(2){flex:1;min-width:0;}
.da-member small{display:block;color:var(--muted);font-size:11px;margin-top:3px;}
.da-member select{width:145px;flex:none;padding:7px;font-size:12px;}
.da-share-add{margin-top:24px;}
.da-share-add-row{display:flex;gap:10px;margin-top:10px;}
.da-share-add-row select{flex:1;}
.da-modal-status{font-size:12px;line-height:1.5;}
.da-trash-row{display:flex;align-items:center;gap:14px;padding:16px 0;border-bottom:1px solid var(--line);}
.da-trash-row>svg{width:22px;height:22px;color:var(--muted);flex:none;}
.da-trash-row>div:nth-child(2){flex:1;min-width:0;}
.da-trash-actions{display:flex;gap:6px;}
.da-loading{text-align:center;color:var(--muted);padding:40px;}
@media(hover:none){.da-row-menu{opacity:1;}}
@media(max-width:1100px){.da-workspace{grid-template-columns:220px minmax(0,1fr);}.da-content{padding:12px 0 0 16px;}.da-toolbar{align-items:stretch;flex-direction:column;}.da-search{max-width:none;}.da-toolbar-actions{justify-content:flex-start;}.da-heading{align-items:center;}}
@media(max-width:700px){
  .da-workspace{display:flex;flex-direction:column;min-height:0;}
  .da-sidebar{display:none;flex:1;min-height:0;border-right:0;}
  .da-show-tree .da-sidebar{box-sizing:border-box;display:flex;}.da-show-tree .da-content{display:none;}
  .da-mobile-only{display:inline-flex;}.da-content{flex:1;padding:8px 0 0;}.da-heading{margin-bottom:8px;gap:8px;}
  .da-heading{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:4px 8px;}
  .da-heading-title{display:contents;}
  .da-heading h2{grid-column:1;grid-row:1;font-size:20px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
  .da-sharing{grid-column:2;grid-row:1;gap:2px;}
  .da-sharing .da-button{font-size:0;padding:6px;}
  .da-sharing .da-avatar{width:24px;height:24px;font-size:8px;}
  .da-sharing .da-avatar+.da-avatar{margin-left:-10px;}
  .da-breadcrumb{grid-column:1 / -1;grid-row:2;min-width:0;margin:0;flex-wrap:nowrap;overflow-x:auto;scrollbar-width:none;white-space:nowrap;}
  .da-breadcrumb>*{flex:none;}.da-breadcrumb .da-mobile-only{font-size:0;padding:6px;}
  .da-heading-title>p{grid-column:1 / -1;margin:0;font-size:11px;}
  .da-toolbar-actions .da-button{font-size:12px;}
  .da-desktop-only{display:none;}
  .da-preview-bar{flex-wrap:nowrap;gap:4px;}.da-preview-bar .da-button{font-size:11px;padding:8px 4px;}
  .da-preview-bar strong{min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}

  .da-list-head,.da-row{grid-template-columns:minmax(0,1fr) 34px;gap:8px;}.da-type,.da-list-head>span:nth-child(2){display:none;}
  .da-row{padding:7px 4px;}.da-row-open{gap:10px;}.da-row strong{font-size:12px;}.da-drop-hint{margin:16px 0;}
  .da-empty{padding:24px 8px;}.da-preview{min-height:0;}
  .da-member{flex-wrap:wrap;}.da-member select{margin-left:43px;width:calc(100% - 43px);}.da-trash-row{flex-wrap:wrap;}.da-trash-actions{width:100%;justify-content:flex-end;}
}

.da-pdf-controls{display:flex;justify-content:space-between;align-items:center;gap:8px;padding:4px 8px;border-bottom:1px solid var(--line);background:var(--card);font-size:12px;color:var(--muted);flex:none;flex-wrap:wrap;}
.da-pdf-navigation,.da-preview-actions{display:flex;align-items:center;gap:8px;}
.da-preview-actions{margin-left:auto;}
.da-pdf-controls button:disabled{opacity:.35;cursor:default;}
.da-pdf-pages{padding:16px;flex:1;min-height:0;overflow:auto;overscroll-behavior:contain;text-align:center;}
.da-pdf-pages canvas{display:block;margin:auto;background:var(--card);max-width:100%;}
#da-pdf-error{font-size:13px;color:var(--muted);}
@media(max-width:700px){.da-pdf-controls{flex-wrap:nowrap;gap:4px;padding:4px;}.da-pdf-controls .da-button{font-size:0;padding:6px;}.da-pdf-navigation{gap:0;font-size:11px;white-space:nowrap;}.da-preview-actions{gap:2px;}.da-preview-bar strong{font-size:11px;}}

/* Themen bleiben an der Stunde; Verbindungen sind kombinierbare Tags. */
.kh-thema-edit{display:flex;flex-direction:column;gap:4px;margin-top:8px;min-width:0;}
.kh-thema-edit>span{font-size:12px;color:var(--muted);}
.kh-thema-edit input{width:100%;box-sizing:border-box;font:inherit;color:var(--ink);background:var(--card);border:1px solid var(--line);border-radius:8px;padding:8px 10px;}
.kh-herkunft{display:flex;flex-wrap:wrap;gap:5px;margin-top:8px;}
.kh-herkunft-tag{max-width:100%;overflow-wrap:anywhere;border:1px solid var(--line);background:var(--card);color:var(--ink);border-radius:16px;padding:4px 9px;font:inherit;font-size:11px;cursor:pointer;text-align:left;}
.kh-herkunft-tag:focus-visible,.kh-thema-edit input:focus-visible{outline:2px solid var(--brand);outline-offset:2px;}
.kbr-uv-wahl{display:flex;gap:var(--s-2);align-items:center;font-size:var(--fs-sm);cursor:pointer;}
.kbr-uv-hinweis{font-size:var(--fs-xs);color:var(--muted);line-height:1.5;}
.kbr-uv-fach{margin-top:var(--s-3);border-top:1px solid var(--line);padding-top:var(--s-3);}
.kbr-uv-fach summary{display:flex;flex-wrap:wrap;gap:var(--s-2);cursor:pointer;font-size:var(--fs-xs);color:var(--muted);}
.kbr-uv-stunde{display:flex;flex-direction:column;gap:var(--s-2);padding:var(--s-3) 0;border-bottom:1px solid var(--line);}
.kbr-uv-stunde textarea{min-height:64px;width:100%;box-sizing:border-box;resize:vertical;font:inherit;font-size:var(--fs-sm);padding:var(--s-2);border:1px solid var(--line);border-radius:var(--r-control);background:var(--card);color:var(--ink);}
.kbr-uv-stunde small{font-size:var(--fs-2xs);color:var(--muted);overflow-wrap:anywhere;}
.kh-stundenstatus{display:flex;align-items:center;gap:8px;margin-top:8px;font-size:12px;color:var(--muted);}
.kh-stundenstatus select{max-width:100%;font:inherit;padding:5px 8px;border:1px solid var(--line);border-radius:8px;background:var(--card);color:var(--ink);}
.kal-herkunft{display:flex;flex-wrap:wrap;gap:3px;margin-top:4px;}
.kal-herkunft .kh-herkunft-tag{font-size:10px;padding:2px 6px;}

/* Nutzung heute öffnet erst auf Wunsch die Tageskontingente. */
body.ml-an #ml-alles .ml-nutzung{background:linear-gradient(145deg,var(--brand-soft),var(--card));border-color:color-mix(in srgb,var(--brand) 24%,var(--line))}
body.ml-an #ml-alles .ml-nutzung>.ml-nutzung-kopf{gap:8px;margin:0;color:var(--ink);font-size:13px;justify-content:flex-start}
body.ml-an #ml-alles .ml-nutzung>.ml-nutzung-kopf>svg{flex:none;color:var(--brand)}
body.ml-an #ml-alles .ml-nutzung[open]>.ml-nutzung-kopf{margin-bottom:14px}
body.ml-an #ml-alles .ml-nutzung[open]>.ml-nutzung-kopf>svg{transform:rotate(180deg)}
body.ml-an #ml-alles #ml-nutzung-kurz{margin-left:auto;display:flex;align-items:center;gap:7px;white-space:nowrap;font-variant-numeric:tabular-nums;color:var(--brand)}
body.ml-an #ml-alles #ml-nutzung-kurz b{font-size:17px}
body.ml-an #ml-alles .ml-nutzung-grenze{font-size:17px;font-weight:650}

/* ==========================================================================
   DIE AUFGABE UND IHR LIVE-MODUS (v2.979.0, Anweisung Murat 07.10.2026)
   ==========================================================================
   Vorbild Kahoot. Bildschirm 1: links die Fragen (Reiter Aufgaben |
   Ergebnisse | Export), rechts EINE Einstellungsliste - offen, ohne Fenster,
   ohne Kasten im Kasten. Bildschirm 2 (#tl-live): das SPIEL fuellt den
   ganzen Schirm, die Beitrittskarte (QR, Link, Klasse, Start) sitzt klein in
   der Ecke („oyun tamamen tüm ekrani kaplicak, qr code … kücük olsun").
   Masse bewusst ZURUECKHALTEND (Murat: „hersey cok büyük ve yapay
   duruyor") - Linien statt Schatten, Text in der Groesse der App.
   Markup und WARUM: templates/index.html (#screen-share). Nur Woerterbuch-
   Werte; die Buehnenfarbe kommt aus dem Design der Aufgabe (inline). */
/* Nur diese Aufgabenansicht nutzt die gesamte verfügbare Breite. */
body[data-screen="share"] .wrap{ max-width:none; width:100%; box-sizing:border-box; }
#screen-share .tl-kopf{ display:flex; align-items:center; gap:var(--s-3);
  flex-wrap:wrap; margin:0 0 var(--s-4); }
#screen-share .tl-zurueck{ flex:0 0 44px; width:44px; height:44px; margin:0;
  display:flex; align-items:center; justify-content:center; border:0; background:transparent;
  color:var(--ink); cursor:pointer; padding:0; }
#screen-share .tl-zurueck svg{ width:26px; height:26px; stroke:currentColor; stroke-width:3;
  fill:none; stroke-linecap:round; stroke-linejoin:round; }
#screen-share .tl-kopf-text{ flex:1 1 360px; min-width:0; display:flex; align-items:center; gap:var(--s-3); flex-wrap:wrap; }
#screen-share .tl-titel{ margin:0; font-size:var(--fs-xl); font-weight:700;
  letter-spacing:-.02em; line-height:1.2; color:var(--ink); text-align:left; }
#screen-share .tl-meta{ display:flex; align-items:center; gap:var(--s-2); flex-wrap:wrap;
  margin:0; font-size:var(--fs-sm); color:var(--muted); font-weight:500; }
#screen-share .tl-bereit{ display:inline-flex; align-items:center; padding:2px 8px;
  border-radius:var(--r-pill); background:var(--ok-soft); color:var(--ok-ink);
  font-size:var(--fs-2xs); font-weight:700; }

/* Die Handlungen oben rechts: „Selbst testen" leise, „Live starten" klar. */
#screen-share .tl-aktionen{ display:flex; flex-direction:row; align-items:center; gap:var(--s-2);
  border:0; padding:0; flex-wrap:wrap; }
#screen-share .tl-nur-reiter{ display:none; }
#screen-share .tl-akt{ width:auto; min-width:0; height:38px; padding:0 var(--s-3) 0 6px;
  border:1px solid var(--line); background:var(--card); border-radius:var(--r-pill); gap:6px; }
#screen-share .tl-akt:hover{ border-color:var(--line-kraeftig); background:var(--card); }
#screen-share .tl-akt .qr-sat-dot{ width:26px; height:26px; box-shadow:none; border:0;
  background:var(--surface-subtle); color:var(--ink); }
#screen-share .tl-akt:hover .qr-sat-dot{ transform:none; }
#screen-share .tl-akt .qr-sat-dot svg{ width:13px; height:13px; }
#screen-share .tl-akt .qr-sat-lbl{ font-size:var(--fs-sm); font-weight:600; }
#screen-share .tl-live-knopf{ display:inline-flex; align-items:center; gap:var(--s-2);
  height:38px; padding:0 var(--s-4) 0 var(--s-3); border:0; border-radius:var(--r-pill);
  background:var(--brand); color:var(--on-brand); font:inherit; font-size:var(--fs-sm);
  font-weight:700; cursor:pointer; transition:background .15s ease; }
#screen-share .tl-live-knopf:hover{ background:var(--brand-dk); }
#screen-share .tl-live-knopf svg{ width:13px; height:13px; fill:currentColor; stroke:none; }

/* Die Flaeche: Fragen links, Einstellungen rechts und mitlaufend. */
#screen-share .tl-flaeche{ display:grid; grid-template-columns:minmax(0,1fr) minmax(280px,360px);
  gap:var(--s-5); align-items:start; }
#screen-share .tl-reiter{ display:flex; align-items:center; gap:2px;
  border-bottom:1px solid var(--line); margin-bottom:var(--s-4); }
#screen-share .tl-reiter [data-reiter]{ position:relative; border:0; background:none; cursor:pointer;
  font:inherit; font-size:var(--fs-sm); font-weight:600; color:var(--muted); padding:10px var(--s-3); }
#screen-share .tl-reiter [data-reiter] b{ margin-left:4px; font-size:var(--fs-2xs); font-weight:600; color:var(--muted); }
#screen-share .tl-reiter [data-reiter].an{ color:var(--ink); }
#screen-share .tl-reiter [data-reiter].an::after{ content:""; position:absolute; left:var(--s-3);
  right:var(--s-3); bottom:-1px; height:2px; background:var(--ink); }
#screen-share .tl-loesung-schalter{ margin-left:auto; display:flex; align-items:center; gap:6px;
  font-size:var(--fs-xs); font-weight:600; color:var(--muted); cursor:pointer; }

/* Die Fragen als Karten. */
#screen-share .tl-vorschau{ display:grid; grid-template-columns:repeat(auto-fill,minmax(280px,1fr)); gap:var(--s-3); }
#screen-share .tl-frage{ background:var(--card); border:1px solid var(--line); border-radius:var(--r-card);
  padding:var(--s-3) var(--s-4) var(--s-4); display:flex; flex-direction:column; gap:10px; min-width:0; }
#screen-share .tl-frage-kopf{ display:flex; align-items:center; gap:var(--s-2); }
#screen-share .tl-frage-nr{ font-size:var(--fs-xs); font-weight:700; color:var(--muted); font-variant-numeric:tabular-nums; }
#screen-share .tl-frage-typ{ font-size:var(--fs-2xs); font-weight:600; letter-spacing:.04em;
  text-transform:uppercase; color:var(--muted); }
#screen-share .tl-frage-afb{ margin-left:auto; font-size:var(--fs-3xs); font-weight:600; color:var(--muted); }
#screen-share .tl-frage-text{ font-size:var(--fs-sm); line-height:1.5; color:var(--ink); font-weight:500; overflow-wrap:anywhere; }
#screen-share .tl-luecke{ display:inline-block; width:48px; border-bottom:1.5px solid var(--muted); margin:0 3px; }
#screen-share .tl-optionen{ list-style:none; margin:0; padding:0; display:grid; grid-template-columns:1fr 1fr; gap:6px; }
#screen-share .tl-optionen li{ display:flex; align-items:flex-start; gap:6px; font-size:var(--fs-xs);
  line-height:1.4; color:var(--ink); border:1px solid var(--line); border-radius:var(--r-control);
  padding:6px 8px; overflow-wrap:anywhere; }
#screen-share .tl-optionen li > div{ flex:1; min-width:0; }
#screen-share .tl-optionen li > span{ flex:none; font-size:var(--fs-2xs); font-weight:700; color:var(--muted); line-height:1.6; }
#screen-share .tl-mit-loesung .tl-optionen li.richtig{ border-color:var(--ok); background:var(--ok-soft); }
#screen-share .tl-mit-loesung .tl-optionen li.richtig > span{ color:var(--ok-ink); }
#screen-share .tl-loesung{ display:none; font-size:var(--fs-xs); font-weight:600; color:var(--ok-ink);
  border-left:2px solid var(--ok); padding:2px 0 2px var(--s-2); }
#screen-share .tl-mit-loesung .tl-loesung{ display:block; }
#screen-share .tl-leer{ color:var(--muted); padding:var(--s-6) 0; text-align:center; font-size:var(--fs-sm); }
#screen-share .tl-video{ margin:0 0 var(--s-4); }

/* Ergebnisse und Export als Reiter: ohne eigene Karten und ohne Zurueck. */
body.tl-erg-im-reiter #tl-erg-ort #screen-results{ display:block; }
#tl-erg-ort #screen-results > .card{ background:none; border:0; box-shadow:none; padding:0; margin:0 0 var(--s-5); }
#tl-erg-ort .res-back{ display:none; }
#tl-erg-ort .res-topbar{ margin:0 0 var(--s-3); }
#screen-share .tl-export{ text-align:left; }

/* Die Einstellungen: EINE ruhige Liste, Zeilen durch Haarlinien getrennt. */
#screen-share .tl-einst{ position:sticky; top:var(--s-4); min-width:0; overflow:hidden;
  background:var(--card); border:1px solid var(--line); border-radius:var(--r-card); }
#screen-share .tl-einst-kopf{ display:flex; align-items:center; gap:var(--s-2); min-height:44px;
  padding:var(--s-3) var(--s-4); color:var(--ink); font-size:var(--fs-sm); font-weight:600; }
#screen-share .tl-einst-kopf svg{ width:20px; height:20px; fill:none; stroke:currentColor; stroke-width:2;
  stroke-linecap:round; stroke-linejoin:round; flex:none; }
#screen-share .tl-einst-inhalt{ display:block; }
#screen-share .tl-einst-scroll{ min-height:0; max-height:calc(100dvh - 156px); overflow:auto;
  overscroll-behavior:contain; scrollbar-gutter:stable; }
#screen-share #sat-reflexion:not(:has(#rf-an:checked)) #reflexion-panel,
#screen-share #sat-rennen:not(:has(#tl-rennen-an:checked)) #krnn-setup{ display:none; }
#screen-share .tl-zurueck:focus-visible,
#tl-live button:focus-visible{ outline:2px solid var(--brand); outline-offset:-2px; }
#screen-share .tl-abschnitt{ padding:var(--s-3) var(--s-4); border-top:1px solid var(--line); }
#screen-share .tl-abschnitt:first-child{ border-top:0; }
#screen-share .tl-abschnitt.tl-blitz{ animation:tlBlitz 1.6s ease; }
@keyframes tlBlitz{ 0%,60%{ background:var(--brand-soft); } 100%{ background:transparent; } }
#screen-share .tl-ab-kopf{ display:flex; align-items:center; gap:var(--s-2); min-height:26px; }
#screen-share .tl-ab-kopf + *{ margin-top:10px; }
#screen-share .tl-ab-name{ font-size:var(--fs-sm); font-weight:600; color:var(--ink); }
#screen-share .tl-ab-wert{ margin-left:auto; font-size:var(--fs-xs); font-weight:500; color:var(--muted);
  white-space:nowrap; overflow:hidden; text-overflow:ellipsis; max-width:60%; }
#screen-share .tl-schalter-zeile{ cursor:pointer; margin:0; font-weight:inherit; }
#screen-share .tl-ab-info{ font-size:var(--fs-xs); color:var(--muted); margin-top:6px; }
#screen-share .tl-ab-info:empty{ display:none; }
#screen-share .tl-mahnung{ color:var(--brand); font-weight:700; }
#screen-share .tl-status{ font-size:var(--fs-2xs); font-weight:600; }
#screen-share .tl-status:empty{ display:none; }
#screen-share .tl-status-ok{ color:var(--ok); }
#screen-share .tl-status-warn{ color:var(--bad-ink); }
#screen-share .tl-verdeckt{ display:none; }
#screen-share .bl-fuss{ margin-top:6px; }
#screen-share .tl-auto{ margin:0; padding:10px var(--s-4); font-size:var(--fs-2xs);
  color:var(--muted); border-top:1px solid var(--line); text-align:center; }

/* Der Schalter. */
.tl-schalter{ appearance:none; -webkit-appearance:none; flex:none; position:relative; width:34px; height:20px;
  margin:0; border-radius:var(--r-pill); background:var(--line-kraeftig); cursor:pointer;
  transition:background .18s ease; }
.tl-schalter::after{ content:""; position:absolute; top:2px; left:2px; width:16px; height:16px;
  border-radius:50%; background:var(--on-brand); box-shadow:0 1px 2px rgba(0,0,0,.2);
  transition:transform .18s ease; }
.tl-schalter:checked{ background:var(--ok); }
.tl-schalter:checked::after{ transform:translateX(14px); }
.tl-schalter:focus-visible{ outline:2px solid var(--brand); outline-offset:2px; }
.tl-schalter-klein{ width:28px; height:16px; }
.tl-schalter-klein::after{ width:12px; height:12px; }
.tl-schalter-klein:checked::after{ transform:translateX(12px); }

/* Die Klassen als Karten, mit dem Jahrgang als feinem Strich. */
#screen-share .tl-klassen-liste{ display:contents; }
#screen-share .tl-klassen{ display:grid; grid-template-columns:repeat(auto-fill,minmax(72px,1fr)); gap:6px; }
#screen-share .tl-klasse{ position:relative; display:flex; flex-direction:column; align-items:flex-start; gap:1px;
  padding:7px 9px 6px 12px; border:1px solid var(--line); border-radius:var(--r-control);
  background:var(--card); cursor:pointer; font:inherit; text-align:left; overflow:hidden;
  transition:border-color .15s ease, background .15s ease; }
#screen-share .tl-klasse::before{ content:""; position:absolute; left:0; top:0; bottom:0; width:3px;
  background:var(--kl, var(--line-kraeftig)); }
#screen-share .tl-klasse b{ font-size:var(--fs-sm); font-weight:700; color:var(--ink);
  max-width:100%; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
#screen-share .tl-klasse span{ font-size:var(--fs-3xs); color:var(--muted); font-weight:500; }
#screen-share .tl-klasse:hover{ border-color:var(--line-kraeftig); }
#screen-share .tl-klasse.an{ border-color:var(--kl, var(--brand)); background:var(--kl-soft, var(--brand-soft)); }
#screen-share .tl-klasse-neu{ border-style:dashed; flex-direction:row; align-items:center; gap:4px; padding-left:9px; }
#screen-share .tl-klasse-neu::before{ display:none; }
#screen-share .tl-klasse-neu b{ color:var(--muted); font-weight:600; }

/* Die Designs als kleine Bilder. */
#screen-share .tl-designs{ display:grid; grid-template-columns:repeat(auto-fill,minmax(54px,1fr)); gap:6px; }
#screen-share .tl-design{ display:flex; flex-direction:column; gap:3px; padding:0; border:0; background:none;
  cursor:pointer; font:inherit; }
#screen-share .tl-design-bild{ display:flex; align-items:center; justify-content:center; height:30px;
  border-radius:6px; border:1px solid var(--line); }
#screen-share .tl-design-bild i{ width:9px; height:9px; border-radius:3px; background:var(--punkt); }
#screen-share .tl-design-name{ font-size:var(--fs-3xs); font-weight:500; color:var(--muted); text-align:center;
  white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
#screen-share .tl-design.an .tl-design-bild{ box-shadow:0 0 0 1.5px var(--card), 0 0 0 3px var(--ink); }
#screen-share .tl-design.an .tl-design-name{ color:var(--ink); font-weight:700; }

/* Belohnungsspiel, Reflexion, Musik. */
#screen-share .tl-regler{ display:block; font-size:var(--fs-xs); color:var(--muted); font-weight:500; }
#screen-share .tl-regler-feld{ width:100%; margin:2px 0 0; accent-color:var(--brand); }
#screen-share .bl-spiele{ display:grid; grid-template-columns:repeat(auto-fill,minmax(140px,1fr)); gap:4px;
  margin-top:var(--s-2); max-height:220px; overflow:auto; }
#screen-share .tl-spiel{ display:flex; align-items:center; gap:6px; padding:4px 6px; border-radius:6px;
  font-size:var(--fs-xs); font-weight:500; color:var(--ink); cursor:pointer; min-width:0; }
#screen-share .tl-spiel:hover{ background:var(--surface-subtle); }
#screen-share .tl-spiel input{ width:14px; height:14px; margin:0; accent-color:var(--brand); flex:none; }
#screen-share .tl-spiel-name{ overflow:hidden; text-overflow:ellipsis; white-space:nowrap; min-width:0; }
#screen-share .tl-spiel-test{ margin-left:auto; color:var(--muted); font-size:var(--fs-3xs); text-decoration:none; }
#screen-share .tl-rf-methoden{ display:grid; grid-template-columns:1fr 1fr; gap:6px; }
#screen-share .tl-rf{ display:flex; flex-direction:column; gap:1px; text-align:left; padding:6px 9px;
  border:1px solid var(--line); border-radius:var(--r-control); background:var(--card); cursor:pointer; font:inherit; }
#screen-share .tl-rf b{ font-size:var(--fs-xs); font-weight:600; color:var(--ink); }
#screen-share .tl-rf span{ font-size:var(--fs-3xs); color:var(--muted); line-height:1.3; }
#screen-share .tl-rf.an{ border-color:var(--ink); }
#screen-share .tl-musik-wahl{ width:100%; font-size:var(--fs-sm); }
#screen-share .tl-einst .seg{ gap:4px; }
#screen-share .tl-einst .seg button{ height:28px; min-width:0; padding:0 10px; font-size:var(--fs-xs);
  font-weight:600; border-radius:var(--r-control); }
#screen-share .tl-einst select.input, #screen-share .tl-einst select{ height:32px; font-size:var(--fs-sm); padding:0 8px; }
#screen-share .tl-einst .krnn-label{ font-size:var(--fs-xs); font-weight:600; }
#screen-share .tl-einst .krnn-info{ font-size:var(--fs-2xs); color:var(--muted); line-height:1.4; }
#screen-share .tl-einst .krnn-schalter{ font-size:var(--fs-xs); }
#screen-share .tl-einst .krnn-thema{ padding:5px 4px; font-size:var(--fs-2xs); border-width:1px; }
#screen-share .tl-einst .krnn-thema.aktiv{ border-color:var(--ink); color:var(--ink); }
#screen-share .tl-einst .krnn-thema-story{ font-size:var(--fs-3xs); }
#screen-share .tl-einst .krnn-vorschau{ height:34px; }
#screen-share #krnn-setup{ font-size:var(--fs-sm); }
#screen-share #krnn-setup.tl-aus{ opacity:.45; pointer-events:none; }
#screen-share #krnn-setup .krnn-gitter{ grid-template-columns:repeat(auto-fill,minmax(84px,1fr)); }

/* --------------------------------------------------------------------------
   LIVE - DAS SPIEL FUELLT DEN SCHIRM
   -------------------------------------------------------------------------- */
body.tl-live-offen{ overflow:hidden; }
/* Die Glasleiste darf weder den Aufgabenkopf durchscheinen lassen noch
   die Bedienelemente dahinter für Tastatur/Vorlesegeräte offen halten. */
body.tl-live-offen #screen-share > :not(#tl-live){ visibility:hidden; }
#tl-live{ position:fixed; inset:0; z-index:3000; display:flex; flex-direction:column;
  color:var(--ink); overflow:hidden; }
#tl-live.hidden{ display:none; }
#tl-live.tl-dunkel{ color:var(--on-brand); }
#tl-live .tl-live-leiste{ position:absolute; inset:0 0 auto; z-index:10; display:flex; align-items:center;
  gap:var(--s-3); min-height:48px; padding:4px var(--s-3); box-sizing:border-box;
  background:rgba(8,12,24,.22); backdrop-filter:blur(8px); -webkit-backdrop-filter:blur(8px); color:var(--on-brand); }
#tl-live .tl-live-titel{ flex:1; text-align:center; font-size:var(--fs-sm); font-weight:600;
  overflow:hidden; text-overflow:ellipsis; white-space:nowrap; opacity:.9; }
#tl-live .tl-live-rechts{ display:flex; align-items:center; gap:2px; flex:none; }
#tl-live .tl-live-ic{ display:inline-flex; align-items:center; justify-content:center; width:36px; height:36px;
  border:0; border-radius:var(--r-control); background:transparent; color:inherit; cursor:pointer; }
#tl-live .tl-live-ic:hover{ background:rgba(255,255,255,.12); }
#tl-live .tl-live-ic svg, #tl-live .tl-live-zahl svg{ width:18px; height:18px; fill:none; stroke:currentColor;
  stroke-width:2; stroke-linecap:round; stroke-linejoin:round; }
#tl-live .tl-live-ic.aus{ opacity:.4; }
#tl-live .tl-live-zahl{ display:inline-flex; align-items:center; gap:5px; padding:0 var(--s-2);
  font-size:var(--fs-md); font-weight:700; font-variant-numeric:tabular-nums; }
#tl-live .tl-live-zahl b.hidden{ display:inline; }
#tl-live .tl-live-flaeche{ position:absolute; inset:0; min-height:0; overflow:hidden; }

/* Das Rennen: randlos ueber die ganze Flaeche. */
#tl-live .krnn-panel{ position:absolute; inset:0; margin:0; background:transparent; overflow:hidden; border-radius:0; }
#tl-live .krnn-panel.hidden{ display:none; }
#tl-live .krnn-body{ position:absolute; inset:0; padding:0; }
#tl-live #krnn-buehne{ position:absolute; inset:0; width:auto; height:auto; border:0; border-radius:0; }
#tl-live .krnn-kopf{ position:absolute; right:var(--s-3); bottom:var(--s-3); z-index:5; padding:0; cursor:default; }
#tl-live .krnn-titel, #tl-live #krnn-zu, #tl-live #krnn-gross{ display:none; }
#tl-live .krnn-ic{ background:rgba(255,255,255,.9); }
#tl-live .krnn-lobby{ position:absolute; left:50%; bottom:var(--s-3); transform:translateX(-50%); z-index:5;
  margin:0; padding:6px 10px; max-width:calc(100% - 140px); border-radius:var(--r-card);
  background:rgba(255,255,255,.92); color:hsl(222 30% 14%); font-size:var(--fs-xs); }
#tl-live .krnn-lobby-kinder, #tl-live .krnn-kinder{ display:none; }
#tl-live .krnn-lobby:has(.krnn-gruppen-lobby.hidden){ display:none; }
#tl-live .krnn-liste{ display:none; }
#tl-live .krnn-ergebnis{ position:absolute; top:var(--s-3); right:var(--s-3); z-index:5; max-height:70%;
  overflow:auto; background:rgba(255,255,255,.95); color:hsl(222 30% 14%); border-radius:var(--r-card); padding:var(--s-3); }
#tl-live .krnn-fehler{ position:absolute; top:var(--s-3); left:50%; transform:translateX(-50%); z-index:6; }
/* Die Gruppenzahl wurde bereits in den Einstellungen gewählt. */
#tl-live .krnn-lobby{ display:none; }
#tl-live.tl-rennt .tl-karte{ display:none; }
#tl-live.tl-rennt.tl-code-offen .tl-karte{ display:flex; }
#tl-live .tl-live-ic.hidden{ display:none; }

/* Zentriert über der Startlinie, ohne Kartenhintergrund. Die weiße
   Ruhezone gehört ausschließlich zum QR-Code und hält ihn scanbar. */
#tl-live .tl-karte{ position:absolute; top:42%; left:50%; transform:translate(-50%,-50%);
  z-index:6; display:flex; align-items:center; flex-direction:column; gap:var(--s-3);
  margin:0; padding:0; width:max-content; max-width:calc(100% - 32px); text-align:center;
  background:transparent; color:inherit; border:0; border-radius:0; box-shadow:none; overflow:visible; }
#tl-live .tl-karte::before{ display:none; }
#tl-live .qh-code{ order:-1; }
#tl-live .qh-frame{ padding:var(--s-2); background:var(--on-brand); border-radius:0; }
#tl-live .qh-frame img, #tl-live .qh-frame canvas{ width:clamp(200px,30dvh,360px) !important; height:auto !important;
  aspect-ratio:1; image-rendering:pixelated; }
#tl-live .tl-karte-text{ min-width:0; display:flex; flex-direction:column; align-items:center; gap:var(--s-2); }
#tl-live .tl-karte-klein{ font-size:var(--fs-2xs); font-weight:600; color:inherit;
  text-transform:uppercase; letter-spacing:.06em; }
#tl-live .tl-karte-link{ font-size:clamp(15px,1.5vw,22px); font-weight:700; letter-spacing:-.01em; line-height:1.2;
  overflow-wrap:anywhere; }
#tl-live .tl-karte-klasse{ font-size:clamp(20px,2.2vw,32px); font-weight:800; line-height:1.1; }
#tl-live .tl-kopieren{ height:24px; padding:0 8px; margin:2px 0 var(--s-2); border-radius:var(--r-pill);
  background:hsl(220 20% 95%); border:0; color:hsl(222 30% 24%); box-shadow:none; font-size:var(--fs-3xs); gap:4px; }
#tl-live .tl-kopieren svg{ width:11px; height:11px; }
#tl-live .tl-live-los{ display:inline-flex; align-items:center; gap:var(--s-2); height:38px; padding:0 var(--s-4);
  margin:0 var(--s-2) 0 0; border:0; border-radius:var(--r-pill); background:var(--ok); color:var(--on-brand); font:inherit;
  font-size:var(--fs-sm); font-weight:700; cursor:pointer; }
#tl-live .tl-live-los svg{ width:12px; height:12px; fill:currentColor; stroke:none; }
#tl-live .tl-live-los:disabled{ opacity:.5; cursor:default; }
#tl-live .tl-live-los.hidden{ display:none; }

/* Ohne Rennen gibt es kein Spiel - dann steht die Karte gross in der Mitte. */
#tl-live.tl-ohne-rennen .tl-live-flaeche{ display:flex; flex-direction:column; align-items:center; justify-content:center;
  gap:var(--s-4); padding:var(--s-5); }
#tl-live.tl-ohne-rennen .tl-karte{ position:static; transform:none; padding:0; gap:var(--s-3); }
#tl-live.tl-ohne-rennen .qh-frame img, #tl-live.tl-ohne-rennen .qh-frame canvas{ width:clamp(200px,30dvh,360px) !important; }
#tl-live .tl-live-ohne{ font-size:var(--fs-md); font-weight:600; opacity:.85; text-align:center; }
#tl-live #rfmon-panel{ position:absolute; right:var(--s-3); top:60px; z-index:6; width:min(420px,calc(100% - 24px));
  max-height:calc(100% - 24px); overflow:auto; margin:0; }
#tl-live.tl-ohne-rennen #rfmon-panel{ position:static; }
/* Der Live-Reflexion-Kasten traegt alte Inline-Werte (grauer Grund) - auf
   der Buehne ist er eine weisse Karte wie die Beitrittskarte. */
#tl-live #rfmon-panel{ background:rgba(255,255,255,.95) !important; color:hsl(222 30% 14%);
  border-radius:var(--r-card) !important; box-shadow:0 8px 30px rgba(0,0,0,.2); font-size:var(--fs-sm); }
#tl-live:fullscreen{ width:100vw; height:var(--vh100,100dvh); }

/* Tablet nebeneinander; am Telefon stehen Einstellungen vor den Aufgaben. */
@media (min-width:641px) and (max-width:1000px){
  #screen-share .tl-flaeche{ grid-template-columns:minmax(0,1fr) 280px; gap:var(--s-3); }
}
@media (max-width:640px){
  #screen-share .tl-flaeche{ grid-template-columns:minmax(0,1fr); gap:var(--s-4); }
  #screen-share .tl-einst{ position:static; order:-1; }
  #screen-share .tl-einst-scroll{ max-height:min(50dvh,440px); }
  #screen-share .tl-aktionen{ width:100%; }
  #screen-share .tl-live-knopf{ flex:1; justify-content:center; }
  #screen-share .tl-vorschau{ grid-template-columns:1fr; }
  #screen-share .tl-optionen{ grid-template-columns:1fr; }
  #screen-share .tl-reiter{ flex-wrap:wrap; row-gap:4px; }
  #screen-share .tl-reiter [data-reiter]{ white-space:nowrap; }
  #screen-share .tl-loesung-schalter{ flex:1 0 100%; justify-content:flex-end; margin:0; padding-bottom:8px; }
  #screen-share .tl-kopf-text{ flex-basis:calc(100% - 60px); }
  #screen-share .tl-titel{ font-size:var(--fs-lg); }
  #tl-live .tl-live-leiste{ gap:4px; }
  #tl-live .tl-live-ic{ width:32px; height:40px; }
  #tl-live .tl-live-los{ font-size:var(--fs-xs); padding:0 var(--s-2); }
  #tl-live:not(.tl-rennt):not(.tl-ohne-rennen) .tl-live-titel{ display:none; }
  #tl-live .tl-live-rechts{ margin-left:auto; }
  #tl-live .tl-karte-link{ font-size:var(--fs-md); }
  #tl-live .qh-frame img, #tl-live .qh-frame canvas{ width:clamp(160px,28dvh,280px) !important; }
}
@media (prefers-reduced-motion: reduce){
  #screen-share .tl-abschnitt.tl-blitz{ animation:none; background:var(--brand-soft); }
  .tl-schalter, .tl-schalter::after{ transition:none; }
}

/* Bild am Blatt und Sozialform je Aufgabe im Editor (v2.977.0,
   PLAN_BLATTVORLAGEN B4). Das Fenster nutzt die .ss-fd-Huelle. */
.ed-meta{flex-wrap:wrap;}
.ed-motiv-knopf{display:inline-flex;align-items:center;gap:6px;min-height:33px;padding:4px 10px;
  border:1px solid var(--line);border-radius:8px;background:var(--card);font:inherit;font-size:13px;
  font-weight:600;color:var(--ink);cursor:pointer;}
.ed-motiv-knopf:hover{border-color:var(--brand);}
.ed-motiv-knopf img{width:22px;height:22px;object-fit:contain;}
.ss-motiv .ss-fd-f{max-width:720px;}
.ss-motiv-suche{width:100%;padding:9px 12px;border:1px solid var(--line);border-radius:10px;font:inherit;font-size:14px;margin:0 0 10px;}
.ss-motiv-wahl{display:flex;gap:8px;margin:0 0 12px;}
.ss-motiv-raster{display:grid;grid-template-columns:repeat(auto-fill,minmax(92px,1fr));gap:8px;font-size:13px;color:var(--muted);}
.ss-motiv-bild{display:flex;flex-direction:column;align-items:center;gap:4px;padding:8px 4px;border:1px solid var(--line);
  border-radius:10px;background:var(--card);cursor:pointer;font:inherit;font-size:11px;color:var(--ink);}
.ss-motiv-bild:hover,.ss-motiv-bild.an{border-color:var(--brand);background:var(--brand-soft);}
.ss-motiv-bild img{width:44px;height:44px;object-fit:contain;}
.ss-motiv-bild span{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}

/* „Blatt mit Bildern" auf der Material-Seite (v2.978.0, PLAN_BLATTVORLAGEN B7).
   Eine waagerechte Reihe wie „Fertige Blätter"; gezeichnet von matBvZeichnen. */
.mat-bv-spur{display:flex;gap:10px;overflow-x:auto;padding:2px 2px 8px;scroll-snap-type:x proximity;}
/* Eine echte, verkleinerte Seite je Vorlage (v2.992.0) statt Spielzeugbilder:
   130 px von 760 px Blattbreite = Massstab .1711. */
.mat-bv-blatt{display:block;position:relative;width:130px;height:184px;overflow:hidden;border:1px solid var(--line);
  border-radius:6px;background:var(--paper);pointer-events:none;margin-bottom:6px;}
.mat-bv-blatt iframe{position:absolute;top:0;left:0;width:760px;height:1074px;border:0;transform:scale(.1711);transform-origin:top left;}
.mat-bv-kachel{flex:0 0 150px;scroll-snap-align:start;display:flex;flex-direction:column;align-items:center;
  gap:3px;padding:12px 8px 10px;border:1.5px solid var(--line);border-radius:14px;background:var(--card);
  cursor:pointer;font:inherit;color:var(--ink);text-align:center;}
.mat-bv-kachel:hover{border-color:var(--brand);}
.mat-bv-kachel.an{border-color:var(--brand);background:var(--brand-soft);}
.mat-bv-kachel b{font-size:12.5px;line-height:1.25;}
.mat-bv-kachel i{font-style:normal;font-size:11px;line-height:1.3;color:var(--muted);}
.mat-bv-bild{position:relative;display:flex;align-items:center;justify-content:center;width:64px;height:58px;margin-bottom:4px;}
.mat-bv-haupt{width:52px;height:52px;object-fit:contain;}
.mat-bv-neben{position:absolute;right:-10px;bottom:-2px;display:flex;gap:1px;}
.mat-bv-neben img{width:22px;height:22px;object-fit:contain;}
.mat-bv-bild--leer .ed-dz-mini{transform:scale(1.6);}
@media (max-width:640px){
  .mat-bv-kachel{flex-basis:128px;}
  .mat-bv-blatt{width:112px;height:158px;}
  .mat-bv-blatt iframe{transform:scale(.1474);}
}

/* ===== DIE KLASSEN-LEISTE (v2.984.0, static/js/klassen-leiste.js) =========
   Runde Flaechen mit Namen darunter, wie die Symbolreihe von Canva (Murat
   09.10.2026). Links der Linie die angehefteten Werkzeuge, rechts die fuenf
   Gruppen. Beim Zeigen hebt sich der Kreis, das grosse Zeichen weicht vier
   kleinen (was drin ist), darunter erscheint „Alle anzeigen". Der Ton kommt
   je Gruppe als --kbl-ton (nur Woerterbuch-Toene, DESIGN_SYSTEM.md §3.1);
   das weisse Zeichen darauf ist wie bei den --kont-* in beiden Themes
   lesbar. Passt die Leiste nicht, fallen erst die Namen, dann die
   angehefteten Werkzeuge weg (kblEinpassen) - nie eine zweite Zeile. */
/* EINE GROESSE FUER DEN GANZEN KOPF (v2.985.0, Murat 09.10.2026: „çözünürlük
   küçüldükçe … o yuvarlakların boyutları küçülsün, büyük ekranda normal"):
   --kbl-d ist der Durchmesser der Kreise und waechst mit der Fensterbreite
   von 30 px (Telefon) bis 46 px (ab etwa 1440 px). Klassen-Chip, Zeitraum
   und Auge rechnen damit, damit die Zeile auf jedem Schirm aus einem Guss
   ist. */
.kbx-head{ --kbl-d:clamp(30px, calc(14px + 2.25vw), 46px); }
.kbl{ display:flex; align-items:flex-start; gap:var(--s-1); flex-wrap:nowrap; }
.kbl-platz{ position:relative; flex:none; min-width:calc(var(--kbl-d, 46px) + 18px); display:flex; flex-direction:column;
  align-items:center; gap:var(--s-1); padding:var(--s-1) var(--s-1) 0; border:0; background:none; cursor:pointer;
  color:var(--ink); font:inherit; border-radius:var(--r-card); -webkit-tap-highlight-color:transparent; }
.kbl-kreis{ position:relative; width:var(--kbl-d, 46px); height:var(--kbl-d, 46px); border-radius:50%; display:block;
  background:var(--kbl-ton, var(--brand)); color:var(--on-brand);
  box-shadow:inset 0 1px 0 var(--glas-licht), 0 6px 14px -8px var(--kbl-ton, var(--brand));
  transition:transform .24s cubic-bezier(.34,1.5,.5,1), box-shadow .2s ease; }
.kbl-gross, .kbl-mini{ position:absolute; inset:0; display:grid; place-items:center;
  transition:opacity .18s ease, transform .26s cubic-bezier(.34,1.4,.5,1); }
.kbl-gross svg{ width:calc(var(--kbl-d, 46px) * .48); height:calc(var(--kbl-d, 46px) * .48); fill:none; stroke:currentColor; stroke-width:1.8;
  stroke-linecap:round; stroke-linejoin:round; }
.kbl-mini{ inset:calc(var(--kbl-d, 46px) * .2); grid-template-columns:1fr 1fr; gap:0; opacity:0; transform:scale(.55) rotate(-12deg); }
.kbl-mini i{ display:grid; place-items:center; }
.kbl-mini svg{ width:calc(var(--kbl-d, 46px) * .26); height:calc(var(--kbl-d, 46px) * .26); fill:none; stroke:currentColor; stroke-width:2.2;
  stroke-linecap:round; stroke-linejoin:round; }
.kbl-name{ font-size:clamp(var(--fs-3xs), calc(7px + .3vw), var(--fs-2xs)); font-weight:700; line-height:1.2; white-space:nowrap; max-width:100%;
  overflow:hidden; text-overflow:ellipsis; }
.kbl-alle{ font-size:var(--fs-3xs); color:var(--muted); line-height:1.1; margin-top:-2px;
  opacity:0; transform:translateY(-3px); transition:opacity .18s ease, transform .18s ease; }
.kbl-platz:hover .kbl-kreis, .kbl-platz:focus-visible .kbl-kreis, .kbl-gruppe.auf .kbl-kreis{
  transform:translateY(-3px) scale(1.07); box-shadow:inset 0 1px 0 var(--glas-licht), 0 10px 20px -8px var(--kbl-ton, var(--brand)); }
.kbl-gruppe:hover .kbl-gross, .kbl-gruppe:focus-visible .kbl-gross, .kbl-gruppe.auf .kbl-gross{
  opacity:0; transform:scale(.5) rotate(18deg); }
.kbl-gruppe:hover .kbl-mini, .kbl-gruppe:focus-visible .kbl-mini, .kbl-gruppe.auf .kbl-mini{ opacity:1; transform:none; }
.kbl-gruppe:hover .kbl-alle, .kbl-gruppe:focus-visible .kbl-alle, .kbl-gruppe.auf .kbl-alle{ opacity:1; transform:none; }
.kbl-stern:hover .kbl-gross svg{ animation:kblWackeln .45s ease; }
.kbl-mehr:hover .kbl-gross, .kbl-mehr:focus-visible .kbl-gross, .kbl-mehr.auf .kbl-gross{ opacity:1; transform:none; }
/* Das Auge als Kreis wie die Gruppen (kbAugeKnopf): neutral, wenn die
   Klasse aufgedeckt ist, in der Flaechenfarbe, solange der Vorhang zu ist. */
/* `place-items` der Grundregel (.kbx-auge) mit Absicht ueberschrieben: als
   Spalte steht der Name sonst nicht mittig unter dem Kreis (Murat
   09.10.2026: „gözün altındaki yazı ortalı durmuyor"). */
.kbx-auge.kbl-auge{ width:auto; height:auto; display:flex; flex-direction:column; align-items:center;
  justify-content:flex-start; text-align:center; color:var(--ink); }
.kbx-auge.kbl-auge:hover{ transform:none; }
.kbl-auge .kbl-kreis{ display:grid; place-items:center; background:var(--card); color:var(--muted);
  box-shadow:inset 0 0 0 1px var(--line); }
.kbl-auge .kbl-kreis svg{ width:calc(var(--kbl-d, 46px) * .46); height:calc(var(--kbl-d, 46px) * .46); }
.kbl-auge.zu .kbl-kreis{ background:var(--flaeche-akzent-soft, var(--brand-soft)); color:var(--flaeche-akzent, var(--brand));
  box-shadow:inset 0 0 0 1px var(--flaeche-akzent, var(--brand)); }
.kbl-auge:hover .kbl-kreis{ transform:translateY(-3px) scale(1.07); }
@keyframes kblWackeln{ 30%{ transform:rotate(-12deg); } 60%{ transform:rotate(9deg); } }
.kbl-platz:focus-visible{ outline:2px solid var(--brand); outline-offset:2px; }
.kbl-linie{ flex:none; width:1px; height:calc(var(--kbl-d, 46px) - 6px); margin:var(--s-1) var(--s-2) 0; background:var(--line); }
.kbl-ohne-namen .kbl-platz{ min-width:calc(var(--kbl-d, 46px) + 6px); }
.kbl-feld-gruppe{ grid-column:1 / -1; font-size:var(--fs-2xs); font-weight:700; color:var(--muted);
  margin-top:var(--s-1); }
.kbl-ohne-namen .kbl-name, .kbl-ohne-namen .kbl-alle{ display:none; }
.kbl .kbl-weg{ display:none; }

/* Das Feld einer Gruppe: eine Karte unter dem Kreis, mit Zeiger. */
.kbl-feld{ position:fixed; z-index:960; padding:0; border-radius:var(--r-panel);
  background:var(--card); border:1px solid var(--line); box-shadow:var(--e-2);
  opacity:0; transform:translateY(-6px) scale(.98); transform-origin:var(--kbl-zeiger, 50%) 0;
  transition:opacity .16s ease, transform .2s cubic-bezier(.34,1.3,.5,1); pointer-events:none; }
.kbl-feld.auf{ opacity:1; transform:none; pointer-events:auto; }
.kbl-feld-innen{ padding:var(--s-4); max-height:var(--kbl-feld-max, 70vh); overflow-y:auto; overscroll-behavior:contain;
  border-radius:var(--r-panel); }
.kbl-feld::before{ content:""; position:absolute; top:-7px; left:calc(var(--kbl-zeiger, 50%) - 7px);
  width:14px; height:14px; background:var(--card); border-left:1px solid var(--line); border-top:1px solid var(--line);
  transform:rotate(45deg); }
.kbl-feld-kopf{ display:flex; align-items:center; gap:var(--s-3); margin-bottom:var(--s-3); }
.kbl-feld-kopf b{ display:block; font-size:var(--fs-md); }
.kbl-feld-kopf small{ display:block; font-size:var(--fs-xs); color:var(--muted); }
.kbl-feld-ico{ width:36px; height:36px; border-radius:50%; display:grid; place-items:center; flex:none;
  background:var(--kbl-ton); color:var(--on-brand); }
.kbl-feld-ico svg{ width:20px; height:20px; fill:none; stroke:currentColor; stroke-width:1.9; stroke-linecap:round; stroke-linejoin:round; }
.kbl-feld-raster{ display:grid; grid-template-columns:repeat(2, minmax(0, 1fr)); gap:var(--s-2); }
.kbl-wz{ display:flex; align-items:center; border-radius:var(--r-card); border:1px solid var(--hair);
  background:var(--surface-subtle); transition:border-color .15s ease, background .15s ease; }
.kbl-wz:hover{ border-color:var(--kbl-ton); background:var(--card); }
.kbl-wz-tun{ flex:1; min-width:0; display:flex; align-items:center; gap:var(--s-3); padding:var(--s-2) var(--s-3);
  border:0; background:none; cursor:pointer; text-align:left; font:inherit; color:var(--ink); border-radius:var(--r-card); }
.kbl-wz-ico{ width:34px; height:34px; flex:none; border-radius:var(--r-control); display:grid; place-items:center;
  color:var(--kbl-ton); background:var(--card); box-shadow:inset 0 0 0 1px var(--line); }
.kbl-wz-ico svg{ width:18px; height:18px; fill:none; stroke:currentColor; stroke-width:2; stroke-linecap:round; stroke-linejoin:round; }
.kbl-wz-tx{ min-width:0; display:flex; flex-direction:column; gap:2px; }
.kbl-wz-tx b{ font-size:var(--fs-sm); font-weight:700; }
.kbl-wz-tx small{ font-size:var(--fs-2xs); color:var(--muted); line-height:1.3; }
.kbl-wz.gefahr .kbl-wz-ico, .kbl-wz.gefahr .kbl-wz-tx b{ color:var(--bad-ink); }
.kbl-wz-stern{ flex:none; width:34px; height:34px; margin-right:var(--s-1); border:0; background:none; cursor:pointer;
  border-radius:var(--r-pill); display:grid; place-items:center; color:var(--muted); }
.kbl-wz-stern:hover{ background:var(--card); color:var(--amber); }
.kbl-wz-stern.an{ color:var(--amber); }
.kbl-wz-stern.an svg{ fill:currentColor; }
.kbl-wz-tun:focus-visible, .kbl-wz-stern:focus-visible{ outline:2px solid var(--brand); outline-offset:-2px; }
.kbl-feld-fuss{ display:block; margin-top:var(--s-3); font-size:var(--fs-2xs); color:var(--muted); }
.kbl-feld-fuss.voll{ color:var(--amber-ink); }
@media (max-width:640px){
  .kbl{ gap:2px; }
  .kbl-platz, .kbl-ohne-namen .kbl-platz{ min-width:calc(var(--kbl-d, 30px) + 2px); padding:2px 1px 0; }
  .kbl-name, .kbl-alle{ display:none; }
  .kbl-linie{ margin:var(--s-1) var(--s-1) 0; }
  .kbl-feld-raster{ grid-template-columns:minmax(0, 1fr); }
  /* Am Telefon rollt der Kopf nicht mehr (Murat 09.10.2026): was nicht
     passt, nimmt „Weitere" (kblEinpassen). */
  body.ml-an .kbx-head:has(.kbl){ overflow-x:visible; touch-action:auto; }
}
@media (prefers-reduced-motion:reduce){
  .kbl-kreis, .kbl-gross, .kbl-mini, .kbl-alle, .kbl-feld{ transition:none; }
  .kbl-stern:hover .kbl-gross svg{ animation:none; }
}

/* ===== DER SCHNELLBLICK (v2.984.0, kblSchnellblick) =======================
   Vier Zahlen zur Klasse ueber der Liste, keine Namen. Unter dem Vorhang
   verschleiert wie die Noten der Liste. */
.kbs{ display:grid; grid-template-columns:repeat(4, minmax(0, 1fr)) auto; gap:var(--s-2); margin-bottom:var(--s-3); }
.kbs-k{ display:flex; align-items:center; gap:var(--s-3); min-width:0; padding:var(--s-3);
  border-radius:var(--r-card); background:var(--surface-subtle); border:1px solid var(--hair); }
.kbs-ico{ width:34px; height:34px; flex:none; border-radius:50%; display:grid; place-items:center;
  background:var(--card); color:var(--muted); box-shadow:inset 0 0 0 1px var(--line); }
.kbs-ico svg{ width:18px; height:18px; fill:none; stroke:currentColor; stroke-width:2; stroke-linecap:round; stroke-linejoin:round; }
.kbs-schnitt .kbs-ico{ color:var(--violett); }
.kbs-abgaben .kbs-ico{ color:var(--kont-quiz); }
.kbs-hilfe .kbs-ico{ color:var(--rosa); }
.kbs-ohne .kbs-ico{ color:var(--muted); }
.kbs-tx{ min-width:0; display:flex; flex-direction:column; }
.kbs-tx small{ font-size:var(--fs-2xs); color:var(--muted); font-weight:600; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.kbs-wert{ font-size:var(--fs-lg); font-weight:800; line-height:1.15; letter-spacing:-.02em; font-variant-numeric:tabular-nums; }
.kbs-unter{ font-size:var(--fs-2xs); color:var(--muted); white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.kbs-auf{ color:var(--ok-ink); font-weight:700; }
.kbs-ab{ color:var(--bad-ink); font-weight:700; }
.kbs-ana{ display:flex; align-items:center; gap:var(--s-2); padding:0 var(--s-3); border-radius:var(--r-card);
  border:1px solid var(--line); background:var(--card); color:var(--ink); font:inherit; font-size:var(--fs-sm);
  font-weight:700; cursor:pointer; white-space:nowrap; }
.kbs-ana svg{ width:18px; height:18px; fill:none; stroke:currentColor; stroke-width:2; stroke-linecap:round; stroke-linejoin:round; }
.kbs-ana:hover{ border-color:var(--violett); color:var(--violett-ink); }
.kbs-ana[aria-pressed="true"]{ background:var(--violett-soft); border-color:var(--violett); color:var(--violett-ink); }
#kb-content.kb-vorhang .kbs-wert, #kb-content.kb-vorhang .kbs-unter{ filter:blur(5px); user-select:none; -webkit-user-select:none; }
@media (max-width:1180px){
  .kbs-ico{ display:none; }
  .kbs-k{ padding:var(--s-2) var(--s-3); }
}
@media (max-width:900px){
  .kbs{ grid-template-columns:repeat(2, minmax(0, 1fr)); }
  .kbs-ana{ grid-column:1 / -1; justify-content:center; min-height:40px; }
}

/* ===== DIE KLASSEN-KARTE (v2.986.0, kbxHeadBar) ===========================
   Links im Kopf der Klasse: ein Kreis in der Klassenfarbe (--kc, aus
   kbClassColor) mit dem Kuerzel, daneben der Name (Klasse wechseln) und
   darunter der Zeitraum (kbxZeitBand) - eine Karte, zwei Knoepfe. Der Kreis
   hat das Mass der Gruppen (--kbl-d) und waechst und schrumpft mit ihnen.
   Die Regeln stehen mit `.kbx-karte` davor und schlagen damit die aelteren
   Groessen von .kbx-chip/.kbz-kbtn (KLASSEN-KOPF AB TABLET, AM TELEFON). */
body .kbx-head .kbx-karte{ position:relative; flex:none; display:flex; flex-direction:column; justify-content:center;
  gap:2px; min-height:calc(var(--kbl-d, 46px) + 12px); padding:var(--s-1) var(--s-4);
  padding-left:calc(var(--kbl-d, 46px) + 18px);
  border-radius:var(--r-pill); background:var(--card); border:1px solid var(--line);
  background:color-mix(in srgb, var(--kc, var(--brand)) 7%, var(--card));
  border-color:color-mix(in srgb, var(--kc, var(--brand)) 22%, var(--line));
  box-shadow:inset 0 1px 0 var(--glas-licht), 0 6px 16px -12px var(--sb-tief, var(--line));
  transition:border-color .18s ease, box-shadow .18s ease; }
body .kbx-head .kbx-karte:hover{ border-color:var(--kc, var(--brand)); }
body .kbx-head .kbx-karte .kbx-head-ck{ display:flex; }
body .kbx-head .kbx-karte .kbx-chip{ position:static; height:auto; min-height:0; padding:0; gap:var(--s-1); border-radius:0;
  background:none; box-shadow:none; color:var(--ink); font-weight:800; letter-spacing:-.01em; line-height:1.15;
  font-size:clamp(var(--fs-sm), calc(6px + .9vw), var(--fs-lg)); }
body .kbx-head .kbx-karte .kbx-chip:active{ transform:none; }
body .kbx-head .kbx-karte .kbx-chip svg{ width:14px; height:14px; color:var(--muted); }
.kbx-chip-kreis{ position:absolute; left:6px; top:50%; width:var(--kbl-d, 46px); height:var(--kbl-d, 46px);
  margin-top:calc(var(--kbl-d, 46px) / -2); border-radius:50%; display:grid; place-items:center;
  background:var(--kc, var(--brand)); color:var(--on-brand); font-weight:800; letter-spacing:-.03em;
  font-size:calc(var(--kbl-d, 46px) * .34); box-shadow:inset 0 1px 0 var(--glas-licht), 0 6px 14px -8px var(--kc, var(--brand));
  transition:transform .24s cubic-bezier(.34,1.5,.5,1); }
.kbx-karte:hover .kbx-chip-kreis{ transform:scale(1.06); }
.kbx-chip-name{ white-space:nowrap; overflow:hidden; text-overflow:ellipsis; max-width:24ch; }
.kbx-chip-vor{ font-weight:600; color:var(--muted); }
body .kbx-head .kbx-karte .kbz-kasten{ display:flex; }
body .kbx-head .kbx-karte .kbz-kbtn{ height:auto; min-height:0; padding:0; border:0; background:none; border-radius:0;
  color:var(--flaeche-akzent-ink, var(--brand)); font-weight:700; line-height:1.2;
  font-size:clamp(var(--fs-3xs), calc(6px + .45vw), var(--fs-xs)); }
body .kbx-head .kbx-karte .kbz-kbtn:hover{ text-decoration:underline; text-underline-offset:2px; }
body .kbx-head .kbx-karte .kbz-kbtn svg{ width:11px; height:11px; }
.kbx-karte .kbx-chip:focus-visible, .kbx-karte .kbz-kbtn:focus-visible{ outline:2px solid var(--brand); outline-offset:2px;
  border-radius:var(--r-control); }
@media (max-width:640px){
  body .kbx-head .kbx-karte{ padding:2px var(--s-3); padding-left:calc(var(--kbl-d, 30px) + 10px);
    min-height:calc(var(--kbl-d, 30px) + 6px); }
  .kbx-chip-kreis{ left:3px; }
  .kbx-chip-vor{ display:none; }
  .kbx-chip-name{ max-width:9ch; }
}
@media (prefers-reduced-motion:reduce){ .kbx-chip-kreis, body .kbx-head .kbx-karte{ transition:none; } }

/* ===== NAMEN UNTER JEDEM PLATZ DER LEISTE AM RECHNER (v2.987.0) ===========
   Murat 09.10.2026: „isimler gözüksün … tekstsiz çok yaban durdu … mobilde
   olduğu gibi bırakalım". Ab 900 px (senkrechte Kapsel) steht unter jedem
   Zeichen sein Name; das Zeichen rueckt dafuer ein Stueck nach oben, der
   gewaehlte Platz behaelt seinen Tropfen und den Namen darunter. Beim Zeigen
   hebt sich das Zeichen ein wenig (die Vorschau bleibt). Ein Platz ist dafuer
   72 statt 64 px hoch (ML_PLATZ_RECHNER, mlReihe/mlVermessen). Am Telefon
   und Tablet hochkant unveraendert: Namen nur unter der Wahl. */
@media(min-width:900px){
 body.sb-fest #ml-leiste .ml-platz:not(.an) > svg,
 body.sb-fest #ml-leiste .ml-platz:not(.an) > .ml-av{ transform:translateY(-8px); }
 body.sb-fest #ml-leiste .ml-platz .ml-name{ font-size:var(--fs-3xs); line-height:12px; }
 body.sb-fest #ml-leiste .ml-platz:not(.an) .ml-name{ opacity:1; top:calc(50% + 9px); transform:translate(-50%, 0);
   color:var(--muted); font-weight:650; }
 body.sb-fest #ml-leiste .ml-platz.an .ml-name{ top:calc(50% + 27px); color:var(--ink); }
 body.sb-fest #ml-leiste .ml-platz:not(.an)::before{ top:calc(50% - 8px); }
 body.sb-fest #ml-leiste .ml-platz.vorschau:not(.an) > svg,
 body.sb-fest #ml-leiste .ml-platz.vorschau:not(.an) > .ml-av{ transform:translateY(-8px) scale(1.22); }
 body.sb-fest #ml-leiste .ml-platz:not(.an):active > svg{ transform:translateY(-8px) scale(.97); }
 body.sb-fest #ml-leiste .ml-platz.vorschau:not(.an) .ml-name{ color:var(--ink); }
 body.sb-fest #ml-leiste .ml-zahl{ top:calc(50% - 30px); }
}

/* Dieselben Bereiche auch in kurzen Rechnerfenstern: kleinere Zeichen
   mit getrenntem Namensraum statt verschwundener Navigationsplätze. */
@media(min-width:900px) and (max-height:650px){
 body.sb-fest #ml-leiste{--ml-klein:clamp(8px,calc(var(--ml-platz-hoch,40px) - 12px),28px);--ml-kugel:clamp(16px,calc(var(--ml-platz-hoch,40px) - 2px),38px);}
 body.sb-fest #ml-leiste .ml-platz > svg{position:absolute;top:calc((100% - 12px)/2);width:var(--ml-klein);height:var(--ml-klein);transform:translateY(-50%);}
 body.sb-fest #ml-leiste .ml-platz:not(.an) > svg{transform:translateY(-50%);}
 body.sb-fest #ml-leiste .ml-platz.vorschau:not(.an) > svg{transform:translateY(-50%) scale(1.12);}
 body.sb-fest #ml-leiste .ml-platz:not(.an):active > svg{transform:translateY(-50%) scale(.97);}
 body.sb-fest #ml-leiste .ml-platz.an > svg{transform:translateY(-50%) scale(.8);}
 body.sb-fest #ml-leiste .ml-platz .ml-name,body.sb-fest #ml-leiste .ml-platz.an .ml-name,body.sb-fest #ml-leiste .ml-platz:not(.an) .ml-name{top:auto;bottom:0;line-height:10px;font-size:8px;transform:translateX(-50%);}
 body.sb-fest #ml-leiste .ml-blase{width:var(--ml-kugel);height:var(--ml-kugel);margin:calc((52px - var(--ml-kugel))/2);}
 body.sb-fest #ml-leiste .ml-platz::before{display:none;}
}

/* ===== DIE SAMMLUNG IN KREISEN (v2.987.0, samReiterAnwenden) =============
   Dieselbe Gestalt wie die Klassen-Leiste: Kreis in einem Woerterbuch-Ton,
   Name darunter, waechst und schrumpft mit dem Schirm (--kbl-d). Der aktive
   Reiter traegt einen Ring und den Namen in Schrift; die Linse gleitet
   weiter darunter. Am Telefon bleiben die Namen (es sind Ziele, keine
   Gruppen) - die Zeile rollt dort wie bisher. */
.sam-reiter{ --kbl-d:clamp(32px, calc(14px + 2.1vw), 44px); }
.sam-reiter .adm-tab.sam-tab{ flex:0 0 auto; min-width:calc(var(--kbl-d) + 26px); flex-direction:column; align-items:center;
  gap:var(--s-1); min-height:0; padding:var(--s-1) var(--s-1) var(--s-3); font-weight:650; color:var(--muted); }
.sam-reiter .adm-tab.sam-tab .kbl-kreis{ display:grid; place-items:center; }
.sam-reiter .adm-tab.sam-tab .kbl-gross{ position:static; }
.sam-reiter .adm-tab.sam-tab .kbl-gross svg{ width:calc(var(--kbl-d) * .46); height:calc(var(--kbl-d) * .46);
  stroke:currentColor; fill:none; }
.sam-reiter .adm-tab.sam-tab .kbl-name{ font-size:clamp(var(--fs-3xs), calc(7px + .32vw), var(--fs-xs)); }
.sam-reiter .adm-tab.sam-tab:not(.active) .kbl-kreis{ opacity:.88; }
.sam-reiter .adm-tab.sam-tab:hover .kbl-kreis{ opacity:1; transform:translateY(-3px) scale(1.06); }
html .sam-reiter .adm-tab.sam-tab.active{ color:var(--ink); }
/* v2.987.2 (Murat 09.10.2026: „altındaki çizgiyi kaldır, soldaki yapıya
   benzet … üstten kesiliyor … ortala, biraz mesafeli … çember oluşmasın …
   seçili olan camsı büyüsün, mercek … üstüne gelince bir kere oynasın"):
   keine Linie und kein Ring mehr; die Zeile steht mittig mit Luft nach oben
   (sonst schnitt overflow-x das Anheben ab). Der gewaehlte Reiter ist
   groesser und glaesern wie der Tropfen der Leiste links: ein Lichtfleck
   oben links (::after), ein weicher Schatten. Beim Zeigen spielt das
   Zeichen einmal (kblWackeln, dieselbe Bewegung wie in Klassen). Die Linse
   bleibt im DOM (samLinseSetzen misst weiter), ist aber unsichtbar. */
.sam-reiter{ gap:var(--s-5); justify-content:center; border-bottom:0; padding-top:var(--s-3); }
.sam-reiter .sam-linse{ visibility:hidden; }
.sam-reiter .adm-tab.sam-tab .kbl-kreis{ overflow:hidden; transform-origin:50% 60%; }
.sam-reiter .adm-tab.sam-tab .kbl-kreis::after{ content:""; position:absolute; inset:0; border-radius:50%; pointer-events:none;
  background:radial-gradient(circle at 32% 24%, var(--glas-licht), transparent 52%); opacity:.55; }
.sam-reiter .adm-tab.sam-tab.active .kbl-kreis{ opacity:1; transform:scale(1.2);
  box-shadow:inset 0 1px 0 var(--glas-licht), inset 0 -8px 14px -10px var(--sb-tief, var(--ink)),
             0 12px 22px -12px var(--kbl-ton, var(--brand)); }
.sam-reiter .adm-tab.sam-tab.active .kbl-kreis::after{ opacity:1; }
.sam-reiter .adm-tab.sam-tab.active .kbl-name{ margin-top:var(--s-1); }
.sam-reiter .adm-tab.sam-tab.active:hover .kbl-kreis{ transform:scale(1.24); }
.sam-reiter .adm-tab.sam-tab:hover .kbl-gross svg{ animation:kblWackeln .5s ease 1; }
@media (prefers-reduced-motion:reduce){
  .sam-reiter .adm-tab.sam-tab:hover .kbl-gross svg{ animation:none; }
}
@media (max-width:640px){
  /* Die Namen der Sammlung bleiben am Telefon (die Klassen-Leiste blendet
     ihre aus - dort tragen Gruppen ihr Zeichen); die Zeile rollt wie bisher. */
  .sam-reiter .adm-tab.sam-tab .kbl-name{ display:block; }
  .sam-reiter .adm-tab.sam-tab{ min-width:calc(var(--kbl-d) + 22px); padding:var(--s-1) 2px var(--s-2); }
  .sam-reiter{ justify-content:flex-start; gap:var(--s-2); }
}

/* ===== GLAS AUF DEN KREISEN UND LUFT NACH OBEN (v2.987.3) ===============
   Murat 09.10.2026: „klassen içindekileri de camsı yapsaydın … animasyonlar
   kalmalı … hâlâ yukarıdan kesiliyor … yukarıdaki beyaz şeridi artır".
   1. Jeder farbige Kreis der Klassen-Leiste (Gruppen, angeheftete,
      Klassenkreis) traegt dasselbe Glas wie der gewaehlte Sammlung-Reiter:
      Lichtfleck oben links, Innenschatten unten. Die Mini-Zeichen und ihre
      Bewegung bleiben darunter unveraendert.
   2. Abgeschnitten wurde das Anheben von zwei Kanten: der Klassen-Kopf
      (.kbx-head, overflow:auto) begann 4 px ueber den Kreisen, und der
      Sammlung-Reiter (.adm-tab) hat overflow:hidden. Beide bekommen Luft
      bzw. lassen ueberstehen. */
.kbl-gruppe .kbl-kreis, .kbl-stern .kbl-kreis, .kbx-chip-kreis{
  box-shadow:inset 0 1px 0 var(--glas-licht), inset 0 -8px 14px -10px var(--sb-tief, var(--ink)),
             0 6px 14px -8px var(--kbl-ton, var(--kc, var(--brand))); }
.kbl-gruppe .kbl-kreis::after, .kbl-stern .kbl-kreis::after, .kbx-chip-kreis::after{
  content:""; position:absolute; inset:0; border-radius:50%; pointer-events:none;
  background:radial-gradient(circle at 32% 24%, var(--glas-licht), transparent 52%); opacity:.8; }
.kbx-chip-kreis{ overflow:hidden; }
body .kbx-head:has(.kbl){ padding-top:var(--s-3); }
.sam-reiter .adm-tab.sam-tab{ overflow:visible; padding-top:var(--s-2); }
.sam-reiter{ padding-top:var(--s-4); }
.kbl-gruppe:hover .kbl-kreis, .kbl-stern:hover .kbl-kreis, .kbl-gruppe.auf .kbl-kreis{
  box-shadow:inset 0 1px 0 var(--glas-licht), inset 0 -8px 14px -10px var(--sb-tief, var(--ink)),
             0 10px 20px -8px var(--kbl-ton, var(--brand)); }

/* Telefon: Sammlung und Klassen passen nebeneinander; unveränderte Tablet-
   und Rechnerregeln. Verbindung: samReiterAnwenden, dashToolbar, kblEinpassen. */
@media (max-width:640px){
  .sam-reiter{ --kbl-d:26px; gap:4px; justify-content:space-between; padding-top:12px; padding-bottom:8px; }
  .sam-reiter .adm-tab.sam-tab{ min-width:0; flex:1 1 0; padding:4px 0 8px; }
  .sam-reiter .adm-tab.sam-tab .kbl-name{ font-size:var(--fs-3xs); line-height:1.2; letter-spacing:0; overflow:visible; white-space:normal; overflow-wrap:anywhere; }
  #dash-toolbar, #kur-toolbar, #boerse-toolbar{ column-gap:4px; }
  #dash-toolbar .dtb-btn, #kur-toolbar .dtb-btn, #boerse-toolbar .dtb-btn{ padding:0 3px; gap:0; font-size:11px; justify-content:center; width:100%; }
  #dash-toolbar .dtb-btn .dtb-chev, #kur-toolbar .dtb-btn .dtb-chev, #boerse-toolbar .dtb-btn .dtb-chev{ display:none; }
  #dash-toolbar .dtb-btn .dtb-lbl, #kur-toolbar .dtb-btn .dtb-lbl, #boerse-toolbar .dtb-btn .dtb-lbl{ overflow:visible; text-overflow:clip; }
  #dash-toolbar > .dtb-zone-mob, #kur-toolbar > .dtb-zone-mob{ flex:0 0 32px; min-width:0; width:32px; }
  #dash-toolbar .dtb-zone-btn, #kur-toolbar .dtb-zone-btn{ width:32px; padding:0; }
  #dash-toolbar .dtb-neu, #kur-toolbar .dtb-neu{ width:34px; height:36px; }
  #dash-toolbar::after, #kur-toolbar::after, #boerse-toolbar::after{ content:none; }
  body .kbx-head:has(.kbl){ --kbl-d:26px; gap:var(--s-1); }
  body .kbx-head .kbx-karte{ padding-left:35px; padding-right:6px; }
  body .kbx-head .kbx-karte .kbx-chip{ font-size:var(--fs-sm); }
  body .kbx-head .kbx-karte .kbz-kbtn{ font-size:var(--fs-3xs); }
}
/* Die native Statusleiste liegt über der WebView. Ihr Hintergrund gehört
   zur Schale, auch während ein weißes Blatt oder Menü geöffnet ist. */
html.ist-app body::after{ content:""; position:fixed; inset:0 0 auto; height:env(safe-area-inset-top,0px);
  background:var(--shell-bg); pointer-events:none; z-index:100000; }

/* Auch das gewählte Profil trägt die Zahl über seiner vergrößerten Blase. */
@media (max-width:899.98px){
  #ml-leiste .ml-platz[data-ml="alles"].an .ml-zahl{ opacity:1; z-index:3; top:-5px; left:calc(50% + 12px); }
}
/* Derselbe Postfach-Zähler am Nachrichten-Eingang im Alles-Raster. */
body.ml-an #ml-alles .ml-kachel[data-ml-tun="nachrichten"] i{ position:relative; }
body.ml-an #ml-alles .ml-kachel .ml-pf-zahl{ position:absolute; top:-6px; right:-6px; min-width:18px; height:18px;
  padding:0 4px; border-radius:9px; background:var(--bad); color:var(--on-brand); font-size:10px; font-weight:800;
  line-height:14px; text-align:center; border:2px solid var(--card); box-sizing:border-box; overflow:visible; }
body.ml-an #ml-alles .ml-kachel .ml-pf-zahl[hidden]{ display:none; }

/* ===== DIE SAMMLUNG IM STIL DER LEISTE (v3.11.0) ==========================
   Murat 15.10.2026: Die linke Leiste – Glas mit sanfter Tiefe – sei „çok
   güzel“; Knöpfe und Auswahlfelder der Sammlung sollen so aussehen, auch
   rechts im Detailbereich. Die Reiterzeile oben dagegen bewusst ANDERS als
   die Leiste und OHNE Grund („arkaplanlı olmasın … çok boğulur … yukarıdaki
   menü farklı olmalı“): nur die Wahl ist eine erhabene Neumorphismus-Pille.
   Seit v3.12.0 dasselbe in Börse, Klassen, SchlauHeft, Pinnwand und Fächer
   (Abschnitte 2–4 und 7–9; Pinnwand-Seite und Fächer als eigene Dokumente).
   Ein Rezept, drei Rollen:
     KAPSEL  getönte Fläche (Fläche + 7 % Akzent, feine Kante), eingelassen:
             Segment Aktiv/Archiv/Papierkorb, Pille im Blatt-Studio, Suche.
     ERHABEN heller Glasknopf mit Neumorphismus: Licht oben links, Schatten
             unten rechts; beim Zeigen hebt er sich, gedrückt/offen liegt er
             eingelassen (--sg-tief). Filter, Lupe, Detail- und Ladeknöpfe,
             die gewählte Ansicht im Segment, die Wahl der Reiterzeile.
     TROPFEN die Akzentkugel mit Lichtfleck oben links wie `.ml-blase`:
             „+“, Teilen, Neues Arbeitsblatt, Neuer Ordner.
   ⛔ KEIN backdrop-filter auf Kapsel und Knöpfen: dahinter liegt das weiße
   Panel (§5.1 DESIGN_SYSTEM, „kein Filter über glatter Fläche“). Nur die
   offenen Auswahlfelder schweben über der Liste – dort wirkt es.
   ⛔ Keine feste Farbe: alles aus --card, den Glas-Variablen, --sb-tief und
   dem Akzent, damit Flächenfarbe und Dunkelmodus von selbst mitgehen.
   ⛔ In Kommentaren hier nie Stern und Schrägstrich hintereinander
   schreiben (etwa ein Variablenmuster mit Stern): das schließt den
   Kommentar, und die nächste Regel fällt still weg.
   Die Wahl der Reiterzeile ist die vorhandene Linse (samLinseSetzen) – sie
   gleitet weiter von Reiter zu Reiter, nur als Pille statt als Strich.
   Die Lucide-Zeichen bleiben (Phosphor nur für die acht Menüzeichen, §6).
   MIT WEM: samReiterAnwenden/samLinseSetzen (index-app.js), dashToolbar,
   ebToolbarHtml (erklaerblatt-ui.js), kurseToolbarHtml, blatt-studio.js
   (#bl-zeile-akt), dateien.js,
   templates/lautlesezeit.html (.ll-bar, eigenes Dokument im Rahmen),
   klassen-leiste.js (.kbl, #kbl-feld), schreib-leiste.js (.sw-schale),
   templates/pinnwand.html (.pw-top, .pw-zoom), static/css/fach-navigation.css
   (nur body.embed), qa/unit/test_sammlung_leistenstil.py. */
body{
  --sg-akzent:var(--flaeche-akzent,var(--brand));
  --sg-grund:color-mix(in srgb,var(--sg-akzent) 7%,var(--card));
  --sg-kante:color-mix(in srgb,var(--sg-akzent) 16%,var(--glas-kante));
  --sg-glas:linear-gradient(180deg,var(--glas-licht),transparent 60%),color-mix(in srgb,var(--sg-akzent) 3%,var(--card));
  --sg-hoch:inset 0 1px 0 var(--glas-licht),inset 0 -1px 1px color-mix(in srgb,var(--sg-akzent) 8%,transparent),
            -2px -2px 5px var(--glas-licht),2px 3px 8px -3px var(--sb-tief),0 0 0 .5px var(--glas-kante);
  --sg-hoch-mehr:inset 0 1px 0 var(--glas-licht),inset 0 -1px 1px color-mix(in srgb,var(--sg-akzent) 10%,transparent),
            -3px -3px 7px var(--glas-licht),3px 6px 14px -5px var(--sb-tief),0 0 0 .5px var(--glas-kante);
  --sg-tief:inset 2px 2px 5px var(--sb-tief),inset -2px -2px 5px var(--glas-licht);
  --sg-tropfen:radial-gradient(circle at 35% 28%,color-mix(in srgb,var(--on-brand) 34%,transparent),transparent 46%),var(--sg-akzent);
  --sg-tropfen-breit:radial-gradient(120% 140% at 28% 0%,color-mix(in srgb,var(--on-brand) 30%,transparent),transparent 52%),var(--sg-akzent);
  --sg-tropfen-schatten:inset 0 1px 0 color-mix(in srgb,var(--on-brand) 38%,transparent),inset 0 -3px 6px -3px var(--sb-tief),
            0 0 10px -4px var(--sb-tief),0 8px 16px -9px color-mix(in srgb,var(--sg-akzent) 75%,transparent);
  --sg-ikon-schatten:drop-shadow(.6px 1.3px 1.1px var(--sb-tief)) drop-shadow(.3px .6px .4px var(--sb-tief))
            drop-shadow(-.6px -.6px .5px var(--glas-licht));
  --sg-weich:cubic-bezier(.2,.7,.3,1);
  /* Die Wahl einer Leiste ohne Grund: erhabene Neumorphismus-Pille. Groß
     für Reiter und Gruppen, klein für schmale Felder (Ansicht, Werkzeug). */
  --sg-wahl:linear-gradient(145deg,var(--card) 30%,color-mix(in srgb,var(--sg-akzent) 8%,var(--card)));
  --sg-wahl-schatten:7px 9px 20px -8px var(--sb-tief),4px 5px 9px -4px var(--sb-tief),2px 2px 3px -1px var(--sb-tief),
            -5px -5px 12px -4px var(--glas-licht),
            inset 0 1px 0 var(--glas-licht),inset 0 -2px 4px -2px color-mix(in srgb,var(--sg-akzent) 14%,transparent),
            0 0 0 .5px var(--glas-kante);
  --sg-wahl-schatten-klein:3px 4px 10px -4px var(--sb-tief),2px 2px 4px -2px var(--sb-tief),1px 1px 2px -1px var(--sb-tief),
            -3px -3px 8px -3px var(--glas-licht),
            inset 0 1px 0 var(--glas-licht),inset 0 -2px 3px -2px color-mix(in srgb,var(--sg-akzent) 14%,transparent),
            0 0 0 .5px var(--glas-kante);
  --sg-wahl-ton:var(--sg-akzent);
}
/* Im Dunkeln wäre der Akzent als Schrift zu dunkel: mit der hellen Schrift
   gemischt, ohne feste Farbe. */
html[data-theme="dark"] body{ --sg-wahl-ton:color-mix(in srgb,var(--sg-akzent) 45%,var(--ink)); }
@media (prefers-color-scheme:dark){
  html:not([data-theme="light"]) body{ --sg-wahl-ton:color-mix(in srgb,var(--sg-akzent) 45%,var(--ink)); }
}

/* 1. Die Reiterzeile hat KEINEN Grund (Murat: „arkaplanlı olmasın … yoksa
   çok boğulur bu sayfa“). Nur die Wahl ist eine weiche, erhabene
   Neumorphismus-Pille – die vorhandene Linse, sie gleitet weiter von Reiter
   zu Reiter. Bewusst ANDERS als die Leiste („soldaki aynen kalıyor ama
   yukarıdaki menü farklı olmalı“): kein Akzenttropfen, das Zeichen der Wahl
   steht in Akzentschrift auf heller Pille. */
.sam-reiter{ --sam-oben:10px; gap:4px; justify-content:center; padding:var(--sam-oben) 14px;
  margin-bottom:8px; background:transparent; border:0; border-radius:0; box-shadow:none; }
/* Am Rechner so breit wie ihre Reiter und mittig; passt sie einmal nicht
   (schmales Fenster, angedockter Robi), rollt sie wie am Telefon. */
@media (min-width:641px){
  .sam-reiter{ width:max-content; margin-left:auto; margin-right:auto; }
}
.sam-reiter .adm-tab.sam-tab{ flex:0 0 auto; width:auto; min-width:82px; gap:4px; padding:9px 10px 7px;
  border-radius:18px; color:var(--muted); }
.sam-reiter .adm-tab.sam-tab .kbl-kreis{ width:26px; height:26px; background:transparent;
  box-shadow:none; opacity:1; transform:none; overflow:visible; color:color-mix(in srgb,var(--ink) 78%,var(--card)); }
.sam-reiter .adm-tab.sam-tab .kbl-kreis::after{ content:none; }
.sam-reiter .adm-tab.sam-tab .kbl-gross svg{ width:21px; height:21px; animation:none;
  filter:var(--sg-ikon-schatten); transition:transform 180ms var(--sg-weich),color 150ms ease; }
.sam-reiter .adm-tab.sam-tab:hover .kbl-kreis{ transform:none; color:var(--ink); }
/* Statt des einmaligen Wackelns (v2.987.2) hebt sich das Zeichen leicht. */
.sam-reiter .adm-tab.sam-tab:hover .kbl-gross svg{ animation:none; }
.sam-reiter .adm-tab.sam-tab:not(.active):hover{ color:var(--ink); }
.sam-reiter .adm-tab.sam-tab:not(.active):hover .kbl-gross svg{ transform:translateY(-1px) scale(1.12); }
.sam-reiter .adm-tab.sam-tab:not(.active):active .kbl-gross svg{ transform:scale(.96); }
html .sam-reiter .adm-tab.sam-tab.active .kbl-kreis,
.sam-reiter .adm-tab.sam-tab.active:hover .kbl-kreis{ transform:none; box-shadow:none; color:var(--sam-akzent); }
html .sam-reiter .adm-tab.sam-tab.active{ color:var(--ink); }
.sam-reiter .adm-tab.sam-tab.active .kbl-name{ margin-top:0; }
.sam-reiter .sam-linse{ visibility:visible; top:var(--sam-oben); bottom:var(--sam-oben); height:auto;
  border-radius:18px; width:var(--sam-w, 0px); transform:translateX(var(--sam-x, 0px));
  background:var(--sg-wahl); box-shadow:var(--sg-wahl-schatten);
  transition:transform .44s cubic-bezier(.34,1.2,.44,1),width .44s cubic-bezier(.34,1.2,.44,1),opacity .18s ease; }

/* 2. Filterleiste: Aufgaben, Erklärblätter, Kurse, Börse. */
:is(#screen-dashboard,#screen-erklaerblatt,#screen-kurse,#screen-boerse) .dash-toolbar :is(.dtb-btn,.dash-search-inline){
  background:var(--sg-glas); border:1px solid var(--sg-kante); border-radius:999px; box-shadow:var(--sg-hoch);
  transition:box-shadow .2s ease,transform .2s var(--sg-weich),border-color .2s ease; }
:is(#screen-dashboard,#screen-erklaerblatt,#screen-kurse,#screen-boerse) .dash-toolbar :is(.dtb-btn,.dash-search-inline):hover{
  transform:translateY(-1px); box-shadow:var(--sg-hoch-mehr);
  border-color:color-mix(in srgb,var(--sg-akzent) 30%,var(--glas-kante)); }
:is(#screen-dashboard,#screen-erklaerblatt,#screen-kurse,#screen-boerse) .dash-toolbar .dtb-btn:is(.offen,:active){
  transform:none; background:var(--sg-grund); box-shadow:var(--sg-tief); }
:is(#screen-dashboard,#screen-erklaerblatt,#screen-kurse,#screen-boerse) .dash-toolbar .dash-search-inline:is(.hat-text,:focus-within){
  transform:none; background:var(--sg-grund); box-shadow:var(--sg-tief);
  border-color:color-mix(in srgb,var(--sg-akzent) 40%,var(--glas-kante)); }
:is(#screen-dashboard,#screen-erklaerblatt,#screen-kurse,#screen-boerse) .dash-toolbar .dtb-btn.aus{ border-style:dashed; }
/* Aktiv · Archiv · Papierkorb: eine Kapsel, die Wahl liegt erhaben darin. */
:is(#screen-dashboard,#screen-erklaerblatt,#screen-kurse,#screen-boerse) .dtb-seg{ gap:2px; padding:3px; border-radius:999px;
  background:var(--sg-grund); border:1px solid var(--sg-kante); box-shadow:inset 1px 1px 3px var(--sb-tief),inset -1px -1px 2px var(--glas-licht); }
:is(#screen-dashboard,#screen-erklaerblatt,#screen-kurse,#screen-boerse) .dtb-seg button{ border-radius:999px;
  transition:background .2s ease,box-shadow .2s ease,color .15s ease; }
:is(#screen-dashboard,#screen-erklaerblatt,#screen-kurse,#screen-boerse) .dtb-seg button:not(.an){ background:transparent; color:var(--muted); }
:is(#screen-dashboard,#screen-erklaerblatt,#screen-kurse,#screen-boerse) .dtb-seg button:not(.an):hover{ color:var(--ink); background:color-mix(in srgb,var(--card) 50%,transparent); }
:is(#screen-dashboard,#screen-erklaerblatt,#screen-kurse,#screen-boerse) .dtb-seg button.an{ background:var(--sg-glas); box-shadow:var(--sg-hoch); }
/* Die offenen Auswahlfelder schweben über der Liste: hier ist Glas echt. */
:is(#screen-dashboard,#screen-erklaerblatt,#screen-kurse,#screen-boerse) .dtb-panel{ border:1px solid var(--sg-kante); border-radius:18px;
  background:color-mix(in srgb,var(--card) 90%,transparent);
  -webkit-backdrop-filter:blur(16px) saturate(160%); backdrop-filter:blur(16px) saturate(160%);
  box-shadow:inset 0 1px 0 var(--glas-licht),0 0 0 .5px var(--glas-kante),var(--glas-trage),0 0 12px -4px var(--sb-tief); }
:is(#screen-dashboard,#screen-erklaerblatt,#screen-kurse,#screen-boerse) .dtb-panel .dtb-item{ border-radius:12px; }
:is(#screen-dashboard,#screen-erklaerblatt,#screen-kurse,#screen-boerse) .dtb-panel .dtb-item:hover{ background:var(--sg-grund); }
:is(#screen-dashboard,#screen-erklaerblatt,#screen-kurse,#screen-boerse) .dtb-panel .dtb-such{ border:1px solid var(--sg-kante); border-radius:999px;
  background:var(--sg-grund); box-shadow:var(--sg-tief); }

/* 3. Tropfen: die eine Handlung je Zeile. */
:is(#screen-dashboard,#screen-erklaerblatt,#screen-blaetter,#screen-kurse,#screen-materialien,#screen-boerse,#screen-pinnwand)
  :is(.dash-toolbar .dtb-neu,.dqd-haupt:not(.grau),#bl-zeile-akt .bl-u-knopf.haupt,.pwh-pille .bl-u-knopf.haupt,.da-toolbar-actions .da-primary){
  background:var(--sg-tropfen-breit); color:var(--on-brand);
  border:1px solid color-mix(in srgb,var(--on-brand) 24%,transparent); box-shadow:var(--sg-tropfen-schatten);
  -webkit-backdrop-filter:none; backdrop-filter:none; filter:none;
  transition:box-shadow .2s ease,transform .2s var(--sg-weich); }
:is(#screen-dashboard,#screen-erklaerblatt,#screen-kurse,#screen-boerse) .dash-toolbar .dtb-neu{ border-radius:50%; background:var(--sg-tropfen); }
:is(#screen-blaetter,#screen-materialien,#screen-pinnwand) :is(#bl-zeile-akt .bl-u-knopf.haupt,.pwh-pille .bl-u-knopf.haupt,.da-toolbar-actions .da-primary){ border-radius:999px; }
:is(#screen-dashboard,#screen-erklaerblatt,#screen-blaetter,#screen-kurse,#screen-materialien,#screen-boerse,#screen-pinnwand)
  :is(.dash-toolbar .dtb-neu,.dqd-haupt:not(.grau),#bl-zeile-akt .bl-u-knopf.haupt,.pwh-pille .bl-u-knopf.haupt,.da-toolbar-actions .da-primary):hover{
  transform:translateY(-1px); filter:none;
  box-shadow:inset 0 1px 0 color-mix(in srgb,var(--on-brand) 46%,transparent),inset 0 -3px 6px -3px var(--sb-tief),
             0 0 12px -4px var(--sb-tief),0 12px 22px -10px color-mix(in srgb,var(--sg-akzent) 80%,transparent); }
:is(#screen-dashboard,#screen-erklaerblatt,#screen-blaetter,#screen-kurse,#screen-materialien,#screen-boerse,#screen-pinnwand)
  :is(.dash-toolbar .dtb-neu,.dqd-haupt:not(.grau),#bl-zeile-akt .bl-u-knopf.haupt,.pwh-pille .bl-u-knopf.haupt,.da-toolbar-actions .da-primary):active{
  transform:scale(.97); box-shadow:inset 1px 2px 5px var(--sb-tief),0 4px 10px -8px color-mix(in srgb,var(--sg-akzent) 70%,transparent); }

/* 4. Erhabene Glasknöpfe im Detailbereich und in den Zeilen. */
:is(#screen-dashboard,#screen-erklaerblatt,#screen-kurse,#screen-boerse) :is(.dqd-ico,.dqd-zweit,.dqd-dl-btn,.dqd-haupt.grau,.eb-ik,.dq-row .dq-dl-b,.eb-akt .btn.ghost){
  background:var(--sg-glas); border:1px solid var(--sg-kante); box-shadow:var(--sg-hoch); color:var(--ink);
  transition:box-shadow .2s ease,transform .2s var(--sg-weich),border-color .2s ease,color .15s ease; }
:is(#screen-dashboard,#screen-erklaerblatt,#screen-kurse,#screen-boerse) :is(.dqd-ico,.dq-row .dq-dl-b){ border-radius:50%; }
:is(#screen-dashboard,#screen-erklaerblatt,#screen-kurse,#screen-boerse) :is(.dqd-dl-btn,.eb-ik){ border-radius:14px; }
:is(#screen-dashboard,#screen-erklaerblatt,#screen-kurse,#screen-boerse) :is(.dqd-zweit,.dqd-haupt.grau,.eb-akt .btn.ghost){ border-radius:999px; }
:is(#screen-dashboard,#screen-erklaerblatt,#screen-kurse,#screen-boerse) :is(.dqd-ico,.dqd-zweit,.dqd-dl-btn,.dqd-haupt.grau,.eb-ik,.dq-row .dq-dl-b,.eb-akt .btn.ghost):not(:disabled):hover{
  transform:translateY(-1px); box-shadow:var(--sg-hoch-mehr); background:var(--sg-glas);
  border-color:color-mix(in srgb,var(--sg-akzent) 30%,var(--glas-kante)); color:var(--ink); }
:is(#screen-dashboard,#screen-erklaerblatt,#screen-kurse,#screen-boerse) :is(.dqd-ico,.dqd-zweit,.dqd-dl-btn,.dqd-haupt.grau,.eb-ik,.dq-row .dq-dl-b,.eb-akt .btn.ghost):not(:disabled):active,
:is(#screen-dashboard,#screen-erklaerblatt,#screen-kurse,#screen-boerse) .dqd-ico[aria-expanded="true"]{
  transform:none; background:var(--sg-grund); box-shadow:var(--sg-tief); }
:is(#screen-dashboard,#screen-erklaerblatt,#screen-kurse,#screen-boerse) :is(.dqd-dl-btn,.eb-ik):disabled{ box-shadow:none; }
/* Bearbeiten und Börse neben Teilen (v3.13.0, dashDetail). Wird die Karte
   schmal, bleiben nur die Zeichen (Name im title) – Teilen behält Platz. */
#screen-dashboard .dqd-akt{ container-type:inline-size; align-items:center; }
#screen-dashboard .dqd-zweit{ flex:none; display:inline-flex; align-items:center; justify-content:center; gap:6px;
  height:40px; padding:0 13px; font:inherit; font-size:13px; font-weight:650; cursor:pointer; white-space:nowrap; }
#screen-dashboard .dqd-zweit svg{ width:16px; height:16px; flex:none; fill:none; stroke:currentColor; stroke-width:2;
  stroke-linecap:round; stroke-linejoin:round; }
/* In der Börse geteilt = eingedrückt, das Zeichen grün wie „In der Börse geteilt". */
#screen-dashboard .dqd-zweit.an{ background:var(--sg-grund); box-shadow:var(--sg-tief); }
#screen-dashboard .dqd-zweit.an svg{ color:var(--ok-ink,var(--ok)); }
@container (max-width:400px){
  #screen-dashboard .dqd-zweit{ width:40px; padding:0; }
  #screen-dashboard .dqd-zweit span{ display:none; }
}

/* 5. Blatt-Studio und Pinnwand-Übersicht: dieselbe Pille (.bl-u-knopf) ist
   eine Kapsel. Glatt gefüllt – die Spitze im Blatt-Studio (::before) trägt
   denselben Grund, ein Verlauf zeigte die Raute im Inneren. */
:is(#screen-blaetter #bl-zeile-akt,#screen-pinnwand .pwh-pille){ border:1px solid var(--sg-kante); border-radius:999px; background:var(--sg-grund);
  box-shadow:inset 0 1px 0 var(--glas-licht),0 0 8px var(--sb-tief),0 12px 24px -18px var(--sb-tief); }
#screen-blaetter #bl-zeile-akt::before{ background:var(--sg-grund); border-color:var(--sg-kante); }
:is(#screen-blaetter #bl-zeile-akt,#screen-pinnwand .pwh-pille) .bl-u-knopf{ border-radius:999px; transition:background .2s ease,box-shadow .2s ease,color .15s ease; }
html :is(#screen-blaetter #bl-zeile-akt,#screen-pinnwand .pwh-pille) .bl-u-knopf:not(.haupt):hover{ background:var(--sg-glas); box-shadow:var(--sg-hoch); color:var(--ink); }
:is(#screen-blaetter #bl-zeile-akt,#screen-pinnwand .pwh-pille) .bl-u-knopf:not(.haupt):active{ background:var(--sg-grund); box-shadow:var(--sg-tief); }

/* 6. Dateien: Suche eingelassen, Knöpfe erhaben, die Wahl links erhaben. */
#screen-materialien .da-search{ border:1px solid var(--sg-kante); border-radius:999px; background:var(--sg-grund); box-shadow:var(--sg-tief); }
#screen-materialien .da-search:focus-within{ border-color:color-mix(in srgb,var(--sg-akzent) 40%,var(--glas-kante)); }
#screen-materialien .da-toolbar-actions .da-button:not(.da-primary){ background:var(--sg-glas); border:1px solid var(--sg-kante);
  border-radius:999px; box-shadow:var(--sg-hoch); transition:box-shadow .2s ease,transform .2s var(--sg-weich); }
#screen-materialien .da-toolbar-actions .da-button:not(.da-primary):hover{ transform:translateY(-1px); box-shadow:var(--sg-hoch-mehr); background:var(--sg-glas); }
#screen-materialien .da-toolbar-actions .da-button:not(.da-primary):active{ transform:none; background:var(--sg-grund); box-shadow:var(--sg-tief); }
#screen-materialien .da-section.is-active{ background:var(--sg-glas); border-color:var(--sg-kante); border-radius:999px; box-shadow:var(--sg-hoch); }


/* 7. KLASSEN (v3.12.0, Murat: „aynı şeyi … klassen … içinde yap"). Die
   Leiste oben wie die Reiter der Sammlung: keine farbigen Kreise, kein
   Grund; die OFFENE Gruppe liegt auf der Neumorphismus-Pille. Die Bewegung
   der Gruppen (Mini-Zeichen beim Zeigen) bleibt. Der Vorhang ist ein
   Schalter: zu = eingelassen. Die Klassenkarte links behält ihre Farbe
   (--kc), ihr Kreis ist ein Tropfen. Das Feld einer Gruppe (#kbl-feld, am
   <body>) und seine Werkzeuge sind erhabenes Glas. */
#screen-klassenbuch .kbx-head .kbl-platz{ border-radius:var(--r-card); padding:var(--s-1) var(--s-2) var(--s-1);
  transition:background .2s ease,box-shadow .2s ease; }
#screen-klassenbuch .kbx-head .kbl-platz .kbl-kreis{ background:transparent; box-shadow:none;
  color:color-mix(in srgb,var(--ink) 78%,var(--card)); }
#screen-klassenbuch .kbx-head .kbl-platz .kbl-kreis::after{ content:none; }
#screen-klassenbuch .kbx-head .kbl-platz .kbl-kreis svg{ filter:var(--sg-ikon-schatten); }
#screen-klassenbuch .kbx-head .kbl-platz .kbl-gross svg{ transition:transform 180ms var(--sg-weich); }
#screen-klassenbuch .kbx-head .kbl-platz:is(:hover,:focus-visible) .kbl-kreis{ transform:none; box-shadow:none; color:var(--ink); }
#screen-klassenbuch .kbx-head .kbl-stern:hover .kbl-gross svg{ animation:none; transform:translateY(-1px) scale(1.12); }
#screen-klassenbuch .kbx-head .kbl-gruppe:is(.auf,[aria-expanded="true"]){ background:var(--sg-wahl); box-shadow:var(--sg-wahl-schatten); }
#screen-klassenbuch .kbx-head .kbl-gruppe:is(.auf,[aria-expanded="true"]) .kbl-kreis{ color:var(--sg-wahl-ton); }
/* Das Auge steht so hoch wie sein Inhalt (v3.13.0, Murat: „verdeckt o buton
   biraz kötü duruyo"): die Gruppen sind wegen „Alle anzeigen" höher, und
   gestreckt war die Pille ein hoher, leerer Block. Zu = dieselbe Pille wie
   jede Wahl – das durchgestrichene Auge in Akzentschrift sagt, was gilt. */
#screen-klassenbuch .kbx-head .kbl-auge{ align-self:flex-start; }
#screen-klassenbuch .kbx-head .kbl-auge.zu{ background:var(--sg-wahl); box-shadow:var(--sg-wahl-schatten); }
#screen-klassenbuch .kbx-head .kbl-auge.zu .kbl-kreis{ color:var(--sg-wahl-ton); }
#screen-klassenbuch .kbx-head .kbx-karte{
  background:linear-gradient(180deg,var(--glas-licht),transparent 60%),color-mix(in srgb,var(--kc,var(--brand)) 6%,var(--card));
  border-color:color-mix(in srgb,var(--kc,var(--brand)) 18%,var(--glas-kante)); box-shadow:var(--sg-hoch);
  transition:border-color .18s ease,box-shadow .2s ease; }
#screen-klassenbuch .kbx-head .kbx-karte:hover{ box-shadow:var(--sg-hoch-mehr);
  border-color:color-mix(in srgb,var(--kc,var(--brand)) 34%,var(--glas-kante)); }
#screen-klassenbuch .kbx-chip-kreis{
  background:radial-gradient(circle at 35% 28%,color-mix(in srgb,var(--on-brand) 34%,transparent),transparent 46%),var(--kc,var(--brand)); }
#screen-klassenbuch .kbs-ana{ background:var(--sg-glas); border-color:var(--sg-kante); box-shadow:var(--sg-hoch);
  transition:box-shadow .2s ease,transform .2s var(--sg-weich),border-color .2s ease; }
#screen-klassenbuch .kbs-ana:hover{ transform:translateY(-1px); box-shadow:var(--sg-hoch-mehr); }
#screen-klassenbuch .kbs-ana:is(:active,[aria-pressed="true"]){ transform:none; background:var(--sg-grund); box-shadow:var(--sg-tief); }
.kbl-feld{ border-color:var(--sg-kante);
  box-shadow:inset 0 1px 0 var(--glas-licht),0 0 0 .5px var(--glas-kante),var(--glas-trage),0 0 14px -4px var(--sb-tief); }
.kbl-feld::before{ border-color:var(--sg-kante); }
.kbl-feld .kbl-feld-ico{
  background:radial-gradient(circle at 35% 28%,color-mix(in srgb,var(--on-brand) 34%,transparent),transparent 46%),var(--kbl-ton,var(--sg-akzent)); }
.kbl-feld .kbl-wz{ background:var(--sg-glas); border-color:var(--sg-kante); box-shadow:var(--sg-hoch);
  transition:box-shadow .2s ease,transform .2s var(--sg-weich),border-color .2s ease; }
.kbl-feld .kbl-wz:hover{ background:var(--sg-glas); transform:translateY(-1px); box-shadow:var(--sg-hoch-mehr);
  border-color:color-mix(in srgb,var(--kbl-ton,var(--sg-akzent)) 40%,var(--glas-kante)); }
.kbl-feld .kbl-wz:active{ transform:none; background:var(--sg-grund); box-shadow:var(--sg-tief); }
.kbl-feld .kbl-wz-ico{ background:var(--sg-grund); box-shadow:var(--sg-tief); }

/* 8. SCHLAUHEFT (v3.12.0): die Ansichtswahl ohne Kapsel, das wandernde Feld
   ist die kleine Neumorphismus-Pille; Blättern, „Heute" und die Planung
   erhaben; im Heft liegt das gewählte Werkzeug auf der Pille statt
   eingedrückt. ⛔ Monatsreiter, Ringe, Papier und Minimonat bleiben, wie
   sie sind – das ist das Heft, kein Menü. #kal-bar doppelt: die Leiste
   steht je nach Breite im Bildschirm oder in der Kopfzeile, und ihre
   älteren Regeln tragen schon eine Kennung. */
body.kal-titel-aus #kal-bar#kal-bar .kal-mitte{ background:transparent; border-color:transparent; box-shadow:none; }
body.kal-titel-aus #kal-bar#kal-bar .kal-seg.kal-views::before{ background:var(--sg-wahl); box-shadow:var(--sg-wahl-schatten-klein); }
body.kal-titel-aus #kal-bar#kal-bar .kal-seg.kal-views button.on{ color:var(--sg-wahl-ton); }
/* Die Trennstriche zwischen den Ansichten (index.html, `.kal-seg button +
   button::before`) gehörten zur Kapsel – ohne sie stünden sie frei herum. */
#kal-bar#kal-bar .kal-seg.kal-views button::before{ content:none; }
/* Ebenso der Aufklapp-Pfeil am Telefon (index.html, `.kal-seg:not(.auf)
   ::after`): seit v3.10.0 stehen alle vier Ansichten immer da, der Pfeil
   lag dabei auf „Jahr". */
#kal-bar#kal-bar .kal-seg.kal-views::after{ content:none; }
body.uh-schmaltag #kal-bar#kal-bar.kal-bar-links .kal-seg.kal-views button.on{ background:var(--sg-wahl); box-shadow:var(--sg-wahl-schatten-klein); }
#kal-bar#kal-bar #kal-btn-anpassen:hover{ background:var(--sg-glas); box-shadow:var(--sg-hoch); }
#screen-kalender #kal-btn-planung{ background:var(--sg-glas); border:1px solid var(--sg-kante); border-radius:999px;
  box-shadow:var(--sg-hoch); padding:6px 12px; transition:box-shadow .2s ease,transform .2s var(--sg-weich); }
#screen-kalender :is(#kal-btn-planung,.kal-blattern button):hover{ transform:translateY(-1px); background:var(--sg-glas); box-shadow:var(--sg-hoch-mehr); }
#screen-kalender :is(#kal-btn-planung,.kal-blattern button):active{ transform:none; background:var(--sg-grund); box-shadow:var(--sg-tief); }
#screen-kalender #kal-btn-planung.on{ background:var(--sg-wahl); box-shadow:var(--sg-wahl-schatten-klein); }
#screen-kalender .kal-blattern button{ background:var(--sg-glas); border:1px solid var(--sg-kante); color:var(--ink);
  box-shadow:var(--sg-hoch); transition:box-shadow .2s ease,transform .2s var(--sg-weich); }
#screen-kalender .kal-blattern .kal-zumheute{ border-radius:999px; padding:0 12px; color:var(--muted); }
#screen-kalender .sw-schale .hb-knopf.nur-icon.an{ background:var(--sg-wahl); box-shadow:var(--sg-wahl-schatten-klein); }
#screen-kalender .sw-schale .hb-knopf.nur-icon.an:not(.sw-laser){ color:var(--sg-wahl-ton); }
#screen-kalender .sw-schale .hb-knopf.nur-icon:not(.an):not(:disabled):hover{ background:var(--sg-glas); box-shadow:var(--sg-hoch); }
#screen-kalender .sw-schale .hb-knopf.nur-icon:active:not(:disabled){ background:var(--sg-grund); box-shadow:var(--sg-tief); }
#screen-kalender #kh-pano .kh-ib:hover{ color:var(--ink); background:var(--sg-glas); box-shadow:var(--sg-hoch); }
#screen-kalender #kh-pano .kh-ib:is(.on,[aria-expanded="true"]){ background:var(--sg-wahl); box-shadow:var(--sg-wahl-schatten-klein); color:var(--sg-wahl-ton); }

/* 9. PINNWAND-ÜBERSICHT: die Suche eingelassen wie in Dateien; die Pille
   rechts steht in Abschnitt 5. Die Pinnwand selbst (templates/pinnwand.html)
   ist ein eigenes Dokument und rechnet dieselben Rollen aus ihren Farben. */
#screen-pinnwand .pwh-search{ border:1px solid var(--sg-kante); border-radius:999px; background:var(--sg-grund); box-shadow:var(--sg-tief); }
#screen-pinnwand .pwh-search:focus-within{ background:var(--sg-grund); border-color:color-mix(in srgb,var(--sg-akzent) 40%,var(--glas-kante)); }

/* 10. DAS DREI-PUNKTE-MENÜ (v3.13.0) – ALLE `.kebab-menu` der App aus dieser
   einen Regel (Murat: „inhalt kısmı daha düzenli olsun … tek yerden
   besleniyo"): Aufgaben, Erklärblätter, Kurse, Cockpit-Widgets. Es schwebt
   über dem Inhalt, deshalb echtes Glas (Filter mit Rückfall). Ordnung: die
   Gruppen (Inhalt, Ordnung, Teilen, Ablage) als kleine Kopfzeilen mit Strich
   davor, jede Zeile gleich hoch und einzeilig, die Zeichen leise; beim
   Zeigen hebt sich die Zeile als Glaspille. */
.kebab-menu{ min-width:232px; padding:6px; border-radius:18px; border:1px solid var(--sg-kante);
  background:color-mix(in srgb,var(--card) 88%,transparent);
  -webkit-backdrop-filter:blur(18px) saturate(160%); backdrop-filter:blur(18px) saturate(160%);
  box-shadow:inset 0 1px 0 var(--glas-licht),0 0 0 .5px var(--glas-kante),var(--glas-trage),0 0 14px -4px var(--sb-tief); }
@supports not ((backdrop-filter:blur(1px)) or (-webkit-backdrop-filter:blur(1px))){ .kebab-menu{ background:var(--card); } }
.kebab-menu .km-grp{ font-size:10.5px; font-weight:750; letter-spacing:.07em; text-transform:uppercase;
  color:var(--muted); padding:8px 12px 4px; }
.kebab-menu .km-grp:not(:first-child){ margin-top:5px; padding-top:10px;
  border-top:1px solid color-mix(in srgb,var(--line) 75%,transparent); }
.kebab-menu button{ min-height:36px; padding:7px 12px; gap:11px; border-radius:12px; font-size:13.5px; font-weight:600;
  white-space:nowrap; transition:background .15s ease,box-shadow .15s ease,color .15s ease; }
.kebab-menu button svg{ color:var(--muted); transition:color .15s ease; }
.kebab-menu button:hover{ background:var(--sg-glas); box-shadow:var(--sg-hoch); }
.kebab-menu button:hover svg{ color:var(--sg-wahl-ton); }
.kebab-menu button.danger,.kebab-menu button.danger svg{ color:var(--bad); }
.kebab-menu button.danger:hover{ background:color-mix(in srgb,var(--bad) 8%,var(--card)); box-shadow:var(--sg-hoch); }
.kebab-menu .km-divider{ background:color-mix(in srgb,var(--line) 75%,transparent); }

/* 11. KLASSEN – AUFGEKLAPPTE ZEILE UND PROFIL EINES KINDES (v3.14.0). Murat
   16.10.2026: „bu klasın içinde … butonları da değiştirelim … profil
   öffnen … çocuğun profiline … yukarıdaki menü … içindeki tuşlar".
   Die Knöpfe sind erhabenes Glas; das ZEICHEN trägt die Farbe seiner
   Handlung (--ac aus _sAct/kbx-act), die Schrift bleibt ruhig. „Profil
   öffnen" ist die Wahl dieser Zeile: helle Pille, das Bild des Kindes in
   einer eingelassenen Mulde. Im Profil: die Fächer wie die Reiter oben
   (Pille, Farbe des Kindes als Schrift über --kb-chip-ton aus
   kbBuildFachBar), der Kopf eine feste Karte ohne Aufklappen (kbRender,
   .kbp-kopfkarte). Knöpfe in den Reitern nur unter #kb-content.kb-profil. */
#screen-klassenbuch .kbx-panel{ background:var(--sg-glas); border:1px solid var(--sg-kante); border-radius:var(--r-card);
  box-shadow:var(--sg-hoch); padding:var(--s-3) var(--s-4); }
#screen-klassenbuch .kbx-act{ height:34px; padding:0 var(--s-3); border:1px solid var(--sg-kante); border-radius:var(--r-pill);
  background:var(--sg-glas); box-shadow:var(--sg-hoch); color:var(--ink); font-weight:650;
  transition:box-shadow .2s ease,transform .2s var(--sg-weich),border-color .2s ease; }
#screen-klassenbuch .kbx-act svg{ color:var(--ac,var(--sg-akzent)); }
/* Das Zahnrad trägt nie ein Wort (v2.922.0) – als Zeichen allein ist es rund. */
#screen-klassenbuch .kbx-act.kbx-verw{ width:34px; padding:0; justify-content:center; }
#screen-klassenbuch .kbx-act.kbx-verw svg{ color:var(--ink); }
#screen-klassenbuch .kbx-act:is(:hover,:focus-visible){ transform:translateY(-1px); color:var(--ink); box-shadow:var(--sg-hoch-mehr);
  border-color:color-mix(in srgb,var(--ac,var(--sg-akzent)) 40%,var(--glas-kante)); }
#screen-klassenbuch .kbx-act:is(:active,.on,.kbx-an){ transform:none; color:var(--ink); background:var(--sg-grund); box-shadow:var(--sg-tief); }
#screen-klassenbuch .kbx-profcard{ gap:var(--s-1); padding:var(--s-3) var(--s-4); border:1px solid var(--sg-kante); border-radius:var(--r-card);
  background:var(--sg-wahl); box-shadow:var(--sg-wahl-schatten); transition:transform .2s var(--sg-weich),box-shadow .2s ease; }
#screen-klassenbuch .kbx-profcard:hover{ transform:translateY(-2px); box-shadow:var(--sg-wahl-schatten),0 16px 28px -18px var(--sb-tief); }
#screen-klassenbuch .kbx-profcard .kbx-pem{ width:48px; height:48px; display:grid; place-items:center; border-radius:50%;
  background:var(--sg-grund); box-shadow:var(--sg-tief); font-size:var(--fs-xl); filter:none; }
#screen-klassenbuch .kbx-profcard .kbx-plb{ background:none; -webkit-background-clip:border-box; background-clip:border-box;
  color:var(--sg-wahl-ton); }
#screen-klassenbuch .kb-fachscroll{ padding:var(--s-1) var(--s-1) var(--s-2); }
#screen-klassenbuch .kb-fachchip{ border:0; padding:var(--s-2) var(--s-3); border-radius:var(--r-pill); background:transparent; color:var(--muted);
  font-weight:650; transition:background .2s ease,box-shadow .2s ease,color .15s ease; }
#screen-klassenbuch .kb-fachchip:hover{ color:var(--ink); background:color-mix(in srgb,var(--card) 50%,transparent); }
#screen-klassenbuch .kb-fachchip.on{ background:var(--sg-wahl); box-shadow:var(--sg-wahl-schatten-klein);
  color:var(--kb-chip-ton,var(--sg-wahl-ton)); }
#screen-klassenbuch .kbp-kopfkarte{ margin-bottom:var(--s-3); border:1px solid var(--sg-kante); border-radius:var(--r-panel);
  background:var(--sg-glas); box-shadow:var(--sg-hoch); overflow:hidden; }
#screen-klassenbuch .kbp-kopf{ display:flex; align-items:center; gap:var(--s-3); padding:var(--s-3) var(--s-4) var(--s-2); }
#screen-klassenbuch .kbp-koerper{ padding:2px var(--s-4) var(--s-4); }
/* Der Weg zurück (v3.15.0): links vor den Fächern, rund wie das Zahnrad.
   Die eigene Zeile „‹ Zurück zur Klasse" darüber ist entfallen (kbRender). */
#screen-klassenbuch .kbp-fachzeile{ margin-bottom:var(--s-3); }
#screen-klassenbuch .kbp-zurueck{ flex:none; width:36px; height:36px; display:grid; place-items:center; padding:0;
  border:1px solid var(--sg-kante); border-radius:50%; background:var(--sg-glas); box-shadow:var(--sg-hoch); color:var(--ink);
  cursor:pointer; transition:box-shadow .2s ease,transform .2s var(--sg-weich),border-color .2s ease; }
#screen-klassenbuch .kbp-zurueck svg{ width:18px; height:18px; fill:none; stroke:currentColor; stroke-width:2.2;
  stroke-linecap:round; stroke-linejoin:round; }
#screen-klassenbuch .kbp-zurueck:is(:hover,:focus-visible){ transform:translateY(-1px); box-shadow:var(--sg-hoch-mehr);
  border-color:color-mix(in srgb,var(--sg-akzent) 30%,var(--glas-kante)); }
#screen-klassenbuch .kbp-zurueck:active{ transform:none; background:var(--sg-grund); box-shadow:var(--sg-tief); }
/* Die Reiter zeigen OFFENE Karten (v3.15.0) – kein Kopf mit Pfeil mehr,
   der Reiter ist schon die Wahl. Eine leise Fläche im Glas der Profilkarte. */
#kb-content.kb-profil .kbp-karte{ margin-bottom:var(--s-2); padding:var(--s-3) var(--s-4) var(--s-4); border:1px solid var(--sg-kante);
  border-radius:var(--r-card); background:color-mix(in srgb,var(--card) 62%,transparent); }
#screen-klassenbuch .kbp-note{ box-shadow:inset 0 1px 0 color-mix(in srgb,var(--on-brand) 38%,transparent),
  inset 0 -3px 6px -3px var(--sb-tief),0 6px 14px -8px var(--sb-tief); }
#kb-content.kb-profil :is(.kb-actbtn,.kbp-rechenweg,.btn.ghost,.lstd-trend-z){ border:1px solid var(--sg-kante);
  border-radius:var(--r-pill); background:var(--sg-glas); box-shadow:var(--sg-hoch);
  transition:box-shadow .2s ease,transform .2s var(--sg-weich),border-color .2s ease; }
#kb-content.kb-profil :is(.kb-actbtn,.kbp-rechenweg,.btn.ghost,.lstd-trend-z):not(.an):hover{ transform:translateY(-1px);
  box-shadow:var(--sg-hoch-mehr); border-color:color-mix(in srgb,var(--sg-akzent) 30%,var(--glas-kante)); }
#kb-content.kb-profil :is(.kb-actbtn,.kbp-rechenweg,.btn.ghost,.lstd-trend-z):active{ transform:none; background:var(--sg-grund); box-shadow:var(--sg-tief); }
#kb-content.kb-profil .lstd-trend-z.an{ background:var(--sg-wahl); box-shadow:var(--sg-wahl-schatten-klein);
  color:var(--sg-wahl-ton); border-color:transparent; }
#kb-content.kb-profil .btn:not(.ghost):not(.danger){ border-radius:var(--r-pill); color:var(--on-brand);
  background:var(--sg-tropfen-breit); border:1px solid color-mix(in srgb,var(--on-brand) 24%,transparent);
  box-shadow:var(--sg-tropfen-schatten); transition:box-shadow .2s ease,transform .2s var(--sg-weich); }
#kb-content.kb-profil .btn:not(.ghost):not(.danger):hover{ transform:translateY(-1px); filter:none; }
#kb-content.kb-profil .btn:not(.ghost):not(.danger):active{ transform:scale(.97); box-shadow:inset 1px 2px 5px var(--sb-tief); }
#kb-content.kb-profil .icon-act{ width:36px; height:36px; border:1px solid var(--sg-kante); border-radius:50%;
  background:var(--sg-glas); box-shadow:var(--sg-hoch); color:var(--muted);
  transition:box-shadow .2s ease,transform .2s var(--sg-weich),color .15s ease; }
#kb-content.kb-profil .icon-act svg{ width:17px; height:17px; }
#kb-content.kb-profil .icon-act:hover{ transform:translateY(-1px); background:var(--sg-glas); color:var(--ink); box-shadow:var(--sg-hoch-mehr);
  border-color:color-mix(in srgb,var(--sg-akzent) 30%,var(--glas-kante)); }
#kb-content.kb-profil .icon-act.danger:hover{ color:var(--bad); border-color:color-mix(in srgb,var(--bad) 35%,transparent); }
#kb-content.kb-profil .lstd-in{ border:1px solid var(--sg-kante); border-radius:var(--r-pill); background:var(--sg-grund); box-shadow:var(--sg-tief); }

/* 12. REITER IN KARTEN (.kbp-tabs) – überall aus dieser Regel: Profil eines
   Kindes, Lernstand und Förderplan darin, das Kind in der Schulverwaltung
   (Murat: „alttaki sayfa sekmeleri garip, yeni çözümler lazım"). Statt
   Unterstrich und grauem Kasten eine ruhige Reihe; die Wahl ist die kleine
   Neumorphismus-Pille wie die Ansicht im SchlauHeft. Die Reihe bricht nie
   um – zu viele Reiter rollen (Padding lässt den Schatten stehen). */
.kbp-tabs{ gap:var(--s-1); padding:var(--s-1) var(--s-1) var(--s-2); margin-bottom:var(--s-2); border-bottom:0; overflow-x:auto; scrollbar-width:none; }
.kbp-tabs::-webkit-scrollbar{ display:none; }
.kbp-tabs .kbp-tab{ flex:0 0 auto; padding:var(--s-2) var(--s-4); border:0; border-radius:var(--r-pill); background:transparent;
  color:var(--muted); font-weight:650; overflow:visible; transition:background .2s ease,box-shadow .2s ease,color .15s ease; }
.kbp-tabs .kbp-tab:hover{ color:var(--ink); background:color-mix(in srgb,var(--card) 50%,transparent); }
.kbp-tabs .kbp-tab.an{ background:var(--sg-wahl); box-shadow:var(--sg-wahl-schatten-klein); color:var(--sg-wahl-ton); }

/* 13. DAS SCHUBFACH „VERWALTEN" (.kbv – das Zahnrad an Klasse und Kind).
   Glas über dem abgedunkelten Bildschirm (Filter mit Rückfall), der Kopf
   bleibt beim Rollen lesbar, jeder Eintrag hebt sich beim Zeigen als
   Glaspille, die Zeichen liegen in eingelassenen Mulden. */
.kbv{ background:color-mix(in srgb,var(--card) 90%,transparent); border-left:1px solid var(--sg-kante);
  -webkit-backdrop-filter:blur(20px) saturate(160%); backdrop-filter:blur(20px) saturate(160%);
  box-shadow:inset 1px 0 0 var(--glas-licht),-18px 0 48px -12px var(--sb-tief); }
@supports not ((backdrop-filter:blur(1px)) or (-webkit-backdrop-filter:blur(1px))){ .kbv{ background:var(--card); } }
.kbv-kopf{ background:color-mix(in srgb,var(--card) 94%,transparent); border-bottom-color:color-mix(in srgb,var(--line) 70%,transparent); }
.kbv-zu{ border:1px solid var(--sg-kante); border-radius:50%; background:var(--sg-glas); box-shadow:var(--sg-hoch);
  transition:box-shadow .2s ease,color .15s ease; }
.kbv-zu:hover{ color:var(--ink); border-color:color-mix(in srgb,var(--sg-akzent) 30%,var(--glas-kante)); box-shadow:var(--sg-hoch-mehr); }
.kbv-grp + .kbv-grp{ border-top-color:color-mix(in srgb,var(--line) 75%,transparent); }
.kbv-item{ border-radius:var(--r-card); transition:background .15s ease,box-shadow .15s ease,border-color .15s ease; }
.kbv-item:hover{ background:var(--sg-glas); border-color:var(--sg-kante); box-shadow:var(--sg-hoch); }
.kbv-ico{ width:32px; height:32px; border-radius:50%; background:var(--sg-grund); box-shadow:var(--sg-tief); }
.kbv-item.gefahr:hover{ background:color-mix(in srgb,var(--bad) 7%,var(--card)); box-shadow:var(--sg-hoch);
  border-color:color-mix(in srgb,var(--bad) 35%,transparent); }

/* 14. DAS FENSTER „BEWERTEN" – ENDNOTE, RECHENWEG, GEWICHTUNG (v3.15.0).
   Murat: „bewerten dediğimde o aşağıdakilerin hepsine ulaşabilmeliyim".
   Was bis v3.14.0 im Reiter „Bewertungen" stand, liegt unter der
   Notenzeile (bewEndnoteZeichne): die Endnote in einer eingelassenen
   Mulde, die Knöpfe als Glaspillen wie im Profil, die Hinweise leise. */
.bew-endnote:empty{ display:none; }
.bew-endnote{ margin:var(--s-2) 0 var(--s-1); padding:var(--s-3) var(--s-4); border:1px solid var(--sg-kante);
  border-radius:var(--r-card); background:var(--sg-grund); box-shadow:var(--sg-tief); }
.bew-endnote-kopf{ display:flex; align-items:center; flex-wrap:wrap; gap:var(--s-2) var(--s-3); }
.bew-endnote-titel{ font-weight:700; font-size:var(--fs-sm); color:var(--ink); }
.bew-endnote-wert{ font-weight:800; font-size:var(--fs-sm); white-space:nowrap; }
.bew-endnote-leer{ color:var(--muted); font-size:var(--fs-xs); }
.bew-endnote-knoepfe{ display:inline-flex; flex-wrap:wrap; gap:var(--s-2); margin-left:auto; }
.bew-endnote :is(.kb-actbtn,.kbp-rechenweg){ flex:none; width:auto; margin:0; padding:var(--s-1) var(--s-3); min-height:32px;
  flex-direction:row; font-size:var(--fs-xs); font-weight:700; border:1px solid var(--sg-kante); border-radius:var(--r-pill);
  background:var(--sg-glas); box-shadow:var(--sg-hoch); transition:box-shadow .2s ease,transform .2s var(--sg-weich),border-color .2s ease; }
.bew-endnote :is(.kb-actbtn,.kbp-rechenweg):hover{ transform:translateY(-1px); box-shadow:var(--sg-hoch-mehr);
  border-color:color-mix(in srgb,var(--sg-akzent) 30%,var(--glas-kante)); }
.bew-endnote :is(.kb-actbtn,.kbp-rechenweg):active{ transform:none; background:var(--sg-grund); box-shadow:var(--sg-tief); }
.bew-endnote a.kb-actbtn{ color:var(--ink); text-decoration:none; white-space:nowrap; }
.bew-hinweis{ margin-top:var(--s-2); color:var(--muted); font-size:var(--fs-xs); line-height:1.45; }

@media (max-width:640px){
  /* Telefon: dieselbe Kapsel, volle Breite, alle sechs passen nebeneinander. */
  .sam-reiter{ --sam-oben:6px; padding:var(--sam-oben) 4px; gap:2px; justify-content:space-between; margin-bottom:6px; }
  .sam-reiter .adm-tab.sam-tab{ width:auto; min-width:0; flex:1 1 0; padding:6px 0 5px; gap:3px; border-radius:14px; }
  .sam-reiter .adm-tab.sam-tab .kbl-kreis{ width:20px; height:20px; }
  .sam-reiter .adm-tab.sam-tab .kbl-gross svg{ width:17px; height:17px; }
  .sam-reiter .sam-linse{ border-radius:14px; }
  #dash-toolbar .dtb-neu, #kur-toolbar .dtb-neu{ width:36px; height:36px; }
  /* Klassen: am Telefon stehen die Knöpfe nur als Zeichen (.kbx-actlbl aus) –
     dann rund statt als leere Pille. */
  #screen-klassenbuch .kbx-act{ width:34px; padding:0; justify-content:center; }
  /* Klassen: die Namen fehlen am Telefon – die Pille bleibt knapp. */
  #screen-klassenbuch .kbx-head .kbl-platz{ padding:3px 2px 2px; border-radius:var(--r-control); }
}
@media (prefers-reduced-motion:reduce){
  .sam-reiter .sam-linse{ transition:opacity .18s ease; }
  .sam-reiter .adm-tab.sam-tab .kbl-gross svg{ transition:none; }
  :is(#screen-dashboard,#screen-erklaerblatt,#screen-blaetter,#screen-kurse,#screen-materialien,#screen-boerse,#screen-pinnwand,#screen-klassenbuch,#screen-kalender) :is(.dtb-btn,.dash-search-inline,.dtb-neu,.dqd-haupt,.dqd-ico,.dqd-dl-btn,.eb-ik,.dq-dl-b,.bl-u-knopf,.da-button,.kbl-platz,.kbl-gross svg,.kbx-karte,.kbs-ana,#kal-btn-planung,.kal-blattern button){ transition:none; }
  .kbl-feld .kbl-wz{ transition:none; }
  .kebab-menu button,.kebab-menu button svg{ transition:none; }
  #screen-klassenbuch :is(.kbx-act,.kbx-profcard,.kb-fachchip),#kb-content.kb-profil :is(.kb-actbtn,.kbp-rechenweg,.btn,.lstd-trend-z,.icon-act),.kbp-tabs .kbp-tab,.kbv-item,.kbv-zu{ transition:none; }
  #screen-klassenbuch .kbp-zurueck,.bew-endnote :is(.kb-actbtn,.kbp-rechenweg){ transition:none; }
}

/* ===== ESCAPE-MODUS (docs/PLAN_ESCAPE_DIGITAL.md §4, v2.719.0) ==============
   ⛔ DIESER BLOCK STEHT BEWUSST GANZ UNTEN UND REICHT BIS ZUM DATEIENDE.
   qa/unit/test_escape_modus.py liest ab hier JEDEN Selektor und verlangt,
   dass er an body.has-escape haengt. Neue Regeln, die nichts mit dem
   Escape-Modus zu tun haben, gehoeren DAVOR - nicht ans Ende.
   Der Quiz-Bildschirm der Kinder als Träger: alles hier lebt unter
   body.has-escape und nimmt seine Farben aus dem Quiz-Thema (--q*). Es gibt
   keine eigene Farbwelt und keinen zweiten Fragezeichner - die Szene deckt
   Frage, Antworten und Tasten nur zu (.esc-weg), sie ersetzt sie nicht. */
body.has-escape .esc-weg{display:none !important;}
body.has-escape #screen-quiz .esc-leiste{display:flex;flex-wrap:wrap;gap:6px;justify-content:center;padding:8px 4px 2px;}
body.has-escape .esc-zeichen{width:34px;height:40px;border-radius:9px;display:inline-flex;align-items:center;justify-content:center;
  font-weight:900;font-size:20px;letter-spacing:.5px;color:var(--qmut,var(--muted));
  border:1.5px solid color-mix(in srgb,var(--qbd,var(--brand)) 55%,transparent);
  background:color-mix(in srgb,var(--qopt,var(--card)) 70%,var(--qcard,var(--card)));}
body.has-escape .esc-zeichen.da{background:linear-gradient(135deg,var(--qbd,var(--brand)),var(--qacc,var(--brand)));
  color:var(--qcard,var(--card));border-color:transparent;box-shadow:var(--qglow,none);}
body.has-escape .esc-zeichen.neu{animation:esc-pop .5s ease-out;}
@keyframes esc-pop{0%{transform:scale(.4);opacity:0}70%{transform:scale(1.15)}100%{transform:scale(1);opacity:1}}
body.has-escape .esc-leiste-gross{margin:6px 0 14px;}
body.has-escape .esc-leiste-gross .esc-zeichen{width:44px;height:52px;font-size:26px;}
body.has-escape .esc-szene{padding:4px 2px 12px;color:var(--qink,var(--ink));}
body.has-escape .esc-szene.esc-an{animation:esc-ein .35s ease-out;}
@keyframes esc-ein{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}
body.has-escape .esc-kopf{font-size:12px;letter-spacing:.14em;text-transform:uppercase;font-weight:800;color:var(--qacc,var(--brand));}
body.has-escape .esc-szene h2{font-size:clamp(22px,4vw,34px);margin:6px 0 12px;line-height:1.15;color:var(--qink,var(--ink));}
body.has-escape .esc-dialog{display:flex;gap:14px;align-items:flex-start;padding:14px 16px;border-radius:16px;
  background:color-mix(in srgb,var(--qopt,var(--card)) 55%,var(--qcard,var(--card)));
  border:1.5px solid color-mix(in srgb,var(--qbd,var(--brand)) 45%,transparent);box-shadow:var(--qglow,none);}
body.has-escape .esc-robi{width:72px;height:72px;flex:none;border-radius:50%;object-fit:cover;
  background:color-mix(in srgb,var(--qacc,var(--brand)) 20%,transparent);}
body.has-escape .esc-wer{font-size:12px;font-weight:800;letter-spacing:.12em;text-transform:uppercase;margin-bottom:4px;color:var(--qacc,var(--brand));}
body.has-escape .esc-dialog p{margin:0;font-size:clamp(15px,2.2vw,18px);line-height:1.5;color:var(--qink,var(--ink));}
body.has-escape .esc-fundstueck{margin-top:12px;padding:10px 14px;border-radius:0 12px 12px 0;white-space:pre-line;
  border-left:4px solid var(--qacc,var(--brand));background:color-mix(in srgb,var(--qacc,var(--brand)) 12%,transparent);
  color:var(--qink,var(--ink));font-size:15px;line-height:1.5;}
body.has-escape .esc-quelle{margin-top:8px;font-size:13px;color:var(--qmut,var(--muted));}
body.has-escape .esc-tasten{display:flex;gap:10px;flex-wrap:wrap;margin-top:16px;align-items:center;}
body.has-escape .esc-tasten.esc-mitte{justify-content:center;}
body.has-escape .esc-btn{display:inline-flex;align-items:center;justify-content:center;min-height:44px;padding:11px 20px;border:0;border-radius:12px;
  font:inherit;font-weight:800;font-size:16px;cursor:pointer;color:var(--qcard,var(--card));
  background:linear-gradient(135deg,var(--qbd,var(--brand)),var(--qacc,var(--brand)));box-shadow:var(--qglow,none);}
body.has-escape .esc-btn.zweit{background:transparent;color:var(--qink,var(--ink));box-shadow:none;
  border:1.5px solid color-mix(in srgb,var(--qbd,var(--brand)) 55%,transparent);}
body.has-escape .esc-btn:focus-visible,body.has-escape .esc-topbtn:focus-visible{outline:3px solid var(--qacc,var(--brand));outline-offset:2px;}
body.has-escape .esc-ic{width:18px;height:18px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;
  vertical-align:-3px;margin-right:6px;flex:none;}
body.has-escape .esc-gross{width:64px;height:64px;stroke-width:1.6;margin:0 auto 8px;display:block;color:var(--qacc,var(--brand));}
body.has-escape .esc-zeichen-gross{font-size:clamp(48px,10vw,84px);font-weight:900;line-height:1;margin:4px 0 14px;
  color:var(--qacc,var(--brand));text-shadow:var(--qglow,none);}
body.has-escape #qexplain.esc-zu{border-color:var(--bad) !important;color:var(--qink,var(--ink)) !important;
  background:color-mix(in srgb,var(--bad) 16%,var(--qcard,var(--card))) !important;}
body.has-escape #qexplain.esc-zu b{color:var(--qink,var(--ink)) !important;}
/* DER TIPP (C16): gruen, weil er hilft - im Gegensatz zur roten Tuer. Er
   steht unter der Rueckmeldung und verschwindet mit der naechsten Frage. */
body.has-escape .esc-tipp{margin:10px 0 0;padding:12px 14px;border-radius:12px;
  border:2px solid var(--ok);color:var(--qink,var(--ink));
  background:color-mix(in srgb,var(--ok) 18%,var(--qcard,var(--card)));}
body.has-escape .esc-tipp b{color:var(--qink,var(--ink));}
body.has-escape .esc-tipp .esc-tipp-note{opacity:.85;font-size:14px;}
body.has-escape .esc-tipp .esc-tipp-btn{margin-top:8px;display:inline-flex;align-items:center;gap:6px;
  font:inherit;font-weight:700;cursor:pointer;padding:8px 14px;border-radius:10px;
  border:2px solid var(--ok);color:var(--qink,var(--ink));background:transparent;}
body.has-escape .esc-tipp .esc-tipp-btn:hover{background:color-mix(in srgb,var(--ok) 28%,transparent);}
body.has-escape .esc-schloss{text-align:center;}
body.has-escape .esc-schloss input{font:inherit;font-size:28px;font-weight:800;letter-spacing:.35em;text-transform:uppercase;text-align:center;
  width:min(100%,14ch);padding:10px 12px;border-radius:12px;background:var(--qopt,var(--card));color:var(--qink,var(--ink));
  border:2px solid color-mix(in srgb,var(--qbd,var(--brand)) 60%,transparent);}
body.has-escape .esc-schloss input.ans-bad{border-color:var(--bad);}
body.has-escape .esc-fund{margin:0 0 12px;padding:12px 14px;border-radius:14px;color:var(--qink,var(--ink));
  background:color-mix(in srgb,var(--qopt,var(--card)) 55%,var(--qcard,var(--card)));
  border:1.5px solid color-mix(in srgb,var(--qbd,var(--brand)) 45%,transparent);}
body.has-escape .esc-fund-kopf{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:8px;}
body.has-escape .esc-fund h3{margin:0;font-size:15px;display:flex;align-items:center;color:var(--qacc,var(--brand));}
body.has-escape .esc-fund-teil{margin:0 0 12px;font-size:14px;line-height:1.45;}
body.has-escape .esc-fund-teil b{display:block;margin-bottom:4px;}
body.has-escape .esc-fund ul{margin:0;padding-left:18px;}
body.has-escape .esc-fund p{margin:0 0 6px;}
body.has-escape .esc-fund table{border-collapse:collapse;width:100%;font-size:13px;}
body.has-escape .esc-fund td,body.has-escape .esc-fund th{padding:4px 8px;text-align:left;vertical-align:top;
  border:1px solid color-mix(in srgb,var(--qbd,var(--brand)) 35%,transparent);}
body.has-escape .esc-seite{display:inline-block;font-size:11px;font-weight:800;padding:1px 7px;border-radius:99px;margin-left:6px;vertical-align:middle;
  background:var(--qacc,var(--brand));color:var(--qcard,var(--card));}
body.has-escape .esc-topbtn{display:inline-flex;align-items:center;justify-content:center;width:34px;height:30px;padding:0;cursor:pointer;
  background:transparent;border-radius:9px;color:var(--qink,var(--ink));font:inherit;font-weight:800;
  border:1.5px solid color-mix(in srgb,var(--qbd,var(--brand)) 55%,transparent);}
body.has-escape .esc-topbtn svg{width:16px;height:16px;margin:0;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;}
body.has-escape .esc-topbtn-text{width:auto;padding:0 10px;gap:6px;white-space:nowrap;}
body.has-escape .esc-topbtn-gefahr{color:var(--bad);border-color:color-mix(in srgb,var(--bad) 55%,transparent);}
/* Musik aus (C15): Lucide hat kein „music-off" - der Schalter bleibt die Note,
   blass und mit dem Querstrich, den jedes Aus-Symbol traegt. Kein <path> von
   Hand: der Strich ist ein Rahmenstueck des Knopfes. */
body.has-escape .esc-topbtn{position:relative;}
/* Die Raumsteuerung als Gruppe: bricht die Kopfzeile um, wandert sie
   zusammen nach rechts in die zweite Zeile statt einzeln. Ohne Escape-Modus
   ist die Huelle fuer das Layout nicht da (.quiz-topbar .esc-topgruppe oben
   bei der Kopfleiste - hier unten steht nur, was unter body.has-escape lebt). */
body.has-escape .esc-topgruppe{display:inline-flex;align-items:center;gap:8px;flex:none;margin-left:auto;}
body.has-escape .esc-topbtn.aus svg{opacity:.45;}
body.has-escape .esc-topbtn.aus::after{content:"";position:absolute;left:50%;top:50%;width:20px;height:2px;border-radius:2px;
  background:currentColor;transform:translate(-50%,-50%) rotate(-45deg);}
#ls-digital-btn,#ls-teilen-btn{flex:1;min-width:180px;}
#ls-digital-btn svg,#ls-teilen-btn svg{width:17px;height:17px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;vertical-align:-3px;margin-right:6px;}
/* TEILEN-SEITE MIT EINEM ESCAPE-ROOM (v2.732.0, shareEscapeSetzen): dieselbe
   Seite wie beim Quiz - Code, Link, Klasse, Start-Sperre, Reflexion, Selbst
   testen, Ergebnisse. Weg ist nur, was einen Escape-Room nicht betrifft:
   Design (das Thema stellt die Kulisse), Zeit pro Frage (kein Countdown,
   Plan §7), Belohnungsspiel (der Raum IST die Belohnung), Rennen und der
   Arbeitsblatt-Export (gedruckt wird der Raum ueber die Materialkarte). */
body.share-escape #sat-design,body.share-escape #sat-zeit,body.share-escape #sat-spiel,
body.share-escape #sat-rennen,body.share-escape #krnn-panel,body.share-escape #share-tile-export,
body.share-escape #qr-youtube{display:none !important;}
/* Der Umschalter steht nur auf der Teilen-Seite eines Escape-Rooms
   (versteckt wird er oben, vor dem Escape-Abschnitt - siehe dort). */
body.share-escape #share-darstellung{display:flex;align-items:center;justify-content:center;
  gap:10px;flex-wrap:wrap;margin:6px 0 2px;}
body.share-escape #share-darstellung .sd-lbl{font-weight:700;color:var(--ink);}
body.share-escape #share-darstellung .sd-note{color:var(--muted);font-size:13px;}
body.share-escape #share-darstellung .sd-note.warn{color:var(--bad-ink);font-weight:600;}
/* „Stationen bearbeiten" (B1) ist ein Satellit in der Spalte der
   Handlungen, unter „Ergebnisse" - auch nur hier (Anweisung Murat
   26.09.2026). Farbe wie die Szenen des Escape-Rooms: Violett. */
body.share-escape #share-esc-bearb-btn{display:flex;--sat:var(--violett);--sat-soft:var(--violett-soft);}
@media (prefers-reduced-motion: reduce){
  body.has-escape .esc-szene.esc-an,body.has-escape .esc-zeichen.neu{animation:none;}
}
@media (max-width:640px){
  body.has-escape .esc-robi{width:52px;height:52px;}
  body.has-escape .esc-dialog{padding:12px;gap:10px;}
  body.has-escape .esc-btn{width:100%;}
  body.has-escape .esc-zeichen{width:30px;height:36px;font-size:18px;}
  /* Mit dem Musik-Schalter (C15) passt die Kopfzeile auf 360 px nur ohne
     „0 richtig" in eine Reihe - den Fortschritt zeigt im Raum ohnehin die
     Zeichenleiste direkt darunter. Nur schmal, nur im Escape-Modus. */
  body.has-escape #screen-quiz #qscore{display:none;}
}
/* Kulisse (C6): feste Leinwand hinter der Quiz-Karte, unter .wrap (z-index 1),
   ueber dem Themen-Verlauf (body::before, z-index 0, frueher im DOM). */
body.has-escape #esc-kulisse{position:fixed;inset:0;z-index:0;pointer-events:none;width:100%;height:100%;}
body.has-escape:not([data-screen="quiz"]):not([data-screen="student-welcome"]) #esc-kulisse{display:none;}
/* DIE BEGEHBARE WELT (PLAN_ESCAPE_WELTEN W2.3): sie steht an derselben
   Stelle wie die Kulisse - aber sie ist ANTIPPBAR, denn hier laeuft die
   Figur. Die Szene (#esc-szene) liegt darueber; waehrend sie steht, ist die
   Welt nur Hintergrund. Die Kulisse bleibt DAHINTER an (v2.752.0, Ansage
   Murat: „arkasi bombos"): Namensbild, Einstieg und Schloss zeigen die
   Kulisse des Themas, der Raum liegt wie ein Spielbrett darauf. Die Kulisse
   zeichnet hinter der Welt nur jedes dritte Bild (escape-buehne.js); das
   Dokument haengt sie VOR #esc-welt ein, beide stehen auf z-index 0. */
body.has-escape #esc-welt{position:fixed;inset:0;z-index:0;display:grid;place-items:center;}
/* WER DEN TIPP BEKOMMT (am Bildschirm nachgemessen): die Welt liegt unter
   `.wrap` (z-index 1) - ein Klick auf den Raum landete deshalb im leeren
   Quiz-Kasten daruber, obwohl dort nichts zu sehen war. Solange das Kind IM
   RAUM steht (body.welt-frei), reicht der Quiz-Bildschirm die Tipps durch;
   Kopfleiste und „Raum verlassen" bleiben bedienbar, und sobald eine Szene
   oder die Frage steht, gilt wieder alles wie sonst. */
body.has-escape.welt-frei .wrap{pointer-events:none;}
body.has-escape.welt-frei .quiz-topbar,
body.has-escape.welt-frei .quiz-topbar *,
body.has-escape.welt-frei #qabort,
body.has-escape.welt-frei #esc-fund{pointer-events:auto;}
body.has-escape.welt-frei #esc-welt{pointer-events:auto;}
/* DAS OFFENE FUNDBLATT ROLLT AUCH AM TABLET (v2.843.0, Befund Murat
   25.09.2026: „fundblatt i aciyom … okuyamiyom yani asagi kaydiramiyom").
   Im Raum nimmt `.quiz-koerper` keinen Zeiger (Regel oben) - nur das
   Fundblatt darin nahm ihn. Gerollt wird aber `.quiz-koerper`, nicht das
   Fundblatt: am Computer folgt das Mausrad dem Baum nach oben und rollt
   trotzdem, Safari auf dem iPad rollt einen Bereich OHNE Zeiger mit dem
   Finger nicht, auch wenn das Kind darin tippt. Solange das Fundblatt offen
   ist, nimmt der Rollbereich deshalb den Finger (Klasse `esc-fund-offen`,
   escFundToggle). Der Raum dahinter ist in dieser Zeit ohnehin verdeckt;
   nach dem Schliessen gehoeren die Tipps wieder ihm. */
body.has-escape.welt-frei.esc-fund-offen #screen-quiz .quiz-koerper{pointer-events:auto;}
body.has-escape #esc-welt canvas{display:block;cursor:pointer;
  border-radius:12px;box-shadow:0 18px 50px hsl(230 40% 4% / .55);}
/* HARTE KANTEN NUR IN DER PIXELWELT. Die Leinwand ist dort ein ganzes
   Vielfaches von 16 px und wird auf die Breite GESTRECKT - ohne `pixelated`
   waere sie matschig. In 3D ist genau das falsch: dort glaettet die
   Grafikkarte, und `pixelated` wuerde die Kanten treppig machen. */
body.has-escape #esc-welt.pixel canvas{image-rendering:pixelated;}
/* DIE KLEINE DREHUNG (3D, v2.758.0): seitwaerts ziehen dreht die Kamera
   (escape-welt-3d.js drehungEinrichten). `pan-y` laesst dem Browser das
   senkrechte Blaettern - sonst haengt die Seite am Finger fest. */
body.has-escape #esc-welt:not(.pixel) canvas{touch-action:pan-y;}
body.has-escape:not([data-screen="quiz"]) #esc-welt{display:none;}
body.has-escape #esc-welt.ruht canvas{cursor:default;}
/* DIE STATIONSLISTE (Plan §5.6): der Weg ohne Maus und ohne Sehen. Sie zeigt
   dieselben Zustaende wie der Raum - gesperrt bleibt gesperrt - und steht
   unter der Welt, damit sie nichts verdeckt (Lehre der Stilprobe: die
   Zeichenleiste lag ueber dem Tor). */
body.has-escape #esc-welt-liste{position:absolute;left:0;right:0;bottom:calc(58px + env(safe-area-inset-bottom));
  display:flex;justify-content:center;flex-wrap:wrap;gap:6px;padding:0 12px;}
body.has-escape .esc-welt-station{font:600 13px/1 inherit;border-radius:999px;padding:8px 12px;min-height:34px;
  border:1px solid hsl(45 60% 70% / .5);background:hsl(230 30% 12% / .72);color:hsl(45 90% 88%);cursor:pointer;}
body.has-escape .esc-welt-station.aktiv{background:hsl(45 90% 60%);color:hsl(230 40% 12%);border-color:transparent;}
body.has-escape .esc-welt-station.geloest{opacity:.75;}
body.has-escape .esc-welt-station[disabled]{cursor:default;opacity:.5;}
/* DIE SPRECHBLASE DER FIGUR IM RAUM (v2.746.1). Sie erscheint, wenn das Kind
   die Figur antippt, und geht von selbst wieder weg - sie haelt das Spiel
   nicht an. Sie steht UNTEN, nicht ueber der Mitte: dort liegt der Raum, und
   die Lehre der Stilprobe war, dass nichts das wichtigste Objekt verdeckt. */
body.has-escape #esc-welt-blase{position:absolute;left:50%;transform:translate(-50%,8px);
  bottom:calc(104px + env(safe-area-inset-bottom));max-width:min(560px,90%);z-index:2;
  padding:10px 14px;border-radius:14px;border:1px solid hsl(45 60% 70% / .45);
  background:hsl(230 32% 12% / .92);color:hsl(45 90% 92%);
  box-shadow:0 10px 28px hsl(230 40% 4% / .5);
  opacity:0;pointer-events:none;transition:opacity .18s ease,transform .18s ease;}
body.has-escape #esc-welt-blase.da{opacity:1;transform:translate(-50%,0);}
body.has-escape #esc-welt-blase .esc-wer{font:700 11px/1.3 inherit;letter-spacing:.08em;
  text-transform:uppercase;color:hsl(35 90% 68%);margin-bottom:2px;}
body.has-escape #esc-welt-blase p{margin:0;font-size:15px;line-height:1.45;}
/* OHNE ZWEITES BRUSTBILD: in einer Welt steht die Gestalt im Raum, die Szene
   traegt nur die Blase - sonst sieht man dieselbe Person zweimal und in zwei
   verschiedenen Stilen. */
body.has-escape .esc-dialog.esc-nur-blase{display:block;}
body.has-escape .esc-dialog.esc-nur-blase .esc-blase{margin-left:0;}
/* DAS BILDNIS (v2.752.0): in 3D steht neben der Blase die Figur des Raums,
   klein und nah, in einer eigenen Leinwand (escape-welt-3d.js). Derselbe
   Platz und derselbe Schatten wie die gezeichnete Figur der Buehne. */
body.has-escape .esc-dialog.esc-mit-bildnis{display:flex;align-items:flex-end;}
body.has-escape .esc-bildnis{flex:none;width:clamp(84px,14vw,150px);aspect-ratio:4/5;
  filter:drop-shadow(0 10px 14px rgba(0,0,0,.35));}
body.has-escape .esc-bildnis canvas{display:block;width:100%;height:100%;}

/* ===== DER INSPEKTOR (v2.799.0, docs/PLAN_ESCAPE_LEBENDIG.md §1) ============
   Der Gegenstand der Station, gross und drehbar, vor allem anderen. Er liegt
   ueber dem Raum UND ueber der Frage - fuer die Dauer eines Handgriffs ist er
   das Einzige, was zaehlt; deshalb eine eigene Schicht und kein Platz in der
   Szene.

   `touch-action:none` ist hier PFLICHT und der Unterschied zur Welt: am Raum
   steht `pan-y`, damit der Finger die Seite weiterblaettern kann. Hier soll
   er drehen - senkrecht wie waagerecht. Ohne diese Zeile dreht sich auf dem
   Telefon nur die halbe Achse.

   Kein Schliessen-Knopf: der Ausgang ist der Punkt, und wenn er nicht
   gefunden wird, oeffnet escape-inspektor.js die Frage nach zwoelf Sekunden
   von selbst (Plan §1.3). Ein Knopf daneben waere die Einladung, den
   Handgriff zu ueberspringen. */
body.has-escape #esc-inspektor{position:fixed;inset:0;z-index:60;
  display:grid;grid-template-rows:1fr auto;place-items:center;gap:14px;
  padding:calc(18px + env(safe-area-inset-top)) 18px calc(26px + env(safe-area-inset-bottom));
  background:hsl(230 38% 6% / .82);backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);
  opacity:0;transition:opacity .18s ease;}
body.has-escape #esc-inspektor.da{opacity:1;}
body.has-escape #esc-inspektor .esc-insp-buehne{width:min(72vh,86vw);aspect-ratio:1;
  align-self:center;border-radius:20px;
  background:radial-gradient(circle at 50% 42%,hsl(45 60% 70% / .14),transparent 68%);}
body.has-escape #esc-inspektor canvas{display:block;width:100%;height:100%;
  touch-action:none;cursor:grab;}
body.has-escape #esc-inspektor .esc-insp-wort{max-width:min(520px,92vw);margin:0;text-align:center;
  font-size:15px;line-height:1.45;color:hsl(45 88% 90%);
  text-shadow:0 2px 10px hsl(230 40% 4% / .7);}
@media (max-width:640px){
  body.has-escape #esc-welt-blase{font-size:14px;}
  body.has-escape #esc-inspektor .esc-insp-buehne{width:min(58vh,92vw);}
  body.has-escape #esc-inspektor .esc-insp-wort{font-size:14px;}
}

/* ===== BUEHNE STATT KASTEN (C9, v2.733.0) ===================================
   Ansage Murat 15.09.2026: „bir kutuya koymussun icerigi. onu arkaplana koy
   … hintergrund ile bütünlesik olsa." Im Escape-Modus ist der Quiz-
   Bildschirm keine Karte mehr: die Kulisse (escape-buehne.js) fuellt den
   Bildschirm, und alles, was Text traegt, liegt als GLAS darauf - eine
   durchscheinende Flaeche mit Unschaerfe, gerade so viel, dass man lesen
   kann. Die Szene (Geschichte, Figur, Sprechblase, Tasten) steht UNTEN
   wie in einem Bilderbuch-Spiel: oben bleibt die Kulisse frei. Farben
   weiterhin aus dem Quiz-Thema (--q*); die Buehne hat ihre eigenen. */
body.has-escape[data-screen="quiz"] #screen-quiz,
body.has-escape[data-screen="student-welcome"] #screen-student-welcome{
  background:transparent !important;border-color:transparent !important;box-shadow:none !important;}
/* Der Eingang: ein Glas so gross wie sein Inhalt, mittig - nicht die ganze
   Hoehe (die Regel oben setzt 100dvh), sonst waere die Kulisse nur Unschaerfe. */
body.has-escape[data-screen="student-welcome"] .wrap{min-height:100dvh;display:flex;flex-direction:column;}
body.has-escape[data-screen="student-welcome"] #screen-student-welcome{min-height:0 !important;margin:auto 0;max-width:640px;align-self:center;width:100%;}
body.has-escape[data-screen="student-welcome"] #screen-student-welcome > *{position:relative;}
body.has-escape[data-screen="student-welcome"] #screen-student-welcome::before{
  content:"";position:absolute;inset:0;border-radius:inherit;
  background:color-mix(in srgb,var(--qcard,var(--card)) 72%,transparent);
  -webkit-backdrop-filter:blur(14px);backdrop-filter:blur(14px);}
/* Der Kopf (Zaehler, Sterne, Zeit, Vollbild) bekommt einen Schleier von oben,
   damit die Pillen auf jedem Himmel lesbar bleiben. */
body.has-escape[data-screen="quiz"] #screen-quiz .quiz-kopf{
  margin:-16px -16px 8px;padding:14px 16px 6px;
  background:linear-gradient(180deg,color-mix(in srgb,var(--qcard,var(--card)) 70%,transparent),transparent);}
body.has-escape[data-screen="quiz"] #screen-quiz .progressbar{opacity:.9;}
/* Die Szene steht unten. */
body.has-escape #screen-quiz .esc-szene{margin-top:auto;}
body.has-escape .esc-szene h2{text-shadow:0 2px 12px color-mix(in srgb,var(--qcard,var(--card)) 80%,transparent),0 0 2px color-mix(in srgb,var(--qcard,var(--card)) 60%,transparent);}
body.has-escape .esc-kopf{text-shadow:0 1px 8px color-mix(in srgb,var(--qcard,var(--card)) 85%,transparent);}
/* Glas: Sprechblase, Fundstueck, Fundblatt, Frage, Antworten, Rueckmeldung, Schloss. */
body.has-escape .esc-blase,body.has-escape .esc-fundstueck,body.has-escape .esc-fund,
body.has-escape #screen-quiz .q-frame,body.has-escape #screen-quiz .opt,
body.has-escape #screen-quiz #qexplain,body.has-escape .esc-schloss input,
body.has-escape #screen-quiz #qopts input,body.has-escape #screen-quiz #qopts select,
body.has-escape #screen-quiz #qopts textarea{
  -webkit-backdrop-filter:blur(14px);backdrop-filter:blur(14px);}
body.has-escape .esc-blase,body.has-escape #screen-quiz .q-frame,body.has-escape #screen-quiz #qexplain{
  background:color-mix(in srgb,var(--qcard,var(--card)) 74%,transparent) !important;}
body.has-escape #screen-quiz .opt:not(.correct):not(.wrong):not(.sel){
  background:color-mix(in srgb,var(--qopt,var(--card)) 78%,transparent) !important;}
body.has-escape .esc-fund{background:color-mix(in srgb,var(--qcard,var(--card)) 82%,transparent);}
/* Der Dialog: Figur links, Sprechblase rechts - ohne eigenen Kasten, die
   Blase traegt das Glas. Die Figur steht auf der Unterkante der Blase. */
body.has-escape .esc-dialog.esc-mit-figur{padding:0;background:transparent;border:0;box-shadow:none;align-items:flex-end;gap:10px;}
body.has-escape .esc-figur{flex:none;width:clamp(96px,17vw,220px);align-self:flex-end;filter:drop-shadow(0 10px 14px rgba(0,0,0,.35));}
body.has-escape .esc-figur img{display:block;width:100%;height:auto;animation:esc-atmen 3.2s ease-in-out infinite;transform-origin:50% 100%;}
body.has-escape .esc-figur[data-pose^="cheer"] img{animation:esc-hopsen .32s ease-in-out infinite alternate;}
body.has-escape .esc-figur[data-pose="hurt"] img{animation:esc-wackeln .5s ease-in-out 2;}
@keyframes esc-atmen{0%,100%{transform:translateY(0) scaleY(1);}50%{transform:translateY(-3px) scaleY(1.012);}}
@keyframes esc-hopsen{from{transform:translateY(0);}to{transform:translateY(-14px);}}
@keyframes esc-wackeln{0%,100%{transform:translateX(0);}25%{transform:translateX(-6px);}75%{transform:translateX(6px);}}
body.has-escape .esc-blase{flex:1;min-width:0;position:relative;padding:14px 16px;border-radius:16px;
  border:1.5px solid color-mix(in srgb,var(--qbd,var(--brand)) 45%,transparent);box-shadow:var(--qglow,none);}
body.has-escape .esc-mit-figur .esc-blase::before{content:"";position:absolute;left:-9px;bottom:26px;width:0;height:0;
  border-top:9px solid transparent;border-bottom:9px solid transparent;
  border-right:10px solid color-mix(in srgb,var(--qcard,var(--card)) 74%,transparent);}
body.has-escape .esc-dialog:not(.esc-mit-figur) .esc-blase{padding:0;border:0;box-shadow:none;background:transparent !important;-webkit-backdrop-filter:none;backdrop-filter:none;}
/* DIE SUCHE (C13): vier Gegenstaende auf einem Brett, antippbar. Der
   richtige leuchtet, ein falscher wackelt. Glas wie alles andere. */
body.has-escape .esc-suche{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:10px;margin:8px 0 14px;max-width:560px;}
body.has-escape .esc-hotspot{display:flex;flex-direction:column;align-items:center;gap:6px;padding:12px 6px 8px;border-radius:16px;cursor:pointer;
  font:inherit;font-size:12px;font-weight:700;color:var(--qink,var(--ink));
  background:color-mix(in srgb,var(--qcard,var(--card)) 70%,transparent);
  border:1.5px solid color-mix(in srgb,var(--qbd,var(--brand)) 45%,transparent);
  -webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);transition:transform .15s ease,box-shadow .15s ease;}
body.has-escape .esc-hotspot img{width:clamp(44px,8vw,80px);height:clamp(44px,8vw,80px);object-fit:contain;filter:drop-shadow(0 6px 8px rgba(0,0,0,.35));}
body.has-escape .esc-hotspot span{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;line-height:1.2;min-height:2.4em;}
body.has-escape .esc-hotspot:hover,body.has-escape .esc-hotspot:focus-visible{transform:translateY(-3px);box-shadow:var(--qglow,none);outline:none;border-color:var(--qacc,var(--brand));}
body.has-escape .esc-hotspot.gefunden{border-color:var(--ok);box-shadow:0 0 0 3px color-mix(in srgb,var(--ok) 40%,transparent);animation:esc-pop .5s ease-out;}
body.has-escape .esc-hotspot.daneben{animation:esc-wackeln .45s ease-in-out 1;}
body.has-escape .esc-hs-0 img{transform:rotate(-6deg);} body.has-escape .esc-hs-1 img{transform:rotate(4deg);}
body.has-escape .esc-hs-2 img{transform:rotate(-3deg);} body.has-escape .esc-hs-3 img{transform:rotate(7deg);}
@media (max-width:640px){
  body.has-escape .esc-suche{gap:6px;}
  body.has-escape .esc-hotspot{padding:8px 4px 6px;font-size:11px;}
}
/* Zweit-Tasten (Fundblatt) und die Quelle: auf der Buehne brauchen auch sie
   ein Glas, sonst stehen sie auf dem Mikroskop. */
body.has-escape .esc-btn.zweit,body.has-escape .esc-quelle{
  background:color-mix(in srgb,var(--qcard,var(--card)) 70%,transparent);
  -webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);}
body.has-escape .esc-quelle{display:inline-block;padding:6px 10px;border-radius:10px;}
/* „Raum verlassen": kein voller Balken, eine leise Zeile am Ende. */
body.has-escape[data-screen="quiz"] #screen-quiz #qabort{
  display:none;
  width:auto;align-self:center;padding:8px 14px;border-radius:99px;font-size:13px;
  background:color-mix(in srgb,var(--qcard,var(--card)) 60%,transparent);color:var(--qmut,var(--muted));
  -webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);border:0;}
/* Helle Kulissen (Karte, goldener Himmel): dunkle Schrift statt Schatten. */
body.has-escape[data-esc-thema="pirat"] .esc-szene h2,body.has-escape[data-esc-thema="antike"] .esc-szene h2{
  color:hsl(25 40% 16%) !important;text-shadow:0 1px 0 hsl(40 60% 92% / .7);}
body.has-escape[data-esc-thema="pirat"] .esc-kopf,body.has-escape[data-esc-thema="antike"] .esc-kopf{
  color:hsl(8 70% 36%) !important;text-shadow:none;}
body.has-escape[data-esc-thema="pirat"] .esc-zeichen-gross,body.has-escape[data-esc-thema="antike"] .esc-zeichen-gross{
  color:hsl(8 70% 36%) !important;}
@media (max-width:640px){
  body.has-escape .esc-figur{width:clamp(72px,22vw,110px);}
  body.has-escape .esc-bildnis{width:clamp(64px,20vw,96px);}
  body.has-escape[data-screen="quiz"] #screen-quiz .quiz-kopf{margin:-16px -14px 6px;padding:12px 14px 4px;}
  body.has-escape .esc-topgruppe{gap:5px;}
  body.has-escape .esc-topbtn-text{width:34px;padding:0;}
  body.has-escape .esc-topbtn-text span{display:none;}
}
@media (prefers-reduced-motion: reduce){
  body.has-escape .esc-figur img{animation:none !important;}
}

/* ⛔ HIER IST DAS DATEIENDE - UND ES GEHOERT DEM ESCAPE-MODUS.
   Ab dem Block „ESCAPE-MODUS" weiter oben liest qa/unit/test_escape_modus.py
   JEDEN Selektor bis zum letzten Zeichen dieser Datei und verlangt, dass er
   an body.has-escape haengt. Wer neue Regeln ans Ende haengt, macht damit
   die CI rot - und zwar erst nach zehn Minuten voller Suite, nicht sofort.
   Das ist viermal passiert (Klassenwelt v2.797.0, Vorhang v2.798.0,
   Zugangskarte v2.858.0 - zurueckgeholt in v2.859.5; Dateien und
   Unterrichtsverlauf v2.927.0-v2.928.0 - zurueckgeholt in v2.928.3).
   NEUE REGELN GEHOEREN VOR DEN ESCAPE-BLOCK. */

/* Produktmarke: Wortmarke in Navigation/Anmeldung, S-Marke in der Kopfzeile.
   Die ausdrückliche Themenwahl geht der Geräteeinstellung vor. */
img.ss-nav-marke{object-fit:contain;content:url("/static/images/lokal-navigation-tag.svg");}
img.ss-app-marke{object-fit:contain;content:url("/static/images/lokal-icon-tag-192.png");}
@media(prefers-color-scheme:dark){
 html:not([data-theme="light"]) img.ss-nav-marke{content:url("/static/images/lokal-navigation-nacht.svg");}
 html:not([data-theme="light"]) img.ss-app-marke{content:url("/static/images/lokal-icon-nacht-192.png");}
}
html[data-theme="dark"] img.ss-nav-marke{content:url("/static/images/lokal-navigation-nacht.svg");}
html[data-theme="dark"] img.ss-app-marke{content:url("/static/images/lokal-icon-nacht-192.png");}
html:not([data-theme="dark"]) body.ck-hg-dunkel.ml-an #ml-rand img.ss-nav-marke{content:url("/static/images/lokal-navigation-nacht.svg");}

/* Nur der Navigationskopf: das neue vollständige Originalmotiv bekommt
   einen quadratischen Platz. Anmeldung und App-Symbole bleiben unberührt. */
img.ss-rail-marke{object-fit:contain;content:url("/static/images/lokal-navigation-v3-tag.svg");}
@media(min-width:900px){#ml-rand .ml-marke{width:72px;height:76px;padding:2px;}}
@media(prefers-color-scheme:dark){
 html:not([data-theme="light"]) img.ss-rail-marke{content:url("/static/images/lokal-navigation-v3-nacht.svg");}
}
html[data-theme="dark"] img.ss-rail-marke{content:url("/static/images/lokal-navigation-v3-nacht.svg");}
html:not([data-theme="dark"]) body.ck-hg-dunkel.ml-an #ml-rand img.ss-rail-marke{content:url("/static/images/lokal-navigation-v3-nacht.svg");}
