/* ==========================================================================
   THITRONIK Campus — Wissenscheck
   Tokens und Interaktionsmuster übernommen aus den bestehenden Quizzen
   (Fehmarn/Vejrø), damit das neue System sichtbar dieselbe Familie bleibt.
   Light Mode ist verbindlich: der Campus findet in hellen Räumen und
   draußen am Fahrzeug statt (DESIGN_SYSTEM.md, Abschnitt 7).
   ========================================================================== */

:root {
  --th-navy: #1D3661;
  --th-navy-deep: #0A2747;
  --th-blue: #3BA9D3;
  --th-lime: #AFCA05;
  /* Zwei eigene Tokens für Text auf hellem Grund. Die Markenfarben selbst
     sind dafür zu hell: Cyan erreicht auf Weiß 2,69:1 und Lime noch weniger.
     Für Flächen, Ränder und Akzente weiterhin --th-blue und --th-lime. */
  --th-blue-text: #1B7699;   /* 5,15:1 auf Weiß */
  --th-lime-text: #5F7000;   /* 5,47:1 auf Weiß, 5,02:1 auf --success-bg */
  --th-red: #CE132D;
  /* Drei Werte, die vorher roh an mehreren Stellen standen. */
  --th-navy-hover: #172C50;  /* Hover der Navy-Knöpfe */
  --th-red-deep: #A81024;    /* Rot gedrückt, Rot-Text auf hellem Rot */
  --th-lime-line: #8FA600;   /* Rand richtiger Antworten */

  /* Antwortpalette A-H. A-D bleiben die vier THITRONIK-Markenfarben.
     E-H greifen ausschließlich vorhandene Navy-, Cyan- und Grautöne auf:
     zusätzliche Antworten sollen wie Teil derselben Oberfläche aussehen,
     nicht wie neue Signalzustände. Die Buchstaben bleiben die primäre,
     farbunabhängige Kennzeichnung. Acht statt sieben seit 1.36: Vier
     richtige und vier falsche Antworten füllen das zweispaltige Raster
     ohne leere Zelle.

     Sichtbar wird von der Palette nur Rahmen und Schatten beim Hover mit
     Maus (siehe `.answer:hover` in der hover-Medienabfrage) — auf dem
     Tablet am Fahrzeug also nichts. Textfarben je Buchstabe gab es bis
     1.46 dazu, gelesen hat sie keine Regel; wer die Palette wieder auf
     Flächen legt, legt die Textfarben neu an und prüft den Kontrast. */
  --answer-a: #1D3661;
  --answer-a-rgb: 29, 54, 97;
  --answer-b: #3BA9D3;
  --answer-b-rgb: 59, 169, 211;
  --answer-c: #AFCA05;
  --answer-c-rgb: 175, 202, 5;
  --answer-d: #CE132D;
  --answer-d-rgb: 206, 19, 45;
  --answer-e: #0A2747;
  --answer-e-rgb: 10, 39, 71;
  --answer-f: #1B7699;
  --answer-f-rgb: 27, 118, 153;
  --answer-g: #5E6672;
  --answer-g-rgb: 94, 102, 114;
  --answer-h: #8A94A3;
  --answer-h-rgb: 138, 148, 163;
  --th-white: #FFFFFF;
  --th-soft: #F0F0F0;
  --th-page: #EAF1F7;
  --th-ink: #111111;
  --th-muted: #5E6672;
  --th-line: #DDE2E7;
  --th-line-strong: #B7C2CF;

  --success-bg: #F3F8DD;
  --success-line: #A9BB3A;
  --error-bg: #FCEDEF;
  --error-line: #E4A2AA;
  --info-bg: #EDF7FB;

  --shadow-sm: 0 6px 20px rgba(10, 39, 71, .07);
  --shadow-md: 0 24px 64px rgba(10, 39, 71, .12);

  /* Schriftstufen. Bis 1.55 standen 68 verschiedene Größen im Stylesheet,
     13 davon zwischen .78 und .98rem, und auf einem Bildschirm bis zu 13
     nebeneinander — Stufen von 0,2 px, die niemand als Rang liest.

     Die Werte sind Layout-Einheiten; sichtbar wird davon --ui-scale. Bei der
     Handy- und Tablet-Stufe .8 ergeben sie 11,2 · 12 · 12,8 · 14,4 · 16 ·
     22,4 · 28,8 px. Daraus die beiden Untergrenzen: --text-sm ist die
     kleinste Größe für Lesetext (12 px), --text-label nur für kurze
     Beschriftungen in Versalien, Chips und Zähler (11,2 px).

     Fließende Überschriften (clamp), die Beschriftungen auf der Karte (cqw)
     und Zeichen in festen Kreisen — Initialen, Ziffern, Symbole — stehen
     bewusst außerhalb: Sie folgen ihrer Fläche, nicht der Skala. */
  --text-label: .875rem;
  --text-sm: .9375rem;
  --text-base: 1rem;
  --text-md: 1.125rem;
  --text-lg: 1.25rem;
  --text-xl: 1.75rem;
  --text-2xl: 2.25rem;

  --radius-xl: 24px;
  --radius-lg: 16px;   /* bis 1.60: 18 — das Design-System nennt 16 */
  --radius-md: 12px;
  --radius-sm: 8px;

  --duration-press: 140ms;
  --duration-fast: 160ms;
  --duration-normal: 220ms;
  --ease-out: cubic-bezier(.23, 1, .32, 1);

  /* Der Campus nutzt auf Arbeitsplatz-Monitoren die verfügbare Breite. Eine
     feste 1200-px-Kappe ließ bei WQHD, 4K und Browser-Zoom große Leerflächen
     entstehen. Lesbarkeitsgrenzen sitzen deshalb an den jeweiligen Inhalten. */
  /* Die Oberfläche entspricht visuell 80 % Browser-Zoom. Die größere
     Inhaltskappe gleicht die Skalierung aus, damit breite Fenster weiterhin
     vollständig genutzt werden. Trefferflächen bleiben real mindestens 44 px.

     Der Wert ist die Grundstellung für Telefon und Tablet — die Größe, auf
     die alles darunter ausgemessen wurde. Auf Arbeitsplatz-Monitoren wächst
     er mit; die Stufen stehen gleich unter :root. */
  --ui-scale: .8;
  --content: 2400px;
  --tap: 55px;

  /* Die volle Fensterhöhe, ausgedrückt in Layout-Einheiten.

     `zoom` verschiebt beides gegeneinander: 100dvh liefert die Fensterhöhe
     in Layout-Einheiten, sichtbar sind davon aber nur `--ui-scale` davon
     (nachgemessen bei 1180 px Fensterhöhe: 944 Bildschirmpixel bei .8). Wer
     den Schirm füllen will, rechnet also 100 / --ui-scale.

     Bis September 2026 stand an den drei Stellen, die das brauchen, die
     ausgerechnete 125 — richtig, solange die Skalierung fest bei .8 lag.
     Seit sie auf großen Monitoren mitwächst, wäre 125dvh dort ein Viertel
     Fensterhöhe zu viel und damit eine Bildlaufleiste, die nichts
     verbirgt. */
  --fenster-hoch: calc(100dvh / var(--ui-scale));
  --fenster-hoch-vh: calc(100vh / var(--ui-scale));

  /* Ebenen der Archipelkarte, von unten nach oben. Benannt statt gezaehlt:
     `z-index: 3` sagt nicht, ob es ueber oder unter der Route liegen soll,
     und beim naechsten Element raet man wieder. Die Luecken zwischen den
     Zehnern sind Platz fuer Nachtraege ohne Umnummerierung. */
  --ebene-meer: 0;
  --ebene-deko: 10;
  --ebene-route: 20;
  --ebene-insel: 30;
  --ebene-wegpunkt: 40;
  --ebene-karte: 50;
  --ebene-aktiv: 60;
  --ebene-kopf: 100;
}

/* Die Oberfläche wächst auf Arbeitsplatz-Monitoren mit.

   Warum überhaupt: Die 80 % sind für das Telefon in der Messehalle gesetzt —
   dort ist der Schirm klein und nah, und mehr Inhalt je Bildschirm ist genau
   richtig. Auf einem 27-Zoll-Monitor in Armlänge kehrt sich das um: Die
   Grundschrift steht dort real bei 12,8 px, und der Campus wirkt wie eine
   Seite, die jemand herausgezoomt hat.

   Warum Stufen und keine gleitende Formel: Eine unbenannte Zahl lässt sich
   in CSS nicht aus Längen rechnen — `calc(100vw / 1px)` gibt es nicht. Eine
   gleitende Skalierung wäre also nur über Javascript zu haben, und dann
   stünde die Größe der Oberfläche in zwei Quellen.

   Warum erst ab 1500 px: Darunter liegen Telefon und Tablet, und das ist die
   Größe, gegen die alles darunter ausgemessen wurde — Expeditionskarte,
   Bühnen, Trefferflächen. Ein iPad quer misst 1180 px, ein iPad Pro quer
   1366 px; beide bleiben damit bei .8.

   Achtung bei künftigen Änderungen: Medienabfragen sehen den Viewport, das
   Layout rechnet mit Viewport / --ui-scale. Bei .8 und 1500 px Viewport sind
   das 1875 Layout-Pixel, bei 1.0 und 1900 px genau 1900 — die zur Verfügung
   stehende Layoutbreite springt an jeder Stufe also nach UNTEN, obwohl das
   Fenster breiter wird. Wer hier eine Stufe ergänzt, misst nach, ob an der
   Kante etwas umbricht. */
@media (min-width: 1500px) { :root { --ui-scale: .9; } }
@media (min-width: 1900px) { :root { --ui-scale: 1; } }

* { box-sizing: border-box; }

.visually-hidden {
  position: absolute !important;
  width: 1px !important;
  height: 1px !important;
  padding: 0 !important;
  margin: -1px !important;
  overflow: hidden !important;
  clip: rect(0, 0, 0, 0) !important;
  white-space: nowrap !important;
  border: 0 !important;
}

html {
  min-height: 100%;
  -webkit-text-size-adjust: 100%;
}

/* Inter liegt seit 1.56 als Webschrift bei.

   Vorher stand Inter nur in der Kette und kam aus dem System — also auf dem
   PC, auf dem jemand sie installiert hatte, und auf keinem Telefon. Am
   Schreibtisch sah der Campus aus wie im Design-System, in der Messehalle
   liefen Roboto und San Francisco mit anderen Laufweiten: Jeder Umbruch,
   jede Kürzung und jede Kartenhöhe, die am PC gemessen wurde, stimmte auf
   dem Zielgerät nur ungefähr.

   Die frühere Begründung gegen eine Datei waren rund 100 KB im Hallen-WLAN.
   Die variable Latin-Teilmenge (@fontsource-variable/inter 5.3.0, alle
   Strichstärken in einer Datei) hat 48 KB, wird vorgeladen und steht unter
   /assets/ ein Jahr im Cache. Sie deckt Deutsch, ø/Ø und die Satzzeichen ab;
   Zeichen außerhalb des unicode-range (→, ≠, ✓) kommen weiter aus der
   Systemschrift. Absichtlich kein local(): Eine installierte Inter 3 läuft
   anders als die 4 — genau die Abweichung, die hier wegfallen soll.
   Lizenz SIL OFL 1.1, liegt daneben als fonts/OFL.txt. */
@font-face {
  font-family: "Inter";
  font-style: normal;
  font-weight: 100 900;
  font-display: swap;
  src: url("/assets/fonts/inter-latin-wght.woff2?v=1.68.1") format("woff2");
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC,
    U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215,
    U+FEFF, U+FFFD;
}

/* Schriftkette bewusst ohne Panton und ohne schmallaufende Fallbacks.
   Panton liegt in keinem Paket bei — die Kette fiel deshalb auf dem iPhone auf
   "Arial Narrow" und auf Android auf "Roboto Condensed" durch: ausgerechnet auf
   den Geräten, auf denen der Campus stattfindet, lief das Quiz kondensiert.
   Hinter Inter folgt die Systemschrift, solange die Datei noch lädt. */
body {
  min-height: 100%;
  margin: 0;
  color: var(--th-ink);
  background:
    radial-gradient(circle at 88% 6%, rgba(59, 169, 211, .16), transparent 26rem),
    linear-gradient(rgba(29, 54, 97, .025) 1px, transparent 1px),
    linear-gradient(90deg, rgba(29, 54, 97, .025) 1px, transparent 1px),
    linear-gradient(180deg, #E7F0F7 0%, #F7F8FA 46%, #EEF1F4 100%);
  background-repeat: no-repeat, repeat, repeat, no-repeat;
  background-size: auto, 32px 32px, 32px 32px, auto;
  font-family: Inter, system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
  font-size: 16px;
  line-height: 1.55;
  -webkit-font-smoothing: antialiased;
  zoom: var(--ui-scale);
}

button, input, select, textarea { font: inherit; color: inherit; }
button {
  -webkit-tap-highlight-color: transparent;
  cursor: pointer;
  touch-action: manipulation;
}
img { display: block; max-width: 100%; }
[hidden] { display: none !important; }
/* Der Ring ist Navy, nicht Cyan. Das Design-System nennt Cyan und erlaubt
   Abweichung, "wo Cyan verschwindet" — auf Weiß tut es das messbar: #3BA9D3
   erreicht gegen #FFFFFF nur 2,69:1 und verfehlt die 3:1 aus WCAG 2.4.11.
   Navy liegt bei 12:1. Auf der dunklen Ergebniskarte kehrt sich das um. */
:focus-visible { outline: 3px solid var(--th-navy); outline-offset: 3px; }
.score-card :focus-visible { outline-color: var(--th-white); }

h1, h2, h3, p, ul, ol, dl, figure { margin-top: 0; }
h1, h2, h3 { color: var(--th-navy); line-height: 1.15; }
h1 { font-size: clamp(1.65rem, 1.3rem + 1.5vw, 2.5rem); letter-spacing: -.025em; margin-bottom: 14px; }
h2 { font-size: clamp(1.15rem, 1.05rem + .4vw, 1.5rem); letter-spacing: -.015em; margin-bottom: 12px; }

.skip-link {
  position: fixed;
  z-index: 1500;
  left: 16px;
  top: 12px;
  transform: translateY(-200%);
  padding: 10px 14px;
  border-radius: var(--radius-sm);
  background: var(--th-navy);
  color: var(--th-white);
  font-weight: 800;
  text-decoration: none;
}
.skip-link:focus { transform: none; }

/* dvh statt vh: mit 100vh springt das Layout auf dem iPhone jedes Mal, wenn
   Safari die Adressleiste ein- und ausblendet. Die Seitenränder halten
   Abstand zu den Displayecken — index.html setzt viewport-fit=cover, ohne
   env() läuft der Inhalt im Querformat sonst unter die Rundung. */
.shell {
  display: flex;
  flex-direction: column;
  min-height: var(--fenster-hoch-vh);
  min-height: var(--fenster-hoch);
  width: min(calc(100% - clamp(20px, 3vw, 56px)), var(--content));
  margin: 0 auto;
  padding: 16px 0 28px;
  padding-left: env(safe-area-inset-left);
  padding-right: env(safe-area-inset-right);
}

/* ---------------------------------------------------------------- Kopf --- */

.masthead {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr);
  align-items: center;
  gap: 12px;
  padding: 12px 16px;
  margin-bottom: 16px;
  border: 1px solid rgba(183, 194, 207, .72);
  border-radius: var(--radius-lg);
  background: rgba(255, 255, 255, .9);
  backdrop-filter: blur(16px);
  -webkit-backdrop-filter: blur(16px);
  box-shadow: var(--shadow-sm);
}

.brand {
  display: flex;
  grid-column: 1;
  grid-row: 1;
  align-items: center;
  justify-self: start;
  gap: 12px;
  min-width: 0;
  /* Ohne diese Grenze nimmt sich der Block bei `justify-self: start` seine
     Inhaltsbreite und laeuft ueber die Spalte hinaus — auf HIDDENSEE stiess
     der lange Titel bei 1440 px an den ersten Werkzeugknopf. Sichtbar wurde
     das erst, als die Werkzeugzeile mit THI auf drei Knoepfe wuchs. Mit der
     Grenze greift die Kuerzung mit Auslassungspunkten, die an
     `.brand-copy strong` schon steht. */
  max-width: 100%;
}

.brand-home {
  display: flex;
  flex: 0 0 auto;
  align-items: center;
  min-height: var(--tap);
  border-radius: var(--radius-sm);
  text-decoration: none;
}
.brand-home:focus-visible {
  outline: 3px solid var(--th-navy);
  outline-offset: 4px;
}
.brand-home:active .brand-logo { transform: scale(.98); }

/* Die Wortmarke als SVG von thitronik.de (1,8 KB). Das PNG mit der Zeile
   „Alarmtechnik made in Germany“ wog 88 KB und zeigte die Zeile bei
   150–210 px Breite ohnehin nur rund 5 px hoch. Es bleibt für den Druck
   der Arbeitskarte und als Quelle der App-Icons (tools/app-icons.js). */
.brand-logo {
  width: clamp(150px, 20vw, 210px);
  height: auto;
  flex: 0 0 auto;
  transition: opacity var(--duration-fast) ease, transform var(--duration-press) var(--ease-out);
}

.brand-copy { min-width: 0; padding-left: 14px; border-left: 1px solid var(--th-line); }
.brand-copy small {
  display: block;
  color: var(--th-blue-text);
  font-size: var(--text-label);
  font-weight: 800;
  letter-spacing: .1em;
  text-transform: uppercase;
}
/* Zwei Zeilen statt einer Kürzung. Einzeilig mit Auslassungspunkten stand
   bei 1024 px von „Produktneuheiten: Zugang & Wasserschutz" nur „…: Z…"
   da (178 von 342 px), bei 1180 px (iPad quer) 268 von 342 px. Erst ab der
   dritten Zeile wird gekürzt. */
.brand-copy strong {
  display: -webkit-box;
  overflow: hidden;
  color: var(--th-navy);
  font-size: var(--text-base);
  line-height: 1.2;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 2;
  line-clamp: 2;
}

/* Auf dem Inselstart steht der Name schon in der Teilnehmerkarte, mit
   „Angaben ändern" daneben. Der Chip in der Kopfzeile sagte ihn ein zweites
   Mal. Auf dem Telefon ist die ganze Chipzeile dort ohnehin ausgeblendet. */
body.ist-start #chip-participant { display: none; }

.masthead-meta {
  display: flex;
  grid-column: 3;
  grid-row: 1;
  flex-wrap: wrap;
  justify-self: end;
  gap: 8px;
}

.masthead-tools {
  display: flex;
  grid-column: 2;
  grid-row: 1;
  align-items: center;
  justify-self: center;
  gap: 10px;
  margin-left: 0;
}

.masthead-tool {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  min-height: var(--tap);
  padding: 6px 14px 6px 8px;
  border: 1px solid var(--th-line-strong);
  border-radius: var(--radius-md);
  background: var(--th-white);
  color: var(--th-navy);
  box-shadow: 0 4px 14px rgba(10, 39, 71, .08);
  font-weight: 800;
  text-decoration: none;
  white-space: nowrap;
  transition: border-color var(--duration-fast) var(--ease-out),
              background-color var(--duration-fast) var(--ease-out),
              transform var(--duration-press) var(--ease-out);
}
.masthead-tool[hidden] { display: none; }
.masthead-tool:hover { border-color: var(--th-blue); background: var(--info-bg); }
.masthead-tool:active { transform: scale(.98); }
.masthead-tool .ta-icon {
  display: grid;
  flex: 0 0 38px;
  width: 38px;
  height: 38px;
  place-items: center;
  border-radius: var(--radius-md);
  background: var(--info-bg);
  color: var(--th-blue-text);
}
.masthead-tool .ta-icon svg {
  width: 22px;
  height: 22px;
  fill: none;
  stroke: currentColor;
  stroke-width: 1.8;
  stroke-linecap: round;
  stroke-linejoin: round;
}
.masthead-tool .ta-text { display: block; min-width: 0; }
.masthead-tool .ta-title { color: inherit; font-size: var(--text-sm); line-height: 1.15; }
.masthead-tool.is-ready {
  border-color: var(--success-line);
  background: var(--success-bg);
}
.masthead-tool.is-ready .ta-icon { background: var(--th-white); color: var(--th-lime-text); }

.masthead-progress {
  grid-column: 3;
  grid-row: 1;
  justify-self: end;
  width: min(360px, 42vw);
  margin-left: 0;
}
.campus-progress-head {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 18px;
  margin-bottom: 3px;
  color: var(--th-navy);
  font-size: var(--text-sm);
  font-weight: 700;
}
/* Der Prozentwert bleibt als Skala zur Fortschrittsleiste, tritt aber
   hinter die Zahl zurueck, die jemand tatsaechlich vorliest. */
.campus-progress-head small {
  color: var(--th-muted);
  font-size: var(--text-sm);
  font-variant-numeric: tabular-nums;
}
.campus-progress-copy {
  display: block;
  margin-bottom: 7px;
  color: var(--th-navy);
  font-size: var(--text-base);
  line-height: 1.15;
  font-variant-numeric: tabular-nums;
}
.campus-progress-track {
  height: 7px;
  overflow: hidden;
  border-radius: 999px;
  background: #E4EAF0;
}
.campus-progress-track span {
  display: block;
  width: 0;
  height: 100%;
  border-radius: inherit;
  background: linear-gradient(90deg, var(--th-blue), #279EC9);
  transition: width 280ms var(--ease-out);
}


.chip {
  display: inline-flex;
  align-items: center;
  min-height: 32px;
  padding: 5px 11px;
  border: 1px solid var(--th-line-strong);
  border-radius: 999px;
  background: var(--th-white);
  color: var(--th-navy);
  font-size: var(--text-label);
  font-weight: 700;
}
.chip-quiet { color: var(--th-muted); font-weight: 600; }

/* ------------------------------------- Karten-Kopf unterhalb Desktopbreite ---

   Hamburger, Avatar und Kurzfortschritt existieren nur auf der Uebersicht
   (body.ist-karte, gesetzt in show()) und dort erst unterhalb der
   Desktopbreite. Hier stehen nur die Grundformen; eingeblendet wird in den
   Medienabfragen der Karte weiter unten. */

.menue-knopf {
  display: none;
  place-items: center;
  width: var(--tap);
  height: var(--tap);
  padding: 0;
  border: 1px solid var(--th-line-strong);
  border-radius: var(--radius-md);
  background: var(--th-white);
  color: var(--th-navy);
  box-shadow: 0 4px 14px rgba(10, 39, 71, .06);
}
.menue-knopf svg {
  width: 26px;
  height: 26px;
  fill: none;
  stroke: currentColor;
  stroke-width: 2;
  stroke-linecap: round;
}

.kopf-avatar {
  display: none;
  place-items: center;
  width: 46px;
  height: 46px;
  border: 1px solid var(--th-line-strong);
  border-radius: 50%;
  background: var(--info-bg);
  color: var(--th-blue-text);
  font-size: .95rem;
  font-weight: 800;
  letter-spacing: .02em;
}
/* Profilfoto im Avatar (seit 1.68). Vorher erschien das gespeicherte Foto
   nirgends außer in der Vorschau des Formulars. */
.kopf-avatar.mit-foto { overflow: hidden; }
.kopf-avatar img {
  width: 100%;
  height: 100%;
  border-radius: 50%;
  object-fit: cover;
}
.kopf-avatar svg {
  width: 24px;
  height: 24px;
  fill: none;
  stroke: currentColor;
  stroke-width: 1.9;
  stroke-linecap: round;
  stroke-linejoin: round;
}

.campus-progress-kompakt {
  display: none;
  align-items: baseline;
  justify-content: flex-end;
  gap: 10px;
  margin-bottom: 6px;
  color: var(--th-navy);
  font-variant-numeric: tabular-nums;
}
.campus-progress-kompakt strong { font-size: var(--text-base); line-height: 1.1; }
.campus-progress-kompakt small {
  padding-left: 10px;
  border-left: 1px solid var(--th-line);
  color: var(--th-muted);
  font-size: var(--text-sm);
}

/* Das gemeinsame Symbolfeld der Werkzeuge in Menue und Tablet-Leiste —
   dasselbe Muster wie .ta-icon in der Kopfzeile. */
.ka-icon {
  display: grid;
  flex: 0 0 auto;
  place-items: center;
  width: 34px;
  height: 34px;
  border-radius: var(--radius-md);
  background: var(--info-bg);
  color: var(--th-blue-text);
}
.ka-icon svg {
  width: 20px;
  height: 20px;
  fill: none;
  stroke: currentColor;
  stroke-width: 1.8;
  stroke-linecap: round;
  stroke-linejoin: round;
}

/* --------------------------------------------------------------- Schirm --- */

main { flex: 1 0 auto; }

/* clip statt hidden, mit hidden als Rückfall für alte Browser: beide
   beschneiden die runden Ecken gleich, aber hidden macht die Karte zum
   Scroll-Container und setzt damit die klebende Aktionsleiste außer Kraft. */
.screen {
  overflow: hidden;
  overflow: clip;
  border: 1px solid var(--th-line);
  border-radius: var(--radius-xl);
  background: var(--th-white);
  box-shadow: var(--shadow-md);
  /* backwards, nicht both: Mit `both` bliebe nach der Einblendung
     `transform: matrix(1, 0, 0, 1, 0, 0)` am Bildschirm stehen. Ein
     transformiertes Element ist der Bezugsrahmen für `position: fixed`
     darin — die Handy-Navigation hing dann am Ende der Übersicht statt
     am unteren Fensterrand (gemessen bei 390 × 844: 991–1052 px). */
  animation: enter var(--duration-normal) var(--ease-out) backwards;
}
.screen-narrow { padding: clamp(24px, 5vw, 48px); }

/* --------------------------------------------------------- Onboarding --- */

/* Die Profileinrichtung ist eine eigene Eingangstür. Kopf und reguläre
   Fußzeile bleiben hier aus, damit Logo und Rechtslinks genau einmal und an
   der Stelle stehen, an der sie vor dem ersten Campus-Zugriff gebraucht
   werden. */
body.ist-onboarding .shell {
  width: min(calc(100% - 96px), 1440px);
  padding-top: 48px;
  padding-bottom: 48px;
}
body.ist-onboarding .masthead,
body.ist-onboarding > .shell > .colophon { display: none; }
body.ist-onboarding main { display: flex; }

.onboarding {
  width: 100%;
  /* Die Fensterhöhe, abzüglich zweier Dinge:

     96px sind die 48px Polster oben und unten aus `body.ist-onboarding
     .shell`. 2px sind der eigene Rand aus `.screen` — und der ist der
     eigentliche Grund für diese Zeile: `.onboarding-layout` übernimmt den
     Wert hier per `min-height: inherit` und zieht den Rand nicht ab. Der
     Abschnitt wird dadurch zwei Pixel höher als das, was er ausfüllen soll.

     Solange die Skalierung fest bei .8 lag, fiel das nicht auf: Die Shell
     war dort höher als ihr Inhalt, und main streckte sich ohnehin. Bei 1.0
     auf einem FHD-Monitor gibt es diesen Spielraum nicht mehr — gemessen
     blieben 1,33 Bildschirmpixel Überlauf und damit eine Bildlaufleiste,
     hinter der nichts steht.

     --fenster-hoch statt 100dvh, damit die Rechnung dieselbe Größe meint
     wie die der Shell; siehe :root. */
  min-height: calc(var(--fenster-hoch) - 96px - 2px);
  border-radius: var(--radius-lg);
}
.onboarding-layout {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
  min-height: inherit;
}
.onboarding-hero {
  position: relative;
  isolation: isolate;
  min-height: 650px;
  overflow: hidden;
  background: var(--th-navy-deep);
}
.onboarding-picture,
.onboarding-picture img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
}
.onboarding-picture img {
  object-fit: cover;
  object-position: 52% 50%;
}
.onboarding-hero::after {
  content: "";
  position: absolute;
  z-index: 1;
  inset: 0;
  background:
    linear-gradient(180deg, rgba(5, 25, 55, .7) 0%, rgba(7, 29, 70, .16) 44%, rgba(4, 22, 49, .86) 100%),
    linear-gradient(90deg, rgba(10, 39, 71, .2), transparent 66%);
  pointer-events: none;
}
.onboarding-hero-content {
  position: relative;
  z-index: 2;
  display: flex;
  flex-direction: column;
  justify-content: space-between;
  min-height: 100%;
  padding: clamp(28px, 4vw, 48px);
}
.onboarding-brand {
  display: flex;
  align-items: center;
  gap: 18px;
}
.onboarding-logo-wrap {
  display: flex;
  width: min(230px, 50%);
  padding: 9px 12px;
  border-radius: var(--radius-sm);
  background: rgba(255, 255, 255, .94);
  box-shadow: 0 8px 24px rgba(4, 22, 49, .18);
}
.onboarding-logo-wrap img { width: 100%; height: auto; }
.onboarding-campus {
  padding-left: 18px;
  border-left: 1px solid rgba(255, 255, 255, .5);
  color: var(--th-white);
  font-size: var(--text-label);
  font-weight: 800;
  letter-spacing: .08em;
}
.onboarding-welcome { max-width: 36rem; }
.onboarding-welcome h1 {
  margin-bottom: 16px;
  color: var(--th-white);
  font-size: clamp(2.4rem, 4.2vw, 4.35rem);
  line-height: 1.02;
  letter-spacing: -.045em;
  text-shadow: 0 2px 18px rgba(4, 22, 49, .38);
}
.onboarding-welcome p {
  max-width: 34ch;
  margin: 0;
  color: rgba(255, 255, 255, .94);
  font-size: clamp(1rem, 1.3vw, 1.2rem);
  line-height: 1.45;
  text-shadow: 0 1px 10px rgba(4, 22, 49, .42);
}

.onboarding-panel {
  display: grid;
  place-items: center;
  padding: 36px 48px;
  background: var(--th-white);
}
.profile-form {
  display: grid;
  gap: 16px;
  width: min(100%, 680px);
}
.profile-head h2 { margin-bottom: 7px; font-size: clamp(1.85rem, 2.2vw, 2.35rem); }
.profile-head h2:focus { outline: 0; }
.profile-head > p:last-child { margin: 0; color: var(--th-muted); font-size: var(--text-base); line-height: 1.5; }
.profile-photo-fieldset {
  min-width: 0;
  margin: 0;
  padding: 0;
  border: 0;
}
.profile-photo-fieldset legend,
.profile-field label {
  margin-bottom: 6px;
  color: var(--th-navy);
  font-size: var(--text-sm);
  font-weight: 800;
}
.profile-photo-fieldset legend span { color: var(--th-muted); font-weight: 500; }
.profile-photo-row {
  display: grid;
  grid-template-columns: 88px minmax(0, 1fr);
  gap: 16px;
  align-items: center;
}
.profile-photo-preview {
  display: grid;
  place-items: center;
  width: 88px;
  height: 88px;
  overflow: hidden;
  border: 2px dashed #71849C;
  border-radius: 50%;
  background: #F5F8FB;
  color: var(--th-navy);
  font-size: var(--text-sm);
  font-weight: 800;
}
.profile-photo-preview.has-photo { border-style: solid; }
.profile-photo-preview img { width: 100%; height: 100%; object-fit: cover; }
.profile-photo-controls { min-width: 0; }
.profile-photo-actions {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 8px;
}
.profile-photo-button,
.profile-photo-remove {
  min-height: calc(var(--tap) + 12px);
  border-radius: var(--radius-sm);
  background: var(--th-white);
  color: var(--th-navy);
  font-size: var(--text-sm);
  font-weight: 800;
  transition: background-color var(--duration-fast) ease, border-color var(--duration-fast) ease, transform var(--duration-press) var(--ease-out);
}
.profile-photo-button { padding: 9px 12px; border: 1px solid var(--th-navy); }
.profile-photo-remove {
  margin-top: 4px;
  padding: 7px 0;
  border: 0;
  color: var(--th-red-deep);
  text-decoration: underline;
  text-underline-offset: 3px;
}
.profile-photo-controls > p {
  margin: 5px 0 0;
  color: var(--th-muted);
  font-size: var(--text-sm);
  line-height: 1.4;
}

.profile-name-row {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 16px;
}
.profile-field { display: grid; align-content: start; }
.profile-field input {
  width: 100%;
  min-height: calc(var(--tap) + 12px);
  padding: 12px 14px;
  border: 1px solid #7B8EA6;
  border-radius: var(--radius-sm);
  background: var(--th-white);
  transition: border-color var(--duration-fast) ease, box-shadow var(--duration-fast) ease, background-color var(--duration-fast) ease;
}
.profile-field input:focus-visible {
  border-color: var(--th-navy);
  box-shadow: 0 0 0 2px rgba(29, 54, 97, .18);
}
.profile-field.has-error input { border-color: var(--th-red); background: #FFF7F8; }
/* Das Abzeichen „5-stellig“ im Feld ist entfallen: Der Hilfetext darunter
   sagt dasselbe und ist per aria-describedby auch vorgelesen. */
.profile-help,
.profile-error {
  margin: 5px 0 0;
  font-size: var(--text-sm);
  line-height: 1.35;
}
.profile-help { color: var(--th-muted); }
.profile-error { color: var(--th-red-deep) !important; font-weight: 700; }

.profile-consent {
  display: grid;
  grid-template-columns: 24px minmax(0, 1fr);
  column-gap: 10px;
  align-items: start;
}
.profile-consent input {
  width: 24px;
  height: 24px;
  margin: 1px 0 0;
  accent-color: var(--th-navy);
}
.profile-consent.has-error input { outline: 2px solid var(--th-red); outline-offset: 2px; }
.profile-consent label { color: #293241; font-size: var(--text-sm); line-height: 1.5; }
.profile-consent a,
.profile-footer a { color: var(--th-navy); text-decoration-thickness: 1px; text-underline-offset: 3px; }
.profile-consent .profile-error { grid-column: 2; }

.profile-save-error {
  margin: -4px 0 0;
  padding: 10px 12px;
  border-left: 3px solid var(--th-red);
  background: var(--error-bg);
  color: #7E0C1D;
  font-size: var(--text-sm);
  font-weight: 700;
}
/* Navy wie jeder Hauptknopf im Campus. Bis 1.58 war er rot — das einzige
   Rot außerhalb von Fehlern, Abbruch und Löschen, und das Markenhandbuch
   behält Rot dem Logo-Segel vor (Brandbook v1.1, Kap. 7.1). */
.profile-submit {
  display: grid;
  grid-template-columns: 1fr auto;
  align-items: center;
  min-height: 56px;
  padding: 0 18px;
  border: 1px solid var(--th-navy);
  border-radius: var(--radius-sm);
  background: var(--th-navy);
  color: var(--th-white);
  font-weight: 800;
  box-shadow: 0 12px 24px rgba(29, 54, 97, .22);
  transition: background-color var(--duration-fast) ease, border-color var(--duration-fast) ease, transform var(--duration-press) var(--ease-out), box-shadow var(--duration-fast) ease;
}
.profile-submit:disabled {
  border-color: #D2DAE4;
  background: #E7ECF2;
  color: #4A596C;
  box-shadow: none;
  cursor: not-allowed;
}
.profile-submit-arrow {
  min-width: 34px;
  padding-left: 14px;
  border-left: 1px solid rgba(255, 255, 255, .42);
  font-size: 1.35rem;
  font-weight: 400;
  text-align: right;
}
.profile-submit:disabled .profile-submit-arrow { border-left-color: #BCC7D3; }
.profile-photo-button:active:not(:disabled),
.profile-submit:active:not(:disabled) { transform: scale(.98); box-shadow: none; }
.profile-photo-button:disabled { cursor: wait; opacity: .58; }
.profile-footer {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: 8px 28px;
  padding-top: 2px;
  font-size: var(--text-sm);
}
/* var(--tap) statt 44px: unter `zoom: .8` waren 44px nur 35 echte Pixel. */
.profile-footer a {
  display: inline-flex;
  align-items: center;
  min-height: var(--tap);
}


@keyframes enter {
  from { opacity: 0; transform: translateY(6px); }
  to { opacity: 1; transform: none; }
}

/* Ladehinweis bis zum ersten Bildschirm (index.html, engine.js show()). */
.campus-laedt {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 10px;
  min-height: 40vh;
  margin: 0;
  color: var(--th-muted);
  font-size: var(--text-base);
}
.campus-laedt-punkt {
  width: 10px;
  height: 10px;
  border-radius: 50%;
  background: var(--th-lime);
  animation: campus-laedt 1.2s ease-in-out infinite;
}
@keyframes campus-laedt {
  0%, 100% { opacity: .35; }
  50% { opacity: 1; }
}
@media (prefers-reduced-motion: reduce) {
  .campus-laedt-punkt { animation: none; }
}

.screen-head { padding: clamp(26px, 4vw, 48px) clamp(20px, 4vw, 48px) 0; }

.kicker {
  display: inline-flex;
  align-items: center;
  min-height: 30px;
  margin: 0 0 12px;
  padding: 4px 12px;
  border-radius: 999px;
  background: var(--info-bg);
  color: var(--th-navy);
  font-size: var(--text-label);
  font-weight: 800;
  letter-spacing: .1em;
  text-transform: uppercase;
}

.lead { max-width: 62ch; color: var(--th-muted); font-size: var(--text-base); }


/* --------------------------------------------------------- Inselauswahl ---

   Die Auswahl gibt es in zwei Fassungen, und die Grenze laeuft nicht allein
   ueber die Breite:

   LISTE  — Kacheln untereinander, volle Trefferbreite. Das Telefon.
   BUEHNE — die Expeditionskarte mit Seegrund, Inselmotiven und Routen.

   Warum Breite UND Hoehe entscheiden: Die alte Grenze war `min-width: 760px`
   allein. Ein iPad mini ist hochkant 744 px breit und fiel damit auf die
   Liste zurueck — ausgerechnet das Geraet, fuer das die Karte gedacht ist.
   Ein iPhone quer ist 844 px breit und bekam die Buehne auf 390 px Hoehe.
   `min-width: 700px` zusammen mit `min-height: 560px` trifft jedes iPad in
   beiden Lagen und kein Telefon in keiner. */

#screen-islands {
  position: relative;
  border-color: rgba(183, 194, 207, .8);
  background: #F6FAFC;
}

.campus-map {
  position: relative;
  isolation: isolate;
  overflow: hidden;
  background: #F6FAFC;
}

.island-intro {
  position: relative;
  z-index: 3;
}

.island-intro h1 {
  max-width: 18ch;
  font-size: clamp(1.8rem, 1.3rem + 2.1vw, 2.8rem);
  line-height: 1.06;
  letter-spacing: -.04em;
  text-wrap: balance;
}

.island-intro .lead { margin-bottom: 0; text-wrap: pretty; }

/* Ohne Buehne gibt es weder Routen noch Deko. Bei der Deko traegt das
   doppelt: Es sind leere Elemente mit CSS-Hintergrund, und Hintergruende
   einer nicht passenden Medienabfrage holt der Browser gar nicht erst. Ein
   ausgeblendetes <img> haette er geladen — das Telefon zahlte 166 KB fuer
   Moewen, die es nie zeigt. */
.campus-map-art,
.map-deko { display: none; }

.island-map {
  display: grid;
  gap: 12px;
  margin: 0;
  padding: 26px clamp(18px, 4vw, 42px) 36px;
  list-style: none;
}

.island-map-item { min-width: 0; }

/* ------------------------------------------------- Tagesabschluss --- */

/* Der Feedbackbogen sass frueher als breite Karte unter der Inselkarte und
   trug dafuer die Klasse .tagesabschluss. Seit er als Symbol in die
   Kopfzeile gewandert ist, traegt das Element `class="masthead-tool"` und
   nur noch `id="tagesabschluss"` — die Gestaltung steht oben bei
   .masthead-tool. Von den Kindklassen sind .ta-icon, .ta-text und .ta-title
   geblieben (auch der THI-Schalter in thi.js baut sich daraus). Kicker,
   Beschreibung und der Knopf „Öffnen" der alten Karte sind seit 1.46 auch
   aus dem Markup heraus: Die Kopfzeile blendete sie ohnehin aus, und
   engine.js schrieb Sätze hinein, die niemand je sah. */

.ta-icon {
  display: grid;
  flex: 0 0 52px;
  width: 52px;
  height: 52px;
  place-items: center;
  border-radius: var(--radius-lg);
  background: var(--info-bg);
  color: var(--th-navy);
}
.ta-icon svg {
  width: 27px;
  height: 27px;
  fill: none;
  stroke: currentColor;
  stroke-width: 1.7;
  stroke-linecap: round;
  stroke-linejoin: round;
}
.ta-text { display: grid; flex: 1 1 300px; gap: 3px; min-width: 0; }
.ta-title { color: var(--th-navy); font-size: var(--text-md); font-weight: 800; }

/* "Alle Inseln erledigt" faerbt heute .masthead-tool.is-ready ein, siehe
   oben. Die Klassen .campus-tool und .campus-tool-icon stammen aus
   derselben Kartenfassung und werden seither nirgends mehr vergeben. */

@media (max-width: 560px) {
  .ta-icon { flex-basis: 44px; width: 44px; height: 44px; border-radius: var(--radius-lg); }
}

.island-card {
  position: relative;
  display: grid;
  grid-template-columns: 120px minmax(0, 1fr);
  gap: 14px;
  width: 100%;
  min-height: 168px;
  padding: 10px;
  overflow: hidden;
  border: 1px solid var(--th-line);
  border-radius: var(--radius-lg);
  background: var(--th-white);
  text-align: left;
  box-shadow: 0 8px 22px rgba(10, 39, 71, .07);
  transition:
    border-color var(--duration-fast) ease,
    box-shadow var(--duration-fast) ease,
    transform var(--duration-press) var(--ease-out);
  animation: island-enter 260ms var(--ease-out) both;
  animation-delay: calc(var(--island-order) * 35ms);
}

@keyframes island-enter {
  from { opacity: 0; transform: translateY(8px); }
  to { opacity: 1; transform: none; }
}

.island-card .i-visual {
  position: relative;
  display: grid;
  place-items: center;
  min-height: 150px;
  padding: 10px;
  overflow: visible;
  border-radius: var(--radius-md);
  background:
    radial-gradient(circle at 50% 45%, rgba(255, 255, 255, .95), transparent 72%),
    rgba(232, 240, 246, .56);
}

.island-card .i-visual img {
  width: 100%;
  height: 100%;
  object-fit: contain;
  filter: drop-shadow(0 7px 10px rgba(10, 39, 71, .2));
}

.island-card .i-content {
  display: flex;
  flex-direction: column;
  gap: 6px;
  justify-content: center;
  min-width: 0;
  padding: 8px 42px 8px 0;
}

.island-card .i-code {
  color: var(--th-blue-text);
  font-size: var(--text-label);
  font-weight: 800;
  letter-spacing: .12em;
  text-transform: uppercase;
}
.island-card .i-title {
  color: var(--th-navy);
  font-size: var(--text-base);
  font-weight: 800;
  letter-spacing: -.018em;
  line-height: 1.16;
  text-wrap: balance;
}
.island-card .i-desc {
  display: -webkit-box;
  overflow: hidden;
  color: var(--th-muted);
  font-size: var(--text-sm);
  line-height: 1.38;
  text-wrap: pretty;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 2;
}
.island-card .i-state {
  display: flex;
  align-items: center;
  gap: 7px;
  margin-top: 2px;
  color: var(--th-muted);
  font-size: var(--text-label);
  font-weight: 700;
}
.island-card .i-state::before {
  content: "";
  flex: 0 0 auto;
  width: 11px;
  height: 11px;
  border-radius: 50%;
  background: #D6DEE6;
}

/* --- Verpflegungsinsel ---------------------------------------------------
   Rügen hat keinen Wissenscheck, also auch keinen Fortschritt. An die
   Stelle des Status treten die beiden Namen mit Foto — die Auskunft, die
   an dieser Station wirklich gesucht wird. Die Kachel ist ein div und
   kein Knopf: Sie fuehrt nirgendwo hin, und ein Knopf, der nichts tut,
   verspricht ein Quiz, das es nicht gibt. Deshalb hier auch kein
   Hover-Zustand und kein Zeiger-Cursor. */
.island-card.is-service { cursor: default; }

.i-crew {
  display: flex;
  flex-wrap: wrap;
  gap: 6px 14px;
  margin-top: 2px;
}

.i-crew-person {
  display: inline-flex;
  gap: 7px;
  align-items: center;
  min-width: 0;
}

.i-crew-bild {
  display: grid;
  overflow: hidden;
  flex: 0 0 auto;
  width: 28px;
  height: 28px;
  place-items: center;
  border-radius: 50%;
  background: var(--info-bg);
  box-shadow: 0 0 0 2px var(--th-white), 0 0 0 3px rgba(59, 169, 211, .45);
}

.i-crew-bild img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}

.i-crew-bild.ohne-foto {
  color: var(--th-blue-text);
  font-size: .64rem;
  font-weight: 800;
}

.i-crew-name {
  overflow: hidden;
  color: var(--th-navy);
  font-size: var(--text-sm);
  font-weight: 700;
  white-space: nowrap;
  text-overflow: ellipsis;
}
.island-card.is-done .i-state::before {
  background: var(--th-lime);
  box-shadow: inset 0 0 0 3px var(--th-lime), inset 0 0 0 4px rgba(17, 17, 17, .22);
}
/* Offener Ring statt gefülltem Punkt: begonnen, aber nicht abgeschickt. */
.island-card.is-warten .i-state::before {
  background: var(--th-white);
  box-shadow: inset 0 0 0 3px var(--th-blue), inset 0 0 0 4px rgba(17, 17, 17, .18);
}
.i-score {
  display: block;
  width: 100%;
  height: 7px;
  overflow: hidden;
  border-radius: 999px;
  background: #E8EDF1;
}
.i-score span {
  display: block;
  width: calc(var(--score) * 1%);
  height: 100%;
  border-radius: inherit;
  background: var(--th-lime);
}
/* Solange das Ergebnis im Ausgang liegt, ist auch der Balken nicht Lime.
   Sonst meldet die Kachel oben "noch nicht gesendet" und unten Erfolg. */
.island-card.is-warten .i-score span { background: var(--th-blue); }
/* Balken und Zahl in einer Zeile. Die Zahl zeigt sich nur dort, wo die
   Statuszeile ("Abgeschlossen · 70 %") ausgeblendet ist — auf der Karte —,
   sonst stünde der Wert zweimal untereinander. */
.i-fortschritt { display: flex; align-items: center; gap: 8px; width: 100%; }
.i-fortschritt .i-score { flex: 1 1 auto; width: auto; }
.i-wert {
  display: none;
  flex: 0 0 auto;
  color: var(--th-lime-text);
  font-size: var(--text-label);
  font-weight: 800;
  font-variant-numeric: tabular-nums;
  line-height: 1;
}
.island-card.is-warten .i-wert { color: var(--th-blue-text); }
.island-card .i-open {
  position: absolute;
  right: 16px;
  bottom: 16px;
  width: 32px;
  height: 32px;
  border: 1px solid var(--th-line-strong);
  border-radius: 50%;
  background: var(--th-white);
  transition:
    border-color var(--duration-fast) ease,
    background-color var(--duration-fast) ease,
    transform var(--duration-fast) var(--ease-out);
}
.island-card .i-open::before {
  content: "";
  position: absolute;
  left: 10px;
  top: 9px;
  width: 8px;
  height: 8px;
  border-top: 2px solid var(--th-navy);
  border-right: 2px solid var(--th-navy);
  transform: rotate(45deg);
}
.island-card .i-open::after {
  content: "";
  position: absolute;
  left: 8px;
  top: 14px;
  width: 12px;
  height: 2px;
  background: var(--th-navy);
}
.island-card:active { transform: scale(.985); }
.island-card.is-done { border-color: var(--success-line); background: linear-gradient(180deg, var(--th-white), #F9FCEB); }
.island-card.is-done .i-state { color: var(--th-lime-text); }

/* Abgeschlossen, aber noch nicht beim Server: ausdrücklich KEIN
   Erfolgszustand. Lime würde hier eine Sicherheit behaupten, die es nicht
   gibt — das Ergebnis liegt allein auf diesem Telefon. */
.island-card.is-warten { border-color: var(--th-blue); background: linear-gradient(180deg, var(--th-white), #F1F8FC); }
.island-card.is-warten .i-state { color: var(--th-blue-text); }


/* ========================== Die Expeditionskarte ==========================

   Die Bühne hat ein FESTES SEITENVERHÄLTNIS. Das ist der Kern des Umbaus.

   Vorher war sie ein Kasten mit `min-height: clamp(735px, 76vw, 900px)` bei
   voller Breite. Gemessen ergab das auf dem iPad hochkant 1,0:1 und auf
   einem breiten Monitor 2,7:1 — dieselben Prozentangaben trafen also auf
   Verhältnisse, die um den Faktor 2,7 auseinanderliegen. Jede Position war
   höchstens auf einer Fensterbreite richtig; auf allen anderen lief der
   Archipel auseinander.

   Mit festem Verhältnis beschreibt eine Prozentangabe einen Ort auf der
   KARTE statt einen Ort im FENSTER. Zwei Verhältnisse gibt es trotzdem,
   weil ein iPad hochkant kein Querformat ist: 16:9 quer, 1:1 hoch. Jede
   Lage hat weiter unten ihre eigene Anordnung.
   ========================================================================= */

/* ============ Die Szene: ueberall dieselbe Karte ============

   Diese Regeln standen in `@media (min-width: 700px) and (min-height:
   560px)`, also hinter einer Bedingung an die GROESSE DES FENSTERS. Damit
   war die Anordnung des Archipels an das Geraet gebunden: Unterhalb der
   Schwelle gab es die Karte gar nicht, und darueber eine zweite Fassung
   fuer das Hochformat. Drei Karten, die dasselbe zeigen sollten.

   Die Szene ist jetzt bedingungslos. Sie ist 16:9, ihre Inseln stehen in
   Prozent ihrer selbst, und sie sieht auf jedem Geraet gleich aus. Was
   sich unterscheidet, steht weiter unten unter „Ausschnitt je Geraet":
   wie gross der Ausschnitt ist und ob geschoben werden muss. */
  #screen-islands { border-color: rgba(140, 176, 201, .75); background: #CFE6F4; }

  .campus-map {
    /* Das Verhältnis steht in einer Variablen, weil es zweimal gebraucht
       wird: einmal für aspect-ratio, einmal in der Breitenrechnung. */
    --karte-ar: 16 / 9;
    /* Abstand Insel → Infokarte. Er ist zugleich die Länge des
       Verbindungsstrichs, damit beides nie auseinanderläuft. */
    --karte-x: 2.6cqw;
    --karte-w: 16cqw;

    /* Breite und Höhe zugleich begrenzt: Ohne den Höhenanteil ragt die
       Karte auf einem 16:9-Monitor unter den Falz, und die untere
       Inselreihe findet niemand.

       --fenster-hoch statt 100dvh, weil `zoom: var(--ui-scale)` am body
       dazwischenliegt. Nachgemessen: Bei 1180 px Fensterhöhe liefert 100dvh
       hier 1180 Layout-Einheiten, die bei .8 als 944 Bildschirmpixel
       ankommen — sichtbar sind also 80 %. Die Variable rechnet 100 /
       --ui-scale und zieht damit mit, wenn die Skalierung auf großen
       Monitoren steigt. Dieselbe Rechnung steht in .shell. */
    width: min(100%, (var(--fenster-hoch) - 200px) * var(--karte-ar));
    aspect-ratio: var(--karte-ar);
    margin-inline: auto;
  }

  /* Der Meeresgrund gehört an die SZENE, nicht an den Ausschnitt: Wird
     geschoben, muss er mitwandern, sonst schwimmt der Archipel über einem
     stehenden Meer. */
  .campus-szene {
    /* Alles auf der Bühne bemisst sich an IHRER Breite (cqw), nicht am
       Fenster. Sonst wüchse die Schrift einer Infokarte weiter, während die
       Bühne unter ihr schrumpft — und die Karten stießen aneinander. Ein
       `max(…rem, …cqw)` je Angabe hält die Untergrenze lesbar. */
    container-type: inline-size;
    background:
      url("/media/campus/karte/see.webp?v=1.68.1") center / cover no-repeat,
      #CFE6F4;
  }

  /* ---------------------------------------------------------- Hinweis --- */

  /* Unten rechts statt der grossen Intro-Karte oben links: Titel und
     Fortschritt stehen bereits in der Kopfzeile, auf der Karte reicht die
     Handlungsaufforderung. Blau statt Weiss, aber der dunkle Ton: Auf
     Cyan (#3BA9D3) erreicht weisser Text nur 2,69:1 — gleiche Messung wie
     bei --th-blue-text. */
  .campus-map .karten-hinweis {
    position: absolute;
    z-index: var(--ebene-karte);
    right: 2.4cqw;
    bottom: 2.2cqw;
    display: flex;
    gap: 1.1cqw;
    align-items: flex-start;
    width: 21.5cqw;
    padding: 1.5cqw 1.7cqw;
    border: 1px solid rgba(255, 255, 255, .35);
    border-radius: 1.1cqw;
    background: rgba(27, 118, 153, .84);
    box-shadow: 0 1.1cqw 2.8cqw rgba(10, 39, 71, .2);
    backdrop-filter: blur(10px);
    -webkit-backdrop-filter: blur(10px);
    color: var(--th-white);
  }
  .karten-hinweis-anker {
    display: grid;
    flex: 0 0 auto;
    place-items: center;
    width: 3.1cqw;
    height: 3.1cqw;
    border-radius: 50%;
    background: rgba(255, 255, 255, .16);
  }
  .karten-hinweis-anker svg {
    width: 62%;
    height: 62%;
    fill: none;
    stroke: var(--th-white);
    stroke-width: 1.7;
    stroke-linecap: round;
    stroke-linejoin: round;
  }
  .karten-hinweis-text { min-width: 0; }
  .campus-map .karten-hinweis h1 {
    max-width: none;
    margin: .2cqw 0 .4cqw;
    color: var(--th-white);
    font-size: max(.95rem, 1.4cqw);
    letter-spacing: -.01em;
  }
  .campus-map .karten-hinweis .lead {
    max-width: none;
    margin: 0;
    color: rgba(255, 255, 255, .92);
    font-size: max(.72rem, .96cqw);
    line-height: 1.4;
  }

  /* -------------------------------------------------------- Wegpunkte --- */

  .campus-map-art {
    position: absolute;
    z-index: var(--ebene-route);
    inset: 0;
    display: block;
    width: 100%;
    height: 100%;
    pointer-events: none;
  }
  /* Der Wegpunkt einer Station, gerechnet aus KARTE.
     `non-scaling-stroke` haelt den Ring auf jeder Buehne gleich dick —
     sonst wird er auf dem Telefon zum Haar. */
  .campus-wegpunkte circle {
    fill: #F6FAFC;
    stroke: #24507A;
    stroke-width: 2;
    vector-effect: non-scaling-stroke;
  }

  /* Orbitkreise um VEJRO und gepunktete Strahlen zu den Themeninseln.
     Zurueckhaltend: Sie sind Navigationsmetapher, nicht Inhalt. Die
     Strichstaerke ist geraetetreu (non-scaling-stroke), die Dash-Muster
     stehen in Szeneneinheiten und ruecken auf kleinen Buehnen enger
     zusammen — dort ist auch die Karte kleiner, das passt. */
  .campus-orbit circle {
    fill: none;
    stroke: rgba(255, 255, 255, .85);
    stroke-width: 2;
    stroke-dasharray: 5 9;
    vector-effect: non-scaling-stroke;
  }
  .campus-orbit line {
    stroke: rgba(255, 255, 255, .95);
    stroke-width: 3.5;
    stroke-dasharray: .1 15;
    stroke-linecap: round;
    vector-effect: non-scaling-stroke;
  }

  /* ------------------------------------------------------------- Deko --- */

  .map-deko {
    position: absolute;
    z-index: var(--ebene-deko);
    inset: 0;
    display: block;
    pointer-events: none;
  }
  /* Langschreibweise, nicht die Kurzform `background`: Die Kurzform setzt
     background-image zurueck, und weil `.map-deko span` spezifischer ist
     als `.deko-kompass`, haette sie jedes Motiv wieder geloescht. */
  .map-deko span {
    position: absolute;
    display: block;
    background-position: center;
    background-size: contain;
    background-repeat: no-repeat;
  }
  /* Kompass oben LINKS, Walfluke unten links, Boote und Moewen rechts im
     freien Wasser — die Verteilung der Vorlage. Frei ist, was nach der
     radialen Anordnung uebrig bleibt: die vier Ecken und der Streifen
     rechts zwischen HIDDENSEE und POEL. */
  .deko-kompass {
    left: 2.6cqw;
    top: 2.6cqw;
    width: 9.5cqw;
    aspect-ratio: 300 / 296;
    background-image: url("/media/campus/karte/kompass.webp?v=1.68.1");
    opacity: .92;
  }
  .deko-boot {
    width: 6cqw;
    aspect-ratio: 319 / 420;
    background-image: url("/media/campus/karte/segelboot.webp?v=1.68.1");
  }
  /* Ein Boot je Seite, nicht beide rechts: links segelt eines im offenen
     Wasser suedwestlich von VEJRO — auf der gepunkteten Route, was fuer
     ein Boot der eine Platz ist, an dem eine Linie darunter richtig
     aussieht. Rechts bleibt eines oben. Nachgemessen gegen Karten,
     Wellen und Inseln, auch im Abgeschlossen-Zustand mit hoeheren
     Infokarten. */
  .deko-boot-a { left: 82%; top: 12%; }
  .deko-boot-b { left: 30%; top: 50%; }
  .deko-wal {
    left: 7%;
    top: 84%;
    width: 7.5cqw;
    aspect-ratio: 420 / 336;
    background-image: url("/media/campus/karte/wal.webp?v=1.68.1");
  }
  .deko-moewen {
    width: 6.5cqw;
    aspect-ratio: 420 / 207;
    background-image: url("/media/campus/karte/moewen.webp?v=1.68.1");
  }
  .deko-moewen-a { left: 73%; top: 7%; }
  .deko-moewen-b { left: 28%; top: 84%; }
  .deko-wellen {
    width: 7cqw;
    aspect-ratio: 520 / 294;
    background-image: url("/media/campus/karte/wellen.webp?v=1.68.1");
    opacity: .85;
  }
  .deko-wellen-a { left: 2%; top: 55%; }
  .deko-wellen-b { left: 67%; top: 86%; }
  .deko-wellen-c { left: 30%; top: 92%; }

  /* --------------------------------------------------------- Stationen --- */

  .island-map {
    position: absolute;
    z-index: 2;
    inset: 0;
    display: block;
    padding: 0;
  }

  /* Jede Station steht mit ihrem MITTELPUNKT auf --x/--y und ist --w breit;
     die Höhe folgt dem Seitenverhältnis des Motivs.

     Vorher hatte der Kasten Breite UND Höhe in Prozent und darin ein
     `object-fit: contain`. Positioniert wurde damit nicht das Motiv,
     sondern der Kasten darum — wo die Insel darin lag, entschied ihr
     Zuschnitt, und jede Angabe war eine Näherung. Jetzt sind die Motive
     zugeschnitten (tools/karten-assets.js) und --x/--y meinen die Insel. */
  /* Die Rückfallwerte sind Absicht: Eine Insel, für die unten keine
     Position steht, landet mitten auf der Bühne über allen anderen. Ohne
     sie fielen left/top/width auf `auto` zurück und die Station stünde
     irgendwo am Rand — falsch, aber unauffällig falsch. */
  .island-map-item {
    position: absolute;
    z-index: var(--ebene-insel);
    left: var(--x, 50%);
    top: var(--y, 50%);
    width: var(--w, 14%);
    transform: translate(-50%, -50%);
  }
  /* Die angefasste Station nach vorn — sonst schiebt sich die Infokarte
     der Nachbarinsel darueber, sobald sie sich beim Hover hebt. */
  .island-map-item:hover,
  .island-map-item:focus-within { z-index: var(--ebene-aktiv); }

  .island-card {
    display: block;
    width: 100%;
    min-height: 0;
    padding: 0;
    overflow: visible;
    border: 0;
    border-radius: 0;
    background: transparent;
    box-shadow: none;
  }
  .island-card:focus-visible { outline: none; }
  .island-card:focus-visible .i-content { outline: 3px solid var(--th-navy); outline-offset: 3px; }
  .island-card.is-done,
  .island-card.is-warten { border: 0; background: transparent; }

  .island-card .i-visual {
    position: static;
    display: block;
    min-height: 0;
    padding: 0;
    border-radius: 0;
    background: none;
  }
  /* height:auto statt contain: Der Kasten IST das Motiv. Die
     width/height-Attribute am <img> kommen aus dem Katalog, damit die
     Fläche schon vor dem Laden stimmt und nichts nachrutscht. */
  .island-card .i-visual img {
    width: 100%;
    height: auto;
    object-fit: fill;
    filter: drop-shadow(0 .8cqw .8cqw rgba(10, 39, 71, .22));
    transition:
      filter var(--duration-fast) ease,
      transform var(--duration-fast) var(--ease-out);
  }

  /* Die Infokarte hängt neben der Insel. Breite und Versatz stehen in cqw —
     Prozent bezöge sich auf die INSEL, und dann wäre die Karte an HIDDENSEE
     halb so breit wie an VEJRØ und ihr Versatz an jeder Insel ein anderer.
     `--karte-y-szene` kommt aus KARTE.inseln und ist bereits in Einheiten
     der Szene umgerechnet. */
  .island-card .i-content {
    position: absolute;
    z-index: var(--ebene-karte);
    top: calc(50% + var(--karte-y-szene, 0cqw));
    display: flex;
    justify-content: flex-start;
    gap: .5cqw;
    width: var(--karte-w);
    padding: 1.1cqw 1.3cqw;
    border: 1px solid rgba(160, 182, 202, .9);
    border-radius: .9cqw;
    background: rgba(255, 255, 255, .95);
    box-shadow: 0 .8cqw 2cqw rgba(10, 39, 71, .17), inset 0 1px 0 rgba(255, 255, 255, .85);
    backdrop-filter: blur(12px);
    -webkit-backdrop-filter: blur(12px);
    transform: translateY(-50%);
    transition:
      border-color var(--duration-fast) ease,
      box-shadow var(--duration-fast) ease,
      transform var(--duration-fast) var(--ease-out);
  }
  .island-card.is-done .i-content { border-color: #8DAA17; background: rgba(255, 255, 255, .97); }
  .island-card.is-warten .i-content { border-color: var(--th-blue); background: rgba(255, 255, 255, .97); }

  .island-card .i-code { font-size: max(.6rem, .8cqw); letter-spacing: .1em; }
  .island-card .i-title { font-size: max(.84rem, 1.2cqw); line-height: 1.14; }
  .island-card .i-desc { display: none; }
  .island-card .i-state {
    gap: .5cqw;
    margin-top: .2cqw;
    font-size: max(.68rem, .9cqw);
    font-variant-numeric: tabular-nums;
    white-space: nowrap;
  }
  .island-card .i-state::before {
    width: max(8px, .78cqw);
    height: max(8px, .78cqw);
  }
  .island-card.is-warten .i-state {
    align-items: flex-start;
    white-space: normal;
    text-wrap: balance;
  }
  .island-card.is-warten .i-state::before { margin-top: .3cqw; }
  .i-score { height: max(5px, .48cqw); }
  .island-card .i-open { display: none; }

  /* ------------------------------------------- Anschluss an die Insel ---

     Strich und Punkt sind ein Pseudoelement-Paar an der Infokarte. Der
     Punkt ist zugleich der Stationspunkt, an dem die Engine die Routen
     ansetzt (campusAnchor in engine.js) — er darf deshalb nicht
     verschwinden, auch wenn er nur wie Zierde aussieht. */
  .island-card .i-content::after {
    content: "";
    position: absolute;
    top: 50%;
    width: var(--karte-x);
    border-top: 1px solid #56708C;
  }

  /* Auf welcher Seite die Infokarte haengt, sagt `data-karte` — gesetzt aus
     KARTE.inseln in engine.js. Vorher standen hier sieben Inselnamen in
     sechs Selektorlisten: Wer eine Insel auf die andere Seite holte, musste
     sie in allen sechs finden, und der Anschlussstrich zeigte danach gern
     in die falsche Richtung. Ein Attribut kann das nicht halb tun. */
  [data-karte="rechts"] .i-content { left: calc(100% + var(--karte-x)); }
  [data-karte="rechts"] .i-content::after { right: 100%; }


  [data-karte="links"] .i-content { right: calc(100% + var(--karte-x)); }
  [data-karte="links"] .i-content::after { left: 100%; }

  /* `unten` haengt die Infokarte mittig unter das Motiv: im Hochformat
     ueberall, auf der Querkarte bei VEJRO. `--karte-y-szene` zaehlt hier
     von der UNTERKANTE des Motivs; negativ ueberlappt die Karte das Motiv
     leicht, wie in der Vorlage. transform ist EINE Eigenschaft — die
     waagerechte Zentrierung steht deshalb in jedem Zustand mit (Hover und
     reduzierte Bewegung weiter unten bei den Zeigerregeln). */
  [data-karte="unten"] .i-content {
    left: 50%;
    right: auto;
    top: calc(100% + var(--karte-y-szene, 0cqw));
    transform: translateX(-50%);
  }

  /* Ohne Abstand kein Anschluss: Ueberlappende und unten angehaengte
     Karten bekommen weder Strich noch Punkt — gesetzt aus KARTE in
     applyKartenLayout. */
  [data-anschluss="aus"] .i-content::before,
  [data-anschluss="aus"] .i-content::after { display: none; }


  /* ------------------------------------------ Anordnung im Querformat ---

     --x/--y ist der Mittelpunkt der Insel, --w ihre Breite, beides in
     Prozent der Bühne. --karte-y verschiebt die Infokarte gegen die
     Inselmitte, wo sie sonst an einem Nachbarn hängt.

     ACHTUNG bei --karte-y: Der Wert liegt auf `top` der Infokarte und
     zählt deshalb in Prozent der INSELHÖHE, nicht der Bühne. Bei VEJRØ
     sind das zwei sehr verschiedene Dinge — die Insel ist 34 % der Bühne
     hoch, −20 % davon sind also nur 7 % Bühne. Wer hier in Bühnenprozent
     rechnet, verschiebt ein Drittel dessen, was er meint. */
  /* ------------------------------------------------ Verpflegungsinsel ---

     RÜGEN ruht: Es steht nicht in inseln.json und wird deshalb nicht
     gezeichnet. Die Angaben bleiben trotzdem hier, damit der Wiedereinbau
     zwei JSON-Eintraege bleibt und kein zweites Tagesprojekt wird — so war
     die Mechanik gemeint, als sie gebaut wurde.

     Anders als die sieben Lerninseln haengt die Kachel UNTER dem Motiv,
     nicht daneben: Statt eines Fortschrittsbalkens stehen dort zwei Namen
     mit Foto, und die brechen in einer Karte von 16 % Buehnenbreite
     unbrauchbar um.

     Der Platz ist die freie Wasserflaeche oben rechts, zwischen der
     Infokarte von SAMSØ (endet bei 64 %) und der Kompassrose (beginnt bei
     87 %). Sie liegt ausserhalb des Rings, den die sieben Lerninseln
     bilden — genau dort, wo eine Station ohne Wissenscheck hingehoert.

     OFFEN: Das Motiv ist noch die flache Silhouette aus
     tools/ruegen-silhouette.js. Neben sieben isometrischen Dioramen faellt
     sie auf. Vor dem Wiedereinbau gehoert ein achtes Motiv im Stil des
     Asset-Packs dazu (05_prompts/ISLAND_PROMPT_TEMPLATE.md). */
  .island-ruegen { --x: 74%; --y: 9%; --w: 7%; --karte-w: 16cqw; }
  .island-ruegen .i-content {
    left: 50%;
    right: auto;
    top: calc(100% + var(--karte-x));
    transform: translateX(-50%);
  }
  /* Der Anschluss steht hier senkrecht: von der Oberkante der Kachel
     hinauf zur Unterkante des Motivs. */
  .island-ruegen .i-content::after {
    left: 50%;
    right: auto;
    top: auto;
    bottom: 100%;
    width: 0;
    height: var(--karte-x);
    border-top: 0;
    border-left: 1px solid #56708C;
  }
  .island-ruegen .i-content::before {
    left: calc(50% - max(4px, .42cqw));
    right: auto;
    top: calc(-1 * var(--karte-x) - max(4px, .42cqw));
  }
  .island-ruegen .i-desc { display: none; }

  /* Die Betreuungsreihe skaliert mit der Buehne wie alles andere auch. */
  .i-crew { gap: .5cqw 1.2cqw; margin-top: .4cqw; }
  .i-crew-bild {
    width: max(20px, 1.9cqw);
    height: max(20px, 1.9cqw);
  }
  .i-crew-name { font-size: max(.64rem, .88cqw); }

  /* Die Anordnung steht nicht mehr hier, sondern in `KARTE.inseln` in
     engine.js, und wird beim Zeichnen als --x/--y/--w gesetzt. Zwei Gruende:
     Die Routen brauchen dieselben Zahlen, um ihre Anker zu rechnen, statt
     sie aus dem DOM zu messen — und es gab die Werte zweimal, einmal fuer
     quer und einmal fuer hoch. Zwei Anordnungen fuer sieben Inseln laufen
     auseinander, sobald jemand nur eine davon anfasst. */

/* ---------------------------------------- Ausschnitt statt zweiter Karte ---

   Hier stand eine EIGENE Anordnung fuer das Hochformat: sieben weitere
   Positionen auf einer 4:5-Buehne, zwei Inseln mit gewechselter Kartenseite,
   die Deko noch einmal verteilt. Also zwei Archipele, die dasselbe zeigen
   sollten und beim naechsten Verschieben einer Insel auseinanderliefen —
   genau das, was die Vorgabe „nicht drei unabhaengig gestaltete Karten"
   ausschliesst.

   Jetzt gibt es EINE Szene im Verhaeltnis 16:9. Was sich zwischen den
   Geraeten unterscheidet, ist allein der AUSSCHNITT, durch den man sie
   sieht:

     Desktop ab 1180 px   Szene passt vollstaendig, kein Schieben
     Tablet quer          dieselbe Szene, proportional kleiner
     Tablet hoch, Telefon Szene bleibt 16:9 und breiter als der Ausschnitt;
                          geschoben wird mit dem Finger

   Die Szene wird dabei nie gestaucht: `--szene-breite` setzt ihre Breite,
   die Hoehe folgt aus `aspect-ratio`. Waagerechter und senkrechter Massstab
   bleiben damit gleich, und keine Insel verschiebt sich gegen eine andere. */

.campus-map {
  position: relative;
  overflow: hidden;
  touch-action: pan-y;
  /* Welche Anordnung aus KARTE gilt, liest die Engine HIER ab
     (kartenAnordnung in engine.js) — die Grenze steht damit nur einmal,
     naemlich in der Medienabfrage weiter unten. */
  --anordnung: quer;
}

.campus-szene {
  container-type: inline-size;
  position: relative;
  width: var(--szene-breite, 100%);
  aspect-ratio: 16 / 9;
  /* translate3d statt top/left: Das Schieben laeuft dann auf der
     Grafikkarte und loest kein Neuberechnen des Layouts aus. Ohne das
     ruckelt es auf dem iPad sichtbar, weil bei jedem Zeigerereignis
     sieben Inseln, sieben Karten und sieben Bezierkurven neu vermessen
     wuerden. */
  transform: translate3d(var(--pan-x, 0px), var(--pan-y, 0px), 0);
  will-change: transform;
}

/* Wird geschoben, soll nichts nachlaufen — sonst haengt die Karte am
   Finger. Der Uebergang gilt nur beim Loslassen und beim Einrasten. */
.campus-map.is-schiebend .campus-szene { transition: none; }
.campus-map:not(.is-schiebend) .campus-szene {
  transition: transform var(--duration-fast) var(--ease-out);
}

/* Der Hinweis erscheint nur, wo wirklich geschoben werden kann. */
.map-schiebehinweis {
  position: absolute;
  z-index: var(--ebene-karte);
  right: 10px;
  bottom: 10px;
  display: none;
  gap: 6px;
  align-items: center;
  padding: 6px 10px;
  border-radius: 999px;
  background: rgba(255, 255, 255, .92);
  color: var(--th-navy);
  font-size: var(--text-sm);
  font-weight: 600;
  pointer-events: none;
}
.campus-map.kann-schieben .map-schiebehinweis { display: flex; }
.campus-map.hat-geschoben .map-schiebehinweis { display: none; }

/* ------------------------------------------------- Ausschnitt je Gerät ---

   Drei Bereiche, eine Szene. Was sich ändert, ist NUR die Größe des
   Ausschnitts und ob die Szene hineinpasst.

     ab 1180 px      Szene passt vollständig, nichts zu schieben
     768–1179 px     dieselbe Szene, proportional kleiner
     unter 768 px    Szene bleibt auf Mindestbreite, wird geschoben

   Die Breite der Szene steht in `--szene-breite`. Nur diese eine Zahl
   entscheidet, ob geschoben wird — die Engine fragt nicht die Fensterbreite
   ab, sondern misst, ob die Szene über den Ausschnitt hinausragt. Damit
   kann die Grenze im Stylesheet nicht von einer zweiten Fassung im Skript
   abweichen, wie es hier schon einmal passiert ist. */

/* Tablet quer und kleiner Desktop: dieselbe Komposition, weniger Polster.
   Die Infokarten dürfen schrumpfen, die Trefferflächen nicht. */
@media (max-width: 1179px) {
  .campus-map .island-intro { padding: 1.5cqw 1.7cqw; }
  .island-card .i-content { padding: .9cqw 1.1cqw; }
  .island-card .i-content { box-shadow: 0 .5cqw 1.2cqw rgba(10, 39, 71, .14); }
}

/* Tablet hochkant: KEIN Ausschnitt auf die Querkarte mehr, sondern die
   eigene senkrechte Anordnung `hoch` aus KARTE — 900 x 1200 Einheiten,
   3:4. Alle sieben Inseln bleiben gleichzeitig sichtbar, VEJRO zentral,
   die Infokarten haengen unter ihren Motiven, nichts wird geschoben.
   (Das Schieben bleibt als Mechanik liegen und schaltet sich selbst ab,
   weil die Szene in den Ausschnitt passt.) */
@media (orientation: portrait) and (min-width: 768px) and (max-width: 1199px) {
  .campus-map {
    --anordnung: hoch;
    --karte-ar: 3 / 4;
    /* Breite und Hoehe zugleich begrenzt, wie am Querformat:
       --fenster-hoch wegen zoom am body, abgezogen ist der Kopfbereich. */
    width: min(100%, (var(--fenster-hoch) - 260px) * 3 / 4);
    aspect-ratio: var(--karte-ar);
    margin-inline: auto;
  }
  .campus-szene { aspect-ratio: 3 / 4; }

  /* Kompakter als am Desktop, aber vollstaendig lesbar. Die cqw beziehen
     sich jetzt auf eine schmalere Buehne, deshalb eigene Werte. */
  .island-card .i-content { gap: .4cqw; padding: 1cqw 1.3cqw; }
  .island-card .i-code { font-size: max(.6rem, 1.2cqw); }
  .island-card .i-title { font-size: max(.78rem, 1.75cqw); }
  .island-card .i-state { font-size: max(.64rem, 1.3cqw); }

  /* Deko fuer die senkrechte Szene: Kompass oben links, Boote und Moewen
     ins freie Wasser, der Wal behaelt seine Ecke unten links. (Wer hier
     etwas ausblenden will: `.map-deko span` schlaegt `.deko-…` — die
     Regel braucht dann `.map-deko .deko-…`, siehe AGENTS.md.) */
  .deko-kompass { width: 12cqw; }
  .deko-boot { width: 7.5cqw; }
  .deko-boot-a { left: 80%; top: 7%; }
  .deko-boot-b { left: 7%; top: 88%; }
  .deko-wal { left: 25%; top: 87%; }
  .deko-moewen { width: 8cqw; }
  .deko-moewen-a { left: 20%; top: 21%; }
  .deko-moewen-b { left: 68%; top: 52%; }
  .deko-wellen { width: 8.5cqw; }
  .deko-wellen-a { left: 3%; top: 47%; }
  .deko-wellen-b { left: 88%; top: 80%; }
  .deko-wellen-c { left: 30%; top: 96%; }

  /* Im Hochformat bleibt der knappe Platz auf der Karte den Inseln. */
  .campus-map .karten-hinweis { display: none; }
}

/* Telefon: Die Szene verschwindet KOMPLETT — samt Seegrund und Deko, denn
   Hintergruende in einem display:none-Teilbaum holt der Browser gar nicht
   erst. An ihre Stelle tritt der Orbit: die aktive Insel gross im
   Rampenlicht, die uebrigen sechs als runde Stationen auf dem Ring. */
@media (max-width: 767px) {
  .campus-map { display: none; }
}

/* ------------------------------------------ Tablet hochkant: kompakter Kopf ---

   Feedback und THI behalten beim Drehen ihren Platz über dem Inhalt.
   Unter der Hochformatkarte lagen sie fast eine Fensterhöhe weiter unten.
   Eine eigene zweite Kopfzeile lässt Marke und Fortschritt genug Platz,
   ohne Werkzeuge oder Trefferflächen zu verkleinern. */

@media (orientation: portrait) and (min-width: 768px) and (max-width: 1199px) {
  body.ist-karte .masthead {
    grid-template-columns: minmax(0, 1fr) auto auto;
    gap: 14px;
  }
  body.ist-karte .masthead-tools {
    grid-column: 1 / -1;
    grid-row: 2;
  }
  body.ist-karte .masthead-progress {
    grid-column: 2;
    grid-row: 1;
    justify-self: end;
    width: auto;
    min-width: 200px;
  }
  body.ist-karte .campus-progress-head,
  body.ist-karte .campus-progress-copy { display: none; }
  body.ist-karte .campus-progress-kompakt { display: flex; }
  body.ist-karte .menue-knopf {
    display: grid;
    grid-column: 3;
    grid-row: 1;
  }
}

/* ------------------------------------------------- Telefon: Kopf und Orbit ---

   Der Kopf traegt nur noch Hamburger, Wortmarke und Avatar; Titelzeile,
   Fortschritt und Werkzeuge stecken in Orbit, Fortschrittskarte und
   unterer Navigation. Das gilt auf Uebersicht, Inselstart und Ergebnis
   (body.mit-mobilkopf); die Fragenansicht hat keinen Kopf. */

.orbit, .mobil-nav { display: none; }

@media (max-width: 767px) {
  body.mit-mobilkopf .masthead {
    grid-template-columns: auto minmax(0, 1fr) auto;
    grid-template-rows: auto;
    gap: 10px;
    align-items: center;
  }
  /* Solides Weiss statt Glas: Die Wortmarke ist ein PNG auf Weiss und
     zeichnet sich auf der halbtransparenten Flaeche als hellerer Kasten ab. */
  body.mit-mobilkopf .masthead { background: var(--th-white); }
  body.mit-mobilkopf .menue-knopf { display: grid; grid-column: 1; grid-row: 1; }
  body.mit-mobilkopf .brand {
    grid-column: 2;
    grid-row: 1;
    justify-self: center;
  }
  body.mit-mobilkopf .brand-logo { width: 148px; }
  body.mit-mobilkopf .brand-copy { display: none; }
  body.mit-mobilkopf .kopf-avatar { display: grid; grid-column: 3; grid-row: 1; }
  body.mit-mobilkopf .masthead-progress,
  body.mit-mobilkopf .masthead-tools { display: none; }

  /* Seit 1.61 auf Übersicht, Inselstart und Ergebnis (body.mit-mobilkopf,
     gesetzt in show()); vorher nur auf der Übersicht. */
  /* Platz fuer die feste Navigation am unteren Rand. */
  body.mit-mobilkopf .shell { padding-bottom: 96px; }

  #screen-islands { background: #DCEEF9; }

  .orbit {
    display: flex;
    flex-direction: column;
    gap: 8px;
    padding: 14px 14px 18px;
    /* Wasserflaeche wie auf der grossen Karte, aber als Verlauf: Die
       166 KB Seegrund-Textur bleiben dem Telefon weiter erspart. */
    background: linear-gradient(180deg, #E2F1FA 0%, #CFE6F4 55%, #D8ECF8 100%);
  }

  .orbit-pille {
    display: inline-flex;
    align-items: center;
    align-self: center;
    min-height: 34px;
    margin: 0;
    padding: 5px 20px;
    border: 1px solid rgba(255, 255, 255, .8);
    border-radius: 999px;
    background: rgba(255, 255, 255, .95);
    box-shadow: 0 6px 16px rgba(20, 55, 90, .1);
    color: var(--th-blue-text);
    font-size: var(--text-label);
    font-weight: 800;
    letter-spacing: .18em;
    text-transform: uppercase;
  }

  .orbit-buehne {
    position: relative;
    width: min(100%, 470px);
    aspect-ratio: 100 / 113;
    margin: 0 auto;
    touch-action: pan-y;
  }

  .orbit-ring {
    position: absolute;
    inset: 3% 5%;
    border: 2px dashed rgba(29, 54, 97, .25);
    border-radius: 50%;
  }

  .orbit-thumbs {
    position: absolute;
    inset: 0;
    margin: 0;
    padding: 0;
    list-style: none;
  }
  .orbit-station {
    position: absolute;
    left: var(--px, 50%);
    top: var(--py, 50%);
    transform: translate(-50%, -50%);
    transition: left 380ms var(--ease-out), top 380ms var(--ease-out), opacity 380ms ease;
  }
  /* „mitte" steht im Rampenlicht, „versteckt" ist der Ringplatz hinter dem
     Rampenlicht — beide unsichtbar, damit die Rotation als Kreis wirkt. */
  .orbit-station[data-platz="mitte"],
  .orbit-station[data-platz="versteckt"] {
    opacity: 0;
    pointer-events: none;
  }

  .orbit-thumb {
    display: grid;
    place-items: center;
    width: 76px;
    height: 76px;
    padding: 0;
    overflow: hidden;
    border: 3px solid var(--th-white);
    border-radius: 50%;
    background: radial-gradient(circle at 50% 40%, #EAF6FD 0 58%, #C2E2F4);
    box-shadow: 0 8px 20px rgba(20, 55, 90, .18);
  }
  .orbit-thumb img {
    width: 86%;
    height: 86%;
    object-fit: contain;
  }

  .orbit-hero {
    position: absolute;
    left: 50%;
    top: 52%;
    z-index: 1;
    transform: translate(-50%, -50%);
    display: flex;
    flex-direction: column;
    align-items: center;
    width: 68%;
    padding: 9% 5% 7%;
    border-radius: 48% 48% 46% 46% / 34% 34% 30% 30%;
    background: var(--th-white);
    box-shadow: 0 18px 44px rgba(20, 55, 90, .16);
    text-align: center;
  }
  .orbit-hero-bild {
    width: 72%;
    height: auto;
    margin-bottom: 6px;
    filter: drop-shadow(0 8px 10px rgba(10, 39, 71, .18));
  }
  .orbit-hero-code {
    margin: 0 0 2px;
    color: var(--th-blue-text);
    font-size: var(--text-label);
    font-weight: 800;
    letter-spacing: .16em;
    text-transform: uppercase;
  }
  .orbit-hero-titel {
    margin: 0 0 3px;
    color: var(--th-navy);
    font-size: var(--text-lg);
    font-weight: 800;
    line-height: 1.12;
    letter-spacing: -.01em;
    text-wrap: balance;
  }
  .orbit-hero-stand {
    display: flex;
    gap: 6px;
    align-items: center;
    margin: 0 0 10px;
    color: var(--th-muted);
    font-size: var(--text-label);
    font-weight: 600;
  }
  .orbit-hero-stand::before {
    content: "";
    width: 8px;
    height: 8px;
    border-radius: 50%;
    background: #C3CBD4;
  }
  .orbit-start {
    min-height: var(--tap);
    padding: 10px 36px;
    border-radius: 999px;
  }

  .orbit-pfeil {
    position: absolute;
    top: 50%;
    z-index: 2;
    display: grid;
    place-items: center;
    width: calc(var(--tap) + 2px);
    height: calc(var(--tap) + 2px);
    padding: 0;
    border: 1px solid rgba(183, 194, 207, .6);
    border-radius: 50%;
    background: var(--th-white);
    color: var(--th-navy);
    box-shadow: 0 10px 24px rgba(20, 55, 90, .16);
    transform: translateY(-50%);
  }
  .orbit-pfeil svg {
    width: 26px;
    height: 26px;
    fill: none;
    stroke: currentColor;
    stroke-width: 2.4;
    stroke-linecap: round;
    stroke-linejoin: round;
  }
  .orbit-pfeil-links { left: -4px; }
  .orbit-pfeil-rechts { right: -4px; }

  .orbit-punkte {
    display: flex;
    justify-content: center;
    gap: 2px;
  }
  /* Der sichtbare Punkt ist klein, die Trefferflaeche nicht: 34 x 55 px
     je Knopf, das Mindestmass gilt auch hier. */
  .orbit-punkt {
    position: relative;
    width: 34px;
    height: var(--tap);
    padding: 0;
    border: 0;
    background: transparent;
  }
  .orbit-punkt::before {
    content: "";
    position: absolute;
    left: 50%;
    top: 50%;
    width: 11px;
    height: 11px;
    border-radius: 50%;
    background: #A9CFE6;
    transform: translate(-50%, -50%);
    transition: background-color var(--duration-fast) ease, transform var(--duration-fast) ease;
  }
  .orbit-punkt.ist-aktiv::before {
    background: var(--th-blue-text);
    transform: translate(-50%, -50%) scale(1.3);
  }

  .orbit-hinweis {
    margin: 0;
    color: var(--th-navy);
    font-size: var(--text-sm);
    font-weight: 600;
    text-align: center;
  }
  .orbit-hand { display: grid; place-items: center; }
  .orbit-hand svg {
    width: 72px;
    height: auto;
    fill: none;
    stroke: var(--th-navy);
    stroke-width: 2;
    stroke-linecap: round;
    stroke-linejoin: round;
    opacity: .85;
  }

  .orbit-fortschritt {
    display: flex;
    gap: 14px;
    align-items: center;
    justify-content: space-between;
    margin-top: 8px;
    padding: 16px 18px;
    border: 1px solid rgba(183, 194, 207, .6);
    border-radius: var(--radius-lg);
    background: var(--th-white);
    box-shadow: 0 8px 24px rgba(20, 55, 90, .08);
  }
  .orbit-fortschritt-text strong {
    display: block;
    margin-bottom: 2px;
    color: var(--th-navy);
    font-size: var(--text-md);
  }
  .orbit-fortschritt-text span {
    color: var(--th-muted);
    font-size: var(--text-sm);
    font-variant-numeric: tabular-nums;
  }
  /* Derselbe conic-Ring wie auf der Ergebniskarte, nur hell und klein. */
  .orbit-fortschritt-ring {
    --pct: 0;
    position: relative;
    display: grid;
    flex: 0 0 auto;
    place-items: center;
    width: 84px;
    height: 84px;
    border-radius: 50%;
    background: conic-gradient(var(--th-blue-text) calc(var(--pct, 0) * 1%), #E2ECF3 0);
  }
  .orbit-fortschritt-ring::before {
    content: "";
    position: absolute;
    inset: 8px;
    border-radius: 50%;
    background: var(--th-white);
  }
  .orbit-fortschritt-ring b {
    position: relative;
    color: var(--th-navy);
    font-size: 1.02rem;
    font-variant-numeric: tabular-nums;
  }

  /* Feste Navigation am unteren Rand. Kanten statt Breite (100vw ist mit
     body { zoom: .8 } nicht verlaesslich); auto-Spalten statt fester
     vier, weil Einzelpakete ohne Arbeitskarte und Feedback auskommen. */
  /* Die Leiste steht seit 1.61 außerhalb der Bildschirme (index.html, nach
     </main>) und erscheint nur mit dem einheitlichen Kopf. Außerhalb jedes
     .screen hängt sie auch an keiner Einblendung mit transform. */
  body.mit-mobilkopf .mobil-nav {
    position: fixed;
    left: 0;
    right: 0;
    bottom: 0;
    z-index: var(--ebene-kopf);
    display: grid;
    grid-auto-flow: column;
    grid-auto-columns: 1fr;
    padding: 6px 8px calc(6px + env(safe-area-inset-bottom));
    border-top: 1px solid var(--th-line);
    background: rgba(255, 255, 255, .96);
    backdrop-filter: blur(14px);
    -webkit-backdrop-filter: blur(14px);
  }
  .mobil-nav-punkt {
    display: flex;
    flex-direction: column;
    gap: 3px;
    align-items: center;
    justify-content: center;
    min-height: calc(var(--tap) + 8px);
    padding: 6px 2px;
    border: 0;
    border-radius: var(--radius-md);
    background: transparent;
    /* --th-muted statt #6E7E93: das erreichte auf Weiß nur 4,14 : 1. */
    color: var(--th-muted);
    font-size: var(--text-label);
    font-weight: 700;
    text-decoration: none;
  }
  .mobil-nav-punkt svg {
    width: 26px;
    height: 26px;
    fill: none;
    stroke: currentColor;
    stroke-width: 1.8;
    stroke-linecap: round;
    stroke-linejoin: round;
  }
  .mobil-nav-punkt.ist-aktiv { color: var(--th-blue-text); }

  /* Offenes THI-Panel: Die Leiste trägt --ebene-kopf (100), Schleier und
     Panel 90/91. Bis 1.66 lag sie deshalb über Eingabefeld, Senden-Knopf
     und der Zeile mit der Support-Nummer. Ausblenden statt das Panel
     anzuheben: Bis 640 px ist die Leiste ohnehin inert, darüber führt
     „THI fragen“ nur zu dem, was schon offen ist. */
  body.mit-mobilkopf.thi-offen .mobil-nav { display: none; }
}

/* ------------------------------------------------------------ Campus-Menue ---

   Ein <dialog> in der Top-Layer — er entkommt dem zoom der Seite (siehe
   AGENTS.md, „Ein modaler <dialog> entkommt dem zoom“), deshalb stehen die
   Masse hier in echten Pixeln. */

.menue-dialog {
  width: min(92vw, 400px);
  margin: auto;
  padding: 16px 16px 18px;
  border: 0;
  border-radius: var(--radius-lg);
  background: var(--th-white);
  box-shadow: 0 24px 64px rgba(10, 39, 71, .3);
  color: var(--th-navy);
}
.menue-dialog::backdrop { background: rgba(10, 39, 71, .45); }

.menue-kopf {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 10px;
  margin-bottom: 12px;
}
.menue-kopf h2 { margin: 0; font-size: var(--text-md); }

/* var(--tap) statt 44px und 52px: unter `zoom: .8` gemessen 35 und 42 px. */
.menue-zu {
  position: relative;
  flex: 0 0 auto;
  width: var(--tap);
  height: var(--tap);
  padding: 0;
  border: 1px solid var(--th-line-strong);
  border-radius: 50%;
  background: var(--th-white);
}
.menue-zu::before,
.menue-zu::after {
  content: "";
  position: absolute;
  left: 50%;
  top: 50%;
  width: 18px;
  height: 2px;
  border-radius: 2px;
  background: var(--th-navy);
}
.menue-zu::before { transform: translate(-50%, -50%) rotate(45deg); }
.menue-zu::after { transform: translate(-50%, -50%) rotate(-45deg); }

.menue-liste { display: grid; gap: 8px; }
.menue-punkt {
  display: flex;
  gap: 12px;
  align-items: center;
  min-height: var(--tap);
  padding: 8px 12px;
  border: 1px solid var(--th-line-strong);
  border-radius: var(--radius-lg);
  background: var(--th-white);
  color: var(--th-navy);
  font-size: var(--text-base);
  font-weight: 800;
  text-align: left;
  text-decoration: none;
}
.menue-punkt:hover { border-color: var(--th-blue); background: var(--info-bg); }

/* ------------------------------------------------------------- Startbild --- */

.start-layout {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(320px, .82fr);
}

.start-intro {
  padding: clamp(26px, 4vw, 52px);
  color: var(--th-white);
  background: linear-gradient(150deg, var(--th-navy) 0%, var(--th-navy-deep) 100%);
}
.start-intro .kicker { background: rgba(255, 255, 255, .16); color: var(--th-white); }
.start-intro h1 { color: var(--th-white); }
.start-intro .lead { color: rgba(255, 255, 255, .88); }

/* ---------------------------------------------------- Betreuung der Insel ---

   Ein Streifen unter dem Layout, ueber die volle Breite der Karte. Er
   beantwortet die Frage, die vor dem Quiz aufkommt und die weder Buehne
   noch Teilnehmerspalte beantworten: Wen spreche ich hier an?

   Deshalb unten und nicht oben. Oben steht, worum es geht — das ist der
   Grund, warum jemand auf der Seite ist. Die Betreuung ist die Antwort auf
   die zweite Frage, und die stellt sich erst danach.

   Der helle Grund trennt den Streifen von der weissen Teilnehmerspalte
   darueber; ohne ihn liefe er mit ihr zu einer Flaeche zusammen. */
.betreuung {
  padding: clamp(18px, 2.2vw, 26px) clamp(20px, 3vw, 42px) clamp(20px, 2.6vw, 30px);
  border-top: 1px solid var(--th-line);
  background: #F7FAFC;
}

.betreuung[hidden] { display: none; }

.betreuung-titel {
  margin: 0 0 14px;
  color: var(--th-muted);
  font-size: var(--text-label);
  font-weight: 800;
  letter-spacing: .09em;
  text-transform: uppercase;
}

/* auto-fit statt fester Spaltenzahl: Die Zahl der Betreuer steht in
   betreuer.json und darf sich aendern, ohne dass hier jemand nachzaehlt. */
.betreuung-liste {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(258px, 1fr));
  gap: 12px;
  margin: 0;
  padding: 0;
  list-style: none;
}

/* Eine Person allein wuerde sonst ueber die ganze Breite gezogen — ein
   Name und eine Zeile Text in einem 1100 px breiten Kasten. */
.betreuung.ist-einzeln .betreuung-liste {
  grid-template-columns: minmax(0, 430px);
}

.betreuung-karte {
  display: grid;
  grid-template-columns: 64px minmax(0, 1fr);
  gap: 14px;
  align-items: center;
  padding: 12px 18px 12px 12px;
  border: 1px solid var(--th-line);
  border-radius: var(--radius-lg);
  background: var(--th-white);
  box-shadow: var(--shadow-sm);
}

.betreuung-bild {
  display: grid;
  overflow: hidden;
  width: 64px;
  height: 64px;
  place-items: center;
  border-radius: 50%;
  background: var(--info-bg);
  /* Weisser Innenring, damit ein dunkles Foto nicht direkt an der
     Kartenkante klebt, darunter der Markenring. */
  box-shadow: 0 0 0 2px var(--th-white), 0 0 0 3px rgba(59, 169, 211, .45);
}

.betreuung-bild img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}

/* Fehlt das Foto, stehen die Initialen da. Ein leerer grauer Kreis sagt
   nichts und sieht aus wie ein Ladefehler. */
.betreuung-bild.ohne-foto {
  color: var(--th-blue-text);
  font-size: 1.06rem;
  font-weight: 800;
}

.betreuung-text {
  display: grid;
  gap: 2px;
  min-width: 0;
}

.betreuung-rolle {
  color: var(--th-blue-text);
  font-size: var(--text-label);
  font-weight: 800;
  letter-spacing: .08em;
  text-transform: uppercase;
}

.betreuung-name {
  color: var(--th-navy);
  font-size: var(--text-base);
  font-weight: 800;
  line-height: 1.2;
}

.betreuung-koennen {
  color: var(--th-muted);
  font-size: var(--text-sm);
  font-weight: 600;
  line-height: 1.35;
}

.samsoe-start-visual[hidden],
.hiddensee-start-visual[hidden],
.vejro-start-visual[hidden],
.poel-start-visual[hidden],
.usedom-start-visual[hidden],
.langeland-start-visual[hidden],
.fehmarn-start-visual[hidden] { display: none; }

#screen-start[data-island="samsoe"] .start-layout {
  grid-template-columns: minmax(0, 1.16fr) minmax(380px, .94fr);
  min-height: clamp(660px, 72vh, 780px);
}

#screen-start[data-island="samsoe"] .start-intro {
  position: relative;
  isolation: isolate;
  min-height: 660px;
  overflow: hidden;
  background:
    radial-gradient(circle at 52% 84%, rgba(19, 151, 232, .34), transparent 32%),
    radial-gradient(circle at 10% 12%, rgba(61, 116, 190, .38), transparent 38%),
    linear-gradient(145deg, #173F79 0%, #0C2E63 54%, #071D46 100%);
}

#screen-start[data-island="samsoe"] .start-intro::after {
  content: "";
  position: absolute;
  z-index: 0;
  right: -18%;
  bottom: -30%;
  width: 90%;
  aspect-ratio: 1;
  border-radius: 50%;
  background: radial-gradient(circle, rgba(27, 157, 235, .2), transparent 66%);
  pointer-events: none;
}

/* Die Tiefenblende über dem Motiv kommt aus dem gemeinsamen Scrim weiter
   unten (`#screen-start[data-island]:not(...) .start-intro::before`), ebenso
   Überschrift und Vorspann aus dem gemeinsamen Typografieblock. SAMSØ hatte
   bis 1.46 eigene Regeln dafür — einen stärkeren Verlauf, ein breiteres,
   ab 1100 px einzeiliges Rubrum, 53ch Vorspann. Keine davon hat je
   gegriffen: der Scrim verliert gegen die :not()-Kette (Spezifität), h1 und
   Vorspann gegen die gleich starke, spätere gemeinsame Regel. Was seit
   Wochen auf der Bühne steht, IST die gemeinsame Fassung; sie wurde so
   abgenommen. Wer SAMSØ wirklich eine eigene Blende oder Typografie geben
   will: in die :not()-Kette eintragen beziehungsweise die Spezifität mit
   `#screen-start.screen[data-island="samsoe"]` anheben — und dann messen. */
#screen-start[data-island="samsoe"] .start-intro > :not(.samsoe-start-visual) {
  position: relative;
  z-index: 3;
}

#screen-start[data-island="samsoe"] .facts {
  max-width: 600px;
  margin-top: 20px;
}

#screen-start .start-intro .facts li {
  grid-template-columns: 58px minmax(0, 1fr);
  gap: 13px;
  min-height: 58px;
  align-items: center;
}

#screen-start .start-intro .facts li::before {
  width: 58px;
  height: 58px;
  border-radius: 0;
  background-color: transparent;
  background-position: center;
  background-repeat: no-repeat;
  background-size: contain;
  box-shadow: none;
  filter: drop-shadow(0 5px 7px rgba(0, 13, 38, .28));
}

/* Die drei 3D-Sechsecke sind gewollt. In 1.61 standen hier einen Tag lang
   flache Liniensymbole (einheitlicher, die „10" im ersten Sechseck ist
   klein schwer lesbar); Max hat die Sechsecke am 30.10.2026 zurückgeholt.
   Nicht wieder still gegen Liniensymbole tauschen.

   Das Symbol hängt an der Klasse, nicht an der Position. Die Reihenfolge
   der Fakten ist Redaktionssache; bei :nth-child wandert sonst still das
   falsche Bild an die falsche Zeile — dieselbe Begründung wie bei
   opt-1 bis opt-4 an den Antwortkacheln. */
#screen-start .facts .fact-fragen::before {
  background-image: url("/media/campus/campus-hex-fragen.webp?v=1.68.1");
}

#screen-start .facts .fact-zeit::before {
  background-image: url("/media/campus/campus-hex-zeitlimit.webp?v=1.68.1");
}

#screen-start .facts .fact-aufloesung::before {
  background-image: url("/media/campus/campus-hex-aufloesung.webp?v=1.68.1");
}

.samsoe-start-visual {
  position: absolute;
  z-index: 1;
  inset: 0;
  overflow: hidden;
  pointer-events: none;
}

.samsoe-start-visual img {
  position: absolute;
  display: block;
  max-width: none;
  height: auto;
  user-select: none;
}

.samsoe-start-vehicle {
  bottom: 1%;
  left: -3%;
  z-index: 1;
  width: min(70%, 580px);
  filter: drop-shadow(0 18px 20px rgba(0, 13, 38, .34));
}

.samsoe-start-technician {
  right: 0;
  bottom: -2%;
  z-index: 2;
  width: min(52%, 435px);
  filter: drop-shadow(-12px 10px 18px rgba(0, 13, 38, .24));
}

#screen-start[data-island="samsoe"] .start-form {
  gap: 14px;
  padding: clamp(30px, 3.6vw, 48px);
  background: rgba(255, 255, 255, .985);
}

#screen-start[data-island="samsoe"] .form-title {
  font-size: clamp(1.65rem, 2.35vw, 2.15rem);
  letter-spacing: -.03em;
}


#screen-start[data-island="hiddensee"] .start-layout {
  min-height: clamp(680px, 72vh, 790px);
}

#screen-start[data-island="hiddensee"] .start-intro {
  position: relative;
  isolation: isolate;
  min-height: 680px;
  overflow: hidden;
}

#screen-start[data-island="hiddensee"] .start-intro::after {
  content: "";
  position: absolute;
  z-index: 0;
  left: 14%;
  bottom: -24%;
  width: 78%;
  aspect-ratio: 1.4;
  border-radius: 50%;
  background: radial-gradient(ellipse, rgba(37, 159, 227, .17), transparent 68%);
  pointer-events: none;
}

#screen-start[data-island="hiddensee"] .start-intro > :not(.hiddensee-start-visual) {
  position: relative;
  z-index: 3;
}

#screen-start[data-island="hiddensee"] .facts {
  max-width: 620px;
}

.hiddensee-start-visual {
  position: absolute;
  z-index: 1;
  inset: 0;
  overflow: hidden;
  pointer-events: none;
}

.hiddensee-start-contact {
  position: absolute;
  bottom: -4%;
  left: 50%;
  display: block;
  width: min(78%, 680px);
  max-width: none;
  height: auto;
  transform: translateX(-50%);
  filter: drop-shadow(0 20px 22px rgba(0, 13, 38, .34));
  user-select: none;
}

#screen-start[data-island="vejro"] .start-layout {
  grid-template-columns: minmax(0, 1fr) clamp(340px, 26vw, 430px);
  min-height: clamp(620px, 72vh, 790px);
}

#screen-start[data-island="vejro"] .start-intro {
  position: relative;
  isolation: isolate;
  min-height: 620px;
  padding: clamp(30px, 3.5vw, 48px);
  overflow: hidden;
  background:
    radial-gradient(circle at 55% 78%, rgba(19, 140, 231, .3), transparent 35%),
    radial-gradient(circle at 12% 10%, rgba(31, 83, 151, .36), transparent 40%),
    linear-gradient(145deg, #081b35 0%, #09284f 55%, #06162c 100%);
}

/* Die Bildgenerator-Ebenen besitzen weiche, halbtransparente Ränder. Diese
   Blende hält die Texte ruhig, ohne den Lichtkegel oder die Produkte als
   Ganzes abzudunkeln. */
#screen-start[data-island="vejro"] .start-intro::before {
  content: "";
  position: absolute;
  z-index: 2;
  inset: 0;
  background:
    linear-gradient(90deg, rgba(4, 17, 36, .56) 0%, rgba(4, 17, 36, .17) 50%, transparent 78%),
    linear-gradient(180deg, transparent 42%, rgba(4, 17, 36, .1) 60%, rgba(4, 17, 36, .62) 100%);
  pointer-events: none;
}

#screen-start[data-island="vejro"] .start-intro > :not(.vejro-start-visual) {
  position: relative;
  z-index: 3;
}

#screen-start[data-island="vejro"] .start-intro .kicker {
  display: none;
}

#screen-start[data-island="vejro"] .start-intro h1 {
  max-width: 16ch;
  font-size: clamp(2.2rem, 3.3vw, 3.45rem);
  line-height: 1.03;
  letter-spacing: -.045em;
  text-wrap: balance;
}

#screen-start[data-island="vejro"] .start-intro .lead {
  display: none;
}

#screen-start[data-island="vejro"] .facts {
  max-width: 580px;
  margin-top: 18px;
}

.vejro-start-visual {
  position: absolute;
  z-index: 1;
  inset: 0;
  overflow: hidden;
  pointer-events: none;
}

.vejro-start-visual img {
  position: absolute;
  display: block;
  max-width: none;
  height: auto;
  user-select: none;
}

.vejro-start-light {
  z-index: 0;
  top: -9%;
  right: -9%;
  width: min(88%, 850px);
  opacity: .9;
}

.vejro-start-stage {
  z-index: 1;
  right: 2%;
  bottom: -5%;
  width: 96%;
  filter: drop-shadow(0 22px 26px rgba(0, 5, 20, .48));
}

.vejro-start-access {
  z-index: 2;
  bottom: 9.5%;
  left: 8%;
  width: 34%;
  filter: brightness(1.12) drop-shadow(0 18px 18px rgba(0, 7, 25, .46));
}

.vejro-start-water {
  z-index: 2;
  bottom: 11%;
  left: 28%;
  width: 53%;
  filter: brightness(1.12) drop-shadow(0 17px 18px rgba(0, 7, 25, .5));
}

.vejro-start-contact {
  z-index: 2;
  right: 0;
  bottom: 8.5%;
  width: 40%;
  filter: brightness(1.08) drop-shadow(0 18px 20px rgba(0, 7, 25, .5));
}

#screen-start[data-island="vejro"] .start-form {
  gap: 14px;
  padding: clamp(24px, 2.6vw, 38px);
  background: rgba(255, 255, 255, .985);
}

#screen-start[data-island="vejro"] .start-actions {
  flex-direction: column;
  align-items: stretch;
}

#screen-start[data-island="vejro"] .start-actions .btn { width: 100%; }

#screen-start[data-island="vejro"] .start-details { display: none; }

#screen-start[data-island="vejro"] .participant-summary {
  grid-template-columns: 1fr;
}

#screen-start[data-island="vejro"] .participant-summary .btn {
  grid-column: 1;
  grid-row: 4;
  justify-self: start;
}

/* Das Startpanel mit gespeicherten Angaben (Identität oben, Orientierung in
   der Mitte, Handlung unten) gestaltet der gemeinsame `.is-panel`-Block
   weiter unten für alle Inseln. VEJRØ trug bis 1.46 denselben Block noch
   einmal unter `.has-participant-facts` — Regel für Regel gleiche Werte,
   aber eine Stufe weniger spezifisch und früher in der Datei, also nie
   wirksam. Eine Abweichung steckte doch darin: `min-height: 38px` am
   Bearbeiten-Knopf, unter `zoom: .8` eine Trefferfläche von 30 px. Der
   gemeinsame Block hatte das mit `var(--tap)` längst behoben; hier wäre es
   wieder scharf geworden, sobald jemand die Spezifität anhebt. */

#screen-start[data-island="poel"] .start-layout {
  min-height: clamp(740px, 74vh, 850px);
}

#screen-start[data-island="poel"] .start-intro {
  position: relative;
  isolation: isolate;
  min-height: 740px;
  overflow: hidden;
}

#screen-start[data-island="poel"] .start-intro > :not(.poel-start-visual) {
  position: relative;
  z-index: 3;
}

#screen-start[data-island="poel"] .facts {
  max-width: 620px;
}

.poel-start-visual {
  position: absolute;
  z-index: 1;
  inset: 0;
  overflow: hidden;
  pointer-events: none;
}

/* ACHTUNG: Hoehe und Breite werden weiter unten von der gemeinsamen
   Produktbuehne ueberschrieben (`width: min(...)`, `height: auto`). Wer
   hier an der Groesse dreht, aendert nichts — das kostet sonst eine
   Viertelstunde Suche. */
.poel-start-haendler {
  position: absolute;
  bottom: 1.5%;
  left: 50%;
  display: block;
  width: auto;
  max-width: 98%;
  height: min(40%, 430px);
  filter: drop-shadow(0 20px 24px rgba(0, 9, 30, .38));
  transform: translateX(-50%);
  user-select: none;
}

@media (min-width: 1400px) {
  .vejro-start-stage { width: 92%; }
}

/* ---------------------------------------------- USEDOM: die Beratungsbühne
   Die anderen Inseln stellen ihr Motiv als Objekt auf eine Verlaufsfläche.
   USEDOM hat als einzige eine fertig fotografierte Szene: Verkäufer, Kundin
   und Verkaufsdisplay in einem Bild, im selben Navy wie die Fläche.

   Deshalb ist das Bild hier nicht Objekt, sondern Bühne — formatfüllend
   hinter allem. Als 380 px hohes Objekt am unteren Rand war die Szene zu
   klein, um die Beratungssituation zu zeigen, und ließ darüber eine leere
   Fläche stehen, die nichts erzählte.

   Der Preis dafür ist, dass Text auf Bild liegt statt auf Farbe. Das trägt
   der Verlauf unten; er ist kräftiger als der gemeinsame Scrim, weil links
   im Bild der Verkäufer steht und nicht nur dunkler Hintergrund. */

#screen-start[data-island="usedom"] .start-layout {
  /* Schmalere rechte Spalte als im gemeinsamen System (dort bis 430 px):
     Ohne die Fakten trägt sie nur noch Teilnehmer und zwei Knöpfe. Der
     gewonnene Platz geht an die Szene, und das Verhältnis landet bei den
     rund 76 / 24, die die Bühne als Hauptdarsteller lesbar machen. */
  grid-template-columns: minmax(0, 1fr) clamp(300px, 23vw, 366px);
  min-height: clamp(560px, 74vh, 760px);
}

#screen-start[data-island="usedom"] .start-intro {
  position: relative;
  isolation: isolate;
  min-height: clamp(560px, 74vh, 760px);
  padding: clamp(30px, 3.4vw, 52px);
  overflow: hidden;
}

#screen-start[data-island="usedom"] .start-intro > :not(.usedom-start-visual) {
  position: relative;
  z-index: 3;
}

/* Der gemeinsame Scrim reicht über einer Fotoszene nicht: er ist auf eine
   Verlaufsfläche mit freigestelltem Objekt gerechnet.

   Die Werte hier sind gemessen, nicht geschätzt. Unter der Überschrift liegt
   bei etwa 31 % der Breite die weisse Displayfläche der Szene — die hellste
   Stelle des ganzen Bildes. Mit dem gemeinsamen Scrim kam weisser Text dort
   auf 3,05:1 und lag damit unter der WCAG-AA-Schwelle von 4,5:1; ein
   Stichprobenraster von vier Punkten je Zeile hatte die Stelle noch
   übersprungen.

   Dieser Verlauf deckt bis 34 % nahezu voll und läuft erst danach aus. Damit
   steht der Text an seiner schlechtesten Stelle bei 6,5:1, und die Szene
   bleibt rechts der Textspalte unangetastet — dort, wo Display und Kundin
   stehen. Wer die Deckung zurücknimmt, muss neu messen: eine Sichtprüfung
   findet diese Stelle nicht. */
#screen-start[data-island="usedom"] .start-intro::before {
  /* content/position/inset stehen hier vollständig, weil USEDOM aus dem
     gemeinsamen Scrim ausgenommen ist (siehe dort).

     Seit die Szene eingepasst rechts sitzt, steht der Text vollständig auf
     der Bühnenfläche: gemessen 19:1, auch ganz ohne Abdunklung. Der Verlauf
     hat deshalb nur noch eine Aufgabe — die linke Bildkante weichzeichnen,
     damit sie nicht als Schnittkante im Navy steht. Er läuft vor dem
     THITRONIK-Verkäufer aus, der bei etwa 29 % der Bühnenbreite beginnt;
     eine kräftigere Deckung hatte ihn zuvor unsichtbar gemacht. */
  content: "";
  position: absolute;
  z-index: 2;
  inset: 0;
  background:
    linear-gradient(100deg,
      rgba(4, 16, 34, .62) 0%,
      rgba(4, 16, 34, .42) 20%,
      rgba(4, 16, 34, .10) 30%,
      transparent 38%),
    linear-gradient(180deg, rgba(4, 16, 34, .30) 0%, transparent 22%);
  pointer-events: none;
}

#screen-start[data-island="usedom"] .facts { max-width: 34ch; }

/* ------------------------------------------ LANGELAND: die Übergabe
   Eine einzige, fertige Szene — und eine, die ihre Textfläche mitbringt:
   Links liegt eine grosse, fast leere dunkle Zone, rechts stehen Übergabe
   und Fahrzeug. Sie gehört deshalb als Bühne über die ganze Fläche, nicht
   als Motiv darauf.

   Das Vorgängerbild war ein freigestelltes Händepaar auf Weiss, das mittig
   unten auf der Verlaufsfläche sass. */

#screen-start[data-island="langeland"] .start-layout {
  min-height: clamp(620px, 70vh, 780px);
}

#screen-start[data-island="langeland"] .start-intro {
  position: relative;
  isolation: isolate;
  min-height: clamp(620px, 70vh, 780px);
  padding: clamp(30px, 3.4vw, 52px);
  overflow: hidden;
}

#screen-start[data-island="langeland"] .start-intro > :not(.langeland-start-visual) {
  position: relative;
  z-index: 3;
}

.langeland-start-visual {
  position: absolute;
  z-index: 1;
  inset: 0;
  overflow: hidden;
  pointer-events: none;
}

/* Eigener Verlauf statt des gemeinsamen: Der ist rein seitlich gerechnet
   und deckt links 58 %. Auf dem Desktop passt das — dort liegt links im Bild
   ohnehin die dunkle Wand. Auf dem Telefon ist die Bühne aber nur 373 px
   breit; derselbe Verlauf legt sich dann über genau den Bildbereich, in dem
   Übergabe und Fahrzeug stehen, und die Szene verschwindet in der Fläche.

   Hier deckt er deshalb seitlich schwächer und dafür von oben, wo auf
   schmalen Bühnen der Text sitzt. */
#screen-start[data-island="langeland"] .start-intro::before {
  content: "";
  position: absolute;
  z-index: 2;
  inset: 0;
  background:
    linear-gradient(96deg,
      rgba(4, 16, 34, .72) 0%,
      rgba(4, 16, 34, .46) 26%,
      rgba(4, 16, 34, .10) 48%,
      transparent 62%),
    linear-gradient(180deg, rgba(4, 16, 34, .34) 0%, transparent 30%);
  pointer-events: none;
}

.langeland-szene-uebergabe {
  position: absolute;
  inset: 0;
  display: block;
  width: 100%;
  height: 100%;
  max-width: none;
  /* Der Ausschnitt sitzt rechts: Die Szene ist 16:9, die Bühne breiter — es
     wird also vertikal beschnitten. 62 % zeigt die Gesichter und die
     Schlüsselübergabe, ohne dass oben die leere Hallendecke Platz frisst. */
  object-fit: cover;
  object-position: 60% 62%;
  user-select: none;
}

/* ------------------------------------------- FEHMARN: der Support-Platz
   Drei Ebenen: Raum, Signalwelle, Arbeitsplatz. Die Bildaussage ist doppelt
   und soll in zwei Sekunden ankommen — ProFinder und Diagnose-Tablet stehen
   fuer die Fehlersuche, Headset und Signalwelle fuer den Support.

   Der Arbeitsplatz ist EIN Motiv und wird nicht auseinandergenommen:
   Mitarbeiterin, Geraet, Tablet und Zubehoer sind darin fotografisch
   aufeinander abgestimmt, Licht und Perspektive stimmen. In CSS neu
   gestapelt ginge genau diese Abstimmung verloren. */

#screen-start[data-island="fehmarn"] .start-layout {
  min-height: clamp(620px, 68vh, 760px);
}

#screen-start[data-island="fehmarn"] .start-intro {
  position: relative;
  isolation: isolate;
  min-height: clamp(620px, 68vh, 760px);
  padding: clamp(30px, 3.4vw, 52px);
  overflow: hidden;
}

#screen-start[data-island="fehmarn"] .start-intro > :not(.fehmarn-start-visual) {
  position: relative;
  z-index: 3;
}

#screen-start[data-island="fehmarn"] .facts { max-width: 34ch; }

.fehmarn-start-visual {
  position: absolute;
  z-index: 1;
  inset: 0;
  overflow: hidden;
  pointer-events: none;
}

.fehmarn-szene-raum,
.fehmarn-szene-welle,
.fehmarn-szene-arbeitsplatz {
  position: absolute;
  display: block;
  max-width: none;
  user-select: none;
}

/* Raum: die Buehne. Der Ausschnitt sitzt rechts, damit die vertikale
   Lichtlinie des Motivs im rechten Buehnenbereich stehen bleibt — sie ist
   der einzige harte Lichtakzent und gibt der Flaeche Tiefe. */
.fehmarn-szene-raum {
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: 72% 58%;
}

/* Signalwelle: liegt hinter dem Arbeitsplatz und vor dem Raum. Sie ist
   Dekor und darf nie mit Mitarbeiterin, Geraet oder Ueberschrift um
   Aufmerksamkeit konkurrieren — daher die gedaempfte Deckkraft. */
.fehmarn-szene-welle {
  z-index: 2;
  top: 15%;
  left: 36%;
  width: 24%;
  height: auto;
  opacity: .62;
}

/* Arbeitsplatz: am unteren Rand verankert, nicht schwebend. Die Breite ist
   so gewaehlt, dass die linke Kante der Tischplatte hinter dem Textblock
   endet und Tablet wie ProFinder vollstaendig im Bild bleiben. */
.fehmarn-szene-arbeitsplatz {
  z-index: 3;
  right: 1%;
  bottom: 0;
  width: 60%;
  height: auto;
  filter: drop-shadow(0 18px 34px rgba(0, 9, 30, .38));
}


/* ------------------------------------------------ Gemeinsame Produktbühne
   VEJRØ liefert die visuelle Referenz: große Themenbühne links, kompaktes
   Startpanel rechts. Die Inhalte und Motive bleiben inselspezifisch, ihre
   Hierarchie und Bedienung folgen jedoch demselben System. */

#screen-start:where([data-island]) .start-layout {
  grid-template-columns: minmax(0, 1fr) clamp(340px, 26vw, 430px);
  min-height: clamp(620px, 72vh, 790px);
}

#screen-start:where([data-island]) .start-intro {
  position: relative;
  isolation: isolate;
  min-height: 620px;
  padding: clamp(30px, 3.5vw, 48px);
  overflow: hidden;
}

/* USEDOM ist hier ausgenommen und bringt seinen eigenen Verlauf mit: Als
   einzige Insel liegt dort eine Fotoszene unter dem Text, kein
   freigestelltes Motiv auf Farbflaeche. Der Ausschluss steht im Selektor
   statt in einer spaeteren Ueberschreibung, weil dieser hier durch das
   :not() eine hoehere Spezifitaet hat: eine Insel-Regel mit
   [data-island="usedom"] wuerde ihn sonst NICHT schlagen und stillschweigend
   wirkungslos bleiben. Genau das war beim Umbau zunaechst passiert. */
#screen-start[data-island]:not([data-island="vejro"]):not([data-island="usedom"]):not([data-island="langeland"]) .start-intro::before {
  content: "";
  position: absolute;
  z-index: 2;
  inset: 0;
  background:
    linear-gradient(90deg, rgba(4, 17, 36, .58) 0%, rgba(4, 17, 36, .2) 48%, transparent 76%),
    linear-gradient(180deg, transparent 46%, rgba(4, 17, 36, .08) 62%, rgba(4, 17, 36, .58) 100%);
  pointer-events: none;
}

#screen-start[data-island] .start-intro > .kicker,
#screen-start[data-island] .start-intro > h1,
#screen-start[data-island] .start-intro > .lead,
#screen-start[data-island] .start-intro > .facts,
#screen-start[data-island] .start-intro > .start-details {
  position: relative;
  z-index: 3;
}

#screen-start[data-island] .start-intro .kicker,
#screen-start[data-island] .start-details { display: none; }

#screen-start[data-island] .start-intro h1 {
  max-width: 16ch;
  font-size: clamp(2.2rem, 3.3vw, 3.45rem);
  line-height: 1.03;
  letter-spacing: -.045em;
  text-wrap: balance;
  white-space: normal;
}

#screen-start[data-island] .start-intro .lead {
  max-width: 42ch;
  font-size: clamp(.94rem, 1.1vw, 1.06rem);
  line-height: 1.52;
  text-wrap: pretty;
}

#screen-start[data-island] .start-form {
  gap: 14px;
  padding: clamp(24px, 2.6vw, 38px);
  background: rgba(255, 255, 255, .985);
}

#screen-start[data-island] .start-actions {
  flex-direction: column;
  align-items: stretch;
}

#screen-start[data-island] .start-actions .btn { width: 100%; }

#screen-start[data-island] .participant-summary {
  grid-template-columns: 1fr;
}

#screen-start[data-island] .participant-summary .btn {
  grid-column: 1;
  grid-row: 4;
  justify-self: start;
}

#screen-start[data-island] .start-form.is-panel {
  display: flex;
  flex-direction: column;
  align-content: initial;
  padding-top: clamp(24px, 2.8vw, 38px);
}

#screen-start[data-island] .start-form.is-panel .participant-summary {
  gap: 4px;
  padding: 18px;
  border: 1px solid rgba(59, 169, 211, .3);
  border-radius: var(--radius-lg);
  background:
    radial-gradient(circle at 100% 0, rgba(175, 202, 5, .13), transparent 48%),
    linear-gradient(145deg, #F4F9FC, var(--th-white));
  box-shadow: 0 12px 28px rgba(10, 39, 71, .08);
}

#screen-start[data-island] .start-form.is-panel .participant-summary .form-title {
  margin-bottom: 4px;
  font-size: var(--text-lg);
}

#screen-start[data-island] .start-form.is-panel .participant-summary .btn {
  min-height: var(--tap);
  margin-top: 7px;
  font-size: var(--text-sm);
}

#screen-start[data-island] .start-form.has-participant-facts .facts {
  gap: 13px;
  margin: 18px 0 24px;
  padding: 18px 16px;
  border: 1px solid rgba(29, 54, 97, .12);
  border-radius: var(--radius-lg);
  background: #F6F9FC;
  box-shadow: inset 0 1px 0 var(--th-white);
}

#screen-start[data-island] .start-form.has-participant-facts .facts li {
  grid-template-columns: 54px minmax(0, 1fr);
  gap: 11px;
  min-height: 54px;
  align-items: center;
  color: var(--th-navy);
  font-size: var(--text-sm);
  font-weight: 750;
  line-height: 1.35;
}

#screen-start[data-island] .start-form.has-participant-facts .facts li::before {
  width: 54px;
  height: 54px;
  border-radius: 0;
  background-color: transparent;
  background-position: center;
  background-repeat: no-repeat;
  background-size: contain;
  box-shadow: none;
  filter: drop-shadow(0 5px 7px rgba(0, 13, 38, .18));
}

#screen-start[data-island] .start-form.is-panel {
  display: flex;
  flex-direction: column;
  align-content: initial;
  padding-top: clamp(24px, 2.8vw, 38px);
}

#screen-start[data-island] .start-form.is-panel .participant-summary {
  gap: 4px;
  padding: 18px;
  border: 1px solid rgba(59, 169, 211, .3);
  border-radius: var(--radius-lg);
  background:
    radial-gradient(circle at 100% 0, rgba(175, 202, 5, .13), transparent 48%),
    linear-gradient(145deg, #F4F9FC, var(--th-white));
  box-shadow: 0 12px 28px rgba(10, 39, 71, .08);
}

#screen-start[data-island] .start-form.is-panel .participant-summary .form-title {
  margin-bottom: 4px;
  font-size: var(--text-lg);
}

#screen-start[data-island] .start-form.is-panel .participant-summary .btn {
  min-height: var(--tap);
  margin-top: 7px;
  font-size: var(--text-sm);
}

/* --- USEDOM: die rechte Spalte ----------------------------------------
   Sie hat nach dem Umzug der Fakten in die Bühne nur noch zwei Aufgaben:
   sagen, wer angemeldet ist, und den Weg ins Quiz öffnen. Deshalb keine
   Teilnehmerkarte mit eigenem Rahmen, Verlauf und Schatten wie auf den
   übrigen Inseln — in einer Spalte mit zwei Elementen ist ein Kasten um
   eines davon keine Gliederung, sondern nur eine zweite Kante neben der
   Spaltenkante. Eine Haarlinie trennt hier genauso zuverlässig.

   Zum `.screen` im Selektor: #screen-start trägt diese Klasse ohnehin,
   die Auswahl ändert sich dadurch nicht. Es geht allein um das Gewicht.
   Die gemeinsamen Panel-Regeln weiter unten haben dieselbe Spezifität
   wie diese hier; ohne den Zusatz entschiede die Reihenfolge in der
   Datei, welche gewinnt, und die verschiebt sich beim nächsten
   Einfügen still. Mit dem Zusatz ist die Position gleichgültig. */

#screen-start.screen[data-island="usedom"] .start-form {
  padding: clamp(28px, 2.4vw, 40px);
  background: var(--th-white);
}

#screen-start.screen[data-island="usedom"] .start-form.is-panel .participant-summary {
  gap: 3px;
  padding: 0 0 22px;
  border: 0;
  border-bottom: 1px solid var(--th-line);
  border-radius: 0;
  background: none;
  box-shadow: none;
}

#screen-start.screen[data-island="usedom"] .start-form.is-panel .participant-summary .form-title {
  margin-bottom: 6px;
  color: var(--th-muted);
  font-size: var(--text-label);
  font-weight: 800;
  letter-spacing: .09em;
  text-transform: uppercase;
}

#screen-start.screen[data-island="usedom"] .participant-name {
  font-size: var(--text-md);
  line-height: 1.25;
}

#screen-start.screen[data-island="usedom"] .start-form.is-panel .participant-summary .btn {
  margin-top: 10px;
  padding-left: 0;
  font-size: var(--text-sm);
}

/* Die Knopfgruppe sitzt unten in der Spalte (margin-top:auto aus dem
   gemeinsamen Block). Der Deckel begrenzt, wie weit sie absinkt: ohne ihn
   standen zwischen Teilnehmerzeile und Knopf über 300 px Leere, weil die
   Spalte so hoch ist wie die Bühne. Die Gruppe bleibt damit im Blickfeld,
   ohne oben festzukleben. */
/* Die Fakten stehen in derselben Spalte wie die Teilnehmerzeile — und die
   ist hier flach. Eine Karte nur um die Fakten ergäbe zwei verschiedene
   Gestaltungen für zwei gleichrangige Blöcke. Also auch hier nur Fläche,
   getrennt durch dieselbe Haarlinie. */
#screen-start.screen[data-island="usedom"] .start-form.has-participant-facts .facts {
  margin: 20px 0 0;
  padding: 0;
  border: 0;
  border-radius: 0;
  background: none;
  box-shadow: none;
}

#screen-start.screen[data-island="usedom"] .start-form.is-panel .start-actions {
  gap: 12px;
  /* Ganz an den unteren Rand (margin-top:auto aus dem gemeinsamen Block).
     Seit die Fakten wieder in dieser Spalte stehen, ist darüber kein
     Leerraum mehr, den ein gedeckelter Abstand ausgleichen müsste. */
  padding-top: 0;
}

/* Höhen in var(--tap), nicht in festen Pixeln: die Seite läuft auf
   zoom: .8 (siehe :root), feste 54 px wären real 43 px und damit unter der
   44-px-Trefferfläche, die auf dem Tablet am Fahrzeug gebraucht wird. */
#screen-start.screen[data-island="usedom"] #btn-start {
  min-height: calc(var(--tap) + 12px);
  font-size: var(--text-base);
}

#screen-start.screen[data-island="usedom"] #btn-start:hover:not(:disabled) {
  transform: translateY(-1px);
  box-shadow: 0 8px 24px rgba(29, 54, 97, .26);
}

#screen-start.screen[data-island="usedom"] #btn-to-islands {
  min-height: calc(var(--tap) + 4px);
  border-color: var(--th-navy);
  color: var(--th-navy);
}


.usedom-start-visual {
  position: absolute;
  z-index: 1;
  inset: 0;
  overflow: hidden;
  pointer-events: none;
}

/* --- Die Ebenen der Szene, von hinten nach vorn -----------------------
   Reihenfolge: Raum, Licht, Podest, Display, Verkäufer, Kundin.

   Alle Motive sind beim Aufbereiten auf ihren sichtbaren Inhalt zugeschnitten
   (tools/usedom-szene-bauen.js). Deshalb beschreibt jede Prozentangabe hier
   wirklich die Person oder das Gerät und nicht den transparenten Rand um sie
   herum — ohne den Zuschnitt verschiebt `left: 30%` das leere Kästchen.

   Die Personen werden über die HÖHE bemessen, das Display über die BREITE.
   Das entspricht dem, was die Szene zusammenhält: Menschen vergleicht man in
   ihrer Größe zueinander, ein Aufsteller misst sich an der Bühnenbreite. */

.usedom-szene-raum,
.usedom-szene-podest,
.usedom-szene-display,
.usedom-szene-verkaeufer,
.usedom-szene-kundin {
  position: absolute;
  display: block;
  max-width: none;
  user-select: none;
}

/* Raum: liefert Wand, Boden und die Spiegelung.

   Breiter als die Bühne und nach links verschoben, und das ist keine
   Geschmacksfrage: Das Motiv trägt links und rechts je einen vertikalen
   Neonstab. Formatfüllend eingesetzt landet der linke bei 6 % der Breite —
   genau unter dem Beschreibungstext. Gemessen kam weisser Text dort auf
   2,9:1 und lag damit unter der WCAG-AA-Schwelle.

   Beide Stäbe aus dem Bild zu schieben kostet nichts (die Wand dahinter ist
   gleichmässig) und hebt den Text auf 16,8:1 — ohne ihn abzudunkeln. Den
   Lichtakzent rechts übernimmt der Stab aus CSS. */
.usedom-szene-raum {
  top: 0;
  left: -16%;
  width: 132%;
  height: 100%;
  object-fit: cover;
  object-position: center 62%;
  opacity: .92;
}

/* Lichtschein hinter dem Display — als Verlauf, nicht als Bild: Als WebP
   kostete derselbe Kreis 152 KB, hier kostet er nichts und skaliert
   verlustfrei mit. Dazu rechts der vertikale Lichtstab aus demselben Grund. */
.usedom-start-visual::before {
  content: "";
  position: absolute;
  z-index: 1;
  top: 4%;
  left: 50%;
  width: 34%;
  height: 58%;
  background: radial-gradient(ellipse at center,
    rgba(88, 184, 255, .30) 0%,
    rgba(45, 140, 255, .16) 38%,
    rgba(13, 110, 253, .05) 62%,
    transparent 76%);
  pointer-events: none;
}

.usedom-start-visual::after {
  content: "";
  position: absolute;
  z-index: 1;
  top: 12%;
  right: 3%;
  width: 4px;
  height: 46%;
  border-radius: 4px;
  background: linear-gradient(180deg,
    rgba(120, 200, 255, 0) 0%,
    rgba(150, 214, 255, .92) 14%,
    rgba(150, 214, 255, .92) 86%,
    rgba(120, 200, 255, 0) 100%);
  box-shadow: 0 0 22px 5px rgba(45, 140, 255, .5);
  pointer-events: none;
}

/* Podest: liegt unter Display und Personen und gibt ihnen einen Stand.
   Ohne es schweben die freigestellten Motive über dem Boden. */
.usedom-szene-podest {
  z-index: 2;
  bottom: 19%;
  left: 44%;
  width: 48%;
  height: auto;
  opacity: .8;
}

.usedom-szene-display {
  z-index: 3;
  bottom: 29%;
  left: 50%;
  width: 35%;
  height: auto;
  filter: drop-shadow(0 18px 26px rgba(0, 9, 30, .45));
}

/* Verkäufer: links vor dem Display, zum Gerät hin orientiert.
   Er beginnt bei 36 % — gemessen endet die Überschrift bei 35 %, er stösst
   also an sie an, statt sie zu überlagern. Seine rechte Schulter ragt vor
   die linke Displaykante; genau diese Überschneidung macht aus zwei
   nebeneinander gesetzten Motiven eine Szene mit Tiefe. */
.usedom-szene-verkaeufer {
  z-index: 4;
  bottom: 4%;
  left: 41%;
  width: auto;
  height: 76%;
  filter: drop-shadow(-6px 14px 20px rgba(0, 9, 30, .45));
}

/* Kundin: rechts, dem Display zugewandt. Etwas kleiner als der Verkäufer,
   weil sie im Bildraum weiter hinten steht. Sie steht VOR der rechten
   Displaykante, nicht daneben — sonst stehen drei Motive in einer Reihe
   statt einer Beratungssituation. */
.usedom-szene-kundin {
  z-index: 5;
  right: 6%;
  bottom: 4%;
  width: auto;
  height: 72%;
  filter: drop-shadow(-10px 14px 20px rgba(0, 9, 30, .4));
}




#screen-start[data-island] .start-form.is-panel .start-actions {
  margin-top: auto;
}

/* „Quiz starten" steht auf jeder Insel und jeder Breite zuerst, die
   Campus-Karte darunter: Wer hier ankommt, will das Quiz starten, die Karte
   ist der Rückweg. Bis 1.56 galt das nur auf USEDOM und am Telefon, die
   übrigen Inseln zeigten am Tablet und Desktop die Karte zuerst. Die
   Reihenfolge kommt jetzt aus dem Markup, ohne order.

   Die Farbe kommt seit 1.59 aus .btn-primary (Navy). Vorher stand hier ein
   Neon-Lime (#B8F500), nicht einmal das Marken-Lime #AFCA05: Ein
   Hauptknopf hatte damit auf Profil, Karte und Inselstart drei Farben. */




/* Motiv-Overrides: gleicher Bühnenmaßstab, aber eine zur Bildaussage passende
   Position. Kein Motiv wird gestreckt oder beschnitten. */
.samsoe-start-vehicle { left: 6%; bottom: 2%; width: min(48%, 790px); }
.samsoe-start-technician { right: 4%; bottom: 0; width: min(36%, 620px); }
/* Wie bei POEL: 56 % liessen das Motiv mit 483x322 in einer 863x649-Buehne
   stehen — 28 % der Flaeche, der Rest leeres Dunkelblau. Auf dem iPad las
   sich das als vergessene Seite. */
.hiddensee-start-contact { bottom: 1%; left: 57%; width: min(72%, 1000px); }
/* 72 % liessen das Motiv auf dem iPad quer mit 621x349 aus einem
   1200x675-Bild stehen — gut die halbe native Groesse, ringsum leeres
   Dunkelblau. Es liegt hinter dem Text (z-index 1 gegen 3) und darf
   deshalb hoeher steigen, ohne ihn zu verdecken. */
.poel-start-haendler {
  right: 4%;
  bottom: -2%;
  left: auto;
  width: min(80%, 1120px);
  max-width: none;
  height: auto;
  transform: none;
}
/* USEDOM steht hier bewusst nicht: Seine Bühne besteht aus mehreren Ebenen
   mit eigenen Positionen (siehe oben), nicht aus einem Motiv auf einer
   Fläche. */
/* LANGELAND steht hier nicht mehr: Die Szene ist formatfüllende Bühne
   (siehe oben), kein Motiv, das auf der Fläche platziert wird. */
/* FEHMARN steht hier nicht mehr: Seine Bühne besteht aus drei Ebenen mit
   eigenen Positionen (siehe oben), nicht aus einem Motiv auf einer Fläche. */

.facts { display: grid; gap: 10px; margin: 22px 0 0; padding: 0; list-style: none; }
.facts li {
  display: grid;
  grid-template-columns: 24px 1fr;
  gap: 10px;
  align-items: start;
  color: rgba(255, 255, 255, .94);
  font-size: var(--text-sm);
}
.facts li::before {
  content: "";
  width: 22px;
  height: 22px;
  border-radius: 50%;
  background: var(--th-lime);
  background-image: linear-gradient(transparent, transparent);
  box-shadow: inset 0 0 0 6px var(--th-lime), inset 0 0 0 7px rgba(17, 17, 17, .3);
}

/* Der Block liegt auf der Insel-Illustration, und die ist je Insel anders
   hell. Deshalb tragen Knopf und Text eine eigene dunkle Flaeche: Sonst
   haengt die Lesbarkeit am Motiv statt an der Gestaltung. */
.start-details { margin-top: 14px; }
.start-details summary {
  display: inline-flex;
  align-items: center;
  min-height: var(--tap);
  padding: 0 16px;
  border: 1px solid rgba(255, 255, 255, .3);
  border-radius: 999px;
  background: rgba(7, 29, 70, .74);
  color: var(--th-white);
  font-size: var(--text-sm);
  font-weight: 700;
  cursor: pointer;
}
.start-details summary:focus-visible { outline: 2px solid var(--th-blue); outline-offset: 3px; }
.start-types {
  max-width: 46ch;
  margin: 8px 0 0;
  padding: 11px 15px;
  border-radius: var(--radius-lg);
  background: rgba(7, 29, 70, .74);
  color: var(--th-white);
  font-size: var(--text-sm);
  line-height: 1.5;
}

.start-form {
  display: grid;
  align-content: center;
  gap: 14px;
  padding: clamp(24px, 4vw, 46px);
}

/* Beide Bloecke setzen display, deshalb muss [hidden] es zuruecknehmen —
   sonst bliebe der zusammengefaltete Teil sichtbar. */

.participant-summary {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  gap: 2px 12px;
  align-items: center;
}
.participant-summary[hidden] { display: none; }
.participant-summary .form-title { grid-column: 1; grid-row: 1; }
.participant-name { grid-column: 1 / -1; grid-row: 2; margin: 0; color: var(--th-navy); font-size: var(--text-base); font-weight: 800; }
.participant-meta { grid-column: 1 / -1; grid-row: 3; margin: 0 0 2px; color: var(--th-muted); font-size: var(--text-sm); line-height: 1.45; }
.participant-summary .btn {
  grid-column: 2;
  grid-row: 1;
  justify-self: end;
  padding-right: 0;
  padding-left: 0;
}
.form-title { margin-bottom: 2px; }
.start-actions { display: flex; flex-wrap: wrap; gap: 10px; margin-top: 6px; }

/* -------------------------------------------------------------- Buttons --- */

.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 8px;
  min-height: var(--tap);
  padding: 12px 20px;
  border: 1px solid transparent;
  border-radius: var(--radius-md);
  font-weight: 800;
  text-decoration: none;
  transition:
    transform var(--duration-press) var(--ease-out),
    box-shadow var(--duration-fast) ease,
    background-color var(--duration-fast) ease,
    border-color var(--duration-fast) ease;
}
/* Am Fahrzeug wird getippt, nicht gehovert — ohne :active gäbe es auf dem
   Telefon überhaupt keine Rückmeldung, dass der Knopf getroffen wurde. */
.btn:active:not(:disabled) { transform: scale(.97); box-shadow: none; }
.btn:disabled { cursor: not-allowed; opacity: .45; transform: none; }

.btn-primary { background: var(--th-navy); color: var(--th-white); box-shadow: 0 10px 22px rgba(29, 54, 97, .22); }
.btn-primary:disabled {
  border-color: #CCD5DF;
  background: #E4EAF0;
  color: #4A5564;
  box-shadow: none;
  opacity: 1;
}

.btn-secondary { border-color: var(--th-line-strong); background: var(--th-white); color: var(--th-navy); }
/* Der Weg zur Arbeitskarte ist ein Nebenweg: kräftiger Navy-Umriss mit
   Lime als Marker am Rand. Bis 1.58 war er Neon-Lime, weil er neben dem
   navyfarbenen Start unterging — damit standen auf LANGELAND aber zwei
   gleich laute Hauptknöpfe nebeneinander. Der 2-px-Umriss trennt ihn vom
   schmalen Tertiärlink „Zur Campus-Karte", der Marker vom Hauptknopf. */
.btn-praxis {
  border: 2px solid var(--th-navy);
  background: var(--th-white);
  color: var(--th-navy);
  box-shadow: inset 6px 0 0 var(--th-lime);
}

.btn-danger {
  border-color: var(--th-red);
  background: var(--th-red);
  color: var(--th-white);
  box-shadow: 0 10px 22px rgba(206, 19, 45, .18);
}

.btn-tertiary { background: transparent; color: var(--th-navy); text-decoration: underline; text-underline-offset: 3px; }

/* Abbrechen. Der Knopf trug seine Bedeutung bisher nur im :hover — rote
   Schrift, roter Rand. Genau die Rückmeldung erreicht das Telefon in der
   Werkstatt nie: dort wird getippt, nicht gehovert. Im Ruhezustand blieb
   damit ein Rahmen in --th-line (#DDE2E7), der auf Weiß auf 1,2:1 kommt und
   praktisch unsichtbar ist.

   Deshalb steht die Bedeutung jetzt im Ruhezustand: rote Schrift, roter Rand,
   dazu ein × als Piktogramm. Bewusst nur umrandet und klein — der Knopf soll
   auffindbar sein, aber nicht mit "Antwort prüfen" um Aufmerksamkeit
   konkurrieren. Er verwirft schließlich alle bisherigen Antworten. */
.btn-ghost {
  border-color: var(--th-red);
  background: var(--th-white);
  color: var(--th-red);
}
/* Das × steht als aria-hidden im Markup, nicht als ::before. Erzeugte Inhalte
   liest ein Screenreader je nach Programm mit — daraus würde "Multiplikations-
   zeichen Abbrechen". */
.btn-ghost .btn-zeichen { margin-right: -2px; font-size: 1.25em; line-height: 1; }
.btn-ghost:focus-visible { outline-color: var(--th-red); }

/* Auch die Nebenbuttons bleiben auf 44 px. Das Design-System schreibt für den
   Campus-Kontext 44×44 vor — WCAG 2.5.8 verlangt weniger, aber die Bedienung
   findet am Fahrzeug statt, nicht am Schreibtisch. */
.btn-small { min-height: var(--tap); padding: 9px 14px; font-size: var(--text-sm); }

/* ----------------------------------------------------------------- Quiz --- */

/* Die Fragenansicht besteht aus zwei Teilen: der weißen Arbeitskarte mit
   Frage, Antworten und Auflösung, und ab Desktopbreite einer Seitenleiste mit
   Fragenübersicht, THI und Inselkarte. Der Schirm selbst wird dafür
   durchsichtig — die Karten stehen einzeln auf dem Seitengrund, wie die
   Kacheln der Expeditionskarte. Unterhalb der Desktopbreite bleibt nur die
   Arbeitskarte; die Übersicht schrumpft auf eine Punktreihe im Kopf. */
.screen.screen-quiz {
  overflow: visible;
  border: 0;
  background: transparent;
  box-shadow: none;
}
.quiz-card {
  min-width: 0;
  overflow: hidden;
  overflow: clip;
  border: 1px solid var(--th-line);
  border-radius: var(--radius-xl);
  background: var(--th-white);
  box-shadow: var(--shadow-md);
}

/* Beim Antworten braucht es die Kopfzeile der Seite nicht: Wortmarke,
   Werkzeuge und Teilnehmerchips kosten oben rund 80 px, die der Frage
   fehlen — auf dem Telefon eine halbe Antwortkachel. Was hier zählt, steht
   im Kopf der Karte: Insel, THI, Abbrechen. Die Werkzeugknöpfe bleiben im
   DOM; thiOeffnen() in engine.js klickt den THI-Schalter weiterhin. */
body.ist-quiz .masthead { display: none; }

/* Ab 1100 px: Arbeitskarte links, rechts die Seitenleiste mit THI und
   Inselkarte. 300 px reichen, seit die Fragenübersicht im Kopf der Karte
   steht und die Leiste keine fünf Knöpfe nebeneinander mehr tragen muss.
   Der THI-Knopf im Kartenkopf ist hier überflüssig — die Karte in der
   Leiste sagt dasselbe mit mehr Platz. */
@media (min-width: 1100px) {
  .screen.screen-quiz {
    display: grid;
    grid-template-columns: minmax(0, 1fr) 300px;
    gap: 20px;
    align-items: start;
  }
  .quiz-aside { position: sticky; top: 16px; }
  .quiz-thi-knopf { display: none; }
}

/* --- Kopf der Arbeitskarte --- */

.quiz-head { padding: 18px clamp(18px, 4vw, 36px) 0; }
.quiz-head-row {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  margin-bottom: 14px;
}
.quiz-head-actions { display: flex; flex: 0 0 auto; gap: 8px; }
.quiz-thi-knopf { color: var(--th-navy); }
.quiz-thi-knopf:focus-visible { outline-color: var(--th-navy); }
.quiz-thi-knopf .btn-symbol { width: 20px; height: 20px; flex: 0 0 auto; fill: none; stroke: currentColor; stroke-width: 1.7; stroke-linecap: round; stroke-linejoin: round; }
/* Unter 520 px Viewport teilen sich Brotkrume und zwei Knöpfe gut 600
   Layout-Pixel; der THI-Knopf wird dann zum Symbol, sein Name bleibt im
   aria-label. */
@media (max-width: 520px) {
  .quiz-thi-knopf .btn-label { display: none; }
  /* Als Symbolknopf mindestens --tap breit — gemessen waren es sonst 35
     echte Pixel, unter der Trefferfläche. */
  .quiz-thi-knopf { min-width: var(--tap); padding-right: 0; padding-left: 0; justify-content: center; }
}
.quiz-crumb {
  display: flex;
  align-items: center;
  gap: 9px;
  min-width: 0;
  margin: 0;
  font-size: var(--text-sm);
  font-weight: 700;
}
.quiz-crumb-symbol {
  display: grid;
  flex: 0 0 auto;
  place-items: center;
  width: 30px;
  height: 30px;
  border-radius: 50%;
  background: var(--info-bg);
  color: var(--th-navy);
}
.quiz-crumb-symbol svg { width: 18px; height: 18px; fill: none; stroke: currentColor; stroke-width: 1.7; stroke-linejoin: round; }
.quiz-crumb-code { flex: 0 0 auto; color: var(--th-blue-text); letter-spacing: .06em; }
.quiz-crumb-sep { color: var(--th-line-strong); }
.quiz-crumb-title {
  min-width: 0;
  overflow: hidden;
  color: var(--th-muted);
  font-weight: 600;
  text-overflow: ellipsis;
  white-space: nowrap;
}

/* Die Fragenübersicht: ein Kreis je Frage, in Reihe, auf allen Breiten
   dieselbe. Sie ist die einzige Fortschrittsanzeige der Fragenansicht —
   vorher standen Zähler, Balken, Punktreihe und Seitenleiste nebeneinander
   und sagten viermal dasselbe. Jeder Kreis ist ein Knopf (Rückblick auf
   beantwortete Fragen) und misst --tap, also 44 echte Pixel unter dem
   Seitenzoom. Zehn Kreise mit Lücken sind 622 Layout-Pixel; wo das nicht
   passt, bricht die Reihe in zwei Fünferreihen um — dieselbe Anordnung,
   die vorher in der Seitenleiste stand. Keine Legende: Farbe plus Zahl
   trägt, und der zugängliche Name jedes Knopfes nennt den Stand in Worten. */
.quiz-overview-row { margin: 0; }
.quiz-overview {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  margin: 0;
  padding: 0;
  list-style: none;
}
/* Auf dem Telefon zwei Fünferreihen statt sechs plus vier: Die Breite
   entscheidet sonst je Gerät, wo die Reihe bricht (gemessen 6 + 4 bei
   375 px), und zwei gleich lange Reihen lesen sich als eine Übersicht. */
@media (max-width: 640px) {
  .quiz-overview { max-width: calc(5 * var(--tap) + 4 * 8px); }
}
.quiz-overview li { flex: 0 0 auto; }
.quiz-overview button {
  display: grid;
  place-items: center;
  width: var(--tap);
  height: var(--tap);
  padding: 0;
  border: 2px solid var(--th-line);
  border-radius: 50%;
  background: var(--th-white);
  color: var(--th-navy);
  font-size: var(--text-base);
  font-weight: 800;
  transition: transform var(--duration-press) var(--ease-out), box-shadow var(--duration-fast) ease;
}
.quiz-overview button:disabled { color: var(--th-muted); cursor: default; }
.quiz-overview button:not(:disabled):hover { box-shadow: 0 0 0 3px rgba(59, 169, 211, .18); }
.quiz-overview button:not(:disabled):active { transform: scale(.94); }
.quiz-overview .is-correct button { border-color: var(--th-lime); background: var(--th-lime); color: var(--th-ink); }
.quiz-overview .is-wrong button { border-color: var(--th-red); background: var(--th-red); color: var(--th-white); }
/* Ein Zeichen am Rand, weil Lime und Rot allein den Stand nur über die
   Farbe sagen (WCAG 1.4.1). Der zugängliche Name nennt ihn ohnehin in
   Worten; das Zeichen ist für alle, die die Farben nicht unterscheiden. Es
   bleibt auch beim Rückblick stehen, wenn der Kreis Navy wird. */
.quiz-overview button { position: relative; }
.quiz-overview .is-correct button::after,
.quiz-overview .is-wrong button::after {
  position: absolute;
  top: -5px;
  right: -5px;
  display: grid;
  place-items: center;
  width: 20px;
  height: 20px;
  border-radius: 50%;
  background: var(--th-white);
  font-size: 13px;
  font-weight: 900;
  line-height: 1;
  box-shadow: 0 0 0 2px currentColor;
}
.quiz-overview .is-correct button::after { content: "✓"; color: var(--th-lime-text); }
.quiz-overview .is-wrong button::after { content: "×"; color: var(--th-red); }
.quiz-overview .is-current button {
  border-color: var(--th-navy);
  background: var(--th-navy);
  color: var(--th-white);
  box-shadow: 0 0 0 3px var(--th-white), 0 0 0 5px var(--th-navy);
}

/* --- Rumpf der Arbeitskarte --- */

.quiz-body {
  width: min(100%, 1440px);
  margin: 0 auto;
  padding: 20px clamp(18px, 4vw, 36px) clamp(22px, 4vw, 36px);
}

/* Medienfragen verwenden die Breite als Arbeitsfläche: Aufgabenstellung und
   Antworten bleiben in einer gut lesbaren Spalte, das Anschauungsobjekt steht
   daneben. Unter 1000 px fällt alles in die lineare Folge wie am Telefon.

   Bis 1.59 lag die Grenze bei 760 px. Am Tablet hochkant blieben dann für
   Frage und Antworten 305–326 px: der Titel lief über sechs Zeilen, die
   Knöpfe standen untereinander, und unter dem Bild blieb Fläche leer.
   Darüber bekommt der Text drei Fünftel statt weniger als die Hälfte. */
#screen-quiz[data-has-media="true"] .quiz-body {
  width: min(100%, 1680px);
}

.quiz-main {
  display: flex;
  flex-direction: column;
}

/* display: contents bewahrt auf schmalen Screens die fachlich richtige
   Reihenfolge Frage, Bild, Ton, Antworten, ohne die Desktop-Gruppierung in
   das Markup der einzelnen Fragetypen zu duplizieren. */
.question-work { display: contents; }
.quiz-main .q-meta { order: 1; }
.quiz-main .q-title { order: 2; }
.quiz-main .q-hint { order: 3; }
.quiz-main .q-media { order: 4; }
.quiz-main .q-audio { order: 5; }
.quiz-main #q-input { order: 6; }

@media (min-width: 1000px) {
  #screen-quiz[data-has-media="true"] .quiz-body {
    display: grid;
    grid-template-columns: minmax(0, 3fr) minmax(0, 2fr);
    column-gap: clamp(26px, 3vw, 52px);
    align-items: start;
  }

  #screen-quiz[data-has-media="true"] .quiz-main { display: contents; }

  #screen-quiz[data-has-media="true"] .question-work {
    display: block;
    grid-column: 1;
    grid-row: 1;
    min-width: 0;
  }

  #screen-quiz[data-has-media="true"] .q-title { max-width: 34ch; }
  #screen-quiz[data-has-media="true"] .q-media {
    grid-column: 2;
    grid-row: 1;
    min-width: 0;
    margin: 0;
  }

  #screen-quiz[data-has-media="true"] .q-media img,
  #screen-quiz[data-has-media="true"] .q-media img[data-layout="portrait"] {
    width: auto;
    max-width: 100%;
    height: auto;
    max-height: clamp(320px, calc(100dvh - 250px), 660px);
    margin: 0;
    object-fit: contain;
    background: linear-gradient(145deg, var(--th-white), #F4F7FA);
  }

  #screen-quiz[data-has-media="true"] .answers:not(.answers-bild) {
    grid-template-columns: 1fr;
  }

  #screen-quiz[data-has-media="true"] .answer {
    min-height: 68px;
  }

  #screen-quiz[data-has-media="true"] .feedback { grid-column: 1 / -1; }
  #screen-quiz[data-has-media="true"] .quiz-actions { grid-column: 1; }
  #screen-quiz[data-has-media="true"][data-revealed="true"] .quiz-actions { grid-column: 1 / -1; }
}

@media (min-width: 1500px) {
  #screen-quiz[data-has-media="true"] .answers:not(.answers-bild) {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
}

/* Stark herausgezoomte Browser und sehr breite Displays liefern einen
   virtuellen Viewport jenseits von 2200 px. Dort darf die Medienfrage die
   ganze reale Fensterbreite verwenden; Textfragen behalten ihre Lesekappe. */
@media (min-width: 2200px) {
  .shell { width: calc(100% - 64px); }
  #screen-quiz[data-has-media="true"] .quiz-body { width: 100%; }
}

.q-meta {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 8px;
  margin: 0 0 12px;
}
.q-category {
  display: inline-flex;
  min-height: 28px;
  align-items: center;
  margin: 0;
  padding: 3px 11px;
  border-radius: 999px;
  background: var(--info-bg);
  color: var(--th-navy);
  font-size: var(--text-label);
  font-weight: 800;
  letter-spacing: .09em;
  text-transform: uppercase;
  overflow-wrap: anywhere;
}
.q-mode {
  display: inline-flex;
  min-height: 28px;
  align-items: center;
  margin: 0;
  padding: 3px 11px;
  border: 1px solid var(--th-line);
  border-radius: 999px;
  background: var(--th-white);
  color: var(--th-muted);
  font-size: var(--text-sm);
  font-weight: 750;
}
.q-title {
  max-width: 68ch;
  margin-bottom: 16px;
  font-size: clamp(1.25rem, 1.05rem + .9vw, 1.9rem);
  overflow-wrap: anywhere;
}
.q-title:focus { outline: none; }
/* Überschrift, auf die show() nach einem Bildschirmwechsel den Fokus setzt:
   Sie ist Sprungziel, kein Bedienelement, und bekommt deshalb keinen Rahmen. */
.bildschirm-anfang:focus { outline: none; }
.q-hint { color: var(--th-muted); font-size: var(--text-sm); }

.q-media {
  display: grid;
  justify-items: center;
  margin: 0 0 18px;
}
.q-media img {
  width: auto;
  max-width: 100%;
  height: auto;
  max-height: min(42dvh, 360px);
  border: 1px solid var(--th-line);
  border-radius: var(--radius-lg);
  object-fit: contain;
  background: linear-gradient(145deg, var(--th-white), #F4F7FA);
  cursor: zoom-in;
}
.q-media figcaption { margin-top: 8px; color: var(--th-muted); font-size: var(--text-sm); }
.feedback-media img { cursor: zoom-in; }

.q-audio {
  margin: 0 0 18px;
  padding: 16px;
  border: 1px solid var(--th-line);
  border-left: 4px solid var(--th-blue);
  border-radius: var(--radius-lg);
  background: var(--info-bg);
}
.q-audio-row { display: flex; align-items: center; gap: 16px; }
.q-audio-button {
  min-width: 148px;
  min-height: var(--tap);
  border: 0;
  border-radius: var(--radius-md);
  padding: 0 18px;
  background: var(--th-navy);
  color: var(--th-white);
  font-weight: 800;
  cursor: pointer;
}
/* --th-navy-2 gibt es nicht — die Deklaration war damit "invalid at
   computed-value time" und fiel NICHT auf die Grundregel zurueck, sondern
   auf transparent. Weisse Schrift auf dem hellblauen Kasten darunter:
   1,09:1. Die Beschriftung verschwand genau dann, wenn die Maus darauf
   stand. `:not(:disabled)`, weil :hover sonst auch den Ladezustand vor
   `canplay` trifft. */
.q-audio-button:hover:not(:disabled) { background: var(--th-navy-deep); }
.q-audio-button:disabled { cursor: not-allowed; opacity: .48; }
.q-audio-progress-wrap { display: grid; flex: 1; gap: 5px; min-width: 0; }
.q-audio progress { width: 100%; height: 9px; accent-color: var(--th-blue); }
.q-audio output { color: var(--th-muted); font-size: var(--text-sm); font-variant-numeric: tabular-nums; }
.q-audio-status { min-height: 1.4em; margin: 8px 0 0; color: var(--th-muted); font-size: var(--text-sm); }
.q-audio-fallback { margin-top: 8px; }
.q-audio-fallback summary { min-height: var(--tap); display: flex; align-items: center; color: var(--th-navy); font-weight: 750; cursor: pointer; }
.q-audio-fallback p { margin: 0; color: var(--th-muted); }
.fact-audio::before {
  border-radius: 0 !important;
  background-color: transparent !important;
  background-image: url("/media/fehmarn/feh-icon-ton.webp?v=1.68.1") !important;
  background-position: center !important;
  background-repeat: no-repeat !important;
  background-size: contain !important;
  box-shadow: none !important;
  filter: drop-shadow(0 5px 7px rgba(0, 13, 38, .18));
}

@media (max-width: 560px) {
  .q-audio-row { align-items: stretch; flex-direction: column; }
  .q-audio-button { width: 100%; }
}

/* --- Antwortkacheln (single / multi / truefalse) --- */

/* Zwei Spalten sind die Regel. Ab sechs Antworten und genügend Breite drei —
   die Mehrfachauswahlen tragen kurze Begriffe („Netzteil", „Sirene"), bei
   denen zwei Spalten zu vier Zeilen Luft werden. Bildkacheln und
   Richtig/Falsch haben eigene Raster und bleiben unberührt. */
.answers { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px; }
.answers.answers-narrow { grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); }
@media (min-width: 1400px) {
  #screen-quiz:not([data-has-media="true"]) .answers:not(.answers-bild):not(.answers-narrow)[data-count="6"],
  #screen-quiz:not([data-has-media="true"]) .answers:not(.answers-bild):not(.answers-narrow)[data-count="7"],
  #screen-quiz:not([data-has-media="true"]) .answers:not(.answers-bild):not(.answers-narrow)[data-count="8"],
  #screen-quiz:not([data-has-media="true"]) .answers:not(.answers-bild):not(.answers-narrow)[data-count="9"] {
    grid-template-columns: repeat(3, minmax(0, 1fr));
  }
}

.answer {
  position: relative;
  display: grid;
  grid-template-columns: 44px 1fr;
  align-items: center;
  gap: 14px;
  min-height: 84px;
  padding: 16px 52px 16px 16px;
  border: 1.5px solid var(--th-line);
  overflow: hidden;
  border-radius: var(--radius-md);
  background: var(--th-white);
  color: var(--th-ink);
  text-align: left;
  box-shadow: 0 5px 16px rgba(10, 39, 71, .055);
  transition:
    border-color var(--duration-fast) ease,
    box-shadow var(--duration-fast) ease,
    background-color var(--duration-fast) ease,
    transform var(--duration-press) var(--ease-out);
}

/* Die Positionsklassen bleiben stabil, tragen vor der Auswertung aber keine
   Bedeutungsfarben. Lime und Rot sind im Campus bereits als richtig/falsch
   gelernt und würden die Wahl sonst ungewollt lenken. */
.answer.opt-1 { --opt: var(--answer-a); --opt-rgb: var(--answer-a-rgb); }
.answer.opt-2 { --opt: var(--answer-b); --opt-rgb: var(--answer-b-rgb); }
.answer.opt-3 { --opt: var(--answer-c); --opt-rgb: var(--answer-c-rgb); }
.answer.opt-4 { --opt: var(--answer-d); --opt-rgb: var(--answer-d-rgb); }
.answer.opt-5 { --opt: var(--answer-e); --opt-rgb: var(--answer-e-rgb); }
.answer.opt-6 { --opt: var(--answer-f); --opt-rgb: var(--answer-f-rgb); }
.answer.opt-7 { --opt: var(--answer-g); --opt-rgb: var(--answer-g-rgb); }
.answer.opt-8 { --opt: var(--answer-h); --opt-rgb: var(--answer-h-rgb); }

.answer::after {
  content: "";
  position: absolute;
  inset: 0 auto 0 0;
  width: 3px;
  background: var(--th-blue);
  opacity: .2;
  transition: width var(--duration-fast) var(--ease-out), opacity var(--duration-fast) ease;
}
.answer:active:not(:disabled) { transform: scale(.985); }
.answer:disabled { cursor: default; }

/* Auswahl ist ein eigener, markenneutraler Zustand: Navy-Rand, hellblaue
   Fläche und ein Häkchen am rechten Rand — nicht Grün, nicht Rot. Bis 1.67
   waren Rand, Häkchen und Balken Cyan: 2,5–2,7:1 gegen Weiß und gegen die
   Fläche, unter den 3:1, die dieses Stylesheet für den Fokusring selbst
   verlangt. Navy hält 12:1 und ist ebenso weder Grün noch Rot. Das
   Häkchen sitzt rechts, wo der Innenabstand dafür freigehalten ist, statt
   in der Ecke des Buchstabens, wo es bei langen Texten unterging. */
.answer::before {
  content: "✓";
  position: absolute;
  top: 50%;
  right: 14px;
  display: grid;
  place-items: center;
  width: 28px;
  height: 28px;
  border-radius: 50%;
  background: var(--th-navy);
  color: var(--th-white);
  font-size: .95rem;
  font-weight: 900;
  line-height: 1;
  opacity: 0;
  transform: translateY(-50%) scale(.6);
  transition: opacity var(--duration-fast) ease, transform var(--duration-fast) var(--ease-out);
}
.answer.is-selected {
  z-index: 1;
  border-color: var(--th-navy);
  background: var(--info-bg);
  box-shadow:
    0 0 0 2px rgba(29, 54, 97, .30),
    0 12px 26px rgba(10, 39, 71, .14);
}
.answer.is-selected::before { opacity: 1; transform: translateY(-50%) scale(1); }
.answer.is-selected::after { width: 5px; opacity: 1; background: var(--th-navy); }
.answer.is-correct,
.answer.is-wrong,
.answer.is-missed { padding-right: 16px; }
.answer.is-correct::before,
.answer.is-wrong::before,
.answer.is-missed::before { display: none; }
.answer.is-correct {
  border-color: var(--th-lime-line);
  background: var(--success-bg);
  box-shadow: 0 0 0 3px rgba(175, 202, 5, .2);
}
.answer.is-correct::after,
.answer.is-missed::after { background: var(--th-lime); opacity: 1; }
.answer.is-wrong {
  border-color: var(--th-red);
  background: var(--error-bg);
  box-shadow: 0 0 0 3px rgba(206, 19, 45, .14);
}
.answer.is-wrong::after { background: var(--th-red); opacity: 1; }
.answer.is-missed { border-color: var(--success-line); border-style: dashed; background: var(--success-bg); }

.answer-letter {
  position: relative;
  display: grid;
  place-items: center;
  width: 44px;
  height: 44px;
  border-radius: var(--radius-md);
  background: var(--th-navy-deep);
  color: var(--th-white);
  font-weight: 800;
  box-shadow: 0 5px 12px rgba(10, 39, 71, .2);
}
.answer.is-correct .answer-letter { background: var(--th-lime); color: var(--th-ink); }
.answer.is-wrong .answer-letter { background: var(--th-red); color: var(--th-white); }

.answer-text,
.order-text,
.match-label { overflow-wrap: anywhere; }
.answer-text { font-weight: 600; line-height: 1.4; }

.answer-verdict {
  grid-column: 2;
  display: block;
  margin-top: 2px;
  font-size: var(--text-label);
  font-weight: 800;
  line-height: 1.3;
}
.answer-verdict.is-correct,
.answer-verdict.is-missed { color: var(--th-lime-text); }
.answer-verdict.is-wrong { color: var(--th-red); }

/* --- Bildkacheln (Fehmarn-Muster: vier Fotos als Antwort) ---------------- */

.answers-bild { grid-template-columns: repeat(2, minmax(0, 1fr)); }
/* Vier Fotos nebeneinander, sobald die Breite reicht: Zweispaltig waren die
   Hochkant-Kacheln auf einem Arbeitsplatzmonitor 540 x 720 px groß — die
   unteren beiden lagen unter der Falz, und Vergleichen ist die Aufgabe. Für
   Details gibt es die Lupe. */
@media (min-width: 900px) {
  .answers-bild[data-count="3"] { grid-template-columns: repeat(3, minmax(0, 1fr)); }
  .answers-bild[data-count="4"] { grid-template-columns: repeat(4, minmax(0, 1fr)); }
}

/* Kachel und Lupe sind Geschwister, kein Button im Button — verschachtelte
   Buttons sind ungültiges HTML und für Screenreader nicht bedienbar. */
.answer-wrap { position: relative; display: block; }

.answer-bild {
  display: block;
  width: 100%;
  min-height: 0;
  padding: 0;
  border-width: 2px;
  border-color: var(--th-line-strong);
  overflow: hidden;
  box-shadow: 0 7px 18px rgba(10, 39, 71, .1);
}
/* Auf dem Foto sitzt das Häkchen oben rechts; die Lupe bleibt unten rechts.
   z-index, weil der `filter` auf dem gewählten Foto (siehe unten) das Bild in
   dieselbe Malschicht hebt wie das Häkchen — und dort malt es als späteres
   Element darüber. Bis Engine 1.54 war das Häkchen auf jeder gewählten
   Bildkachel verdeckt; gemeldet von der Insel USEDOM (Pro-finder „nicht
   ausgewählt“). */
.answer-bild::before { z-index: 1; top: 10px; right: 10px; transform: scale(.6); box-shadow: 0 2px 8px rgba(0, 0, 0, .3); }
.answer-bild.is-selected::before { transform: scale(1); }
.answer-media {
  width: 100%;
  aspect-ratio: 3 / 4;              /* portrait, der Normalfall in der Werkstatt */
  object-fit: cover;
  background: var(--th-soft);
  transition: filter var(--duration-fast) ease;
}
.answer-bild.is-selected .answer-media { filter: saturate(1.08) contrast(1.04); }
.answers-bild[data-layout="square"] .answer-media { aspect-ratio: 1 / 1; }
.answers-bild[data-layout="landscape"] .answer-media { aspect-ratio: 4 / 3; }

/* Produktvergleich mit vielen Optionen: echte Freisteller statt einer bunten
   Textliste. Die neutrale Navy-Fassung hält sieben Produkte visuell ruhig;
   Grün und Rot bleiben ausschließlich der Auswertung vorbehalten. */
.answers-bild[data-layout="product"] {
  grid-template-columns: repeat(4, minmax(0, 1fr));
}
.answers-bild[data-layout="product"] .answer-wrap { height: 100%; }
.answers-bild[data-layout="product"] .answer {
  --opt: var(--th-navy);
  --opt-rgb: 29, 54, 97;
}
.answers-bild[data-layout="product"] .answer-bild {
  display: flex;
  flex-direction: column;
  height: 100%;
}
.answers-bild[data-layout="product"] .answer-media {
  aspect-ratio: 1 / 1;
  padding: 20px;
  object-fit: contain;
  background: linear-gradient(145deg, var(--th-white) 0%, #EEF3F7 100%);
}
.answers-bild[data-layout="product"] .answer-bild-text {
  display: flex;
  align-items: center;
  justify-content: center;
  min-height: 48px;
  margin-top: auto;
  text-align: center;
}
/* Rechts Platz für die Lupe lassen, die in derselben Ecke liegt — sonst
   steht „Deine Auswahl: richtig" halb unter dem Knopf. */
.answer-bild .answer-verdict {
  grid-column: auto;
  margin: 0 calc(var(--tap) + 14px) 10px 10px;
  text-align: left;
}
.answers-bild[data-layout="product"] .answer-zoom {
  top: 10px;
  right: 10px;
  bottom: auto;
}
/* Bei Produktkacheln liegt die Lupe oben rechts — das Häkchen weicht nach
   oben links neben den Buchstaben aus. */
.answers-bild[data-layout="product"] .answer-bild::before { top: 10px; right: auto; left: 60px; }

/* Buchstabe und Lupe liegen auf dem Bild — beide mit eigener Fläche, damit
   sie auch auf einem hellen Foto lesbar bleiben. */
.answer-bild .answer-letter {
  position: absolute;
  top: 10px;
  left: 10px;
  box-shadow: 0 4px 14px rgba(0, 0, 0, .35);
}
/* z-index, weil die gewählte Kachel `z-index: 1` trägt (.answer.is-selected)
   und sich sonst über ihre eigene Lupe legt — gemessen bei 1024 und 1180 px:
   Auf der gewählten Karte fehlte der Knopf. */
.answer-zoom {
  position: absolute;
  z-index: 2;
  right: 10px;
  bottom: 10px;
  display: grid;
  place-items: center;
  width: var(--tap);
  height: var(--tap);
  border: 1px solid rgba(255, 255, 255, .5);
  border-radius: var(--radius-md);
  background: rgba(10, 39, 71, .82);
  color: var(--th-white);
  font-size: 1.1rem;
  line-height: 1;
}
.answer-bild-text {
  display: block;
  padding: 11px 13px;
  border-top: 1px solid var(--th-line);
  font-size: var(--text-sm);
  font-weight: 600;
  line-height: 1.35;
}

/* --- Bild an der Frage und am Feedback ---------------------------------- */

.q-media img[data-layout="portrait"] { max-height: 60vh; width: auto; margin: 0 auto; }

/* Auf dem Telefon steht das Bild zwischen Frage und Antworten. Mit 42dvh
   beziehungsweise 60vh (Hochformat) war es gemessen 296 px hoch, die erste
   Antwort begann bei 630 von 812 px und „Antwort prüfen" lag bei 1163 px.
   Das Bild ist hier Anschauung, die Antworten sind die Aufgabe — für
   Details gibt es das Antippen zum Vergrößern. dvh zählt unter dem
   Seitenzoom in Layout-Einheiten: 28dvh sind bei 812 px Fenster rund
   180 echte Pixel. */
@media (max-width: 759px) {
  .q-media img,
  .q-media img[data-layout="portrait"] { max-height: min(28dvh, 260px); }
}
/* Am Tablet hochkant steht das Bild seit 1.60 ebenfalls über den Antworten.
   Ohne eigene Grenze griffe dort 60vh für Hochformatbilder — bei 1024 px
   Fensterhöhe gut 600 echte Pixel. 36dvh, höchstens 380 Layoutpixel, sind
   bei 1024 wie bei 1180 px Höhe rund 300 echte Pixel. */
@media (min-width: 760px) and (max-width: 999px) {
  .q-media img,
  .q-media img[data-layout="portrait"] { max-height: min(36dvh, 380px); }
}

.feedback-media { margin: 14px 0 0; }
/* Gedeckelt auf 320 px: Das Erklärbild ist ein Hinweis („GPS inside" nach
   oben), kein Anschauungsobjekt — am Telefon füllte es sonst den Schirm. */
.feedback-media img { width: 100%; max-width: 320px; border: 1px solid var(--th-line); border-radius: var(--radius-lg); }
.feedback-media figcaption { margin-top: 6px; color: var(--th-muted); font-size: var(--text-sm); }

/* --- Großansicht -------------------------------------------------------- */

.lightbox {
  width: min(94vw, 900px);
  max-width: none;
  max-height: 92vh;
  max-height: 92dvh;
  padding: 16px;
  border: none;
  border-radius: var(--radius-lg);
  background: var(--th-white);
  box-shadow: var(--shadow-md);
}
.lightbox:not([open]),
.confirm-dialog:not([open]) { display: none; }
.lightbox::backdrop { background: rgba(10, 39, 71, .74); }
.lightbox-image {
  width: 100%;
  max-height: 72vh;
  max-height: 72dvh;
  object-fit: contain;
  border-radius: var(--radius-md);
  background: var(--th-soft);
}
.lightbox-caption { margin: 10px 0 0; color: var(--th-muted); font-size: var(--text-sm); }
.lightbox-close { width: 100%; margin-top: 12px; }

/* --------------------------------------------------------- Abbruchdialog --- */

.confirm-dialog {
  width: min(calc(100% - 32px), 440px);
  max-width: none;
  padding: 0;
  border: 0;
  border-radius: var(--radius-lg);
  background: var(--th-white);
  box-shadow: var(--shadow-md);
}
.confirm-dialog::backdrop { background: rgba(10, 39, 71, .68); }
.confirm-dialog-card { padding: clamp(22px, 5vw, 32px); }
.confirm-dialog-card h2 { margin-bottom: 8px; }
.confirm-dialog-card p { margin-bottom: 22px; color: var(--th-muted); line-height: 1.55; }
.confirm-dialog-actions { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }

/* --- Reihenfolge (order) --- */

.order-list { display: grid; gap: 10px; }
.order-item {
  display: grid;
  grid-template-columns: 44px 1fr;
  align-items: center;
  gap: 13px;
  width: 100%;
  min-height: var(--tap);
  padding: 13px 15px;
  border: 1px solid var(--th-line);
  border-radius: var(--radius-lg);
  background: var(--th-white);
  text-align: left;
  box-shadow: 0 6px 18px rgba(29, 54, 97, .06);
  transition: border-color .15s, background-color .15s, box-shadow .15s;
}
.order-item:disabled { cursor: default; }
.order-item.is-picked { border-color: var(--th-navy); background: var(--info-bg); }
.order-item.is-correct { border-color: var(--th-lime-line); background: var(--success-bg); }
.order-item.is-wrong { border-color: var(--th-red); background: var(--error-bg); }

.order-rank {
  display: grid;
  place-items: center;
  width: 44px;
  height: 44px;
  border-radius: var(--radius-md);
  background: var(--th-soft);
  color: var(--th-muted);
  font-weight: 800;
}
.order-item.is-picked .order-rank { background: var(--th-navy); color: var(--th-white); }
.order-item.is-correct .order-rank { background: var(--th-lime); color: var(--th-ink); }
.order-item.is-wrong .order-rank { background: var(--th-red); color: var(--th-white); }
.order-text { font-weight: 600; line-height: 1.4; }

.order-reset { margin-top: 12px; }

/* --- Zuordnung (match) --- */

.match-list { display: grid; gap: 12px; }
.match-row {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
  gap: 12px;
  align-items: center;
  padding: 13px 15px;
  border: 1px solid var(--th-line);
  border-radius: var(--radius-lg);
  background: var(--th-white);
  box-shadow: 0 6px 18px rgba(29, 54, 97, .06);
}
.match-row.is-correct { border-color: var(--th-lime-line); background: var(--success-bg); }
.match-row.is-wrong { border-color: var(--th-red); background: var(--error-bg); }
.match-label { font-weight: 700; line-height: 1.35; }
.match-row select { min-height: var(--tap); width: 100%; padding: 10px 12px; border: 1px solid var(--th-line-strong); border-radius: var(--radius-md); background: var(--th-white); }
/* Navy statt Lime-Text: die Zeile steht auf dem roten Fehlergrund, dort
   erreicht #6B7D00 nur 4,07:1 und bleibt unter den 4,5:1 für Fließtext. */
.match-solution { grid-column: 1 / -1; margin: 4px 0 0; color: var(--th-navy); font-size: var(--text-sm); font-weight: 700; }
.match-row .answer-verdict { grid-column: 1 / -1; margin: 2px 0 0; }

/* --- Auflösung --- */

/* Eine Kopfzeile mit Urteil, darunter „Kurz erklärt" und die Irrtümer
   nebeneinander, „Mitnehmen" als Zeile darunter. Ab 900 px stehen die
   ersten beiden in Spalten — die Auflösung bleibt ein Blick statt ein
   Scrollweg. Fehlt ein Feld im Fragensatz, nimmt der Rest die Breite.

   Bis 1.55 standen alle drei nebeneinander. Gemessen bei 1180 px ergab das
   28–34 Zeichen je Zeile; ein Irrtumstext mit 287 Zeichen wurde 9 Zeilen
   hoch, während die Lösungszeile darüber 104 Zeichen lief. Lesbar sind
   etwa 45–75 — daher zwei Spalten, eine volle Zeile und überall 65ch als
   Obergrenze. */
.feedback {
  margin-top: 20px;
  padding: 18px 20px 20px;
  border: 1px solid var(--th-line);
  border-radius: var(--radius-lg);
  background: var(--th-white);
  animation: enter var(--duration-normal) var(--ease-out) both;
}
.feedback.is-correct { border-color: var(--success-line); background: var(--success-bg); }
.feedback.is-wrong { border-color: var(--error-line); background: var(--error-bg); }

.feedback-head {
  display: grid;
  grid-template-columns: 40px minmax(0, 1fr);
  gap: 14px;
  align-items: start;
}
.feedback-icon {
  display: grid;
  place-items: center;
  width: 40px;
  height: 40px;
  border-radius: 50%;
  color: var(--th-white);
  font-size: 1.15rem;
  font-weight: 900;
  line-height: 1;
  box-shadow: 0 6px 14px rgba(10, 39, 71, .16);
}
.feedback.is-correct .feedback-icon { background: var(--th-lime); color: var(--th-ink); }
.feedback.is-correct .feedback-icon::before { content: "✓"; }
.feedback.is-wrong .feedback-icon { background: var(--th-red); }
.feedback.is-wrong .feedback-icon::before { content: "×"; font-size: 1.5rem; }
.feedback-head-text { min-width: 0; padding-top: 6px; }
.feedback-title { margin: 0; color: var(--th-navy); font-size: var(--text-md); font-weight: 800; line-height: 1.25; }
.feedback.is-correct .feedback-title { color: var(--th-lime-text); }
.feedback.is-wrong .feedback-title { color: var(--th-red); }
.feedback-solution { max-width: 65ch; margin: 6px 0 0; color: var(--th-navy); font-weight: 700; line-height: 1.45; }
/* Mehrere richtige Antworten standen mit Semikolon in einer Zeile. Als
   Liste liest man sie einzeln — und erkennt sie unter den Antworten wieder. */
.feedback-solution-list { display: grid; gap: 3px; margin: 4px 0 0; padding-left: 1.25em; }

.feedback-grid {
  display: grid;
  gap: 14px;
  margin-top: 16px;
  padding-top: 16px;
  border-top: 1px solid rgba(10, 39, 71, .12);
}
.feedback-copy,
.irrtum-list,
.mitnehmen-text { max-width: 65ch; }
@media (min-width: 900px) {
  .feedback-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 18px 0; }
  .feedback-cell { padding: 0 22px; border-left: 1px solid rgba(10, 39, 71, .12); }
  .feedback-cell:first-child,
  .feedback-cell[hidden] + .feedback-cell:not([hidden]):nth-child(2) { border-left: 0; padding-left: 0; }
  .feedback-cell.irrtum { padding-right: 0; }
  /* Steht nur eine der beiden Spalten da, nimmt sie die Breite. */
  .feedback-erklaert:has(+ .irrtum[hidden]),
  .feedback-erklaert[hidden] + .irrtum { grid-column: 1 / -1; }
  .feedback-cell.mitnehmen {
    grid-column: 1 / -1;
    padding: 16px 0 0;
    border-top: 1px solid rgba(10, 39, 71, .12);
    border-left: 0;
  }
  .feedback-erklaert[hidden] + .irrtum[hidden] + .mitnehmen { padding-top: 0; border-top: 0; }
}
.feedback-cell { min-width: 0; }
/* Normale Schreibung, fett: Nach der Auflösung standen sechs gesperrte
   Versalien-Beschriftungen auf einem Bildschirm (Kategorie, die drei
   Zellen, Seitenleiste), und keine trug mehr. Der Kategorie-Chip über der
   Frage bleibt in Versalien; die Zellen tragen ohnehin ein Symbol. */
.feedback-cell-label {
  display: flex;
  align-items: center;
  gap: 9px;
  margin: 0 0 8px;
  color: var(--th-navy);
  font-size: var(--text-sm);
  font-weight: 800;
}
.feedback-cell-icon {
  display: grid;
  flex: 0 0 auto;
  place-items: center;
  width: 32px;
  height: 32px;
  border-radius: 50%;
  background: rgba(255, 255, 255, .85);
  color: var(--th-blue-text);
  box-shadow: inset 0 0 0 1px rgba(10, 39, 71, .1);
}
.feedback-cell-icon svg { width: 18px; height: 18px; fill: none; stroke: currentColor; stroke-width: 1.7; stroke-linecap: round; stroke-linejoin: round; }
.feedback-copy { margin: 0; line-height: 1.55; }

/* „Falsch gewählt?" und „Mitnehmen" liegen mal auf grünem, mal auf rotem
   Grund. Deshalb keine eigene Flächenfarbe für den Fließtext, sondern die
   geerbte Textfarbe (--th-ink): sie trägt auf beiden Gründen. */
.irrtum-list { display: grid; gap: 8px; margin: 0; padding: 0; list-style: none; }
.irrtum-item { padding-left: 12px; border-left: 3px solid var(--th-line-strong); font-size: var(--text-sm); line-height: 1.5; }
.irrtum-item b { color: var(--th-navy); font-weight: 700; }

/* Der Irrtum, in den der Teilnehmer selbst getappt ist. Die Markierung ist
   nicht nur Farbe: das vorangestellte Wort benennt sie, sonst käme sie bei
   Farbenblindheit und im Vorlesemodus gar nicht an (WCAG 1.4.1). */
.irrtum-item.is-mine { border-left-color: var(--th-red); }
.irrtum-item.is-mine b { color: var(--th-red); }

.mitnehmen-label .feedback-cell-icon { color: var(--th-lime-text); }
.mitnehmen-text { margin: 0; line-height: 1.55; font-weight: 500; }
.mitnehmen-text b { color: var(--th-navy); font-weight: 800; }

.review-mitnehmen {
  margin: 8px 0 0;
  padding-left: 10px;
  border-left: 3px solid var(--th-blue);
  color: var(--th-ink);
  font-size: var(--text-sm);
  line-height: 1.45;
}
.review-mitnehmen b { font-weight: 800; }

/* Die Aktionsleiste bleibt im Dokumentfluss. Sticky überdeckte auf kleinen
   Viewports Antworten und nach der Auswertung den Mitnehmen-Block. Direkt
   nach Antworten beziehungsweise Auflösung ist der Knopf weiterhin eindeutig
   erreichbar, ohne Inhalte unter einer schwebenden Fläche zu verstecken. */
.quiz-actions {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  margin-top: 22px;
  padding: 16px 0 max(4px, env(safe-area-inset-bottom));
  border-top: 1px solid var(--th-line);
}
.quiz-actions-buttons { display: flex; flex-wrap: wrap; gap: 10px; margin-left: auto; }
.selection-status { margin: 0; color: var(--th-muted); font-size: var(--text-sm); }
.selection-status:empty { display: none; }
.btn-pfeil { width: 18px; height: 18px; flex: 0 0 auto; fill: none; stroke: currentColor; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; }

/* --- Die Seitenleiste --- */

.quiz-aside { display: none; }
@media (min-width: 1100px) { .quiz-aside { display: grid; gap: 16px; } }

.aside-card {
  padding: 20px;
  border: 1px solid var(--th-line);
  border-radius: var(--radius-lg);
  background: var(--th-white);
  box-shadow: var(--shadow-sm);
}
.aside-title {
  margin: 0 0 14px;
  color: var(--th-navy);
  font-size: var(--text-sm);
  font-weight: 800;
}

.aside-thi-button {
  display: flex;
  align-items: center;
  gap: 12px;
  width: 100%;
  min-height: var(--tap);
  padding: 8px 10px 8px 8px;
  border: 1px solid var(--th-line);
  border-radius: var(--radius-md);
  background: var(--th-white);
  color: var(--th-ink);
  font-weight: 600;
  text-align: left;
  transition: border-color var(--duration-fast) ease, box-shadow var(--duration-fast) ease;
}
.aside-thi-button:hover { border-color: var(--th-blue); box-shadow: 0 0 0 3px rgba(59, 169, 211, .18); }
.aside-thi-icon {
  display: grid;
  flex: 0 0 auto;
  place-items: center;
  width: 40px;
  height: 40px;
  border-radius: 50%;
  background: var(--info-bg);
  color: var(--th-navy);
}
.aside-thi-icon svg { width: 22px; height: 22px; fill: none; stroke: currentColor; stroke-width: 1.7; stroke-linecap: round; stroke-linejoin: round; }
.aside-thi-text { flex: 1 1 auto; min-width: 0; }
.aside-thi-chevron { width: 20px; height: 20px; flex: 0 0 auto; fill: none; stroke: var(--th-navy); stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; }

.aside-insel-code {
  margin: 0 0 4px;
  color: var(--th-blue-text);
  font-size: var(--text-label);
  font-weight: 800;
  letter-spacing: .09em;
  text-transform: uppercase;
}
.aside-insel-title { margin: 0 0 12px; font-size: var(--text-base); font-weight: 800; letter-spacing: 0; }
.aside-insel-bild {
  width: 100%;
  max-height: 210px;
  height: auto;
  object-fit: contain;
  filter: drop-shadow(0 12px 18px rgba(10, 39, 71, .18));
}

/* -------------------------------------------------------------- Ergebnis --- */

.result-layout {
  display: grid;
  grid-template-columns: 300px minmax(0, 1fr);
  gap: 24px;
  align-items: start;
  padding: clamp(22px, 4vw, 44px);
}

.score-card {
  position: sticky;
  top: 16px;
  padding: 22px;
  border: 1px solid var(--th-line);
  border-radius: var(--radius-lg);
  background: linear-gradient(160deg, var(--th-navy) 0%, var(--th-navy-deep) 100%);
  color: var(--th-white);
  text-align: center;
}
.score-label { margin: 0; color: rgba(255, 255, 255, .74); font-size: var(--text-label); font-weight: 800; letter-spacing: .12em; text-transform: uppercase; }

/* Registriert macht --pct animierbar, und der Ring baut sich einmal auf,
   statt fertig dazustehen. Das ist die einzige Bewegung im Projekt, die
   nicht bloß ein Übergang ist — sie zeigt das Ergebnis entstehen. Ohne
   @property (ältere Browser) springt der Wert einfach: gleicher Endstand. */
@property --pct {
  syntax: "<number>";
  inherits: false;
  initial-value: 0;
}

.score-ring {
  transition: --pct 900ms cubic-bezier(.23, 1, .32, 1);
  display: grid;
  place-content: center;
  width: 148px;
  height: 148px;
  margin: 16px auto 12px;
  border-radius: 50%;
  background: conic-gradient(var(--th-lime) calc(var(--pct, 0) * 1%), rgba(255, 255, 255, .16) 0);
  position: relative;
}
.score-ring::before {
  content: "";
  position: absolute;
  inset: 12px;
  border-radius: 50%;
  background: var(--th-navy-deep);
}
.score-value { position: relative; color: var(--th-white); font-size: var(--text-2xl); font-weight: 800; line-height: 1; }
.score-fraction { position: relative; margin-top: 6px; color: rgba(255, 255, 255, .82); font-size: var(--text-sm); font-weight: 700; }
.score-rating { margin: 0 0 14px; color: rgba(255, 255, 255, .94); font-weight: 700; }

.score-meta { display: grid; gap: 8px; margin: 0; padding-top: 14px; border-top: 1px solid rgba(255, 255, 255, .18); text-align: left; }
.score-meta > div { display: flex; justify-content: space-between; gap: 10px; }
.score-meta dt { color: rgba(255, 255, 255, .7); font-size: var(--text-sm); }
.score-meta dd { margin: 0; font-size: var(--text-sm); font-weight: 700; }

.save-state { margin: 14px 0 0; color: rgba(255, 255, 255, .88); font-size: var(--text-sm); line-height: 1.4; }

.result-block { margin-bottom: 26px; }

.topic-list { display: grid; gap: 10px; }
.topic-row {
  display: grid;
  grid-template-columns: minmax(0, 1fr) 96px 62px;
  gap: 12px;
  align-items: center;
  padding: 11px 14px;
  border: 1px solid var(--th-line);
  border-radius: var(--radius-md);
  background: var(--th-white);
}
.topic-name { font-weight: 700; font-size: var(--text-sm); }
.topic-bar { height: 8px; border-radius: 999px; background: var(--th-soft); overflow: hidden; }
.topic-bar span { display: block; height: 100%; border-radius: 999px; background: var(--th-lime); }
.topic-bar.is-weak span { background: var(--th-red); }
.topic-score { color: var(--th-muted); font-size: var(--text-sm); font-weight: 800; text-align: right; }

.review-list { display: grid; gap: 10px; }
.review-item {
  padding: 14px 16px;
  border: 1px solid var(--th-line);
  border-left-width: 4px;
  border-radius: var(--radius-md);
  background: var(--th-white);
}
.review-item.is-correct { border-left-color: var(--th-lime); }
.review-item.is-wrong { border-left-color: var(--th-red); }
.review-head { display: flex; align-items: baseline; gap: 10px; margin-bottom: 6px; }
.review-index { color: var(--th-muted); font-size: var(--text-label); font-weight: 800; }
.review-verdict { font-size: var(--text-label); font-weight: 800; letter-spacing: .06em; text-transform: uppercase; }
.review-item.is-correct .review-verdict { color: var(--th-lime-text); }
.review-item.is-wrong .review-verdict { color: var(--th-red); }
.review-q { margin: 0 0 6px; font-weight: 700; line-height: 1.4; }
.review-a { margin: 0; color: var(--th-muted); font-size: var(--text-sm); line-height: 1.45; }
.review-a strong { color: var(--th-navy); }

.result-actions { display: flex; flex-wrap: wrap; gap: 10px; }

/* ------------------------------------------------------------- Fußzeile --- */

.colophon {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  margin-top: 18px;
  padding: 0 6px;
  color: var(--th-muted);
  font-size: var(--text-sm);
}

/* ---------------------------------------------------------------- Toast --- */

.toast {
  position: fixed;
  z-index: 1300;
  left: 50%;
  bottom: 20px;
  opacity: 1;
  transform: translate(-50%, 0);
  max-width: min(92vw, 460px);
  padding: 13px 18px;
  border-radius: var(--radius-lg);
  background: var(--th-navy);
  color: var(--th-white);
  font-weight: 700;
  box-shadow: var(--shadow-md);
  transition:
    opacity 180ms var(--ease-out),
    transform 180ms var(--ease-out);
}
.toast[data-closing="true"] {
  opacity: 0;
  transform: translate(-50%, 8px);
  transition-duration: var(--duration-press);
}
@starting-style {
  .toast {
    opacity: 0;
    transform: translate(-50%, 8px);
  }
}

/* Hover gehört nur auf Geräte, die tatsächlich hovern können. Auf Touch-
   Displays bliebe der Zustand sonst nach dem Tippen hängen. */
@media (hover: hover) and (pointer: fine) {
  .profile-photo-button:hover { background: #F0F4F8; }
  .profile-submit:hover:not(:disabled) { background: var(--th-navy-hover); border-color: var(--th-navy-hover); }
  .profile-footer a:hover,
  .profile-consent a:hover,
  .profile-photo-remove:hover { color: #8E0C1D; background: #FFF2F4; }
  .island-card:hover {
    border-color: var(--th-blue);
    box-shadow: 0 16px 34px rgba(10, 39, 71, .13);
    transform: translateY(-3px);
  }
  .island-card:hover .i-content { box-shadow: 0 13px 28px rgba(10, 39, 71, .17); }
  .island-card:hover .i-open {
    border-color: var(--th-navy);
    background: var(--info-bg);
    transform: translateX(2px);
  }
  .btn:hover:not(:disabled) { transform: translateY(-1px); }
  .btn-primary:hover:not(:disabled) { background: var(--th-navy-hover); }
  .btn-danger:hover:not(:disabled) { background: #A70F24; }
  .btn-secondary:hover:not(:disabled) { border-color: var(--th-blue); }
  .btn-praxis:hover:not(:disabled) { background: var(--info-bg); }
  .btn-ghost:hover:not(:disabled) { background: var(--error-bg); }
  /* Nicht auf der gewählten Antwort: Die Regel wiegt schwerer als
     `.answer.is-selected` und tauschte genau im Moment des Klicks den
     Auswahlrand gegen den Hover-Rand. Bei Produktkacheln ist `--opt` überall
     Navy — gewählt und überfahren sahen dann gleich aus. */
  .answer:hover:not(:disabled):not(.is-selected) {
    border-color: var(--opt);
    box-shadow: 0 10px 24px rgba(var(--opt-rgb), .14);
  }
  .order-item:hover:not(:disabled) { border-color: var(--th-blue); }
  .answer-zoom:hover { background: var(--th-navy); }
}

/* Auf der Karte ist die Schaltfläche so groß wie die komplette Inselstation.
   Ein Schatten auf dieser unsichtbaren Fläche wirkt wie ein rechteckiger
   Rahmen. Deshalb reagieren hier nur Beschriftung und Silhouette. */
@media (hover: hover) and (pointer: fine) {
  .island-card:hover {
    border-color: transparent;
    box-shadow: none;
    transform: none;
  }
  /* Die Infokarte ist mit `translateY(-50%)` zentriert. `transform` ist EINE
     Eigenschaft: Wer hier nur `translateY(-2px)` schreibt, ersetzt die
     Zentrierung, statt sie zu ergaenzen — die Karte faellt um ihre halbe
     Hoehe nach unten (gemessen 43 px), rutscht unter dem Zeiger weg, der
     Hover erlischt, die Karte springt zurueck, der Zeiger ist wieder drin.
     Das ergibt ein Flackern, das aussieht wie ein Fehler in der Animation
     und keiner ist. Die Zentrierung gehoert deshalb in jeden Zustand. */
  .island-card:hover .i-content {
    box-shadow: 0 13px 28px rgba(10, 39, 71, .17), inset 0 1px 0 rgba(255, 255, 255, .9);
    transform: translateY(calc(-50% - 2px));
  }
  .island-card:hover .i-visual img {
    filter: drop-shadow(0 10px 10px rgba(10, 39, 71, .26));
    transform: scale(1.015);
  }
  .island-card:active { transform: none; }
  .island-card:active .i-content { transform: translateY(-50%) scale(.985); }

  /* `unten`-Karten sind mit translateX zentriert — dieselbe Falle wie
     oben, nur waagerecht: Der Zustand schreibt die Grundlage mit, sonst
     springt die Karte beim Hover um ihre halbe Breite zur Seite. */
  .island-map-item[data-karte="unten"] .island-card:hover .i-content {
    transform: translateX(-50%) translateY(-2px);
  }
  .island-map-item[data-karte="unten"] .island-card:active .i-content {
    transform: translateX(-50%) scale(.985);
  }
}

/* --------------------------------------------------------------- Mobile --- */

/* Zwischenbreiten: Text über der Szene, nicht daneben.
   --------------------------------------------------------------------------
   Der Textblock hat eine feste Maximalbreite (16ch für die Überschrift), sein
   ANTEIL an der Bühne wächst also, je schmaler die wird. Gemessen: Ab rund
   1000 px Bühnenbreite endet der Text vor dem Verkäufer, darunter läuft er in
   ihn hinein — bei 900 px um 5 px, bei 700 px um 71 px.

   1000 px Bühne entsprechen etwa 1300 px Fensterbreite. Zwischen dem
   Tablet-Umbruch bei 900 px und dieser Grenze bleibt eine Lücke, in der die
   nebeneinander gesetzte Anordnung nicht mehr aufgeht. Dort gilt dieselbe
   Anordnung wie auf dem Tablet: Text oben, Szene darunter. */
@media (min-width: 901px) and (max-width: 1299px) {
  #screen-start[data-island="usedom"] .start-intro { min-height: 600px; }
  .usedom-szene-display { left: 24%; width: 52%; bottom: 25%; }
  .usedom-szene-verkaeufer { left: 9%; height: 56%; }
  .usedom-szene-kundin { right: 9%; height: 52%; }
  .usedom-szene-podest { left: 18%; width: 66%; bottom: 16%; }
  .usedom-start-visual::before { top: 4%; left: 24%; width: 50%; height: 52%; }

  /* FEHMARN gleicher Fall, gleiche Messung: frei erst ab rund 1000 px
     Bühnenbreite, bei 900 px läuft der Text 20 px in den Arbeitsplatz.
     Hier bleibt die Anordnung aber nebeneinander — anders als auf USEDOM,
     weil der Textblock mit vier Faktenzeilen ohnehin fast die ganze
     Bühnenhöhe braucht und darunter kein Platz für die Szene wäre. Statt sie
     nach unten zu schieben, wird sie schmaler: Bei 62 % beginnt sie erst bei
     40 % der Breite und lässt dem Text seine 38 %. */
  #screen-start[data-island="fehmarn"] .start-intro { min-height: 640px; }
  /* Der Beschreibungstext ist hier das breiteste Element (42 ch aus dem
     gemeinsamen Block, gemessen 44 % der Bühne). Er wird schmaler, damit die
     Szene nicht ihrerseits weiter schrumpfen muss — aber nur so weit, dass
     er nicht gequetscht wirkt. */
  #screen-start[data-island="fehmarn"] .start-intro .lead { max-width: 36ch; }
  .fehmarn-szene-arbeitsplatz { right: -1%; width: 58%; }
  .fehmarn-szene-welle { top: 13%; left: 44%; width: 20%; opacity: .5; }
  .fehmarn-szene-raum { object-position: 70% 60%; }
}

@media (max-width: 1199px) {
  body.ist-onboarding .shell {
    width: min(calc(100% - 64px), 1120px);
    padding-top: 32px;
    padding-bottom: 32px;
  }
  .onboarding { min-height: calc(100dvh - 64px); }
  .onboarding-layout { grid-template-columns: 1fr; }
  .onboarding-hero { min-height: 300px; }
  .onboarding-picture img { object-position: 50% 58%; }
  .onboarding-hero-content { min-height: 300px; padding: 28px 32px; }
  .onboarding-logo-wrap { width: 178px; padding: 7px 10px; }
  .onboarding-welcome h1 { margin-bottom: 8px; font-size: clamp(2rem, 5vw, 3.15rem); }
  .onboarding-panel { padding: 38px 32px; }
}

@media (max-width: 900px) {
  .masthead { grid-template-columns: minmax(0, 1fr) minmax(260px, .72fr); }
  .masthead-tools {
    grid-column: 1 / -1;
    grid-row: 2;
  }
  .masthead-progress,
  .masthead-meta {
    grid-column: 2;
    grid-row: 1;
  }
  .profile-name-row { grid-template-columns: 1fr; }
  .start-layout { grid-template-columns: 1fr; }
  #screen-start[data-island="samsoe"] .start-layout { grid-template-columns: 1fr; }
  #screen-start[data-island="samsoe"] .start-intro { min-height: 690px; }
  #screen-start[data-island="hiddensee"] .start-intro { min-height: 720px; }
  #screen-start[data-island="vejro"] .start-layout {
    grid-template-columns: minmax(0, 1.42fr) minmax(270px, .7fr);
  }
  #screen-start[data-island="vejro"] .start-intro { min-height: 690px; }
  #screen-start[data-island="poel"] .start-intro { min-height: 740px; }
  /* Auf dieser Breite steht der Text nicht mehr NEBEN der Szene, sondern
     DARÜBER: Gemessen belegt er hier 51 % der Bühnenbreite statt 35 % wie
     auf dem Desktop, weil die Überschrift früher umbricht. Die Szene rückt
     deshalb nach unten und wird flacher — die Personen auf gut die Hälfte
     der Bühnenhöhe, damit sie unter dem Textblock bleiben. Die Bühne wird
     dafür etwas höher. */
  #screen-start[data-island="usedom"] .start-intro { min-height: 600px; }
  .usedom-szene-display { left: 24%; width: 52%; bottom: 25%; }
  .usedom-szene-verkaeufer { left: 9%; height: 56%; }
  /* Rechts genug Abstand, damit sie VOR der Displaykante steht und nicht
     daneben — sonst stehen drei Motive in einer Reihe. */
  .usedom-szene-kundin { right: 9%; height: 52%; }
  .usedom-szene-podest { left: 18%; width: 66%; bottom: 16%; }
  .usedom-start-visual::before { top: 4%; left: 24%; width: 50%; height: 52%; }
  /* Schmalere Bühne: Der Ausschnitt rückt Richtung Bildmitte, damit die
     beiden Personen zusammen im Bild bleiben. */
  #screen-start[data-island="langeland"] .start-intro { min-height: 560px; }
  .langeland-szene-uebergabe { object-position: 66% 60%; }
  /* Auf dieser Breite steht der Text über der Szene statt daneben — wie auf
     USEDOM, aus demselben Grund: Der Textblock hat eine feste Maximalbreite,
     sein Anteil an der Bühne wächst also, je schmaler die wird. Die Szene
     rückt nach unten und schrumpft, die Welle wird kleiner und blasser. */
  #screen-start[data-island="fehmarn"] .start-intro { min-height: 660px; }
  .fehmarn-szene-arbeitsplatz { right: -2%; width: 78%; }
  .fehmarn-szene-welle { top: 30%; left: 4%; width: 30%; opacity: .45; }
  .fehmarn-szene-raum { object-position: 68% 60%; }
  /* Bei Tabletbreite bleibt die Vejrø-Aufteilung für alle Inseln erhalten.
     Die globale 80-%-Skalierung vergrößert den virtuellen Inhaltsbereich;
     deshalb reichen 270 CSS-px für das Startpanel weiterhin komfortabel. */
  #screen-start[data-island] .start-layout {
    grid-template-columns: minmax(0, 1.42fr) minmax(270px, .7fr);
  }
  .result-layout { grid-template-columns: 1fr; }
  .score-card { position: static; }
}

/* Hochkant ist kein schmales Querformat.

   Die Regel oben haelt die Zweispaltigkeit „bei Tabletbreite" fuer alle
   Inseln — richtig fuer das Tablet QUER, wo neben dem Motiv wirklich Platz
   ist. Hochkant trifft dieselbe Abfrage zu und quetscht das Motiv dann auf
   gut die halbe Breite: gemessen 535 px in einem 1025 px breiten Layout,
   waehrend unter der Buehne Platz frei blieb. Beide Spalten waren zu eng,
   und keine hatte einen Grund dafuer.

   Hochkant wird deshalb gestapelt: Motiv oben ueber die volle Breite, die
   Teilnehmerangaben darunter. Das ist zugleich die natuerliche
   Lesereihenfolge — erst sehen, worum es geht, dann die Daten eingeben. */
@media (orientation: portrait) and (max-width: 1024px) {
  #screen-start[data-island] .start-layout { grid-template-columns: 1fr; }
}

@media (max-width: 759px) {
  .masthead-progress {
    grid-column: 1 / -1;
    grid-row: 2;
    justify-self: stretch;
    width: 100%;
    margin-left: 0;
  }
  .masthead-tools {
    grid-column: 1 / -1;
    grid-row: 3;
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    width: 100%;
    margin-left: 0;
  }
  .masthead-tool { justify-content: center; min-width: 0; }
  body.ist-onboarding .shell {
    width: calc(100% - 40px);
    padding-top: 20px;
    padding-bottom: 20px;
  }
  .onboarding { min-height: calc(100dvh - 40px); }
  .onboarding-hero { min-height: 238px; }
  .onboarding-hero-content { min-height: 238px; padding: 20px; }
  .onboarding-brand { gap: 12px; }
  .onboarding-logo-wrap { width: 142px; padding: 6px 8px; }
  .onboarding-campus { padding-left: 12px; font-size: var(--text-label); }
  .onboarding-welcome h1 { font-size: clamp(1.65rem, 8vw, 2.2rem); }
  .onboarding-welcome p { max-width: 31ch; font-size: var(--text-sm); }
  .onboarding-panel { padding: 24px 20px 20px; }
  .profile-form { gap: 16px; }
  .profile-head h2 { font-size: var(--text-xl); }
  .profile-photo-row { grid-template-columns: 88px minmax(0, 1fr); gap: 12px; }
  .profile-photo-preview { width: 88px; height: 88px; }
  .profile-photo-button { padding-right: 8px; padding-left: 8px; font-size: var(--text-sm); }
  .profile-submit { width: 100%; padding-right: 14px; padding-left: 14px; font-size: var(--text-sm); }
  .campus-progress-head { margin-bottom: 5px; }
  .masthead-progress small { text-align: left; }
}

@media (min-width: 641px) and (max-width: 960px) {
  .answers-bild[data-layout="product"] { grid-template-columns: repeat(3, minmax(0, 1fr)); }
}

@media (max-width: 640px) {
  .shell { width: calc(100% - 20px); padding: 12px 0 22px; }
  .masthead { grid-template-columns: minmax(0, 1fr); gap: 8px; padding: 9px 12px 12px; border-radius: var(--radius-lg); }
  .brand { gap: 10px; }
  .brand-logo { width: 112px; }
  .brand-copy { padding-left: 10px; }
  .brand-copy small { font-size: var(--text-label); letter-spacing: .08em; }
  .brand-copy strong {
    overflow: visible;
    font-size: var(--text-sm);
    line-height: 1.2;
    text-overflow: clip;
    white-space: normal;
  }
  /* Insel und Teilnehmer stehen auf dem Startbild bereits im Inhalt. Im
     schmalen Kopf kosteten die beiden Chips eine ganze zusaetzliche Zeile. */
  .masthead-meta { display: none !important; }
  .screen { border-radius: var(--radius-lg); }

  .answers { grid-template-columns: 1fr; gap: 10px; }
  .answer { min-height: var(--tap); padding: 13px 46px 13px 13px; grid-template-columns: 40px 1fr; gap: 11px; }
  .answer::before { right: 10px; width: 26px; height: 26px; }
  .answer-letter { width: 40px; height: 40px; border-radius: var(--radius-md); }

  /* Bildkacheln bleiben auch auf dem Telefon zweispaltig — vier Fotos
     untereinander wären nicht vergleichbar, und Vergleichen ist die Aufgabe. */
  .answers-bild { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 8px; }
  .answers-bild[data-layout="product"] { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .answer-bild { padding: 0; }
  .answers-bild[data-layout="product"] .answer-media { padding: 12px; }
  .answer-bild .answer-letter { top: 7px; left: 7px; width: 34px; height: 34px; border-radius: var(--radius-md); }
  /* Die Lupe bleibt auf 44 px — sie liegt auf einer 155-px-Kachel, und wer
     mit Handschuhen danebengreift, wählt versehentlich die Antwort aus. */
  .answer-zoom { right: 7px; bottom: 7px; }
  .answer-bild-text { padding: 9px 10px; font-size: var(--text-sm); }

  .match-row { grid-template-columns: 1fr; gap: 8px; }
  .topic-row { grid-template-columns: minmax(0, 1fr) 56px; }
  .topic-bar { display: none; }

  .quiz-actions { align-items: stretch; }
  .quiz-actions-buttons { flex-direction: column-reverse; width: 100%; margin-left: 0; }
  .quiz-actions .btn { width: 100%; }
  .start-actions .btn, .result-actions .btn { flex: 1 1 auto; }
  .confirm-dialog-actions { grid-template-columns: 1fr; }
  .confirm-dialog-actions .btn-danger { grid-row: 1; }

  #screen-start[data-island="samsoe"] .start-intro {
    min-height: 650px;
    padding: 26px 22px;
  }
  /* Ohne gespeicherte Angaben stehen die drei Fakten noch im Hero. Dafür
     braucht Samsø mehr Höhe, damit Text und Fahrzeugmotiv nicht kollidieren.
     Im regulären kompakten Startzustand bleibt die kurze Bühne erhalten. */
  #screen-start[data-island="samsoe"]:has(.start-form.has-participant-facts) .start-intro {
    min-height: 450px;
  }
  #screen-start[data-island="samsoe"] .start-intro h1 { font-size: clamp(2rem, 10vw, 2.75rem); }
  #screen-start[data-island="samsoe"] .facts { gap: 8px; }
  #screen-start .start-intro .facts li {
    grid-template-columns: 42px minmax(0, 1fr);
    gap: 10px;
    min-height: 42px;
  }
  #screen-start .start-intro .facts li::before { width: 42px; height: 42px; }
  .samsoe-start-vehicle { left: -18%; width: 82%; }
  .samsoe-start-technician { right: -25%; width: 62%; }
  #screen-start[data-island="samsoe"] .start-form { padding: 26px 22px; }
  #screen-start[data-island="hiddensee"] .start-intro { min-height: 680px; }
  .hiddensee-start-contact { bottom: -1%; width: min(108%, 560px); }
  #screen-start[data-island="vejro"] .start-layout { grid-template-columns: 1fr; }
  #screen-start[data-island="vejro"] .start-intro {
    min-height: 650px;
    padding: 24px 22px;
  }
  #screen-start[data-island="vejro"] .start-intro::before {
    background:
      linear-gradient(180deg, rgba(4, 17, 36, .28) 0%, transparent 40%, rgba(4, 17, 36, .62) 100%);
  }
  #screen-start[data-island="vejro"] .start-intro h1 {
    max-width: 13ch;
    font-size: clamp(1.9rem, 9vw, 2.55rem);
  }
  #screen-start[data-island="vejro"] .facts { gap: 5px; margin-top: 12px; }
  .vejro-start-light { top: 22%; right: -29%; width: 118%; opacity: .82; }
  .vejro-start-stage { right: -6%; bottom: 2%; width: 112%; }
  .vejro-start-access { bottom: 10%; left: 2%; width: 39%; }
  .vejro-start-water { bottom: 10%; left: 21.5%; width: 62%; }
  .vejro-start-contact { right: -6%; bottom: 10%; width: 49%; }
  #screen-start[data-island="vejro"] .start-form { padding: 26px 22px; }
  #screen-start[data-island="poel"] .start-intro { min-height: 680px; }
  .poel-start-haendler { bottom: 2%; max-width: 98%; height: min(35%, 300px); }
  /* Einspaltig: Die Bühne wird zum Kopfbild über dem Teilnehmerbereich.
     Der Ausschnitt geht Richtung Bildmitte, damit Verkäufer, Display und
     Kundin zusammen im Bild bleiben. */
  #screen-start[data-island="usedom"] .start-intro { min-height: 520px; }
  /* Einspaltig steht der Text oben, die Szene darunter. Sie nimmt die volle
     Breite und rückt in die untere Hälfte. Der Verkäufer bleibt links, die
     Kundin rechts — auf 373 px wären beide sonst übereinander. */
  .usedom-szene-display { left: 21%; width: 56%; bottom: 26%; }
  /* Die Personen stehen mit Abstand zur Kante: Bei left/right 0 wurden sie
     am Bühnenrand angeschnitten, und eine halbe Person liest sich als
     Bildfehler, nicht als Anschnitt. */
  .usedom-szene-verkaeufer { left: 5%; height: 44%; }
  .usedom-szene-kundin { right: 7%; height: 40%; }
  .usedom-szene-podest { left: 14%; width: 72%; bottom: 17%; }
  .usedom-start-visual::before { top: 4%; left: 21%; width: 56%; height: 52%; }
  .usedom-szene-raum { object-position: center 70%; }
  /* Der Lichtstab säße auf dieser Breite im Text. */
  .usedom-start-visual::after { display: none; }

  /* Der seitliche Scrim greift hier nicht mehr: In einer 373 px schmalen
     Bühne nimmt der Text die volle Breite ein, während der Verlauf erst bei
     86 % ausläuft. Gemessen kam weisser Text damit auf 1,15:1 und lag direkt
     auf der hellen Displayfläche. Ein zweiter Verlauf von oben deckt den
     Textbereich unabhängig von der Breite ab; zusammen ergeben beide 6,8:1. */
  #screen-start[data-island="usedom"] .start-intro::before {
    background:
      linear-gradient(180deg,
        rgba(4, 16, 34, .92) 0%,
        rgba(4, 16, 34, .86) 62%,
        rgba(4, 16, 34, .55) 80%,
        rgba(4, 16, 34, .40) 100%),
      linear-gradient(100deg,
        rgba(4, 16, 34, .70) 0%,
        rgba(4, 16, 34, .40) 46%,
        transparent 84%);
  }
  /* Einspaltig: Der Text steht oben, die Szene füllt den Rest. Von den
     1500 px Bildbreite sind hier nur noch rund 370 sichtbar — der Ausschnitt
     geht deshalb ganz an den rechten Rand, wo Übergabe und Fahrzeug stehen.
     Bei 74 % lag der sichtbare Bereich noch auf der dunklen Wand. */
  #screen-start[data-island="langeland"] .start-intro { min-height: 560px; }
  .langeland-szene-uebergabe { object-position: 100% 56%; }
  /* Der Text steht oben, die Szene darunter: Der Verlauf deckt entsprechend
     von oben statt von der Seite. */
  #screen-start[data-island="langeland"] .start-intro::before {
    background:
      linear-gradient(180deg,
        rgba(4, 16, 34, .90) 0%,
        rgba(4, 16, 34, .82) 42%,
        rgba(4, 16, 34, .40) 62%,
        rgba(4, 16, 34, .18) 100%);
  }
  /* Einspaltig: Text oben, Arbeitsplatz darunter über die volle Breite.
     Die Welle entfällt — sie ist reine Dekoration und würde auf 373 px nur
     mit dem Hauptmotiv um Platz streiten. */
  /* Über der Szene stehen Überschrift und Beschreibung; die Faktenzeilen
     liegen in der rechten Spalte. Die Höhe ist danach bemessen, dass der
     Kopf der Mitarbeiterin frei bleibt. */
  #screen-start[data-island="fehmarn"] .start-intro { min-height: 660px; }
  .fehmarn-szene-arbeitsplatz { right: auto; left: 50%; width: 112%; transform: translateX(-50%); }
  .fehmarn-szene-welle { display: none; }
  .fehmarn-szene-raum { object-position: 60% 62%; }

  /* Smartphone: Hero, Informationen und Startaktion folgen wieder der
     natürlichen Lesereihenfolge und nutzen die volle Inhaltsbreite. */
  #screen-start[data-island] .start-layout { grid-template-columns: 1fr; }
  .poel-start-haendler {
    right: 2%;
    width: 96%;
    max-width: none;
    height: auto;
  }
}

@media (max-width: 420px) {
  .profile-photo-actions { grid-template-columns: 1fr; }
}

/* ------------------------------------------------------- Reduced Motion --- */

@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: .001ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 100ms !important;
    transition-property: background-color, border-color, color, opacity, box-shadow !important;
    scroll-behavior: auto !important;
  }
  .btn:hover:not(:disabled), .island-card:hover { transform: none; }
  .btn:active:not(:disabled),
  .answer:active:not(:disabled),
  .island-card:active,
  .island-card:active .i-content { transform: none; }
}

/* `transform: none` oben ist fuer die Kachelliste richtig — dort steht die
   Infokarte im Fluss. Auf der Buehne ist sie mit `translateY(-50%)`
   zentriert, und `none` verschoebe sie um ihre halbe Hoehe. Reduzierte
   Bewegung heisst: kein Heben, kein Druck — nicht: keine Zentrierung. */
@media (prefers-reduced-motion: reduce) {
  .island-card:hover .i-content,
  .island-card:active .i-content { transform: translateY(-50%); }
  .island-map-item[data-karte="unten"] .island-card:hover .i-content,
  .island-map-item[data-karte="unten"] .island-card:active .i-content { transform: translateX(-50%); }
}

@media (prefers-reduced-transparency: reduce) {
  .masthead,
  .island-card .i-content {
    background: var(--th-white);
    backdrop-filter: none;
    -webkit-backdrop-filter: none;
  }
}

/* ------------------------------------------------------------- Kontrast --- */

@media (prefers-contrast: more) {
  .answer, .order-item, .match-row, .review-item, .topic-row { border-width: 2px; }
  .lead, .review-a { color: #3F464F; }
  .irrtum-item, .review-mitnehmen { border-left-width: 4px; }
}

/* ---------------------------------------------------------------- Druck --- */

/* ------------------------------------------------------- Sende-Ausgang --- */

.ausgang {
  display: flex;
  flex-wrap: wrap;
  gap: 10px 14px;
  align-items: center;
  margin: 16px 0 0;
  padding: 14px 16px;
  border: 1px solid var(--th-blue);
  border-radius: var(--radius-md);
  background: var(--info-bg);
}
.ausgang[hidden] { display: none; }
.ausgang-text {
  flex: 1 1 220px;
  margin: 0;
  color: var(--th-navy);
  font-size: var(--text-sm);
  line-height: 1.45;
}
.ausgang.is-fehler { border-color: var(--error-line); background: var(--error-bg); }

/* Noch offene Inseln, direkt über den Knöpfen — dort wird entschieden,
   wohin es weitergeht. */
.rest-hinweis {
  margin: 0 0 12px;
  color: var(--th-muted);
  font-size: var(--text-sm);
}

@media print {
  body { background: var(--th-white); }
  .masthead-meta, .masthead-progress, .quiz-actions, .result-actions, .toast, .skip-link,
  .ausgang, .rest-hinweis { display: none !important; }
  .screen { box-shadow: none; border-color: #999; }
  .score-card { background: var(--th-white); color: #000; border: 1px solid #999; }
  .score-card * { color: #000 !important; }
}

/* Die optionale Aufnahme unterbricht die Pflichtangaben nicht mehr. */
.profile-photo-details summary { min-height: calc(var(--tap) + 12px); padding: 16px 0; cursor: pointer; color: var(--th-navy); font-weight: 700; }
.profile-photo-details[open] { padding-bottom: 12px; }

/* Auf dem Telefon bleibt die Bühne erkennbar, ohne den Quizstart unter
   einen ganzen Bildschirm mit Dekoration zu schieben. */
@media (max-width: 640px) {
  #screen-start.screen[data-island] .start-intro,
  #screen-start.screen[data-island]:has(.start-form.has-participant-facts) .start-intro {
    min-height: 320px;
    height: 320px;
  }
  #screen-start.screen[data-island] .start-layout { min-height: 0; }

  /* Auf Telefonen reicht eine Teilnehmerzeile. Die großen Infokarten haben
     zuvor den eigentlichen Einstieg unter den Bildschirm geschoben. */
  #screen-start.screen[data-island] .start-form.is-panel {
    padding: 22px;
    gap: 14px;
  }
  #screen-start.screen[data-island] .start-form.is-panel .participant-summary {
    grid-template-columns: minmax(0, 1fr) auto;
    gap: 4px 12px;
    padding: 0 0 14px;
    border: 0;
    border-bottom: 1px solid var(--th-line);
    border-radius: 0;
    background: none;
    box-shadow: none;
  }
  #screen-start.screen[data-island] .start-form.is-panel .participant-summary .form-title { display: none; }
  #screen-start.screen[data-island] .participant-name { grid-column: 1; grid-row: 1; overflow-wrap: anywhere; }
  #screen-start.screen[data-island] .participant-meta { grid-column: 1; grid-row: 2; overflow-wrap: anywhere; }
  #screen-start.screen[data-island] .start-form.is-panel .participant-summary .btn {
    grid-column: 2;
    grid-row: 1 / span 2;
    min-height: calc(var(--tap) + 12px);
    margin: 0;
    padding: 8px 0 8px 8px;
  }
  #screen-start.screen[data-island] .start-form.has-participant-facts .facts {
    gap: 6px;
    margin: 0;
    padding: 0;
    border: 0;
    border-radius: 0;
    background: none;
    box-shadow: none;
  }
  #screen-start.screen[data-island] .start-form.has-participant-facts .facts li {
    grid-template-columns: 40px minmax(0, 1fr);
    min-height: 40px;
    gap: 10px;
  }
  #screen-start.screen[data-island] .start-form.has-participant-facts .facts li::before { width: 40px; height: 40px; }
  #screen-start.screen[data-island] .start-form.is-panel .start-actions { margin-top: 6px; }
}

/* Karte und Detailansicht teilen eine Auswahl; mobil sind alle Inseln erreichbar. */
#screen-islands:not([hidden]) { display:grid; grid-template-columns:minmax(0,1fr); gap:24px; background:transparent; overflow:visible; }
#screen-islands .orbit { display:block; min-width:0; padding:0; background:transparent; }
#screen-islands .orbit-buehne { position:static; width:100%; aspect-ratio:auto; margin:0; }
#screen-islands .orbit-pille, #screen-islands .orbit-ring, #screen-islands .orbit-pfeil, #screen-islands .orbit-punkte, #screen-islands .orbit-hinweis, #screen-islands .orbit-hand, #screen-islands .orbit-fortschritt, #screen-islands .map-schiebehinweis { display:none; }
#screen-islands .orbit-thumbs { position:static; display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:10px; margin:0 0 20px; padding:0; list-style:none; }
#screen-islands .orbit-station { position:static; transform:none; opacity:1; pointer-events:auto; }
#screen-islands .orbit-thumb { display:flex; gap:10px; justify-content:flex-start; align-items:center; width:100%; height:auto; min-height:64px; padding:8px 12px; border:1px solid #b9cada; border-radius:var(--radius-md); background:var(--th-white); color:var(--th-navy); box-shadow:none; }
#screen-islands .orbit-thumb img { width:38px; height:40px; object-fit:contain; }
#screen-islands .orbit-thumb-label { font-size: var(--text-label); font-weight:800; }
#screen-islands [aria-pressed="true"].orbit-thumb { border:2px solid var(--th-navy); background:#eaf6fb; }
#screen-islands .orbit-hero { position:static; transform:none; display:flex; align-items:stretch; width:100%; padding:24px; border:1px solid #c6d4e0; border-radius:var(--radius-lg); background:var(--th-white); box-shadow:0 8px 24px #1d36610b; text-align:left; }
#screen-islands .orbit-hero-bild { width:100%; height:180px; object-fit:contain; margin:0 0 20px; }
#screen-islands .orbit-hero-code { color:#247d9e; font-weight:800; font-size: var(--text-label); letter-spacing:.12em; margin:0 0 8px; }
#screen-islands .orbit-hero-titel { color:var(--th-navy); font-size:clamp(1.4rem,2vw,2rem); line-height:1.2; font-weight:800; margin:0 0 16px; }
#screen-islands .overview-description { margin:0 0 20px; line-height:1.55; color:#46586b; }
#screen-islands .orbit-hero-stand { font-size: var(--text-sm); margin:0 0 20px; }
#screen-islands .orbit-start, #screen-islands .overview-praxis, #screen-islands .overview-fall { width:100%; min-height:58px; white-space:normal; text-align:center; }
#screen-islands .overview-praxis { margin-top:12px; }
#screen-islands .overview-fall { margin-top:12px; border:1px solid var(--th-navy); color:var(--th-navy); background:var(--th-white); }
.praxis-einstieg { display:flex; gap:24px; align-items:center; justify-content:space-between; margin-top:24px; padding:24px; border:1px solid #b9cada; border-radius:var(--radius-lg); background:var(--th-white); }
.praxis-einstieg[hidden] { display:none; }
/* Die Beschriftung trug die Klasse `eyebrow`, für die es keine Regel gab —
   sie stand in Schwarz, 16 px, normal und klein geschrieben zwischen lauter
   gesperrten Versalien. Jetzt wie die Beschriftungen der Übersicht und der
   Seitenleiste. */
.praxis-einstieg .eyebrow { margin:0; color:var(--th-blue-text); font-size:var(--text-label); font-weight:800; letter-spacing:.1em; text-transform:uppercase; }
.praxis-einstieg h2 { margin:6px 0; color:var(--th-navy); }
.praxis-einstieg p { margin:6px 0; }
@media(min-width:768px) {
 #screen-islands .campus-map { width:100%; margin:0; align-self:start; }
 #screen-islands .campus-szene { width:100%; max-width:none; aspect-ratio:16/9; height:auto; min-height:0; margin:0; }
 #screen-islands .orbit-thumbs { grid-template-columns:repeat(4,minmax(0,1fr)); }
 #screen-islands .karten-hinweis { display:none; }
 #screen-islands .island-card .i-title, #screen-islands .island-card .i-state { display:none; }
 #screen-islands .island-card .i-wert { display:inline; font-size:max(.72rem,1cqw); }
 #screen-islands .island-card .i-fortschritt { gap:max(6px,.5cqw); }
 #screen-islands .island-card .i-content { width:max-content; min-width:90px; min-height:55px; padding:10px 14px; justify-content:center; }
 #screen-islands .island-card .i-code { font-size:max(.82rem,1.15cqw); }
 #screen-islands .island-card[aria-pressed="true"] .i-content { background:var(--th-navy); border-color:var(--th-navy); }
 #screen-islands .island-card[aria-pressed="true"] .i-code { color:var(--th-white); }
 /* Lime-Text und Cyan-Text auf Navy lagen bei 2,2:1 bzw. 2,3:1 (bis 1.67). */
 #screen-islands .island-card[aria-pressed="true"] .i-wert { color:var(--th-white); }
}
@media(min-width:1100px) {
 #screen-islands:not([hidden]) { grid-template-columns:minmax(0,1fr) minmax(320px,28%); align-items:start; }
 #screen-islands .orbit-thumbs { display:none; }
}
@media(max-width:767px) {
 #screen-islands .campus-map { display:none; }
 #screen-islands .orbit-hero-bild { height:110px; margin-bottom:12px; }
 #screen-islands .orbit-hero { padding:20px; }
 .praxis-einstieg { flex-direction:column; align-items:stretch; padding:20px; }
}
#screen-islands .orbit-hero { flex-direction:column; }
#screen-islands .orbit-hero-bild { flex:none; }
#screen-islands .overview-heading { grid-column:1/-1; }
#screen-islands .overview-heading h1 { margin:0 0 6px; color:var(--th-navy); font-size: var(--text-xl); }
#screen-islands .overview-heading p { margin:0; color:#46586b; }
#screen-islands:not([hidden]) { border:0; box-shadow:none; border-radius:0; }
#screen-islands .campus-map { border-radius:var(--radius-lg); overflow:hidden; }
#screen-islands .overview-praxis { color:var(--th-navy-deep); }
#screen-islands .island-card .i-content { min-height:56px; }
@media(max-width:767px) { #screen-islands .orbit-fortschritt { display:flex; margin-top:20px; } }
/* Sieben Kacheln in zwei Spalten ließen Poel allein in der letzten Reihe.
   VEJRØ ist die zentrale Insel und bekommt die ganze Breite, die übrigen
   sechs füllen drei volle Reihen. */
@media(max-width:767px) { #screen-islands .orbit-station[data-slug="vejro"] { grid-column:1/-1; } }
@media (orientation:portrait) and (min-width:768px) and (max-width:1199px) {
 /* Kopf samt Werkzeugzeile, Überschrift und Abstände brauchen zusammen
    knapp 400 Layout-Pixel. Die Karte bleibt damit auch mit eingeblendeten
    Browserleisten vollständig im ersten Fenster sichtbar. */
 #screen-islands { --karte-breite: min(100%, 750px, (var(--fenster-hoch) - 400px) * 3 / 4); }
 #screen-islands .campus-map { width:var(--karte-breite); aspect-ratio:3/4; margin-inline:auto; }
 #screen-islands .campus-szene { aspect-ratio:3/4; }
 /* Überschrift und Inselbox folgen derselben Breite wie die Karte. */
 #screen-islands .overview-heading,
 #screen-islands .orbit { width:var(--karte-breite); margin-inline:auto; }
}
@media(min-width:768px) { #screen-islands .orbit-thumbs { display:none; } }
#screen-islands .orbit { scroll-margin-top:20px; }

/* Ein gemeinsamer Kopf verbindet Überschrift, Karte und Inseldetails. */
#screen-islands .overview-heading { display:flex; align-items:center; justify-content:space-between; gap:24px; padding:24px 28px; background:var(--th-white); border:1px solid #c6d4e0; border-left:6px solid var(--th-blue); border-radius:var(--radius-lg); }
#screen-islands .overview-heading .overview-kicker { margin:0 0 8px; color:#247d9e; font-size: var(--text-label); font-weight:800; letter-spacing:.13em; text-transform:uppercase; }
#screen-islands .overview-heading h1 { font-size:clamp(1.5rem,2.5vw,2.2rem); margin:0 0 8px; }
#screen-islands .orbit-hero-bild { height:130px; margin-bottom:16px; filter:none; }
#screen-islands .overview-description { font-size: var(--text-base); margin-bottom:16px; }
#screen-islands .overview-topics { display:grid; gap:8px; list-style:none; padding:0; margin:0 0 24px; color:var(--th-navy); font-size: var(--text-sm); }
#screen-islands .overview-topics li { position:relative; padding-left:18px; }
#screen-islands .overview-topics li::before { content:''; position:absolute; left:0; top:.65em; width:6px; height:6px; border-radius:50%; background:var(--th-blue); }


#screen-islands .island-langeland .i-visual img { filter:none; }
@media(min-width:768px) {
 #screen-islands .island-card .i-content { top:calc(100% - 12px); left:50%; right:auto; transform:translateX(-50%); border-radius:var(--radius-md); padding:10px 16px; min-width:105px; gap:0; }
 #screen-islands .island-card:hover .i-content, #screen-islands .island-card:active .i-content { transform:translateX(-50%); }
}
@media(max-width:767px) {
 #screen-islands .overview-heading { padding:20px; align-items:flex-start; flex-direction:column; gap:12px; }
 #screen-islands .orbit-hero-bild { height:100px; }
}

/* Die Inselbox ist so hoch wie die Karte daneben. Bis Engine 1.52 hing
   ihre Höhe allein am Inhalt — gemessen 68 % der Kartenhöhe bei 2560 px
   Fensterbreite und 155 % bei 1100 px; der Inhalt ist auf Laptops und dem
   iPad quer höher als die Karte, auf großen Monitoren niedriger.

   Deshalb bestimmt ab 1100 px, wo beide nebeneinanderstehen, allein die
   Karte die Zeilenhöhe: Die Bühne der Box liegt absolut in .orbit und trägt
   nichts dazu bei. In der Box nimmt das Inselbild den Platz, der übrig
   bleibt (höchstens 320 px; unter 72 px fällt es weg, als Briefmarke hilft
   es niemandem). Den Abstand zum Text trägt das Bild selbst, sonst bliebe
   er stehen, wenn das Bild wegfällt. Die Aktionen stehen unten bündig mit
   der Kartenkante. Reicht der Platz selbst für den Text nicht — nur knapp
   über 1100 px —, rollt die Box; die Aktionen bleiben unten stehen, und ein
   Verlauf über ihnen zeigt, dass es weitergeht. Zwischen 1100 und 1279 px
   (iPad quer: 1180) rücken die Abstände enger, die Schrift bleibt gleich —
   so passt dort jede Insel ohne Rollen.

   Unter 1100 px sind die drei Hüllen display: contents; die Box sieht dort
   aus wie zuvor. */
#screen-islands .orbit-hero-bildrahmen,
#screen-islands .orbit-hero-text,
#screen-islands .orbit-hero-aktionen { display:contents; }
@media(min-width:1100px) {
 #screen-islands .orbit { position:relative; align-self:stretch; }
 #screen-islands .orbit-buehne { position:absolute; inset:0; }
 #screen-islands .orbit-hero { height:100%; padding-bottom:0; overflow-y:auto; overscroll-behavior:contain; scrollbar-width:thin; }
 #screen-islands .orbit-hero-bildrahmen { display:block; flex:1 1 0; min-height:0; max-height:320px; margin:0; container:orbitbild / size; }
 #screen-islands .orbit-hero-bild { width:100%; height:calc(100% - 16px); margin:0 0 16px; }
 #screen-islands .orbit-hero-text { display:block; flex:none; }
 #screen-islands .orbit-hero-text .overview-topics { margin-bottom:20px; }
 #screen-islands .orbit-hero-aktionen { display:block; flex:none; position:sticky; bottom:0; margin-top:auto; padding:16px 0 24px; border-top:1px solid #c6d4e0; background:var(--th-white); }
 #screen-islands .orbit-hero-aktionen::before { content:""; position:absolute; left:0; right:0; bottom:100%; height:16px; background:linear-gradient(#fff0, var(--th-white)); pointer-events:none; }
 #screen-islands .orbit-hero-aktionen .orbit-hero-stand { margin-bottom:14px; }
}
@media(min-width:1100px) and (max-width:1279px) {
 #screen-islands .orbit-hero { padding:18px 20px 0; }
 #screen-islands .orbit-hero-titel { margin-bottom:10px; }
 #screen-islands .overview-description { margin-bottom:12px; }
 #screen-islands .orbit-hero-text .overview-topics { gap:6px; margin-bottom:16px; }
 #screen-islands .orbit-hero-aktionen { padding:12px 0 20px; }
 #screen-islands .orbit-hero-aktionen .orbit-hero-stand { margin-bottom:10px; }
}
@container orbitbild (max-height:72px) { #screen-islands .orbit-hero-bild { display:none; } }
/* Das generierte Querformat besitzt einen schwarzen Hintergrund. Die
   SVG-Farbmatrix macht ihn beim Zeichnen durchsichtig. */
#screen-islands .island-langeland { mix-blend-mode:normal; }
#screen-islands img[src*="langeland-horizontal.webp"], #screen-islands .island-langeland .i-visual img { filter:url(#island-cutout); }
#screen-islands .campus-map-art { pointer-events:none; }
body > svg[width="0"][height="0"] { position:absolute; }
#screen-islands .campus-map-art { z-index:0; }

body img[src*='langeland-horizontal.webp'] { filter:url(#island-cutout); }

/* Freie Wasserräume gehören der Dekoration; die Inseln führen. */
@media(min-width:768px) {
 #screen-islands .map-deko .deko-kompass { left:2%; top:3%; width:8cqw; }
 #screen-islands .map-deko .deko-boot { width:5cqw; }
 #screen-islands .map-deko .deko-boot-a { left:43%; top:4%; }
 #screen-islands .map-deko .deko-boot-b { left:3%; top:55%; }
 #screen-islands .map-deko .deko-wal { left:3%; top:85%; width:7cqw; }
 #screen-islands .map-deko .deko-moewen { width:5cqw; }
 #screen-islands .map-deko .deko-moewen-a { left:54%; top:11%; }
 #screen-islands .map-deko .deko-moewen-b { left:29%; top:58%; }
 #screen-islands .map-deko .deko-wellen { display:none; }
}
@media(orientation:portrait) and (min-width:768px) and (max-width:1199px) {
 #screen-islands .map-deko .deko-kompass { left:4%; top:3%; width:11cqw; }
 #screen-islands .map-deko .deko-boot-a { left:83%; top:6%; width:7cqw; }
 #screen-islands .map-deko .deko-boot-b { left:6%; top:85%; width:7cqw; }
 #screen-islands .map-deko .deko-wal { left:80%; top:88%; width:10cqw; }
 #screen-islands .map-deko .deko-moewen-a { left:21%; top:18%; width:8cqw; }
 #screen-islands .map-deko .deko-moewen-b { left:45%; top:73%; width:8cqw; }
}
