/* ============================================================
   LumaMed — Hi-Fi stylesheet (LumaMed Design System)
   Creme field · Dark Blue type · Clay accents · hairlines
   ============================================================ */

:root {
  --lm-creme: #FFFAF4;
  --lm-dark-blue: #062B51;
  --lm-clay: #D37D62;
  --lm-warm-1: #FFE8B1;
  --lm-warm-2: #FFC08E;
  --lm-warm-3: #FA996F;

  --fg1: var(--lm-dark-blue);
  --fg2: rgba(6, 43, 81, 0.72);
  --fg3: rgba(6, 43, 81, 0.66);
  --fg-on-dark: var(--lm-creme);
  --fg-on-dark-2: rgba(255, 250, 244, 0.72);
  --hair: rgba(6, 43, 81, 0.16);
  --hair-strong: var(--lm-dark-blue);

  /* --- V2 DEPTH: surfaces (warm, never pure #fff) --- */
  --surface-0: #FFFAF4;
  --surface-1: #FFFDFA;
  --surface-2: #FFFEFC;
  --surface-card: #FBF4EC;
  --surface-sunken: #FBF3E9;
  --surface-dark: #062B51;
  --surface-dark-raised: #0A335E;

  /* --- V2 DEPTH: borders (functional edges >=3:1) --- */
  --hairline-soft: 1px solid rgba(6, 43, 81, 0.10);
  --hairline: 1px solid rgba(6, 43, 81, 0.14);
  --hairline-strong: 1px solid rgba(6, 43, 81, 0.20);
  --hairline-on-dark: 1px solid rgba(255, 250, 244, 0.12);

  /* --- V3 Tandem: elevation (flat default; subtle resting / hover lift) --- */
  --elev-1: 0 1px 4px rgba(6,43,81,0.05);
  --elev-2: 0 4px 12px rgba(6,43,81,0.15);
  --elev-3: 0 4px 8px rgba(6,43,81,0.06), 0 16px 40px rgba(6,43,81,0.10);
  --elev-4: 0 8px 16px rgba(6,43,81,0.08), 0 32px 64px rgba(6,43,81,0.12);

  /* --- V3 Tandem: radius (cards/media/pills = 20) --- */
  --r-sm: 8px; --r-md: 16px; --r-lg: 20px; --r-xl: 32px;

  /* --- V2 MOTION --- */
  --dur-fast: 160ms; --dur-base: 320ms; --dur-slow: 560ms;

  /* Headerhöhe als Token: der Overlay-Hero zieht sich exakt um diesen Wert nach
     oben, und das Mobilmenü setzt darunter an. Nirgends 74px hart eintippen —
     sonst driften Leiste, Hero-Versatz und Menü auseinander. */
  --hd-h: 74px;
  --ease-standard: cubic-bezier(0.4, 0, 0.2, 1);
  --ease-entrance: cubic-bezier(0.16, 1, 0.3, 1);
  --ease-exit: cubic-bezier(0.4, 0, 1, 1);

  --font-sans: "Arimo", system-ui, -apple-system, "Segoe UI", Helvetica, Arial, sans-serif;
  --font-mono: "JetBrains Mono", ui-monospace, "SFMono-Regular", Menlo, monospace;

  /* Zeilenabstaende nach Textsorte (Agentur-Feedback 07/2026). Vorher lagen
     19 verschiedene Werte im Stylesheet, 15px allein kam mit fuenf davon vor. */
  --lh-read: 1.6;   /* lange Lesestrecken: Artikel, Impressum, Datenschutz, FAQ */
  --lh-body: 1.4;   /* Marketing-Fliesstext und UI */
  --lh-snug: 1.3;   /* kleine Titel, mehrzeilige Labels */

  /* Display-Stufen (Agentur-Feedback 07/2026). Vorher hatten die Ueberschriften
     14 verschiedene clamp()-Definitionen und 8 verschiedene Zeilenabstaende —
     jede Komponente brachte ihre eigene mit. Neue Titel nehmen eine dieser
     Stufen; keine neuen Einzelwerte. */
  --t-d1: clamp(40px, 5.4vw, 74px);  /* Hero-Titel */
  --t-d2: clamp(32px, 4vw, 56px);    /* Sektionstitel */
  --t-d3: clamp(28px, 3.2vw, 44px);  /* grosse Komponententitel */
  --t-d4: clamp(22px, 2.2vw, 30px);  /* Karten- und Schritt-Titel */
  --t-d5: clamp(19px, 1.8vw, 24px);  /* kleine Titel */
  --lh-d1: 1.06;  /* sehr grosse Zeilen */
  --lh-d2: 1.12;  /* Standard-Ueberschrift */
  --lh-d3: 1.2;   /* kleine Titel */

  --sp-xs: 8px; --sp-sm: 16px; --sp-md: 24px; --sp-lg: 32px;
  --sp-xl: 48px; --sp-xxl: 60px; --sp-section: 80px;
  --gut: 64px;
  --maxw: 1200px;
  --ease: cubic-bezier(0.2, 0.6, 0.2, 1);
}

* { box-sizing: border-box; }
html { scroll-behavior: smooth; }
body {
  margin: 0;
  /* Review-Guard: nichts darf die Seite horizontal aufblähen (Marquees, Off-Canvas,
     Transforms). `clip` statt `hidden`, weil es keinen Scroll-Container erzeugt —
     `overflow-y` bleibt `visible` und der sticky Header damit unangetastet.
     Achtung: das hier kaschiert Überläufe, es behebt sie nicht. Es gibt deshalb
     nie einen horizontalen Scrollbalken; zu breite Inhalte werden am Rand
     stillschweigend abgeschnitten. Wer hier etwas ändert, prüft vorher 390/834/
     1280/1512px. (Bis 07/2026 stand am Ende des Blocks ein zweites
     `overflow-x: hidden`, das diese Zeile überschrieben hat.) */
  overflow-x: clip;
  background: var(--lm-creme);
  color: var(--fg1);
  font-family: var(--font-sans);
  font-size: 18px;
  line-height: var(--lh-body);
  -webkit-font-smoothing: antialiased;
  text-rendering: optimizeLegibility;
}
img { display: block; max-width: 100%; }
::selection { background: var(--lm-dark-blue); color: var(--lm-creme); }
/* V2 focus: 2px Dark Blue, offset 2px (WCAG 2.4.13, >=3:1) */
:focus-visible { outline: 2px solid var(--lm-dark-blue); outline-offset: 2px; }
html { scroll-padding-top: 92px; }
/* V2 §7: thin tinted scrollbar */
* { scrollbar-width: thin; scrollbar-color: rgba(6,43,81,.25) transparent; }
::-webkit-scrollbar { width: 10px; height: 10px; }
::-webkit-scrollbar-thumb { background: rgba(6,43,81,.25); border-radius: 999px; border: 3px solid transparent; background-clip: padding-box; }
::-webkit-scrollbar-track { background: transparent; }
/* V2 §12: skip-link to main content */
.skip { position: fixed; top: 10px; left: 10px; z-index: 2000; background: var(--lm-dark-blue); color: var(--lm-creme); padding: 12px 20px; border-radius: 999px; font-family: var(--font-mono); font-size: 13px; text-decoration: none; transform: translateY(-160%); transition: transform .2s var(--ease-standard); }
.skip:focus-visible { transform: translateY(0); }
/* V2 §7: mobile sticky booking CTA — deaktiviert (kein Floating-CTA, überall) */
.mcta { display: none !important; }
/* V2 §6: gate moving gradient on phones */
@media (max-width: 680px) {
  [data-grad="drift"] body { animation: none !important; }
  .hero { margin: 0; border-radius: 0; }
}
/* sticky-header offset for in-page anchors */
[id] { scroll-margin-top: 92px; }

/* ---------- type helpers ---------- */
.h-xl { font-family: var(--font-sans); font-weight: 500; font-size: var(--t-d1); line-height: var(--lh-d1); letter-spacing: 0; margin: 0; text-wrap: balance; }
.h-lg { font-family: var(--font-sans); font-weight: 500; font-size: var(--t-d2); line-height: var(--lh-d2); letter-spacing: 0; margin: 0; text-wrap: balance; }
/* Zeilenabstand 1.4 statt 1.55 (Agentur-Feedback 07/2026) — setzt den Satz
   strammer. Gilt fuer alle Stellen, die vorher 1.55 hatten. Der lange
   Lesetext in Artikeln und Rechtstexten behaelt bewusst seine 1.6: dort
   stehen seitenlange Absaetze, die eng gesetzt anstrengend werden. */
.body { font-family: var(--font-sans); font-weight: 400; font-size: 18px; line-height: var(--lh-body); color: var(--fg2); margin: 0; }
.body-lg { font-size: clamp(19px, 1.5vw, 22px); line-height: var(--lh-body); color: var(--fg2); margin: 0; }
.kicker { font-family: var(--font-mono); font-weight: 400; font-size: 12px; letter-spacing: .04em; text-transform: lowercase; color: var(--lm-dark-blue); display: inline-flex; align-items: center; gap: 8px; margin: 0; background: rgba(211,125,98,.14); border-radius: 6px; padding: 6px 12px; width: max-content; }
.kicker::before { content: ""; width: 6px; height: 6px; border-radius: 50%; background: var(--lm-clay); }
.mono-meta { font-family: var(--font-mono); font-weight: 200; font-size: 13px; color: var(--fg3); }

/* ---------- Pillen · ein Primitiv statt sechs Einzelfällen (Agentur-Feedback 07/2026) ----------
   Vorher waren es sechs Bauteile mit vier Höhen (15/25/32/35px), drei
   Strichstärken (200/300/400), drei Radien und fünf Innenabständen. Das war
   zugleich das Barrierefreiheits- und das Gestaltungsproblem.

   **Der Kern der Lösung („Ton"):** jeder Status hat eine getönte Füllung und
   dazu eine eigens nachgerechnete Schriftfarbe im selben Farbton, plus einen
   6px-Punkt. Gemessen auf allen drei hellen Flächen (Creme, Karte,
   `--surface-1`) liegt der schlechteste Textwert bei **5,36:1**, der
   schlechteste Punkt bei 3,00:1.
   **Achtung beim Erweitern:** jeder neue Ton braucht ein eigenes geprüftes
   Paar aus Füllung und Schriftfarbe — die Füllungen sind halbtransparent,
   es zählt also der zusammengerechnete Grund, nicht der Farbwert. Wer einen
   Ton ergänzt, ohne zu messen, baut die Beanstandung wieder ein.

   **Pillen auf Fotos tragen ihre eigene Unterlage.** Vorher lag `.hero__badge`
   auf einem 12%-Creme-Schleier und `.lead__playtag` auf gar nichts: ihre
   Lesbarkeit hing am Motiv, und Motive werden getauscht. `rgba(6,43,81,.72)`
   misst selbst über *reinem Weiss* noch 5,7:1 und über Schwarz 16:1, ist also
   motivunabhängig. **Wer den Wert senkt, nimmt genau diese Garantie weg.**

   Gewicht 300, nicht 200: bei 11px Mono trägt der Kontrastwert allein nicht
   (`.pcard__tag`-Lehre). `.kform__chip` ist bewusst NICHT auf 11px verkleinert,
   es ist ein Bedienelement und behält seine Antippfläche. */
.loctile__status, .hero__badge, .lead__playtag, .drawer__chip {
  display: inline-flex; align-items: center; gap: 8px;
  font-family: var(--font-mono); font-weight: 300; font-size: 11px;
  letter-spacing: .06em; text-transform: uppercase;
  padding: 6px 12px; border-radius: 999px; border: 1px solid transparent;
  width: max-content; white-space: nowrap;
}
/* auf hellem Grund: getönte Füllung + Schriftfarbe im selben Ton.
   Neutral ist der Standard, den `.drawer__chip` und jede Pille ohne Status trägt. */
.loctile__status, .drawer__chip {
  background: rgba(6,43,81,.07); color: #2C4763; --dot: #5B7A99;
}
.loctile__status.open { background: rgba(46,110,74,.13); color: #2C5B41; --dot: #3E7C5A; }
.loctile__status.soon { background: rgba(150,110,20,.15); color: #6E560F; --dot: #9E7C1E; }
.loctile__status.booked { background: rgba(150,50,38,.13); color: #8E3428; --dot: #B04434; }
/* auf Fotos */
.hero__badge, .lead__playtag {
  background: rgba(6,43,81,.72); color: var(--lm-creme); border-color: rgba(255,250,244,.22);
}
/* Statuspunkt — trägt die Farbe, das Wort steht daneben, also nie allein
   bedeutungstragend (WCAG 1.4.1). */
.loctile__status::before, .hero__badge::before {
  content: ""; width: 6px; height: 6px; border-radius: 50%; background: var(--dot); flex: none;
}
/* Auf dem Foto dieselbe Semantik, nur aufgehellt. „ausgebucht" war hier vorher
   gelb wie „demnächst" — auf dem Hub ist es rot. Gleicher Status, gleiche Farbe. */
.hero__badge { --dot: #7FD3A0; }
.hero__badge--soon { --dot: #F1C24E; }
/* #F09184 lag über einem weissen Motiv nur bei 2,57:1 — die Punkte halten
   mindestens 3:1 zum Pillengrund (WCAG 1.4.11), gemessen im ungünstigsten Fall
   „Foto ist weiss". Pflicht wäre es nicht, weil das Wort danebensteht und die
   Bedeutung trägt, aber ein Punkt, den man nicht sieht, kann auch weg. */
.hero__badge--booked { --dot: #FFA093; }

/* ---------- layout ---------- */
.wrap { max-width: var(--maxw); margin: 0 auto; padding: 0 var(--gut); }
.section { padding: var(--sp-section) 0; }
.sec-head { display: flex; justify-content: space-between; align-items: flex-end; gap: var(--sp-xl); padding-bottom: var(--sp-lg); margin-bottom: var(--sp-xxl); }
/* Abstand Überschrift → Fließtext: 32px (--sp-lg), vorher 22px (Agentur-Feedback
   07/2026). Eine Überschrift OHNE Fließtext hat 92px Luft nach unten (32 padding
   + 60 margin), mit Fließtext waren es nur 22px — bei 47–56px Schriftgröße also
   0,4× der Schriftgröße, der Text klebte an der Überschrift. 22px lag ausserdem
   neben der Abstandsskala (8/16/24/32/48/60). Mobil gilt weiter --m-title-gap. */
.sec-head__intro { flex: 1; min-width: 0; max-width: none; display: grid; gap: var(--sp-lg); }
/* Sektionsueberschriften laufen wieder ueber die volle Textspalte (Entscheidung
   Till, 07/2026). Damit ist der Deckel aus dem Agentur-Feedback („Ueberschriften
   sollten nicht ueber den gesamten Raum laufen, bei der Schriftgroesse maximal
   660px") zurueckgenommen — er stand zwischenzeitlich auf 660px, dann 820px,
   zuletzt 940px, und wurde in jeder Runde weiter aufgemacht, weil die Bloecke
   als zu eng empfunden wurden. Statt einer vierten Zwischenzahl faellt er ganz.
   Es gilt wieder „Headlines full-width": die Textspalte misst 1072px (--maxw
   1200 minus 2x --gut), dort endet die Ueberschrift.
   WER IHN WIEDER SETZT, braucht auch `text-wrap` (siehe unten) — die beiden
   haengen zusammen und nur eines von beiden zu aendern erklaert das Ergebnis
   nicht. */
/* `text-wrap: pretty` statt des geerbten `balance` aus .h-lg (07/2026).
   DIESE REGEL TRAEGT JETZT DAS FULL-WIDTH-VERHALTEN, nicht mehr nur eine
   Feinheit neben dem Deckel: `balance` setzt moeglichst gleich lange Zeilen,
   statt die verfuegbare Breite zu fuellen, und hoerte deshalb weit vor der
   Spaltenkante auf. Gemessen bei 1512px, Box jeweils 820px breit:
     „Das 360° Fruehwarnsystem …"  balance 566px → pretty 712px, beide 2 Zeilen
     „Wir beginnen mit der …"      balance 517px → pretty 639px, beide 3 Zeilen
   Also 120–150px zurueck, ohne eine einzige zusaetzliche Zeile. Wuerde man hier
   auf `balance` zurueckfallen, saehen die Ueberschriften trotz entferntem
   Deckel wieder eng aus, und die naechste Runde suchte den Fehler bei der
   Breite. Bewusst auf .sec-head__intro begrenzt und nicht in .h-lg geaendert —
   Hero- und Blog-Titel behalten `balance`, dort ist die ruhige Silhouette
   gewollt und es steht kein Grid daneben, an dem sich die Zeile messen muesste. */
.sec-head__intro h1, .sec-head__intro h2 { text-wrap: pretty; }
/* Der Einleitungsabsatz laeuft ebenfalls voll, der 62ch-Deckel ist mit dem der
   Ueberschriften gefallen (Entscheidung Till, 07/2026). Bewusst in Kauf
   genommen: bei 1072px Spaltenbreite sind das rund 130 Zeichen pro Zeile
   gegenueber der lesbaren Spanne 45–75.
   Die 20px bleiben, obwohl sie urspruenglich nur dazu dienten, den 62ch-Deckel
   breiter zu machen. Sie sind jetzt der einzige Hebel, der die Zeile ueberhaupt
   noch kuerzt: bei 18px waeren es rund 145 Zeichen. Wer hier auf 18px
   zurueckgeht, macht die Zeile also laenger, nicht kuerzer.
   ACHTUNG falls doch wieder ein `ch`-Wert gesetzt wird: `ch` ist in Arimo NICHT
   die mittlere Zeichenbreite. 1ch (die Breite der Ziffer 0) misst bei 18px
   10,02px, ein durchschnittliches Zeichen deutscher Prosa aber nur 8,26px.
   62ch sind gemessene 75 Zeichen pro Zeile, nicht 62.
   Der Deckel stand vor 07/2026 als inline `max-width` auf jedem einzelnen
   Absatz (62ch/64ch/60ch, je nach Seite). Diese inline-Styles sind entfernt und
   sollten nicht zurueckkommen — Inline schlaegt Stylesheet, ein einzelner
   Absatz mit eigener Breite faellt aus der Reihe und ist schwer zu finden. */
.sec-head__intro .body { font-size: 20px; }
.sec-head .kicker { margin-bottom: 4px; }
.team-hero-photo { display: none; }

/* ---------- buttons (squared, solid dark-blue) ---------- */
.btn { font-family: var(--font-sans); font-size: 16px; font-weight: 500; padding: 14px 28px; border: 1px solid var(--lm-dark-blue); background: var(--lm-dark-blue); color: var(--lm-creme); cursor: pointer; text-decoration: none; display: inline-flex; align-items: center; gap: 10px; border-radius: var(--r-sm); transition: transform var(--dur-fast) var(--ease-standard), box-shadow var(--dur-fast) var(--ease-standard), background var(--dur-fast) var(--ease-standard), color var(--dur-fast) var(--ease-standard), border-color var(--dur-fast) var(--ease-standard); white-space: nowrap; }
/* Hover = anheben + eine Spur heller (Agentur-Feedback 07/2026).
   Vorher lief der Hover über `opacity: .88` plus --elev-1 — einen Schatten mit
   5 % Alpha, also praktisch unsichtbar. Deckkraft ist zudem der falsche Kanal:
   darüber läuft auch `.btn[disabled]`, der Hover schob den Button optisch also
   Richtung „deaktiviert" statt Richtung „aktiv". Auf dem Hero-Foto sah er
   dadurch blass aus statt angefasst.
   `@media (hover: hover)`: ohne das bleibt der Effekt auf Telefonen nach dem
   Antippen kleben, weil Touch-Browser :hover bis zum nächsten Tap halten. */
@media (hover: hover) {
  .btn:hover { transform: translateY(-2px); box-shadow: var(--elev-2); background: var(--surface-dark-raised); border-color: var(--surface-dark-raised); }
  /* Deaktivierte Buttons heben nicht ab. */
  .btn[disabled]:hover { transform: none; box-shadow: none; background: var(--lm-dark-blue); border-color: var(--lm-dark-blue); }
}
.btn:active { transform: translateY(0); box-shadow: var(--elev-1); }
.btn--ghost { background: var(--lm-dark-blue); color: var(--lm-creme); border-color: var(--lm-dark-blue); }
.btn--sm { padding: 9px 18px; font-size: 14px; }

/* ---------- header (V2 glass overlay-light, level-3) ---------- */
/* Randlos: keine Unterkante, kein Schatten (Agentur-Feedback 07/2026).
   Der Header trennt sich allein über Blur + Creme-Schleier vom Inhalt. Die
   Hairline plus --elev-3 (zwei gestapelte Schatten bis 40 px Radius) legten
   eine sichtbare Kante quer über das Hero-Bild — der Header sass wie eine
   aufgeklebte Leiste davor, statt darauf zu schweben.
   Beim Hinzufügen neuer Header-Zustände (scrolled o. Ä.) nicht wieder
   Rahmen/Schatten einführen. */
.hd { position: sticky; top: 0; z-index: 100; background: rgba(255,250,244,.72); backdrop-filter: blur(16px); -webkit-backdrop-filter: blur(16px); transition: background var(--dur-base) var(--ease-standard), backdrop-filter var(--dur-base) var(--ease-standard); }
.hd__in { display: flex; align-items: center; justify-content: space-between; gap: var(--sp-lg); height: var(--hd-h); }
/* Es war nur die Höhe gesetzt. Wird der Platz im Header knapp, staucht Flexbox
   ein <img> dann in der Breite — der Schriftzug wurde bei 390px um 33 %, bei
   360px um 50 % zusammengedrückt. object-fit hält das Seitenverhältnis: reicht
   der Platz nicht, skaliert das Logo proportional herunter statt sich zu
   verzerren, und bleibt dabei linksbündig. */
.hd__logo { height: 19px; object-fit: contain; object-position: left center; transition: opacity var(--dur-fast) var(--ease-standard); }
@media (hover: hover) {
  /* Das Logo ist der Home-Link — bekam als einziges Element im Header nie eine
     Rueckmeldung. Hier ist Deckkraft in Ordnung: ein Link hat keinen
     Deaktiviert-Zustand, mit dem sie kollidieren koennte. */
  .hd__in a:hover .hd__logo { opacity: .7; }
}
.hd__nav { display: flex; gap: var(--sp-lg); }
/* Active/hover-Unterstrich: 1.5px + mehr Luft unter der Baseline, sonst klebt
   die Linie an den Glyphen und der aktuelle Tab geht unter. */
.hd__nav a { font-size: 15px; color: var(--fg1); text-decoration: none; padding: 6px 0 8px; border-bottom: 1.5px solid transparent; transition: border-color .18s var(--ease), color var(--dur-base) var(--ease-standard); }
.hd__nav a:hover, .hd__nav a.on { border-bottom-color: var(--lm-dark-blue); }

.hd__right { display: flex; align-items: center; gap: var(--sp-md); }
/* Burger ohne Rahmen — die umrandete 40×40-Box war der einzige harte Chrome
   in der sonst randlosen Leiste. Hit-Area bleibt 40×40, Hover nur weiche Fläche. */
.hd__burger { display: none; width: 40px; height: 40px; border: 0; border-radius: var(--r-sm); background: transparent; flex-direction: column; justify-content: center; gap: 5px; cursor: pointer; padding: 0; }
.hd__burger span { height: 1.5px; background: var(--lm-dark-blue); margin: 0 10px; border-radius: 1px; }

/* ---------- Overlay-Header über Vollbild-Heroes (Agentur-Feedback 07/2026) ----------
   Nur die Kante zu entfernen hat das Problem nicht gelöst: die Leiste belegte
   weiter ihr eigenes Creme-Band ÜBER dem Video, also blieb eine harte
   Horizontale, wo Creme auf Bild trifft. Jetzt beginnt das Video ganz oben und
   läuft unter der Leiste durch — erst dadurch macht das Blur überhaupt Sinn.

   **Opt-in über `data-hdoverlay` am `<html>`-Tag**, nicht über `:has(.hero)`:
   es hängt nicht am Vorhandensein eines Elements, sondern daran, ob der Hero
   dieser Seite dunkel genug für creme Navigation ist. Getragen von `.hero`
   (Home, Standorte-Hub, fünf Standort-Seiten), `.khero` (beide Karriere-Seiten)
   und `.checkhero` (Prozess). Seiten ohne das Attribut behalten die Glasleiste —
   dort steht Creme auf Creme, da gibt es keine Kante zu vermeiden.

   Das Attribut steht **statisch im Markup** (wie die Tweak-`data-*`), damit schon
   der erste Paint stimmt, ganz ohne JS — kein Aufblitzen. Auf Prozess hält
   `hifi-common.js` es zusätzlich mit der aktiven Hero-Variante synchron: nur die
   Bild-Varianten `a`/`c` sind dunkel, `b`/`d`/`e` sind helle Split-Layouts, auf
   denen creme Navigation unlesbar wäre.

   **Neue Seite mit dunklem Vollbild-Hero? `data-hdoverlay` ans `<html>`** — und
   vorher den Kontrast der Navigation über dem Bild messen (siehe Schleier unten).

   Steht bewusst NACH den Grundregeln von .hd/.hd__nav/.hd__burger: es sind
   Überschreibungen, und sie sollen auch unter ihnen stehen. (Sie gewännen zwar
   ohnehin über die Spezifität — aber Regeln, die oberhalb dessen stehen, was sie
   überschreiben, liest beim nächsten Mal niemand richtig.)

   Der Default ist bewusst der transparente Zustand; `hifi-reveal.js` setzt beim
   Verlassen des Heroes nur `.hd--solid` — eine Klasse mehr in der Spezifität, die
   Regel gewinnt also verlässlich gegen den Default. */
html[data-hdoverlay] .hero, html[data-hdoverlay] .khero, html[data-hdoverlay] .checkhero, html[data-hdoverlay] .kihero { margin-top: calc(-1 * var(--hd-h)); }
html[data-hdoverlay] .hd { background: transparent; backdrop-filter: none; -webkit-backdrop-filter: none; }
/* Das Logo liegt als SVG vor, dessen Farbe von aussen nicht ansprechbar ist —
   der Filter macht die dunkle Wortmarke weiss. Auf dem abgedunkelten Video ist
   Weiss von Creme nicht unterscheidbar, ein zweites <img> lohnt dafür nicht. */
html[data-hdoverlay] .hd__logo { filter: brightness(0) invert(1); }
html[data-hdoverlay] .hd__nav > a,
html[data-hdoverlay] .hd__nav .has-drop > a { color: var(--lm-creme); text-shadow: 0 1px 18px rgba(6,43,81,.55); }
/* `.has-drop > a.on` muss mit in die Liste. Auf den Karriere-Seiten ist der
   aktive Punkt kein direktes Kind von `.hd__nav`, sondern liegt im Dropdown-
   Wrapper (`<div class="has-drop"><a class="on">Karriere</a>`). `> a.on` traf ihn
   deshalb nicht, er fiel auf die Grundregel `.hd__nav a.on` zurück und bekam
   dunkelblau — auf dem dunklen Hero-Foto praktisch unsichtbar. Standorte war nie
   betroffen, dort ist der aktive Punkt ein direktes Kind.
   Beim Hinzufügen neuer Zustände beide Formen bedenken: direktes Kind UND
   `.has-drop > a`. Die Hover-Zeile hatte das schon, die Aktiv-Zeile nicht. */
html[data-hdoverlay] .hd__nav > a:hover,
html[data-hdoverlay] .hd__nav > a.on,
html[data-hdoverlay] .hd__nav .has-drop > a:hover,
html[data-hdoverlay] .hd__nav .has-drop > a.on { border-bottom-color: var(--lm-creme); }
/* Tastaturfokus ebenfalls creme. Der globale Ring (`:focus-visible`, dunkelblau)
   steht auf dem transparenten Header über dem dunklen Foto fast unsichtbar.
   Ring bleibt zusätzlich zur Unterkante: 1,5px Linie allein ist als Fokus-
   Anzeige zu schwach (WCAG 2.4.11). */
html[data-hdoverlay] .hd__nav > a:focus-visible,
html[data-hdoverlay] .hd__nav .has-drop > a:focus-visible {
  outline-color: var(--lm-creme); border-bottom-color: var(--lm-creme);
}
html[data-hdoverlay] .hd__burger span { background: var(--lm-creme); }
/* Termin-Button im transparenten Zustand: Creme-Füllung mit dunkelblauer Schrift.
   Die dunkelblaue Standard-Pille verschwand auf dem abgedunkelten Hero-Video fast
   vollständig — die einzige Kante war der 1px-Rand in derselben Farbe. Umgedreht
   trägt der Knopf seinen eigenen Grund und ist die hellste Fläche der Leiste, also
   auch das erste, was man dort sieht. Gescrollt braucht es keine Regel: dann greift
   wieder `.btn` (creme auf dunkelblau) auf der cremen Glasleiste.
   Ausgenommen bleibt das offene Mobilmenü — das legt eine creme Fläche unter die
   Leiste, ohne `.hd--solid` zu setzen; Creme auf Creme wäre dort unsichtbar.
   Luma KI (`data-mode="dunkel"`) ist ausgenommen: dort steht dieselbe Füllung
   schon in beiden Zuständen (Regel im Dunkelmodus-Block), und `--surface-card`
   ist dunkles Navy statt hellem Creme — der Hover unten würde den Knopf dort
   also verdunkeln statt aufhellen. */
html[data-hdoverlay]:not([data-mode="dunkel"]) body:not(:has(.mobile-menu.open)) .hd:not(.hd--solid) .hd__right .btn {
  background: var(--lm-creme); border-color: var(--lm-creme); color: var(--lm-dark-blue);
}
@media (hover: hover) {
  /* Muss mitgeschrieben werden: `.btn:hover` würde sonst auf die dunkle Füllung
     zurückspringen. Anheben und Schatten kommen weiter von dort. */
  html[data-hdoverlay]:not([data-mode="dunkel"]) body:not(:has(.mobile-menu.open)) .hd:not(.hd--solid) .hd__right .btn:hover {
    background: var(--surface-card); border-color: var(--surface-card); color: var(--lm-dark-blue);
  }
}

/* Zurück zur Glasleiste, sobald gescrollt wird (`hifi-reveal.js` setzt die
   Klasse ab ~48px). Transparent ist damit nur der Ruhezustand ganz oben; in
   Bewegung braucht die Navigation ihren eigenen Grund, weil unter dem Hero
   creme und dunkle Sektionen folgen, auf denen creme Schrift unlesbar wäre.
   Ebenso bei offenem Mobilmenü: das legt eine creme Fläche unter die Leiste. */
html[data-hdoverlay] .hd.hd--solid,
body:has(.mobile-menu.open) .hd { background: rgba(255,250,244,.72); backdrop-filter: blur(16px); -webkit-backdrop-filter: blur(16px); }
html[data-hdoverlay] .hd.hd--solid .hd__logo,
body:has(.mobile-menu.open) .hd__logo { filter: none; }
html[data-hdoverlay] .hd.hd--solid .hd__nav > a,
html[data-hdoverlay] .hd.hd--solid .hd__nav .has-drop > a,
body:has(.mobile-menu.open) .hd__nav > a { color: var(--fg1); text-shadow: none; }
/* Gescrollt zurück auf Dunkelblau — auch für `.has-drop > a`, sonst gewinnt die
   Creme-Regel von oben und der aktive Karriere-Punkt stünde creme auf der cremen
   Glasleiste. Der Fokusring wird hier ebenfalls wieder dunkelblau (der globale
   Wert), er braucht keine eigene Zeile. */
html[data-hdoverlay] .hd.hd--solid .hd__nav > a:hover,
html[data-hdoverlay] .hd.hd--solid .hd__nav > a.on,
html[data-hdoverlay] .hd.hd--solid .hd__nav .has-drop > a:hover,
html[data-hdoverlay] .hd.hd--solid .hd__nav .has-drop > a.on { border-bottom-color: var(--lm-dark-blue); }
html[data-hdoverlay] .hd.hd--solid .hd__nav > a:focus-visible,
html[data-hdoverlay] .hd.hd--solid .hd__nav .has-drop > a:focus-visible {
  outline-color: var(--lm-dark-blue); border-bottom-color: var(--lm-dark-blue);
}
html[data-hdoverlay] .hd.hd--solid .hd__burger span,
body:has(.mobile-menu.open) .hd__burger span { background: var(--lm-dark-blue); }
/* Offen wird aus dem Burger ein X (Agentur-Feedback 07/2026). Es ist derselbe
   Knopf, mit dem man wieder schliesst — das muss man ihm ansehen, sonst sucht
   man auf dem Telefon nach einem Ausweg aus dem Menue.
   Die Balken liegen 6,5px ausserhalb der Mitte (1,5px hoch, 5px gap), genau um
   diesen Betrag holt sie das translateY zurueck; die mittlere blendet weg. */
.hd__burger span { transition: transform var(--dur-base) var(--ease-standard), opacity var(--dur-fast) var(--ease-standard), background var(--dur-fast) var(--ease-standard); }
body:has(.mobile-menu.open) .hd__burger span:nth-child(1) { transform: translateY(6.5px) rotate(45deg); }
body:has(.mobile-menu.open) .hd__burger span:nth-child(2) { opacity: 0; }
body:has(.mobile-menu.open) .hd__burger span:nth-child(3) { transform: translateY(-6.5px) rotate(-45deg); }
@media (prefers-reduced-motion: reduce) { .hd__burger span { transition: none; } }
/* Burger, Schliessen-Kreuze und Karussell-Pfeile hatten bis 07/2026 gar keinen
   Hover — sie sahen aus wie Dekoration. Weiche Flaeche, kein Rahmen. */
@media (hover: hover) {
  .hd__burger { transition: background var(--dur-fast) var(--ease-standard); }
  .hd__burger:hover { background: rgba(6,43,81,.06); }
  html[data-hdoverlay] .hd:not(.hd--solid) .hd__burger:hover { background: rgba(255,250,244,.12); }
}
/* Burger ab 1000px statt erst ab 820px: dazwischen (Tablet quer, kleine Laptops)
   passten Logo + ausgeschriebenes Menü + Termin-Button nicht nebeneinander —
   die Menüpunkte brachen zweizeilig um und das Logo wurde gestaucht. */
@media (max-width: 1000px) {
  .hd__nav { display: none; }
  .hd__burger { display: flex; }
}

/* ---------- hero (full-bleed video/image, header overlays) ---------- */
/* Höhe = 95vh ohne max-height-Deckel: auf großen Bildschirmen endete der Hero
   sonst bei 920px mitten im Viewport, und man landete auf dem Folgeabschnitt,
   der wegen der Reveal-Schwelle (50 % Viewport) noch leer war. Die Mobil-Höhe
   setzt der 820px-Block weiter unten.

   95vh statt 90vh (Agentur-Feedback 07/2026), seit der Header auf dem Hero liegt:
   vorher begann der Hero unter der 74-px-Leiste und belegte damit `74px + 90vh`
   — auf 950 px Viewport 98 % der Höhe. Seit er bei 0 beginnt, sind es exakt 90 %,
   der Rest-Streifen wuchs von ~20 px auf ~95 px und der Hero verlor sichtbar
   Präsenz. 95vh stellt das her (5 % Rest — 42 px bei 832 px Viewport, 54 px bei
   1080 px) und behält die Absicht: es soll
   etwas hervorschauen, damit klar ist, dass es weitergeht. **Nicht auf 100vh** —
   dann fällt genau dieser Hinweis weg.

   Gilt NUR für `.hero`. Die anderen Bühnen (`.khero__in`, `.kihero`, `.chk`)
   liegen weiter UNTER der Leiste, belegen also schon `74px + 90vh`; mit 95vh
   liefen sie über den Viewport hinaus und hätten gar keinen Rest-Streifen mehr. */
.hero { position: relative; height: 95vh; min-height: 680px; overflow: hidden; border-radius: 0; margin: 0; }
.hero > .wrap, .hero__overlay > .wrap { width: 100%; padding-left: var(--gut); padding-right: var(--gut); }
.hero__img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; object-position: center 30%; z-index: 1; }
/* Das Video liegt über dem Standbild (img.hero__img) und wird erst eingeblendet,
   wenn es wirklich läuft (hifi-home.js setzt .is-playing beim 'playing'-Event).
   Blockiert der Browser das Autoplay (iOS-Stromsparmodus, Daten-Sparmodus),
   bleibt nur das Standbild sichtbar — der System-Play-Button sitzt dann auf dem
   unsichtbaren Video. Direkt ausblenden ließe er sich nicht: modernes iOS kapselt
   die Media-Controls in einem geschlossenen Shadow-DOM. */
video.hero__img { opacity: 0; transition: opacity var(--dur-slow) var(--ease-standard); }
video.hero__img.is-playing { opacity: 1; }
/* Gestaltetes 9:16-Poster (hifi-home.js setzt die Klasse beim Fallback-Wechsel):
   auf Telefonen unten ausrichten, damit Gesicht und Kinn vollständig sichtbar
   sind — der Himmel oben gibt nach, nicht das Gesicht. */
@media (max-width: 600px) {
  img.hero__img--poster { object-position: center bottom; }
}
/* Bodenabstand der Hero-Inhalte = 96px, einheitlich über alle vier Bühnen
   (`.hero` Home + Standorte, `.chk--a .chk__in` Prozess, `.khero__in` Karriere).
   Vorher standen dort 48 / 56 / 64px — drei gewachsene Zahlen ohne gemeinsamen
   Grund; der Text klebte sichtbar am unteren Rand. Beim Ändern alle vier
   mitziehen, sonst driften die Bühnen wieder auseinander.
   ACHTUNG Kontrast: der Text wandert damit in einen helleren Teil des
   Boden-Verlaufs. Für die Home-Video-Bühne ist die Deckkraft dort nachgemessen
   (siehe Kommentar am Verlauf) — wer weiter hochzieht, misst neu. */
.hero__overlay { position: relative; z-index: 3; height: 100%; display: flex; flex-direction: column; justify-content: flex-end; padding-bottom: 96px; }
/* ---------- EIN Schleier-System für alle Foto-Heroes ----------
   Agentur-Feedback 07/2026: „Nicht ganz klar nach welchem System Heroelemente
   zusätzliche Farbverläufe bekommen und wann nicht. Im Zweifel mit Gradient
   für Lesbarkeit." Es gab zwei Rezepturen nebeneinander: Home und Standorte
   liefen unten auf .45 aus, Karriere und Prozess auf .84. Ergebnis: die einen
   zu schwach (creme Titel auf dem hellsten Prozent der Textzone nur 2,8:1,
   unter der 3:1-Schwelle), die anderen sichtbar zugeschleiert.

   Jetzt eine Rezeptur, zwei Lagen mit klarer Aufgabe:
   --hero-scrim-nav  trägt die Navigation, läuft knapp unter der Leiste aus,
                     damit keine harte Kante entsteht.
   --hero-scrim-text trägt Titel und Unterzeile, hält unten ein Plateau und
                     gibt die Bildmitte wieder frei.

   Gemessen auf dem hellsten Prozent der jeweiligen Textzone (p99-Pixel):
   Titel 3,2–4,0:1 im oberen Teil des Textblocks (Schwelle 3:1 für grosse
   Schrift), Unterzeile 4,5–5,0:1 weiter unten (Schwelle 4,5:1). Wer die
   Stops ändert, misst bitte nach — die Fotos sind an der Textkante hell
   (p99-Pixel: Home 251/235/236, Standorte 243/244/241, Prozess 231/219/208). */
:root {
  --hero-scrim-nav: linear-gradient(to bottom, rgba(6,43,81,.68) 0, rgba(6,43,81,.52) calc(var(--hd-h) * .95), rgba(6,43,81,.22) calc(var(--hd-h) * 1.9), transparent calc(var(--hd-h) * 3.1));
  --hero-scrim-text: linear-gradient(to top, rgba(6,43,81,.68) 0%, rgba(6,43,81,.62) 22%, rgba(6,43,81,.50) 42%, rgba(6,43,81,.24) 64%, rgba(6,43,81,.06) 84%, transparent 100%);
}
.hero__overlay::before { content: ""; position: absolute; inset: 0; z-index: -1; background: var(--hero-scrim-nav), var(--hero-scrim-text); }

/* Home-Video-Hero: leichter Nav-Streifen + Boden-Verlauf für die Headline.
   Ohne Boden-Verlauf bestand über 34 Frames kein einziger die 3:1-Schwelle
   (schlechtester 1,0:1) — Motiv: helle Praxis, grosse Fenster, weisse Wände.
   Ein gestaffelter Textschatten war als Alternative verworfen (dunkler Fleck
   hinter den Wörtern). Der Boden-Verlauf startet bei .55 (Messminimum für alle
   34 Frames; bei .50 fielen noch 16 durch) und bleibt damit leichter als das
   gemeinsame `--hero-scrim-text` (.68), damit das Video so offen wie möglich
   bleibt. Nav-Streifen bewusst unter der früheren .82-Rezeptur (.68/.52/.18,
   kürzerer Auslauf), damit oben mehr Video durchkommt — Textschatten der
   Nav-Links trägt den Rest. Beim Video-Tausch neu über Frames messen —
   nicht am Standbild (`hero-home-frame.webp` ist ein heller Ausreisser). */
.hero:has(video.hero__img) .hero__overlay::before {
  background:
    linear-gradient(to bottom, rgba(6,43,81,.68) 0, rgba(6,43,81,.52) calc(var(--hd-h) * .85), rgba(6,43,81,.18) calc(var(--hd-h) * 1.55), transparent calc(var(--hd-h) * 2.3)),
    linear-gradient(to top, rgba(6,43,81,.55) 0%, rgba(6,43,81,.48) 22%, rgba(6,43,81,.32) 42%, rgba(6,43,81,.14) 64%, rgba(6,43,81,.04) 84%, transparent 100%);
}
.hero:has(video.hero__img) .hero__foot .greview__txt {
  text-shadow: 0 1px 2px rgba(6,43,81,.90), 0 2px 10px rgba(6,43,81,.80);
}
.hero__head { max-width: 660px; }
.hero__title { color: var(--lm-creme); margin: 0; text-shadow: 0 1px 28px rgba(6,43,81,.4); }
.hero__foot { margin-top: 28px; display: flex; align-items: flex-start; }

/* ---------- google review badge (V2: raised surface + level-1) ---------- */
.greview { display: inline-flex; align-items: center; gap: 14px; text-decoration: none; background: var(--surface-2); border: var(--hairline); border-radius: var(--r-sm); padding: 12px 18px; box-shadow: var(--elev-1); transition: box-shadow var(--dur-fast) var(--ease-standard); }
.greview:hover { box-shadow: var(--elev-2); }
/* Home-Hero Google-Bewertung: transparente Variante (nur Sterne + Text) via Tweak */
html[data-greview="transparent"] .hero__foot .greview { background: transparent; border-color: transparent; box-shadow: none; padding: 0; }
html[data-greview="transparent"] .hero__foot .greview:hover { box-shadow: none; }
html[data-greview="transparent"] .hero__foot .greview__txt { color: var(--lm-creme); font-weight: 700; font-size: 13px; text-shadow: 0 1px 14px rgba(6,43,81,.55); }
html[data-greview="transparent"] .hero__foot .greview__stars { font-size: 21px; letter-spacing: 4px; text-shadow: 0 1px 14px rgba(6,43,81,.45); }
.hero__cta { margin-top: 24px; }
/* Home-Hero CTA-Farbe via Tweak. Standard = `blau` (Agentur-Feedback 07/2026):
   Creme auf Clay erreicht nur 2,9:1 und fällt damit selbst durch die 3:1-Schwelle
   für grosse Schrift; Creme auf Dunkelblau liegt bei 13,7:1. `orange` bleibt im
   Tweak-Panel wählbar, ist aber nicht barrierefrei und darf nicht Default werden. */
html[data-herocta="orange"] .hero .hero__cta .btn { background: var(--lm-clay); border-color: var(--lm-clay); color: var(--lm-creme); }
html[data-herocta="blau"] .hero .hero__cta .btn { background: var(--lm-dark-blue); border-color: var(--lm-dark-blue); color: var(--lm-creme); }
/* Der Hero-CTA setzt seine Füllung mit höherer Spezifität als `.btn:hover` —
   der Hover muss das ebenfalls tun, sonst bliebe nur das Anheben.
   Bewusst NUR für die blaue (Standard-)Variante: bei `orange` würde ein
   hellerer Ton den ohnehin zu schwachen Kontrast (Creme auf Clay = 2,9:1)
   weiter drücken. Dort bleibt es beim Anheben — die Füllung rührt der Hover
   nicht an. */
@media (hover: hover) {
  html[data-herocta="blau"] .hero .hero__cta .btn:hover { background: var(--surface-dark-raised); border-color: var(--surface-dark-raised); }
}
/* ===== Forschung-Frame (03 Forschung) · 5 dunkle Varianten (data-forschung^="d") =====
   Tiefblauer Grund + wandernder warmer Verlauf, der die Farben überlagert → Sonnenaufgang.
   Dark-Blue-Vibe angelehnt an das Luma-KI Dark-Theme. */
/* — gemeinsame dunkle Basis (Text, Bullets, Radar, CTA) — */
html[data-forschung^="d"] section.bg[data-screen-label="03 Forschung"] { position: relative; overflow: hidden; background-color: #051327 !important; }
html[data-forschung^="d"] section[data-screen-label="03 Forschung"] > .wrap { position: relative; z-index: 1; }
html[data-forschung^="d"] section[data-screen-label="03 Forschung"] .h-lg,
html[data-forschung^="d"] section[data-screen-label="03 Forschung"] .body { color: var(--lm-creme); }
html[data-forschung^="d"] section[data-screen-label="03 Forschung"] .clist--feat li { background: rgba(8,24,44,.5) !important; border-color: rgba(244,238,230,.16) !important; color: var(--lm-creme); }
html[data-forschung^="d"] section[data-screen-label="03 Forschung"] .radar {
  background: rgba(5,17,33,.66); border-color: rgba(244,238,230,.2);
  --rd-grid: rgba(255,250,244,.10);
  --rd-spoke: rgba(255,250,244,.07);
  /* .54 ergab auf dem dunklen Panel nur 5,81:1 — formal AA, praktisch aber zu blass
     für 10-12px Mono in Versalien (Agentur-Feedback 07/2026: „schwer zu lesen").
     .66 bringt ~8,2:1, ohne dass die Beschriftung dem Diagramm die Schau stiehlt.
     Gitter und Speichen bleiben bewusst zurückhaltend — die sollen leise bleiben. */
  --rd-label: rgba(255,250,244,.66);
  --rd-risk: rgba(226,110,99,.60);
  --rd-gap: rgba(219,74,61,.20);
  --rd-safe: #6FB874;
  --rd-track: rgba(255,250,244,.16);
  --rd-halo: rgba(211,125,98,.22);
}
html[data-forschung^="d"] section[data-screen-label="03 Forschung"] .radar__year b { color: var(--lm-creme); }
html[data-forschung^="d"] section[data-screen-label="03 Forschung"] .btn { background: var(--lm-creme); border-color: var(--lm-creme); color: var(--lm-dark-blue); }
@media (hover: hover) {
  html[data-forschung^="d"] section[data-screen-label="03 Forschung"] .btn:hover { background: var(--surface-card); border-color: var(--surface-card); }
}
html[data-forschung^="d"] section[data-screen-label="03 Forschung"]::before { content: ""; position: absolute; z-index: 0; pointer-events: none; }

/* 1 · Grid — Sci-Fi-Raster + driftender Sonnenglanz */
html[data-forschung="dgrid"] section.bg[data-screen-label="03 Forschung"] {
  background-image:
    linear-gradient(rgba(165,211,223,.06) 1px, transparent 1px),
    linear-gradient(90deg, rgba(165,211,223,.06) 1px, transparent 1px) !important;
  background-size: 46px 46px, 46px 46px; background-position: center;
}
html[data-forschung="dgrid"] section[data-screen-label="03 Forschung"]::before {
  inset: 0;
  background: radial-gradient(52% 64% at 72% 22%, rgba(255,192,142,.26), rgba(250,153,111,.10) 44%, transparent 72%);
  animation: forschDrift 20s ease-in-out infinite;
}

/* 2 · Sonnenaufgang — warme Sonne steigt von unten über Tiefblau */
html[data-forschung="dsonne"] section.bg[data-screen-label="03 Forschung"] { background-image: linear-gradient(180deg, #04101f 0%, #082745 56%, #0e3a5e 100%) !important; }
html[data-forschung="dsonne"] section[data-screen-label="03 Forschung"]::before {
  left: -10%; right: -10%; bottom: -34%; height: 92%;
  background: radial-gradient(closest-side at 58% 100%, rgba(255,216,128,.5), rgba(250,153,111,.3) 40%, rgba(255,192,142,.12) 60%, transparent 76%);
  animation: forschRise 17s ease-in-out infinite;
}

/* 3 · Aurora — warme + kühle Schleier driften gegenläufig und überlagern sich */
html[data-forschung="daurora"] section[data-screen-label="03 Forschung"]::before {
  inset: -25% -15%;
  background: radial-gradient(42% 52% at 32% 30%, rgba(255,192,142,.24), transparent 62%);
  animation: forschDriftA 22s ease-in-out infinite;
}
html[data-forschung="daurora"] section[data-screen-label="03 Forschung"]::after {
  content: ""; position: absolute; z-index: 0; pointer-events: none; inset: -25% -15%;
  background: radial-gradient(46% 56% at 74% 66%, rgba(165,211,223,.2), transparent 62%);
  animation: forschDriftB 26s ease-in-out infinite;
}

/* 4 · Halo — großer warmer Lichthof hinter dem Radar, atmend */
html[data-forschung="dhalo"] section[data-screen-label="03 Forschung"]::before {
  right: -8%; top: 50%; width: 72%; height: 130%;
  background: radial-gradient(closest-side, rgba(255,201,140,.3), rgba(250,153,111,.12) 46%, transparent 72%);
  animation: forschBreathe 15s ease-in-out infinite;
}

/* 5 · Lichtsweep — diagonales warmes Band wandert über das Tiefblau */
html[data-forschung="dsweep"] section.bg[data-screen-label="03 Forschung"] { background-image: linear-gradient(165deg, #04101f 0%, #072441 60%, #0b3357 100%) !important; }
html[data-forschung="dsweep"] section[data-screen-label="03 Forschung"]::before {
  top: -25%; bottom: -25%; left: -20%; width: 55%;
  background: linear-gradient(100deg, transparent, rgba(255,201,140,.1) 28%, rgba(250,153,111,.28) 50%, rgba(255,201,140,.1) 72%, transparent);
  filter: blur(8px);
  animation: forschSweep 16s ease-in-out infinite;
}

@keyframes forschDrift { 0%,100%{transform:translate(0,0) scale(1)} 50%{transform:translate(-4%,3%) scale(1.07)} }
@keyframes forschRise { 0%,100%{transform:translateY(14%);opacity:.72} 50%{transform:translateY(-6%);opacity:1} }
@keyframes forschDriftA { 0%,100%{transform:translate(0,0)} 50%{transform:translate(12%,9%)} }
@keyframes forschDriftB { 0%,100%{transform:translate(0,0)} 50%{transform:translate(-13%,-7%)} }
@keyframes forschBreathe { 0%,100%{transform:translateY(-50%) scale(1);opacity:.82} 50%{transform:translateY(-50%) scale(1.12);opacity:1} }
@keyframes forschSweep { 0%,100%{transform:translateX(-15%)} 50%{transform:translateX(135%)} }
@media (prefers-reduced-motion: reduce) {
  html[data-forschung^="d"] section[data-screen-label="03 Forschung"]::before,
  html[data-forschung^="d"] section[data-screen-label="03 Forschung"]::after { animation: none; }
}

/* === Grid + scroll-gekoppeltes, intensives Warm-Overlay (Bild-Referenz: Navy → Pfirsich) ===
   Grid bleibt statisch; der warme Halo (::before) wandert per --fgx/--fgy mit dem Scroll und
   wird per --fgi (JS) im Frame satt/intensiv, klingt an den Rändern ab. Liegt unter Text (z-index). */
html[data-forschung="dgscroll1"] section.bg[data-screen-label="03 Forschung"],
html[data-forschung="dgscroll2"] section.bg[data-screen-label="03 Forschung"],
html[data-forschung="dgscroll3"] section.bg[data-screen-label="03 Forschung"] {
  background-image:
    linear-gradient(rgba(165,211,223,.06) 1px, transparent 1px),
    linear-gradient(90deg, rgba(165,211,223,.06) 1px, transparent 1px) !important;
  background-size: 46px 46px, 46px 46px; background-position: center;
}
html[data-forschung="dgscroll1"] section[data-screen-label="03 Forschung"]::before {
  inset: 0;
  background: radial-gradient(72% 82% at var(--fgx,72%) var(--fgy,22%),
    rgba(255,221,150, calc(.95 * var(--fgi,0))),
    rgba(255,166,108, calc(.64 * var(--fgi,0))) 34%,
    rgba(126,92,132, calc(.38 * var(--fgi,0))) 58%,
    rgba(9,28,52, 0) 82%);
}
html[data-forschung="dgscroll2"] section[data-screen-label="03 Forschung"]::before {
  inset: 0;
  background: radial-gradient(98% 94% at var(--fgx,84%) var(--fgy,10%),
    rgba(255,227,174, calc(1 * var(--fgi,0))),
    rgba(250,158,106, calc(.62 * var(--fgi,0))) 40%,
    rgba(110,80,120, calc(.3 * var(--fgi,0))) 64%,
    transparent 82%);
}
html[data-forschung="dgscroll3"] section[data-screen-label="03 Forschung"]::before {
  inset: 0;
  background:
    radial-gradient(60% 68% at var(--fgx,72%) var(--fgy,24%), rgba(255,214,150, calc(.92 * var(--fgi,0))), rgba(250,150,106, calc(.54 * var(--fgi,0))) 40%, transparent 72%),
    radial-gradient(56% 62% at calc(128% - var(--fgx,72%)) calc(128% - var(--fgy,24%)), rgba(120,150,196, calc(.44 * var(--fgi,0))), transparent 66%);
}

/* 6 · Tiefe — das Dunkelblau bleibt dunkel. Das warme Licht ist ein Schein, kein Anstrich:
   Spitze bei 32 % Deckkraft statt 100 %, damit unter dem Glühen immer noch Navy liegt.
   Der Halo wird auf die untere linke Hälfte gemappt (hinter die Headline), sodass die
   Radar-Karte auf tiefem Navy sitzt und die Clay-Linien tragen. Vignette schließt die Ränder. */
html[data-forschung="dtiefe"] section.bg[data-screen-label="03 Forschung"] {
  background-image:
    linear-gradient(rgba(165,211,223,.055) 1px, transparent 1px),
    linear-gradient(90deg, rgba(165,211,223,.055) 1px, transparent 1px),
    linear-gradient(180deg, #040f1e 0%, #051327 48%, #071f37 100%) !important;
  background-size: 46px 46px, 46px 46px, 100% 100%;
  background-position: center, center, center;
}
/* Warmer Kern unten links + kühler Gegenschein oben rechts. Beide Positionen leiten sich
   gedämpft aus --fgx/--fgy ab, damit das Licht driftet, ohne über die Karte zu wandern. */
html[data-forschung="dtiefe"] section[data-screen-label="03 Forschung"]::before {
  inset: 0;
  background:
    radial-gradient(58% 66% at calc(14% + var(--fgx,50%) * .34) calc(58% + var(--fgy,42%) * .30),
      rgba(255,192,142, calc(.36 * var(--fgi,0))),
      rgba(211,125,98, calc(.19 * var(--fgi,0))) 42%,
      transparent 74%),
    radial-gradient(56% 62% at calc(96% - var(--fgx,50%) * .22) calc(10% + var(--fgy,42%) * .16),
      rgba(165,211,223, calc(.13 * var(--fgi,0))),
      transparent 68%);
}
html[data-forschung="dtiefe"] section[data-screen-label="03 Forschung"]::after {
  content: ""; position: absolute; inset: 0; z-index: 0; pointer-events: none;
  background: radial-gradient(80% 78% at 50% 46%, transparent 36%, rgba(2,9,20,.52) 100%);
}

/* Trustindex „Mehr laden“ → breiter, dunkelblauer CTA (überschreibt Widget-Styles inkl. Kind-Elemente) */
.trustindex-wrap .ti-load-more-reviews-button,
.ti-load-more-reviews-button {
  background: var(--lm-dark-blue) !important; color: var(--lm-creme) !important;
  border: 1px solid var(--lm-dark-blue) !important; border-radius: var(--r-sm) !important; box-shadow: none !important; opacity: 1 !important;
  min-width: 0 !important; max-width: 100% !important; padding: 14px 48px !important;
  font-family: var(--font-sans) !important; font-weight: 500 !important; font-size: 16px !important; letter-spacing: 0 !important; text-transform: none !important;
}
.trustindex-wrap .ti-load-more-reviews-button *,
.ti-load-more-reviews-button * { color: var(--lm-creme) !important; background: transparent !important; font-family: var(--font-sans) !important; text-transform: none !important; }
@media (hover: hover) {
  .ti-load-more-reviews-button:hover { background: var(--surface-dark-raised) !important; border-color: var(--surface-dark-raised) !important; box-shadow: var(--elev-2) !important; transform: translateY(-2px); }
}

/* ===== Prozess · Frame 1 „Check"-Hero — 5 Layouts (data-checkhero=a..e), Frau + hochzählende 90+ ===== */
.checkhero { position: relative; }
.chk { display: none; }
html[data-checkhero="a"] .chk--a, html[data-checkhero="b"] .chk--b, html[data-checkhero="c"] .chk--c,
html[data-checkhero="d"] .chk--d, html[data-checkhero="e"] .chk--e { display: block; }
.chkcount { position: absolute; right: 6vw; top: 50%; transform: translateY(-50%); display: flex; align-items: flex-start; color: var(--lm-creme); font-family: var(--font-mono); font-weight: 500; line-height: .85; z-index: 2; pointer-events: none; }
.chkcount__n { font-size: clamp(72px, 14vw, 190px); font-variant-numeric: tabular-nums; }
.chkcount__p { font-size: clamp(34px, 6vw, 80px); margin-top: .12em; }
@media (max-width: 900px) { .chkcount { right: 18px; top: 74px; transform: none; } .chkcount__n { font-size: clamp(84px, 27vw, 150px); } .chkcount__p { font-size: 63px; } }

/* a · Portrait-Bühne (Vollbild, wie Referenz) */
.chk--a { position: relative; overflow: hidden; }
.chk--a .chk__bg { position: absolute; inset: 0; background: #efe7db url('assets/check-hero.webp') center 22% / cover no-repeat; }
/* Oberer Anfang .74 statt .30 — gemessen am Foto (check-hero) lag creme
   Navigation bei .30 auf 2,18:1, bei .65 auf 5,25:1. Gilt nur für die
   Standard-Bühne (`data-stage="orig"`); die anderen Bühnen-Stile ersetzen diesen
   Verlauf komplett und bekommen deshalb keinen Overlay-Header (siehe
   hifi-common.js). */
/* Gilt nur bis 900px. Ab 901px übernimmt der waagerechte Schleier weiter
   unten (`data-stage="orig"`), der zur geteilten Bühne gehört und eigene,
   bereits vermessene Werte hat — siehe dort. */
.chk--a .chk__scrim { position: absolute; inset: 0; background: var(--hero-scrim-nav), var(--hero-scrim-text); }
/* 96px Bodenabstand wie die übrigen Hero-Bühnen (siehe `.hero__overlay`). */
.chk--a .chk__in { position: relative; z-index: 1; min-height: 64vh; display: flex; flex-direction: column; justify-content: flex-end; padding: 108px 0 96px; color: var(--lm-creme); }
.chk--a .chk__title { color: var(--lm-creme); }
/* Volles Creme statt 90 %: bei 20 px regular gilt die 4,5:1-Schwelle, und die
   gedimmte Fassung lag auf dem hellsten Prozent der Textzone knapp darunter.
   Die Hierarchie zum Titel trägt die Grösse (20 gegen 62 px), nicht die
   Deckkraft — billiger erkauft als ein dunklerer Schleier über dem ganzen Bild. */
.chk__sub { color: var(--lm-creme); font-size: 20px; line-height: var(--lh-body); max-width: 46ch; margin: 20px 0 6px; }

/* Split-Basis (b, d) */
.chk__split { display: grid; grid-template-columns: 1.05fr .95fr; gap: 56px; align-items: center; }
.chk__split--d { grid-template-columns: .95fr 1.05fr; }
.chk--b, .chk--d { padding: 80px 0; }
.chk__portrait { margin: 0; border-radius: 20px; overflow: hidden; border: 1px solid var(--lm-dark-blue); aspect-ratio: 4/5; background: #e9dccb; }
.chk__portrait img { width: 100%; height: 100%; object-fit: cover; object-position: center 12%; display: block; }
.chkstat { display: flex; align-items: baseline; gap: 12px; margin: 26px 0; }
.chkstat .chkcount__n { position: static; font-size: clamp(44px, 6vw, 72px); color: var(--lm-clay); }
.chkstat__plus { font-family: var(--font-mono); font-weight: 500; font-size: clamp(28px, 4vw, 44px); color: var(--lm-clay); }
.chkstat__lbl { font-family: var(--font-mono); font-size: 12px; color: var(--fg2); align-self: center; }
@media (max-width: 900px) { .chk__split, .chk__split--d { grid-template-columns: 1fr; } }

/* c · Zentriert-Overlay (Vollbild, mittig) */
.chk--c { position: relative; overflow: hidden; }
.chk--c .chk__bg { position: absolute; inset: 0; background: #efe7db url('assets/check-hero.webp') center 22% / cover no-repeat; }
.chk--c .chk__scrim { position: absolute; inset: 0; background: linear-gradient(180deg, rgba(6,43,81,.44), rgba(6,43,81,.66)); }
.chk--c .chk__inC { position: relative; z-index: 1; min-height: 62vh; display: flex; flex-direction: column; justify-content: center; align-items: center; text-align: center; padding: 108px 0 64px; color: var(--lm-creme); }
.chk--c .chk__title { color: var(--lm-creme); }
.chk--c .chk__sub { color: rgba(255,250,244,.92); margin: 20px auto 26px; }
.chkcount--tr { top: 12%; transform: none; }

/* e · Manifest (mittig, Frau als Avatar) */
.chk--e { padding: 84px 0; }
.chk__avatar { margin: 0 auto 26px; width: 128px; height: 128px; border-radius: 50%; overflow: hidden; border: 1px solid var(--lm-dark-blue); }
.chk__avatar img { width: 100%; height: 100%; object-fit: cover; object-position: center 12%; display: block; }
.chkcount--e { position: static; transform: none; justify-content: center; color: var(--lm-clay); margin: 0 0 10px; }
.chkbeliefs { display: grid; grid-template-columns: repeat(3, 1fr); margin: 40px 0 32px; border-top: 1px solid var(--hair); text-align: left; }
.chkbeliefs p { font-size: 18px; line-height: var(--lh-body); color: var(--fg2); padding: 26px 24px 6px; border-left: 1px solid var(--hair); margin: 0; }
.chkbeliefs p:first-child { border-left: 0; }
@media (max-width: 834px) { .chkbeliefs { grid-template-columns: 1fr; } .chkbeliefs p { border-left: 0; border-top: 1px solid var(--hair); } .chkbeliefs p:first-child { border-top: 0; } }
.greview__stars { color: #E8A11C; font-size: 16px; letter-spacing: 3px; }
.greview__txt { font-family: var(--font-mono); font-weight: 400; font-size: 12px; letter-spacing: .08em; text-transform: uppercase; color: var(--fg1); }

/* ---------- bullets / clinical list ---------- */
.clist { list-style: none; padding: 0; margin: 0; display: grid; gap: 0; }
.clist li { display: flex; gap: 16px; align-items: flex-start; padding: 18px 0; border-top: 1px solid var(--hair); font-size: 18px; color: var(--fg1); }
.clist li:last-child { border-bottom: 1px solid var(--hair); }
.clist .anchor { width: 13px; height: 13px; border: 1px solid var(--hair-strong); background: transparent; flex: none; margin-top: 4px; }

/* ---------- doctor rows (V2: recessed outlined panel, E9) ---------- */
.docrows { border: 0; border-radius: var(--r-md); background: var(--surface-sunken); max-width: 100%; overflow: hidden; padding: 26px 0; display: flex; flex-direction: column; justify-content: center; gap: 18px; min-height: 480px; }
/* Home „02 Betreuung": Kacheln liegen direkt auf dem Seitenhintergrund (keine zweite Fläche) */
#docrows { background: transparent; padding: 0; }
/* Die Randblende bleibt weich abgestuft statt linear: eine kurze, lineare Blende
   schneidet die Kachel hart durch (Namen wurden mitten im Wort abgeschnitten).
   Sie setzt aber NICHT bei transparent an und ist auf ~11% verkürzt — die frühere
   Fassung (transparent bis 15%) hat die Randkacheln fast vollständig geschluckt. */
.docrow { overflow-x: auto; overflow-y: hidden; overscroll-behavior-x: contain; -webkit-overflow-scrolling: touch; scrollbar-width: none; -ms-overflow-style: none; cursor: grab; -webkit-mask-image: linear-gradient(90deg, rgba(0,0,0,.38) 0, rgba(0,0,0,.70) 3.5%, rgba(0,0,0,.90) 8%, #000 13%, #000 87%, rgba(0,0,0,.90) 92%, rgba(0,0,0,.70) 96.5%, rgba(0,0,0,.38) 100%); mask-image: linear-gradient(90deg, rgba(0,0,0,.38) 0, rgba(0,0,0,.70) 3.5%, rgba(0,0,0,.90) 8%, #000 13%, #000 87%, rgba(0,0,0,.90) 92%, rgba(0,0,0,.70) 96.5%, rgba(0,0,0,.38) 100%); }
.docrow::-webkit-scrollbar { display: none; }
.docrow.is-dragging { cursor: grabbing; }
.docrow__track { display: flex; gap: 18px; width: max-content; user-select: none; }

/* Home „02 Betreuung": die beiden Ärzte-Zeilen füllen die Höhe der Textspalte, statt
   mittig in einer 480px-Box zu schweben. Die Kachelgröße kommt deshalb aus der
   Containerhöhe (Zeile flex:1 → Kachel height:100%, Breite folgt über das 4:5-Foto),
   nicht mehr aus einer festen Breite. Dafür muss die Spalte mitwachsen dürfen —
   `.split` zentriert sonst beide Spalten.
   Nur ab 821px: darunter ist `.split` einspaltig (1fr !important) und ≤680px läuft
   nur EINE Zeile — dort bleibt die Kachelbreite die richtige Steuergröße. */
@media (min-width: 821px) {
  .split:has(#docrows) { align-items: stretch; }
  #docrows .docrow { flex: 1 1 0; min-height: 0; }
  #docrows .docrow__track { height: 100%; }
  #docrows .dface { width: auto; height: 100%; }
  #docrows .dface__photo { width: auto; height: 100%; }
}
/* Textspalte schmaler, damit die Slideshow den Platz bekommt — aber erst, wenn
   überhaupt genug Breite da ist. Zwei Fallstricke:
   · `minmax(0, …)` ist Pflicht. Mit blossem `1.15fr .85fr` zieht die Mindestbreite
     der Textspalte (lange deutsche Wörter, Button) sie über ihren Anteil hinaus —
     bei 834px kam 300px Slideshow / 393px Text heraus, also genau verkehrt herum.
   · Erst ab 1000px. Darunter presst der .85fr-Anteil die Textspalte so schmal,
     dass sie stark umbricht, dadurch hoch wird — und weil die Kachelhöhe an der
     Spaltenhöhe hängt, würden die Kacheln absurd gross. */
@media (min-width: 1000px) {
  .split:has(#docrows) { grid-template-columns: minmax(0, 1.15fr) minmax(0, .85fr); }
}

/* Kachel = EIN Objekt: 4:5-Portrait, Name/Rolle als Bildunterschrift auf dunkelblauem
   Verlauf — dieselbe Rezeptur wie die Optionen-Karten („Titel auf Bild"). Weil die
   Unterschrift im Bild sitzt, bleibt jede Kachel exakt gleich hoch, egal ob der Name
   ein- oder zweizeilig umbricht. Kein Hover-Lift: nicht interaktiv (DS V4). */
.dface { position: relative; flex: none; width: 196px; border-radius: var(--r-lg); overflow: hidden; background: var(--surface-sunken); }
.dface__photo { display: block; width: 100%; aspect-ratio: 4 / 5; object-fit: cover; background: var(--lm-warm-1); -webkit-user-drag: none; user-drag: none; }
/* Der Verlauf ist bewusst weich abgestuft statt linear: eine lineare Alpha-Rampe wirkt in
   der Bildmitte schwer. So bleibt nur der Fuß der Kachel getönt, das Portrait bleibt frei. */
.dface::after { content: ""; position: absolute; inset: 0; z-index: 1; pointer-events: none; border-radius: inherit; background: linear-gradient(to top, rgba(6,43,81,.78) 0%, rgba(6,43,81,.68) 9%, rgba(6,43,81,.50) 19%, rgba(6,43,81,.30) 30%, rgba(6,43,81,.14) 42%, rgba(6,43,81,.04) 51%, rgba(6,43,81,0) 58%); box-shadow: inset 0 0 0 1px rgba(6,43,81,.10); }
.dface__cap { position: absolute; z-index: 2; left: 16px; right: 16px; bottom: 15px; }
.dface__name { font-family: var(--font-sans); font-weight: 500; font-size: 16px; line-height: var(--lh-snug); color: var(--lm-creme); text-wrap: balance; }
/* Etwas heller als --fg-on-dark-2 (.72): das liegt hier nicht auf einer satten dunklen
   Fläche, sondern auf einem halbtransparenten Verlauf über hellen Kitteln. */
.dface__role { font-family: var(--font-mono); font-weight: 200; font-size: 11px; letter-spacing: .04em; color: rgba(255,250,244,.82); margin-top: 4px; }

/* ---------- radar ---------- */
/* ---------- radar (V2: raised tonal panel) ---------- */
/* Alle Radar-Farben laufen über --rd-*; die dunkle Frame-Variante überschreibt
   nur diesen Block (siehe html[data-forschung^="d"] weiter oben). */
.radar {
  --rd-grid: rgba(6,43,81,.09);
  --rd-spoke: rgba(6,43,81,.06);
  --rd-label: rgba(6,43,81,.46);
  --rd-risk: rgba(219,74,61,.45);
  --rd-gap: rgba(219,74,61,.13);
  --rd-safe: #5FA463;
  --rd-accent: var(--lm-clay);
  --rd-track: rgba(6,43,81,.14);
  --rd-halo: rgba(211,125,98,.16);
  border: var(--hairline); border-radius: var(--r-lg); padding: 32px; display: grid; gap: 22px; background: var(--surface-card); box-shadow: none;
}
.radar__head { display: flex; justify-content: space-between; align-items: baseline; gap: 16px; }
.radar__kicker { font-family: var(--font-mono); font-weight: 400; font-size: 12px; letter-spacing: .10em; text-transform: uppercase; color: var(--rd-label); }
.radar__year { font-family: var(--font-mono); font-weight: 400; font-size: 12px; color: var(--rd-label); margin-left: auto; }
.radar__year b { font-family: var(--font-mono); font-weight: 400; font-size: 24px; color: var(--fg1); margin-left: 6px; font-variant-numeric: tabular-nums; }
.radarsvg { width: 100%; height: auto; }
.radarsvg .rgrid { fill: none; stroke: var(--rd-grid); }
.radarsvg .raxis { stroke: var(--rd-spoke); }
/* 12px statt 10px: die Achsenbeschriftung ist SVG-Text, die Größe zählt also in
   viewBox-Einheiten und skaliert mit. Gemessen bleiben bei 12px noch 14 Einheiten
   Luft links (ENTZÜNDUNG) und 19 rechts (STOFFWECHSEL) bis zum viewBox-Rand — die
   viewBox darf deshalb bleiben wie sie ist. Sie mitzuvergrößern wäre sogar
   kontraproduktiv: das SVG ist width:100%, eine breitere viewBox skaliert alles
   wieder herunter und frisst den Gewinn auf. */
.radarsvg .rlabel { font-family: var(--font-mono); font-weight: 400; font-size: 12px; letter-spacing: .08em; fill: var(--rd-label); text-transform: uppercase; }
.radarsvg .rgap { fill: var(--rd-gap); stroke: none; }
.radarsvg .rrisk { fill: none; stroke: var(--rd-risk); stroke-width: 1.15; stroke-linejoin: round; }
.radarsvg .rsafe { fill: url(#rsafeFill); stroke: var(--rd-safe); stroke-width: 1.6; stroke-linejoin: round; }
.radarsvg .rgstop { stop-color: var(--rd-safe); }
.radarsvg .rdot { fill: var(--rd-safe); stroke: none; }
.radar__legend { display: flex; gap: 20px; font-family: var(--font-mono); font-weight: 400; font-size: 12px; letter-spacing: .04em; color: var(--rd-label); flex-wrap: wrap; }
.radar__legend span { display: inline-flex; align-items: center; gap: 8px; }
.radar__legend .ln { width: 15px; border-top: 1.6px solid var(--rd-safe); }
.radar__legend .ln--risk { border-top-width: 1.15px; border-top-color: var(--rd-risk); }
.radar__legend .sw { width: 15px; height: 8px; border-radius: 2px; background: var(--rd-gap); }
.radar__scale { display: flex; justify-content: space-between; font-family: var(--font-mono); font-weight: 400; font-size: 12px; color: var(--rd-label); }
.radar__time { display: grid; gap: 12px; }

/* Scrubber: Hairline-Track, gespielter Teil in Clay über --rp (0..1, von JS gesetzt) */
.radarrange { -webkit-appearance: none; appearance: none; width: 100%; height: 22px; background: transparent; outline: none; cursor: grab; touch-action: pan-y; }
.radarrange:active { cursor: grabbing; }
.radarrange::-webkit-slider-runnable-track { height: 2px; border-radius: 2px; background: linear-gradient(90deg, var(--rd-accent) 0 calc(var(--rp, 0) * 100%), var(--rd-track) calc(var(--rp, 0) * 100%) 100%); }
.radarrange::-moz-range-track { height: 2px; border-radius: 2px; background: var(--rd-track); }
.radarrange::-moz-range-progress { height: 2px; border-radius: 2px; background: var(--rd-accent); }
.radarrange::-webkit-slider-thumb { -webkit-appearance: none; appearance: none; width: 13px; height: 13px; margin-top: -5.5px; border-radius: 50%; background: var(--rd-accent); border: 0; box-shadow: 0 0 0 4px var(--rd-halo); transition: box-shadow var(--dur-fast) var(--ease-standard); }
.radarrange::-moz-range-thumb { width: 13px; height: 13px; border-radius: 50%; background: var(--rd-accent); border: 0; box-shadow: 0 0 0 4px var(--rd-halo); }
.radarrange:hover::-webkit-slider-thumb, .radarrange:focus-visible::-webkit-slider-thumb { box-shadow: 0 0 0 7px var(--rd-halo); }
.radarrange:hover::-moz-range-thumb, .radarrange:focus-visible::-moz-range-thumb { box-shadow: 0 0 0 7px var(--rd-halo); }
@media (prefers-reduced-motion: reduce) { .radarrange::-webkit-slider-thumb { transition: none; } }

/* ---------- 16-category grid (offenes Grid, Detail im Drawer) ---------- */
/* Grid endet ohne Fuß-Element, darum wirkt das normale Section-Bottom-Padding hier großzügiger als anderswo. */
.section:has(#pcatGrid) { padding-bottom: calc(var(--sp-section) - 24px); }
.pgrid { display: grid; grid-template-columns: repeat(4, 1fr); column-gap: 40px; }
.pgcell { display: flex; align-items: center; gap: 14px; padding: 20px 2px; border: 0; border-top: 1px solid rgba(6,43,81,.18); background: none; cursor: pointer; text-align: left; font-family: var(--font-sans); font-size: 16px; color: var(--fg1); min-width: 0; transition: border-color .15s var(--ease-standard); }
/* Klick-Hinweis (Agentur-Feedback 07/2026: „nicht klar ersichtlich, dass man klicken
   kann"). Die Zelle war schon immer ein <button aria-haspopup="dialog"> — Tastatur und
   Screenreader kannten die Interaktion also, nur optisch gab es im Ruhezustand keinen
   Hinweis: cursor:pointer und der Hover greifen erst, wenn man ohnehin schon draufzeigt.
   Das „›" ist dasselbe Zeichen, das der Standort-Aufklapper im Burger-Menü nutzt.
   Das negative margin-left nimmt einen Teil des Flex-`gap` zurück, damit dem Label
   (nowrap + ellipsis) nicht die Breite ausgeht — in der 2-spaltigen Mobilfassung
   reicht es sonst für „Stoffwechsel" nicht. */
.pgcell::after { content: "›"; flex: none; margin-left: -10px; font-size: 15px; line-height: 1; color: var(--fg2); opacity: .5; transition: opacity var(--dur-fast) var(--ease-standard), color var(--dur-fast) var(--ease-standard), transform var(--dur-fast) var(--ease-standard); }
.pgcell:hover { border-top-color: var(--lm-dark-blue); }
.pgcell:hover svg { color: var(--lm-clay); }
.pgcell:hover::after { color: var(--lm-dark-blue); opacity: 1; transform: translateX(3px); }
.pgcell:focus-visible { outline: 2px solid var(--lm-clay); outline-offset: 2px; }
.pgcell svg { width: 25px; height: 25px; flex: none; color: currentColor; }
.pgcell__label { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pgcell__dot { position: relative; width: 9px; height: 9px; border-radius: 50%; flex: none; margin-left: auto; }
.amp-r { background: #DB4A3D; } .amp-y { background: #E8B12F; } .amp-g { background: #5FA463; }
/* Scan-Choreografie: Clay-Linie fährt über das Grid, Zellen wachen gestaffelt auf (--d wird
   in hifi-home.js aus der Zellposition berechnet), die Ampel-Signale pingen ein.
   fill-mode backwards: vor dem Delay gilt Frame 0, danach der normale Stil — Hover bleibt intakt. */
.pgrid { position: relative; }
.pgrid__scanline { position: absolute; left: 0; right: 0; top: 0; height: 2px; background: linear-gradient(90deg, rgba(211,125,98,0), var(--lm-clay) 30%, var(--lm-clay) 70%, rgba(211,125,98,0)); opacity: 0; pointer-events: none; }
.pgrid.scan .pgrid__scanline { animation: pgsweep 1.7s cubic-bezier(.4,0,.4,1) forwards; }
.pgrid.scan .pgcell { animation: pgwake .5s var(--d, 0ms) var(--ease-entrance) backwards; }
.pgrid.scan .pgcell svg { animation: pgsettle 1.3s calc(var(--d, 0ms) + .2s) backwards; }
.pgrid.scan .pgcell__dot { animation: pgpop .45s calc(var(--d, 0ms) + .3s) cubic-bezier(.2,1.4,.4,1) backwards; }
.pgrid.scan .pgcell__dot::after { content: ""; position: absolute; inset: -2px; border-radius: 50%; border: 1.5px solid currentColor; opacity: 0; animation: pgping 1s calc(var(--d, 0ms) + .4s) ease-out; }
.pgcell__dot.pulse::before { content: ""; position: absolute; inset: -2px; border-radius: 50%; border: 1.5px solid currentColor; animation: pgping 1.6s ease-out forwards; }
.pgcell__dot.amp-r { color: #DB4A3D; } .pgcell__dot.amp-y { color: #E8B12F; } .pgcell__dot.amp-g { color: #5FA463; }
@keyframes pgsweep { 0% { top: 0; opacity: 0; } 8% { opacity: 1; } 88% { opacity: 1; } 100% { top: 100%; opacity: 0; } }
@keyframes pgwake { from { opacity: 0; transform: translateY(10px); } }
@keyframes pgsettle { 0%, 55% { color: var(--lm-clay); } 100% { color: var(--lm-dark-blue); } }
@keyframes pgpop { from { transform: scale(0); } }
@keyframes pgping { 0% { opacity: .9; transform: scale(1); } 100% { opacity: 0; transform: scale(3.2); } }
@media (prefers-reduced-motion: reduce) {
  .pgrid.scan .pgcell, .pgrid.scan .pgcell svg, .pgrid.scan .pgcell__dot, .pgrid.scan .pgrid__scanline { animation: none; }
  .pgrid.scan .pgcell__dot::after, .pgcell__dot.pulse::before { animation: none; opacity: 0; }
}
.pdetail__paramhead { font-family: var(--font-mono); font-weight: 500; font-size: 13px; text-transform: uppercase; letter-spacing: .06em; color: var(--lm-dark-blue); }
.paramgrid { display: flex; flex-wrap: wrap; gap: 8px; }
.paramtile { font-family: var(--font-mono); font-size: 12px; color: var(--fg2); border: 1px solid var(--hair); padding: 7px 12px; }

/* ---------- check-up options (4 tweakable card layouts) ---------- */
.opts { display: grid; grid-template-columns: repeat(3, 1fr); gap: var(--sp-lg); align-items: stretch; }
.opt { display: flex; flex-direction: column; background: var(--surface-card); border: var(--hairline); border-radius: var(--r-lg); box-shadow: none; overflow: hidden; transition: box-shadow .2s ease, transform .2s ease; }
.opt:hover { box-shadow: var(--elev-2); transform: translateY(-3px); }
.opt--feature { background: var(--surface-card); box-shadow: none; }
.opt--feature:hover { box-shadow: var(--elev-2); }
.opt__media { position: relative; overflow: hidden; }
.opt__img { display: block; width: 100%; height: 100%; object-fit: cover; background: var(--lm-warm-1); }
.opt__body { display: flex; flex-direction: column; flex: 1; padding: 28px; }
.opt__tag { font-family: var(--font-mono); font-weight: 300; font-size: 11px; text-transform: uppercase; letter-spacing: .12em; color: var(--fg3); }
.opt__name { font-family: var(--font-sans); font-weight: 500; font-size: 22px; margin: 8px 0 10px; }
.opt__desc { font-size: 16px; line-height: var(--lh-body); color: var(--fg2); min-height: calc(1.4em * 2); }
.opt__feat { list-style: none; padding: 0; margin: 18px 0 0; display: grid; }
.opt__feat li { font-family: var(--font-mono); font-size: 13px; color: var(--fg2); padding: 10px 0; border-top: 1px solid var(--hair); display: flex; gap: 10px; }
.opt__feat li::before { content: "—"; color: var(--lm-clay); }
/* lives as a direct child of .opt (sibling of .opt__media/.opt__body), not inside .opt__body — so it never inherits the kaskade/vorhang/klappe reveal animation and stays pinned/visible from first paint */
.opt__price { font-family: var(--font-mono); font-size: 14px; color: var(--fg2); margin: 0; padding: 20px 28px 0; }
.opt__price b { font-family: var(--font-mono); font-weight: 400; font-size: 22px; color: var(--fg1); }
.opt__cta { margin-top: 0; }

/* Genau zwei Optionskarten → mittig, nicht über die volle Breite gestreckt */
.opts:has(.opt:nth-child(2):last-child) { grid-template-columns: repeat(2, minmax(0, 360px)); justify-content: center; }

/* Dual-Optionskarten (Home · Optionen): blaue Kopf-Fläche + großes Bild darunter */
/* Am Layoutgrid ausrichten (Agentur-Feedback 07/2026): die Karten waren auf je
   460px gedeckelt und zentriert, standen also sichtbar schmaler als Überschrift
   und Fliesstext darüber. Jetzt teilen sie sich die volle `.wrap`-Breite, die
   Aussenkanten sitzen exakt auf denselben Linien wie der Text. */
.opts--dual { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--sp-xl); align-items: stretch; }
.pcard { display: flex; flex-direction: column; border-radius: var(--r-lg); overflow: hidden; background: var(--surface-card); border: var(--hairline); box-shadow: none; transition: box-shadow .2s ease, transform .2s ease; }
.pcard:hover { box-shadow: var(--elev-2); transform: translateY(-3px); }
/* Die ganze Karte ist ein <a> (Agentur-Feedback 07/2026): sie hebt sich beim
   Hover als Ganzes an wie ein Button, also muss man sie auch als Ganzes
   anklicken können — vorher traf nur „Mehr erfahren". Der CTA ist dadurch ein
   <span> im Link, `.pcard__cta` erbt die Button-Optik unverändert. */
.pcard { text-decoration: none; color: inherit; }
@media (hover: hover) {
  /* Der CTA hellt auf, sobald irgendein Teil der Karte gehovert wird, sonst
     bliebe er tot, während die Karte um ihn herum reagiert. Sein eigenes
     Anheben entfällt dafür: die Karte hebt sich bereits, zwei Bewegungen
     übereinander lassen den Button in der Karte verrutschen. */
  .pcard:hover .pcard__cta { background: var(--surface-card); border-color: var(--surface-card); color: var(--lm-dark-blue); }
  .pcard__cta:hover { transform: none; box-shadow: none; }
}
.pcard__head { background: var(--lm-dark-blue); color: var(--lm-creme); padding: 22px 26px; display: flex; flex-direction: column; gap: 6px; }
/* Volles Creme statt 70 % und Gewicht 400 statt 200 (Agentur-Feedback 07/2026).
   Rechnerisch waren die 70 % mit 7,4:1 unauffällig — das Problem war die
   Strichstärke: Mono 200 bei 11px mit 0.12em Laufweite ist haarfein, da trägt
   der Kontrastwert nicht. Jetzt 13,7:1 auf sichtbaren Strichen. Die Hierarchie
   zum Produktnamen hält weiterhin die Grösse (11px vs. 22px). */
.pcard__tag { font-family: var(--font-mono); font-weight: 400; font-size: 11px; text-transform: uppercase; letter-spacing: .12em; color: var(--lm-creme); }
.pcard__name { font-family: var(--font-sans); font-weight: 500; font-size: 22px; color: var(--lm-creme); }
.pcard__price { font-family: var(--font-mono); font-size: 15px; color: rgba(255,250,244,.8); margin-top: 2px; }
.pcard__price b { font-weight: 400; font-size: 26px; color: var(--lm-creme); }
.pcard__body { position: relative; flex: 1; min-height: 300px; display: flex; flex-direction: column; justify-content: flex-end; }
.pcard__media { position: absolute; inset: 0; }
.pcard__media img { width: 100%; height: 100%; object-fit: cover; display: block; }
.pcard__body::after { content: ""; position: absolute; inset: 0; background: linear-gradient(to top, rgba(6,43,81,.86), rgba(6,43,81,.18) 52%, rgba(6,43,81,.05)); z-index: 1; }
.pcard__desc, .pcard__cta { position: relative; z-index: 2; }
.pcard__desc { color: var(--lm-creme); font-weight: 700; font-size: 16px; line-height: var(--lh-body); margin: 0 26px 16px; }
.pcard__cta { margin: 0 26px 26px; }

/* Optionen-Sektion (Home): zwei zentrierte Karten – kompakter rahmen, damit die
   Sektion mit den schmalen Karten nicht zu leer wirkt (Abstand Intro→Karten und
   Sektionspadding zurücknehmen; nur auf der Landing, via data-screen-label). */
[data-screen-label="05 Optionen"] { padding-top: var(--sp-xl); padding-bottom: var(--sp-xl); }
[data-screen-label="05 Optionen"] .sec-head { margin-bottom: var(--sp-lg); padding-bottom: 0; }

/* variant A · media-bleed (default): image fills card top edge-to-edge, big 4:3 */
[data-optcard="bleed"] .opt__media { aspect-ratio: 4 / 3; }
/* variant B · tall media: portrait image fills more, slim text */
[data-optcard="tall"] .opt__media { aspect-ratio: 3 / 4; }
[data-optcard="tall"] .opt__feat { display: none; }
[data-optcard="tall"] .opt__desc { min-height: 0; }
/* variant C · overlay: tag+name sit on the image, body below */
[data-optcard="overlay"] .opt__media { aspect-ratio: 4 / 3; }
[data-optcard="overlay"] .opt__media::after { content: ""; position: absolute; inset: 0; background: linear-gradient(to top, rgba(6,43,81,.72), rgba(6,43,81,0) 55%); }
[data-optcard="overlay"] .opt__media .opt__ov { position: absolute; left: 24px; right: 24px; bottom: 20px; z-index: 2; }
[data-optcard="overlay"] .opt__ov .opt__tag { color: rgba(255,250,244,.82); }
[data-optcard="overlay"] .opt__ov .opt__name { color: var(--lm-creme); margin-bottom: 0; }
[data-optcard="overlay"] .opt__body > .opt__tag, [data-optcard="overlay"] .opt__body > .opt__name { display: none; }
.opt__ov { display: none; }
[data-optcard="overlay"] .opt__ov { display: block; }
/* variant D · side-by-side: image left, text right (single tall row) */
[data-optcard="side"] .opts { grid-template-columns: 1fr; gap: var(--sp-md); }
[data-optcard="side"] .opt { flex-direction: row; }
[data-optcard="side"] .opt__media { flex: 0 0 38%; aspect-ratio: auto; }
[data-optcard="side"] .opt__body { flex: 1; }
[data-optcard="side"] .opt__feat { grid-template-columns: 1fr 1fr; column-gap: 24px; }
@media (max-width: 820px) { [data-optcard="side"] .opt { flex-direction: column; } [data-optcard="side"] .opt__media { flex-basis: auto; aspect-ratio: 4/3; } }

/* ---------- Optionskarten · Mobil-Layout (data-optmobil): kompakt = Preis oben rechts, nur CTA unterm Bild ---------- */
@media (max-width: 680px) {
  html[data-optmobil="kompakt"] .opts .opt:nth-child(-n+2) { position: relative; }
  html[data-optmobil="kompakt"] .opts .opt:nth-child(-n+2) .opt__media { aspect-ratio: 4/3; }
  html[data-optmobil="kompakt"] .opts .opt:nth-child(-n+2) .opt__media::after { content: ""; position: absolute; inset: 0; background: linear-gradient(to top, rgba(6,43,81,.72), rgba(6,43,81,0) 55%), linear-gradient(to bottom, rgba(6,43,81,.46), rgba(6,43,81,0) 36%); }
  html[data-optmobil="kompakt"] .opts .opt:nth-child(-n+2) .opt__ov { display: block; position: absolute; left: 20px; right: 20px; bottom: 16px; z-index: 2; }
  html[data-optmobil="kompakt"] .opts .opt:nth-child(-n+2) .opt__ov .opt__tag { color: rgba(255,250,244,.82); }
  html[data-optmobil="kompakt"] .opts .opt:nth-child(-n+2) .opt__ov .opt__name { color: var(--lm-creme); margin-bottom: 0; }
  html[data-optmobil="kompakt"] .opts .opt:nth-child(-n+2) .opt__price { position: absolute; top: 14px; right: 16px; z-index: 3; margin: 0; padding: 0; color: rgba(255,250,244,.88); font-size: 20px; }
  html[data-optmobil="kompakt"] .opts .opt:nth-child(-n+2) .opt__price b { color: var(--lm-creme); font-size: 38px; text-shadow: 0 1px 14px rgba(3,13,24,.45); }
  html[data-optmobil="kompakt"] .opts .opt:nth-child(-n+2) .opt__body > .opt__tag,
  html[data-optmobil="kompakt"] .opts .opt:nth-child(-n+2) .opt__body > .opt__name,
  html[data-optmobil="kompakt"] .opts .opt:nth-child(-n+2) .opt__desc,
  html[data-optmobil="kompakt"] .opts .opt:nth-child(-n+2) .opt__feat { display: none !important; }
  html[data-optmobil="kompakt"] .opts .opt:nth-child(-n+2) .opt__body { padding: 16px 20px 20px; }
  html[data-optmobil="kompakt"] .opts .opt:nth-child(-n+2) .opt__cta { width: 100%; justify-content: center; }
}

/* ---------- Optionskarten · Inhalt (data-optinhalt): kompakt = Beschreibung → Preis → CTA, ohne Leistungsliste ---------- */
html[data-optinhalt="kompakt"] .opts .opt__feat { display: none; }
html[data-optinhalt="kompakt"] .opts .opt__desc { min-height: 0; }
/* Preis in Weiß oben rechts im Bild (wie Mobil-Kompakt), 1.5× Schriftgröße */
@media (min-width: 681px) {
  html[data-optinhalt="kompakt"] .opts .opt { position: relative; }
  html[data-optinhalt="kompakt"] .opts .opt__media::after { content: ""; position: absolute; inset: 0; background: linear-gradient(to top, rgba(6,43,81,.72), rgba(6,43,81,0) 55%), linear-gradient(to bottom, rgba(6,43,81,.46), rgba(6,43,81,0) 36%); }
  html[data-optinhalt="kompakt"] .opts .opt__price { position: absolute; top: 16px; right: 18px; z-index: 3; margin: 0; padding: 0; color: rgba(255,250,244,.88); font-size: 20px; }
  html[data-optinhalt="kompakt"] .opts .opt__price b { color: var(--lm-creme); font-size: 33px; text-shadow: 0 1px 14px rgba(3,13,24,.45); }
  html[data-optinhalt="kompakt"] .opts .opt__cta { margin-top: 20px; }
}

/* ---------- Optionskarten · Scroll-Animation (data-optanim) ---------- */
/* kaskade · Bild blendet ein, Text fährt wie ein Toggle darunter heraus */
html[data-optanim="kaskade"] .opts .opt__media { opacity: 0; transform: scale(1.05); transition: opacity .7s var(--ease), transform 1s var(--ease); }
html[data-optanim="kaskade"] .opts .opt__body { opacity: 0; transform: translateY(-22px); transition: opacity .55s var(--ease), transform .6s var(--ease); }
html[data-optanim="kaskade"] .opts .opt:nth-child(1) .opt__media { transition-delay: 0s; }
html[data-optanim="kaskade"] .opts .opt:nth-child(2) .opt__media { transition-delay: .14s; }
html[data-optanim="kaskade"] .opts .opt:nth-child(3) .opt__media { transition-delay: .28s; }
html[data-optanim="kaskade"] .opts .opt:nth-child(1) .opt__body { transition-delay: .38s; }
html[data-optanim="kaskade"] .opts .opt:nth-child(2) .opt__body { transition-delay: .52s; }
html[data-optanim="kaskade"] .opts .opt:nth-child(3) .opt__body { transition-delay: .66s; }
html[data-optanim="kaskade"] .opts.animd .opt__media,
html[data-optanim="kaskade"] .opts.animd .opt__body { opacity: 1; transform: none; }

/* vorhang · Bild wird per Wipe aufgedeckt, Text gleitet nach */
html[data-optanim="vorhang"] .opts .opt__media { clip-path: inset(0 0 100% 0); transition: clip-path .85s cubic-bezier(.7,0,.2,1); }
html[data-optanim="vorhang"] .opts .opt__media .opt__img { transform: scale(1.08); transition: transform 1.2s var(--ease); }
html[data-optanim="vorhang"] .opts .opt__body { opacity: 0; transform: translateY(26px); transition: opacity .6s var(--ease), transform .65s var(--ease); }
html[data-optanim="vorhang"] .opts .opt:nth-child(1) .opt__media { transition-delay: 0s; }
html[data-optanim="vorhang"] .opts .opt:nth-child(2) .opt__media { transition-delay: .18s; }
html[data-optanim="vorhang"] .opts .opt:nth-child(3) .opt__media { transition-delay: .36s; }
html[data-optanim="vorhang"] .opts .opt:nth-child(1) .opt__body { transition-delay: .42s; }
html[data-optanim="vorhang"] .opts .opt:nth-child(2) .opt__body { transition-delay: .6s; }
html[data-optanim="vorhang"] .opts .opt:nth-child(3) .opt__body { transition-delay: .78s; }
html[data-optanim="vorhang"] .opts.animd .opt__media { clip-path: inset(0 0 0 0); }
html[data-optanim="vorhang"] .opts.animd .opt__media .opt__img { transform: none; }
html[data-optanim="vorhang"] .opts.animd .opt__body { opacity: 1; transform: none; }

/* klappe · Bild blendet ein, Textblock klappt wie ein Akkordeon aus */
html[data-optanim="klappe"] .opts .opt__media { opacity: 0; transition: opacity .6s var(--ease); }
html[data-optanim="klappe"] .opts .opt__body { max-height: 0; overflow: hidden; opacity: 0; transition: max-height 1s var(--ease), opacity .6s var(--ease); }
html[data-optanim="klappe"] .opts .opt:nth-child(1) .opt__media { transition-delay: 0s; }
html[data-optanim="klappe"] .opts .opt:nth-child(2) .opt__media { transition-delay: .14s; }
html[data-optanim="klappe"] .opts .opt:nth-child(3) .opt__media { transition-delay: .28s; }
html[data-optanim="klappe"] .opts .opt:nth-child(1) .opt__body { transition-delay: .3s; }
html[data-optanim="klappe"] .opts .opt:nth-child(2) .opt__body { transition-delay: .44s; }
html[data-optanim="klappe"] .opts .opt:nth-child(3) .opt__body { transition-delay: .58s; }
html[data-optanim="klappe"] .opts.animd .opt__media { opacity: 1; }
html[data-optanim="klappe"] .opts.animd .opt__body { max-height: 720px; opacity: 1; }

@media (prefers-reduced-motion: reduce) {
  html[data-optanim] .opts .opt__media, html[data-optanim] .opts .opt__body { opacity: 1 !important; transform: none !important; clip-path: none !important; max-height: none !important; transition: none !important; }
}

/* ---------- testimonials · Coverflow-Karussell (hifi-coverflow.js) ----------
   Kachelmaße stehen in --tt-*; hifi-coverflow.js liest --tt-w und skaliert seine
   Geometrie proportional. Eine Schiene wird also allein über CSS größer/kleiner. */
.testirail { --tt-w: 325px; --tt-h: 577px; --tt-play: 70px; --tt-big: 2; position: relative; height: calc(var(--tt-h) + 24px); overflow: hidden; touch-action: pan-y; user-select: none; -webkit-user-select: none; -webkit-mask-image: linear-gradient(90deg, transparent, #000 3%, #000 97%, transparent); mask-image: linear-gradient(90deg, transparent, #000 3%, #000 97%, transparent); }
.testirail__track { position: absolute; inset: 0; }
.testitile { position: absolute; top: 50%; left: 50%; width: var(--tt-w); height: var(--tt-h); overflow: hidden; background: var(--lm-dark-blue); border-radius: var(--r-lg); box-shadow: none; cursor: pointer; transform-origin: center center; transition: transform .55s cubic-bezier(.4,.01,.2,1), opacity .45s ease, box-shadow .3s ease; }
/* Waehrend des Ziehens folgt der Ring dem Zeiger 1:1 — Uebergaenge waeren hier Gummiband */
.testirail.is-drag { cursor: grabbing; }
.testirail.is-drag .testitile { transition: none; cursor: grabbing; }
.testitile.is-big { box-shadow: var(--elev-3); }
.testitile:not(.is-big) { filter: blur(3px); }
.testitile:not(.is-big):hover { opacity: .45 !important; filter: blur(1px); }
.testitile img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; -webkit-user-drag: none; user-drag: none; }
.testitile__play { position: absolute; top: 50%; left: 50%; transform: translate(-50%,-50%); width: var(--tt-play); height: var(--tt-play); border-radius: 50%; background: rgba(255,250,244,.85); display: flex; align-items: center; justify-content: center; opacity: 0; transition: opacity .3s ease; }
.testitile.is-big .testitile__play { opacity: 1; }
@media (hover: hover) {
  .testitile.is-big { box-shadow: var(--elev-3); }
  .testitile.is-big:hover { box-shadow: var(--elev-4); }
  .testitile.is-big:hover .testitile__play { transform: translate(-50%,-50%) scale(1.08); }
  .testitile__play { transition: opacity .3s ease, transform var(--dur-base) var(--ease-standard); }
}
.testitile__play::after { content: ""; border-left: calc(var(--tt-play) * .257) solid var(--lm-dark-blue); border-top: calc(var(--tt-play) * .171) solid transparent; border-bottom: calc(var(--tt-play) * .171) solid transparent; margin-left: calc(var(--tt-play) * .071); }
/* Prozess · Case-Study-Kacheln (#caseRail) erben --tt-* bewusst unverändert:
   die Kacheln sollen exakt so groß sein wie die Testimonials der Startseite. */
/* Karussell-Pfeile (analog Fachärzte) */
.testinav { position: absolute; top: 50%; transform: translateY(-50%); z-index: 5; width: 46px; height: 46px; border-radius: 50%; border: 1px solid rgba(6,43,81,.22); background: rgba(255,250,244,.94); color: var(--lm-dark-blue); cursor: pointer; display: flex; align-items: center; justify-content: center; box-shadow: var(--elev-2); transition: opacity .2s ease, background var(--dur-fast) var(--ease-standard), border-color var(--dur-fast) var(--ease-standard), box-shadow var(--dur-fast) var(--ease-standard); }
@media (hover: hover) {
  .testinav:hover { background: var(--lm-creme); border-color: var(--lm-dark-blue); box-shadow: var(--elev-3); }
}
.testinav::after { content: ""; width: 11px; height: 11px; border-right: 2px solid currentColor; border-bottom: 2px solid currentColor; }
.testinav--l { left: 18px; }
.testinav--l::after { transform: rotate(135deg); margin-left: 4px; }
.testinav--r { right: 18px; }
.testinav--r::after { transform: rotate(-45deg); margin-right: 4px; }
.testinav:disabled { opacity: 0; pointer-events: none; }
/* Punkte unter der Schiene (hifi-coverflow.js): Position im Ring + Direktsprung */
.testidots { display: flex; justify-content: center; gap: 9px; padding-top: 18px; }
.testidots__d { width: 8px; height: 8px; border-radius: 50%; border: 0; padding: 0; background: rgba(6,43,81,.16); cursor: pointer; transition: background .25s ease, transform .25s ease; }
.testidots__d:hover { background: rgba(6,43,81,.34); }
.testidots__d.on { background: var(--lm-clay); transform: scale(1.3); }
/* Die Punkte ersetzen den mobilen „swipen"-Hinweis aus hifi-mobile.js */
.testirail + .swipehint, .testidots + .swipehint { display: none !important; }
/* youtube lightbox */
.ytlb { position: fixed; inset: 0; background: rgba(6,43,81,.62); display: none; align-items: center; justify-content: center; z-index: 2000; padding: 24px; }
.ytlb.on { display: flex; }
.ytlb__inner { position: relative; width: min(960px, 100%); }
.ytlb__frame { position: relative; width: 100%; aspect-ratio: 16/9; background: #000; border-radius: var(--r-md); overflow: hidden; box-shadow: var(--elev-4); }
.ytlb__frame iframe { position: absolute; inset: 0; width: 100%; height: 100%; border: 0; }
.ytlb__frame--short { aspect-ratio: 9/16; height: min(86vh, 764px); width: auto; max-width: calc(100vw - 48px); }
.ytlb__x { position: absolute; top: 18px; right: 18px; width: 48px; height: 48px; border: var(--hairline); background: var(--surface-2); border-radius: 50%; font-size: 28px; cursor: pointer; color: var(--fg1); display: flex; align-items: center; justify-content: center; box-shadow: var(--elev-2); }
@media (hover: hover) {
  .ytlb__x, .ytlb__close, .drawer__close, .devframe__close, .tweaks__x { transition: background var(--dur-fast) var(--ease-standard), color var(--dur-fast) var(--ease-standard), box-shadow var(--dur-fast) var(--ease-standard); }
  .ytlb__x:hover, .ytlb__close:hover, .drawer__close:hover { background: var(--lm-dark-blue); color: var(--lm-creme); box-shadow: var(--elev-3); }
  .devframe__close:hover { background: var(--lm-dark-blue); color: var(--lm-creme); }
  .tweaks__x:hover { color: var(--fg1); }
}
.ytlb__close { position: absolute; top: -58px; right: 0; width: 48px; height: 48px; border: var(--hairline); background: var(--surface-2); border-radius: 50%; font-size: 28px; cursor: pointer; color: var(--fg1); }
/* Testimonials · Mobile: derselbe Coverflow, nur kleiner und mit EINER Fokus-Kachel
   (--tt-big) — sie füllt ~2/3 der Breite, die Nachbarn blitzen geblurrt an den Rändern
   an. --tt-w darf hier ein min() mit vw sein: hifi-coverflow.js misst per Sonde. */
@media (max-width: 680px) {
  .testirail { --tt-w: min(66vw, 260px); --tt-h: calc(var(--tt-w) * 577 / 325); --tt-play: 56px; --tt-big: 1; }
  .testinav { width: 38px; height: 38px; }
  .testinav::after { width: 9px; height: 9px; }
  .testinav--l { left: 10px; }
  .testinav--r { right: 10px; }
  .testidots { padding-top: 14px; }
}

/* ---------- google review grid (V3: flat tonal cards, hover-lift) ---------- */
.revgrid { display: grid; grid-template-columns: repeat(3, 1fr); gap: var(--sp-md); }
.gcard { background: var(--surface-card); border: var(--hairline); border-radius: var(--r-lg); padding: 32px; display: flex; flex-direction: column; gap: 14px; min-height: 230px; transition: transform .2s ease, box-shadow .2s ease; }
.gcard:hover { transform: translateY(-2px); box-shadow: var(--elev-2); }
.gcard__top { display: flex; align-items: center; gap: 12px; }
.gcard__av { width: 34px; height: 34px; border-radius: 50%; background: var(--lm-warm-2); flex: none; }
.gcard__who { display: grid; }
.gcard__n { font-family: var(--font-mono); font-size: 12px; text-transform: uppercase; letter-spacing: .02em; }
.gcard__d { font-family: var(--font-mono); font-weight: 300; font-size: 11px; color: var(--fg3); }
.gcard__g { margin-left: auto; font-family: var(--font-mono); font-weight: 700; font-size: 16px; color: var(--fg3); }
.gcard__stars { color: #E8A11C; letter-spacing: 1px; font-size: 13px; }
.gcard__text { font-size: 14px; line-height: var(--lh-read); color: var(--fg2); margin: 0; }

/* ---------- final CTA band (C13 · Dark Blue close) ---------- */
.btn--light { background: var(--lm-creme); color: var(--lm-dark-blue); border-color: var(--lm-creme); }
/* Creme-Füllung auf dunklem Grund: die Basisregel würde sie dunkelblau färben.
   Stattdessen einen Ton wärmer — das Anheben trägt hier den größeren Teil. */
@media (hover: hover) {
  .btn--light:hover { background: var(--surface-card); border-color: var(--surface-card); color: var(--lm-dark-blue); }
}

/* ---------- closing CTA · „Sprechen Sie mit einem unserer Ärzte" ----------
   Klarer, zentrierter Abschluss auf dem warmen Feld (Stil wie GKV) → Footer. */
.lmcta { padding: clamp(96px, 12vw, 168px) 0; background: var(--lm-creme) url('assets/ds/grad-light-04.webp') center / cover no-repeat; -webkit-mask-image: linear-gradient(to bottom, transparent 0, #000 150px); mask-image: linear-gradient(to bottom, transparent 0, #000 150px); }
.lmcta--center .lmcta__in { display: flex; flex-direction: column; align-items: center; text-align: center; gap: 24px; max-width: 900px; }
.lmcta__title { color: var(--lm-dark-blue); text-wrap: balance; margin: 0; }
.lmcta__sub { color: var(--fg2); max-width: 52ch; margin: 0; }
.lmcta__btns { display: flex; flex-wrap: wrap; gap: 14px; justify-content: center; margin-top: 8px; }
.btn--outline { background: transparent; color: var(--lm-dark-blue); border-color: var(--lm-dark-blue); }
@media (hover: hover) {
  .btn--outline:hover { background: var(--lm-dark-blue); color: var(--lm-creme); border-color: var(--lm-dark-blue); }
}
@media (max-width: 680px) { .lmcta { padding: 84px 0; } }

/* ---------- footer (lumadüsseldorf-style, greyscale) ---------- */
.ft { background: var(--lm-dark-blue); color: var(--lm-creme); padding: var(--sp-section) 0 var(--sp-xl); }
.ft__grid { display: grid; grid-template-columns: 1.5fr 1fr 1fr 1fr 1fr 1fr; gap: var(--sp-xl); padding-bottom: var(--sp-xxl); border-bottom: 1px solid rgba(255,250,244,.3); }
.ft__logo { height: 22px; margin-bottom: var(--sp-md); }
.ft__tag { font-size: 16px; line-height: var(--lh-body); color: var(--fg-on-dark-2); max-width: 32ch; }
.ft h4 { font-family: var(--font-mono); font-weight: 200; font-size: 12px; text-transform: uppercase; letter-spacing: .04em; color: var(--fg-on-dark-2); margin: 0 0 18px; }
.ft__col ul { list-style: none; padding: 0; margin: 0; display: grid; gap: 12px; }
.ft__col a { color: var(--lm-creme); text-decoration: none; font-size: 16px; opacity: .9; }
.ft__col a:hover { text-decoration: underline; text-underline-offset: 3px; opacity: 1; }
.ft__bottom { display: flex; justify-content: space-between; align-items: center; gap: 18px; padding-top: var(--sp-lg); flex-wrap: wrap; }
.ft__copy { font-family: var(--font-mono); font-weight: 200; font-size: 12px; color: var(--fg-on-dark-2); }
.ft__legal { display: flex; gap: 22px; }
.ft__legal a { font-family: var(--font-mono); font-weight: 200; font-size: 12px; color: var(--fg-on-dark-2); text-decoration: none; }
.ft__legal a:hover { color: var(--lm-creme); }
.ft__social { display: flex; gap: 22px; }
.ft__social a { font-family: var(--font-mono); font-weight: 200; font-size: 12px; color: var(--fg-on-dark-2); text-decoration: none; }
.ft__social a:hover { color: var(--lm-creme); }

/* ---------- feature bullets — tweakable tile styles (clay accent) ---------- */
.clist--feat { border: 0 !important; display: grid; gap: 12px; counter-reset: clf; }
/* Kein `white-space: nowrap`. Die Zeilen sind kurz genug, um ab 1200px ohnehin
   einzeilig zu bleiben (längster Eintrag ~390px in einer 506px-Spalte) — nowrap
   hat das nicht garantiert, sondern erzwungen: die Mindestbreite des <li> stieg
   damit auf ~482px und riss die zweispaltige `.split` auf. Bei 834px brauchte
   das Raster so 780–910px in einer 754px-Spalte und wurde am Rand abgeschnitten
   (body: overflow-x, also ohne Scrollbalken und ohne sichtbaren Hinweis).
   Umbrechen darf sie: in der Enge sind zwei Zeilen richtig, nicht abgeschnitten. */
.clist--feat li { border: 0 !important; padding: 0; gap: 18px; align-items: center; font-size: 18px; color: var(--fg1); }
.clist--feat .anchor { display: none; }
.clist--feat li::before { counter-increment: clf; }
/* tile · große inline-Ziffer (default) */
[data-bullets="num"] .clist--feat li { background: var(--surface-card); border: var(--hairline) !important; border-radius: var(--r-md); box-shadow: var(--bullettone-shadow, none); padding: 16px 22px !important; transition: box-shadow var(--dur-fast) var(--ease-standard); }
[data-bullets="num"] .clist--feat li:hover { box-shadow: var(--bullettone-shadow, none); }
/* Ziffer so gross wie das Listen-Item, vorher 30px gegen 17px Text
   (Agentur-Feedback 07/2026: „zu viele verschiedene Schriftgroessen").
   Die Ziffer ist damit Auszeichnung statt Blickfang. min-width haelt die
   Spalte buendig, faellt aber mit der Schriftgroesse von 50 auf 30px. */
[data-bullets="num"] .clist--feat li::before { content: counter(clf, decimal-leading-zero); font-family: var(--font-mono); font-weight: 500; font-size: 1em; line-height: 1; color: var(--lm-clay); flex: none; min-width: 30px; }
/* tile · Ziffer gestapelt */
[data-bullets="stack"] .clist--feat li { flex-direction: column; align-items: flex-start; gap: 10px; background: var(--surface-card); border: var(--hairline) !important; border-radius: var(--r-md); box-shadow: var(--bullettone-shadow, none); padding: 20px 22px !important; }
[data-bullets="stack"] .clist--feat li::before { content: counter(clf, decimal-leading-zero); font-family: var(--font-mono); font-weight: 500; font-size: 34px; line-height: 1; color: var(--lm-clay); }
/* minimal · große Ziffer ohne Box */
[data-bullets="line"] .clist--feat li { padding: 6px 0 !important; }
[data-bullets="line"] .clist--feat li::before { content: counter(clf, decimal-leading-zero); font-family: var(--font-mono); font-weight: 500; font-size: 1em; line-height: 1; color: var(--lm-clay); flex: none; min-width: 30px; }
/* bullet-tile tone variants (V3: warm surface, never pure white) */
[data-btile="ton"] { --bullettone-shadow: none; }
[data-btile="ton"] [data-bullets="num"] .clist--feat li, [data-btile="ton"] [data-bullets="stack"] .clist--feat li { background: var(--surface-card); border-color: transparent !important; }
/* btile + bullets liegen beide auf <html> → Kompaktselektor, damit „ton" die Linie wirklich entfernt */
html[data-btile="ton"][data-bullets="num"] .clist--feat li,
html[data-btile="ton"][data-bullets="stack"] .clist--feat li { border: 0 !important; }
[data-btile="schatten"] { --bullettone-shadow: var(--elev-2); }
[data-btile="schatten"] [data-bullets="num"] .clist--feat li, [data-btile="schatten"] [data-bullets="stack"] .clist--feat li { background: var(--surface-2); border-color: transparent !important; }
[data-btile="clay"] [data-bullets="num"] .clist--feat li, [data-btile="clay"] [data-bullets="stack"] .clist--feat li { background: rgba(211,125,98,.10); border-color: rgba(211,125,98,.35) !important; box-shadow: none; }

/* ---------- tweaks panel ---------- */
.tweaks { position: fixed; right: 20px; bottom: 20px; width: 300px; max-height: calc(100vh - 40px); overflow-y: auto; background: var(--surface-2); border: var(--hairline); border-radius: var(--r-md); box-shadow: var(--elev-4); z-index: 1500; display: none; }
.tweaks.on { display: block; }
.tweaks__head { display: flex; align-items: center; justify-content: space-between; padding: 14px 18px; border-bottom: var(--hairline); }
.tweaks__title { font-family: var(--font-mono); font-size: 12px; text-transform: uppercase; letter-spacing: .06em; color: var(--fg1); }
.tweaks__x { border: none; background: none; font-size: 20px; cursor: pointer; color: var(--fg2); }
.tweaks__body { padding: 16px 18px; }
.tweaks__lbl { font-family: var(--font-mono); font-weight: 300; font-size: 11px; text-transform: uppercase; letter-spacing: .05em; color: var(--fg3); margin: 16px 0 10px; }
.tweaks__lbl:first-of-type { margin-top: 0; }
.tweaks__opts { display: grid; gap: 8px; }
.tweaks__opt { text-align: left; border: var(--hairline); border-radius: var(--r-sm); background: var(--surface-1); padding: 11px 14px; cursor: pointer; font-family: var(--font-sans); font-size: 14px; color: var(--fg1); transition: border-color var(--dur-fast); }
.tweaks__opt:hover { border-color: var(--lm-dark-blue); }
.tweaks__opt.on { background: var(--lm-dark-blue); border-color: var(--lm-dark-blue); color: var(--lm-creme); }
.devframe { position: fixed; inset: 0; background: rgba(6,43,81,.45); z-index: 1300; display: none; flex-direction: column; align-items: center; justify-content: flex-start; padding: 40px 0; }
.devframe.on { display: flex; }
.devframe__bar { color: var(--lm-creme); font-family: var(--font-mono); font-size: 12px; display: flex; gap: 20px; align-items: center; margin-bottom: 18px; }
.devframe__close { cursor: pointer; background: var(--surface-2); color: var(--fg1); border: 0; border-radius: 999px; padding: 8px 16px; font-family: var(--font-mono); font-size: 12px; }
.devframe__stage { overflow: hidden; }
.devframe iframe { border: 0; background: var(--lm-creme); box-shadow: var(--elev-4); transform-origin: top left; }

/* ===== aesthetic tweaks (data-* on <html>) ===== */
/* flowing background gradient concepts (data-grad) */
[data-grad="warmTR"] body { background-image: url('assets/ds/grad-light-02.webp'); background-size: 135% 135%; background-position: 90% 8%; background-repeat: no-repeat; background-attachment: fixed; }
[data-grad="warmBL"] body { background-image: url('assets/ds/grad-light-03.webp'); background-size: 135% 135%; background-position: 8% 92%; background-repeat: no-repeat; background-attachment: fixed; }
[data-grad="halo"] body { background-image: url('assets/ds/grad-light-04.webp'); background-size: 165% 165%; background-position: center; background-repeat: no-repeat; background-attachment: fixed; }
[data-grad="drift"] body { background-image: url('assets/ds/grad-light-02.webp'); background-size: 175% 175%; background-repeat: no-repeat; background-attachment: fixed; animation: bgdrift 46s ease-in-out infinite alternate; }
[data-grad="scroll"] body { background-image: url('assets/ds/grad-light-03.webp'); background-size: 165% 165%; background-repeat: no-repeat; background-attachment: fixed; will-change: background-position; transition: background-position .25s ease-out; }
[data-grad="helix"] body { background-image: url('assets/ds/grad-light-02.webp'); background-size: 150% 150%; background-repeat: no-repeat; background-attachment: fixed; will-change: background-position; transition: background-position .2s ease-out; }
[data-grad="duskTR"] body { background-color: #1a2740; background-image: url('assets/grad-dark-full.webp'); background-size: cover; background-position: 82% 18%; background-repeat: no-repeat; background-attachment: fixed; }
[data-grad="duskBL"] body { background-color: #1a2740; background-image: url('assets/grad-dark-full.webp'); background-size: cover; background-position: 20% 85%; background-repeat: no-repeat; background-attachment: fixed; }
[data-grad="duskDrift"] body { background-color: #1a2740; background-image: url('assets/grad-dark-full.webp'); background-size: 175% 175%; background-repeat: no-repeat; background-attachment: fixed; animation: bgdrift 48s ease-in-out infinite alternate; }
[data-grad="duskZoom"] body { background-color: #1a2740; background-image: url('assets/grad-dark-full.webp'); background-position: center; background-repeat: no-repeat; background-attachment: fixed; animation: bgzoom 26s ease-in-out infinite alternate; }
[data-grad="duskScroll"] body { background-color: #1a2740; background-image: url('assets/grad-dark-full.webp'); background-size: 165% 165%; background-repeat: no-repeat; background-attachment: fixed; will-change: background-position; transition: background-position .25s ease-out; }
@keyframes bgzoom { from { background-size: 122% 122%; } to { background-size: 165% 165%; } }
@media (prefers-reduced-motion: reduce) { [data-grad="duskDrift"] body, [data-grad="duskZoom"] body { animation: none; } }
[data-grad="rise"] body { background-image: url('assets/ds/grad-light-02.webp'); background-size: 150% 200%; background-repeat: no-repeat; background-attachment: fixed; will-change: background-position; transition: background-position .25s ease-out; }
[data-grad="dual"] body { background-image: url('assets/ds/grad-light-02.webp'), url('assets/ds/grad-light-04.webp'); background-size: 110% 110%, 120% 120%; background-repeat: no-repeat, no-repeat; background-attachment: fixed, fixed; will-change: background-position; transition: background-position .25s ease-out; }
[data-grad="sunrise"] body { background-color: var(--lm-creme); background-image: url('assets/grad-sunrise.webp'); background-size: 100% 2600px; background-position: top center; background-repeat: no-repeat; background-attachment: scroll; }
/* Gradient 1–3 · Shader-Look (Blob-Ebenen), Bewegung ausschließlich scrollgetrieben via --gs */
html[data-grad="g1"] body, html[data-grad="g2"] body, html[data-grad="g3"] body, html[data-grad="g4"] body { background: #fff6ec; }
.lm-gradbg { display: none; position: fixed; inset: -14vh -14vw; z-index: -1; pointer-events: none; overflow: hidden; }
html[data-grad="g1"] .lm-gradbg--g1, html[data-grad="g2"] .lm-gradbg--g2, html[data-grad="g3"] .lm-gradbg--g3, html[data-grad="g4"] .lm-gradbg--g4 { display: block; }
.lm-gradbg span { position: absolute; border-radius: 50%; filter: blur(72px); will-change: transform; }
/* g1 · Sphäre: warme Morgenkugel wandert nach unten rechts, Blau kontert */
.lm-gradbg--g1 span:nth-child(1) { width: 58vw; height: 58vw; left: 4vw; top: -6vh; background: radial-gradient(circle at 38% 34%, rgba(255,122,51,.6) 0%, rgba(255,160,102,.4) 42%, rgba(255,160,102,0) 70%); transform: translate3d(calc(var(--gs, 0) * 22vw), calc(var(--gs, 0) * 34vh), 0) scale(calc(1 + var(--gs, 0) * .25)); }
.lm-gradbg--g1 span:nth-child(2) { width: 44vw; height: 44vw; right: -6vw; top: 30vh; background: radial-gradient(circle at 60% 40%, rgba(255,250,244,.9) 0%, rgba(255,250,244,0) 68%); transform: translate3d(calc(var(--gs, 0) * -26vw), calc(var(--gs, 0) * -22vh), 0); }
.lm-gradbg--g1 span:nth-child(3) { width: 34vw; height: 34vw; left: -8vw; bottom: -10vh; background: radial-gradient(circle, rgba(255,122,51,.3) 0%, rgba(255,122,51,0) 66%); transform: translate3d(calc(var(--gs, 0) * 30vw), calc(var(--gs, 0) * -16vh), 0); }
/* g2 · Bänder: breite Farbbänder schieben sich gegenläufig übereinander */
.lm-gradbg--g2 span { border-radius: 50% / 42%; }
.lm-gradbg--g2 span:nth-child(1) { width: 130vw; height: 44vh; left: -30vw; top: 4vh; background: linear-gradient(90deg, rgba(255,122,51,.5), rgba(255,160,102,.3)); transform: translate3d(calc(var(--gs, 0) * 34vw), calc(var(--gs, 0) * 6vh), 0) rotate(calc(-9deg + var(--gs, 0) * 10deg)); }
.lm-gradbg--g2 span:nth-child(2) { width: 130vw; height: 42vh; right: -34vw; top: 44vh; background: linear-gradient(90deg, rgba(255,250,244,.85), rgba(255,236,214,.4)); transform: translate3d(calc(var(--gs, 0) * -38vw), calc(var(--gs, 0) * -4vh), 0) rotate(calc(7deg - var(--gs, 0) * 9deg)); }
.lm-gradbg--g2 span:nth-child(3) { width: 110vw; height: 34vh; left: -18vw; bottom: -8vh; background: linear-gradient(90deg, rgba(255,160,102,.34), rgba(255,122,51,.2)); transform: translate3d(calc(var(--gs, 0) * 24vw), 0, 0) rotate(calc(-5deg + var(--gs, 0) * 6deg)); }
/* g3 · Orbit: drei Farbkörper kreisen um die Mitte, Winkel = Scrollposition */
.lm-gradbg__orb { position: absolute; inset: 0; transform: rotate(calc(var(--gs, 0) * 150deg)); transform-origin: 50% 50%; will-change: transform; }
.lm-gradbg--g3 .lm-gradbg__orb span:nth-child(1) { width: 48vw; height: 48vw; left: 8vw; top: 2vh; background: radial-gradient(circle at 40% 40%, rgba(255,122,51,.52) 0%, rgba(255,122,51,0) 68%); }
.lm-gradbg--g3 .lm-gradbg__orb span:nth-child(2) { width: 42vw; height: 42vw; right: 4vw; top: 26vh; background: radial-gradient(circle at 55% 45%, rgba(255,250,244,.88) 0%, rgba(255,250,244,0) 66%); }
.lm-gradbg--g3 .lm-gradbg__orb span:nth-child(3) { width: 36vw; height: 36vw; left: 26vw; bottom: -4vh; background: radial-gradient(circle, rgba(255,122,51,.34) 0%, rgba(255,122,51,0) 64%); }
/* g4 · Auto: Creme/Orange-Sphäre nach neuem Shader-Preset, Animation läuft von selbst
   (uDensity .8 → breitere, weichere Formen · uStrength .9 → stärkere Ausschläge · uSpeed .3 → schneller) */
html[data-grad="g4"] body { background: var(--lm-creme); }
.lm-gradbg--g4 span:nth-child(1) { width: 74vw; height: 74vw; left: 4vw; top: -10vh; background: radial-gradient(circle at 40% 36%, rgba(255,122,51,.58) 0%, rgba(255,122,51,.26) 48%, rgba(255,122,51,0) 72%); animation: lmg4a 11s ease-in-out infinite alternate; }
.lm-gradbg--g4 span:nth-child(2) { width: 58vw; height: 58vw; right: -12vw; top: 28vh; background: radial-gradient(circle at 55% 45%, rgba(255,250,244,.9) 0%, rgba(255,236,214,.42) 52%, rgba(255,250,244,0) 74%); animation: lmg4b 13s ease-in-out infinite alternate; }
.lm-gradbg--g4 span:nth-child(3) { width: 48vw; height: 48vw; left: -14vw; bottom: -12vh; background: radial-gradient(circle, rgba(255,122,51,.36) 0%, rgba(255,122,51,0) 68%); animation: lmg4c 15s ease-in-out infinite alternate; }
@keyframes lmg4a { from { transform: translate3d(0, 0, 0) scale(1); } 50% { transform: translate3d(24vw, 26vh, 0) scale(1.3); } to { transform: translate3d(-14vw, 40vh, 0) scale(1.1); } }
@keyframes lmg4b { from { transform: translate3d(0, 0, 0); } 50% { transform: translate3d(-30vw, -18vh, 0) scale(1.22); } to { transform: translate3d(-14vw, -36vh, 0) scale(.92); } }
@keyframes lmg4c { from { transform: translate3d(0, 0, 0); } 50% { transform: translate3d(18vw, -8vh, 0) scale(1.34); } to { transform: translate3d(36vw, -24vh, 0) scale(1.12); } }
@media (prefers-reduced-motion: reduce) { .lm-gradbg--g4 span { animation: none !important; } }
@media (prefers-reduced-motion: reduce) { .lm-gradbg span, .lm-gradbg__orb { transform: none !important; } }
@media (max-width: 680px) { .lm-gradbg span { filter: blur(48px); } }

@keyframes bgdrift { 0% { background-position: 12% 18%; } 50% { background-position: 86% 72%; } 100% { background-position: 28% 96%; } }

[data-grad]:not([data-grad="none"]) .bg { background-image: none !important; background-color: transparent !important; }
@media (prefers-reduced-motion: reduce) { [data-grad="drift"] body { animation: none; } }
.bg { background-color: var(--lm-creme); background-repeat: no-repeat; }
[data-bg="warm"] .bg { background-image: var(--secimg); background-size: cover; background-position: var(--secpos, center); }
[data-bg="soft"] .bg { background-image: linear-gradient(rgba(255,250,244,.66), rgba(255,250,244,.66)), var(--secimg); background-size: cover; background-position: var(--secpos, center); }
[data-bg="corner"] .bg { background-image: var(--secimg); background-size: 52%; background-position: top right; }
[data-bg="band"] .bg { background-image: none; background-color: var(--surface-card); }
[data-bg="flat"] .bg { background-image: none; }

.h-xl { font-size: calc(var(--title-scale, 1) * clamp(40px, 5.4vw, 74px)); }
.h-lg { font-size: calc(var(--title-scale, 1) * clamp(32px, 4vw, 56px)); }
[data-titles="kompakt"] { --title-scale: .84; }
[data-titles="gross"] { --title-scale: 1.16; }

[data-width="schmal"] { --maxw: 1080px; }
[data-width="weit"] { --maxw: 1320px; }

[data-radius="scharf"] { --r-lg: 10px; --r-md: 8px; }
[data-radius="weich"] { --r-lg: 28px; --r-md: 20px; }

[data-rhythm="kompakt"] { --sp-section: 60px; }
[data-rhythm="luftig"] { --sp-section: 112px; }

/* ---------- card style tweak (5 visibly distinct option-card looks) ---------- */
/* 1 · flach (default): tonal fill, hairline */
[data-cards="flach"] .opt { background: var(--surface-card); border: var(--hairline); }
/* 2 · outline: transparent, only a 1px frame */
[data-cards="outline"] .opt { background: transparent; border: 1px solid var(--lm-dark-blue); box-shadow: none; }
[data-cards="outline"] .opt:hover { background: var(--surface-card); }
/* 3 · erhaben: bright surface lifted with shadow, no border */
[data-cards="erhaben"] .opt { background: var(--surface-2); border: 0; box-shadow: var(--elev-2); }
[data-cards="erhaben"] .opt:hover { box-shadow: var(--elev-3); }
/* 4 · akzent: thick clay top edge */
[data-cards="akzent"] .opt { background: var(--surface-card); border: var(--hairline); border-top: 4px solid var(--lm-clay); border-radius: 0 0 var(--r-lg) var(--r-lg); }
/* 5 · dunkel: dark blue cards, creme text */
[data-cards="dunkel"] .opt { background: var(--lm-dark-blue); border: 0; }
[data-cards="dunkel"] .opt__name, [data-cards="dunkel"] .opt__body .opt__tag { color: var(--lm-creme); }
[data-cards="dunkel"] .opt__desc, [data-cards="dunkel"] .opt__feat li, [data-cards="dunkel"] .opt__price { color: rgba(255,250,244,.7); }
[data-cards="dunkel"] .opt__feat li { border-top-color: rgba(255,250,244,.16); }
[data-cards="dunkel"] .opt__price b { color: var(--lm-creme); }
[data-cards="dunkel"] .btn--ghost { color: var(--lm-creme); border-color: rgba(255,250,244,.4); }
@media (hover: hover) {
  [data-cards="dunkel"] .btn--ghost:hover { background: var(--lm-creme); color: var(--lm-dark-blue); border-color: var(--lm-creme); }
}

/* ---------- entrance animation (per-element scroll-reveal · fires at the trigger line) ---------- */
/* whole-block reveals (interactive widgets / marquees) use a transition */
.reveal { opacity: 0; transform: translateY(26px); transition: opacity .72s var(--ease-entrance), transform .72s var(--ease-entrance); }
.reveal.in { opacity: 1; transform: none; }
/* a staggering block is only a trigger shell — it holds still while its atoms animate */
.reveal.rv-coord { opacity: 1; transform: none; transition: none; }
/* Individual atoms use a keyframe ANIMATION (not a transition), so an element's own
   transition shorthand — e.g. box-shadow on the numbered cards — can never clobber
   the reveal by resetting transition-property. */
[data-rv] { opacity: 0; transition: opacity .5s var(--ease-entrance); }
/* instant (no-animation) reveal for elements already past the line at setup */
.rv-instant { opacity: 1 !important; transform: none !important; animation: none !important; transition: none !important; }
[data-rv].in {
  animation-name: lmRise;
  animation-duration: .72s;
  animation-timing-function: var(--ease-entrance);
  animation-delay: var(--rvd, 0ms);
  animation-fill-mode: both;
  will-change: opacity, transform;
}
@keyframes lmRise {
  from { opacity: 0; transform: translateY(var(--rv-rise, 24px)) scale(var(--rv-scale, 1)); }
  to   { opacity: 1; transform: none; }
}
/* Hintergrund V2 · reveal strength. Atoms read --rv-rise/--rv-scale (inherited);
   whole blocks get an explicit transform. */
[data-reveal="sanft"]  { --rv-rise: 28px; }
[data-reveal="mittel"] { --rv-rise: 50px; }
[data-reveal="stark"]  { --rv-rise: 80px; --rv-scale: .986; }
[data-reveal="sanft"]  .reveal:not(.rv-coord) { transform: translateY(28px); }
[data-reveal="mittel"] .reveal:not(.rv-coord) { transform: translateY(50px); }
[data-reveal="stark"]  .reveal:not(.rv-coord) { transform: translateY(80px) scale(.986); }
[data-reveal] .reveal.in { transform: none; }
@media (prefers-reduced-motion: reduce) { .reveal, [data-rv] { opacity: 1 !important; transform: none !important; transition: none !important; animation: none !important; } }
@media print { .reveal, [data-rv] { opacity: 1 !important; transform: none !important; animation: none !important; } }

/* ---------- responsive ---------- */
@media (max-width: 1080px) {
  :root { --gut: 40px; }
  .pgrid { column-gap: 24px; }
  .ft__grid { grid-template-columns: 1fr 1fr; gap: var(--sp-lg); }
}
@media (max-width: 940px) {
  .opts { grid-template-columns: 1fr; column-gap: 0; row-gap: var(--sp-xl); }
  /* Ab hier wird die Kategorie-Zelle eng (4 Spalten auf 834px = 171px pro Zelle).
     Ohne den knapperen Abstand schneidet das Label ab, sobald das ›-Zeichen dazukommt. */
  .pgcell { gap: 10px; }
}
@media (max-width: 820px) {
  [data-nowrap] { white-space: normal !important; }
  /* Telefon: Logo kleiner + engere Header-Abstände, damit der Schriftzug
     unverzerrt neben Termin-Button und Burger Platz hat. */
  .hd__logo { height: 16px; }
  .hd__in { gap: var(--sp-sm); }
  .hd__right { gap: 14px; }
  .sec-head { flex-direction: column; align-items: flex-start; gap: var(--sp-md); }
  .team-hero-photo { display: block; width: 100%; aspect-ratio: 3/4; border-radius: var(--r-lg); overflow: hidden; order: -1; }
  .team-hero-photo img { width: 100%; height: 100%; object-fit: cover; }
  /* min-height muss die 680px der Basisregel überschreiben, sonst gewinnt sie
     gegen height. 100svh = sichtbarer Viewport MIT Browser-Chrome (URL-Leiste),
     minus Luft — so bleibt der CTA am Hero-Fuß auf jeder Telefonhöhe über der
     Browser-Toolbar sichtbar.

     Abzug 40px statt 100px, seit der Header auf dem Hero liegt: die 100px waren
     „74px Sticky-Header + 26px Luft". Der Header belegt im Fluss keine Höhe mehr
     (der Hero beginnt bei 0), also war der 74er-Abzug doppelt gerechnet und der
     Rest-Streifen wuchs von ~26px auf ~100px — dieselbe Regression wie am Desktop.
     40px ≈ 5 % einer typischen Telefon-svh, entspricht also dem 95vh-Verhältnis.

     max-height mit hoch (680 → 754 = 680 + 74): der Deckel wurde gesetzt, als der
     Header noch 74px Fluss belegte. Genau um diese 74px muss er steigen, damit die
     Geometrie dort, wo er greift, exakt die alte bleibt — bei 680 hätte er auf
     grossen Telefonen wieder in den Streifen gegriffen, den dieser Fix schliesst.
     Unterhalb des Deckels bleiben 40px Streifen, ab Deckel exakt wie vorher. */
  .hero { height: 520px; height: calc(100svh - 40px); min-height: 420px; max-height: 754px; }
  .docrows { min-height: 380px; }
  .opts { grid-template-columns: 1fr; column-gap: 0; row-gap: var(--sp-xl); }
  .revgrid { grid-template-columns: 1fr; }
  .pgrid { grid-template-columns: repeat(2, 1fr); column-gap: 24px; }
  .split { grid-template-columns: 1fr !important; }
  .ft__grid { grid-template-columns: 1fr 1fr; }
}
@media (max-width: 520px) {
  :root { --gut: 22px; }
  .ft__grid { grid-template-columns: 1fr; }
}

/* ---------- generic split ---------- */
.split { display: grid; grid-template-columns: 1fr 1fr; gap: var(--sp-xxl); align-items: center; }
/* Mobilmenü immer im DOM (fixed) — öffnen/schließen über Opacity + leichten
   Slide, nicht display:none. Sonst schnappt die creme Fläche hart auf und
   bricht mit der Glas-Sprache der Desktop-Leiste. */
.mobile-menu {
  position: fixed; inset: var(--hd-h) 0 0; background: var(--lm-creme); z-index: 55;
  padding: var(--sp-xl) var(--gut);
  opacity: 0; visibility: hidden; pointer-events: none;
  transform: translateY(-10px);
  transition:
    opacity var(--dur-base) var(--ease-standard),
    transform var(--dur-base) var(--ease-entrance),
    visibility 0s linear var(--dur-base);
}
.mobile-menu.open {
  opacity: 1; visibility: visible; pointer-events: auto;
  transform: translateY(0);
  transition:
    opacity var(--dur-base) var(--ease-standard),
    transform var(--dur-base) var(--ease-entrance),
    visibility 0s;
}
.mobile-menu a { display: block; font-size: 22px; color: var(--fg1); text-decoration: none; padding: 16px 0; border-bottom: 1px solid var(--hair); transition: opacity var(--dur-fast) var(--ease-standard); }
/* Das Menü erscheint seit 07/2026 schon ab 1000px, also auch auf Laptops mit Maus —
   ohne Hover war es dort das einzige Navigationselement ohne Rückmeldung. */
.mobile-menu a:hover { opacity: .6; }
@media (prefers-reduced-motion: reduce) {
  .mobile-menu { transition: none; transform: none; }
}

/* ============================================================
   SUB-PAGES — shared components
   ============================================================ */

/* ---------- page intro band ---------- */
.pageintro { padding: var(--sp-xxl) 0 var(--sp-xl); }

/* ---------- travelling process ball (Prozess) ---------- */
.steps--proc .step__num { display: none; }
.procball { position: fixed; top: 50%; transform: translate(-50%, -50%); width: 56px; height: 56px; border-radius: 50%; background: var(--lm-dark-blue); color: var(--lm-creme); display: flex; align-items: center; justify-content: center; z-index: 40; box-shadow: var(--elev-2); opacity: 0; transition: opacity var(--dur-base) var(--ease-standard); pointer-events: none; }
.procball.on { opacity: 1; }
.procball .num { font-family: var(--font-mono); font-size: 20px; transition: opacity var(--dur-fast), transform var(--dur-fast); }
/* ball style variants (data-ball on <html>) */
[data-ball="ring"] .procball { background: transparent; border: 2px solid var(--lm-dark-blue); color: var(--lm-dark-blue); box-shadow: none; }
[data-ball="clay"] .procball { background: var(--lm-clay); }
[data-ball="halo"] .procball { background: var(--lm-clay); box-shadow: 0 0 0 8px rgba(211,125,98,.18), 0 0 0 16px rgba(211,125,98,.08), var(--elev-2); }
[data-ball="soft"] .procball { background: var(--surface-card); color: var(--lm-dark-blue); border: var(--hairline); box-shadow: var(--elev-2); }
[data-ball="big"] .procball { width: 76px; height: 76px; background: var(--lm-dark-blue); }
[data-ball="big"] .procball .num { font-size: 28px; }

/* ---------- process steps (alternating text/visual + spine) ---------- */
.steps { position: relative; display: grid; gap: var(--sp-section); }
.steps::before { content: ""; position: absolute; left: 50%; top: 0; bottom: 0; width: 1px; background: var(--hair); transform: translateX(-50%); }
.step { display: grid; grid-template-columns: 1fr 1fr; gap: var(--sp-xxl); align-items: center; position: relative; }
/* Die Rinne zwischen den Spalten ist zugleich die Bahn des wandernden Ziffern-Balls
   (`.procball`, fix auf der Mittelachse von `#procSteps`). Mit `--sp-xxl` (60px) war sie
   schmaler als der Ball: 56px Kreis plus Halo-Ringe = 88px Aussendurchmesser, er ragte
   also 14px in JEDE Spalte hinein und klebte am Text (Agentur-Feedback 07/2026: „Text
   hier ist sehr nah am fixen Indikator"). Die Lücke richtet sich deshalb nach dem Ball,
   nicht nach dem Abstands-Raster: 152px lassen ihm 32px Luft auf jeder Seite, nach unten
   auf 112px begrenzt (12px Luft), damit die Spalten auf schmalen Zweispaltern nicht
   zusammenfallen. Unter 820px greift die Einspalten-Regel und der Ball ist ausgeblendet.
   Wer den Ball vergrössert (`[data-ball="big"]` = 76px), muss diese Werte mitziehen. */
.steps--proc .step { gap: clamp(112px, 12vw, 152px); }
.step__num { position: absolute; left: 50%; top: 50%; transform: translate(-50%,-50%); width: 46px; height: 46px; border-radius: 50%; background: var(--lm-dark-blue); color: var(--lm-creme); display: flex; align-items: center; justify-content: center; font-family: var(--font-mono); font-size: 17px; z-index: 2; box-shadow: var(--elev-1); }
.step:nth-child(even) .step__text { order: 2; }
.step__meta { font-family: var(--font-mono); font-weight: 300; font-size: 12px; text-transform: uppercase; letter-spacing: .08em; color: var(--fg3); margin-bottom: 14px; }
.step__title { font-family: var(--font-sans); font-weight: 500; font-size: var(--t-d4); line-height: var(--lh-d2); margin-bottom: 14px; }
.step__img { aspect-ratio: 4/3; width: 100%; object-fit: cover; border-radius: var(--r-lg); box-shadow: none; background: var(--surface-sunken); }
/* Schritt 1 ist ein App-Screenshot statt eines Fotos: er wird ganz gezeigt
   (`contain`), damit die „Los geht's"-Box nicht angeschnitten wird. Dadurch
   bleibt oben und unten je ein schmaler Streifen frei (bei 506 px Spaltenbreite
   ~10,7 px). Der trägt zwingend die SEITENFARBE, sonst sieht er aus wie eine
   graue Box mit runden Ecken (Agentur-Feedback 07/2026: genau das war die
   Kritik, verursacht durch `--surface-card`, 6 Einheiten dunkler als der
   bildeigene Grund). `--surface-0` liegt 2 Einheiten daneben und flippt im
   Dunkelmodus mit. Keine Maske: die deckte den Streifen nur zu 59 % ab und
   zeichnete stattdessen die Bildkanten weich. Siehe docs/DESIGN-SYSTEM.md.
   Gilt für ALLE Prozess-Varianten (`.step__img`, `.pv-p1__img`, `.pv-p2__img` …),
   darum als eigener Modifier. Bewusst mit `img` qualifiziert: die Varianten-
   klassen stehen weiter unten in dieser Datei und setzen `object-fit: cover` bei
   gleicher Spezifität — ohne das `img` davor gewinnt die spätere Regel und der
   Modifier bliebe wirkungslos. Nicht zu `.img--shot` vereinfachen. */
img.img--shot { object-fit: contain; background: var(--surface-0); }

/* Prozess-Schritte · Dichte-Tweak (data-procdense) — enger gestaucht, Bilder dürfen höher sein */
/* Prozess-Dichte (data-procdense) — Schritte ineinander gerückt: die Kästchen-Umrisse
   überlappen leicht, Inhalt bleibt frei (alternierende Spalten schieben sich zusammen). */
html[data-procdense="lite"] .steps--proc { gap: 40px; }
html[data-procdense="d1"] .steps--proc { gap: 0; }
html[data-procdense="d1"] .steps--proc .step + .step { margin-top: -64px; }
html[data-procdense="d2"] .steps--proc { gap: 0; }
html[data-procdense="d2"] .steps--proc .step + .step { margin-top: -120px; }
html[data-procdense="d2"] .steps--proc .step__img { aspect-ratio: 3 / 4; }
html[data-procdense="d3"] .steps--proc { gap: 0; }
html[data-procdense="d3"] .steps--proc .step { gap: var(--sp-xl); }
html[data-procdense="d3"] .steps--proc .step + .step { margin-top: -168px; }
@media (max-width: 900px) {
  html[data-procdense^="d"] .steps--proc { gap: var(--sp-lg); }
  html[data-procdense^="d"] .steps--proc .step + .step { margin-top: 0; }
  html[data-procdense="d2"] .steps--proc .step__img { aspect-ratio: 4/3; }
}

/* ---------- price accordion ---------- */
.pacc { display: grid; gap: 16px; }
.pitem { border: var(--hairline); border-radius: var(--r-lg); background: var(--surface-card); overflow: hidden; box-shadow: none; outline: 2px solid transparent; outline-offset: 3px; }
/* Ankunftssignal für Deep-Links (#lumascan / #lumascan-mrt / #copilot, gesetzt
   aus hifi-prozess.js). Der angeflogene Posten ist beim Landen zwangsläufig
   schon offen — er muss vor dem Anflug aufklappen, sonst schiebt `data-autopen`
   das Ziel weg (Begründung dort). Damit fehlt jede Bewegung, die „das war dein
   Klick" mit der Zeile verbindet, und die drei Posten sehen gleich aus.
   Bewusst ein Outline-Ring in Clay statt eines Schattens: 2px solid Clay ist
   bereits die Fokus-Ring-Sprache des Systems (`.pgcell:focus-visible`), und
   Ruheschatten sind ausgeschlossen. Die Outline folgt dem Radius und kostet
   kein Layout, stört den `overflow: hidden` der Karte also nicht. */
.pitem--arrive { animation: pitem-arrive 1500ms var(--ease-standard) 1; }
@keyframes pitem-arrive {
  0%   { outline-color: transparent; }
  12%  { outline-color: var(--lm-clay); }
  100% { outline-color: transparent; }
}
@media (prefers-reduced-motion: reduce) { .pitem--arrive { animation: none; } }
.pitem__head { display: flex; align-items: center; gap: 20px; padding: 20px 32px; cursor: pointer; transition: background var(--dur-fast) var(--ease-standard); }
/* Die Kopfzeile trug `cursor: pointer`, aber keinen Hover — der Zeiger war der
   einzige Hinweis, dass die Zeile aufklappt (Agentur-Feedback 07/2026: „Buttons
   sollten einen hover effect haben"). Getönte Fläche statt Farbwechsel: die Zeile
   enthält Preis und Titel in zwei Gewichten, ein Farbsprung würde beide treffen. */
.pitem__head:hover { background: rgba(6, 43, 81, .04); }
.pitem__name { font-family: var(--font-sans); font-weight: 500; font-size: var(--t-d4); letter-spacing: 0; color: var(--fg1); }
.pitem__price { margin-left: auto; font-family: var(--font-mono); font-weight: 400; font-size: clamp(22px, 2.2vw, 30px); color: var(--fg1); white-space: nowrap; }
.pitem__plus { width: 18px; height: 18px; position: relative; flex: none; }
.pitem__plus::before, .pitem__plus::after { content: ""; position: absolute; background: var(--lm-dark-blue); transition: transform var(--dur-base) var(--ease-entrance); }
.pitem__plus::before { left: 0; right: 0; top: 50%; height: 1.5px; transform: translateY(-50%); }
.pitem__plus::after { top: 0; bottom: 0; left: 50%; width: 1.5px; transform: translateX(-50%); }
.pitem.on .pitem__plus::after { transform: translateX(-50%) scaleY(0); }
.pitem__body { display: grid; grid-template-rows: 0fr; transition: grid-template-rows 720ms cubic-bezier(0.22,1,0.36,1); }
.pitem.on .pitem__body { grid-template-rows: 1fr; }
.pitem__clip { overflow: hidden; }
.pitem__inner { opacity: 0; transform: translateY(8px); transition: opacity 520ms ease 120ms, transform 520ms cubic-bezier(0.22,1,0.36,1) 120ms; }
.pitem.on .pitem__inner { opacity: 1; transform: none; }
.pitem__inner { padding: 0 28px 28px; }
.subhead { font-family: var(--font-mono); font-weight: 300; font-size: 12px; text-transform: uppercase; letter-spacing: .06em; color: var(--fg3); margin: 6px 0 14px; }
.tiles { display: grid; grid-template-columns: repeat(4, 1fr); gap: 8px; }
.tile { font-family: var(--font-mono); font-size: 12px; color: var(--fg2); border: var(--hairline); border-radius: var(--r-sm); padding: 12px 14px; cursor: pointer; background: var(--surface-2); transition: border-color var(--dur-fast), box-shadow var(--dur-fast); }
.tile:hover { border-color: var(--lm-dark-blue); box-shadow: var(--elev-1); }
.pitem__cta { display: flex; gap: 14px; padding: 0 32px 22px; flex-wrap: wrap; }
.pnote { display: flex; align-items: center; gap: 12px; margin-top: 22px; font-family: var(--font-mono); font-weight: 700; font-size: 13px; color: var(--lm-dark-blue); }
.pnote::before { content: ""; width: 6px; height: 6px; border-radius: 50%; background: var(--lm-clay); flex: none; }

/* ---------- FAQ ---------- */
.faq { display: grid; gap: 0; border-top: var(--hairline); max-width: none; }
.faqitem { border-bottom: var(--hairline); }
.faqitem__head { display: flex; align-items: center; gap: 20px; padding: 24px 0; cursor: pointer; }
/* wie .pitem__head: hatte Zeiger, aber keinen Hover. Hier keine getönte Fläche —
   die Zeile hat kein horizontales Padding, der Grund liefe bündig ans erste Wort.
   Und kein Farbwechsel auf Clay: 18px/500 braucht 4,5:1, Clay auf Creme misst 2,94:1.
   Unterstreichen kostet keinen Kontrast und ist dieselbe Geste wie bei .ft__col a. */
.faqitem__head:hover .faqitem__q { text-decoration: underline; text-underline-offset: 3px; }
.faqitem__q { font-family: var(--font-sans); font-weight: 500; font-size: 18px; color: var(--fg1); }
.faqitem__plus { width: 16px; height: 16px; position: relative; flex: none; margin-left: auto; }
.faqitem__plus::before, .faqitem__plus::after { content: ""; position: absolute; background: var(--lm-dark-blue); transition: transform var(--dur-base) var(--ease-entrance); }
.faqitem__plus::before { left: 0; right: 0; top: 50%; height: 1.5px; transform: translateY(-50%); }
.faqitem__plus::after { top: 0; bottom: 0; left: 50%; width: 1.5px; transform: translateX(-50%); }
.faqitem.on .faqitem__plus::after { transform: translateX(-50%) scaleY(0); }
.faqitem__body { display: grid; grid-template-rows: 0fr; transition: grid-template-rows 720ms cubic-bezier(0.22,1,0.36,1); }
.faqitem.on .faqitem__body { grid-template-rows: 1fr; }
.faqitem__clip { overflow: hidden; }
.faqitem__a { opacity: 0; transform: translateY(8px); transition: opacity 520ms ease 120ms, transform 520ms cubic-bezier(0.22,1,0.36,1) 120ms; }
.faqitem.on .faqitem__a { opacity: 1; transform: none; }
/* Antworttext wieder full-width (Entscheidung Till, 07/2026, zusammen mit den
   Sektionsüberschriften — siehe den Block bei .sec-head__intro). Der Deckel aus
   dem Agentur-Feedback („Text nicht über die gesamte Seitenbreite laufen
   lassen") stand hier auf 62ch ≈ 552px ≈ 70 Zeichen und ist entfernt.
   Bewusst in Kauf genommen: die volle Wrap-Breite von 1072px sind bei 16px
   Arimo rund 136 Zeichen pro Zeile, also fast das Doppelte der lesbaren 45–75.
   Unter ~700px hat der Deckel ohnehin nie gegriffen (390px → 42 Zeichen), mobil
   ändert sich durch das Entfernen also nichts. */
.faqitem__a { padding: 0 0 24px; color: var(--fg2); font-size: 16px; line-height: var(--lh-read); }
@media (hover: hover) {
  .faqitem__a a { transition: color var(--dur-fast) var(--ease-standard); }
  .faqitem__a a:hover { color: var(--lm-clay); }
}

/* ---------- detail drawer ---------- */
.drawer-backdrop { position: fixed; inset: 0; background: rgba(6,43,81,.32); opacity: 0; visibility: hidden; transition: opacity var(--dur-base); z-index: 1000; }
.drawer-backdrop.on { opacity: 1; visibility: visible; }
.drawer { position: fixed; top: 0; right: 0; bottom: 0; width: min(440px, 92vw); background: var(--surface-1); box-shadow: var(--elev-4); transform: translateX(100%); transition: transform var(--dur-base) var(--ease-entrance); z-index: 1100; display: flex; flex-direction: column; overflow: hidden; }
.drawer.on { transform: none; }
.drawer__media { position: relative; height: 280px; flex: none; background: var(--surface-sunken); }
.drawer__media img { width: 100%; height: 100%; object-fit: cover; object-position: center top; }
.drawer__close { position: absolute; top: 16px; right: 16px; width: 48px; height: 48px; border: none; background: var(--surface-2); border-radius: 50%; font-size: 28px; cursor: pointer; box-shadow: var(--elev-1); color: var(--fg1); }
.drawer__body { padding: 32px; display: grid; gap: 12px; align-content: start; flex: 1 1 auto; min-height: 0; overflow-y: auto; -webkit-overflow-scrolling: touch; overscroll-behavior: contain; }
.drawer__eyebrow { font-family: var(--font-mono); font-weight: 300; font-size: 11px; text-transform: uppercase; letter-spacing: .08em; color: var(--fg3); }
.drawer__title { font-family: var(--font-sans); font-weight: 500; font-size: var(--t-d5); }
.drawer__meta { display: flex; gap: 8px; flex-wrap: wrap; margin: 4px 0 8px; }
/* Aussehen aus dem Pillen-Primitiv (vorher 8px-Radius und Gewicht 400 — der
   einzige eckige Chip im ganzen Satz). */
.drawer__desc { color: var(--fg2); font-size: 16px; line-height: var(--lh-read); }

/* ---------- team grid ---------- */
.lead { display: grid; grid-template-columns: 1fr 1fr; gap: var(--sp-xxl); align-items: center; }
.lead__photo { aspect-ratio: 4/5; border-radius: var(--r-lg); overflow: hidden; box-shadow: none; background: var(--surface-sunken); }
.lead__photo img { width: 100%; height: 100%; object-fit: cover; }
.lead__role { font-family: var(--font-mono); font-weight: 200; font-size: 13px; color: var(--fg3); margin: 8px 0 18px; }
.cv { display: grid; gap: 11px; list-style: none; padding: 0; margin: 0; }
.cv li { display: grid; grid-template-columns: 76px 1fr; gap: 14px; font-size: 14px; color: var(--fg2); line-height: var(--lh-body); }
.cv li span { font-family: var(--font-mono); font-size: 11px; color: var(--lm-clay); }
.teamgrid { display: grid; grid-template-columns: repeat(4, 1fr); gap: var(--sp-lg); }
.tcard { display: grid; gap: 0; align-content: start; }
.tcard__photo { aspect-ratio: 3/4; border-radius: var(--r-lg); overflow: hidden; background: var(--surface-sunken); box-shadow: none; }
.tcard__photo img { width: 100%; height: 100%; object-fit: cover; }
.tcard__photo--empty { display: flex; align-items: center; justify-content: center; font-family: var(--font-mono); font-weight: 300; font-size: 11px; color: var(--fg3); }
/* Keine Zeilenreserve auf dem Namen: ab 561px passt jeder der 12 Namen in eine
   Zeile (längster: "Julie-M. Schmidt-Tiedemann", 217 von 244px Spaltenbreite).
   Die frühere `min-height: calc(1.3em * 2)` hielt damit auf jeder Karte eine
   Zeile frei, die nie belegt wurde — 21px Luft zwischen Name und Rolle. */
.tcard__name { font-family: var(--font-sans); font-weight: 500; font-size: 16px; line-height: var(--lh-snug); margin-top: 16px; }
/* Mobile (2-spaltiges Team-Raster): hier brechen Namen wirklich um, aber auf
   2 Zeilen, nicht 3 — geprüft bis 320px. `min-height` statt fester `height`,
   damit ein längerer Name künftig nicht in die Rolle läuft.
   Die Rolle bekommt bewusst keine Reserve und keinen Deckel mehr: `height:
   1.3em; overflow: hidden` schnitt sie mitten im Wort ab (bei 390px 3 von 12
   Karten, bei 360px 7 — "Fachärztin Innere Medizin" endete als "Fachärztin
   Innere"). Sie darf jetzt umbrechen. Damit sitzen Beschreibungen benachbarter
   Karten teils 14px versetzt; das ist der Preis für vollständige Rollen. */
@media (max-width: 560px) {
  .teamgrid .tcard__name { font-size: 16px; min-height: calc(1.3em * 2); }
}
.tcard__role { font-family: var(--font-mono); font-weight: 300; font-size: 11px; color: var(--fg3); margin-top: 4px; min-height: 1.3em; }
.tcard__desc { font-size: 13px; line-height: var(--lh-body); color: var(--fg2); margin-top: 10px; }

/* ---------- location tiles ---------- */
.loctiles { display: grid; grid-template-columns: repeat(5, 1fr); gap: var(--sp-md); }
.loctile { border: var(--hairline); border-radius: var(--r-lg); background: var(--surface-card); box-shadow: none; padding: 18px; display: grid; gap: 14px; }
.loctile__name { font-family: var(--font-sans); font-weight: 500; font-size: 18px; }
/* Status-Pillen: Kontrast auf ≥5:1 gebracht (Agentur-Feedback 07/2026: „nicht
   barrierefrei, zu geringer Kontrast"). Gemessen auf dem tatsächlich
   zusammengerechneten Pillen-Grund (die Füllungen sind halbtransparent, es zählt
   also nicht der reine Farbwert): „geöffnet" stand bei **3,93:1**, „Start …" bei
   **4,1:1**, beide unter den 4,5:1 für 11px. Die Töne sind dieselben geblieben,
   nur in der Helligkeit gesenkt (H und S gehalten) — es kommen keine neuen
   Farben dazu.
   Gewicht 200 → 300: ≤12px Mono laufen laut Design-System mit 300. Diese Regel
   war beim damaligen Durchgang übersehen worden, und genau hier greift die
   `.pcard__tag`-Lehre — bei Haarstrichen ist der Kontrastwert allein kein Beleg
   für Lesbarkeit, die Strichstärke muss mit. */
/* Aussehen kommt aus dem Pillen-Primitiv weiter oben. Hier stehen nur noch die
   getönten Füllungen von früher — bewusst entfernt, nicht auskommentiert. */

/* ---------- header location dropdown ---------- */
.hd__nav .has-drop { position: relative; display: inline-flex; align-items: center; }
/* extend the trigger's hover zone down across the 8px gap, so a slow diagonal
   move from "Standorte" onto an option doesn't drop the hover and snap it shut */
.hd__nav .has-drop::after { content: ""; position: absolute; left: -10px; right: -10px; top: 100%; height: 18px; }
.hd__drop { position: absolute; top: calc(100% + 8px); left: 50%; transform: translateX(-50%); min-width: 232px; background: var(--surface-2); border: var(--hairline); border-radius: var(--r-md); box-shadow: var(--elev-3); padding: 8px; display: flex; flex-direction: column; gap: 2px; z-index: 200; opacity: 0; visibility: hidden; pointer-events: none; transition: opacity .18s var(--ease) .34s, visibility 0s linear .52s; }
.has-drop:hover .hd__drop, .has-drop:focus-within .hd__drop { opacity: 1; visibility: visible; pointer-events: auto; transition: opacity .18s var(--ease), visibility 0s; }
/* menubar swap: once another trigger takes over, the panel being left closes at once.
   The .52s close delay above must not survive a trigger-to-trigger move — the panels are
   232px wide but their triggers sit ~97px apart, so both visible means both stacked. */
.hd__nav:has(.has-drop:hover, .has-drop:focus-within) .has-drop:not(:hover):not(:focus-within) .hd__drop { opacity: 0; visibility: hidden; pointer-events: none; transition: none; }
.hd__drop a { padding: 10px 12px; border-radius: var(--r-sm); font-size: 14px; display: flex; justify-content: space-between; align-items: center; gap: 16px; border: 0 !important; color: var(--fg1); }
.hd__drop a:hover { background: rgba(6,43,81,.06); }
.hd__drop .st { font-family: var(--font-mono); font-weight: 300; font-size: 11px; text-transform: uppercase; letter-spacing: .04em; color: var(--fg3); }
/* dark mode: --elev-3 is a navy shadow (built for creme backgrounds) and disappears
   on dark surfaces, so the panel needs its own border/shadow to read as a floating
   card instead of blending into the page behind it; hover fill needs a light tint too */
html[data-mode="dunkel"] .hd__drop { border: 1px solid var(--hair-strong); box-shadow: 0 2px 8px rgba(0,0,0,.3), 0 16px 40px rgba(0,0,0,.5); }
html[data-mode="dunkel"] .hd__drop a:hover { background: rgba(244,238,230,.08); }

/* ---------- Frame 1 · Portrait-Bühne Stil-Varianten (data-stage, nur chk--a) ---------- */

/* orig · Bühne geteilt: Motiv rechts, Text in eigener Spalte links
   (Agentur-Feedback 07/2026). Drei Beanstandungen, eine Ursache: die Headline
   hing am unteren Rand, während das Gesicht mit dem Bildausschnitt wanderte,
   und der Ausschnitt hängt am Seitenverhältnis des Fensters. Gemessen bei
   1632px Breite lief die Headline 144px tief durchs Gesicht, stand 20px neben
   dem Zähler, und der Zähler nahm 27 % der Bühnenhöhe ein. Auf hohen Fenstern
   war nichts davon zu sehen — deshalb fiel es intern nie auf.

   Die Trennung läuft jetzt **waagerecht statt senkrecht**: Text links, Motiv
   rechts. Das hält bei jedem Seitenverhältnis, weil beide sich nie wieder
   dieselbe Spalte teilen. Senkrecht (höherer Ausschnitt, kleinere Typo) wäre
   nur eine Verschiebung des Problems gewesen.

   Ausdrücklich auf `orig` geschraubt (plus `:not([data-stage])` für den ersten
   Paint, bevor das Tweak-Panel das Attribut setzt) — die anderen fünf Bühnen
   bringen eigene Scrims und Zähler-Positionen mit und bleiben unberührt.

   Nur ab 901px: darunter steht der Zähler oben und der Text darunter (siehe
   Mobil-Block weiter unten), das ist bereits eine geteilte Bühne. */
@media (min-width: 901px) {
  /* Der Bildkasten ragt 40 % über die rechte Kante hinaus (`.chk--a` ist
     `overflow: hidden`). Dadurch sitzt das Motiv rechts der Mitte, und links
     entsteht die ruhige Wandfläche, auf der der Text steht. `cover` deckt
     weiterhin den ganzen Kasten ab, es kann also kein Rand aufblitzen. */
  html:not([data-stage]) .chk--a .chk__bg,
  html[data-stage="orig"] .chk--a .chk__bg { right: -40%; background-position: left 26%; }
  /* Schleier waagerecht statt senkrecht gewichtet: bis 56 % Breite trägt er den
     Text, danach gibt er das Gesicht frei. Der Boden-Verlauf hält den Zähler
     unten rechts lesbar, der sonst auf dem hellen Pullover steht.
     Gemessen (creme auf dem fertig komponierten Bild, schlechtester Pixel):
     Titel 6,3:1 · Unterzeile 9,6:1 · Zähler 3,5:1. Der Zähler ist der knappste
     Wert, er liegt knapp über der 3:1-Schwelle für grosse Schrift. Wer den
     Boden-Verlauf aufhellt, misst ihn bitte nach. */
  html:not([data-stage]) .chk--a .chk__scrim,
  html[data-stage="orig"] .chk--a .chk__scrim {
    background:
      linear-gradient(97deg, rgba(6,43,81,.92) 0%, rgba(6,43,81,.84) 38%, rgba(6,43,81,.62) 56%, rgba(6,43,81,.20) 78%, rgba(6,43,81,.06) 100%),
      linear-gradient(180deg, rgba(6,43,81,0) 52%, rgba(6,43,81,.56) 100%);
  }
  /* 74px → 62px und eine gedeckelte Spalte: der Titel läuft dreizeilig und
     endet bei jeder Fensterbreite vor dem Gesicht. `40vw` fängt die schmalen
     Laptops ab, wo 600px sonst bis in die Wange reichen würden.
     Beim Ändern dieser drei Zahlen (`-40%`, `600px`, `40vw`) die Luft zwischen
     Textspalte und Gesicht über die Breiten nachrechnen: sie ist nicht
     monoton, weil der Text mit `(W - 1200) / 2` mitwandert, das Gesicht aber
     mit `0,60 × W`. Engste Stelle ist 1512px mit 91px Luft, nicht der
     schmalste oder breiteste Viewport. */
  html:not([data-stage]) .chk--a .chk__title,
  html[data-stage="orig"] .chk--a .chk__title { font-size: clamp(38px, 4vw, 62px); max-width: min(600px, 40vw); }
  html:not([data-stage]) .chk--a .chk__sub,
  html[data-stage="orig"] .chk--a .chk__sub { max-width: min(500px, 34vw); }
  /* Zähler aus der Mitte nach unten rechts, auf gut die halbe Größe. Dort steht
     er diagonal gegenüber dem Text, nicht mehr neben seinem Zeilenende. */
  html:not([data-stage]) .chk--a .chkcount,
  html[data-stage="orig"] .chk--a .chkcount { top: auto; bottom: 56px; transform: none; }
  html:not([data-stage]) .chk--a .chkcount__n,
  html[data-stage="orig"] .chk--a .chkcount__n { font-size: clamp(56px, 6.6vw, 116px); }
  html:not([data-stage]) .chk--a .chkcount__p,
  html[data-stage="orig"] .chk--a .chkcount__p { font-size: clamp(24px, 2.8vw, 48px); }
}

/* Hochformat ab 901px: Bild wieder mittig, Schleier wieder senkrecht.
   ---------------------------------------------------------------------------
   Der Block darüber komponiert eine QUERFORMAT-Bühne: der Kasten ragt 40 % nach
   rechts hinaus, das Bild hängt am linken Rand (`left 26%`), und links bleibt
   die ruhige Wandfläche. Das trägt sich nur, solange `cover` an der BREITE
   skaliert.

   Auf einem hohen, schmalen Fenster kippt genau das. Der Kasten wird relativ
   höher als das Motiv (1800x905, Seitenverhältnis 1,99), `cover` skaliert dann
   an der HÖHE, das Bild wird dadurch deutlich breiter als der Kasten, und weil
   es links verankert ist, wandert das Gesicht rechts hinaus. Gemessen bei
   916x1242: sichtbar bleiben die linken 39 % der Bildbreite, das Gesicht
   beginnt aber erst bei 37 % und reicht bis 62 %. Übrig bleibt eine blaue Wand
   mit einer Haarsträhne am Rand.

   Die Umschaltgrenze ist deshalb das Seitenverhältnis des Fensters, nicht seine
   Breite: `cover` skaliert an der Breite, solange (1,4 x Breite) / Bühnenhöhe
   >= 1,99 gilt, und die Bühne ist rund 0,95 der Fensterhöhe. Das ergibt etwa
   1,35; 7/5 lässt etwas Luft und hält 1180x820 (1,44) in der Querformat-Bühne,
   wo sie nachweislich trägt.

   Darunter greifen wieder die Grundregeln (`center 22%`, senkrechter Schleier),
   die unterhalb von 901px ohnehin laufen und dort korrekt sitzen: mittig
   verankert bleibt das Gesicht im Bild, egal wie schmal der Kasten wird.
   Typografie und Zählerposition aus dem Block darüber bleiben absichtlich
   unangetastet, die hängen nicht am Bildausschnitt. */
@media (min-width: 901px) and (max-aspect-ratio: 7/5) {
  html:not([data-stage]) .chk--a .chk__bg,
  html[data-stage="orig"] .chk--a .chk__bg { right: 0; background-position: center 22%; }
  html:not([data-stage]) .chk--a .chk__scrim,
  html[data-stage="orig"] .chk--a .chk__scrim {
    background: var(--hero-scrim-nav), var(--hero-scrim-text);
  }
}

/* kino · Vollbild, große Typo, Zähler unten rechts */
html[data-stage="kino"] .chk--a .chk__in { min-height: 92vh; padding-bottom: 76px; }
html[data-stage="kino"] .chk--a .chk__title { font-size: clamp(46px, 6vw, 92px); line-height: 1.04; }
html[data-stage="kino"] .chk--a .chk__scrim { background: linear-gradient(72deg, rgba(6,43,81,.78) 0%, rgba(6,43,81,.34) 52%, rgba(6,43,81,.10) 100%), linear-gradient(180deg, rgba(6,43,81,0) 55%, rgba(6,43,81,.55) 100%); }
html[data-stage="kino"] .chk--a .chkcount { top: auto; bottom: 64px; transform: none; }

/* fokus · links zentriert, Kicker mit Haarlinie, seitlicher Scrim */
html[data-stage="fokus"] .chk--a .chk__in { min-height: 82vh; justify-content: center; padding: 108px 0 64px; }
html[data-stage="fokus"] .chk--a .chk__scrim { background: linear-gradient(90deg, rgba(6,43,81,.84) 0%, rgba(6,43,81,.46) 46%, rgba(6,43,81,.06) 82%); }
html[data-stage="fokus"] .chk--a .chk__title::before { content: 'der lumamed prozess'; display: block; font-family: var(--font-mono); font-weight: 200; font-size: 13px; letter-spacing: .08em; text-transform: uppercase; color: rgba(255,250,244,.78); margin-bottom: 22px; padding-top: 18px; border-top: 1px solid rgba(255,250,244,.42); max-width: 46ch; }
html[data-stage="fokus"] .chk--a .chkcount__n { font-size: clamp(60px, 10vw, 140px); }
html[data-stage="fokus"] .chk--a .chkcount__p { font-size: clamp(28px, 4.4vw, 58px); }

/* band · Bild oben, Text auf Creme-Band darunter (Editorial-Split) */
html[data-stage="band"] .chk--a .chk__bg,
html[data-stage="band"] .chk--a .chk__scrim { bottom: auto; height: 62vh; }
html[data-stage="band"] .chk--a .chk__scrim { background: linear-gradient(180deg, rgba(6,43,81,.08), rgba(6,43,81,.26)); }
html[data-stage="band"] .chk--a .chk__in { min-height: 0; display: grid; grid-template-columns: minmax(0, 1.35fr) minmax(0, 1fr); gap: var(--sp-lg); align-items: start; padding: calc(62vh + 52px) 0 72px; color: var(--fg1); }
html[data-stage="band"] .chk--a .chk__title { color: var(--fg1); }
html[data-stage="band"] .chk--a .chk__sub { color: var(--fg2); margin: 8px 0 0; }
html[data-stage="band"] .chk--a .chkcount { top: 62vh; bottom: auto; transform: translateY(-112%); }

/* rahmen · Bild als eingefasste Bühne mit Radius (Galerie-Look) */
html[data-stage="rahmen"] .chk--a { padding: 22px; }
html[data-stage="rahmen"] .chk--a .chk__bg,
html[data-stage="rahmen"] .chk--a .chk__scrim { inset: 22px; border-radius: var(--r-lg); }
html[data-stage="rahmen"] .chk--a .chk__scrim { background: linear-gradient(180deg, rgba(6,43,81,.18) 0%, rgba(6,43,81,.46) 62%, rgba(6,43,81,.78) 100%); }
html[data-stage="rahmen"] .chk--a .chk__in { min-height: 84vh; padding: 120px 0 80px; }
html[data-stage="rahmen"] .chk--a .chkcount { top: 128px; transform: none; }
html[data-stage="rahmen"] .chk--a .chkcount__n { font-size: clamp(60px, 9vw, 130px); }

/* ruhig · zentriert unten, schwerer Boden-Scrim, Zähler oben rechts klein */
html[data-stage="ruhig"] .chk--a .chk__in { min-height: 86vh; align-items: center; text-align: center; padding-bottom: 88px; }
html[data-stage="ruhig"] .chk--a .chk__sub { margin: 20px auto 6px; }
html[data-stage="ruhig"] .chk--a .chk__scrim { background: linear-gradient(180deg, rgba(6,43,81,.20) 0%, rgba(6,43,81,.40) 55%, rgba(6,43,81,.88) 100%); }
html[data-stage="ruhig"] .chk--a .chkcount { top: 112px; transform: none; }
html[data-stage="ruhig"] .chk--a .chkcount__n { font-size: clamp(50px, 6.6vw, 100px); }
html[data-stage="ruhig"] .chk--a .chkcount__p { font-size: clamp(24px, 3vw, 44px); }

/* Hero-Text: seitlicher Gutter darf nicht durch Padding-Shorthands der Stage-Varianten verloren gehen */
.chk--a .chk__in, .chk--c .chk__inC { padding-left: var(--gut) !important; padding-right: var(--gut) !important; }

@media (max-width: 900px) {
  /* Muss NACH der unconditional .chk--a .chk__in-Regel (Zeile ~346) stehen, sonst
     gewinnt deren padding/justify-content per Quellreihenfolge und der Titel rutscht
     zurück unter die riesige 90+-Ziffer (Überlappung auf Mobile). */
  .chk--a .chk__in { justify-content: flex-start; padding-top: 250px; }
  html[data-stage="kino"] .chk--a .chk__title { font-size: clamp(34px, 9vw, 46px); }
  html[data-stage="band"] .chk--a .chk__bg,
  html[data-stage="band"] .chk--a .chk__scrim { height: 46vh; }
  html[data-stage="band"] .chk--a .chk__in { grid-template-columns: 1fr; padding-top: calc(46vh + 36px); }
  html[data-stage="band"] .chk--a .chkcount { top: 46vh; }
  html[data-stage="rahmen"] .chk--a { padding: 10px; }
  html[data-stage="rahmen"] .chk--a .chk__scrim { inset: 10px; }
  html[data-stage="rahmen"] .chk--a .chk__in { padding-left: 34px !important; padding-right: 34px !important; }
  /* DS V2: keine erzwungenen Umbrüche auf Mobile — Titel fließen lassen */
  .chk__title br { display: none; }
  html[data-stage="rahmen"] .chk--a .chk__bg,
  html[data-stage="rahmen"] .chk--a .chk__scrim { inset: 10px; }
}

/* ---------- Prozess-Varianten (Tweak data-procvar) ---------- */
.procvar { display: none; }
html[data-procvar]:not([data-procvar="aktuell"]) #procSteps { display: none; }
html[data-procvar]:not([data-procvar="aktuell"]) .procball { display: none !important; }
html[data-procvar="pulse1"] #pvPulse1,
html[data-procvar="func1"] #pvFunc1 { display: block; }
html[data-procvar="pulse2"] #pvPulse2 { display: block; }
html[data-procvar="func2"] #pvFunc2,
html[data-procvar="luma"] #pvLuma { display: grid; }
html[data-procvar="pulse1"] #pvPulse1 { display: grid; }

/* pulse1 · Rail + Panels */
.pv-p1 { grid-template-columns: 300px 1fr; gap: var(--sp-xl); align-items: start; }
.pv-p1__rail { position: sticky; top: 120px; }
.pv-p1__railin { position: relative; display: grid; gap: 4px; padding-left: 20px; }
.pv-p1__kicker { font-family: var(--font-mono); font-weight: 300; font-size: 12px; text-transform: uppercase; letter-spacing: .06em; color: var(--fg3); margin-bottom: 14px; }
.pv-p1__prog { position: absolute; left: 0; top: 44px; bottom: 8px; width: 2px; background: var(--hair); }
.pv-p1__progfill { width: 100%; height: 25%; background: var(--lm-clay); transition: height .4s var(--ease); }
.pv-p1__navitem { display: flex; align-items: baseline; gap: 12px; text-align: left; background: none; border: 0; cursor: pointer; padding: 10px 0; color: var(--fg3); transition: color .2s; }
.pv-p1__navitem.on { color: var(--fg1); }
.pv-p1__navnum { font-family: var(--font-mono); font-weight: 200; font-size: 13px; flex: none; }
.pv-p1__navtitle { font-family: var(--font-sans); font-size: 16px; line-height: var(--lh-body); }
.pv-p1__navitem.on .pv-p1__navtitle { font-weight: 500; }
.pv-p1__panels { display: grid; gap: 96px; }
.pv-p1__panel { max-width: 640px; }
/* `--fg2` statt `--fg3` (Agentur-Feedback 07/2026: „Dauer ca." schlecht lesbar).
   Die Zeile steht auf `grad-light-03`, dem warmen Scroll-Verlauf, und der ist
   genau dort am hellsten, wo die Textspalte liegt. Gemessen über die ganze
   Viewport-Höhe (der Verlauf hängt an `background-attachment: fixed`, die Zeile
   wandert beim Scrollen also durch ihn hindurch): `--fg3` kam in der Textspalte
   auf **4,2:1**, in der wärmsten Ecke auf 3,75:1 — unter den 4,5:1, die 12px als
   normaler Text braucht. `--fg2` bringt **4,9:1**.
   Der Mobil-Block hatte dieselbe Stelle schon einzeln nachgebessert; die Ursache
   galt aber nie nur für Mobil, deshalb sitzt es jetzt in der Grundregel.
   Gewicht bleibt 300: ≤12px Mono laufen im Hellmodus mit 300 (Design-System),
   die Korrektur läuft hier über die Farbe. */
.pv-p1__meta { font-family: var(--font-mono); font-weight: 300; font-size: 12px; text-transform: uppercase; letter-spacing: .05em; color: var(--fg2); margin-bottom: 12px; }
.pv-p1__title { font-family: var(--font-sans); font-weight: 500; font-size: clamp(22px, 2.2vw, 30px); line-height: 1.14; margin: 0 0 14px; }
.pv-p1__img { width: 100%; aspect-ratio: 16/10; object-fit: cover; border-radius: var(--r-lg); background: var(--surface-sunken); margin-top: 24px; }

/* pulse2 · Sticky-Bühne */
.pv-p2 { height: 400vh; position: relative; }
.pv-p2__stage { position: sticky; top: 0; height: 100vh; display: flex; align-items: center; overflow: hidden; padding-top: calc(75px + 16vh); }
html[data-procvar="pulse2"] .section:has(#pvPulse2) { padding-bottom: 0; }
/* Der Abstand vom letzten Bild bis zur Kante des Preis-Blocks ist eine gewählte
   Zahl (160 px) und keine Restluft mehr (07/2026: „sehr wenig Abstand zwischen
   Bild und wo die Kante kommt", nach der ersten Runde mit 112 px noch einmal
   „increase margin between the image and border even more").
   Vorher stand hier `-18vh`. Der Rest unter dem letzten Frame ist aber selbst
   fensterhöhenabhängig: die Bühne ist `100vh` hoch, oben um `75px + 16vh`
   eingerückt, und der Frame steht mittig darin — es bleiben
   `(84vh - 75px - 384px) / 2` unter ihm, also `42vh - 229,5px`. Ein Zug von
   18vh zieht davon nur 18 ab; die Differenz wächst mit **24vh** weiter. Gemessen
   am Ende der Bühne: **-52 px bei 816 px Fensterhöhe, -32 px bei 906 px** — der
   Preis-Block lag also über der Bildunterkante und schob sich beim Scrollen
   sichtbar darüber, je kürzer das Fenster desto weiter. Auf hohen Fenstern war
   davon nichts zu sehen, deshalb fiel es intern nie auf (gleiche Signatur wie
   bei der Portrait-Bühne, siehe DESIGN-SYSTEM).
   Der Zug hebt den `42vh`-Anteil jetzt vollständig auf, übrig bleibt der
   gewünschte Abstand. `384px` ist die Höhe des Frames: das 4:3-Bild in der
   512-px-Spalte (Wrap 1200 - 128 Innenabstand - 48 Spalte). Unter 1200 px
   schrumpft das Bild, der Abstand wächst dort um `(384px - Bildhöhe) / 2`.
   **Bildformat oder Bühnenpolster geändert = beide Zahlen nachrechnen.** */
html[data-procvar="pulse2"] .pv-p2 { margin-bottom: calc(160px + (75px + 384px) / 2 - 42vh); }
/* Gegenstück zur selben Beanstandung („ziemlich wenig Abstand zwischen dem Ende
   des Frames und der nächsten Überschrift"): der Preis-Block trägt oben
   `--sp-section + --sp-lg` = 112 px statt der 80 px aller anderen Sections. Er
   ist die einzige Section, die direkt unter einer klebenden Bühne beginnt — der
   Leser kommt hier nicht aus einer Ruhelage, sondern aus einer laufenden
   Bewegung.
   **Nur ab 901 px**, denn nur dort klebt die Bühne. Darunter stehen die Frames
   als normale Blöcke untereinander (`.pv-p2 { height: auto }`, Frame-Abstand
   56 px), da gibt es die Beanstandung nicht und die 56 px der Section reichen. */
@media (min-width: 901px) {
  #preise { padding-top: calc(var(--sp-section) + var(--sp-lg)); }
}
/* Von `opacity: .08` auf eine halbtransparente Farbe (07/2026: „Kontrast der
   mitlaufenden Ziffern"). Die Ziffer stand auf `grad-light-03`, dem warmen
   Scroll-Verlauf, und kam über dessen Fläche auf **1,16:1** — sie war praktisch
   nicht da. `.26` bringt **1,69:1** (schlechtester Punkt 1,59:1).
   Warum nicht auf die 3:1 aus WCAG 1.4.11 hoch: dafür bräuchte es rund `.60`,
   und eine fast deckende 180px-Ziffer neben der Textspalte ist keine
   Hintergrundziffer mehr. Stattdessen trägt jetzt `.pv-p2__step` („Schritt 2 / 4",
   unten, `--fg2`) die Schrittinformation als echter Text — die Ziffer darf damit
   dekorativ bleiben (1.4.1 erfüllt). Dieselbe Abwägung wie bei den Status-Punkten
   der Standorte, siehe DESIGN-SYSTEM.
   Clay war hier keine Option: auf warmem Grund misst es schlechter als
   Dunkelblau (bei 50 % noch 1,24:1 im schlechtesten Punkt).
   Farbe statt `opacity`, damit die Deckkraft nicht zwei Bedeutungen hat und die
   Ziffer bei einem Verlaufstausch über eine Zeile nachmessbar bleibt. */
.pv-p2__bignum { position: absolute; top: calc(75px + 6vh); left: 0; font-family: var(--font-mono); font-weight: 200; font-size: clamp(80px, 12vw, 180px); line-height: 1; color: rgba(6,43,81,.26); user-select: none; }
.pv-p2__dots { position: absolute; right: 8px; top: 50%; transform: translateY(-50%); display: grid; gap: 10px; }
.pv-p2__dots span { width: 8px; height: 8px; border-radius: 50%; background: var(--hair); transition: background .3s, transform .3s; }
.pv-p2__dots span.on { background: var(--lm-clay); transform: scale(1.35); }
/* Steht jetzt auf allen Breiten, nicht mehr nur mobil. Auf Desktop war die
   grosse Hintergrundziffer zusammen mit den Punkten rechts die *einzige*
   Schrittanzeige — beide dekorativ schwach (Ziffer 1,16:1, Punkte 1,36:1 inaktiv).
   Mit dieser Zeile trägt lesbarer Text die Information, und Ziffer wie Punkte
   dürfen Grafik bleiben.
   `--fg2` und Gewicht 300 statt vorher Clay/500: Clay ist als Textfarbe auf dem
   Verlauf nie barrierefrei (Median 2,92:1, 100 % der Fläche unter 4,5:1) und
   ≤12px Mono laufen im Hellmodus mit 300 — beides Global-Regeln im
   DESIGN-SYSTEM. Die mobile Variante lief bisher an beiden vorbei. */
.pv-p2__step { display: block; font-family: var(--font-mono); font-weight: 300; font-size: 12px; text-transform: uppercase; letter-spacing: .06em; color: var(--fg2); margin-bottom: 8px; }
.pv-p2__frames { position: relative; width: 100%; }
.pv-p2__frame { position: absolute; inset: 0; display: grid; grid-template-columns: 1fr 1fr; gap: var(--sp-xl); align-items: center; opacity: 0; transform: translateY(18px); transition: opacity .45s var(--ease), transform .45s var(--ease); pointer-events: none; }
.pv-p2__frame.on { position: relative; opacity: 1; transform: none; pointer-events: auto; }
.pv-p2__title { font-family: var(--font-sans); font-weight: 500; font-size: clamp(24px, 2.6vw, 36px); line-height: 1.12; margin: 0 0 16px; }
.pv-p2__img { width: 100%; aspect-ratio: 4/3; object-fit: cover; border-radius: var(--r-lg); background: var(--surface-sunken); }

/* func1 · Scroll-Toggles */
.pv-f1 { border-top: var(--hairline); }
.pv-f1__item { border-bottom: var(--hairline); }
.pv-f1__head { display: flex; align-items: baseline; gap: 20px; padding: 26px 0; cursor: pointer; }
.pv-f1__num { font-family: var(--font-mono); font-weight: 200; font-size: 14px; color: var(--fg3); flex: none; }
.pv-f1__title { font-family: var(--font-sans); font-weight: 500; font-size: clamp(19px, 1.8vw, 24px); line-height: 1.2; color: var(--fg2); transition: color .3s; flex: 1; }
.pv-f1__item.open .pv-f1__title { color: var(--fg1); }
.pv-f1__meta { font-family: var(--font-mono); font-weight: 300; font-size: 11px; text-transform: uppercase; letter-spacing: .05em; color: var(--fg3); flex: none; }
.pv-f1__bodywrap { display: grid; grid-template-rows: 0fr; transition: grid-template-rows .5s var(--ease); }
.pv-f1__item.open .pv-f1__bodywrap { grid-template-rows: 1fr; }
.pv-f1__body { overflow: hidden; display: grid; grid-template-columns: minmax(0, 56ch) minmax(0, 1fr); gap: var(--sp-lg); align-items: start; }
.pv-f1__item.open .pv-f1__body { padding-bottom: 32px; }
.pv-f1__body .body { padding-left: 34px; }
.pv-f1__img { width: 100%; max-height: 300px; aspect-ratio: 16/9; object-fit: cover; border-radius: var(--r-md); background: var(--surface-sunken); }

/* func2 · Klick-Toggles + Bildspalte */
.pv-f2 { grid-template-columns: minmax(0, 1fr) minmax(0, 42%); gap: var(--sp-xl); align-items: start; }
.pv-f2__list { border-top: var(--hairline); }
.pv-f2__item { border-bottom: var(--hairline); }
.pv-f2__head { display: flex; align-items: baseline; gap: 18px; width: 100%; text-align: left; background: none; border: 0; cursor: pointer; padding: 24px 0; }
.pv-f2__title { font-family: var(--font-sans); font-weight: 500; font-size: clamp(18px, 1.7vw, 22px); line-height: 1.22; color: var(--fg2); flex: 1; transition: color .3s; }
.pv-f2__item.open .pv-f2__title { color: var(--fg1); }
.pv-f2__chev { font-family: var(--font-mono); font-weight: 200; font-size: 18px; color: var(--fg3); transition: transform .3s var(--ease); flex: none; }
.pv-f2__item.open .pv-f2__chev { transform: rotate(45deg); }
.pv-f2__bodywrap { display: grid; grid-template-rows: 0fr; transition: grid-template-rows .45s var(--ease); }
.pv-f2__item.open .pv-f2__bodywrap { grid-template-rows: 1fr; }
.pv-f2__body { overflow: hidden; }
.pv-f2__item.open .pv-f2__body { padding: 0 0 28px 32px; }
.pv-f2__imgm { display: none; }
.pv-f2__media { position: sticky; top: 120px; aspect-ratio: 4/5; border-radius: var(--r-lg); overflow: hidden; background: var(--surface-sunken); }
.pv-f2__media img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; opacity: 0; transition: opacity .5s var(--ease); }
.pv-f2__media img.on { opacity: 1; }

/* luma · Stepper-Tabs */
.pv-lu { gap: var(--sp-lg); }
.pv-lu__tabs { display: grid; grid-template-columns: repeat(4, 1fr); gap: 20px; }
.pv-lu__tab { text-align: left; background: none; border: 0; cursor: pointer; padding: 0 0 14px; display: grid; gap: 8px; align-content: start; color: var(--fg3); position: relative; }
.pv-lu__tabnum { font-family: var(--font-mono); font-weight: 200; font-size: 13px; }
.pv-lu__tabtitle { font-family: var(--font-sans); font-size: 14px; line-height: 1.3; color: inherit; }
.pv-lu__tab.on { color: var(--fg1); }
.pv-lu__tab.on .pv-lu__tabtitle { font-weight: 500; }
.pv-lu__tabbar { position: absolute; left: 0; right: 0; bottom: 0; height: 2px; background: var(--hair); overflow: hidden; }
.pv-lu__tabbar span { display: block; height: 100%; width: 0; background: var(--lm-clay); }
.pv-lu__tab.on .pv-lu__tabbar span { width: 100%; transition: width 5.2s linear; }
.pv-lu.paused .pv-lu__tab.on .pv-lu__tabbar span { transition: width .3s var(--ease); }
@media (prefers-reduced-motion: reduce) { .pv-lu__tab.on .pv-lu__tabbar span { transition: none; } }
.pv-lu__panels { position: relative; }
.pv-lu__panel { display: none; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: var(--sp-xl); align-items: center; }
.pv-lu__panel.on { display: grid; animation: pvfade .45s var(--ease); }
@keyframes pvfade { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: none; } }
.pv-lu__img { width: 100%; aspect-ratio: 4/3; object-fit: cover; border-radius: var(--r-lg); background: var(--surface-sunken); }

@media (max-width: 900px) {
  .pv-p1 { grid-template-columns: 1fr; }
  .pv-p1__rail { position: static; }
  .pv-p1__panels { gap: 64px; }
  .pv-p2 { height: auto; }
  html[data-procvar="pulse2"] .pv-p2 { margin-bottom: 0; }
  .pv-p2__stage { position: static; height: auto; display: block; padding: 24px 0; }
  .pv-p2__bignum, .pv-p2__dots { display: none; }
  .pv-p2__frame { position: relative; opacity: 1; transform: none; pointer-events: auto; grid-template-columns: 1fr; gap: 20px; margin-bottom: 56px; }
  /* Ohne die große Hintergrundziffer/Punkte (oben ausgeblendet) fehlt mobil jede
     Schritt-Orientierung — dafür steht `.pv-p2__step`. Die Regel dazu ist seit
     07/2026 die Grundregel und gilt für alle Breiten, hier steht deshalb nichts
     mehr. (Die Kontrast-Nachbesserung der Meta-Zeile stand früher ebenfalls hier
     und sitzt jetzt in der Grundregel von `.pv-p1__meta`.) */
  .pv-f1__head { flex-wrap: wrap; }
  .pv-f1__meta { width: 100%; padding-left: 34px; }
  .pv-f1__body { grid-template-columns: 1fr; }
  .pv-f2 { grid-template-columns: 1fr; }
  .pv-f2__media { display: none; }
  .pv-f2__imgm { display: block; width: 100%; aspect-ratio: 16/9; object-fit: cover; border-radius: var(--r-md); background: var(--surface-sunken); margin-top: 18px; }
  .pv-lu__tabs { grid-template-columns: repeat(2, 1fr); }
  .pv-lu__panel { grid-template-columns: 1fr; }
}

/* ---------- Karriere-Seiten (khero, kben, kproc, kform) + 5 Stil-Varianten (data-kstil) ---------- */
.khero { position: relative; overflow: hidden; }
/* Sono-Bühne: statisches Vollbild mit Titel/Subtitel */
.khero__bg { position: absolute; inset: 0; background: #0c1524 url('assets/proc-praxistag.webp') center 32% / cover no-repeat; }
/* Oberer Anfang .74 statt .26, seit der Header auf dem Hero liegt: gemessen am
   Foto (proc-praxistag) lag creme Navigation bei .26 auf 1,77:1 — unlesbar. Bei
   .65 sind es 4,83:1. Der Verlauf fällt danach weich auf die alte Kurve zurück,
   damit keine Kante entsteht. Beim Bildtausch neu messen. */
/* Karriere braucht einen kräftigeren Boden-Verlauf als die geteilte
   `--hero-scrim-text` (.68). `proc-praxistag.webp` ist genau dort hell, wo die
   Inhalte stehen: gemessen kam die Headline auf **2,01:1**, der Kicker auf
   1,57:1, beide Buttons unter 3:1 gegen den Untergrund. Die Tokens selbst
   bleiben unangetastet, sie tragen auch Home und Prozess und sind dort über 34
   Videoframes eingemessen. Deshalb hier eine seitengebundene Kopie mit
   Plateau **.82** statt .68 — und vor allem eine **gestreckte** Kurve.
   Das Plateau allein reichte nicht: der Kicker sitzt am OBEREN Rand des
   Inhaltsblocks, wo die Standardkurve schon auf ~.42 abgefallen ist. Ein reiner
   Sweep über den Plateauwert (.68/.76/.82/.88) brachte ihn nur von 2,99 auf
   3,93:1 — die 4,5:1, die 12px als normaler Text brauchen, waren so nicht
   erreichbar. Erst das Hochziehen der starken Zone (.79 bei 26 %, .70 bei 46 %
   statt .75/.61) liefert sie. Gemessen an den Glyphenpixeln, nicht an der
   Textbox: **Kicker 4,92:1, Headline 5,42:1**. Die nächststärkere Kurve käme auf
   7,19 und verdunkelte das Foto ohne Gewinn.
   Textschatten sind hier bewusst NICHT eingerechnet — WCAG kreditiert sie nicht,
   ein Sweep über vier Schattenrezepte bewegte den Kicker auch real nur von 3,31
   auf 3,40. Bei einem Bildtausch neu messen. */
.khero__scrim { position: absolute; inset: 0; background: var(--hero-scrim-nav), linear-gradient(to top, rgba(6,43,81,.82) 0%, rgba(6,43,81,.79) 26%, rgba(6,43,81,.70) 46%, rgba(6,43,81,.46) 66%, rgba(6,43,81,.14) 86%, transparent 100%); }
/* 96px Bodenabstand wie die übrigen Hero-Bühnen (siehe `.hero__overlay`). */
.khero__in { position: relative; z-index: 1; min-height: 72vh; display: flex; flex-direction: column; justify-content: flex-end; align-items: flex-start; padding: 150px var(--gut) 96px; color: var(--lm-creme); }
/* Kein Breiten-Deckel mehr (Entscheidung Till, 07/2026). Er stand seit dem
   Agentur-Feedback auf 660px wie `.hero__head` und fällt mit den übrigen
   Deckeln dieser Runde — siehe den Block bei `.sec-head__intro`. Die Zeile läuft
   damit wieder bis an die Spaltenkante (1072px ab 1280px). `.h-xl` behält hier
   `text-wrap: balance`, die Überschrift bleibt also zweizeilig ausgeglichen und
   legt sich nicht als ein langer Strich über das Foto.
   `.hero__head` (Home/Prozess) und `.kihero__in .h-lg` (Luma KI) behalten ihre
   Deckel: die stammen nicht aus dieser Runde, sondern positionieren die Zeile
   gegen ein Gesicht im Bild. */
/* Eigener Schriftgrad-Deckel wie auf Prozess (`.chk--a .chk__title`). Karriere war die
   einzige Seite, auf der `.h-xl` weder von `--title-scale` skaliert noch von
   einem Komponenten-Deckel gebremst wurde: **74px** gegen 62 (Home), 60
   (Prozess), 56 (Standorte). `--title-scale: .84` kommt aus `FIXED` in
   hifi-home.js und wird nur auf der Startseite gesetzt. 4vw/62px bringt die
   Zeile auf 62px, also gleichauf mit Home.
   Textschatten wie `.hero__title` — die Zeile stand ohne, als einzige
   Hero-Headline der Seite. */
.khero__in .h-xl { color: var(--lm-creme); font-size: clamp(38px, 4vw, 62px); text-shadow: 0 1px 28px rgba(6,43,81,.4); }
/* Gewicht 400 statt 200 und volles Creme statt 72 % — die Stelle war beim
   Durchgang zur ≤12px-Mono-Regel übersehen worden (siehe Global: helle Striche
   auf dunklem Grund brauchen eine Stufe mehr, sonst fransen sie aus). Gemessen
   waren es **1,57:1**.
   Dazu der zweistufige Textschatten der Home-Hero-Bewertung: 12px zählen als
   normaler Text und bräuchten 4,5:1, die der Verlauf allein nicht liefert —
   selbst bei Plateau .88 blieb der Kicker bei 3,93:1. Für die Headline war ein
   gestaffelter Schatten verworfen worden (dunkler Fleck hinter den Wörtern);
   bei einer 12px-Zeile trägt er, genau wie bei `.greview__txt`. */
.khero__kicker { font-family: var(--font-mono); font-weight: 400; font-size: 12px; text-transform: uppercase; letter-spacing: .08em; color: var(--lm-creme); text-shadow: 0 1px 2px rgba(6,43,81,.90), 0 2px 10px rgba(6,43,81,.80); margin-bottom: 18px; }
/* Volles Creme, gleicher Grund wie bei `.chk__sub` (siehe dort). */
.khero__sub { font-size: 20px; line-height: var(--lh-body); color: var(--lm-creme); max-width: 52ch; margin: 22px 0 30px; }
.khero__btns { display: flex; gap: 14px; flex-wrap: wrap; }
/* Rahmen von 55 % auf 92 % Creme: die Linie ist die einzige Kante, an der man
   den Button erkennt, und kam gegen das Foto auf **2,58:1** — unter den 3:1,
   die 1.4.11 für die Umrisse von Bedienelementen verlangt. Jetzt 7,1:1. */
.khero .btn--ghost { background: transparent; border-color: rgba(255,250,244,.92); color: var(--lm-creme); }
@media (hover: hover) {
  .khero .btn--ghost:hover { background: var(--lm-creme); border-color: var(--lm-creme); color: var(--lm-dark-blue); }
}
.kben { display: grid; grid-template-columns: repeat(3, 1fr); gap: var(--sp-md); }
.kben__item { background: var(--surface-card); border: var(--hairline); border-radius: var(--r-lg); padding: 28px; display: grid; gap: 10px; align-content: start; }
.kben__num { font-family: var(--font-mono); font-weight: 200; font-size: 13px; color: var(--lm-clay); }
.kben__item h3 { font-family: var(--font-sans); font-weight: 500; font-size: 18px; line-height: var(--lh-snug); margin: 0; }
.kben__item p { font-size: 14px; line-height: var(--lh-body); color: var(--fg2); margin: 0; }
.kquote { display: grid; grid-template-columns: 96px 1fr; gap: 28px; align-items: start; background: var(--surface-card); border: var(--hairline); border-radius: var(--r-lg); padding: 36px 40px; margin: 0 0 var(--sp-lg); }
.kquote__photo { width: 96px; height: 96px; border-radius: 50%; overflow: hidden; background: var(--surface-sunken); }
.kquote__photo img { width: 100%; height: 100%; object-fit: cover; object-position: center 15%; }
.kquote blockquote { font-family: var(--font-sans); font-weight: 500; font-size: clamp(19px, 1.9vw, 25px); line-height: var(--lh-body); margin: 0 0 12px; color: var(--fg1); }
.kquote figcaption { font-family: var(--font-mono); font-weight: 300; font-size: 12px; text-transform: uppercase; letter-spacing: .05em; color: var(--fg3); }
.klist { list-style: none; padding: 0; margin: 0; display: grid; }
.klist li { padding: 16px 0 16px 34px; border-top: 1px solid var(--hair); position: relative; font-size: 16px; line-height: var(--lh-body); color: var(--fg2); }
.klist li::before { content: "—"; position: absolute; left: 0; color: var(--lm-clay); }
.klist b { color: var(--fg1); font-weight: 500; }
.kproc { display: grid; grid-template-columns: repeat(4, 1fr); gap: var(--sp-md); counter-reset: kstep; }
/* min-width: 0 gegen den Grid-Klassiker: `1fr`-Spuren haben min-width auto,
   ein langes Kompositum wie „Vorstellungsgespraech" sprengt sonst die Spur
   und damit die Seitenbreite. */
.kproc__step { border-top: var(--hairline); padding-top: 18px; min-width: 0; }
.kproc__num { font-family: var(--font-mono); font-weight: 200; font-size: 13px; color: var(--fg3); }
/* 16px statt 18: kompakter Kartentitel ueber 14px-Text — und bei 18px passte
   das laengste Wort nicht mehr in die Spalte. */
.kproc__step h3 { font-family: var(--font-sans); font-weight: 500; font-size: 16px; line-height: var(--lh-snug); margin: 8px 0 8px; }
.kproc__step p { font-size: 14px; line-height: var(--lh-body); color: var(--fg2); margin: 0; }
.kform { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1.2fr); gap: var(--sp-xl); align-items: start; background: var(--surface-card); border: var(--hairline); border-radius: var(--r-lg); padding: 44px; }
.kform__contact { display: grid; gap: 6px; justify-items: start; }
.kform__photo { width: 108px; height: 108px; border-radius: 50%; overflow: hidden; margin-bottom: 14px; background: var(--surface-sunken); }
.kform__photo img { width: 100%; height: 100%; object-fit: cover; object-position: center 12%; }
.kform__name { font-family: var(--font-sans); font-weight: 500; font-size: 20px; }
.kform__mail { font-family: var(--font-mono); font-weight: 300; font-size: 13px; color: var(--fg2); transition: color var(--dur-fast) var(--ease-standard); }
@media (hover: hover) {
  .kform__mail:hover { color: var(--fg1); text-decoration: underline; text-underline-offset: 3px; }
}
.kform__note { font-size: 16px; line-height: var(--lh-body); color: var(--fg2); margin-top: 16px; }
.kform__fields { display: grid; gap: 12px; }
.kform__chips { display: flex; gap: 8px; flex-wrap: wrap; margin-bottom: 4px; }
/* Bedienelement, kein Statusabzeichen: behält bewusst 12px und die grössere
   Antippfläche (35px hoch), verkleinern wäre hier eine Verschlechterung.
   Angeglichen werden Laufweite und Rahmen.
   Rahmen von `--hair` (.16) auf .50: für Bedienelemente verlangt WCAG 1.4.11
   **3:1** für die Umrisslinie, sonst ist im Ruhezustand nicht erkennbar, dass
   da ein Knopf ist. Dunkelblau auf Creme steigt flach — .16 ergibt 1,37:1,
   selbst .44 erst 2,61:1, erst ab **.50** sind es 3,05:1. Nicht schwächer setzen. */
.kform__chip { font-family: var(--font-mono); font-weight: 300; font-size: 12px; letter-spacing: .06em; padding: 9px 16px; border: 1px solid rgba(6,43,81,.50); border-radius: 999px; background: transparent; color: var(--fg2); cursor: pointer; transition: border-color .15s, color .15s, background .15s; }
.kform__chip.on { border-color: var(--lm-dark-blue); color: var(--lm-creme); background: var(--lm-dark-blue); }
.kform__chip[disabled] { opacity: .38; cursor: not-allowed; }
@media (hover: hover) {
  .kform__chip:not(.on):not([disabled]):hover { border-color: var(--lm-dark-blue); color: var(--fg1); }
  .kform__chip.on:not([disabled]):hover { background: var(--surface-dark-raised); border-color: var(--surface-dark-raised); }
}
.kform__input, .kform__textarea { font-family: var(--font-sans); font-size: 16px; color: var(--fg1); padding: 14px 16px; border: 1px solid var(--hair); border-radius: var(--r-sm); background: var(--surface-1); outline: none; width: 100%; transition: border-color .15s; }
.kform__input:focus, .kform__textarea:focus { border-color: var(--lm-dark-blue); }
.kform__textarea { min-height: 110px; resize: vertical; }

/* ---------- Willkommen-Video (Klick auf Christian) ---------- */
.lead__photo--video { position: relative; cursor: pointer; }
.lead__photo--video::after { content: ""; position: absolute; inset: 0; background: linear-gradient(to top, rgba(6,43,81,.34), rgba(6,43,81,0) 46%); border-radius: inherit; }
.lead__play { position: absolute; left: 50%; top: 50%; transform: translate(-50%,-50%); z-index: 1; width: 68px; height: 68px; border-radius: 50%; background: rgba(255,250,244,.92); border: 0; cursor: pointer; display: flex; align-items: center; justify-content: center; box-shadow: var(--elev-2); transition: transform .2s var(--ease); }
.lead__photo--video:hover .lead__play { transform: translate(-50%,-50%) scale(1.08); }
.lead__play::before { content: ""; display: block; margin-left: 5px; border-style: solid; border-width: 12px 0 12px 20px; border-color: transparent transparent transparent var(--lm-dark-blue); }
/* Nur noch Platzierung — Schrift, Form und die deckende Unterlage kommen aus
   dem Pillen-Primitiv. Vorher stand hier creme Schrift ganz ohne Hintergrund
   auf einem Videobild. */
.lead__playtag { position: absolute; left: 50%; bottom: 18px; transform: translateX(-50%); z-index: 1; }
.kvid-modal { position: fixed; inset: 0; z-index: 950; display: flex; align-items: center; justify-content: center; opacity: 0; visibility: hidden; transition: opacity .22s var(--ease), visibility 0s .22s; }
.kvid-modal.open { opacity: 1; visibility: visible; transition: opacity .22s var(--ease), visibility 0s; }
.kvid-modal__bg { position: absolute; inset: 0; background: rgba(6,20,38,.72); backdrop-filter: blur(6px); -webkit-backdrop-filter: blur(6px); }
.kvid-modal__card { position: relative; z-index: 1; width: min(430px, calc(100% - 32px)); border-radius: var(--r-lg); overflow: hidden; background: #000; box-shadow: var(--elev-4); }
.kvid-modal__card video { display: block; width: 100%; aspect-ratio: 16/9; background: #000; }
.kvid-modal__card iframe { display: block; width: 100%; aspect-ratio: 9/16; max-height: 84vh; border: 0; background: #000; }
.kvid-modal__close { position: absolute; top: 12px; right: 12px; z-index: 2; width: 48px; height: 48px; border: 0; border-radius: 50%; background: rgba(255,250,244,.9); color: var(--fg1); font-size: 22px; cursor: pointer; display: flex; align-items: center; justify-content: center; }

/* ---------- Aufgaben-Visualisierung (data-kaufg, 5 Varianten) ---------- */
.kaufg__img { display: none; }
/* 1 · zitat (nach Original-Seite): großes zentriertes Zitat, Liste darunter */
html[data-kaufg="zitat"] .kquote { grid-template-columns: 1fr; justify-items: center; text-align: center; background: transparent; border: 0; border-radius: 0; padding: 8px 0 28px; }
html[data-kaufg="zitat"] .kquote__photo { width: 76px; height: 76px; margin-bottom: 4px; }
html[data-kaufg="zitat"] .kquote blockquote { font-size: clamp(24px, 2.8vw, 36px); max-width: 30ch; }
html[data-kaufg="zitat"] .kaufg .klist { max-width: 780px; margin: 0 auto; }
/* 2 · karten: nummerierte Karten im Raster */
html[data-kaufg="karten"] .kaufg .klist { grid-template-columns: repeat(3, 1fr); gap: var(--sp-md); counter-reset: kt; }
html[data-kaufg="karten"] .kaufg .klist li { counter-increment: kt; background: var(--surface-card); border: var(--hairline); border-radius: var(--r-lg); padding: 24px; font-size: 16px; }
html[data-kaufg="karten"] .kaufg .klist li::before { content: "0" counter(kt); position: static; display: block; font-family: var(--font-mono); font-weight: 200; font-size: 13px; color: var(--lm-clay); margin-bottom: 12px; }
/* 3 · split: klebendes Sono-Bild links, Liste rechts */
html[data-kaufg="split"] .kaufg { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1.15fr); gap: var(--sp-xl); align-items: start; }
html[data-kaufg="split"] .kaufg__img { display: block; width: 100%; aspect-ratio: 4/3; object-fit: cover; border-radius: var(--r-lg); position: sticky; top: 110px; }
html[data-kaufg="split"] .kquote { grid-column: 2; grid-template-columns: 64px 1fr; padding: 24px 28px; margin-bottom: var(--sp-md); }
html[data-kaufg="split"] .kquote__photo { width: 64px; height: 64px; }
html[data-kaufg="split"] .kquote blockquote { font-size: 18px; }
html[data-kaufg="split"] .kaufg__img { grid-column: 1; grid-row: 1 / 3; }
html[data-kaufg="split"] .klist { grid-column: 2; }
/* 4 · timeline: vertikale Linie mit Clay-Punkten */
html[data-kaufg="timeline"] .kaufg .klist { max-width: 760px; border-left: 2px solid var(--hair); padding-left: 36px; }
html[data-kaufg="timeline"] .kaufg .klist li { border-top: 0; padding: 14px 0 22px 0; }
html[data-kaufg="timeline"] .kaufg .klist li::before { content: ""; width: 12px; height: 12px; border-radius: 50%; background: var(--lm-clay); border: 3px solid var(--lm-creme); box-shadow: 0 0 0 1px var(--hair); left: -43px; top: 20px; }
/* 5 · checks: zweispaltige Checkliste mit Haken */
html[data-kaufg="checks"] .kaufg .klist { grid-template-columns: 1fr 1fr; gap: 14px; }
html[data-kaufg="checks"] .kaufg .klist li { background: var(--surface-card); border: var(--hairline); border-radius: var(--r-md); padding: 20px 22px 20px 52px; font-size: 16px; }
html[data-kaufg="checks"] .kaufg .klist li::before { content: "\2713"; left: 22px; top: 19px; color: var(--lm-clay); font-weight: 700; font-size: 16px; }
/* 6 · sauer: 50/50 — Bild links, Zitat rechts, Aufgaben-Kacheln darunter */
html[data-kaufg="sauer"] .kaufg { display: block; }
html[data-kaufg="sauer"] .kaufg__img { display: none; }
html[data-kaufg="sauer"] .kquote { grid-template-columns: 1fr 1fr; gap: 0; align-items: center; background: var(--surface-card); border: var(--hairline); border-radius: var(--r-lg); padding: 0; overflow: hidden; margin-bottom: var(--sp-md); }
html[data-kaufg="sauer"] .kquote__photo { width: 100%; height: 100%; min-height: 340px; aspect-ratio: auto; border-radius: 0; }
html[data-kaufg="sauer"] .kquote__photo img { object-position: center 18%; }
html[data-kaufg="sauer"] .kquote > div:last-child { padding: 44px 48px; }
html[data-kaufg="sauer"] .kquote blockquote { font-size: clamp(20px, 2.1vw, 28px); }
html[data-kaufg="sauer"] .kaufg .klist { grid-template-columns: repeat(3, 1fr); gap: var(--sp-md); counter-reset: kt; }
html[data-kaufg="sauer"] .kaufg .klist li { counter-increment: kt; background: var(--surface-card); border: var(--hairline); border-radius: var(--r-lg); padding: 24px; font-size: 16px; }
html[data-kaufg="sauer"] .kaufg .klist li::before { content: "0" counter(kt); position: static; display: block; font-family: var(--font-mono); font-weight: 200; font-size: 13px; color: var(--lm-clay); margin-bottom: 12px; }
/* 7 · zeilen: Editorial-Zeilen mit großen Mono-Ziffern */
html[data-kaufg="zeilen"] .kaufg__img { display: none; }
html[data-kaufg="zeilen"] .kquote { background: transparent; border: 0; border-radius: 0; padding: 0 0 34px; }
html[data-kaufg="zeilen"] .kaufg .klist { counter-reset: kt; border-top: 1px solid var(--lm-dark-blue); }
html[data-kaufg="zeilen"] .kaufg .klist li { counter-increment: kt; display: grid; grid-template-columns: 84px 1fr; gap: 28px; align-items: start; padding: 26px 0; font-size: 18px; }
html[data-kaufg="zeilen"] .kaufg .klist li::before { content: "0" counter(kt); position: static; font-family: var(--font-mono); font-weight: 200; font-size: clamp(30px, 3.2vw, 44px); line-height: 1; color: var(--lm-clay); }
/* 8 · buehne: dunkelblaues Panel, Aufgaben zweispaltig */
html[data-kaufg="buehne"] .kaufg { background: var(--lm-dark-blue); border-radius: var(--r-lg); padding: 48px; }
html[data-kaufg="buehne"] .kaufg__img { display: none; }
html[data-kaufg="buehne"] .kquote { background: transparent; border: 0; border-radius: 0; padding: 0 0 30px; margin-bottom: 8px; }
html[data-kaufg="buehne"] .kquote blockquote { color: var(--lm-creme); }
html[data-kaufg="buehne"] .kquote figcaption { color: rgba(255,250,244,.65); }
html[data-kaufg="buehne"] .kaufg .klist { grid-template-columns: 1fr 1fr; gap: 0 44px; }
html[data-kaufg="buehne"] .kaufg .klist li { color: rgba(255,250,244,.85); border-top: 1px solid rgba(255,250,244,.22); }
html[data-kaufg="buehne"] .kaufg .klist b { color: var(--lm-creme); }
@media (max-width: 900px) {
  html[data-kaufg="karten"] .kaufg .klist { grid-template-columns: 1fr; }
  html[data-kaufg="split"] .kaufg { grid-template-columns: 1fr; }
  html[data-kaufg="split"] .kaufg__img { position: static; grid-column: 1; grid-row: auto; }
  html[data-kaufg="split"] .kquote, html[data-kaufg="split"] .klist { grid-column: 1; }
  html[data-kaufg="checks"] .kaufg .klist { grid-template-columns: 1fr; }
  html[data-kaufg="sauer"] .kquote { grid-template-columns: 1fr; }
  html[data-kaufg="sauer"] .kquote__photo { min-height: 0; aspect-ratio: 4/3; }
  html[data-kaufg="sauer"] .kquote > div:last-child { padding: 24px; }
  html[data-kaufg="sauer"] .kaufg .klist { grid-template-columns: 1fr; }
  html[data-kaufg="zeilen"] .kaufg .klist li { grid-template-columns: 52px 1fr; gap: 16px; }
  html[data-kaufg="buehne"] .kaufg { padding: 26px; }
  html[data-kaufg="buehne"] .kaufg .klist { grid-template-columns: 1fr; }
}

/* Stil-Varianten (data-kstil) */
/* 2 · editorial: keine Karten, Haarlinien + Mono-Ziffern */
html[data-kstil="editorial"] .khero__kicker { border-top: 1px solid rgba(255,250,244,.5); padding-top: 16px; display: inline-block; }
html[data-kstil="editorial"] .kben { grid-template-columns: repeat(2, 1fr); gap: 0 var(--sp-xl); }
html[data-kstil="editorial"] .kben__item { background: transparent; border: 0; border-top: 1px solid var(--hair); border-radius: 0; padding: 24px 0; grid-template-columns: 48px 1fr; grid-template-rows: auto auto; }
html[data-kstil="editorial"] .kben__num { grid-row: 1 / 3; color: var(--fg3); }
html[data-kstil="editorial"] .kquote { background: transparent; border: 0; border-left: 2px solid var(--lm-clay); border-radius: 0; padding: 12px 0 12px 36px; }
html[data-kstil="editorial"] .kform { background: transparent; border: 0; border-top: 1px solid var(--lm-dark-blue); border-radius: 0; padding: 44px 0 0; }
/* 3 · dunkel: Hero-Scrim satter, tiefdunkle Bühne */
html[data-kstil="dunkel"] .khero__scrim { background: linear-gradient(180deg, rgba(6,43,81,.55) 0%, rgba(6,43,81,.75) 55%, rgba(6,43,81,.94) 100%); }
html[data-kstil="dunkel"] .kben__num { color: var(--lm-dark-blue); font-weight: 400; }
/* 4 · clay: warme Clay-Akzente */
html[data-kstil="clay"] .kben__item { border-top: 3px solid var(--lm-clay); border-radius: 0 0 var(--r-lg) var(--r-lg); }
html[data-kstil="clay"] .kproc__step { border-top-color: var(--lm-clay); }
html[data-kstil="clay"] .kform__chip.on { background: var(--lm-clay); border-color: var(--lm-clay); }
/* 5 · grid: technisches Raster, geteilte 1px-Linien, Mono-Titel */
html[data-kstil="grid"] .kben { gap: 1px; background: var(--hair); border: 1px solid var(--hair); }
html[data-kstil="grid"] .kben__item { border: 0; border-radius: 0; background: var(--surface-1); padding: 26px 24px; }
html[data-kstil="grid"] .kben__item h3 { font-family: var(--font-mono); font-weight: 400; font-size: 15px; text-transform: uppercase; letter-spacing: .03em; }
html[data-kstil="grid"] .kproc { gap: 1px; background: var(--hair); border: 1px solid var(--hair); }
html[data-kstil="grid"] .kproc__step { border-top: 0; background: var(--surface-1); padding: 22px 20px; }

@media (max-width: 900px) {
  .khero__in { min-height: 62vh; padding: 120px var(--gut) 44px; }
  .kben { grid-template-columns: 1fr; }
  html[data-kstil="editorial"] .kben { grid-template-columns: 1fr; }
  .kquote { grid-template-columns: 64px 1fr; padding: 24px; }
  .kquote__photo { width: 64px; height: 64px; }
  .kproc { grid-template-columns: 1fr 1fr; }
  .kform { grid-template-columns: 1fr; padding: 28px; }
}

a.loctile { text-decoration: none; color: inherit; transition: box-shadow var(--dur-fast), transform var(--dur-fast); }
a.loctile:hover { box-shadow: var(--elev-2); transform: translateY(-3px); }
a.loctile.active { border-color: var(--lm-dark-blue); box-shadow: var(--elev-2); }

/* ---------- standort hero info-line + maps split (wireframe Frame 1b/3) ---------- */
.hero__infoline { display: flex; gap: var(--sp-lg); margin-top: 28px; flex-wrap: nowrap; }
.hero__infoline > div { display: grid; gap: 6px; }
.hero__infoline .lbl { font-family: var(--font-mono); font-weight: 200; font-size: 12px; text-transform: uppercase; letter-spacing: .06em; color: rgba(255,250,244,.82); }
.hero__infoline .val { font-family: var(--font-sans); font-weight: 500; font-size: clamp(17px, 1.6vw, 24px); line-height: 1.2; color: var(--lm-creme); text-shadow: 0 1px 12px rgba(6,43,81,.5); white-space: nowrap; }
@media (hover: hover) {
  /* Telefonnummer und E-Mail im Standort-Hero sind echte Links. */
  .hero__infoline .val a { transition: text-decoration-color var(--dur-fast) var(--ease-standard); text-decoration: underline; text-decoration-color: transparent; text-underline-offset: 4px; }
  .hero__infoline .val a:hover { text-decoration-color: currentColor; }
}
@media (max-width: 760px) { .hero__infoline { flex-wrap: wrap; gap: var(--sp-md); } .hero__infoline .val { white-space: normal; } }
/* contact form (Tandem-style) */
.contact { display: grid; grid-template-columns: 1fr 1.1fr; gap: var(--sp-xxl); align-items: start; background: var(--surface-card); border: var(--hairline); border-radius: var(--r-lg); padding: var(--sp-xl); }
.contact__intro { display: grid; gap: 16px; align-content: start; }
.cform { display: grid; gap: 16px; }
.cform__row { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }
.cform__field { display: grid; gap: 7px; }
.cform__field > span { font-family: var(--font-mono); font-weight: 300; font-size: 11px; text-transform: uppercase; letter-spacing: .06em; color: var(--fg3); }
.cform input, .cform select, .cform textarea { font-family: var(--font-sans); font-size: 16px; color: var(--fg1); background: var(--surface-2); border: var(--hairline); border-radius: var(--r-sm); padding: 13px 15px; width: 100%; resize: vertical; }
.cform input:focus, .cform select:focus, .cform textarea:focus { outline: 2px solid var(--lm-dark-blue); outline-offset: 1px; }
.cform .btn { width: max-content; }
@media (max-width: 760px) { .contact { grid-template-columns: 1fr; gap: var(--sp-lg); padding: var(--sp-lg); } .cform__row { grid-template-columns: 1fr; } }

/* ===== Standorte · Kontakt-Block „Sie haben Fragen?" — 5 Tweak-Looks (data-kontakt) =====
   „standard" = Basis (Karte). Die übrigen vier stylen ausschließlich #kontakt um. */
/* Split-Panel — dunkelblaue Info-Seite + helle Formularseite, Clay-Quadrat-Anker */
html[data-kontakt="panel"] #kontakt .contact { gap: 0; padding: 0; overflow: hidden; grid-template-columns: 0.92fr 1.08fr; align-items: stretch; }
html[data-kontakt="panel"] #kontakt .contact__intro { background: var(--lm-dark-blue); padding: var(--sp-xl); align-content: center; }
html[data-kontakt="panel"] #kontakt .contact__intro h2 { color: var(--lm-creme); }
html[data-kontakt="panel"] #kontakt .contact__intro .body { color: rgba(255,250,244,.78); }
html[data-kontakt="panel"] #kontakt .cform { padding: var(--sp-xl); }
/* Warmer Verlauf — Marken-Gradient auf der Info-Seite */
html[data-kontakt="gradient"] #kontakt .contact { gap: 0; padding: 0; overflow: hidden; align-items: stretch; }
html[data-kontakt="gradient"] #kontakt .contact__intro { background: var(--lm-creme) url('assets/ds/grad-light-02.webp') center / cover no-repeat; padding: var(--sp-xl); align-content: center; }
html[data-kontakt="gradient"] #kontakt .cform { padding: var(--sp-xl); background: var(--surface-card); }
/* Dunkelblau — ein dominanter Block, transluzente Felder, creme CTA */
html[data-kontakt="invert"] #kontakt .contact { background: var(--lm-dark-blue); border-color: transparent; }
html[data-kontakt="invert"] #kontakt .contact__intro h2 { color: var(--lm-creme); }
html[data-kontakt="invert"] #kontakt .contact__intro .body { color: rgba(255,250,244,.76); }
html[data-kontakt="invert"] #kontakt .cform__field > span { color: rgba(255,250,244,.64); }
html[data-kontakt="invert"] #kontakt .cform input,
html[data-kontakt="invert"] #kontakt .cform select,
html[data-kontakt="invert"] #kontakt .cform textarea { background: rgba(255,250,244,.06); color: var(--lm-creme); border-color: rgba(255,250,244,.22); }
html[data-kontakt="invert"] #kontakt .cform input::placeholder,
html[data-kontakt="invert"] #kontakt .cform textarea::placeholder { color: rgba(255,250,244,.42); }
html[data-kontakt="invert"] #kontakt .cform select option { color: var(--lm-dark-blue); }
html[data-kontakt="invert"] #kontakt .cform input:focus,
html[data-kontakt="invert"] #kontakt .cform select:focus,
html[data-kontakt="invert"] #kontakt .cform textarea:focus { outline-color: var(--lm-clay); }
html[data-kontakt="invert"] #kontakt .cform .btn { background: var(--lm-creme); color: var(--lm-dark-blue); border-color: var(--lm-creme); }
/* Offen · zentriert — keine Karte, luftige Komposition mit Clay-Haarlinie */
html[data-kontakt="offen"] #kontakt .contact { background: transparent; border: none; border-radius: 0; padding: 0; gap: var(--sp-xl); grid-template-columns: 1fr; max-width: 660px; margin: 0 auto; }
html[data-kontakt="offen"] #kontakt .contact__intro { justify-items: center; text-align: center; }
html[data-kontakt="offen"] #kontakt .contact__intro::after { content: ""; width: 48px; height: 2px; background: var(--lm-clay); }
html[data-kontakt="offen"] #kontakt .cform { border-top: var(--hairline); padding-top: var(--sp-lg); }
html[data-kontakt="offen"] #kontakt .cform .btn { width: 100%; justify-content: center; }
/* Termin-Hero — dunkler, zentrierter CTA-Block mit langsam driftender „Sonne" (Vibe wie Home · Forschung) */
#kontakt .ktermin { display: none; }
html[data-kontakt="termin"] #kontakt .contact { display: none; }
html[data-kontakt="termin"] #kontakt .ktermin {
  display: flex; position: relative; overflow: hidden; border-radius: var(--r-lg); min-height: 520px;
  align-items: center; justify-content: center; text-align: center;
  background: linear-gradient(160deg, #262c4c 0%, #1d2440 45%, #121b33 75%, #0a1426 100%);
}
/* Die Sonne ist SCROLL-getrieben: JS (Standorte) setzt --tsp (0 → 1 beim Einlaufen der Sektion);
   Lage, Größe und Intensität hängen daran. Fünf Looks über data-tsonne (Tweak). */
.ktermin__sun { position: absolute; inset: -30%; z-index: 0; pointer-events: none; will-change: transform, opacity; }
/* v1 · Referenz: sattes Orange oben rechts → Indigo unten links (wie Screenshot) */
html[data-tsonne="v1"] #kontakt .ktermin { background: radial-gradient(95% 90% at -6% 108%, rgba(45,44,83,.8), transparent 62%), linear-gradient(160deg, #262c4c 0%, #1d2440 45%, #121b33 75%, #0a1426 100%); }
html[data-tsonne="v1"] #kontakt .ktermin__sun { background: radial-gradient(70% 64% at 85% 8%, rgba(255,212,146,.97) 0%, rgba(246,156,88,.92) 24%, rgba(215,116,84,.64) 45%, rgba(152,94,102,.32) 61%, transparent 76%); transform: translate3d(calc(var(--tsp,1) * -3%), calc(var(--tsp,1) * 5%), 0) scale(calc(.94 + var(--tsp,1) * .14)); opacity: calc(.7 + var(--tsp,1) * .3); }
/* v2 · Sonnenaufgang: warme Kuppel steigt beim Scrollen von unten */
html[data-tsonne="v2"] #kontakt .ktermin { background: linear-gradient(180deg, #0a1426 0%, #152039 48%, #22304e 100%); }
html[data-tsonne="v2"] #kontakt .ktermin__sun { background: radial-gradient(56% 46% at 50% 96%, rgba(255,216,128,.95) 0%, rgba(250,153,111,.75) 38%, rgba(255,192,142,.3) 60%, transparent 76%); transform: translateY(calc((1 - var(--tsp,1)) * 16%)) scale(calc(.92 + var(--tsp,1) * .16)); opacity: calc(.55 + var(--tsp,1) * .45); }
/* v3 · Halo: glühender Kern hinter der Headline, wächst beim Scrollen */
html[data-tsonne="v3"] #kontakt .ktermin { background: radial-gradient(120% 120% at 50% 50%, #1c2440 0%, #111a31 62%, #0a1426 100%); }
html[data-tsonne="v3"] #kontakt .ktermin__sun { background: radial-gradient(42% 40% at 50% 46%, rgba(248,160,92,.88) 0%, rgba(235,136,84,.6) 42%, rgba(180,100,90,.28) 62%, transparent 78%); transform: scale(calc(.76 + var(--tsp,1) * .32)); opacity: calc(.55 + var(--tsp,1) * .45); }
/* v4 · Schräge: breites warmes Band zieht beim Scrollen diagonal ins Bild */
html[data-tsonne="v4"] #kontakt .ktermin { background: radial-gradient(90% 90% at -4% 106%, rgba(45,44,83,.75), transparent 60%), linear-gradient(160deg, #232948 0%, #1a2138 55%, #0c1526 100%); }
html[data-tsonne="v4"] #kontakt .ktermin__sun { background: linear-gradient(112deg, transparent 22%, rgba(214,118,86,.45) 40%, rgba(246,156,88,.88) 62%, rgba(255,214,148,.97) 86%); transform: translate3d(calc((1 - var(--tsp,1)) * 14%), 0, 0); opacity: calc(.65 + var(--tsp,1) * .35); }
/* v5 · Vollfeld: fast vollflächig warm, dunkle Vignette unten links — maximal intensiv */
html[data-tsonne="v5"] #kontakt .ktermin { background: radial-gradient(110% 100% at -8% 112%, rgba(38,38,70,.95), rgba(30,34,60,.55) 45%, transparent 70%), linear-gradient(160deg, #2a3052 0%, #1e2542 55%, #101a30 100%); }
html[data-tsonne="v5"] #kontakt .ktermin__sun { background: radial-gradient(105% 95% at 76% 4%, rgba(255,210,142,.98) 0%, rgba(247,152,86,.93) 30%, rgba(216,120,86,.7) 52%, rgba(140,88,100,.4) 68%, transparent 84%); transform: translate3d(calc(var(--tsp,1) * -4%), calc(var(--tsp,1) * 6%), 0) scale(calc(.95 + var(--tsp,1) * .12)); opacity: calc(.75 + var(--tsp,1) * .25); }
.ktermin__in { position: relative; z-index: 1; max-width: 640px; padding: 76px 40px; display: grid; justify-items: center; }
.ktermin__title { font-family: var(--font-sans); font-weight: 500; font-size: clamp(32px, 4vw, 52px); line-height: 1.14; color: var(--lm-creme); margin: 0; max-width: 16ch; text-wrap: balance; text-shadow: 0 1px 26px rgba(8,16,32,.35); }
.ktermin__sub { font-family: var(--font-sans); font-weight: 400; font-size: clamp(16px, 1.5vw, 19px); line-height: 1.4; color: rgba(255,250,244,.82); margin: 26px 0 0; max-width: 46ch; text-wrap: pretty; text-shadow: 0 1px 18px rgba(8,16,32,.3); }
.ktermin__btns { display: flex; flex-wrap: wrap; gap: 16px; justify-content: center; margin-top: 38px; }
.ktermin .btn { background: var(--lm-creme); color: var(--lm-dark-blue); border: 1px solid var(--lm-creme); }
@media (hover: hover) {
  .ktermin .btn:hover { background: var(--surface-card); border-color: var(--surface-card); }
}
.ktermin .btn--outline { background: transparent; color: var(--lm-creme); border: 1px solid rgba(255,250,244,.5); }
@media (hover: hover) {
  .ktermin .btn--outline:hover { background: var(--lm-creme); color: var(--lm-dark-blue); border-color: var(--lm-creme); }
}
@media (max-width: 760px) { html[data-kontakt="termin"] #kontakt .ktermin { min-height: 440px; } .ktermin__in { padding: 52px 24px; } }
@media (max-width: 760px) {
  html[data-kontakt] #kontakt .contact { grid-template-columns: 1fr !important; }
  html[data-kontakt="panel"] #kontakt .contact__intro, html[data-kontakt="gradient"] #kontakt .contact__intro,
  html[data-kontakt="panel"] #kontakt .cform, html[data-kontakt="gradient"] #kontakt .cform { padding: var(--sp-lg); }
}
.mapsplit { display: grid; grid-template-columns: 2fr 1fr; gap: var(--sp-xl); align-items: stretch; }
.mapsplit__map { border: var(--hairline); border-radius: var(--r-lg); overflow: hidden; box-shadow: none; background: var(--surface-sunken) url('assets/ds/grad-light-02.webp') center/cover no-repeat; display: flex; align-items: center; justify-content: center; min-height: 380px; }
.mapsplit__text { display: grid; gap: var(--sp-lg); align-content: start; }
.mapsplit__block { display: grid; gap: 8px; }
.mapsplit__block .lbl { font-family: var(--font-mono); font-weight: 300; font-size: 11px; text-transform: uppercase; letter-spacing: .06em; color: var(--fg3); }
@media (max-width: 820px) { .mapsplit { grid-template-columns: 1fr; } .mapsplit__map { min-height: 280px; } }

/* ---------- KI hero (canvas) ---------- */
.kihero { position: relative; min-height: 560px; background: var(--surface-0) url('assets/ds/grad-light-02.webp') center/cover no-repeat; overflow: hidden; }
.kihero canvas { position: absolute; inset: 0; width: 100%; height: 100%; z-index: 1; }
.kihero__in { position: relative; z-index: 3; display: flex; flex-direction: column; align-items: flex-start; justify-content: center; min-height: 560px; padding-top: var(--sp-xxl); padding-bottom: var(--sp-xxl); }
/* Kopf-Schleier — NUR unter 1000px, also genau dort, wo der Burger erscheint.
   Er steht am rechten Rand und damit auf der warmen Ecke: creme Striche kommen dort
   ohne Schleier auf 1,5:1, mit ihm auf 5,1:1. Oberhalb von 1000px gibt es keinen
   Burger; Logo (12,9:1) und Navigation (13,1:1) tragen sich selbst und der CTA ist
   eine gefüllte Pille — deshalb bleibt die warme Ecke auf Desktop unangetastet.
   z-index 2 legt ihn über das Canvas (1), unter den Inhalt (3).
   Nebeneffekt auf Mobile: die Headline gewinnt mit (Clay 1,4:1 → 2,5:1). Das ersetzt
   den offenen Mobile-Fix nicht — dafür muss der Sonnenkern selbst tiefer. */
@media (max-width: 1000px) {
  html[data-hdoverlay] .kihero::before {
    content: ""; position: absolute; left: 0; right: 0; top: 0; height: calc(var(--hd-h) * 3.1);
    z-index: 2; pointer-events: none;
    background: linear-gradient(to bottom,
      rgba(6,43,81,.62) 0,
      rgba(6,43,81,.50) calc(var(--hd-h) * .95),
      rgba(6,43,81,.22) calc(var(--hd-h) * 1.9),
      transparent 100%);
  }
}
.kihero__in .h-lg { max-width: 520px; }
/* Hero-Headline-Akzent „nun in Ihrer Hand" — fett; Clay-Variante per Tweak */
.hl-hand { font-weight: 700; }
html[data-herohand="clay"] .hl-hand { color: var(--lm-clay); }
/* Marker: Textmarker-Highlight — warme Fläche, dunkle Schrift, Block pro Zeile */
html[data-herohand="marker"] .hl-hand { background: var(--lm-warm-3); color: var(--lm-dark-blue) !important; padding: 0.05em 0.18em; margin-left: -0.06em; -webkit-box-decoration-break: clone; box-decoration-break: clone; text-shadow: none !important; }
/* Hero-Titel in der technischen Mono-Schrift (Tweak data-kititel) */
html[data-kititel="mono"] .kihero__in .h-lg { font-family: var(--font-mono); font-weight: 300; letter-spacing: -0.015em; }
html[data-kititel="mono"] .kihero__in .h-lg b { font-weight: 300; }
html[data-kititel="mono"] .kihero__in .h-lg .hl-hand { font-weight: 500; }
/* Ausnahme: die beiden Team-Fotos erst nach etwas Scrollen einblenden (JS gesteuert) */
.hero-gate { opacity: 0; transition: opacity .6s var(--ease-entrance); }
.hero-gate.in { opacity: 1; }
.usecases { display: grid; gap: var(--sp-section); }
/* KI use-cases are staged atom-by-atom by the shared reveal engine (hifi-reveal.js) */

/* ---------- KI use-case visualizations (radar-style line art) ---------- */
.kiviz { border: var(--hairline); background: var(--surface-card); overflow: hidden; position: relative; }
.kiviz .kiv { width: 100%; height: 100%; display: block; }
/* animation gating: paused until scrolled into view */
.kiviz .kanim { animation-play-state: paused; }
.kiviz.kiviz--in .kanim { animation-play-state: running; }
.kdraw { animation-name: kivDraw; animation-duration: 2.2s; animation-timing-function: cubic-bezier(.16,1,.3,1); animation-fill-mode: forwards; }
.krise { opacity: 0; animation-name: kivRise; animation-duration: .9s; animation-timing-function: ease; animation-fill-mode: forwards; }
.kgrowx { transform: scaleX(0); transform-origin: left center; animation-name: kivGrowX; animation-duration: 2.2s; animation-timing-function: cubic-bezier(.16,1,.3,1); animation-fill-mode: forwards; }
.kgrowy { transform: scaleY(0); transform-origin: center bottom; animation-name: kivGrowY; animation-duration: 1.5s; animation-timing-function: cubic-bezier(.16,1,.3,1); animation-fill-mode: forwards; }
.kpulse { animation-name: kivPulse; animation-duration: 2.4s; animation-timing-function: ease-in-out; animation-iteration-count: infinite; }
.kblink { animation-name: kivBlink; animation-duration: 1.05s; animation-timing-function: steps(1); animation-iteration-count: infinite; }
@keyframes kivDraw { to { stroke-dashoffset: 0; } }
@keyframes kivRise { from { opacity: 0; transform: translateY(9px); } to { opacity: 1; transform: translateY(0); } }
@keyframes kivGrowX { to { transform: scaleX(1); } }
@keyframes kivGrowY { to { transform: scaleY(1); } }
@keyframes kivPulse { 0%,100% { opacity: .3; } 50% { opacity: 1; } }
@keyframes kivBlink { 50% { opacity: 0; } }
.kiscroll { animation-name: kivScrollY; animation-duration: 20s; animation-timing-function: linear; animation-iteration-count: infinite; }
@keyframes kivScrollY { from { transform: translateY(0); } to { transform: translateY(130px); } }
/* radar pulse ring (brief primitive 3.7) — newest data point pulses */
.kradar { transform-box: fill-box; transform-origin: center; animation-name: kivRadar; animation-duration: 1.8s; animation-timing-function: ease-out; animation-iteration-count: infinite; }
@keyframes kivRadar { 0% { transform: scale(.5); opacity: .8; } 100% { transform: scale(2.6); opacity: 0; } }
@media (prefers-reduced-motion: reduce) { .kiviz .kanim { animation: none !important; opacity: 1 !important; transform: none !important; stroke-dashoffset: 0 !important; } }
/* section gradient that fades out at the bottom instead of hard-cutting */
.secgrad { position: relative; }
.secgrad > * { position: relative; z-index: 1; }
.secgrad::before { content: ""; position: absolute; left: 0; right: 0; top: 0; bottom: -18%; z-index: 0; background: url('assets/ds/grad-light-01.webp') right top / cover no-repeat; -webkit-mask-image: linear-gradient(to bottom, #000 0%, #000 62%, transparent 100%); mask-image: linear-gradient(to bottom, #000 0%, #000 62%, transparent 100%); pointer-events: none; }
/* Trust-Reihe: statische, gruppierte Badges (Unis · Datenschutz), einfarbig weiße Logos */
.trustrow { display: flex; flex-wrap: wrap; align-items: center; gap: 20px 28px; }
.trustrow__group { display: flex; flex-wrap: wrap; align-items: center; gap: 18px; }
.trustrow__group--privacy { margin-left: 28px; }
@media (max-width: 680px) {
  .trustrow { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px 12px; align-items: center; justify-items: center; }
  .trustrow__group { display: contents; }
  .trustrow__group--privacy { margin-left: 0; }
  .trustbadge__circle { width: 64px; height: 64px; }
}
.trustchip { font-family: var(--font-mono); font-weight: 200; font-size: 12px; color: var(--fg2); border: var(--hairline); border-radius: 999px; padding: 9px 16px; background: var(--surface-1); white-space: nowrap; flex: none; }
.trustbadge { display: inline-flex; align-items: center; gap: 12px; flex: none; }
.trustbadge__circle { width: 82px; height: 82px; overflow: hidden; flex: none; display: flex; align-items: center; justify-content: center; }
.trustbadge__circle img { width: 100%; height: 100%; object-fit: contain; padding: 6px; filter: brightness(0) invert(1); -webkit-user-drag: none; user-drag: none; }

@media (max-width: 1080px) {
  .tiles { grid-template-columns: repeat(2, 1fr); }
  .teamgrid { grid-template-columns: repeat(2, 1fr); }
  .loctiles { grid-template-columns: repeat(2, 1fr); }
  .kihero__in .h-lg { max-width: 46vw; }
}
@media (max-width: 820px) {
  .steps::before { left: 19px; }
  .step { grid-template-columns: 1fr; gap: var(--sp-lg); padding-left: 56px; }
  .step:nth-child(even) .step__text { order: 0; }
  .step__num { left: 19px; transform: translate(-50%,0); top: 0; }
  .steps--proc .step__num { display: flex; }
  .procball { display: none !important; }
  .lead { grid-template-columns: 1fr; }
  .kihero__in { justify-content: flex-start; padding-top: 44px; }
  /* Mit Overlay-Header beginnt die Bühne bei y=0 statt unter der Leiste — die 44px
     oben lagen dadurch INNERHALB der 74px hohen Leiste, und der Titel stiess mit Logo
     und „Termin buchen" zusammen. Oberhalb von 820px zentriert `.kihero__in` vertikal,
     dort tritt das nicht auf. Der Wert bleibt an --hd-h gekoppelt, damit eine andere
     Leistenhöhe nicht wieder eine Kollision erzeugt. */
  html[data-hdoverlay] .kihero__in { padding-top: calc(var(--hd-h) + 44px); }
  /* Und die Bühne wächst um dieselbe Leistenhöhe. Sie belegte vorher `74px + 560px`,
     seit dem Overlay nur noch 560px — der Hero endete also 74px früher als in der
     Live-Version. Mit dem Aufschlag bleibt der SICHTBARE Teil unter der Leiste exakt
     560px wie bisher. (Ab 821px gilt stattdessen die 95vh-Regel weiter unten; deshalb
     steht das hier im Mobil-Breakpoint und nicht global — eine globale Regel hätte
     wegen höherer Spezifität auch die 95vh überschrieben.) */
  html[data-hdoverlay] .kihero,
  html[data-hdoverlay] .kihero__in { min-height: calc(560px + var(--hd-h)); }
  .kihero__in .h-lg { max-width: 100%; }
  /* Hero-Titel voll ausschreiben (keine erzwungenen Umbrüche); Biomarker-Zähler entfällt mobil */
  .kihero__in .h-lg br { display: none; }
}
@media (max-width: 560px) {
  .teamgrid { grid-template-columns: 1fr 1fr; }
  .loctiles { grid-template-columns: 1fr; }
  .tiles { grid-template-columns: 1fr; }
}

/* ============================================================
   DARK MODE — opt-in via Tweaks (data-mode="dunkel")
   Drei sehr technische, dunkle Sci-Fi-Varianten aus der vollen
   Marken-Palette (warm-gelb → orange/clay → tiefblau/indigo).
   Tokens werden semantisch geflippt; Komponenten mit rohen
   Primitiven (--lm-dark-blue/--lm-creme) bekommen gezielte Overrides.
   ============================================================ */
html[data-mode="dunkel"] {
  /* Ink → hell (warmes Creme-Weiß), Flächen → dunkel */
  --fg1: #F4EEE6;
  --fg2: rgba(244, 238, 230, 0.74);
  --fg3: rgba(244, 238, 230, 0.66);
  --fg-on-dark: #F4EEE6;
  --fg-on-dark-2: rgba(244, 238, 230, 0.72);
  --hair: rgba(244, 238, 230, 0.16);
  --hair-strong: rgba(244, 238, 230, 0.42);
  --hairline-soft: 1px solid rgba(244, 238, 230, 0.08);
  --hairline: 1px solid rgba(244, 238, 230, 0.14);
  --hairline-strong: 1px solid rgba(244, 238, 230, 0.24);
  --hairline-on-dark: 1px solid rgba(244, 238, 230, 0.14);
  --surface-0: #061B33; --surface-1: #0A2643; --surface-2: #0C2C4E;
  --surface-card: #0A2440; --surface-sunken: #061A30;
  /* Akzent (pro Variante überschrieben) */
  --accent: var(--lm-clay);
  --accent-ink: #04162B;
  --btn-bg: var(--accent);
  --btn-ink: var(--accent-ink);
  --dm-base: #061B33;
  --dm-atmos: radial-gradient(120% 90% at 85% -8%, rgba(211,125,98,.16), transparent 55%),
              radial-gradient(90% 70% at 8% 108%, rgba(45,44,83,.45), transparent 60%);
}
/* fixed atmosphere layer → konsistente Stimmung über die ganze Scroll-Höhe */
html[data-mode="dunkel"] body { background: var(--dm-base); color: var(--fg1); }
html[data-mode="dunkel"] body::before {
  content: ""; position: fixed; inset: 0; z-index: -1; pointer-events: none;
  background: var(--dm-atmos);
}

/* header glass → dunkel */
/* Randlos wie die helle Leiste (Agentur-Feedback 07/2026) — der Dunkelmodus hatte
   Haarlinie und Schatten behalten und war damit die einzige Seite im Haus mit
   sichtbarer Unterkante. Der Rahmen bleibt als transparente 1px-Reserve stehen,
   siehe Begründung an html[data-mode="dunkel"][data-hdoverlay] .hd weiter unten. */
html[data-mode="dunkel"] .hd { background: rgba(6, 20, 38, 0.66); border-bottom: 1px solid transparent; box-shadow: none; }
/* Overlay-Header im Dunkelmodus (Luma KI, ab 07/2026 — vorher lag dort eine
   undurchsichtige Leiste über dem Hero).
   Die Regel eine Zeile darüber hat dieselbe Spezifität wie `html[data-hdoverlay] .hd`,
   steht aber später — sie hätte den transparenten Ruhezustand sonst zurückgeholt.
   Deshalb hier explizit, mit einem Attribut mehr. */
/* Alles, was den Umschlag sichtbar macht, muss GEMEINSAM überblenden. `.hd` animiert
   in seiner Basisregel nur `background` — Rahmen und Schatten schalteten hart. Beim
   Überfahren der 48px-Schwelle schnappte deshalb die creme Haarlinie (im Dunkelmodus
   ist `--hairline` rgba(244,238,230,.14)) sofort ein, während der dunkle Grund noch
   0,3s einblendete: die Linie stand kurz allein über dem Hero und las sich als weißer
   Blitz. Der Rahmen liegt darum immer an und wechselt nur die Farbe — das vermeidet
   zugleich den 1px-Sprung in der Höhe. */
html[data-mode="dunkel"][data-hdoverlay] .hd {
  border-bottom: 1px solid transparent;
  transition: background var(--dur-base) var(--ease-standard),
              backdrop-filter var(--dur-base) var(--ease-standard),
              border-bottom-color var(--dur-base) var(--ease-standard),
              box-shadow var(--dur-base) var(--ease-standard);
}
html[data-mode="dunkel"][data-hdoverlay] .hd:not(.hd--solid) {
  background: transparent; border-bottom-color: transparent;
  box-shadow: 0 1px 0 rgba(244,238,230,0);
}
/* Gescrollt wird die Leiste zur Glasfläche — im Dunkelmodus aber DUNKEL, nicht creme.
   Die allgemeine Overlay-Regel setzt `rgba(255,250,244,.72)` und färbt die Navigation
   auf `--fg1`; im Dunkelmodus ist `--fg1` fast weiß (d4: #EAF3F5), das ergäbe weiße
   Schrift auf cremefarbenem Glas. Ausserdem folgen unter dem Hero dunkle Sektionen,
   auf denen ein cremefarbenes Band als Fremdkörper stünde. */
html[data-mode="dunkel"][data-hdoverlay] .hd.hd--solid {
  background: rgba(6, 20, 38, .82); backdrop-filter: blur(16px); -webkit-backdrop-filter: blur(16px);
  /* Randlos auch im gescrollten Zustand. Der Glasgrund trägt den Umschlag allein;
     Linie und Schatten waren genau das, was die Agentur entfernt sehen wollte.
     Die transparente Farbe bleibt stehen, damit die 1px-Reserve nie zurückspringt. */
  border-bottom-color: transparent;
  box-shadow: none;
}
html[data-mode="dunkel"][data-hdoverlay] .hd.hd--solid .hd__logo { filter: brightness(0) invert(1); }
html[data-mode="dunkel"][data-hdoverlay] .hd.hd--solid .hd__nav > a,
html[data-mode="dunkel"][data-hdoverlay] .hd.hd--solid .hd__nav .has-drop > a { color: var(--lm-creme); text-shadow: none; }
/* `.has-drop > a` mitgeführt wie in den hellen Regeln. Heute rein vorsorglich —
   Luma KI ist die einzige Dunkelmodus-Seite und ihr aktiver Punkt ist ein
   direktes Kind. Ohne die Zeile bekäme eine künftige Dunkelmodus-Seite mit
   aktivem Dropdown-Punkt aber die dunkelblaue Unterkante aus dem hellen
   Solid-Block auf die dunkle Leiste, also unsichtbar. */
html[data-mode="dunkel"][data-hdoverlay] .hd.hd--solid .hd__nav > a:hover,
html[data-mode="dunkel"][data-hdoverlay] .hd.hd--solid .hd__nav > a.on,
html[data-mode="dunkel"][data-hdoverlay] .hd.hd--solid .hd__nav .has-drop > a:hover,
html[data-mode="dunkel"][data-hdoverlay] .hd.hd--solid .hd__nav .has-drop > a.on { border-bottom-color: var(--lm-creme); }
html[data-mode="dunkel"][data-hdoverlay] .hd.hd--solid .hd__nav > a:focus-visible,
html[data-mode="dunkel"][data-hdoverlay] .hd.hd--solid .hd__nav .has-drop > a:focus-visible {
  outline-color: var(--lm-creme); border-bottom-color: var(--lm-creme);
}
html[data-mode="dunkel"][data-hdoverlay] .hd.hd--solid .hd__burger span { background: var(--lm-creme); }
/* Offenes Mobilmenü im Dunkelmodus (Bestandsfehler, gefunden 07/2026):
   `body:has(.mobile-menu.open) .hd` legt eine CREME Glasfläche unter die Leiste und
   nimmt dem Logo per `filter: none` seine Einfärbung. Im Dunkelmodus lädt das Markup
   aber `logo-light.svg` — helles Logo auf cremefarbenem Grund, praktisch unsichtbar,
   und darunter klappt die dunkle Menüfläche auf. Die Leiste bleibt hier dunkel. */
html[data-mode="dunkel"] body:has(.mobile-menu.open) .hd { background: var(--dm-base); }
html[data-mode="dunkel"] body:has(.mobile-menu.open) .hd__logo { filter: brightness(0) invert(1); }
html[data-mode="dunkel"] body:has(.mobile-menu.open) .hd__burger span { background: var(--lm-creme); }
/* CTA in der Leiste: Creme-Füllung mit dunkelblauer Schrift statt des warmen Verlaufs.
   Der Verlauf (`--btn-bg`, d4) sass genau auf der warmen Hero-Ecke und trennte sich
   kaum vom Grund; die Creme-Pille kommt dort auf 4,5:1 Trennung und 13,7:1 innen.
   Eine dunkelblaue Füllung schied aus: im Navi-Bereich läge sie bei 1,04:1.
   Der Hover braucht hier KEINE eigene Regel: `.btn:hover` liefert Anheben und
   Schatten, die Aufhellung kommt aus `html[data-mode="dunkel"] .btn:hover`
   (`filter: brightness`) — genau der Weg, den der Dunkelmodus ohnehin vorschreibt.
   Diese Regel ist spezifischer als `.btn:hover` und hält die Creme-Füllung dabei
   fest, sonst schlüge `--surface-dark-raised` durch. */
html[data-mode="dunkel"][data-hdoverlay] .hd__right .btn {
  background: var(--lm-creme); border-color: var(--lm-creme); color: var(--lm-dark-blue);
}
html[data-mode="dunkel"] .hd__nav a:hover, html[data-mode="dunkel"] .hd__nav a.on { border-bottom-color: var(--accent); }
html[data-mode="dunkel"] .hd__burger span { background: var(--fg1); }
html[data-mode="dunkel"] .mobile-menu { background: var(--dm-base); border-bottom: var(--hairline); }

/* buttons → Akzent-Fill mit dunklem Ink; outline → creme */
html[data-mode="dunkel"] .btn { background: var(--btn-bg); color: var(--btn-ink); border-color: transparent; }
/* Dunkelmodus (Luma KI): hier NICHT über `background` aufhellen.
   `--btn-bg` ist je nach Variante eine Farbe ODER ein Verlauf
   (`d4`: linear-gradient(118deg, #FFD780, #FFC08E, #FA996F)). Ein Verlauf
   lässt sich nicht auf eine Farbe interpolieren — der Button ist beim Hover
   hart von Verlauf auf Volltonfarbe umgesprungen statt weich zu wechseln.
   `filter: brightness()` lässt den Verlauf stehen, hellt ihn gleichmäßig auf
   und ist sauber animierbar. Deckt Farb- und Verlaufsvarianten zugleich ab. */
@media (hover: hover) {
  html[data-mode="dunkel"] .btn:hover,
  html[data-mode="dunkel"] .btn--ghost:hover,
  html[data-mode="dunkel"] .btn--light:hover { filter: brightness(1.09); }
}
html[data-mode="dunkel"] .btn--outline { background: transparent; color: var(--fg1); border: 1px solid var(--hair-strong); }
@media (hover: hover) {
  html[data-mode="dunkel"] .btn--outline:hover { background: var(--fg1); color: var(--dm-base); border-color: var(--fg1); }
}
html[data-mode="dunkel"] .btn--ghost { background: var(--btn-bg); color: var(--btn-ink); border-color: transparent; }
html[data-mode="dunkel"] .btn--light { background: var(--fg1); color: var(--dm-base); border-color: var(--fg1); }

/* kicker / accents → Clay (liest sich gut auf dunkel) */
html[data-mode="dunkel"] .kicker { color: var(--accent); }

/* Mono-Kleinlabels auf dunklem Grund → Gewicht 400 statt der 300 aus dem
   Hellmodus. Der reine Kontrastwert reicht bei 11-12 px Mono nicht (siehe
   .pcard__tag im Design-System); helle Striche auf dunkler Fläche fransen
   zusätzlich aus und brauchen darum eine Stufe mehr als dunkel auf hell. */
html[data-mode="dunkel"] .tcard__role,
html[data-mode="dunkel"] .step__meta,
html[data-mode="dunkel"] .drawer__eyebrow { font-weight: 400; }

/* step + process marks → Akzent statt Dunkelblau (sonst unsichtbar) */
html[data-mode="dunkel"] .step__num,
html[data-mode="dunkel"] .procball { background: var(--btn-bg); color: var(--btn-ink); }
html[data-mode="dunkel"] [data-ball="ring"] .procball { background: transparent; border-color: var(--accent); color: var(--accent); }
html[data-mode="dunkel"] [data-ball="soft"] .procball { background: var(--surface-2); color: var(--fg1); }

/* media/viz tiles → dunkle Senke */
html[data-mode="dunkel"] .step__img { background: var(--surface-sunken); border: var(--hairline); }
html[data-mode="dunkel"] .tcard__photo { background: var(--surface-sunken); }

/* Trust-Logos: einfarbig weiß (CSS-Filter), ohne Kreis-Hintergrund/Rahmen (auch im Dunkelmodus) */
html[data-mode="dunkel"] .trustbadge__circle { background: transparent; border: 0; }

/* Abschluss-CTA → dunkler Verlauf statt hellem Foto-Grad */
html[data-mode="dunkel"] .lmcta { background: transparent; border-top: var(--hairline); }
html[data-mode="dunkel"] .lmcta__title { color: var(--fg1); }

/* Footer → noch tiefer, klare Trennkante */
html[data-mode="dunkel"] .ft { background: #03101F; border-top: var(--hairline); }
html[data-mode="dunkel"] .ft__grid { border-bottom-color: var(--hair); }

/* Tweaks-Panel zieht mit (Flächen/Text via Tokens), nur aktiver Opt-State fixen */
html[data-mode="dunkel"] .tweaks { box-shadow: 0 8px 40px rgba(0,0,0,.5); }
html[data-mode="dunkel"] .tweaks__opt.on { background: var(--btn-bg); border-color: transparent; color: var(--btn-ink); }
html[data-mode="dunkel"] .tweaks__opt:hover { border-color: var(--accent); }

/* selection */
html[data-mode="dunkel"] ::selection { background: var(--accent); color: var(--accent-ink); }

/* ---- Variante d1 · Tiefblau (Clay-Akzent, ruhig, markennah) ---- */
html[data-mode="dunkel"][data-dark="d1"] {
  --accent: #D37D62; --accent-ink: #04162B;
  --dm-base: #061B33;
  --dm-atmos: radial-gradient(120% 95% at 86% -10%, rgba(211,125,98,.20), transparent 56%),
              radial-gradient(90% 70% at 6% 110%, rgba(45,44,83,.55), transparent 62%);
}

/* ---- Variante d2 · Sonnenkern (warmer Sonnen-Hero, Seite DARUNTER = Sci-Fi-Grid) ---- */
html[data-mode="dunkel"][data-dark="d2"] {
  --accent: #A5D3DF; --accent-ink: #03101F;
  --fg1: #EAF3F5; --fg2: rgba(234,243,245,.72); --fg3: rgba(234,243,245,.64);
  --hair: rgba(165,211,223,.16); --hair-strong: rgba(165,211,223,.42);
  --surface-0: #04101D; --surface-1: #07182A; --surface-2: #081E33;
  --surface-card: #06182B; --surface-sunken: #040E1A;
  --dm-base: #030D18;
  --btn-bg: #D37D62; --btn-ink: #03101F;
  --dm-atmos:
    linear-gradient(rgba(165,211,223,.05) 1px, transparent 1px) 0 0 / 100% 44px,
    linear-gradient(90deg, rgba(165,211,223,.05) 1px, transparent 1px) 0 0 / 44px 100%,
    radial-gradient(100% 78% at 50% -12%, rgba(211,125,98,.16), transparent 54%),
    radial-gradient(80% 70% at 92% 8%, rgba(165,211,223,.12), transparent 58%);
}
html[data-mode="dunkel"][data-dark="d2"] .h-xl,
html[data-mode="dunkel"][data-dark="d2"] .lmcta__title { text-shadow: 0 0 30px rgba(165,211,223,.18); }
html[data-mode="dunkel"][data-dark="d2"] .kicker { color: #A5D3DF; }
html[data-mode="dunkel"][data-dark="d2"] .step__title,
html[data-mode="dunkel"][data-dark="d2"] .tcard__name { letter-spacing: .01em; }

/* ---- Variante d3 · Sci-Fi-Grid (near-black, HUD-Raster + Cyan/Clay-Glow) ---- */
html[data-mode="dunkel"][data-dark="d3"] {
  --accent: #A5D3DF; --accent-ink: #03101F;
  --fg1: #EAF3F5; --fg2: rgba(234,243,245,.72); --fg3: rgba(234,243,245,.64);
  --hair: rgba(165,211,223,.16); --hair-strong: rgba(165,211,223,.42);
  --surface-0: #04101D; --surface-1: #07182A; --surface-2: #081E33;
  --surface-card: #06182B; --surface-sunken: #040E1A;
  --dm-base: #030D18;
  --dm-atmos:
    linear-gradient(rgba(165,211,223,.05) 1px, transparent 1px) 0 0 / 100% 44px,
    linear-gradient(90deg, rgba(165,211,223,.05) 1px, transparent 1px) 0 0 / 44px 100%,
    radial-gradient(100% 78% at 50% -12%, rgba(211,125,98,.16), transparent 54%),
    radial-gradient(80% 70% at 92% 8%, rgba(165,211,223,.12), transparent 58%);
}
/* d3: Buttons in Clay, damit Cyan dem Text/Linien vorbehalten bleibt */
html[data-mode="dunkel"][data-dark="d3"] { --btn-bg: #D37D62; --btn-ink: #03101F; }
html[data-mode="dunkel"][data-dark="d3"] .h-lg,
html[data-mode="dunkel"][data-dark="d3"] .h-xl,
html[data-mode="dunkel"][data-dark="d3"] .lmcta__title { text-shadow: 0 0 30px rgba(165,211,223,.18); }
html[data-mode="dunkel"][data-dark="d3"] .kicker { color: #A5D3DF; }
html[data-mode="dunkel"][data-dark="d3"] .step__title,
html[data-mode="dunkel"][data-dark="d3"] .tcard__name { letter-spacing: .01em; }

/* ---- Variante d4 · Sci-Fi Sonnenkern (Seite = d3-Grid, Hero = warmes, schwimmendes Sonnen-Panel) ---- */
html[data-mode="dunkel"][data-dark="d4"] {
  --accent: #FA996F; --accent-ink: #2A0E04;
  --fg1: #EAF3F5; --fg2: rgba(234,243,245,.72); --fg3: rgba(234,243,245,.64);
  --hair: rgba(165,211,223,.16); --hair-strong: rgba(165,211,223,.42);
  --surface-0: #04101D; --surface-1: #07182A; --surface-2: #081E33;
  --surface-card: #06182B; --surface-sunken: #040E1A;
  --dm-base: #030D18;
  --btn-bg: linear-gradient(118deg, #FFD780 0%, #FFC08E 42%, #FA996F 100%);
  --btn-ink: #2A0E04;
  --dm-atmos:
    linear-gradient(rgba(165,211,223,.05) 1px, transparent 1px) 0 0 / 100% 44px,
    linear-gradient(90deg, rgba(165,211,223,.05) 1px, transparent 1px) 0 0 / 44px 100%,
    radial-gradient(70% 55% at 90% 4%, rgba(255,196,113,.12), transparent 56%);
}
html[data-mode="dunkel"][data-dark="d4"] .kicker { color: #FFC471; }
html[data-mode="dunkel"][data-dark="d4"] .h-xl,
html[data-mode="dunkel"][data-dark="d4"] .lmcta__title { text-shadow: 0 0 30px rgba(165,211,223,.16); }

/* Frame 1 (Hero) läuft IMMER im Light-Look — auch wenn die restliche Seite im
   Dark Theme ist: heller Creme-Verlauf + dunkelblaue Schrift. Darunter geht das
   dunkle Raster normal weiter. Gilt für jede Dark-Variante ([data-dark]) und steht
   nach den Variant-Regeln → gewinnt bei gleicher Spezifität. */
html[data-mode="dunkel"][data-dark] .kihero {
  background: var(--lm-creme) url('assets/ds/grad-light-02.webp') center / cover no-repeat;
}
html[data-mode="dunkel"][data-dark] .kihero__in .h-lg { color: var(--lm-dark-blue); text-shadow: none; }
.kihero__sun { display: none; }

/* ===== Frame 1 (Hero) · dunkle Looks via Tweak (data-herolook) =====
   „Hell" behält den Light-Look (Regeln darüber). Die dunklen Looks greifen nur im
   Dark-Mode und überschreiben den erzwungenen Light-Hero (höhere Spezifität:
   3 Attribute + Klasse). Text wird hell; die Animation zeichnet über applyTheme()
   in heller/glühender Tinte (siehe hifi-ki-datafield.js). */
html[data-mode="dunkel"][data-dark]:not([data-herolook="hell"]) .kihero__in .h-lg { color: var(--lm-creme); text-shadow: 0 1px 24px rgba(3,13,24,.5); }
html[data-mode="dunkel"][data-dark]:not([data-herolook="hell"]) .hl-hand { color: var(--lm-clay); }

/* 0 · Sonne — warme Ecke oben rechts auf durchgehendem Markenblau, unten weicher
   Übergang in den Seitengrund (--dm-base #030D18). Layer-Reihenfolge: vorderste zuerst.
   Die Fläche liegt auf Hue 210°, der Achse von --lm-dark-blue; die Vorgängerfassung
   driftete auf 225–246° (Indigo) und stellenweise auf 338° (Mauve), was den Hero vom
   Rest der Marke abgekoppelt hat. Zwei Regeln halten das stabil:
   1. Das Warm bleibt in der ECKE. Ein großflächiger Wash (früher 112 % Breite) über
      Navy entsättigt zwangsläufig zu Grau-Mauve — deshalb 46 % bzw. 78 %.
   2. Die Tiefe unten links kommt aus --lm-dark-blue statt aus einem Violettton. */
html[data-mode="dunkel"][data-dark][data-herolook="sonne"] .kihero {
  background:
    radial-gradient(46% 50% at 100% 0%, rgba(255,232,177,.94) 0%, rgba(250,153,111,.58) 34%, transparent 68%),
    radial-gradient(78% 72% at 102% -4%, rgba(211,125,98,.34) 0%, transparent 52%),
    radial-gradient(80% 70% at 10% 96%, rgba(6,43,81,.55), transparent 62%),
    linear-gradient(176deg, #0B3157 0%, #092A4B 32%, #07203A 58%, #05162A 80%, #030D18 100%);
}
/* Untere Auslaufkante: verschmilzt die Hero-Unterkante nahtlos mit dem Feld darunter */
/* Der Ladescreen bringt in seiner Basisregel einen EIGENEN Verlauf mit (Sonne zentriert
   bei 50% -4%, Rampe #0A2643 → #040F1F). Der stammt aus der Zeit vor Variante C: beim
   Ausblenden sprang die Sonne sichtbar von oben-Mitte nach oben-rechts.
   Hier deshalb derselbe Verlauf wie im Hero eine Regel weiter unten — DECKEND, nicht
   durchsichtig. Durchsichtig war der erste Versuch und war falsch: der Ladescreen soll
   den Hero verdecken, sonst stehen sein zentrierter Titel und der Fortschrittsbalken
   über Foto und echter H1 (doppelte Headline).
   Beim Nachjustieren von Variante C muss dieser Verlauf mitgezogen werden. */
html[data-mode="dunkel"][data-dark][data-herolook="sonne"] .kiload {
  background:
    radial-gradient(46% 50% at 100% 0%, rgba(255,232,177,.94) 0%, rgba(250,153,111,.58) 34%, transparent 68%),
    radial-gradient(78% 72% at 102% -4%, rgba(211,125,98,.34) 0%, transparent 52%),
    radial-gradient(80% 70% at 10% 96%, rgba(6,43,81,.55), transparent 62%),
    linear-gradient(176deg, #0B3157 0%, #092A4B 32%, #07203A 58%, #05162A 80%, #030D18 100%);
}
html[data-mode="dunkel"][data-dark][data-herolook="sonne"] .kihero::after {
  content: ""; position: absolute; left: 0; right: 0; bottom: 0; height: 34%; z-index: 1;
  pointer-events: none;
  background: linear-gradient(180deg, transparent 0%, rgba(3,13,24,.55) 62%, #030D18 100%);
}

/* 1 · Raster — tiefes Dunkelblau + dezentes Gitternetz (wie unten) + warmer Schein rechts */
html[data-mode="dunkel"][data-dark][data-herolook="grid"] .kihero {
  background:
    linear-gradient(rgba(150,186,224,.07) 1px, transparent 1px) 0 0 / 46px 46px,
    linear-gradient(90deg, rgba(150,186,224,.07) 1px, transparent 1px) 0 0 / 46px 46px,
    radial-gradient(58% 82% at 78% 32%, rgba(211,125,98,.15), transparent 66%),
    #061B33;
}
/* 2 · Weiße Schrift — ruhiges Navy, klarer warmer Schein hinter dem Mann, Text rein weiß */
html[data-mode="dunkel"][data-dark][data-herolook="weiss"] .kihero {
  background:
    radial-gradient(56% 80% at 76% 42%, rgba(240,160,101,.20), transparent 64%),
    linear-gradient(180deg, #072139 0%, #061B33 100%);
}
html[data-mode="dunkel"][data-dark][data-herolook="weiss"] .kihero__in .h-lg { color: #fff; }
/* 3 · Aurora — warmer → kühler Schleier über Navy */
html[data-mode="dunkel"][data-dark][data-herolook="aurora"] .kihero {
  background:
    radial-gradient(50% 62% at 82% 6%, rgba(255,196,113,.26), transparent 60%),
    radial-gradient(62% 72% at 18% 108%, rgba(45,44,83,.6), transparent 60%),
    linear-gradient(150deg, #08213b 0%, #061B33 55%, #071a30 100%);
}
/* 4 · Spotlight — dramatischer warmer Kegel exakt hinter dem Mann, Rest sehr dunkel */
html[data-mode="dunkel"][data-dark][data-herolook="spot"] .kihero {
  background:
    radial-gradient(42% 64% at 76% 46%, rgba(255,183,120,.28), rgba(211,125,98,.10) 44%, transparent 70%),
    #04101f;
}
/* 5 · HUD — near-black + feines Cyan-Raster, sehr technisch */
html[data-mode="dunkel"][data-dark][data-herolook="mono"] .kihero {
  background:
    linear-gradient(rgba(143,208,222,.06) 1px, transparent 1px) 0 0 / 40px 40px,
    linear-gradient(90deg, rgba(143,208,222,.06) 1px, transparent 1px) 0 0 / 40px 40px,
    radial-gradient(70% 80% at 80% 22%, rgba(143,208,222,.1), transparent 64%),
    #030D18;
}
html[data-mode="dunkel"][data-dark][data-herolook="mono"] .hl-hand { color: #8FD0DE; }

/* sanfter Moduswechsel */
html[data-mode] body, html[data-mode] .hd, html[data-mode] .ft,
html[data-mode] .step__img, html[data-mode] .tcard__photo {
  transition: background-color var(--dur-base) var(--ease), color var(--dur-base) var(--ease), border-color var(--dur-base) var(--ease);
}
/* Buttons brauchen hier eine eigene Zeile: Diese Sammelregel stand frueher mit
   `.btn` drin und hat — gleiche Spezifitaet, aber weiter unten in der Datei —
   die Hover-Transition der Buttons ueberschrieben. Im Dunkelmodus sprangen
   Anheben und Aufhellen dadurch hart um, statt zu ueberblenden.
   Deshalb hier die Moduswechsel-Properties UND die Hover-Properties zusammen. */
html[data-mode] .btn {
  transition: background-color var(--dur-base) var(--ease), color var(--dur-base) var(--ease), border-color var(--dur-base) var(--ease),
              transform var(--dur-fast) var(--ease-standard), box-shadow var(--dur-fast) var(--ease-standard), filter var(--dur-fast) var(--ease-standard);
}
@media (prefers-reduced-motion: reduce) {
  html[data-mode] body, html[data-mode] .hd, html[data-mode] .ft,
  html[data-mode] .btn, html[data-mode] .step__img, html[data-mode] .tcard__photo { transition: none; }
}

/* ---------- Termin-buchen · Standort-Modal (Doctolib) ---------- */
.book-modal { position: fixed; inset: 0; z-index: 900; display: flex; align-items: center; justify-content: center; opacity: 0; visibility: hidden; transition: opacity .22s var(--ease), visibility 0s .22s; }
.book-modal.open { opacity: 1; visibility: visible; transition: opacity .22s var(--ease), visibility 0s; }
.book-modal__bg { position: absolute; inset: 0; background: rgba(6,43,81,.35); backdrop-filter: blur(6px); -webkit-backdrop-filter: blur(6px); }
.book-modal__card { position: relative; z-index: 1; background: var(--surface-0); border-radius: var(--r-lg); box-shadow: var(--elev-4); padding: 44px 40px 40px; max-width: 420px; width: calc(100% - 32px); max-height: calc(100vh - 32px); overflow-y: auto; transform: translateY(12px); transition: transform .22s var(--ease); }
.book-modal.open .book-modal__card { transform: translateY(0); }
.book-modal__close { position: absolute; top: 14px; right: 14px; width: 48px; height: 48px; border: var(--hairline); background: var(--surface-2); border-radius: 50%; cursor: pointer; font-size: 28px; color: var(--fg1); display: flex; align-items: center; justify-content: center; border-radius: 50%; transition: background .15s; }
.book-modal__close:hover { background: rgba(6,43,81,.06); color: var(--fg1); }
.book-modal__title { font-family: var(--font-sans); font-weight: 500; font-size: 22px; color: var(--fg1); margin: 0 0 6px; }
.book-modal__sub { font-family: var(--font-sans); font-weight: 400; font-size: 16px; color: var(--fg2); margin: 0 0 24px; line-height: var(--lh-body); }
.book-modal__locs { display: grid; gap: 10px; }
.book-modal__loc { display: flex; align-items: center; justify-content: space-between; gap: 16px; padding: 16px 20px; border: var(--hairline); border-radius: var(--r-md); background: var(--surface-1); text-decoration: none; color: var(--fg1); transition: border-color .15s, box-shadow .15s, transform .15s; }
.book-modal__loc:hover { border-color: var(--lm-dark-blue); box-shadow: var(--elev-1); transform: translateY(-1px); }
.book-modal__loc-name { font-family: var(--font-sans); font-weight: 500; font-size: 16px; }
.book-modal__loc-tag { font-family: var(--font-mono); font-weight: 300; font-size: 11px; text-transform: uppercase; letter-spacing: .04em; color: var(--fg3); }
.book-modal__arrow { width: 20px; height: 20px; color: var(--fg3); flex: none; }
@media (max-width: 480px) { .book-modal__card { padding: 36px 24px 32px; } .book-modal__title { font-size: 20px; } }

/* ---------- Beratungs-Modal (Telefonische Beratung) ---------- */
.consult-modal { position: fixed; inset: 0; z-index: 900; display: flex; align-items: center; justify-content: center; opacity: 0; visibility: hidden; transition: opacity .22s var(--ease), visibility 0s .22s; }
.consult-modal.open { opacity: 1; visibility: visible; transition: opacity .22s var(--ease), visibility 0s; }
.consult-modal__bg { position: absolute; inset: 0; background: rgba(6,43,81,.35); backdrop-filter: blur(6px); -webkit-backdrop-filter: blur(6px); }
.consult-modal__card { position: relative; z-index: 1; background: var(--surface-0); border-radius: var(--r-lg); box-shadow: var(--elev-4); max-width: 820px; width: calc(100% - 32px); max-height: calc(100vh - 32px); display: grid; grid-template-columns: 1fr 300px; overflow-x: hidden; overflow-y: auto; transform: translateY(12px); transition: transform .22s var(--ease); }
.consult-modal.open .consult-modal__card { transform: translateY(0); }
.consult-modal__close { position: absolute; top: 14px; right: 14px; width: 48px; height: 48px; border: 1px solid rgba(6,43,81,.18); background: rgba(255,250,244,.92); border-radius: 50%; cursor: pointer; font-size: 28px; color: var(--lm-dark-blue); display: flex; align-items: center; justify-content: center; border-radius: 50%; z-index: 2; transition: background .15s; }
.consult-modal__close:hover { background: rgba(255,250,244,.95); color: var(--lm-dark-blue); }
.consult-modal__body { padding: 40px 36px 36px; display: flex; flex-direction: column; gap: 0; }
.consult-modal__title { font-family: var(--font-sans); font-weight: 500; font-size: var(--t-d4); line-height: var(--lh-d3); color: var(--fg1); margin: 0 0 12px; }
.consult-modal__title strong { font-weight: 700; }
.consult-modal__sub { font-family: var(--font-sans); font-weight: 400; font-size: 14px; line-height: var(--lh-body); color: var(--fg2); margin: 0 0 18px; }
.consult-modal__bullets { list-style: none; padding: 0; margin: 0 0 22px; display: grid; gap: 8px; }
.consult-modal__bullets li { font-family: var(--font-sans); font-size: 14px; color: var(--fg1); display: flex; align-items: flex-start; gap: 8px; line-height: var(--lh-body); }
.consult-modal__bullets li::before { content: ""; flex: none; width: 18px; height: 18px; margin-top: 1px; border-radius: 50%; background: var(--lm-clay); background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 18 18' fill='none'%3E%3Ctext x='9' y='13' text-anchor='middle' font-family='sans-serif' font-weight='700' font-size='12' fill='%23fff'%3E%3F%3C/text%3E%3C/svg%3E"); background-size: 18px 18px; }
.consult-modal__form { display: grid; gap: 10px; }
.consult-modal__input { font-family: var(--font-sans); font-size: 16px; color: var(--fg1); padding: 14px 16px; border: 1px solid var(--hair); border-radius: var(--r-sm); background: var(--surface-1); outline: none; transition: border-color .15s; }
.consult-modal__input:focus { border-color: var(--lm-dark-blue); }
.consult-modal__input::placeholder { color: var(--fg3); }
.consult-modal__phone { display: flex; align-items: center; gap: 0; border: 1px solid var(--hair); border-radius: var(--r-sm); background: var(--surface-1); overflow: hidden; transition: border-color .15s; }
.consult-modal__phone:focus-within { border-color: var(--lm-dark-blue); }
.consult-modal__flag { padding: 14px 10px 14px 16px; font-size: 16px; border: 0; background: transparent; cursor: default; flex: none; display: flex; align-items: center; gap: 4px; color: var(--fg3); font-family: var(--font-sans); font-size: 14px; }
.consult-modal__phone input { flex: 1; border: 0; background: transparent; font-family: var(--font-sans); font-size: 16px; color: var(--fg1); padding: 14px 16px 14px 0; outline: none; }
.consult-modal__phone input::placeholder { color: var(--fg3); }
.consult-modal__submit { font-family: var(--font-sans); font-weight: 600; font-size: 16px; padding: 16px 28px; border: 1px solid var(--lm-dark-blue); background: var(--lm-dark-blue); color: var(--lm-creme); cursor: pointer; border-radius: 0; margin-top: 4px; transition: opacity .15s; }
@media (hover: hover) {
  .consult-modal__submit:hover { background: var(--surface-dark-raised); border-color: var(--surface-dark-raised); box-shadow: var(--elev-2); transform: translateY(-2px); }
}
.consult-modal__submit[disabled] { opacity: .6; cursor: default; }
.btn[disabled] { opacity: .6; cursor: default; }
.lmform__status { font-family: var(--font-mono); font-weight: 300; font-size: 13px; margin: 4px 0 0; }
.lmform__status[data-kind="success"] { color: var(--fg1); }
.lmform__status[data-kind="error"] { color: var(--lm-clay); }
.consult-modal__note { width: 100%; display: flex; justify-content: center; font-family: var(--font-mono); font-weight: 400; font-size: clamp(9px, 2.9vw, 12px); text-transform: uppercase; letter-spacing: .12em; color: var(--fg2); margin-top: 2px; white-space: nowrap; }
.consult-modal__review { display: flex; align-items: center; justify-content: center; gap: 10px; margin-top: 16px; padding: 2px 0 0; background: transparent; border: 0; border-radius: 0; font-family: var(--font-mono); font-weight: 300; font-size: 13px; color: var(--fg2); width: 100%; text-decoration: none; cursor: default; }
.consult-modal__review:hover { box-shadow: none; }
.consult-modal__stars { color: #f5a623; letter-spacing: 2px; font-size: 15px; }
.consult-modal__photo { background: var(--lm-warm-1); }
.consult-modal__photo img { width: 100%; height: 100%; object-fit: cover; object-position: center 15%; display: block; }
@media (max-width: 720px) {
  .consult-modal__card { grid-template-columns: 1fr; max-height: calc(100vh - 32px); overflow-y: auto; }
  .consult-modal__photo { height: 200px; order: -1; }
  .consult-modal__body { padding: 28px 24px 28px; }
}
/* ============================================================
   MOBILE-FEINSCHLIFF (nach Vorbild PKV-Landingpage) — seitenweit
   ============================================================ */
@media (max-width: 680px) {
  /* Überschriften volle Breite (kein balancierter Rechts-Freiraum) */
  .h-lg, .h-xl, .sec-head__intro h2, .lmcta__title { text-wrap: initial; max-width: none !important; }

  /* Team · Lebenslauf-Toggle: einzeilig, dichter an den Text darüber */
  section:has(+ section[data-screen-label="Lebenslauf"]) { padding-bottom: 28px; }
  section[data-screen-label="Lebenslauf"] .faqitem__q { font-size: 14px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
  section[data-screen-label="Lebenslauf"] .faqitem__head { gap: 12px; }

  /* Abstands-Standard (DS V2): Titel → Inhalt 20px; Typwechsel 16px; gleiche Typen (Text→Text) 8px */
  :root { --m-title-gap: 20px; --m-flow-gap: 8px; --m-block-gap: 16px; }
  /* Sektionsabstand: Desktop-Rhythmus (80/112px, teils „luftig") wirkt auf Mobile als große Leerfläche
     zwischen kurzen Blöcken — auf ein knapperes, aber weiterhin klar trennendes Maß reduziert. */
  :root { --sp-section: 56px; }
  .split > div > h1, .split > div > h2, .split > div > h3 { margin-bottom: var(--m-title-gap) !important; }
  .split > div > *:not(h1):not(h2):not(h3) { margin-top: var(--m-block-gap) !important; }
  .split > div > p + p { margin-top: var(--m-flow-gap) !important; }
  .split > div > h1 + *, .split > div > h2 + *, .split > div > h3 + * { margin-top: 0 !important; }
  .sec-head { padding-bottom: 0; margin-bottom: var(--m-title-gap); }
  .sec-head__intro { gap: var(--m-title-gap); }

  /* Hero-Google-Bewertung: eine Zeile, „Google" entfällt → „4,9 · 200+ Bewertungen" */
  .hero__foot .greview__g { display: none; }
  .hero__foot .greview__txt { white-space: nowrap; }

  /* Betreuung: nur EINE Ärzte-Karussell-Zeile (Reihenfolge regelt .msplit) */
  .split:has(#docrows) > #docrows { min-height: 0; padding: 18px 0; gap: 0; }
  .split:has(#docrows) > #docrows .docrow:nth-child(2) { display: none; }

  /* Sticky-Buchungsleiste: Safe-Area + weicher Einschwung */
  /* Vereinfachte Diagramme: als Karte mit Innenabstand, Standard-Titelabstand darüber */
  .radar { padding: 20px 16px 18px; margin-top: var(--m-title-gap, 28px); }
  .radar__legend { font-size: 11px; gap: 10px; }
  .radar__scale { font-size: 14px; }
  .step__img.kiviz { margin-top: 8px; }

  /* Swipe-Karussells · Hinweis (per JS eingefügt) */
  .swipehint { display: block; text-align: center; font-family: var(--font-mono); font-weight: 300; font-size: 11px; letter-spacing: .04em; text-transform: lowercase; color: var(--fg3); padding: 12px 0 2px; }

}

/* ---------- Mobile-Akkordeon für Kachel-Grids (data-macc) ---------- */
.swipehint { display: none; }
/* Auf < 680px klappt jede Kachel eines markierten Grids zu; Titel bleibt sichtbar,
   Tap öffnet den Inhalt. Desktop unverändert. Aktiviert über [data-macc] am Grid. */
@media (max-width: 680px) {
  [data-macc] { display: block !important; }
  [data-macc] > .macc { border-bottom: var(--hairline); }
  [data-macc] > .macc:first-child { border-top: var(--hairline); }
  .macc__head { display: flex; align-items: center; justify-content: space-between; gap: 14px; width: 100%; cursor: pointer; padding: 16px 2px; font-family: var(--font-sans); font-weight: 500; font-size: clamp(15px, 4.4vw, 19px); color: var(--fg1); text-align: left; background: none; border: 0; }
  .macc__head::after { content: "+"; font-family: var(--font-mono); font-size: 22px; line-height: 1; color: var(--fg3); transition: transform .3s var(--ease); flex: none; }
  .macc.open .macc__head::after { transform: rotate(45deg); }
}

/* ============================================================
   IN-PLACE MOBILE-ANSICHT  (Tweaks → „Ansicht" → Mobil)
   Vollflächige Übernahme der Vorschau als echtes 390er-Viewport
   (via iframe, damit vw-Größen & alle Breakpoints exakt wie am Handy sind)
   ============================================================ */
.lm-vp-opts { grid-template-columns: 1fr 1fr; }
#lm-mobiview { position: fixed; inset: 0; z-index: 1400; display: flex; flex-direction: column; background: #d7d2ca; }
#lm-mobiview__bar { flex: none; position: relative; height: 48px; display: flex; align-items: center; justify-content: center; background: var(--lm-dark-blue); color: var(--lm-creme); font-family: var(--font-mono); font-size: 12px; letter-spacing: .06em; text-transform: uppercase; }
#lm-mobiview__back { position: absolute; left: 12px; top: 50%; transform: translateY(-50%); display: inline-flex; align-items: center; gap: 7px; background: rgba(255,250,244,.14); color: var(--lm-creme); border: 0; border-radius: 999px; padding: 8px 16px; font-family: var(--font-mono); font-size: 12px; letter-spacing: .04em; text-transform: none; cursor: pointer; transition: background .15s; }
#lm-mobiview__back:hover { background: rgba(255,250,244,.26); }
#lm-mobiview__stage { flex: 1; display: flex; align-items: flex-start; justify-content: center; padding: 20px; overflow: hidden; }
#lm-mobiview__phone { position: relative; background: #fff; border-radius: 34px; box-shadow: 0 40px 100px rgba(6,43,81,.30), 0 0 0 1px rgba(6,43,81,.06); overflow: hidden; transform-origin: top center; }
#lm-mobiview__phone iframe { width: 100%; height: 100%; border: 0; display: block; background: var(--lm-creme); }
@media (max-width: 480px) { #lm-mobiview__stage { padding: 0; } #lm-mobiview__phone { border-radius: 0 !important; } }

/* ---------- 16-Kategorien-Grid + Preis-Akkordeon · Mobile (Detail via Drawer, wie PKV-Referenz) ---------- */
.pitem__endprice { display: none; }
.drawer--cat .drawer__media { height: 140px; }
.drawer--cat .drawer__title { display: flex; align-items: center; gap: 12px; }
.drawer--cat .drawer__title svg { width: 24px; height: 24px; flex: none; color: currentColor; }
@media (max-width: 680px) {
  .pgcell { font-size: 16px; padding: 16px 2px; gap: 10px; }
  .pgcell svg { width: 22px; height: 22px; }
  .pitem__head { flex-wrap: wrap; padding: 18px 20px; gap: 12px; }
  .pitem__name { flex: 1 1 0; min-width: 0; font-size: 20px; }
  .pitem__price { display: none; }
  .pitem__endprice { display: block; margin-top: 18px; padding-top: 14px; border-top: var(--hairline); font-family: var(--font-mono); font-size: 22px; color: var(--fg1); }
  .pitem__cta { flex-direction: column; align-items: stretch; }
  .pitem__cta .btn { min-width: 0; width: 100%; }
}

/* ---------- Karriere-Hero: CTA-Buttons gleiche Breite (mobil) ---------- */
@media (max-width: 680px) {
  .khero__btns { display: flex; gap: 12px; }
  .khero__btns .btn { flex: 1 1 0; min-width: 0; justify-content: center; padding-left: 10px; padding-right: 10px; text-align: center; }
}
/* Luma KI · Headline → Bilder → Text (mobile Ordnungsregel für einfache Sektionen) */
@media (max-width: 680px) {
  .split:has(> .split .hero-gate) { display: flex !important; flex-direction: column; }
  .split:has(> .split .hero-gate) > div:first-child { display: contents; }
  .split:has(> .split .hero-gate) > div:first-child > h2 { order: 0; margin-bottom: var(--m-title-gap, 28px); }
  .split:has(> .split .hero-gate) > .split { order: 1; grid-template-columns: 1fr 1fr !important; gap: 14px !important; }
  .split:has(> .split .hero-gate) > div:first-child > *:not(h2) { order: 2; }
  .split:has(> .split .hero-gate) .tcard__name { font-size: 14px; min-height: 0; margin-top: 10px; }
  .split:has(> .split .hero-gate) .tcard__role { font-size: 11px; min-height: 0; }
}
/* Team/Karriere · gleiche Regel für „lead“-Sektionen (Headline → Bild → Text) */
@media (max-width: 680px) {
  .lead { display: flex; flex-direction: column; gap: 0 !important; }
  .lead > .lead__photo { order: 1; width: min(100%, 340px); }
  .lead > div:not(.lead__photo) { display: contents; }
  .lead > div:not(.lead__photo) > h2 { order: 0; margin-bottom: var(--m-title-gap, 28px); }
  .lead > div:not(.lead__photo) > *:not(h2) { order: 2; margin-top: var(--m-block-gap, 16px) !important; }
  .lead > div:not(.lead__photo) > p + p { margin-top: var(--m-flow-gap) !important; }
  .lead > div:not(.lead__photo) > .lead__role { margin: var(--m-block-gap, 16px) 0 0 !important; }
}
/* Standorte: Kontaktdaten (Telefon/Adresse/E-Mail) größer auf Mobile */
@media (max-width: 680px) {
  .hero__infoline { gap: 16px; }
  .hero__infoline .val { font-size: 20px; white-space: normal; }
  .hero__infoline .lbl { font-size: 12px; }
}
/* Burger-Menü: „Standorte" mit aufklappbarer Standort-Auswahl */
.mm-geo { display: none; }
.mm-geo.open { display: block; }
.mm-geo a { font-size: 18px !important; padding: 12px 0 12px 18px !important; color: var(--fg2) !important; }
.mm-geo-toggle::after { content: "›"; display: inline-block; margin-left: 10px; transition: transform .25s var(--ease); }
.mm-geo-toggle.open::after { transform: rotate(90deg); }
/* Standorte: die Kacheln sind jetzt echte Links auf die Standort-Seiten
   (/standorte/<stadt>) und bleiben auch mobil sichtbar — die frühere
   In-Page-Umschaltung ist durch dedizierte Seiten ersetzt. */

/* Standort-Hero: Status-Badge (geöffnet / ausgebucht / Eröffnung) auf dem dunklen Hero.
   Text bleibt creme, der Punkt trägt die Status-Farbe (--dot). */
/* Aussehen kommt aus dem Pillen-Primitiv weiter oben; hier bleibt nur der
   Abstand zur Überschrift darunter. Der frühere 12%-Creme-Schleier ist weg —
   er war der Grund, warum die Lesbarkeit am Motiv hing. */
.hero__badge { margin: 0 0 22px; }

/* ---------- Mobile-Ordnungsregel (Design System V2): Titel → Bild → Text → Bullets → CTA ----------
   hifi-mobile.js markiert passende .split-Sektionen (.msplit + __media/__text); fehlt ein Element,
   bleibt die Reihenfolge der übrigen erhalten. Gilt überall, sofern nicht explizit anders angeordnet. */
@media (max-width: 680px) {
  .msplit { display: flex !important; flex-direction: column; gap: 0 !important; }
  .msplit > .msplit__media { order: 1; }
  .msplit > .msplit__text { display: contents; }
  /* `align-self: stretch` ist Pflicht, sonst hängen die Elemente nicht am Layoutgrid:
     `.split` setzt `align-items: center`, und das gilt hier weiter — im Spalten-Flex
     heißt „center" aber, dass jedes Kind auf seine Inhaltsbreite schrumpft UND mittig
     sitzt. Fließtext fiel nicht auf (sein max-content ist ohnehin breiter als der
     Platz), die Bullet-Karten schon: sie klebten bei 394px max-content und standen
     eingerückt zwischen den Gutter-Kanten. Der CTA darunter braucht deshalb sein
     eigenes `align-self: flex-start` — er soll ja schmal bleiben. */
  .msplit > .msplit__text > * { order: 2; align-self: stretch; }
  .msplit > .msplit__text > h1, .msplit > .msplit__text > h2, .msplit > .msplit__text > h3 { order: 0; margin-bottom: var(--m-title-gap, 28px); }
  .msplit > .msplit__text > ul, .msplit > .msplit__text > .clist { order: 3; }
  .msplit > .msplit__text > .btn, .msplit > .msplit__text > .khero__btns { order: 4; align-self: flex-start; margin-top: var(--m-block-gap, 16px); }
}

/* ---------- Luma KI · Anwendungsfälle-Zähler auf Mobile (data-kiball, 4 Varianten) ---------- */
.kidots { display: none; }
@media (max-width: 680px) {
  html[data-kiball="ball"] .usecases ~ .procball, html[data-kiball="ball"] .usecases .procball, html[data-kiball="ball"] #procBall { display: flex !important; width: 40px; height: 40px; left: 30px !important; }
  html[data-kiball="ball"] #procBall .num { font-size: 16px; }
  html[data-kiball="ball"] .usecases .step__num { display: none !important; }
  /* Spine-Linie läuft mittig durch die Kugel (Kugelmitte = 30px Viewport) */
  html[data-kiball="ball"] .usecases.steps::before { left: calc(30px - var(--gut)); }
  /* v2 · Nummer über dem Titel (statisch im Fluss, keine Überlappung) */
  html[data-kiball="statisch"] .usecases .step__num { position: static; transform: none; margin: 0 0 10px; }
  /* v3 · Fortschrittslinie: Spine füllt sich beim Scrollen */
  html[data-kiball="linie"] .usecases .step__num, html[data-kiball="linie"] #procBall { display: none !important; }
  html[data-kiball="linie"] .usecases.steps::before { width: 2px; background: linear-gradient(to bottom, var(--lm-clay) 0, var(--lm-clay) var(--kiprog, 0%), var(--hair) var(--kiprog, 0%)); }
  /* v4 · Punkte-Leiste: fixe Dots links, aktiver Fall markiert */
  html[data-kiball="punkte"] .usecases .step__num, html[data-kiball="punkte"] #procBall { display: none !important; }
  html[data-kiball="punkte"] .kidots { position: fixed; left: 12px; top: 50%; transform: translateY(-50%); display: flex; flex-direction: column; gap: 10px; z-index: 40; opacity: 0; transition: opacity .25s var(--ease); }
  html[data-kiball="punkte"] .kidots.on { opacity: 1; }
  .kidots i { width: 8px; height: 8px; border-radius: 50%; background: var(--hair); transition: background .2s, transform .2s; }
  .kidots i.on { background: var(--lm-clay); transform: scale(1.4); }
}

/* ---------- Luma KI · Hero-Ladescreen (dunkel + Sonne + Titel + Balken) ---------- */
.kiload { position: absolute; inset: 0; z-index: 6; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 30px; text-align: center; padding: 40px;
  background:
    radial-gradient(48% 42% at 50% -4%, rgba(242,196,148,.95) 0%, rgba(230,150,86,.5) 34%, transparent 66%),
    linear-gradient(180deg, #0A2643 0%, #061B33 58%, #040F1F 100%);
  transition: opacity .55s var(--ease); }
.kiload.done { opacity: 0; pointer-events: none; }
.kiload__title { font-family: var(--font-sans); font-weight: 500; font-size: var(--t-d3); line-height: var(--lh-d2); color: var(--lm-creme); max-width: 16ch; text-shadow: 0 1px 24px rgba(3,13,24,.5); margin: 0; }
.kiload__bar { display: flex; flex-direction: column; align-items: center; gap: 14px; width: min(280px, 64%); }
.kiload__track { width: 100%; height: 3px; background: rgba(255,250,244,.16); border-radius: 2px; overflow: hidden; }
.kiload__fill { width: 0; height: 100%; background: var(--lm-creme); border-radius: 2px; animation: kiloadfill 1.5s cubic-bezier(.4,0,.1,1) forwards; }
.kiload.done .kiload__fill { animation: none; width: 100%; transition: width .3s ease; }
.kiload__dots { display: none; gap: 10px; }
.kiload__dots i { width: 9px; height: 9px; border-radius: 50%; background: var(--lm-creme); opacity: .4; animation: kiloaddot 1.1s ease-in-out infinite; }
.kiload__dots i:nth-child(2) { animation-delay: .18s; }
.kiload__dots i:nth-child(3) { animation-delay: .36s; }
.kiload__pct { display: none; font-family: var(--font-mono); font-weight: 300; font-size: 12px; letter-spacing: .08em; color: rgba(255,250,244,.72); }
@keyframes kiloadfill { from { width: 0; } to { width: 92%; } }
@keyframes kiloaddot { 0%,100% { opacity: .3; transform: translateY(0); } 50% { opacity: 1; transform: translateY(-4px); } }
@keyframes kiloadwave { from { background-position: -40% 0; } to { background-position: 140% 0; } }
/* Varianten (data-kiload) */
html[data-kiload="strich"] .kiload__track { height: 1px; background: rgba(255,250,244,.24); width: min(340px, 72%); }
html[data-kiload="punkte"] .kiload__track { display: none; }
html[data-kiload="punkte"] .kiload__dots { display: flex; }
html[data-kiload="prozent"] .kiload__pct { display: block; }
html[data-kiload="welle"] .kiload__fill { width: 100%; animation: none; background: linear-gradient(90deg, transparent, var(--lm-creme), transparent); background-size: 42% 100%; background-repeat: no-repeat; animation: kiloadwave 1.25s linear infinite; }
@media (prefers-reduced-motion: reduce) { .kiload__fill, .kiload__dots i { animation: none !important; } .kiload__fill { width: 90%; } }


/* ============================================================
   V4 · COOKIE-CONSENT (hifi-consent.js)
   Kompakte Karte unten rechts, kein Backdrop, kein Modal-Look.
   Nur beim Öffnen der „Einstellungen" wächst die Karte um die Kategorie-Liste.
   ============================================================ */
.cc { position: fixed; left: 0; right: 0; bottom: 0; z-index: 2400; display: flex; justify-content: flex-end; padding: 18px; visibility: hidden; transition: visibility 0s linear var(--dur-base); }
.cc.cc--on { visibility: visible; transition-delay: 0s; }
.cc__card {
  display: flex; flex-direction: column; gap: 12px;
  width: 100%; max-width: 400px; padding: 16px 18px;
  background: var(--surface-card);
  border: var(--hairline);
  border-radius: var(--r-lg);
  box-shadow: var(--elev-4);
  opacity: 0; transform: translateY(14px); pointer-events: none;
  transition: opacity var(--dur-base) var(--ease-entrance), transform var(--dur-base) var(--ease-entrance);
}
.cc.cc--on .cc__card { opacity: 1; transform: translateY(0); pointer-events: auto; }
.cc--settings .cc__card { max-width: 440px; }
.cc__card:focus { outline: none; }
.cc__text { margin: 0; font-size: 13px; line-height: var(--lh-body); color: var(--fg2); }
.cc__text a { color: var(--fg1); text-underline-offset: 3px; transition: color var(--dur-fast) var(--ease-standard); }
@media (hover: hover) {
  .cc__text a:hover { color: var(--lm-clay); }
}

.cc__actions { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }
/* „Nur notwendige" ist gleichwertig: gleiche Größe, Typo und Gewichtung wie „Alle akzeptieren" (DSK). */
.cc__btn { font-family: var(--font-sans); font-size: 13px; font-weight: 500; line-height: 1.2; padding: 10px 16px; border: 1px solid transparent; border-radius: var(--r-sm); background: transparent; cursor: pointer; white-space: nowrap; transition: opacity .2s ease, background .2s ease, color .2s ease, box-shadow .2s ease; }
.cc__btn--primary { background: var(--lm-dark-blue); border-color: var(--lm-dark-blue); color: var(--lm-creme); }
@media (hover: hover) {
  .cc__btn--primary:hover { background: var(--surface-dark-raised); border-color: var(--surface-dark-raised); box-shadow: var(--elev-2); }
  
}
.cc__btn--ghost { border-color: var(--lm-dark-blue); color: var(--lm-dark-blue); }
.cc__btn--ghost:hover { background: var(--lm-dark-blue); color: var(--lm-creme); }
.cc__btn--text { padding: 10px 4px; color: var(--fg2); text-decoration: underline; text-underline-offset: 3px; margin-left: auto; }
.cc__btn--text:hover { color: var(--fg1); }
.cc__btn--save { display: none; }
.cc--settings .cc__btn--settings { display: none; }
.cc--settings .cc__btn--save { display: inline-block; }

.cc__panel { display: none; padding-top: 10px; border-top: var(--hairline-soft); }
.cc--settings .cc__panel { display: block; }
.cc__row { display: flex; align-items: flex-start; gap: 16px; padding: 12px 0; border-bottom: var(--hairline-soft); }
.cc__row:last-child { border-bottom: 0; padding-bottom: 2px; }
.cc__row-main { flex: 1; min-width: 0; }
.cc__row-name { font-size: 14px; font-weight: 600; color: var(--fg1); }
.cc__row-desc { margin: 3px 0 0; font-size: 12px; line-height: var(--lh-body); color: var(--fg2); }
.cc__row-svc { display: block; margin-top: 5px; font-family: var(--font-mono); font-weight: 300; font-size: 11px; letter-spacing: .02em; color: var(--fg3); }

.cc__sw { position: relative; flex: none; width: 44px; height: 26px; margin-top: 2px; }
.cc__sw input { position: absolute; inset: 0; width: 100%; height: 100%; margin: 0; opacity: 0; cursor: pointer; }
.cc__sw input:disabled { cursor: default; }
.cc__sw > span { position: absolute; inset: 0; border-radius: 999px; background: rgba(6, 43, 81, .16); transition: background var(--dur-fast) var(--ease-standard); pointer-events: none; }
.cc__sw > span::after { content: ''; position: absolute; top: 3px; left: 3px; width: 20px; height: 20px; border-radius: 50%; background: var(--lm-creme); box-shadow: var(--elev-1); transition: transform var(--dur-fast) var(--ease-standard); }
.cc__sw input:checked + span { background: var(--lm-dark-blue); }
.cc__sw input:checked + span::after { transform: translateX(18px); }
.cc__sw input:disabled + span { background: rgba(6, 43, 81, .38); }
.cc__sw input:focus-visible + span { outline: 2px solid var(--lm-dark-blue); outline-offset: 2px; }

@media (max-width: 680px) {
  .cc { padding: 12px; }
  .cc--settings .cc__card { max-width: none; }
  .cc__card { max-width: none; padding: 14px 16px; max-height: calc(100vh - 24px); overflow-y: auto; gap: 10px; }
  .cc__actions { gap: 8px; }
  .cc__btn { width: 100%; padding: 9px 14px; }
  .cc__btn--text { width: auto; margin-left: 0; }
  .cc__row { gap: 12px; }
}
@media (prefers-reduced-motion: reduce) {
  .cc__card { transition: none; transform: none; }
  .cc__sw > span, .cc__sw > span::after { transition: none; }
}

/* ---------- Rechtstexte: lange URLs dürfen umbrechen ----------
   Impressum und Datenschutz enthalten nicht trennbare URLs wie
   business.safety.google/adsprocessorterms. Ohne Umbruchpunkt schieben sie
   die Seite bei 390px um ~17px horizontal aus dem Viewport.
   `break-word` statt `anywhere`: bricht nur im Notfall um und verändert
   die min-content-Breite nicht (das .toc liegt mit in .legal). */
/* Impressum/Datenschutz erben sonst die 1.4 von body — das sind aber die
   laengsten zusammenhaengenden Textbloecke der Site. */
.legal, .legal p, .legal li { line-height: var(--lh-read); }
.legal a { overflow-wrap: break-word; transition: color var(--dur-fast) var(--ease-standard); }
@media (hover: hover) {
  /* Auf Datenschutz/Impressum liegen ~50 Links im Fliesstext — die hatten
     bisher gar keine Hover-Rueckmeldung. */
  .legal a:hover { color: var(--lm-clay); }
}

/* ===== Blog — Übersicht (blog.html) + Artikelseiten (blog/*.html), editorial, hairline-basiert ===== */
.bloghead { padding: 88px 0 0; }
.bloghead .kicker { margin-bottom: 18px; }
.bloghead h1 { max-width: 22ch; }
.bloghead__sub { color: var(--fg2); max-width: 52ch; margin: 20px 0 0; font-size: 18px; line-height: var(--lh-read); }

/* Übersicht */
.blist { margin-top: 56px; border-top: 1px solid var(--hair); }
.brow { display: grid; grid-template-columns: 220px 1fr auto; gap: 40px; align-items: baseline; padding: 34px 0; border-bottom: 1px solid var(--hair); cursor: pointer; color: inherit; text-decoration: none; }
/* Die Meta-Spalten tragen `--fg2`, nicht `--fg3` (Agentur-Feedback 07/2026:
   „grauer Text sehr schwer zu lesen, vor allem weiter unten"). Der Blog laeuft
   wie alle Unterseiten auf `data-grad="scroll"`, also auf `grad-light-03` mit
   `background-attachment: fixed` — der warme Kern wandert beim Scrollen unter
   die Liste, weiter unten steht die Zeile darum auf deutlich waermerem Grund.
   Gemessen ueber die Verlaufsflaeche faellt `--fg3` auf 32 % davon unter die
   AA-Schwelle von 4,5:1 (schlechtester Punkt 3,7:1), `--fg2` nur noch auf
   2,5 % (Median 5,8:1). Gewicht bleibt 300, die Korrektur laeuft ueber die
   Farbe — dieselbe Entscheidung wie bei `.pv-p1__meta`, siehe DESIGN-SYSTEM. */
.brow__meta { font-family: var(--font-mono); font-weight: 300; font-size: 12px; letter-spacing: .04em; color: var(--fg2); display: grid; gap: 6px; }
.brow__cat { color: var(--lm-clay); font-weight: 400; }
.brow__title { font-family: var(--font-sans); font-weight: 500; font-size: var(--t-d5); line-height: var(--lh-d3); color: var(--fg1); margin: 0 0 10px; text-wrap: balance; }
.brow__title em { font-style: italic; }
.brow__lead { color: var(--fg2); font-size: 16px; line-height: var(--lh-read); max-width: 62ch; margin: 0; }
.brow__go { font-family: var(--font-mono); font-weight: 400; font-size: 13px; color: var(--fg1); white-space: nowrap; }
.brow:hover .brow__title { text-decoration: underline; text-underline-offset: 4px; text-decoration-thickness: 1px; }
.brow:hover .brow__go { color: var(--lm-clay); }

/* Featured (erster Artikel) */
.bfeat { display: grid; grid-template-columns: 220px 1fr; gap: 40px; padding: 48px 0; border-bottom: 1px solid var(--hair); cursor: pointer; color: inherit; text-decoration: none; }
.bfeat__meta { font-family: var(--font-mono); font-weight: 300; font-size: 12px; color: var(--fg2); display: grid; gap: 6px; align-content: start; }
.bfeat__label { color: var(--lm-clay); font-weight: 400; }
.bfeat__title { font-family: var(--font-sans); font-weight: 500; font-size: var(--t-d3); line-height: var(--lh-d2); margin: 0 0 16px; color: var(--fg1); text-wrap: balance; }
.bfeat__title em { font-style: italic; }
.bfeat__lead { color: var(--fg2); font-size: 18px; line-height: var(--lh-read); max-width: 58ch; margin: 0 0 22px; }
.bfeat__go { font-family: var(--font-mono); font-size: 13px; color: var(--fg1); }
.bfeat:hover .bfeat__title { text-decoration: underline; text-underline-offset: 5px; text-decoration-thickness: 1px; }
.bfeat:hover .bfeat__go { color: var(--lm-clay); }

/* Artikel-Ansicht */
.art__back { display: inline-flex; align-items: center; gap: 8px; font-family: var(--font-mono); font-weight: 400; font-size: 13px; color: var(--fg2); text-decoration: none; margin: 48px 0 0; cursor: pointer; background: none; border: 0; padding: 0; }
.art__back:hover { color: var(--fg1); text-decoration: underline; text-underline-offset: 3px; }
.art__head { max-width: 760px; padding: 34px 0 0; }
/* `--fg2` statt `--fg3`, gleicher Grund wie bei `.brow__meta` weiter oben:
   die Artikelseiten stehen auf demselben wandernden Verlauf. */
.art__meta { display: flex; gap: 14px; flex-wrap: wrap; font-family: var(--font-mono); font-weight: 300; font-size: 12px; color: var(--fg2); margin-bottom: 18px; }
.art__meta .cat { color: var(--lm-clay); font-weight: 400; }
.art__title { font-family: var(--font-sans); font-weight: 500; font-size: var(--t-d3); line-height: var(--lh-d2); margin: 0; text-wrap: balance; }
.art__title em { font-style: italic; }
/* Gleiche Beziehung wie im Sektionskopf: Überschrift → Einleitung. Siehe dort. */
.art__lead { color: var(--fg2); font-size: 20px; line-height: var(--lh-read); margin: var(--sp-lg) 0 0; }
.artbody { max-width: 720px; padding: 26px 0 24px; border-top: 1px solid var(--hair); margin-top: 34px; }
.artbody p { font-size: 18px; line-height: var(--lh-read); color: var(--fg1); margin: 0 0 18px; }
.artbody h2 { font-family: var(--font-sans); font-weight: 500; font-size: var(--t-d5); line-height: var(--lh-d3); margin: 40px 0 14px; }
.artbody h3 { font-family: var(--font-sans); font-weight: 500; font-size: 20px; margin: 30px 0 10px; }
.artbody ul, .artbody ol { margin: 0 0 18px; padding-left: 22px; }
.artbody li { font-size: 18px; line-height: var(--lh-read); color: var(--fg1); margin-bottom: 10px; }
.artbody blockquote { margin: 28px 0; padding: 4px 0 4px 24px; border-left: 1px solid var(--lm-dark-blue); }
.artbody blockquote p { font-size: 20px; line-height: var(--lh-read); color: var(--fg2); margin: 0; }
.artbody table { width: 100%; border-collapse: collapse; margin: 0 0 18px; font-size: 16px; }
.artbody th, .artbody td { text-align: left; padding: 10px 12px 10px 0; border-bottom: 1px solid var(--hair); vertical-align: top; }
.artbody th { font-family: var(--font-mono); font-weight: 400; font-size: 12px; color: var(--fg2); }
/* Mobil: `table-layout: fixed` teilt die Breite gleichmäßig auf, statt sie von der
   Mindestbreite des Inhalts diktieren zu lassen. Ohne das zog allein
   „Krebsfrüherkennungsuntersuchung" die mittlere Spalte auf 262px; die Tabelle kam
   bei 390px auf ~455px in einer 346px-Spalte und die dritte Spalte („Frequenz / Arzt")
   lag komplett außerhalb des Bildschirms — unerreichbar, weil body horizontal clippt.
   `hyphens: auto` greift über lang="de" und trennt die langen Komposita an der Silbe;
   `overflow-wrap` ist der Fallback, falls keine Trennmuster geladen sind. */
@media (max-width: 680px) {
  .artbody table { table-layout: fixed; font-size: 15px; }
  .artbody th, .artbody td { padding-right: 8px; hyphens: auto; overflow-wrap: break-word; }
}
.artbody .art-cta { margin: 36px 0; padding: 26px 28px 28px; background: var(--surface-card); border-top: 1px solid var(--lm-dark-blue); }
.artbody .art-cta-label { font-family: var(--font-mono); font-weight: 400; font-size: 12px; color: var(--lm-clay); margin-bottom: 10px; }
.artbody .art-cta h3 { margin: 0 0 8px; font-size: 20px; }
.artbody .art-cta p { font-size: 16px; line-height: var(--lh-read); color: var(--fg2); margin: 0 0 18px; }
.artbody .art-cta a.btn-primary { display: inline-block; background: var(--lm-dark-blue); color: var(--lm-creme); border: 1px solid var(--lm-dark-blue); padding: 13px 26px; font-family: var(--font-sans); font-weight: 500; font-size: 15px; text-decoration: none; }
@media (hover: hover) {
  .artbody .art-cta a.btn-primary:hover { background: var(--surface-dark-raised); border-color: var(--surface-dark-raised); box-shadow: var(--elev-2); transform: translateY(-2px); }
}
.art__more { max-width: 760px; margin-top: 24px; border-top: 1px solid var(--hair); padding-top: 8px; }
.art__more-label { font-family: var(--font-mono); font-weight: 300; font-size: 12px; color: var(--fg2); margin: 18px 0 4px; }
.art__more .brow { grid-template-columns: 180px 1fr auto; padding: 24px 0; gap: 28px; }
.art__more .brow__title { font-size: 20px; }

@media (max-width: 900px) {
  .brow, .bfeat, .art__more .brow { grid-template-columns: 1fr; gap: 10px; }
  .brow__meta, .bfeat__meta { display: flex; gap: 14px; }
  .brow__go { display: none; }
}

/* ============================================================
   Hero-Bühnen · einheitliche Höhe (Agentur-Feedback 07/2026)
   Ab Tablet (>820px) füllt jede Hero-Bühne 90 % des Viewports.
   Vorher endete sie auf großen Bildschirmen mitten im Viewport
   und der Abschnitt darunter war noch nicht eingeblendet
   (Reveal-Schwelle = 50 % Viewport) — das wirkte „halb geladen".
   Unter 821px gelten weiter die kompakten Mobil-Höhen weiter oben.
   `.hero` (Home + Standorte) regelt die Höhe in seiner Basisregel.
   ============================================================ */
@media (min-width: 821px) {
  .chk--c .chk__inC { min-height: 90vh; }     /* Prozess · Variante „Zentriert" (kein Overlay) */
  /* 95vh für die Bühnen, die seit dem Overlay-Header bei y=0 beginnen: sie
     belegten vorher `74px + 90vh`, jetzt exakt 90vh — dieselbe Rechnung wie bei
     `.hero`. Ohne Overlay (Prozess mit anderer Bühne) bleibt es faktisch bei
     90vh, weil dann auch der Negativ-Versatz nicht greift. */
  .khero__in { min-height: 95vh; }            /* Karriere · Ärzte + MFA */
  .chk--a .chk__in { min-height: 95vh; }      /* Prozess · Portrait-Bühne (Standard) */
  .kihero, .kihero__in { min-height: 95vh; }  /* Luma KI — seit 07/2026 ebenfalls unter der Leiste */
}

/* Wer Bewegung reduziert haben moechte, bekommt den Hover ohne das Anheben.
   Der Farbwechsel bleibt — die Rueckmeldung geht dadurch nicht verloren. */
@media (prefers-reduced-motion: reduce) {
  .btn:hover, .btn:active,
  .cc__btn--primary:hover,
  .consult-modal__submit:hover,
  .ti-load-more-reviews-button:hover,
  .artbody .art-cta a.btn-primary:hover { transform: none; }
}
