/* ====== PrepP — Stylesheet der Pruefungsoberflaeche (Look der RWTH-Klausur) ====== */
:root {
  --navy: #16283e;
  --navy-2: #1d3350;
  --blue: #2e7fc2;
  --blue-dark: #1c4e79;
  /* rel1018-R6 (W1-05): vorher #2f80d0 — Weiß darauf 4,10 : 1 (der
     Abgabeknopf „Submit"). #2a72ba (die alte Hover-Farbe) trägt 4,98 : 1;
     der Ton bleibt RWTH-Blau, nur einen Schritt tiefer. */
  --blue-btn: #2a72ba;
  --gold: #d9a521;
  --bg: #f4f4f4;
  --card: #ffffff;
  --line: #e2e2e2;
  --line-dark: #b9b9b9;
  --txt: #333c48;
  --txt-head: #1f3651;
  --muted: #9aa4af;
  --muted-2: #7d8894;
  --task-bg: #efefef;
  --answer-bg: #fafafa;
  --pill-bg: #cce0f5;
  --ok: #2e8b57;
  --err: #c0392b;
  --shadow: 0 1px 4px rgba(0,0,0,.14);
  /* WO6 (web1014, 14.10.2026 — Jonas F16): drei SCHRIFT-Töne derselben
     Palette, je ≥ 4,5 : 1 auf Weiß, #fafafa und --task-bg. --blue bleibt
     Rand- und Akzentfarbe (4,26 : 1 reicht für Linien, nicht für den Timer
     und die aktive Nummer); --muted/--muted-2 bleiben für Symbole.
     Gerechnet (WCAG): --blue-text #2a73b5 auf #fff 4,98, auf #f4f7fa 4,63;
     --muted-text #5f6b78 auf #fafafa 5,21, auf #efefef 4,73;
     --warn-text #8a6200 auf #fff 5,49. Die dunkle Fassung belegt dieselben
     Namen in css/exam-dunkel.css. Kein --pp-Token (Zwei Welten). */
  --blue-text: #2a73b5;
  --muted-text: #5f6b78;
  --warn-text: #8a6200;
  /* rel1018-R6 (W3-07): Grün als SCHRIFT (Item-Leiste der Einsicht). --ok
     (#2e8b57) bleibt Rand-/Symbolfarbe; als Text trägt es auf Weiß nur
     4,25 : 1. #27774a: 5,49 auf #fff, 5,11 auf dem Hover #f4f7fa. */
  --ok-text: #27774a;
  /* Hoehe der dunklen Kopfleiste. EIN Wert, weil sich zwei Kaesten daran
     ausrichten muessen: .exam-top selbst und der Punktekasten .scorebox
     der Einsicht (N1c, 12.09.2026). Zwei Literale liefen beim ersten
     Nachjustieren auseinander — genau das war der gemeldete Befund. */
  --exam-top-h: 56px;
}
* { box-sizing: border-box; }
html, body { margin: 0; padding: 0; }
body {
  font-family: "Segoe UI", "Helvetica Neue", Arial, sans-serif;
  background: var(--bg);
  color: var(--txt);
  font-size: 14.5px;
  line-height: 1.5;
}
button { font-family: inherit; cursor: pointer; }
.hidden { display: none !important; }

.math { font-family: Georgia, "Times New Roman", serif; }
.math i, i { font-family: Georgia, "Times New Roman", serif; }
.math.centered, .centered { text-align: center; margin: 14px 0; font-size: 15.5px; }
.ov { text-decoration: overline; }
.ovwide { text-decoration: overline; }
code.red { color: #d33; background: #f7f0f0; padding: 0 4px; border-radius: 2px; font-size: 13px; }

/* ================= Portal-Header ================= */
.site-header { background: var(--navy); color: #fff; padding: 14px 0 0 0; }
.hdr-inner { max-width: 1500px; margin: 0 auto; padding: 0 40px; }
.hdr-top { display: flex; align-items: center; justify-content: space-between; }
.logo {
  font-style: italic; font-weight: 800; letter-spacing: 1px;
  font-size: 26px; transform: skewX(-6deg); user-select: none; cursor: pointer;
}
.logo span { border-bottom: 3px solid #fff; padding-bottom: 1px; }
.hdr-nav { display: flex; align-items: center; gap: 34px; color: #8b9bb0; font-size: 13px; }
.hdr-nav .navlink { text-transform: uppercase; letter-spacing: .5px; font-weight: 600; cursor: pointer; }
.hdr-nav .navlink:hover { color: #cdd8e4; }
.hdr-nav .user { color: #b6c2d0; font-size: 14.5px; }
.hdr-nav .logout { cursor: pointer; font-size: 16px; }
.breadcrumb { margin: 18px 0 4px; font-size: 13.5px; color: #d7dee6; }
.breadcrumb .bc { cursor: pointer; }
.breadcrumb .bc:hover { text-decoration: underline; }
.breadcrumb .sep { margin: 0 7px; color: #7d8ea1; }
.breadcrumb .current { color: #8b9bb0; }
.page-title { font-size: 30px; font-weight: 600; margin: 6px 0 26px; }
.tabs { display: flex; gap: 8px; }
.tab {
  padding: 12px 26px 10px; font-size: 14px; font-weight: 600; letter-spacing: .5px;
  color: #cdd8e4; cursor: pointer; border-bottom: 3px solid transparent; text-transform: uppercase;
}
.tab.active { color: #4d9fdc; border-bottom-color: #4d9fdc; }

.banner {
  background: var(--gold); color: #fff; padding: 11px 40px; font-size: 14.5px;
  display: flex; justify-content: space-between; align-items: center;
}
.banner .chev { font-size: 16px; }

/* ================= Portal-Inhalt ================= */
.section-white { background: #fff; padding: 26px 0; box-shadow: 0 1px 2px rgba(0,0,0,.06); }
.section-title { max-width: 1500px; margin: 0 auto; padding: 0 40px; font-size: 26px; color: #3d5a77; font-weight: 400; }
.content { max-width: 1500px; margin: 0 auto; padding: 30px 40px 80px; }
.searchbox {
  width: 100%; padding: 10px 14px 10px 38px; border: 1px solid #cfcfcf; border-radius: 3px;
  font-size: 14px; background: #fff url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='%23999' viewBox='0 0 16 16'%3E%3Cpath d='M11.742 10.344a6.5 6.5 0 1 0-1.397 1.398h-.001c.03.04.062.078.098.115l3.85 3.85a1 1 0 0 0 1.415-1.414l-3.85-3.85a1.007 1.007 0 0 0-.115-.1zM12 6.5a5.5 5.5 0 1 1-11 0 5.5 5.5 0 0 1 11 0z'/%3E%3C/svg%3E") no-repeat 12px center;
  margin-bottom: 26px;
}
.cards { display: grid; grid-template-columns: repeat(auto-fill, minmax(320px, 1fr)); gap: 26px; }
.ex-card { background: var(--card); box-shadow: var(--shadow); padding: 20px 22px; position: relative; }
.ex-card .pill {
  position: absolute; top: 16px; right: 16px; background: var(--pill-bg); color: var(--blue-dark);
  font-size: 12.5px; padding: 3px 12px; border-radius: 12px;
}
.ex-card .kind { color: var(--txt); font-size: 14px; }
.ex-card h3 { margin: 2px 0 14px; font-size: 17px; color: #222; }
.ex-card .meta { font-size: 14px; color: #444; margin-bottom: 26px; }
.btn-outline {
  display: block; width: 100%; text-align: center; background: #fff; color: var(--blue-btn);
  border: 1px solid var(--blue-btn); padding: 10px 0; font-size: 14.5px; border-radius: 2px;
}
.btn-outline:hover { background: #f2f8fd; }
.btn-outline.slim { width: auto; padding: 9px 18px; display: inline-block; }
.btn-blue {
  background: var(--blue-btn); color: #fff; border: none; padding: 10px 28px;
  font-size: 14.5px; border-radius: 2px;
}
.btn-blue:hover { background: #245f9c; }
.btn-ghost { background: none; border: 1px solid #c9c9c9; color: var(--muted-text); padding: 8px 16px; border-radius: 2px; }

/* ================= Exercise-Detailseite ================= */
.detail-grid { display: flex; gap: 40px; align-items: flex-start; flex-wrap: wrap; }
.detail-left { flex: 1 1 480px; }
.detail-left .kind { color: var(--muted); font-size: 14px; }
.detail-left h2 { margin: 2px 0 10px; font-size: 24px; color: #222; }
.detail-left .pill {
  display: inline-block; background: var(--pill-bg); color: var(--blue-dark);
  font-size: 12.5px; padding: 3px 12px; border-radius: 12px; margin-bottom: 18px;
}
.avail { font-size: 14.5px; }
.avail .row { display: flex; margin: 3px 0; }
.avail .k { width: 130px; color: #3d5a77; }
.attempt-card {
  flex: 0 0 300px; background: var(--card); box-shadow: var(--shadow); padding: 20px 22px;
}
.attempt-card h3 { margin: 0 0 14px; font-size: 18px; color: #222; }
.attempt-card .row { display: flex; justify-content: space-between; font-size: 14px; margin: 6px 0; }
.attempt-card .k { color: #3d5a77; }
.progressbar { background: #d8d8d8; height: 18px; margin: 10px 0 16px; position: relative; }
.progressbar .fill { background: #a8c8e8; height: 100%; }
.progressbar .lbl { position: absolute; inset: 0; text-align: center; font-size: 11.5px; line-height: 18px; color: #333; }
.attempt-card .actions { text-align: right; }
.attempts-section { margin-top: 50px; }
.attempts-section h3 { color: #3d5a77; font-weight: 400; font-size: 17px; }
.attempt-row {
  display: flex; align-items: center; gap: 26px; background: #fff; border: 1px solid #d9d9d9;
  padding: 16px 22px; margin: 12px 0;
}
.attempt-row .num { font-size: 16px; font-weight: 600; width: 30px; text-align: center; }
.attempt-row .col { flex: 1; font-size: 14px; }
.attempt-row .k { color: #3d5a77; }
.attempt-row .v { color: #222; }

/* ================= Prüfungsansicht ================= */
.exam-top {
  position: fixed; top: 0; left: 0; right: 0; height: var(--exam-top-h); background: var(--navy);
  display: flex; align-items: center; z-index: 50;
}
.exam-top .close {
  color: #fff; font-size: 20px; padding: 0 22px; height: 100%; display: flex; align-items: center;
  background: none; border: none;
}
.exam-top .close:hover { background: rgba(255,255,255,.08); }
.exam-top .watermark {
  position: absolute; left: 50%; transform: translateX(-50%) skewX(-6deg);
  color: #5a6b80; font-style: italic; font-weight: 800; font-size: 22px; letter-spacing: 1px; opacity: .55;
}
.timerbox {
  position: fixed; top: 0; right: 0; background: #fff; z-index: 60;
  padding: 14px 18px; font-size: 20px; color: var(--blue-text); font-weight: 500;
  box-shadow: 0 1px 5px rgba(0,0,0,.25); display: flex; align-items: center; gap: 10px;
}
.timerbox .clockicon { font-size: 17px; }
.timerbox.warn { color: var(--warn-text); }
.timerbox.crit { color: var(--err); }
/* Markieren in der Einsicht: sitzt im Item-Kopf neben dem Filter */
.res-flag {
  border: 1px solid var(--line-dark); background: #fff; color: var(--muted-text);   /* ☆: --muted-2 trug 3,61 : 1 (W3-07) */
  border-radius: 4px; width: 30px; height: 26px; font-size: 14px; cursor: pointer;
  margin-left: 12px; line-height: 1;
}
.res-flag:hover { border-color: var(--gold); color: var(--gold); }
.res-flag.on { border-color: var(--gold); color: var(--gold); background: #fdf7e6; }
/* Aktiver Schalter in der Fußleiste (Lösungen eingeblendet) */
.ov-btn.on { background: var(--pill-bg); border-color: var(--blue-dark); color: var(--blue-dark); }
/* Hinweisband der Ansicht "Anschauen" — sitzt an der Stelle des Timers,
   damit sofort klar ist: hier läuft keine Prüfung. */
.viewbadge {
  position: fixed; top: 0; right: 0; background: #fff; z-index: 60;
  padding: 18px 18px; font-size: 13px; color: var(--muted-text); font-weight: 600;
  box-shadow: 0 1px 5px rgba(0,0,0,.25);
}
.exam-scroll { padding: 80px 0 90px; }
.exam-body { max-width: 950px; margin: 0 auto; padding: 0 10px; }
.navcards { display: flex; gap: 20px; margin-bottom: 20px; }
.navcard {
  flex: 1; background: #fff; box-shadow: var(--shadow); padding: 12px 20px; min-height: 58px;
  display: flex; align-items: center; gap: 12px; border: none; font-size: 15px; color: #333;
}
.navcard .dir { font-size: 13px; color: #666; display: block; }
.navcard .lbl { font-size: 16px; }
.navcard.next { justify-content: flex-end; text-align: right; }
.navcard:disabled { opacity: .35; cursor: default; }
.navcard .arrow { font-size: 20px; color: #444; }

.item-card { background: #fff; box-shadow: var(--shadow); padding: 24px 0 30px; }
.item-head { display: flex; justify-content: space-between; padding: 0 28px 18px; }
.item-head .t { color: var(--txt-head); font-weight: 700; font-size: 17px; }
.item-head .p { color: var(--txt-head); font-weight: 700; font-size: 15px; }
.item-topic { border-top: 1px solid var(--line); margin: 0 28px; padding: 16px 0 10px; font-weight: 700; color: #333; }
.iblock-text { padding: 10px 28px; }
.iblock-text ul, .iblock-text ol { margin: 8px 0; }
.iblock-img { text-align: center; padding: 14px 28px; }
.iblock-img img { max-width: 100%; }
/* Interaktive Abbildung (srcdoc, 15.08.2026): der Käfig-iframe füllt seinen
   Kasten in der Breite, die Höhe steht als Inline-Stil am Block. Weißer
   Grund mit Rand — das Bild ist eine Seite in der Seite und soll auch so
   aussehen (kein foreignObject, kein Skalieren: Bedienelemente bleiben
   in Originalgröße). */
.iblock-html-wrap { margin: 0 auto; }
.iblock-html { display: block; width: 100%; border: 1px solid var(--line); background: #fff; }
.iblock-html-tot { font-size: 13px; color: #a33; border: 1px dashed #c99; padding: 10px; }
.iblock-img .cap, .tab-cap { font-size: 13.5px; color: #555; margin-top: 8px; }
/* Beschriftung eines Satzes Antwortbilder (Paket Q). Sie steht ÜBER der
   Liste — deshalb margin-bottom statt -top. */
.opt-cap { font-size: 13.5px; color: #555; margin: 2px 0 8px; }
/* Die Tabellenunterschrift liegt NEBEN .table-wrap, nicht darin (der scrollt
   waagerecht). Sie bringt deshalb ihren eigenen Einzug und ihre eigene
   Zentrierung mit — .iblock-img hat beides schon, .table-wrap nicht. */
.tab-cap { padding: 0 20px 8px; text-align: center; }
/* ---- Bildreihe: (a) neben (b) (Paket 8) ----
   Die Figuren fliessen statt in festen Spalten zu stehen — damit passt
   sich die Reihe der Fensterbreite an, ohne dass irgendwo eine
   Bildschirmgroesse geraten wird. `min-width: 0` ist dabei die Zeile,
   die man vergisst: Ein Flex-Kind schrumpft ohne sie NICHT unter seine
   Inhaltsbreite, und ein breites SVG schoebe die ganze Seite seitlich
   auf (die Mobil-Regel: nichts scrollt waagerecht ausser in seinem
   eigenen Kasten). */
.iblock-figrow { padding: 14px 28px; }
.iblock-figrow .figrow-wrap {
  display: flex; flex-wrap: wrap; gap: 18px 22px;
  justify-content: center; align-items: flex-start;
}
.iblock-figrow figure { margin: 0; flex: 1 1 200px; min-width: 0; text-align: center; }
.iblock-figrow figure img,
.iblock-figrow figure .inline-svg { max-width: 100%; }
.iblock-figrow figure .inline-svg svg { max-width: 100%; height: auto; }
.iblock-figrow figcaption { font-size: 13px; color: #555; margin-top: 6px; }
.iblock-figrow .cap { font-size: 13.5px; color: #555; margin-top: 10px; text-align: center; }
.iblock-hint { padding: 12px 28px; font-size: 13.5px; }
.iblock-hint ul { margin: 4px 0 6px; }
/* Hinweis auf mögliche Fehler unter dem Informationstext (app.js,
   fehlerHinweis) — dezent im Stil der Prüfungsansicht, kein Portal-Look. */
.iblock-fbnote { border-top: 1px solid var(--line); margin: 8px 28px 0; padding: 12px 0 14px; font-size: 13px; color: var(--muted-2); }
.iblock-fbnote .fb-open-link { background: none; border: none; padding: 0; font: inherit; color: var(--blue-dark); text-decoration: underline; cursor: pointer; }

/* ---- Bildbeschriftung (Blocktyp figlabel) ----
   Die Marken liegen absolut ueber dem Bild, ihre Koordinaten sind Anteile der
   Bildflaeche (0…1) — deshalb der relative Rahmen. Sie tragen eigene, feste
   Farben statt --pp-Tokens: Sie liegen auf einem BILD, dessen Helligkeit
   niemand kennt, nicht auf dem Seitenhintergrund. Weisser Ring plus dunkler
   Kern bleibt auf hellem wie auf dunklem Bildinhalt lesbar. */
.fl-fig { position: relative; display: inline-block; max-width: 100%; }
.fl-fig img, .fl-fig .inline-svg { max-width: 100%; display: block; }
.fl-fig .inline-svg svg { max-width: 100%; height: auto; display: block; }
.fl-mark {
  position: absolute; transform: translate(-50%, -50%);
  min-width: 22px; height: 22px; padding: 0 4px; box-sizing: border-box;
  border-radius: 11px; border: 2px solid #fff;
  background: #1b3a63; color: #fff;
  font: 700 12.5px/18px "IBM Plex Sans", system-ui, sans-serif; text-align: center;
  box-shadow: 0 0 0 1px rgba(0, 0, 0, .45); pointer-events: none;
}
.fl-mark.ok    { background: #1e7a3c; }
.fl-mark.err   { background: #b3261e; }
.fl-mark.part  { background: #a26a00; }
.fl-mark.empty { background: #5b5b5b; }

.fl-list { padding: 4px 28px 0; }
.fl-row { display: flex; align-items: flex-start; gap: 10px; }
.fl-row .fl-num {
  flex: 0 0 auto; margin-top: 14px;
  min-width: 22px; height: 22px; padding: 0 4px; box-sizing: border-box;
  border-radius: 11px; background: #1b3a63; color: #fff;
  font: 700 12.5px/22px "IBM Plex Sans", system-ui, sans-serif; text-align: center;
}
.fl-row .fl-field { flex: 1; min-width: 0; }
/* Die Antwortzeilen bringen ihren eigenen Rand mit — hier wuerde er doppelt
   zaehlen und die Nummern von ihren Feldern wegschieben. */
.fl-row .fl-field .answer-row { padding-left: 0; padding-right: 0; }
/* ... ausser wenn wirklich ein Schluesselknopf drinsteht (nur im Training).
   Der sitzt absolut im linken Streifen und laege hier sonst IMMER auf dem
   Text. Die Spur wird deshalb genau dann freigehalten, wenn es ihn gibt —
   pauschal wuerde sie jede Bildbeschriftung in der Pruefung nach rechts
   schieben. Kennt der Browser :has() nicht, bleibt es beim alten Verhalten. */
.fl-row .fl-field .answer-row:has(> .solkey) { padding-left: 32px; }
.fl-row .fl-field .answer-row:has(> .solkey) .solkey { left: 0; }

.task-bar {
  background: var(--task-bg); display: flex; align-items: flex-start; gap: 14px;
  padding: 13px 28px; margin-top: 14px;
}
.task-bar .icon { color: #9a9a9a; flex: 0 0 auto; margin-top: 1px; }
/* min-width: 0 (W1-04, qa1013): Ohne sie hält das Flex-Kind seine
   Inhaltsbreite (Fallstrick 41) — eine breite Display-Formel oder ein
   <pre> im Aufgabentext schob `.pts` hinaus und das ganze Dokument seitlich
   (12 Aufgabenseiten bei 390 px, bis +229 px). Mit ihr rollt der breite
   Inhalt in seinem eigenen Kasten (.katex-display, Regel im 760-px-Block). */
.task-bar .txt { flex: 1; min-width: 0; color: #2f2f2f; }
.task-bar .pts { color: var(--muted-text); font-weight: 600; font-size: 14px; white-space: nowrap; }
.answer-row {
  background: var(--answer-bg); border-top: 1px solid #f0f0f0; padding: 14px 28px 16px 60px;
  position: relative;
}
.answer-row .pts { position: absolute; top: 10px; right: 28px; color: var(--muted-text); font-size: 13px; font-weight: 600; }
/* Schluesselknopf je Feld (nur im Training). Er sitzt im 60-px-Streifen links,
   den .answer-row ohnehin freilaesst — dort stoert er weder die Punktzahl
   rechts oben noch den Text. */
.answer-row .solkey {
  position: absolute; top: 11px; left: 20px; width: 24px; height: 24px; padding: 0;
  display: flex; align-items: center; justify-content: center;
  border: 1px solid #d8dde3; border-radius: 3px; background: #fff;
  color: #9aa3ad; cursor: pointer; transition: color .12s, border-color .12s, background .12s;
}
.answer-row .solkey:hover { color: var(--blue-dark); border-color: #a9c6e6; }
.answer-row .solkey.on { color: var(--blue-dark); border-color: #a9c6e6; background: var(--pill-bg); }
/* Der schmale Sitz des Knopfes steht im 760-px-Block am Dateiende — zusammen
   mit dem schmalen padding-left der .answer-row. Zwei Breakpoints (der Knopf
   rueckte bei 700 px, das padding erst bei 760) liessen ihn zwischen 701 und
   760 px auf dem Inhalt liegen. */
.answer-row .lbl { margin: 14px 0 6px; }
.answer-row .fieldline { display: flex; justify-content: flex-end; align-items: baseline; gap: 6px; }
.answer-row.inline-row .fieldline { justify-content: flex-start; flex-wrap: wrap; }
/* Eingabefelder der Pruefungsansicht. Hiessen bis Juli 2026 .dyn-*; die Namen
   erzeugt app.js beim Rendern aus den Felddefinitionen, sie stehen nie in
   gespeicherten Klausuren — deshalb brauchen sie keine Altnamen. Anders
   .ex-table, siehe dort. */
.ex-input {
  border: none; border-bottom: 1px solid var(--line-dark); background: transparent;
  width: 200px; text-align: center; font-size: 14.5px; padding: 4px 2px; color: #222;
  outline: none;
}
.ex-input:focus { border-bottom-color: var(--blue); }
/* Platzhalter: #b5b5b5 trug 2,05 : 1 — ein leeres Feld war kaum als Eingabe
   erkennbar (W3-07). #666 hält ≥ 4,99 auf Weiß, #fafafa, #efefef und #f0f6fc. */
.ex-input::placeholder { color: #666; }
.ex-input.small { width: 110px; }
.ex-input.answered { background: #f0f6fc; }
.unit { font-family: Georgia, serif; font-style: italic; font-size: 15px; }
.ex-textarea {
  width: 100%; border: 1px solid var(--line-dark); background: #fff; padding: 10px 12px;
  font-family: "Consolas", "Menlo", monospace; font-size: 13px; line-height: 1.55; resize: vertical;
}
.ex-textarea:focus { border-color: var(--blue); outline: none; }
pre.res-code {
  background: #f7f7f7; border: 1px solid #e2e2e2; padding: 8px 12px; font-size: 12.5px;
  font-family: "Consolas", "Menlo", monospace; max-width: 480px; overflow-x: auto;
}
.ex-select {
  border: 1px solid var(--blue); color: var(--blue); background: #fff; padding: 7px 12px;
  font-size: 14px; border-radius: 2px; min-width: 150px;
}
.radio-list { padding: 0 28px; }
.radio-opt {
  display: flex; align-items: center; gap: 14px; padding: 16px 8px; border-top: 1px solid #f0f0f0;
  cursor: pointer; font-size: 14.5px;
}
/* flex: 0 0 auto und min-width: 0 stehen global, sind am Desktop aber
   unsichtbar: Dort ist keine Optionszeile je so eng, dass das Kaestchen
   gequetscht wuerde. Auf dem Handy ist genau das der Regelfall. Ebenso
   overflow-wrap: Es greift ausschliesslich bei Wortern, die ohnehin
   ueberliefen — es kann also nur kaputte Zeilen aendern, keine heilen. */
.radio-opt input { width: 17px; height: 17px; flex: 0 0 auto; }
.radio-opt > span { min-width: 0; overflow-wrap: break-word; }
.deselect-btn { margin: 12px 28px 0; }

/* ---- Antwortoptionen MIT Abbildung (Paket 10, 13.08.2026) ----
   "Welches dieser fuenf Bodediagramme gehoert zur Schaltung?" — die Optionen
   sind die Bilder, der Text daneben ist ihr Name. Untereinander ergaben die
   fuenf Panels eine 3947 px hohe Aufgabenkarte (docs/IMPORT-BEFUNDE-KLAUSUR1-
   2026.md, S2-2); im Raster stehen sie nebeneinander wie im Original.
   auto-fit + minmax heisst: so viele Spalten, wie bei 230 px Mindestbreite
   hineinpassen — auf dem Handy ist das genau eine, ohne eigene Medienregel.
   Die Selektoren sind zweiteilig (.radio-list.opt-grid .radio-opt), damit sie
   die schmalen Fenster weiter unten in dieser Datei nicht erst neu erfinden
   muessen: hoehere Spezifitaet gewinnt unabhaengig von der Reihenfolge. */
.radio-list.opt-grid {
  display: grid; grid-template-columns: repeat(auto-fit, minmax(230px, 1fr)); gap: 6px 14px;
}
.radio-list.opt-grid .radio-opt {
  align-items: flex-start; border: 1px solid #ececec; border-radius: 3px; padding: 12px 10px;
}
.radio-opt .opt-inhalt { display: block; flex: 1 1 auto; min-width: 0; text-align: center; }
.radio-opt .opt-fig { display: block; margin: 0 auto; }
.radio-opt .opt-fig svg { max-width: 100%; height: auto; display: block; }
.radio-opt .opt-txt { display: block; margin-top: 6px; font-size: 13.5px; color: #555; }

/* Aufgabentabellen. .dyn-table ist der Altname und bleibt bewusst mit im
   Selektor: ai-prompt.js hat ihn dem Sprachmodell als Markup vorgeschrieben
   ("<table class=\"dyn-table static\">"), er steckt also woertlich in bereits
   importierten und gespeicherten Klausuren. Faellt er weg, verlieren die
   still ihre Formatierung. Neu erzeugtes Markup traegt .ex-table. */
table.ex-table, table.dyn-table { border-collapse: collapse; margin: 6px auto; }
table.ex-table th, table.dyn-table th {
  border-bottom: 2px solid var(--navy); padding: 6px 14px; font-weight: 600; color: #222;
  font-size: 14px; text-align: center;
}
table.ex-table td, table.dyn-table td { border-bottom: 1px solid #e6e6e6; padding: 5px 14px; text-align: center; }
table.ex-table .ex-input, table.dyn-table .ex-input { width: 90px; }
table.ex-table.static td, table.dyn-table.static td { padding: 7px 18px; }
/* Befund C16 (06.09.2026 — S2): Im Mikroprogramm steht in der ersten
   Spalte der BEFEHL — die einzige Angabe, welche Zeile man ausfüllt. Sie
   rollte mit aus dem Bild (gemessen x = −255, 3 von 5 Spalten sichtbar).
   Sie klebt jetzt am linken Rand des .table-wrap.

   Nur `.mp-table`, nicht `.ex-table` allgemein: Bei einer gewöhnlichen
   Aufgabentabelle kann in der ersten Spalte ein ANTWORTFELD stehen
   (`r.fieldsFirst`) — dort wäre eine klebende Spalte falsch.

   Eine klebende Zelle braucht zwingend einen deckenden Grund, sonst
   scheint der Text darunter durch. Es ist derselbe weisse Grund, den die
   Prüfungsansicht ohnehin hat — die dunkle Gegenfassung des Trainings
   steht in css/prepp.css bei den übrigen Tabellenregeln. Der Name jener
   Klasse steht hier bewusst NICHT: verify-import-bildoptionen hält
   exam.css davon frei (Zwei-Welten).

   .dyn-table steht mit im Selektor wie in jeder Tabellenregel darüber:
   Der Altname steckt woertlich in gespeicherten Importen (siehe oben);
   verify-class-rename hält das über ALLE ex-table-Regeln fest. */
table.ex-table.mp-table th:first-child, table.dyn-table.mp-table th:first-child,
table.ex-table.mp-table td:first-child, table.dyn-table.mp-table td:first-child {
  position: sticky; left: 0; z-index: 1; background: #fff;
}
.kvcorner { font-size: 12px; color: #333; display: inline-block; text-align: left; }
.table-wrap { overflow-x: auto; padding: 6px 20px; }
/* W1-01 (qa1013, 14.10.2026 — S2): Auf dem Telefon lagen 491 von 954
   Antwortfeldern in rollenden Tabellen und Matrizen UNSICHTBAR rechts (17
   Klausuren, teils alle Felder einer Aufgabe) — kein Schatten, keine Kante,
   und iOS blendet Rollbalken aus. Die Tabelle wirkte vollständig.

   Dieselbe Kante wie der Aufgabenstreifen (.itembar.mehr-r, Befund C11) und
   aus demselben Grund `mask-image` statt einer Farbe: Sie führt keine Farbe
   in die Prüfungsansicht ein und stimmt hell wie dunkel. Die Marken setzt
   rollKante() in js/app.js am GEMESSENEN scrollWidth, nie an einer
   Bildschirmschwelle; darunter steht `.roll-rest` („→ 4 Felder rechts"),
   solange wirklich Felder verdeckt sind. */
.table-wrap.mehr-r, .mx-wrap.mehr-r, .pla-wrap.mehr-r {
  -webkit-mask-image: linear-gradient(to right, #000 calc(100% - 26px), transparent);
  mask-image: linear-gradient(to right, #000 calc(100% - 26px), transparent);
}
.table-wrap.mehr-l, .mx-wrap.mehr-l, .pla-wrap.mehr-l {
  -webkit-mask-image: linear-gradient(to left, #000 calc(100% - 26px), transparent);
  mask-image: linear-gradient(to left, #000 calc(100% - 26px), transparent);
}
.table-wrap.mehr-l.mehr-r, .mx-wrap.mehr-l.mehr-r, .pla-wrap.mehr-l.mehr-r {
  -webkit-mask-image: linear-gradient(to right, transparent, #000 26px, #000 calc(100% - 26px), transparent);
  mask-image: linear-gradient(to right, transparent, #000 26px, #000 calc(100% - 26px), transparent);
}
/* --muted-2 statt --muted: #7d8894 auf Weiß sind 3,6 : 1 — für eine Zeile,
   die man lesen MUSS, zu blass; --txt (dunkel umbelegt in
   css/exam-dunkel.css) trägt beide Fassungen. */
.roll-rest {
  text-align: right; padding: 0 20px 6px; font-size: 13px; color: var(--txt);
  cursor: pointer; user-select: none; -webkit-user-select: none;
}
.roll-rest b { font-weight: 600; }

.statusgroup { padding: 6px 28px 2px; }
.statusgroup .glabel { font-weight: 700; margin: 14px 0 6px; }
.statusline { display: flex; align-items: baseline; gap: 8px; margin: 6px 0; }
.statusline .sl { width: 24px; }
.statusline .ex-input { width: 120px; text-align: center; }

.progcol { margin: 10px 0; }
.progtitle { font-style: italic; margin: 12px 0 4px; }
pre.asm {
  font-family: "Consolas", "Menlo", monospace; font-size: 13px; margin: 4px 0;
  background: transparent; line-height: 1.7; overflow-x: auto;
}
pre.asm span { background: #fdf0f0; color: #c0392b; padding: 1px 6px; display: inline-block; margin: 1px 0; }

.codeblock {
  margin: 14px 28px; border: 1px solid #ddd; background: #fdfdfd; padding: 16px 20px;
  font-family: "Consolas", "Menlo", monospace; font-size: 13px; line-height: 2.1; overflow-x: auto;
}
.codeline { display: flex; gap: 0; white-space: nowrap; }
.codeline .clabel { width: 70px; color: #2e6fb0; flex: 0 0 auto; }
.codeline .cpre { width: 190px; flex: 0 0 auto; }
.codeline .ccomment { color: #555; }
.codeline .ex-input { font-family: inherit; font-size: 13px; width: 170px; text-align: left; margin-right: 20px; }
.machinerow td { font-family: "Consolas", "Menlo", monospace; font-size: 13px; }
table.machine { border-collapse: collapse; margin: 10px auto; }
table.machine th { background: #f4f6f8; border: 1px solid #d9d9d9; color: var(--txt-head); padding: 8px 16px; font-size: 13.5px; }
table.machine td { border: 1px solid #d9d9d9; padding: 8px 14px; font-size: 13.5px; }
table.machine td.cm { text-align: left; max-width: 420px; }
table.machine .ex-input { width: 160px; font-family: "Consolas", monospace; font-size: 12.5px; }

.attach-btn {
  display: inline-flex; align-items: center; gap: 8px; border: 1px solid var(--blue-btn);
  color: var(--blue-btn); background: #fff; padding: 8px 16px; font-size: 14px; border-radius: 2px;
  text-decoration: none; margin: 8px auto;
}
.attach-wrap { text-align: center; padding: 16px 0; }

/* PLA SVG */
.pla-wrap { text-align: center; padding: 10px 10px 20px; }
.pla-wrap svg { max-width: 100%; }
.pla-dot { cursor: pointer; }
.pla-dot circle.dot { fill: transparent; stroke: transparent; }
.pla-dot:hover circle.hover { fill: rgba(46,127,194,.25); }
.pla-dot.set circle.dot { fill: #111; }
.pla-hint { font-size: 13px; color: #777; padding: 0 28px 8px; }

/* ================= Untere Item-Leiste ================= */
.exam-bottom {
  position: fixed; bottom: 0; left: 0; right: 0; background: #fff; z-index: 50;
  box-shadow: 0 -1px 6px rgba(0,0,0,.15); display: flex; align-items: stretch; height: 54px;
}
.ov-btn {
  border: 1px solid #ccc; background: #fff; margin: 8px 12px; padding: 0 16px; font-size: 13px;
  font-weight: 600; letter-spacing: .5px; color: #333; display: flex; align-items: center; gap: 8px;
}
/* Zentriert wird über AUTO-MARGINS, nicht über `justify-content: center`
   (Befund B58, 06.09.2026 — R3). Beides sieht gleich aus, solange die
   Nummern passen; sobald sie überlaufen, sind es zwei verschiedene
   Dinge: `center` verteilt den Überlauf auf BEIDE Seiten, der
   Bildlauf-Nullpunkt liegt dann in der MITTE der Liste. Gemessen in
   WebKit bei 390 px: Leiste 179 px, Inhalt 966 px, 21 Nummern — bei
   `scrollLeft: 0` standen auf Item 1, 3 und 18 immer dieselben 9/10/11
   im Bild. Auto-Margins lösen sich bei fehlendem freien Platz zu 0 auf:
   Passt es, steht die Reihe mittig wie bisher; passt es nicht, beginnt
   sie links und ist von 0 an vollständig erreichbar. Angefahren wird
   die aktive Nummer in js/app.js (itembarZuAktiv). */
.itembar { flex: 1; display: flex; justify-content: flex-start; align-items: stretch; overflow-x: auto; }
.itembar > :first-child { margin-left: auto; }
.itembar > :last-child { margin-right: auto; }
/* Befund C11 (06.09.2026 — S2): Erreichbar war der Streifen seit B58, nur
   sagte es niemand — kein Pfeil, kein Verlauf, und macOS blendet seine
   Bildlaufleisten aus. Die Kante blendet deshalb aus, sobald die Nummern
   überlaufen; die Marken `mehr-l`/`mehr-r` setzt itembarKanten() am gemessenen
   scrollWidth (keine geratene Bildschirmschwelle).

   `mask-image` statt eines aufgelegten Farbverlaufs: Es führt KEINE Farbe
   ein (die Prüfungsansicht bleibt unangetastet), sondern nimmt der
   Randnummer die Deckkraft — auf jedem Untergrund richtig, auch im
   Druckcontainer.

   Ausgeblendet wird nur die Seite, auf der wirklich noch etwas liegt
   (mehr-l / mehr-r, nachgezogen beim Rollen): Wer ganz nach rechts
   gerollt hat, sieht die letzte Nummer ungetrübt — sonst verschluckte
   die Kante ausgerechnet das angefahrene Item. */
.itembar.mehr-r {
  -webkit-mask-image: linear-gradient(to right, #000 calc(100% - 26px), transparent);
  mask-image: linear-gradient(to right, #000 calc(100% - 26px), transparent);
}
.itembar.mehr-l {
  -webkit-mask-image: linear-gradient(to left, #000 calc(100% - 26px), transparent);
  mask-image: linear-gradient(to left, #000 calc(100% - 26px), transparent);
}
.itembar.mehr-l.mehr-r {
  -webkit-mask-image: linear-gradient(to right, transparent, #000 26px, #000 calc(100% - 26px), transparent);
  mask-image: linear-gradient(to right, transparent, #000 26px, #000 calc(100% - 26px), transparent);
}
/* Q5 (05.09.2026), Befund C8 des Rundgangs vom 04.09.2026: Die
   UNBEARBEITETEN Nummern standen auf #9aa4af = 2,53 : 1 gegen die weisse
   Leiste — also ausgerechnet die Zahlen, zu denen man springen will,
   waren die blassesten (bearbeitet #333 = 12,63). Jetzt #6b7683 = 4,62,
   damit ueber WCAG AA.

   Das ist KEIN Griff ins Portal-Theme (Zwei-Welten): Es bleibt derselbe
   kuehle Grauton derselben Palette, ohne --pp-Token, und der Unterschied
   zu `.answered` bleibt mit 4,62 gegen 12,63 klar erkennbar. Geaendert
   ist die Helligkeit, nicht die Bildsprache.

   Die uebrigen blassen Stellen dieser Datei (.pts 2,42, .viewbadge 3,61)
   tragen seit WO6 (web1014) --muted-text, die aktive Nummer --blue-text.
   Das Wasserzeichen .exam-top .watermark (2,74) bleibt bewusst blass —
   es ist Kennzeichnung, kein Lesetext. */
.itembtn {
  border: none; background: none; min-width: 46px; font-size: 15px; color: #6b7683;
  border-top: 3px solid transparent; padding: 0 6px;
}
.itembtn.answered { color: #333; }
.itembtn.active { color: var(--blue-text); border-top-color: var(--blue); font-weight: 700; }
.itembtn:hover { background: #f4f7fa; }
.submit-btn {
  border: none; background: #fff; color: var(--navy); font-weight: 700; letter-spacing: .5px;
  font-size: 13.5px; padding: 0 22px; display: flex; align-items: center; gap: 9px;
}
.submit-btn:hover { background: #f0f3f6; }

/* ================= Overview / Info ================= */
.ovgrid { display: grid; grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); gap: 14px; padding: 10px 28px 20px; }
.ovcell { border: 1px solid #d9d9d9; background: #fff; padding: 12px 14px; cursor: pointer; }
.ovcell:hover { border-color: var(--blue); }
.ovcell .t { font-weight: 700; color: var(--txt-head); }
.ovcell .s { font-size: 12.5px; color: #777; margin-top: 4px; }
.ovcell.done .s { color: var(--ok); }

/* ================= Auswertung ================= */
.result-banner {
  background: var(--navy); color: #fff; padding: 22px 28px; display: flex;
  justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 12px;
}
.result-banner .score { font-size: 26px; font-weight: 700; }
.result-banner .sub { color: #b6c2d0; font-size: 13.5px; }
.res-item { background: #fff; box-shadow: var(--shadow); margin: 18px 0; }
.res-item-head {
  display: flex; justify-content: space-between; padding: 14px 24px; cursor: pointer;
  border-left: 4px solid #ccc;
}
.res-item-head.full { border-left-color: var(--ok); }
.res-item-head.partial { border-left-color: var(--gold); }
.res-item-head.zero { border-left-color: var(--err); }
.res-item-head .t { font-weight: 700; color: var(--txt-head); }
.res-item-body { border-top: 1px solid var(--line); padding: 4px 24px 18px; }
.res-field { border-bottom: 1px solid #f0f0f0; padding: 10px 0; }
.res-field .q { font-size: 13.5px; color: #666; }
.res-field .cmp { display: flex; gap: 30px; flex-wrap: wrap; margin-top: 5px; }
.res-field .yours, .res-field .corr { font-size: 14px; }
.res-field .yours b, .res-field .corr b { font-weight: 600; }
.res-field .mark { font-weight: 700; }
.res-field .mark.ok { color: var(--ok); }
.res-field .mark.err { color: var(--err); }
.res-field .mark.part { color: #b07d00; }
.res-sol { background: #f6f9fc; border-left: 3px solid var(--blue); padding: 8px 14px; margin-top: 8px; font-size: 13.5px; }
.res-sub-pts { font-size: 13px; color: #555; margin-top: 6px; }
.override { margin-top: 8px; font-size: 13px; color: #555; display: flex; align-items: center; gap: 8px; }
.override input { width: 70px; border: 1px solid #ccc; padding: 3px 6px; }
.pla-sol-note { font-size: 13px; color: #555; }

/* ================= Bewertungsmodus (Ergebnisansicht im Klausur-Layout) ================= */
/* Der Punktekasten ist PrepPs eigener Zusatz, kein Bauteil des echten
   Systems — deshalb darf seine Regel hier stehen und angefasst werden.

   N1c (12.09.2026, Jonas: „der Punktekasten richtet sich nicht an der
   Kopfzeile aus"). Er stand auf `padding: 17px 20px` OHNE Hoehe und war
   damit so hoch wie sein Inhalt — nachgerechnet aus dem Stylesheet:
   Schalter 30,75 px (2 x 5 px Polster + 12,5 px x 1,5 Zeilenhoehe + 2 px
   Rand) gegen die Punktzahl 24 px, also 30,75 px Zeile plus 34 px
   Polster = 64,75 px ueber einer 56-px-Leiste. Mit der Note (A1,
   10.09.2026) kamen 20,75 px dazu: 85,5 px, also 29,5 px Ueberhang.

   Jetzt: genau so hoch wie die Leiste (derselbe Wert, --exam-top-h),
   Inhalt senkrecht zentriert (align-content in css/prepp.css, wo der
   Umbruch wohnt) und derselbe seitliche Rand wie das Schliessen-Kreuz
   links (.exam-top .close, padding: 0 22px). */
.scorebox {
  position: fixed; top: 0; right: 0; height: var(--exam-top-h); background: #fff; z-index: 60;
  padding: 0 22px; font-size: 16px; color: var(--navy); font-weight: 700;
  box-shadow: 0 1px 5px rgba(0,0,0,.25);
}
/* Auf dem Finger gibt der Kasten seine feste Hoehe wieder ab (N1c,
   12.09.2026 — in WebKit bei 390 px gemessen, nicht gerechnet).

   Es ist ein echter Zielkonflikt zwischen zwei richtigen Regeln, und er
   wird hier aufgeloest: `.ein-switch button` steht in der
   R3-Trefferflaechenliste (min-height 44px, css/prepp.css, unter GENAU
   DIESER Medienabfrage — wer die eine aendert, aendert die andere mit).
   Bei 390 px ist der Schalter damit 46 px hoch, und 46 + 2 + 17 passen
   nicht in eine 56-px-Leiste: Die Note stand 3 px UNTER der Kante auf
   dem dunklen Grund (gemessen `noteInnen: -3`).

   Also `min-height` statt `height`: Auf dem Zeigergeraet bleibt der
   Kasten genau so hoch wie die Leiste, auf dem Finger waechst er wie
   vorher, und das Touch-Ziel gewinnt. Die Regel steht HIER und nicht in
   css/prepp.css, weil ihre 22 px vom Schliessen-Kreuz daneben kommen und
   nicht aus dem 4-px-Abstandsraster des Portals (verify-skala pruefte
   sie dort zu Recht an). */
@media (max-width: 860px), (pointer: coarse) and (max-width: 1200px) {
  .scorebox { height: auto; min-height: var(--exam-top-h); padding: 6px 22px; }
}
.graded-field { display: inline-flex; align-items: center; gap: 8px; }
.ex-input.graded-ok, .ex-textarea.graded-ok { background: #eaf6ee; border-bottom-color: var(--ok); border-color: var(--ok); }
.ex-input.graded-err, .ex-textarea.graded-err { background: #fdecea; border-bottom-color: var(--err); border-color: var(--err); }
.ex-input.graded-part { background: #fdf6e3; border-bottom-color: var(--gold); }
.ex-input.graded-manual, .ex-textarea.graded-manual { background: #eef4fb; border-bottom-color: var(--blue); }
.ex-select.graded-ok { border-color: var(--ok); background: #eaf6ee; }
.ex-select.graded-err { border-color: var(--err); background: #fdecea; }
.gmark { font-weight: 700; font-size: 14px; flex: 0 0 auto; }
.gmark.ok { color: var(--ok); }
.gmark.err { color: var(--err); }
.gmark.part { color: #b07d00; }
.corr-badge {
  display: inline-flex; align-items: center; gap: 5px; background: var(--pill-bg); color: var(--blue-dark);
  padding: 3px 10px; border-radius: 3px; font-size: 13px; white-space: nowrap;
}
.corr-badge b { font-weight: 700; }
.corr-badge code { background: transparent; }
.radio-opt.opt-correct { background: #eaf6ee; }
.radio-opt.opt-wrong { background: #fdecea; }
.radio-opt .gmark { margin-left: auto; }
.solution-path {
  border: 1px solid #cfe0f2; border-radius: 3px; margin: 12px 28px 6px; overflow: hidden;
}
.answer-row .solution-path { margin: 12px 0 2px; }
.sp-head {
  background: #eaf2fb; color: var(--blue-dark); font-weight: 700; padding: 9px 14px;
  display: flex; align-items: center; gap: 8px; font-size: 13.5px;
}
.sp-body { padding: 11px 16px; font-size: 13.5px; color: #333; }
.sp-body .math, .sp-body { line-height: 1.6; }
.sp-row { padding: 3px 0; border-bottom: 1px solid #eef2f6; }
.sp-row:last-child { border-bottom: none; }
.manual-hint { margin: 8px 0 2px; font-size: 13px; color: var(--blue-dark); display: flex; align-items: center; gap: 6px; }
/* AUSBAU-F: das Bewertungsraster unter dem Freitextfeld (nur bewertet) —
   eine Liste statt einer Zeile, deshalb Block statt Flex. */
.manual-hint.raster-hint { display: block; }
.raster-hint .raster-kopf { display: flex; align-items: center; gap: 6px; font-weight: 600; }
.raster-hint .raster-l { margin: 4px 0 0 20px; padding: 0; }
.raster-hint .raster-l li { margin: 2px 0; overflow-wrap: anywhere; }
.raster-hint .raster-p { font-weight: 600; white-space: nowrap; margin-left: 4px; }
.raster-hint .raster-alt, .raster-hint .raster-vor { font-size: 12px; opacity: .85; }
.raster-hint .raster-vor { margin-top: 4px; }

/* ---------------- Handschrift-Feld (Paket S2) ----------------
   „Rechne das auf Papier und fotografiere es." Der Kasten steht in der
   Pruefungsoberflaeche und traegt deshalb deren feste Farben (kein
   --pp-Token, Zwei-Welten-Prinzip); die dunkle Fassung fuers Training
   steht wie jede andere in css/prepp.css und NICHT hier.
   Die Fotos stehen als Raster, damit vier Bilder nicht vier Bildschirme
   hoch werden — jedes hoechstens 220 px hoch, angeklickt wird nichts
   (die Einsicht zeigt dasselbe Bild in derselben Groesse). */
.hs-feld { margin: 6px 0 2px; }
.hs-fotos { display: flex; flex-wrap: wrap; gap: 10px; }
.hs-fotos:empty { display: none; }
.hs-foto {
  position: relative; margin: 0; border: 1px solid var(--line); border-radius: 3px;
  background: #fff; padding: 4px; max-width: 260px;
}
.hs-foto img { display: block; max-width: 100%; max-height: 220px; height: auto; }
.hs-foto-lade {
  display: flex; align-items: center; justify-content: center;
  min-width: 150px; min-height: 90px; font-size: 12px; color: #667;
}
.hs-foto-weg {
  position: absolute; top: -8px; right: -8px; width: 22px; height: 22px;
  border-radius: 50%; border: 1px solid var(--line); background: #fff;
  color: #666; font-size: 13px; line-height: 1; cursor: pointer;
}
.hs-foto-weg:hover { border-color: var(--err); color: var(--err); }
.hs-akt { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin-top: 10px; }
.hs-zaehler { font-size: 12px; color: #667; }
.hs-msg { margin-top: 6px; font-size: 12.5px; color: #667; }
.hs-msg:empty { display: none; }
.hs-msg.err { color: var(--err); }
.hs-schritte { margin: 6px 0 0; padding-left: 20px; }
.hs-schritte li { padding: 2px 0; }
/* Notiz aus der textarea-Zeit (07.09.2026, HM2-Papieraufgaben): der getippte
   Text eines Versuchs, der abgegeben wurde, als das Feld noch ein Textfeld
   war. Er steht ueber den Fotos, schreibgeschuetzt und beim Namen genannt —
   ein Feld, das ihn stumm verschluckt, verloere Nutzerdaten. */
.hs-notiz { margin: 6px 0 8px; }
.hs-notiz-kopf { font-size: 12px; color: #667; margin-bottom: 4px; }
/* Die Notiz ist Prosa MIT Formeln, kein Programm. Sie stand bis zum
   15.09.2026 in einem <pre class="res-code"> — und `pre` steht in KaTeX'
   Vorgabe-ignoredTags, der typeset()-Durchgang der Ansicht kam also nie
   an sie heran (Begruendung bei hsNotizHtml in js/app.js). Zwei Dinge
   traegt deshalb jetzt das Stylesheet, die vorher das Element trug:
   die Zeilenumbrueche (white-space: pre-wrap, Muster .ki-msg) und die
   Breitenklemme. Die Schrift ist die des Fliesstexts — in Monospace
   stuende eine gesetzte Formel neben ihrem eigenen Rohtext.
   Hintergrund UND Textfarbe stehen ausdruecklich da: Der Kasten
   erscheint auch im Register der Einsicht, und das faerbt sich im
   dunklen Theme, ohne dass eine der beiden Dunkel-Regeln unten greift —
   eine geerbte helle Schrift waere dort unlesbar. */
.hs-notiz-txt {
  background: #f7f7f7; color: #222; border: 1px solid #e2e2e2;
  padding: 8px 12px; font-size: 13px; line-height: 1.5;
  max-width: 480px; overflow-x: auto;
  white-space: pre-wrap; overflow-wrap: anywhere;
}
/* Der Papier-Satz im LAUFENDEN Versuch (Foto-Timing, 24.08.2026). Er steht
   dort, wo sonst der Kameraknopf stand, und traegt deshalb sichtbares
   Gewicht: Ein Feld, das kommentarlos keinen Knopf zeigt, sieht kaputt aus.
   Feste Farben wie die ganze Pruefungsansicht (Zwei-Welten) — sie bleibt in
   beiden Themes hell, eine dunkle Fassung gibt es hier bewusst nicht. */
.manual-hint.hs-papier {
  display: block; margin: 8px 0 2px; padding: 9px 12px;
  border-left: 3px solid var(--blue); border-radius: 0 3px 3px 0;
  background: #f2f6fb; color: var(--blue-dark); line-height: 1.45;
}
.override-row {
  display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
  margin: 6px 28px 0; padding: 14px 0 4px; border-top: 1px solid var(--line); font-size: 13.5px; color: #555;
}
.override-row input { width: 90px; border: 1px solid #ccc; padding: 5px 8px; border-radius: 2px; }
.override-row .or-label { font-weight: 600; color: #444; }
.res-filter { font-size: 12px; color: #667; display: flex; align-items: center; gap: 5px; font-weight: 400; }
.hide-ok .answer-row.row-ok { display: none; }
.pill-run { background: #d9efe0 !important; color: #216b43 !important; }
/* rel1018-R6 (W3-07): gemessen 4,25 (voll) und 3,63 (teilweise) — die
   Schrift-Töne der Palette statt der Symbolfarben (≥ 5 : 1 auch beim Überfahren). */
.itembtn.res-full { color: var(--ok-text); }
.itembtn.res-partial { color: var(--warn-text); }
.itembtn.res-zero { color: var(--err); }
.itembtn.res-full.active, .itembtn.res-partial.active, .itembtn.res-zero.active { border-top-color: currentColor; font-weight: 700; }
.res-sum-list { padding: 8px 0 4px; }
.res-sum-row {
  display: flex; justify-content: space-between; align-items: center; padding: 12px 28px;
  border-bottom: 1px solid #f0f0f0; cursor: pointer; border-left: 4px solid #ccc;
}
.res-sum-row:hover { background: #f6f9fc; }
.res-sum-row.full { border-left-color: var(--ok); }
.res-sum-row.partial { border-left-color: var(--gold); }
.res-sum-row.zero { border-left-color: var(--err); }
.res-sum-row .rs-t { font-weight: 600; color: var(--txt-head); }
.res-sum-row .rs-p { font-weight: 600; }
.ovr-flag { color: var(--blue); font-weight: 400; font-size: 12px; }
.res-sum-hint { padding: 14px 28px; color: #888; font-size: 13px; }
.result-banner .score { font-size: 24px; }

/* ================= Editor (EDITING) ================= */
.nl-active { color: #cdd8e4 !important; }
.inline-svg svg { max-width: 100%; height: auto; }
.ed-head { display: flex; justify-content: space-between; align-items: center; margin: 6px 0 18px; }
.ed-row { display: flex; align-items: center; gap: 10px; background: #fff; border: 1px solid #d9d9d9; padding: 12px 18px; margin: 8px 0; }
.ed-row.slim { padding: 8px 14px; }
.ed-row-main { flex: 1; }
.ed-meta { color: #889; font-size: 12.5px; margin-left: 8px; }
.ed-empty { color: #888; padding: 18px 4px; }
.ed-backup { margin-top: 34px; display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.ai-box { border: 1px solid #cfe0f2; background: #f6faff; padding: 18px 20px; margin: 30px 0 10px; border-radius: 3px; }
.ai-steps { margin: 8px 0 14px; padding-left: 20px; font-size: 13.5px; }
.ai-steps li { margin: 5px 0; }
.ai-actions { display: flex; gap: 10px; align-items: center; flex-wrap: wrap; margin: 10px 0; }
.ai-box textarea { width: 100%; border: 1px solid #b9c8d6; padding: 9px 11px; font-family: Consolas, Menlo, monospace; font-size: 12px; }
/* Die drei Rückmeldekästen der KI-Wege (Import, Variation, Kartierung,
   Schaltungsdialog). Der Grund ist FEST und hell — die Schriftfarbe gehört
   deshalb in dieselbe Regel und muss in beiden Themes dunkel sein.
   Ohne sie erbt der Text die Portalfarbe: im dunklen Theme fast weiß auf
   Creme, gemessen 1,1:1 (.ai-warn/.ai-err) bzw. 2,29:1 (.ai-ok, das in
   prepp.css mit --pp-ok überschrieben war). Das traf auch den FEHLERkanal —
   ein gescheiterter Import zeigte seine Liste unlesbar an. Werte wie bei
   .lab-ai-* in css/lab.css, wo es von Anfang an richtig stand.
   Wer hier einen vierten Kasten ergänzt, setzt Grund UND Farbe. */
.ai-err { background: #fdecea; border-left: 3px solid var(--err); color: #8a1c13; padding: 10px 14px; margin-top: 10px; font-size: 13px; }
.ai-warn { background: #fdf6e3; border-left: 3px solid var(--gold); color: #7a5a12; padding: 10px 14px; margin-top: 10px; font-size: 13px; }
.ai-ok { background: #eaf6ee; border-left: 3px solid var(--ok); color: #1c6b3f; padding: 12px 14px; margin-top: 10px; font-size: 14px; }
.ai-err ul, .ai-warn ul { margin: 6px 0 2px; padding-left: 20px; }
.ed-editor { max-width: 1500px; margin: 0 auto; padding: 18px 24px 60px; }
.ed-toolbar { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin-bottom: 14px; }
.ed-title { font-size: 17px; font-weight: 600; padding: 7px 10px; border: 1px solid #ccc; flex: 1; min-width: 220px; }
.ed-durlbl { font-size: 13.5px; color: #555; }
.ed-cols { display: grid; grid-template-columns: 200px minmax(340px, 1fr) minmax(380px, 1.1fr); gap: 16px; align-items: start; }
@media (max-width: 1100px) { .ed-cols { grid-template-columns: 1fr; } }
.ed-items { background: #fff; border: 1px solid #ddd; padding: 10px; }
.ed-item { display: flex; align-items: center; gap: 6px; padding: 8px 8px; cursor: pointer; border-left: 3px solid transparent; }
.ed-item.active { background: #eef4fb; border-left-color: var(--blue); }
.ed-item span:first-child { flex: 1; }
.ed-item-btns button, .ed-bhead button { border: none; background: none; cursor: pointer; color: #789; font-size: 13px; padding: 1px 4px; }
.ed-blocks { background: #fff; border: 1px solid #ddd; padding: 14px; }
.ed-blockhead { display: flex; align-items: center; font-weight: 700; color: var(--txt-head); margin-bottom: 10px; }
.ed-block { border: 1px solid #e3e7ec; background: #fbfcfd; padding: 10px 12px; margin: 10px 0; }
.ed-bhead { display: flex; align-items: center; gap: 4px; margin-bottom: 6px; color: #445; }
.ed-block textarea { width: 100%; border: 1px solid #ccc; padding: 7px 9px; font-size: 13px; font-family: inherit; }
.ed-addblock { display: flex; gap: 8px; flex-wrap: wrap; margin-top: 12px; }
.ed-addblock button { border: 1px dashed #9db4c8; background: #f4f8fc; color: var(--blue-dark); padding: 7px 12px; font-size: 13px; cursor: pointer; }
.ed-field { border-top: 1px dashed #d5dde5; margin-top: 10px; padding-top: 8px; }
.ed-frow { display: flex; gap: 8px; align-items: center; flex-wrap: wrap; margin: 5px 0; font-size: 13px; }
.ed-frow label { display: flex; flex-direction: column; font-size: 11.5px; color: #667; gap: 2px; }
.ed-frow input, .ed-frow select { border: 1px solid #ccc; padding: 5px 7px; font-size: 13px; }
.ed-frow button { border: none; background: none; cursor: pointer; }
.ed-preview { position: sticky; top: 12px; }
.ed-prevlbl { font-size: 12px; letter-spacing: 1px; color: #98a4b0; text-transform: uppercase; margin-bottom: 6px; }
.ed-cirprev { background: #fff; border: 1px solid #eee; text-align: center; padding: 6px; margin: 6px 0; }
.ed-cirprev svg { max-width: 100%; height: auto; max-height: 220px; }

/* ---- Schaltbild-Editor ---- */
.cir-modal { position: fixed; inset: 0; background: rgba(20,30,45,.6); z-index: 200; display: flex; align-items: center; justify-content: center; }
.cir-win { background: #fff; width: 96vw; height: 92vh; display: flex; flex-direction: column; box-shadow: 0 6px 40px rgba(0,0,0,.4); }
.cir-top { display: flex; align-items: center; gap: 10px; padding: 10px 16px; border-bottom: 1px solid #ddd; }
.cir-hint { color: #889; font-size: 12px; max-width: 46vw; }
.cir-body { flex: 1; display: flex; min-height: 0; }
.cir-pal { width: 132px; overflow-y: auto; border-right: 1px solid #e3e3e3; padding: 8px; display: flex; flex-direction: column; gap: 4px; }
.cir-tool { display: flex; flex-direction: column; align-items: center; gap: 2px; border: 1px solid #dfe5ea; background: #fff; padding: 5px 4px; font-size: 11px; color: #345; cursor: pointer; }
.cir-tool.active { border-color: var(--blue); background: #eef4fb; }
.cir-canvas-wrap { flex: 1; overflow: auto; background: #fdfdfd; }
#cir-svg { width: 1600px; height: 1020px; outline: none; cursor: crosshair; }
.cir-props { width: 230px; border-left: 1px solid #e3e3e3; padding: 12px; font-size: 13px; }
.cir-props h4 { margin: 2px 0 10px; color: var(--txt-head); }
.cir-props label { display: block; margin: 8px 0 2px; color: #556; font-size: 12px; }
.cir-props input[type=text], .cir-props input:not([type]) { width: 100%; border: 1px solid #ccc; padding: 6px 8px; font-size: 13px; }
.cir-props .cp-check { display: flex; align-items: center; gap: 6px; flex-direction: row; }
.cir-props button { margin-top: 10px; display: block; width: 100%; }
.cir-p-empty { color: #99a; font-size: 12.5px; }
.cir-p-hint { color: #8a96a2; font-size: 11.5px; margin-top: 6px; }
.cir-status { border-top: 1px solid #e3e3e3; padding: 6px 16px; font-size: 12px; color: #556; min-height: 27px; }
.modal-bg.over-editor { z-index: 400; } /* Netzliste/Bode liegen ÜBER dem Schaltbild-Editor */
.bode-mode { border-bottom: 1px solid #e3e8ee; padding-bottom: 8px; margin-bottom: 8px; font-size: 13px; }
.bode-struct { font-size: 12.5px; color: #2f5a80; background: #eef4fb; padding: 7px 10px; margin-top: 8px; border-radius: 3px; }
.bode-cols { display: grid; grid-template-columns: 280px 1fr; gap: 18px; align-items: start; }
.bode-side label { display: block; font-size: 12px; color: #556; margin: 8px 0 2px; }
.bode-side input:not([type="radio"]):not([type="checkbox"]) { width: 100%; border: 1px solid #ccc; padding: 6px 8px; font-size: 13px; }
.bode-probes { max-height: 220px; overflow-y: auto; border: 1px solid #e3e8ee; padding: 8px 10px; background: #fafcff; font-size: 13px; }
.bode-probes label { margin: 4px 0; }
.bode-plot { background: #fff; border: 1px solid #e3e3e3; min-height: 380px; display: flex; align-items: center; justify-content: center; }
.bode-plot svg { max-width: 100%; height: auto; }
/* Ableseleiste unter dem Diagramm: zeigt die Kennwerte, beim Überfahren die
   Werte am Cursor. */
.bode-readout {
  min-height: 34px; padding: 8px 10px; margin-top: 6px;
  background: #f7f9fb; border: 1px solid #e3e3e3; border-radius: 4px;
  font-size: 12.5px; color: #333c48; line-height: 1.5;
}
.bode-opts { margin-top: 10px; border-top: 1px solid #e6e6e6; padding-top: 8px; }
.bode-opts .cp-check { display: block; margin: 4px 0; font-size: 12.5px; }
.cir-status .cs-dim { color: #9aa; margin-right: 10px; font-family: Consolas, monospace; }
#cir-svg { cursor: crosshair; }
#cir-svg [data-el]:hover { opacity: .8; }

/* ================= Simulation (Transient / Stationär) ================= */
.modal.sim-modal { /* .modal.sim-modal schlägt die spätere .modal-Basisregel (max-width 480px) */
  width: 96vw; max-width: 1560px; height: 92vh; max-height: 92vh;
  display: flex; flex-direction: column; padding: 18px 24px; box-sizing: border-box;
}
.sim-cols { display: grid; grid-template-columns: 290px minmax(0, 1fr); gap: 18px; align-items: stretch; flex: 1; min-height: 0; }
.sim-cols .bode-side { overflow-y: auto; min-height: 0; padding-right: 4px; }
.sim-plot { height: 100%; min-height: 0; overflow: auto; }
.sim-note {
  background: #fff7e0; border: 1px solid #ecd9a0; color: #7a5c12; border-radius: 7px;
  font-size: 13px; padding: 8px 12px; margin-bottom: 12px;
}
.sim-tab:disabled { opacity: .45; cursor: not-allowed; }
.sim-tab:disabled:hover { color: #566; background: transparent; box-shadow: none; transform: none; }
.sim-head { display: flex; align-items: center; gap: 18px; margin-bottom: 12px; flex-wrap: wrap; }
.sim-tabs { display: inline-flex; background: #eef1f5; border-radius: 8px; padding: 3px; gap: 2px; }
.sim-tab {
  border: none; background: transparent; padding: 7px 16px; font-size: 13.5px; color: #566;
  border-radius: 6px; cursor: pointer; transition: background .18s ease, color .18s ease, box-shadow .18s ease;
}
.sim-tab:hover { color: #123; }
.sim-tab.active { background: #fff; color: var(--blue); font-weight: 600; box-shadow: 0 1px 4px rgba(20,40,70,.14); }
.sim-plot { display: flex; flex-direction: column; align-items: center; justify-content: flex-start; gap: 14px; padding: 12px; }
.sim-plot > svg { flex: none; }
.sim-duo { display: flex; gap: 14px; flex-wrap: wrap; align-items: flex-start; justify-content: center; }
.sim-duo svg { max-width: 100%; height: auto; }
.hidden { display: none !important; }
.cp-sep { border: none; border-top: 1px solid #e3e8ee; margin: 14px 0 4px; }
.val-table td, .val-table th { padding: 5px 14px; }

/* Signalform-Umschalter (DC / AC / Sprung) — wie die Sim-Tabs, nur kompakt */
.sig-toggle { display: flex; background: #eef1f5; border-radius: 7px; padding: 3px; gap: 2px; margin: 4px 0 6px; }
.sig-toggle button {
  flex: 1; border: none; background: transparent; padding: 6px 4px; font-size: 12px; color: #566;
  border-radius: 5px; cursor: pointer; white-space: nowrap;
  transition: background .15s ease, color .15s ease, box-shadow .15s ease;
}
.sig-toggle button:hover { color: #123; }
.sig-toggle button.active { background: #fff; color: var(--blue); font-weight: 600; box-shadow: 0 1px 3px rgba(20,40,70,.15); }

/* Wert-Zeile (Simulationsfenster). Der modale Werte-Dialog beim Platzieren
   ist entfallen — an seine Stelle ist das Wertefenster des Labors getreten
   (.lab-card in lab.css). */
.vd-row { display: flex; align-items: stretch; gap: 6px; }
.vd-row input { flex: 1; min-width: 0; border: 1px solid #ccc; border-radius: 6px; padding: 8px 10px; font-size: 14px; }
.vd-row input:focus { outline: none; border-color: var(--blue); box-shadow: 0 0 0 3px rgba(46,127,194,.15); }
.vd-unit {
  display: flex; align-items: center; padding: 0 12px; background: #f2f5f8; border: 1px solid #d5dde4;
  border-radius: 6px; color: #456; font-size: 13.5px; font-family: Georgia, serif; min-width: 20px; justify-content: center;
}
.vd-row .btn-ghost { padding: 6px 10px; font-size: 12px; white-space: nowrap; }

/* Kurven zeichnen sich beim Erscheinen (nur am Bildschirm, nicht im Export) */
.sim-plot .sim-curve, .bode-plot .bode-curve {
  stroke-dasharray: 1; stroke-dashoffset: 1;
  animation: simdraw 0.9s ease-out forwards;
}
@keyframes simdraw { to { stroke-dashoffset: 0; } }

/* ================= Moderner Feinschliff (Editor & Dialoge) ================= */
.cir-modal { backdrop-filter: blur(3px); animation: fadein .18s ease-out; }
.modal-bg { backdrop-filter: blur(2px); animation: fadein .16s ease-out; }
@keyframes fadein { from { opacity: 0; } to { opacity: 1; } }
.cir-win { border-radius: 10px; overflow: hidden; box-shadow: 0 18px 60px rgba(10,20,40,.45); animation: popin .2s ease-out; }
.modal { border-radius: 10px; animation: popin .2s ease-out; }
@keyframes popin { from { transform: translateY(10px) scale(.985); opacity: .4; } to { transform: none; opacity: 1; } }
.cir-tool { border-radius: 7px; transition: border-color .15s ease, background .15s ease, transform .12s ease, box-shadow .15s ease; }
.cir-tool:hover { border-color: #b7c6d6; background: #f6f9fc; transform: translateY(-1px); box-shadow: 0 2px 6px rgba(30,60,100,.08); }
.cir-tool.active { box-shadow: inset 0 0 0 1px var(--blue); }
.btn-ghost { border-radius: 6px; transition: background .15s ease, color .15s ease, border-color .15s ease; }
.btn-ghost:hover { background: #f2f5f8; color: #345; border-color: #a9b6c2; }
.btn-blue { border-radius: 6px; transition: background .15s ease, transform .1s ease; }
.btn-blue:active { transform: scale(.97); }
.btn-outline { border-radius: 6px; }
.cir-props input, .cir-props select, .bode-side input:not([type="radio"]):not([type="checkbox"]) { border-radius: 6px; transition: border-color .15s ease, box-shadow .15s ease; }
.cir-props input:focus, .bode-side input:not([type="radio"]):not([type="checkbox"]):focus { outline: none; border-color: var(--blue); box-shadow: 0 0 0 3px rgba(46,127,194,.15); }
.cir-props select { width: 100%; border: 1px solid #ccc; padding: 6px 8px; font-size: 13px; background: #fff; }
.bode-probes { border-radius: 7px; }
.bode-plot { border-radius: 8px; }

.auto-badge { font-size: 11.5px; padding: 4px 10px; border-radius: 12px; white-space: nowrap; font-weight: 600; }
.auto-badge.auto-full { background: #e6f5ec; color: #216b43; }
.auto-badge.auto-most { background: #eef4fb; color: #2f5a80; }
.auto-badge.auto-few { background: #fdf1e3; color: #8a5a12; }
.ai-stats { font-size: 12.5px; color: #47607a; margin-top: 5px; }

/* ================= Lückentext & Zuordnung ================= */
.cloze-text { line-height: 2.5; font-size: 15px; color: var(--txt); margin-top: 6px; }
.cz-slot { display: inline-flex; align-items: center; gap: 4px; white-space: nowrap; }
.cloze-in {
  border: none; border-bottom: 2px solid var(--blue); background: #f7fbff;
  padding: 3px 8px; font-size: 15px; font-family: inherit; color: #123;
  border-radius: 4px 4px 0 0; min-width: 70px; transition: background .15s ease, border-color .15s ease;
}
.cloze-in:focus { outline: none; background: #eaf3fc; box-shadow: 0 2px 0 0 var(--blue); }
.cloze-in.answered { background: #eef6ff; }
.cloze-in.graded-ok { border-bottom-color: #2e9e5b; background: #eaf7ef; }
.cloze-in.graded-err { border-bottom-color: #c0392b; background: #fdeeec; }
.cz-sel { padding: 3px 6px; font-size: 14px; min-width: 120px; }
.cz-corr { margin-left: 2px; }
.cz-bank { margin: 8px 0 4px; font-size: 13px; color: #667; }
.cz-chip {
  display: inline-block; background: #eef1f5; border: 1px solid #dde3ea; border-radius: 14px;
  padding: 3px 11px; margin: 2px 3px; font-size: 13px; color: #345;
}
.match-table { border-collapse: collapse; margin-top: 8px; width: 100%; max-width: 720px; }
.match-table td { padding: 6px 10px 6px 0; vertical-align: middle; }
.match-table tr + tr td { border-top: 1px solid #eef1f4; }
.mt-left { font-size: 14.5px; color: var(--txt); width: 45%; }
.mt-right { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.mt-right select { min-width: 220px; }
.auto-hint { background: #eef6ff; border-color: #cfe2f5; color: #2f5a80; }

/* ---- Matrix-Felder & Mathe ---- */
/* Befund B13 (06.09.2026 — S2): `.mx-wrap` zentrierte mit
   `justify-content: center` und hatte KEIN overflow-x (das hatte nur
   .table-wrap). Eine 5-spaltige Matrix (536 px) ragte bei 390 px über
   BEIDE Kanten, und der linke Überhang war per Konstruktion nicht
   erreichbar — 3 von 5 Zellen sichtbar, auch nach vollem Rollen; in der
   Prüfung dazu 20 px Dokument-Überlauf.

   Zentriert wird deshalb über AUTO-MARGINS, wörtlich wie beim
   Aufgabenstreifen (B58): Sie lösen sich bei fehlendem freien Platz zu 0
   auf — passt die Matrix, steht sie mittig wie bisher; passt sie nicht,
   beginnt sie links und ist von scrollLeft 0 an vollständig erreichbar.
   `justify-content: center` verteilt den Überlauf dagegen auf beide
   Seiten und legt den Bildlauf-Nullpunkt in die Mitte. */
.mx-wrap { display: flex; justify-content: flex-start; overflow-x: auto; margin-top: 10px; }
.mx-wrap > * { margin-left: auto; margin-right: auto; }
table.mx-table { border-collapse: collapse; border: 1.6px solid #55606c; }
table.mx-table td { border: 1px solid #8a95a1; padding: 7px 10px; text-align: center; }
table.mx-table .mx-cell { width: 86px; border: none; background: #fff; }
table.mx-table .mx-cell.graded-ok { background: #eaf6ee; }
table.mx-table .mx-cell.graded-err { background: #fdecea; }
.mx-corr { display: block; margin-top: 4px; font-size: 12px; }

/* ---- Feldarten mit eigener Gestalt IN EINER ZELLE (09.09.2026) ----
   Matrix, Auswahl, Lückentext und Zuordnung gehen seitdem auch durch
   inputHtml, also in eine Tabellenzelle, eine Inline-Zeile oder eine
   Statusbit-Zeile (docs/VEKTOR-EINGABE-2026-09-09.md). Dort gelten andere
   Maße als in der .answer-row: Die Zelle ist eng, und ihr Inhalt darf sie
   nicht sprengen — die Tabelle rollt in .table-wrap, aber ein Feld, das
   200 px breiter ist als nötig, schiebt jede Nachbarspalte aus dem Bild.

   Die Marke (✓/✗/∅) steht neben dem Block statt in ihm: .graded-field ist
   eine inline-flex-Zeile, .feld-block richtet sie an der OBERKANTE aus —
   bei einem dreizeiligen Vektor stünde sie sonst neben der mittleren
   Zeile und sähe aus, als gehöre sie zu ihr. */
.graded-field.feld-block { align-items: flex-start; }
/* Kein margin-top in der Zelle (die .answer-row braucht ihn, die Zelle
   nicht) und keine Auto-Margins: In einer <td> ist die Breite schon die
   des Inhalts, das Zentrieren erledigt text-align der Zelle. */
.mx-wrap.mx-zelle { margin-top: 0; display: inline-flex; }
.mx-wrap.mx-zelle > * { margin-left: 0; margin-right: 0; }
/* 64 statt 86 px: ein Vektoreintrag ist eine Zahl, kein Term. Der
   Selektor ist dreiteilig, damit er die spätere `table.ex-table .ex-input`
   (90 px) sicher schlägt — sie steht weiter oben und trifft die Zelle mit,
   weil .mx-cell selbst .ex-input ist. */
table.mx-table.mx-schmal .mx-cell { width: 64px; }
table.mx-table.mx-schmal td { padding: 4px 6px; }
/* Auswahl in der Zelle: ohne den 28-px-Rand der .radio-list und ohne die
   16-px-Zeilenpolster — eine Optionsliste in einer Tabellenzelle wäre
   sonst höher als die ganze Tabelle. */
.radio-list.rl-zelle { padding: 0; text-align: left; }
.radio-list.rl-zelle .radio-opt {
  padding: 3px 0; gap: 8px; border-top: none; font-size: 13.5px;
}
.radio-list.rl-zelle .radio-opt:first-child { padding-top: 0; }
/* Zuordnung und Lückentext in der Zelle: linksbündig (die Zelle zentriert,
   eine mehrzeilige Zuordnung darunter läse sich sonst als Fließtext) und
   mit dem engeren Zeilenabstand der Zelle. */
.match-zelle { text-align: left; }
.match-zelle .match-table { margin-top: 0; }
table.ex-table td > .cloze-text, table.dyn-table td > .cloze-text,
.graded-field .cloze-text { line-height: 2; margin-top: 0; text-align: left; }
/* Freitext und Programm in der Zelle: ein echtes <textarea> statt eines
   einzeiligen <input> — ein Zeilenumbruch ist bei einer Herleitung oder
   einem Programm die Antwort. Die Klasse trägt nur die inputHtml-Fassung;
   die .answer-row hat ihre eigene, breitere. */
.ex-textarea.ta-zelle {
  width: 100%; min-width: 180px; max-width: 420px;
  font-size: 13.5px; text-align: left; vertical-align: top;
}
/* Was eine Zelle nicht tragen kann, sagt es (statt ein Textfeld
   anzubieten, das nie ein Foto halten könnte). Feste Farben wie das
   Speicherbanner: Der Kasten erscheint in beiden Welten. */
.feld-unpassend {
  display: inline-block; padding: 4px 8px; border-radius: 3px;
  background: #fff4e5; border: 1px solid #f0c890; color: #7a4a00;
  font-size: 12.5px; text-align: left; max-width: 260px;
}

/* Formeleingabe (mathexpr). ECHTES-RWTH-SYSTEM: klickbare Antwortfläche mit
   der gerenderten Formel im grauen Kasten; die Eingabe passiert im Dialog. */
.mexpr-face {
  display: inline-flex; align-items: center; justify-content: center;
  min-width: 200px; min-height: 34px; padding: 3px 8px;
  border: none; border-bottom: 1px solid var(--line-dark); border-radius: 0;
  background: transparent; cursor: pointer; font: inherit; color: #222;
}
.mexpr-face:not(:disabled):hover, .mexpr-face:not(:disabled):focus-visible { border-bottom-color: var(--blue); }
.mexpr-face:disabled { cursor: default; }
.mexpr-face.small { min-width: 110px; }
.mexpr-face.answered { background: #f0f6fc; }
.mexpr-face .mexpr-ph { color: #666; }   /* „Formel"/„Formula": 1,96 → ≥ 4,99 (W3-07) */
.mexpr-chip { background: #eef1f4; border-radius: 4px; padding: 2px 10px; }
.mexpr-face.graded-ok { background: #eaf6ee; border-bottom-color: var(--ok); }
.mexpr-face.graded-err { background: #fdecea; border-bottom-color: var(--err); }
.mexpr-face.graded-ok .mexpr-chip, .mexpr-face.graded-err .mexpr-chip { background: transparent; padding: 0; }
.mexpr-key code, .mexpr-key .katex { font-weight: 600; }

/* Formeldialog. Zwei Klassen, sonst gewinnt die spätere .modal-Basisregel
   mit max-width 480px (Fallstrick 4). */
.modal.mexpr-modal { max-width: 560px; }
.mexpr-syntax { color: #55606c; margin: 0 0 14px; }
/* Das Eingabefeld ist hier ein umrandeter Kasten, kein unterstrichenes Feld
   wie sonst in der Prüfungsansicht — im echten System steht an dieser Stelle
   eine eigene Eingabefläche, und der Dialog hat nichts, wovon sie sich
   absetzen müsste. Zwei Klassen, sonst gewinnt .ex-input mit border: none. */
.mexpr-modal .mexpr-input {
  width: 100%; text-align: left; font-size: 16px; padding: 11px 14px;
  border: 1px solid var(--line-dark); border-radius: 6px; background: #fff;
}
.mexpr-modal .mexpr-input:focus { border-color: var(--blue); }
.mexpr-preview {
  min-height: 64px; margin-top: 18px;
  display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 4px;
}
.mexpr-preview .mexpr-none { color: #98a2ad; }
.mexpr-preview .mexpr-nofml { color: #98a2ad; font-size: 12px; }
/* Die Variablen-Hinweiszeile unter der Vorschau (T17, 22.08.2026) — im
   hellen Dialog dieselbe gedeckte Nebenrolle wie .mexpr-nofml; die
   Fassung fürs dunkle Training steht in prepp.css. */
.mexpr-preview .mexpr-varhint { color: #98a2ad; font-size: 12px; }

/* Physik-Fassung der Formeleingabe (f.entry === "inline"): Textfeld wie
   ueberall, darunter der graue Interpretations-Kasten in voller Breite —
   die Meldung zur ungueltigen Eingabe als roter Block darin. Feste Farben
   im Stil der Pruefungsansicht, an kein Portal-Theme gebunden.
   Seit I10 (22.08.2026) steht der Kasten als GESCHWISTER der .fieldline
   in der .answer-row (Blockfluss) — das fruehere flex-basis:100% hier hat
   nie gewirkt: Die .fieldline bricht bewusst nicht um (kein flex-wrap,
   sonst rutschte der Pruefpfeil von 884 Feldzeilen auf eine dritte
   Zeile), also blieb der Kasten NEBEN dem Feld statt darunter. */
.mexpr-panel { width: 100%; }
.mexpr-panel:not(:empty) {
  margin-top: 10px; padding: 14px 16px;
  background: #f5f6f7; border: 1px solid #e3e6e9; border-radius: 3px;
  display: flex; flex-direction: column; align-items: center; gap: 8px;
}
.mexpr-panel .mexpr-int { color: #3d4650; font-size: 14px; text-align: center; }
.mexpr-panel .mexpr-int-f { font-size: 16px; }
.mexpr-panel .mexpr-fremd { color: #8a5a00; margin-top: 4px; } /* PrepP-Zusatz: unbekannte Variable benennen (02.09.2026) */
.mexpr-panel .mexpr-invalid {
  background: #f8d9d7; border: 1px solid #f1b7b4; border-radius: 3px;
  color: #a03e39; font-size: 13.5px; padding: 8px 14px; text-align: center;
}
.radio-opt.opt-math { justify-content: center; }
.radio-opt.opt-math > span { flex: 0 1 auto; margin: 0 auto; }
.radio-opt.opt-math input { position: absolute; left: 36px; }
.radio-opt { position: relative; }

/* Modal */
.modal-bg {
  position: fixed; inset: 0; background: rgba(20,30,45,.55); z-index: 100;
  display: flex; align-items: center; justify-content: center;
}
.modal { background: #fff; max-width: 480px; width: 92%; padding: 26px 30px; box-shadow: 0 4px 30px rgba(0,0,0,.35); }
.modal h3 { margin: 0 0 10px; color: var(--txt-head); }
.modal .m-actions { display: flex; justify-content: flex-end; gap: 12px; margin-top: 22px; }
.modal .warnline { color: var(--warn-text); font-size: 13.5px; }

/* ================= Schmale Fenster (Handy, Tablet hochkant) =================
   Die Pruefungsansicht ist originalgetreu und bleibt es (Zwei-Welten-Prinzip,
   CLAUDE.md §5) — alles hier ist additiv und greift erst unterhalb von 760 px.
   Am Desktop aendert sich nichts. */
@media (max-width: 760px) {
  .hdr-inner, .content, .section-title { padding-left: 16px; padding-right: 16px; }
  .answer-row { padding-left: 28px; }
  .codeline .cpre { width: 130px; }

  /* Auswahl in einer Tabellenzelle: Am Desktop stehen die Optionen eng
     (3 px), weil eine Tabelle mit mehreren solchen Spalten sonst höher
     wird als der Bildschirm. Auf dem Telefon ist Fingerbreite wichtiger
     als Zeilenzahl — gemessen 26 px, mit 12 px Polster 44 (R3 der Abnahme
     vom 06.09.2026). Die Tabelle rollt dort ohnehin in ihrem eigenen
     .table-wrap, die zusätzliche Höhe kostet also nur Scrollweg. */
  .radio-list.rl-zelle .radio-opt { padding: 12px 0; }
  .radio-list.rl-zelle .radio-opt:first-child { padding-top: 12px; }

  /* Der Schluesselknopf rueckt gemeinsam mit dem padding nach innen. */
  .answer-row .solkey { left: 4px; }

  /* Die Punktzahl sass absolut oben rechts, ohne dass Label oder Optionsliste
     rechts Platz reserviert haetten — auf schmalen Zeilen lief der Inhalt
     darunter durch. Sie steht als erstes Kind der .answer-row und landet im
     Fluss deshalb genau dort, wo sie hingehoert: rechtsbuendig ueber dem
     Label. */
  .answer-row .pts { position: static; display: block; text-align: right; margin-bottom: 2px; }

  /* Mathe-Optionen: Am Desktop ist das Radio aus dem Fluss genommen und die
     Formel ueber die volle Zeilenbreite zentriert. Sobald die Formel breiter
     ist als Zeile minus 2*36 px, liegt sie AUF dem Radio — auf dem Handy der
     Regelfall. Hier also zurueck in den Fluss; die Formel darf in ihrer
     eigenen Spur scrollen, statt die Zeile zu sprengen. */
  .radio-opt.opt-math { justify-content: flex-start; }
  .radio-opt.opt-math input { position: static; left: auto; }
  /* overflow-y muss ausdruecklich hidden sein: Sobald overflow-x auto ist,
     rechnet CSS die andere Achse ebenfalls auf auto hoch — KaTeX ragt um
     rund 2 px ueber die Zeilenhoehe hinaus, und es erschien ein senkrechter
     Rollbalken neben jeder Formel. Das padding gibt dem Ueberstand Platz,
     damit hidden nichts abschneidet. */
  .radio-opt.opt-math > span {
    margin: 0; flex: 1 1 auto; min-width: 0;
    overflow-x: auto; overflow-y: hidden; padding: 6px 0;
  }

  /* Ueberlaeuft eine Optionszeile doch, bricht sie um, statt ✓/✗ (.gmark
     haengt an margin-left:auto) aus dem Bild zu schieben. */
  .radio-opt { flex-wrap: wrap; padding-left: 0; padding-right: 0; gap: 10px; }
  .radio-list { padding: 0 16px; }

  /* --- Alles, was breiter als das Viewport werden konnte (Auftrag B) ---
     Regel: Breiter Inhalt scrollt IN seinem Kasten; das Dokument selbst
     scrollt nie seitlich. */

  /* Zuordnung: 45 % links plus 220 px Auswahlfeld rechts passen nicht in
     360 px. Die Zeile wird deshalb gestapelt. */
  .match-table, .match-table tbody, .match-table tr, .match-table td { display: block; width: auto; }
  .match-table td { padding: 4px 0; }
  .match-table tr + tr td { border-top: none; }
  .match-table tr + tr { border-top: 1px solid #eef1f4; margin-top: 6px; padding-top: 6px; }
  .mt-left { width: auto; }
  .mt-right select { min-width: 0; max-width: 100%; width: 100%; }

  /* Tabellen aus b.html (.given-table/.ov-table/.formula) stehen roh im
     Textblock, nie im .table-wrap — der entsteht nur fuer table-, microprog-
     und machinetable-Bloecke. Der Textblock ist hier ihr Scroll-Kasten. */
  .iblock-text { overflow-x: auto; }

  /* Lueckentext: nowrap plus feste Mindestbreiten sprengten die Zeile.
     flex-wrap (21.09.2026): Der Slot ist inline-flex — white-space allein
     laesst seine KINDER nicht umbrechen. Der Schluessel-Badge (nowrap, seit
     dem 21.09. auch eine KaTeX-Formel, die kein Umbruch teilt) stand bei
     390 px bis 95 px ueber der Karte und wurde abgeschnitten (WebKit
     gemessen, docs/abnahme/cloze-dollar-0921). Jetzt rutscht er unter das
     Eingabefeld, sobald beide nicht nebeneinander passen. */
  .cz-slot { white-space: normal; flex-wrap: wrap; }
  .cloze-in { min-width: 56px; max-width: 100%; }
  .cz-sel { min-width: 0; max-width: 100%; }

  /* Feste Eingabebreiten. */
  .ex-input { max-width: 100%; }
  .mexpr-face { min-width: 0; max-width: 100%; }

  /* Die untere Leiste ist position: fixed — sie zieht das Dokument also
     nicht auf, ihre Knoepfe liefen aber trotzdem rechts aus dem Bild
     ("PRÜFUNG STARTEN" war nur noch halb da). Sie schrumpfen kann sie nicht:
     min-width: auto haelt jeden Knopf auf Textbreite. Also weniger Rand und
     kleinere Schrift; die Aufgabenleiste dazwischen scrollt ohnehin. */
  .exam-bottom .ov-btn { margin: 8px 4px; padding: 0 10px; font-size: 12px; gap: 6px; }
  .exam-bottom .submit-btn { padding: 0 12px; font-size: 12px; gap: 6px; }
  .itembar { min-width: 0; }

  /* W1-04: Der Aufgabentext ist auf dem Telefon sein eigener Rollkasten —
     wie .iblock-text oben. overflow-y ausdrücklich hidden (sonst rechnet CSS
     die zweite Achse auf auto hoch, und KaTeX' 2-px-Überstand bekäme einen
     senkrechten Rollbalken); das untere Polster gibt ihm Platz. */
  .task-bar .txt { overflow-x: auto; overflow-y: hidden; padding-bottom: 2px; }
  .task-bar .txt pre { max-width: 100%; overflow-x: auto; }
}
@media (max-width: 640px) {
  /* W1-13 (qa1013): Das PLA-Raster (648 px) schrumpfte bei 390 px auf
     350 px — 130 Kreuzungen im ~19-px-Abstand, und ein Fehltipp setzt
     einen falschen Punkt („richtige minus falsche"). Auf dem Telefon
     steht es in VOLLER Größe in seiner eigenen Rollspur (62 × 34 px
     zwischen den Kreuzungen); die Kante sagt, dass es weitergeht. */
  .pla-wrap { overflow-x: auto; text-align: left; padding-left: 0; padding-right: 0; }
  .pla-wrap svg { max-width: none; }
  /* W3-34: Die Knöpfe der Vorschau-Fußleiste stehen nur mit Zeichen da
     (aria-label trägt das Wort) — sonst blieben dem Aufgabenstreifen
     zwischen ihnen 10 px. */
  .exam-bottom .ov-txt { display: none; }
  .exam-bottom .ov-btn { min-width: 44px; justify-content: center; }
}

/* W1-02 = A1-09 (qa1013, 14.10.2026 — S2): Antwortfelder auf dem FINGER.
   Gemessen an 3002 Feldern in 649 Aufgaben (390 px): alle 14,5 px Schrift
   und 22–27 px hoch. iOS zoomt beim Antippen jedes Feldes unter 16 px die
   Seite heran — in der App bleibt der Zoom stehen (Pinch ist in der Hülle
   aus, A1-01) —, und 26 px sind kein Fingerziel. Darum auf `(pointer:
   coarse)`, nicht auf eine Breite: Ein iPad quer ist breit und trotzdem
   ein Finger; ein schmales Desktopfenster bleibt originalgetreu.
   Die Selektoren sind so spezifisch wie die engeren Regeln weiter oben
   (.codeline/table.machine/table.mx-table), sonst gewönnen dort 12,5 px. */
@media (pointer: coarse) {
  .ex-input, .codeline .ex-input, table.machine .ex-input, table.mx-table .mx-cell,
  .statusline .ex-input, .cloze-in, .ex-select, .cz-sel, .mt-right select, .mexpr-face {
    font-size: 16px; min-height: 44px;
  }
  /* Ein Auswahlfeld im Standard-Aussehen (menulist) übergeht in WebKit
     min-height und Polster — gemessen blieb es nach der Regel oben bei
     23 px (249 Felder). `menulist-button` behält den Pfeil des Systems
     und nimmt die Höhe an. */
  .ex-select, .cz-sel, .mt-right select {
    -webkit-appearance: menulist-button; appearance: menulist-button;
    height: 44px; padding-top: 0; padding-bottom: 0;
  }
  /* W1-19: Tippziele außerhalb der Felder — Abgabedialog (37 px),
     „Deselect" (30 px). */
  .modal .m-actions button, .deselect-btn { min-height: 44px; }
  /* OVERVIEW und die Knöpfe der Vorschau standen mit 8 px Rand in der
     54-px-Leiste (38 px hoch); mit 5 px sind es 44, die Leiste bleibt. */
  .exam-bottom .ov-btn { margin-top: 5px; margin-bottom: 5px; }
}
@media print {
  .exam-top, .exam-bottom, .timerbox, .navcards { display: none !important; }
  .exam-scroll { padding: 0; }
}

/* ---------------- Kursübersicht / Footer / Mehrfachauswahl ---------------- */
.course-card { cursor: pointer; }
.course-card:hover { box-shadow: 0 2px 10px rgba(0,0,0,.14); }
.course-card .meta { min-height: 96px; }

.site-footer {
  margin-top: 56px; padding: 18px 20px; border-top: 1px solid #dfe4ea;
  font-size: 12.5px; line-height: 1.65; color: #6b7683; background: #fafbfc;
}
.site-footer b { color: #3d5a77; }
.site-footer .ft-dim { color: #94a0ac; }

.multi-opt input { accent-color: #3d84c6; }
.multi-hint { font-size: 12.5px; color: #8a939d; margin: 6px 0 0 2px; font-style: italic; }

/* Formelzeile in Aufgabentexten (DGL-Ansätze o.ä.) */
.formula {
  font-family: Georgia, "Times New Roman", serif; font-size: 16px;
  text-align: center; margin: 12px 0; padding: 8px 0;
  background: #f7f9fb; border-left: 3px solid #c8d6e4;
}
/* Wertetabelle für gegebene Größen */
.given-table { border-collapse: collapse; margin: 10px 0 14px; font-size: 14px; }
.given-table td { border: 1px solid #d8dee5; padding: 5px 14px; }
.given-table td:first-child { background: #f6f8fa; color: #3d5a77; }

/* ---------------- KaTeX / Aufgabenübersicht ---------------- */
.katex { font-size: 1.08em; }
/* Displayformeln koennen beliebig breit werden und schoben bisher die ganze
   Seite auf. Global vertretbar: Am Desktop erscheint der Scrollbalken nur
   dort, wo die Formel ohnehin uebergelaufen waere — sonst aendert sich
   nichts. overflow-y bleibt hidden, sonst schneidet Chrome Bruchstriche an. */
.katex-display { max-width: 100%; overflow-x: auto; overflow-y: hidden; }
.iblock .katex-display { margin: 10px 0; }
.formula .katex-display { margin: 4px 0; }
.given-table td:nth-child(even) { font-family: KaTeX_Main, 'Times New Roman', Georgia, serif; }
.ov-table { border-collapse: collapse; width: 100%; max-width: 760px; margin: 12px 0 4px; font-size: 14.5px; }
.ov-table th { text-align: left; border-bottom: 2px solid #16283e; padding: 7px 10px; color: #16283e; }
.ov-table td { border-bottom: 1px solid #e2e6ea; padding: 7px 10px; }
.ov-table th:nth-child(2), .ov-table td:nth-child(2),
.ov-table th:nth-child(3), .ov-table td:nth-child(3) { text-align: center; }
.ov-table td:nth-child(3) { font-family: KaTeX_Main, 'Times New Roman', serif; }
.ov-head { font-size: 17px; color: #222; border-bottom: 1px solid #e4e7ea; padding-bottom: 10px; margin: 4px 0 12px; }

/* Paket N6 (12.09.2026, docs/EIGENSYSTEM-GRADER-2026-09-12.md): der Zusatz
   „(auch mit −1 multipliziert)" am Schlüssel-Badge eines mathexpr-Feldes mit
   answer.bisAufVorzeichen, und die Bewertungs-Note eines ZELLENFELDES in den
   gesammelten Tabellenlösungen (tabSolZeilen) — in der Zelle selbst ist
   für einen Satz kein Platz. Feste Farben wie der Rest dieser Datei
   (Zwei-Welten: die Prüfungsansicht bleibt hell). */
.corr-badge .mexpr-key-vz, .sp-row .mexpr-key-vz { font-weight: 400; opacity: .8; font-size: .9em; }
.sp-row .sp-note { display: block; color: #b03a2e; font-size: .92em; margin-top: 2px; }

/* ---------------- Safe Area der App-Hülle (QA1013-Q05, A1-10/A1-13) ----------------
   NUR unter `.pp-huelle` (gesetzt von app/naht/huelle-laufzeit.js, die es im
   Web nicht gibt) — die Prüfungsansicht im Browser bleibt pixelgleich. Mit
   viewport-fit=cover (tools/build-app.js) reicht die Seite unter Uhr und
   Home-Indikator: Der Navy-Kopf füllt den Streifen hinter der Uhr selbst
   (die Schrift der Statusleiste ist dort immer hell, statusleisteAnwenden
   in js/app.js), und die feste Fußleiste mit SUBMIT steht ÜBER dem
   Home-Indikator statt darin (gemessen vorher: die unteren 34 pt deckten
   Knopf und Seitenzahlen). Alles übrige in dieser Datei gehört Q07. */
.pp-huelle .exam-top {
  box-sizing: border-box;
  height: calc(var(--exam-top-h) + env(safe-area-inset-top, 0px));
  padding-top: env(safe-area-inset-top, 0px);
  padding-left: env(safe-area-inset-left, 0px);
}
.pp-huelle .timerbox, .pp-huelle .viewbadge, .pp-huelle .scorebox {
  top: env(safe-area-inset-top, 0px);
  right: env(safe-area-inset-right, 0px);
}
.pp-huelle .exam-scroll {
  padding-top: calc(80px + env(safe-area-inset-top, 0px));
  padding-bottom: calc(90px + env(safe-area-inset-bottom, 0px));
}
.pp-huelle .exam-bottom {
  box-sizing: border-box;
  height: calc(54px + env(safe-area-inset-bottom, 0px));
  padding-bottom: env(safe-area-inset-bottom, 0px);
  padding-left: env(safe-area-inset-left, 0px);
  padding-right: env(safe-area-inset-right, 0px);
}
.pp-huelle .site-header { padding-top: calc(14px + env(safe-area-inset-top, 0px)); }
/* Der Feedback-Knopf sitzt auf dem Finger ABSOLUT im Kopf (css/feedback.css)
   und rückt unter die Uhr — sonst lag sein Kreis auf „00:18" (gemessen im
   Simulator). Dasselbe für den Mond-Knopf steht bei seiner Grundregel in
   css/prepp.css (verify-pruef-dunkel: exam.css kennt ihn nicht). */
@media (max-width: 860px), (pointer: coarse) and (max-width: 1200px) {
  .pp-huelle body:not(.pp-mode) .pp-fb-btn { top: calc(6px + env(safe-area-inset-top, 0px)); }
  .pp-huelle body:not(.pp-mode) .pp-fb-panel { top: calc(60px + env(safe-area-inset-top, 0px)); }
}
