/* ============================================================
   berg-seiten.css — die Bergwelt auf den vier UNTERSEITEN
   (services · kontakt · roi-rechner · 404), Paket 3, 06.09.2026
   ============================================================
   WARUM ES DIESE DATEI GIBT
   -------------------------
   Die Startseite bringt ihre Bergwelt in drei Dateien mit:
     css/berg.css      — das Bett selbst (Ebenen, Geometrie, Hoehenband)
     css/layering.css  — Flaechen/Schatten oberhalb der Falz
     css/akte.css      — Lesegrund-Scrims + die scroll-craft-Akte
   Von diesen dreien laden die Unterseiten nur `berg.css` (fuer `.berg-crest`).
   `layering.css` und `akte.css` sind ausdruecklich auf `index.html` begrenzt —
   sie enthalten ID-Selektoren (#services, #prozess, #faq, #founder …), die auf
   den Unterseiten teils dieselben Namen treffen wuerden und dort etwas ganz
   anderes bedeuten (`#services` ist auf der Startseite eine Rail-Sektion, auf
   services.html gibt es die Sektionen `#workflows` … `#webseiten`).
   Sie hier einfach mitzuladen waere also kein Sparen, sondern ein Fehler.

   Diese Datei ist deshalb die SEITENSPEZIFISCHE Ergaenzung: sie NUTZT die
   Vertraege von css/berg.css und js/berg.js und aendert an ihnen nichts.
   Geladen wird sie ausschliesslich von den vier genannten Seiten.
   `impressum.html` und `datenschutz.html` laden sie NICHT (Vorgabe: Rechtsseiten
   ohne Scroll-Elemente, nur die Kammlinie bleibt dort).

   ------------------------------------------------------------
   EINBAU-VERTRAG (je Unterseite)
   ------------------------------------------------------------
   1) Im <head>, NACH css/berg.css:
        <link rel="stylesheet" href="css/berg-seiten.css?v=w10" />
      Blockierend wie jedes andere Stylesheet. Ein Nachladen per JS ist
      verworfen: jede Stylesheet-Aktivierung nach dem ersten Paint laesst
      Chrome die Bett-Ebenen als Layout-Shift zaehlen (Bisektion in
      Messprotokoll, Nachbesserung Runde 2).

   2) Direkt nach <body>, vor Header/Main/Footer — die KURZE Fassung des
      Betts, drei Bildebenen statt fuenf (Begruendung: Messprotokoll § 0.1):

        <div class="berg berg--seite" aria-hidden="true">
          <div class="berg-himmel">     <picture>…</picture> </div>
          <div class="berg-grund"></div>
          <div class="berg-kamm berg-kamm--fern"> <picture>…</picture> </div>
          <div class="berg-kamm berg-kamm--nah">  <picture>…</picture> </div>
          <div class="berg-boden"></div>
        </div>

      `.berg--seite` ist der Schalter fuer alles, was sich gegenueber der
      Startseite unterscheidet (siehe Block 1). Ohne die Klasse gaelten die
      Startseiten-Raten.

   3) Jede Sektion, die am Bett teilnimmt, bekommt wie auf der Startseite
        data-berg-station="<name>" data-berg-nebel="0..1" data-berg-licht="0..1"
      Die Unterseiten laufen bewusst NICHT bis licht=1: der Gipfel gehoert der
      Kontakt-Sektion der Startseite (Messprotokoll § 0.2).

   4) Am Seitenende, in derselben Reihenfolge wie auf der Startseite:
        <script src="js/berg.js?v=w10" defer></script>
      NACH js/scroll-fx.js und (auf kontakt/404) nach vendor/gsap.min.js —
      berg.js uebernimmt [data-scrub] nur, wenn window.gsap FEHLT, und die
      defer-Skripte laufen in Dokumentreihenfolge.

   ------------------------------------------------------------
   WAS DIESE DATEI NICHT TUT
   ------------------------------------------------------------
   Keine neuen Farben (alle Werte kommen aus dem :root der jeweiligen Seite),
   kein neues Layout, keine Aenderung an Formularen, Reglern oder am
   Calendly-Pfad. Kein pin/pan-Akt: die Unterseiten sind zu kurz dafuer.
   ============================================================ */

/* ============================================================
   1) Das Bett — kurze Fassung
   ============================================================ */

/* Der Seiteninhalt muss ueber dem festen Bett (z-index:0) liegen.
   `header` steht hier bewusst NICHT drin: `.nav` ist auf allen vier Seiten
   bereits `position:fixed; z-index:60` — ein `position:relative` wuerde die
   feste Navigation kaputtmachen. Mobile-Menue (55) und Consent (50) liegen
   ebenfalls schon ueber dem Bett. */
main, footer{ position:relative; z-index:1; }

/* Wie auf der Startseite: der Seitengrund ist der tiefste Ton, damit an den
   Raendern des Betts kein hellerer Streifen steht. */
body{ background:var(--bg-deep); }

/* PARALLAX-RATE DER NAH-EBENE.
   Die Mitte-Ebene faellt auf den Unterseiten weg — Entscheidung Alex, aus
   Gewicht: mitte-a2.webp wiegt 128 KB (mobil 63 KB), und die Unterseiten sind
   mit 3-4 vh Scrollweg ein Bruchteil der Startseite (16 vh); die mittlere
   Tiefenebene wuerde dort kaum zur Geltung kommen.
   (Stand 22.09.2026: Hier stand frueher als Grund der Befund HOCH-2, blauer
   Freistellsaum in mitte-a1.webp. Der ist erledigt — mitte-a1.webp wird
   nirgends mehr geladen, sie wurde am 06.09.2026 durch mitte-a2.webp ersetzt,
   der Saum fiel dabei von 55 % auf rund 2 % der Spalten. Die Ebene bleibt hier
   trotzdem weg, aber aus dem Grund darueber, nicht wegen eines Fehlers.)
   Damit waeren fern (90 px) und
   nah (145 px) direkte Nachbarn mit +61 % Unterschied — die Skill-Regel
   erlaubt 10-30 % zwischen benachbarten Ebenen. Die Nah-Ebene uebernimmt
   deshalb hier die Rate der ausgelassenen Mitte-Ebene:
       himmel 70 -> fern 90 (+28,6 %) -> nah 115 (+27,8 %).
   Der Pointer-Lean wird im selben Verhaeltnis mitgenommen (16 -> 12 px).
   Zwei Klassen (0,2,0) schlagen die Regel in berg.css (0,1,0) — berg.css
   bleibt unangetastet. */
.berg--seite .berg-kamm--nah{
  transform:translate3d(calc(var(--berg-mx) * 12px), calc(var(--berg-p) * 115px), 0);
}

/* Die Nah-Ebene ist auf den Unterseiten die VORDERSTE Kette (kein Nebel
   davor). Damit sie den kurzen Aufstieg mittraegt statt ihn zuzustellen,
   sitzt sie etwas tiefer als auf der Startseite: der Blick auf die
   Fern-Kammlinie bleibt ueber die ganze Seite frei. */
.berg--seite .berg-kamm--nah{ height:52vh; min-height:290px; bottom:-8vh; }
@media (max-width:760px){
  .berg--seite .berg-kamm--nah{ height:36vh; min-height:200px; }
}

/* ============================================================
   2) Was das Bett am Hero freilegen muss
   ============================================================ */

/* Die Hero-Flaechen der Unterseiten sind DECKENDE Verlaeufe — sie wuerden das
   Bett auf dem ersten Bildschirm vollstaendig zudecken, und genau dort faellt
   die Entscheidung, ob man auf derselben Website ist. Der Verlauf wird zur
   halbtransparenten Vignette: dunkel genug, dass der Lichtstrahl
   (.beam-fallback) und die Ueberschrift stehen, durchlaessig genug, dass der
   Grat dahinter sichtbar ist. Der eigentliche Lesegrund der Ueberschrift ist
   und bleibt `.hero-scrim` (unveraendert in der jeweiligen Seite).

   SENKRECHTER Verlauf, nicht radial: ein radialer Verlauf endet an der
   Unterkante des Hero-Kastens mit einem Restwert und ergibt dort eine harte
   Linie quer durch die Bergwelt. Gemessen (p3-kante.mjs, Spalte x=20/40/60,
   also ohne Text und ohne Hoehenband): Helligkeitssprung von einer Bildzeile
   zur naechsten bei y=685 = **21,9** Stufen. Mit dem senkrechten Verlauf, der
   an der Unterkante auf 0 laeuft, bleibt an derselben Stelle **1,2**
   (Nachmessung im Messprotokoll). Seitliche Kanten kann er nicht haben: er
   verlaeuft nur in einer Achse und der Kasten ist viewportbreit. */
/* `section.` davor ist Pflicht, nicht Kosmetik: der <style>-Block der Seite
   steht IM DOKUMENT NACH diesem <link> und definiert `.page-hero{background:…}`
   mit derselben Spezifitaet (0,1,0) — bei Gleichstand gewinnt die spaetere
   Regel. Erster Lauf ohne `section.`: die Rechnung stimmte, die Kante blieb
   trotzdem bei 21,1, weil meine Regel gar nicht griff (Computed Style zeigte
   weiter den radialen Verlauf der Seite). Mit dem Typselektor 0,1,1 gewinnt
   sie. Dieselbe Falle steht in css/akte.css dokumentiert. */
section.page-hero, section.hero{
  /* Die Werte sind die Kontrast-Reserve des Heros. Erster Anlauf war schwaecher
     (.62/.44/.18) und brauchte zusaetzlich einen Blockscrim unter dem
     Hero-Text — der war im Screenshot als dunkles Rechteck mit erkennbaren
     Ecken zu sehen (`shots-v2/paket3/services/1440-01-page-hero.png`, erste
     Fassung), weil seine senkrechte Flanke wegen `overflow:hidden` am
     Hero-Fuss nur 44 px lang sein durfte. Ein Verlauf ueber den ganzen Kasten
     kann diese Kante gar nicht haben: er ist viewportbreit und laeuft unten
     auf 0. Deshalb hier etwas mehr Deckung und dafuer KEIN Block darunter. */
  /* Die Ausblendung steht in PIXELN am Fuss, nicht in Prozent: auf kontakt und
     404 ist der Hero `align-items:flex-end`, der Text steht also unten
     (`.hero-inner{padding:… 76px}` bzw. 70 px). Eine prozentuale Flanke nahm
     ihm genau dort die Deckung — gemessen: `.hero-sub` auf kontakt bei 768 px
     und 10 % Scroll gegen einen Gratpixel rgb(69,77,90) = **4,15:1**. Mit
     70 px Flanke liegt die letzte Textzeile noch im vollen Plateau, und die
     Flanke selbst ist mit 0,3 Stufen je Zeile weit von einer Kante entfernt. */
  background:linear-gradient(180deg,
    rgba(10,17,32,.74) 0%,
    rgba(8,13,24,.64) 50%,
    rgba(6,10,19,.58) calc(100% - 70px),
    rgba(5,8,15,0) 100%);
}

/* Der Hero-Kasten hat zwei WEITERE deckende Schichten, die an seiner
   Unterkante hart abbrechen: `.hero-scrim` (radial, `transparent 78%` — an der
   unteren linken Ecke liegt der Verlauf bei ~0,72 seines Radius und damit noch
   bei rund 9 % Deckung) und `.beam-fallback`. Der senkrechte Verlauf am
   Kasten selbst allein hat den Sprung deshalb NICHT beseitigt (nachgemessen:
   weiterhin 21,9). Beide bekommen darum eine Maske, die nur auf den letzten
   70 px des Heros auslaeuft — dieselbe Flankenlaenge wie der Verlauf oben und
   aus demselben Grund: auf kontakt/404 steht der Text am Hero-FUSS
   (`.hero-inner`, Innenabstand unten 76 bzw. 70 px) und muss im vollen Plateau
   bleiben. Erste Fassung waren 120 px; damit lag die letzte Textzeile in der
   Flanke und `.hero-sub` fiel auf kontakt/768 auf 4,15:1. */
.page-hero .hero-scrim, .hero .hero-scrim,
.page-hero .beam-fallback, .hero .beam-fallback{
  -webkit-mask-image:linear-gradient(to bottom, #000 calc(100% - 70px), transparent 100%);
  mask-image:linear-gradient(to bottom, #000 calc(100% - 70px), transparent 100%);
}

/* `.hero-bottom-fade` blendet den Hero in `var(--bg)` aus — vor einem festen
   Bett ist das ein deckendes Band quer durch die Bergwelt, unter dem sie
   wieder auftaucht. Auf der Startseite ist dieses Element aus demselben Grund
   entfernt worden (Messprotokoll, Abschnitt 2); hier bleibt es im Markup
   stehen und wird nur abgeschaltet, damit an den Seiten nichts umgebaut wird,
   was sich nicht animiert. */
.hero-bottom-fade{ display:none; }

/* `.berg-crest` war das Berg-ZITAT fuer eine Zeit ohne Bett: eine
   SVG-maskierte Kammlinie aus Flaechenfarbe. Vor dem echten Bergfoto ist sie
   eine zweite, geometrische Bergkette vor der echten — genau der Befund, der
   auf der Startseite beanstandet wurde („geometrische Zacken mit hartem
   blauem Gipfelstrich", Messprotokoll Runde 1 § 2), dort ersatzlos entfernt.
   Das Markup bleibt stehen: faellt diese Datei aus, ist die Kammlinie wieder
   da und die Seite sieht aus wie vorher. Auf impressum/datenschutz bleibt sie
   sichtbar — die laden diese Datei nicht. */
.berg-crest{ display:none; }

/* ============================================================
   3) Flaechen, die auf dem Foto Flaechen bleiben muessen
   ============================================================
   Alle vier Seiten haben Karten, deren Flaeche nach unten in die Transparenz
   auslaeuft (.16 bis .40). Ueber dem flachen Seitengrund war das ein feiner
   Verlauf, ueber dem Bett steht der Text im unteren Drittel praktisch direkt
   auf dem Schnee. Gegenmittel wie auf der Startseite (Runde 1/2): der Verlauf
   bleibt als Gestaltungsmittel, nur flacher — Fuss .84 statt .16/.35/.40.
   Die Selektoren sind mit einer Sektionsklasse verschaerft, weil der
   <style>-Block der Seiten IM DOKUMENT NACH diesem <link> steht und eine
   gleich spezifische Regel hier sonst verlieren wuerde.

   NACHGEMESSEN UND KORRIGIERT: .84 reicht nicht. Die drei Panels bekommen
   deshalb dieselbe Loesung wie das Kontakt-Panel der Startseite (akte.css:
   `#kontakt .cta-panel.ly-peak`): deckend. Die Verlaufsrichtung bleibt die des
   Originals — oben --surface, unten dunkler; frueher lief der Fuss in die
   Transparenz und damit optisch in den Seitengrund, heute steht dort
   --bg-deep, dieselbe Farbe, nur deckend. Der Grat scheint nicht mehr durch.
   Nur .mod (reine Deko, kein --blue am Fuss) bleibt halbtransparent. */
.cta-sec .cta-panel{ background:linear-gradient(180deg, var(--surface) 0%, var(--bg-deep) 100%); }
.contact-sec .k-card{ background:linear-gradient(180deg, var(--surface) 0%, var(--bg-deep) 100%); }
.roi-sec .roi-panel{ background:linear-gradient(180deg, var(--surface), var(--bg-deep)); }
.svc-sec .mod{ background:linear-gradient(180deg, rgba(13,21,38,.88), rgba(13,21,38,.84)); }
/* Der Chip im Hero (11 px, --muted) stand auf rgba(13,21,38,.4) — auf dem
   Grat darunter zu wenig. Gleiche Optik, traegerer Grund. */
/* `section.` wieder Pflicht: kontakt.html und 404.html definieren selbst
   `.hero .chip{…background:rgba(13,21,38,.4)}` mit derselben Spezifitaet und
   stehen im Dokument spaeter. Im Computed Style nachgeprueft, nicht gerechnet. */
section.page-hero .chip, section.hero .chip{ background:rgba(13,21,38,.84); }

/* Der Footer liegt am Fuss der Seite ueber dem hellsten Teil des Betts.
   Gleiche Loesung wie auf der Startseite (.ly-hold): eine getoente,
   halbtransparente Flaeche — dunkel genug fuer die 11-px-Spaltentitel,
   hell genug, dass die Silhouette durchscheint. */
footer{ background:rgba(13,21,38,.84); }

/* ============================================================
   4) Lesegrund — der Scrim fuer Text OHNE eigene Flaeche
   ============================================================
   Wortgleich uebernommen aus css/akte.css (Block 8), weil die Unterseiten
   diese Datei nicht laden duerfen (siehe Kopf). Form: ein Plateau von 88 %
   Deckung ueber der Textflaeche, an allen vier Seiten weich auslaufend, die
   Flanken auf einer S-Kurve mit fuenf Stuetzstellen (0/.11/.50/.89/1) —
   ein linearer Verlauf hinterlaesst an beiden Enden einen Knick, den das Auge
   als Kante liest (Mach-Band, Messprotokoll Paket 2 § 4).
   Flanken in PIXELN, nicht in Prozent: prozentuale Stops haengen an der
   Blockhoehe, dadurch stuende die erste bzw. letzte Zeile eines Blocks in der
   weichen Flanke statt im Plateau.
   z-index:-1 legt den Scrim hinter den Text, aber vor das Bett: die Sektionen
   sind position:relative ohne eigenen z-index, erzeugen also keinen
   Stapelkontext, und main steht auf z-index:1 ueber dem Bett (z-index:0). */
.bs-lesegrund{ position:relative; --sr-y:84px; --sr-x:24px; --sr-a:.88; }
/* Die lange waagerechte Flanke (Rahmen -120 px) nur, wenn neben .wrap
   (1160 px) auch nach Abzug der Scrollleiste mindestens 120 px Rand bleiben:
   1160 + 2*120 + 17 = 1417. Darunter 24 px Flanke (Rahmen -40 px = genau der
   Innenabstand von .wrap), sonst waechst document.scrollWidth. */
@media (min-width:1420px){
  .bs-lesegrund{ --sr-x:104px; }
}
/* ZWEI STELLEN MIT EIGENEN WERTEN — Ursache gemessen, nicht geraten.
   `.cal-hint a` (kontakt, „Datenschutzerklaerung") und `.cta-alt a`
   (roi-rechner, „Zur Kontakt-Seite") stehen in --blue (11-13 px) und blieben
   nach allen Panel-Aenderungen bei 4,32 bis 4,49:1 haengen. Der Untergrund ist
   dort NICHT der Grat — das Panel ist deckend. Beleg (`p3-blau.mjs`): mit
   ausgeblendetem `.btn` steigt derselbe Messpunkt von 4,32 auf 4,66:1
   (roi) bzw. von 4,49 auf 5,02:1 (kontakt), mit `box-shadow:none` dagegen
   gar nicht. Verursacher ist also `.btn-primary::before` — eine geblurrte
   Farbkopie des Knopfs (`filter:blur(16px)`), die 30-50 px ueber den Knopf
   hinaus leuchtet und den Absatz darunter bzw. darueber blau aufhellt. Das
   ist ein bestehendes Gestaltungselement der ganzen Website (auch auf der
   Startseite) und wird hier nicht angefasst.
   Gegenmittel deshalb lokal — und zwar am LINK, nicht am Absatz: der erste
   Versuch legte den Blockscrim unter den ganzen Absatz und war im Screenshot
   ein sichtbares dunkles Band quer durch das CTA-Panel
   (`shots-v2/paket3/blick-roi-ctapanel.png`, erste Fassung). Jetzt eine kleine,
   radial auslaufende Unterlage direkt hinter den Linkwoertern: sie deckt genau
   den Schein ab und hat keine gerade Kante.
   `z-index` ist dabei kein Zierrat, sondern der Grund, dass es wirkt:
   `.btn-primary` traegt `isolation:isolate`, sein Schein liegt also im
   Stapelkontext des Knopfs. Auf roi steht der Link im DOM NACH dem Knopf und
   malt damit ohnehin darueber; auf kontakt steht `.cal-hint` DAVOR und braucht
   `z-index:1`, sonst legt sich der Schein wieder oben drauf. */
.contact-sec .cal-hint{ z-index:1; }
.contact-sec .cal-hint a,
.cta-sec .cta-alt a{ position:relative; z-index:0; }
.contact-sec .cal-hint a::after,
.cta-sec .cta-alt a::after{
  content:""; position:absolute; z-index:-1; pointer-events:none;
  inset:-5px -12px; border-radius:10px;
  /* .58/.46 statt .78/.66: mit den hoeheren Werten war die Unterlage im
     Screenshot als dunkle Pille erkennbar. So schwach wie moeglich, so stark
     wie noetig — nachgemessen 4,9:1 statt 5,25:1, Schwelle 4,5. */
  background:radial-gradient(120% 165% at 50% 50%,
    rgba(5,8,15,.58) 0%, rgba(5,8,15,.46) 58%, rgba(5,8,15,0) 100%);
}

.bs-lesegrund::after{
  content:"";
  position:absolute; z-index:-1; pointer-events:none;
  inset:calc(-1 * var(--sr-y) - 12px) calc(-1 * var(--sr-x) - 16px);
  background:linear-gradient(to bottom,
    rgba(5,8,15,0) 0,
    rgba(5,8,15,calc(var(--sr-a) * .11)) calc(var(--sr-y) * .25),
    rgba(5,8,15,calc(var(--sr-a) * .50)) calc(var(--sr-y) * .5),
    rgba(5,8,15,calc(var(--sr-a) * .89)) calc(var(--sr-y) * .75),
    rgba(5,8,15,var(--sr-a)) var(--sr-y),
    rgba(5,8,15,var(--sr-a)) calc(100% - var(--sr-y)),
    rgba(5,8,15,calc(var(--sr-a) * .89)) calc(100% - var(--sr-y) * .75),
    rgba(5,8,15,calc(var(--sr-a) * .50)) calc(100% - var(--sr-y) * .5),
    rgba(5,8,15,calc(var(--sr-a) * .11)) calc(100% - var(--sr-y) * .25),
    rgba(5,8,15,0) 100%);
  -webkit-mask-image:linear-gradient(to right,
    transparent 0,
    rgba(0,0,0,.11) calc(var(--sr-x) * .25), rgba(0,0,0,.50) calc(var(--sr-x) * .5), rgba(0,0,0,.89) calc(var(--sr-x) * .75),
    #000 var(--sr-x), #000 calc(100% - var(--sr-x)),
    rgba(0,0,0,.89) calc(100% - var(--sr-x) * .75), rgba(0,0,0,.50) calc(100% - var(--sr-x) * .5), rgba(0,0,0,.11) calc(100% - var(--sr-x) * .25),
    transparent 100%);
  mask-image:linear-gradient(to right,
    transparent 0,
    rgba(0,0,0,.11) calc(var(--sr-x) * .25), rgba(0,0,0,.50) calc(var(--sr-x) * .5), rgba(0,0,0,.89) calc(var(--sr-x) * .75),
    #000 var(--sr-x), #000 calc(100% - var(--sr-x)),
    rgba(0,0,0,.89) calc(100% - var(--sr-x) * .75), rgba(0,0,0,.50) calc(100% - var(--sr-x) * .5), rgba(0,0,0,.11) calc(100% - var(--sr-x) * .25),
    transparent 100%);
}
/* (Die frueher hier stehende Sonderregel fuer den Hero-Textblock ist entfallen:
   der Hero braucht seit dem staerkeren Verlauf (Block 2) keinen Blockscrim mehr,
   und mit ihm ist auch seine sichtbare Rechteckkante weg.) */

/* Schmale Viewports: senkrechte Flanke 48 px (Rahmen -60 px), waagerecht
   KEINE Flanke — der Rahmen endet exakt am Innenabstand von .wrap (24 px).
   Jeder groessere negative Seitenwert erzeugt echten horizontalen Overflow
   (auf der Startseite gemessen: scrollWidth 442 statt 390 bei -56 px). */
@media (max-width:760px){
  .bs-lesegrund{ --sr-y:48px; --sr-x:0px; --sr-a:.90; }
  .bs-lesegrund::after{ inset:-60px -24px; }
  /* (Die Sonderregel fuer einen Block, der SELBST das .wrap ist, ist entfallen:
     seit der Hero-Textblock keinen Scrim mehr traegt, gibt es keinen solchen
     Block mehr. Nachgewiesen mit p3-css.mjs, Punkt 3: der Selektor traf auf
     keiner der vier Seiten mehr ein Element.) */
}

/* Eyebrow-Zeilen (.sec-label, .k-kicker) stehen in --blue (#4F7DF9) bei 11 px.
   Diese Farbe erreicht 4,5:1 nur gegen sehr dunklen Grund; auf dem blanken
   Seitengrund sind es 5,0:1, mehr gibt sie nicht her. Statt die Markenfarbe zu
   wechseln bekommt nur die Zeile selbst eine kleine, weich auslaufende
   Unterlage — sie stellt genau den Zustand her, den die Zeile ohne Bett
   ohnehin hat. Bei beiden ist ::before vom Strich belegt, deshalb ::after.
   Bewusst NUR diese zwei: beide sind `display:inline-flex`, die Unterlage ist
   also so breit wie die Zeile. Ein Block-Element (`.how-num`, `.foot-h`) haette
   eine spaltenbreite Pille bekommen — die stehen stattdessen unter einem
   Blockscrim bzw. auf der Footer-Flaeche.

   NACHGEZOGEN NACH SICHTPRUEFUNG: nur dort, wo die Zeile wirklich auf dem
   Bett steht — also innerhalb eines Blockscrims. In einem deckenden Panel
   (`.cta-panel`, `.k-card`) steht sie auf --surface und hat dort schon
   4,89:1; die Unterlage waere da nur eine sichtbare dunkle Pille mitten im
   Panel (gesehen in `shots-v2/paket3/blick-roi-ctapanel.png`, erste Fassung).
   `.k-kicker` braucht sie aus demselben Grund gar nicht. */
.bs-lesegrund .sec-label{ position:relative; }
.bs-lesegrund .sec-label::after{
  content:"";
  position:absolute; z-index:-1; pointer-events:none;
  inset:-9px -20px;
  border-radius:999px;
  background:radial-gradient(130% 170% at 50% 50%,
    rgba(5,8,15,1) 0%, rgba(5,8,15,.98) 62%, rgba(5,8,15,0) 100%);
}

/* ============================================================
   5) Kinetik und Text-Reveal — die Darstellungsseite der berg.js-Vertraege
   ============================================================
   js/berg.js zerlegt [data-berg-kinetic] in .kin-line- bzw. .kin-wort-Bloecke
   und [data-berg-reveal="words"] in .rv-wort-Spans und schreibt darauf
   transform bzw. opacity. Die zugehoerigen Regeln stehen auf der Startseite in
   css/akte.css; hier stehen sie wortgleich noch einmal, weil die Unterseiten
   akte.css nicht laden. Sie sind die HALTBARE Seite des Vertrags — wer sie
   aendert, muss js/berg.js mitpruefen.

   [data-berg-kinetic] steht auf den Unterseiten teilweise am inneren
   <span data-i18n> statt an der <h2>: berg.js splittet ueber textContent, und
   die <h2> der Unterseiten enthalten diesen Span. Saesse das Attribut an der
   <h2>, wuerde der Span beim Splitten verschwinden und der EN-Umschalter
   faende sein Ziel nicht mehr. Der Span braucht dafuer display:block, sonst
   stuenden die Zeilenmasken (display:block) in einem Inline-Kasten. */
[data-berg-kinetic]{ display:block; }

/* Die Maske bekommt Luft fuer Ober- und Unterlaengen — eine Maske, die exakt
   am Zeilenkasten endet, schneidet g, j, p und Umlaute an. */
.kin-line{ display:block; overflow:hidden; padding:.08em 0 .14em; margin:-.08em 0 -.14em; }
.kin-line > span{ display:block; will-change:transform; }
/* Variante "words": jedes Wort in seiner eigenen Maske, inline-block, damit
   der Zeilenumbruch normal bleibt. */
.kin-wort{ display:inline-block; overflow:hidden; vertical-align:top; padding:.08em 0 .14em; margin:-.08em 0 -.14em; }
.kin-wort > span{ display:inline-block; will-change:transform; }

/* Wort-Reveal: bewusst KEIN Masken-Slide je Wort (das macht einen ganzen
   Absatz unruhig), sondern Opacity plus kleiner Y-Versatz — beides schreibt
   berg.js. Hier steht bewusst KEIN Startzustand mit opacity:0: ohne JS und bei
   reduzierter Bewegung bleibt der Text unveraendert sichtbar. */
.rv-wort{ display:inline-block; will-change:auto; }

/* ============================================================
   6) Reduzierte Bewegung — Ruhelage, egal was inline steht
   ============================================================
   js/berg.js setzt html.berg-akt bei prefers-reduced-motion gar nicht erst und
   splittet nichts. Diese Regeln sind die Notbremse fuer den Fall, dass der
   Modus MITTEN in der Sitzung umgeschaltet wird und Inline-Werte stehen
   geblieben sind. */
@media (prefers-reduced-motion: reduce){
  .kin-line > span, .kin-wort > span{ transform:none !important; }
  .rv-wort{ opacity:1 !important; transform:none !important; }
}

/* ============================================================
   7) Kontakt: Spaltenaufteilung und gleiche Hoehe (06.09.2026,
      Hoehen-Richtung korrigiert 08.09.2026)
   ============================================================
   Vorher: links die Termin-Karte, rechts eine .col-stack-Huelle mit Formular
   UND Direktkontakt. Vorgabe: Direktkontakt LINKS unter den Termin, in
   derselben Breite, und beide Spalten gleich hoch.

   Umgesetzt mit grid-template-areas statt mit Huellen — nur so laesst sich die
   Reihenfolge am Telefon (Termin, Nachricht, Direktkontakt) von der
   Spaltenaufteilung am Schirm trennen. Die Formularkarte spannt ueber BEIDE
   Zeilen; damit ist sie per Konstruktion genauso hoch wie Termin + Luecke +
   Direktkontakt. Kein fester Pixelwert, keine Messung im Skript, kein JS —
   die Gleichheit kann bei keiner Textlaenge und in keiner Sprache kippen.

   RICHTUNG DER HOEHENANGLEICHUNG (08.09.2026, Befund): `align-items:
   stretch` auf dem GANZEN Grid liess CSS Grid beide Zeilenspuren (row1/row2)
   auf die Mindesthoehe der spannenden Formularkarte aufblasen — die Karte
   "Direktkontakt" wurde dadurch selbst gestreckt (sichtbarer Leerraum unter
   der LinkedIn-Zeile, gemessen 410 px) UND das Textfeld wuchs auf die
   dadurch aufgeblaehte Kartenhoehe (gemessen 835 px). Die Richtung muss
   umgekehrt sein: die LINKE Spalte (Termin + Luecke + Direktkontakt) bleibt
   auf ihrer natuerlichen Inhaltshoehe (`align-items:start`, Default fuer
   nicht-spannende Grid-Kinder), NUR die Formularkarte bekommt
   `align-self:stretch` und waechst auf die dadurch entstandene Zeilenhoehe.
   Nachgemessen: Delta Unterkante Direktkontakt/Formularkarte sinkt von
   ~29-30 px auf ≤1 px, Textfeld von 835 px auf die tatsaechlich benoetigte
   Resthoehe (siehe unten).

   Spezifitaet: der <style>-Block der Seite steht im Dokument NACH diesem
   <link> und definiert `.contact-grid` (0,1,0). Deshalb ueberall der
   Sektions-Selektor davor. */
.contact-sec .contact-grid{
  grid-template-areas:
    "termin"
    "nachricht"
    "direkt";
}
.contact-sec .k-termin{ grid-area:termin; }
.contact-sec .k-nachricht{ grid-area:nachricht; }
.contact-sec .k-direkt{ grid-area:direkt; }

@media (min-width:1000px){
  .contact-sec .contact-grid{
    /* 08.09.2026: `start` statt `stretch` — Termin/Direktkontakt behalten
       ihre natuerliche Hoehe, nur die spannende Formularkarte soll wachsen
       (siehe Kopfkommentar). */
    align-items:start;
    grid-template-areas:
      "termin    nachricht"
      "direkt    nachricht";
    /* Beide Zeilen auf ihre natuerliche Inhaltshoehe (Termin bzw.
       Direktkontakt) — die Formularkarte darf diese Spuren nicht mehr
       aufblasen, seit sie nicht mehr am Zeilen-Stretch teilnimmt. */
    grid-template-rows:auto auto;
  }
  /* Nur die Formularkarte waechst auf die volle gespannte Zeilenhoehe
     (Termin + Luecke + Direktkontakt) — die zwei anderen Karten bleiben bei
     ihrer Inhaltshoehe (siehe `align-items:start` oben). */
  .contact-sec .k-nachricht{ align-self:stretch; display:flex; flex-direction:column; }
  .contact-sec .k-nachricht .cform{ flex:1; display:flex; flex-direction:column; gap:20px; }
  /* Waechst die Karte, waechst das TEXTFELD — nicht der Leerraum unter dem
     Knopf. min-height:0 ist noetig, weil ein Flex-Kind sonst nicht unter seine
     Inhaltshoehe schrumpfen darf und die Karte dann ueberlaufen wuerde. */
  .contact-sec .k-nachricht .cform-msg{ flex:1; display:flex; flex-direction:column; min-height:0; }
  /* min-height 96 statt vormals 120: die Untergrenze soll nur verhindern,
     dass das Feld bei sehr kurzem Inhalt der linken Spalte unbrauchbar
     klein wird — sie darf die Hoehenangleichung selbst nicht mehr
     dominieren (siehe Kopfkommentar, Befund 08.09.). */
  .contact-sec .k-nachricht .cform-msg textarea.field{ flex:1; min-height:96px; }
}

/* ============================================================
   8) Kontakt: Calendly-Einwilligung hinter einem Infozeichen
   ============================================================
   Die frueheren Regeln (.cal-mehr, <details>/<summary> mit Beschriftung
   „Was genau passiert") sind am 07.09.2026 entfallen. Seitdem gilt auf allen
   Seiten dasselbe Muster aus css/ihint.css: sichtbar ist NUR das Zeichen, der
   Text erscheint beim Ueberfahren, beim Tastaturfokus und beim Antippen.
   Am 22.09.2026 ist auf Alex' ausdrueckliche Entscheidung auch die sichtbare
   Kurzzeile .cal-hint vor dem Buchungsknopf entfallen (Begruendung: weniger
   Text um den Knopf herum). Der Hinweis — Calendly, USA, Daten und Cookies
   erst nach dem Klick, Link zur Datenschutzerklaerung — steht seitdem nur
   noch im Text hinter dem Zeichen (#ih-cal in kontakt.html), auf den auch
   aria-describedby des Buchungsknopfes zeigt.
   Die Regeln unten bleiben stehen: .cal-hint traegt auf kontakt.html weiter
   den <noscript>-Hinweis des Formulars. */

/* ============================================================
   9) Symbol-System — Inhalt von css/icons.css, hier EINGEBETTET
   ============================================================
   Die Startseite bindet diese Regeln inline ein, weil die eigene Datei
   dort 1,0 s Erstdarstellung kostete und Lighthouse mobil auf 72 drueckte.
   Auf den Unterseiten waere ein zweiter <link> derselbe Fehler — sie laden
   aber ohnehin schon berg-seiten.css blockierend, also stehen die Regeln
   hier drin: gleiche Wirkung, KEINE zusaetzliche Anfrage, und anders als
   ein Inline-<style> je Seite nur EINE Stelle zum Pflegen.
   Quelle: css/icons.css (unveraendert uebernommen), Katalog: IKONEN.md.
   Wer dort etwas aendert, zieht es hier nach. */
.ik{
  /* Groesse: ueber --ik-gr steuerbar, Vorgabe 20px */
  inline-size:var(--ik-gr,20px);
  block-size:var(--ik-gr,20px);
  flex:0 0 auto;              /* in Flex-Listen nie zusammenquetschen */
  display:inline-block;
  fill:none;
  stroke:currentColor;
  stroke-width:var(--ik-strich,1.5);
  stroke-linecap:round;
  stroke-linejoin:round;
  /* Ein Strichende darf nicht am Rand des Kastens abgeschnitten werden:
     die Pfade liegen bei 3..21, die halbe Strichbreite (0,75) passt in den
     Rand — overflow:visible ist trotzdem die sichere Bank fuer Skalierungen. */
  overflow:visible;
}

/* --- Zeilensymbol: neben Fliesstext, mitwachsend mit der Schriftgroesse ---
   1,15em statt 1em, weil ein Strichsymbol bei gleicher Kastenhoehe optisch
   kleiner wirkt als eine Versalie. Der negative vertical-align setzt die
   optische Mitte des Symbols auf die halbe x-Hoehe (Archivo, 1.7 Zeilenhoehe). */
.ik-zeile{
  --ik-gr:1.15em;
  vertical-align:-.22em;
}

/* --- Kartensymbol: ueber der Kartenueberschrift oder im Feld --- */
.ik-karte{
  --ik-gr:28px;
  display:block;
}
@media (max-width:640px){
  .ik-karte{ --ik-gr:26px }
}

/* --- Symbol als erstes Kind einer Flex-Zeile (Listenpunkt, Chip mit
   mehrzeiligem Text): dort wirkt vertical-align nicht, das Symbol muss ueber
   den Aussenabstand auf die erste Textzeile gesetzt werden.
   Uebernommen 1:1 von der Startseite (Abschnitt
   "Symbol-Ausrichtung") — ersetzt die eigene align-items:center-Regel dieser
   Datei: die zog das Symbol bei MEHRZEILIGEN Punkten auf die Blockmitte statt
   die erste Zeile (dort gemessen: 24,47 px Versatz). Diese Formel funktioniert
   fuer ein- UND mehrzeilige Punkte. `.28em` zuerst als Rueckfall fuer Engines
   ohne die `lh`-Einheit (Chrome < 109, Safari < 16.4, Firefox < 120); die
   zweite Deklaration gewinnt dort, wo `lh` unterstuetzt wird (CSS: eine nicht
   unterstuetzte Einheit macht die gesamte Deklaration ungueltig, der Browser
   behaelt dann die vorherige — kein @supports noetig). --ik-gr muss die
   tatsaechliche Symbolgroesse tragen (z. B. ueber .ik-zeile). */
.ik-flex{
  margin-block-start:.28em;
  margin-block-start:calc((1lh - var(--ik-gr,20px)) / 2);
}

/* --- Kartensymbol im Feld: 44er Kaestchen in der Flaechen-Optik der Karten.
   Farbe des Symbols bleibt currentColor — das Feld faerbt nur den Grund. --- */
.ik-feld{
  display:inline-flex;
  align-items:center;
  justify-content:center;
  inline-size:44px;
  block-size:44px;
  border:1px solid var(--line,rgba(242,245,252,.08));
  border-radius:12px;
  background:rgba(13,21,38,.55);
  box-shadow:inset 0 1px 0 0 rgba(125,211,252,.14);
}
.ik-feld > .ik{ --ik-gr:22px }

/* --- Farbe. Nur diese drei Toene, sie kommen aus der Marken-Palette.
   --ik-blau ist der Standard fuer Themen-Symbole, --ik-eis bleibt die
   Ausnahme fuer Bestaetigungen, matt fuer Fussnoten-Hinweise. --- */
.ik-blau{ color:var(--blue,#4F7DF9) }
.ik-eis { color:var(--ice,#7DD3FC) }
.ik-matt{ color:var(--muted,rgba(242,245,252,.62)) }

/* --- Zugaenglichkeit ---------------------------------------------------
   Dekoratives Symbol neben Text: aria-hidden="true" focusable="false" am
   <svg>. focusable ist noetig, weil aeltere Engines SVG sonst in die
   Tab-Reihenfolge nehmen. Steht ein Symbol allein (Knopf ohne Text), traegt
   das <svg> role="img" + aria-label, oder ein <title> als erstes Kind.
   Diese Regel faengt den Fall ab, dass ein Symbol in einem Link steht: es
   soll den Fokusring des Links nicht doppeln. */
.ik:focus{ outline:none }

/* --- forced-colors (Windows-Kontrastmodus) -----------------------------
   In forced-colors ersetzt das System jede Farbe. Weil die Symbole nur mit
   currentColor arbeiten, uebernehmen sie automatisch den erzwungenen
   Textton — sie bleiben also sichtbar. Die Regel setzt das nur explizit und
   schuetzt gegen eine fremde globale svg{fill:currentColor}-Regel, die die
   Innenflaeche zulaufen liesse. */
@media (forced-colors:active){
  .ik{
    stroke:currentColor;
    fill:none !important;
    forced-color-adjust:auto;
  }
  .ik-feld{
    border-color:CanvasText;
    background:Canvas;
    box-shadow:none;
  }
}

/* --- reduzierte Bewegung ------------------------------------------------
   Das Symbol-System ist statisch: kein Symbol bringt eine eigene Animation
   oder einen eigenen Uebergang mit. Die Regel ist reine Absicherung gegen
   geerbte Uebergaenge aus Seitenregeln (z. B. Karten-Hover), damit ein
   Symbol unter prefers-reduced-motion garantiert stillsteht. */
@media (prefers-reduced-motion:reduce){
  .ik, .ik *{
    animation:none !important;
    transition:none !important;
  }
}

/* --- Druck: auf weissem Papier braucht der Strich einen dunklen Ton --- */
@media print{
  .ik{ stroke:#0D1526 }
  .ik-feld{ border-color:#0D1526; background:none; box-shadow:none }
}

/* ============================================================
   10) Arrow-Fill-Knopf: die zwei Ergaenzungen der Unterseiten
   ============================================================
   Die Mechanik selbst steht in css/btn-arrow.css (gemeinsame Datei, per <link>
   geladen — EIN Ort fuer den Knopf, kein Duplikat, das auseinanderlaeuft).
   Hier nur, was auf diesen Seiten dazukommt. */

/* Knoepfe, die ueber die ganze Spalte gehen (Formular-Absenden, Rechner). */
.baf-voll{ width:100%; justify-content:center; }

/* Das Infozeichen als Katalog-Symbol statt als Buchstabe. Der runde Rahmen
   steckt im Symbol selbst, deshalb hier kein border mehr. */
.cal-info-ik{ color:var(--blue); flex:none; }

/* Vertrauenszeile unter einem Primaerknopf — dasselbe Muster wie auf der
   Startseite. Nicht --faint: dort kam die Zeile ueber dem Bett auf 3,96:1;
   .72 liegt auf demselben Untergrund darueber (auf diesen Seiten nachgemessen,
   Werte im Bericht). */
/* Mehrere Vertrauenspunkte in einer Zeile: JE PUNKT
   ein eigenes Symbol statt eines Symbols fuer die ganze Zeile ("ein
   Terminkalender bei 'kostenlos' macht wenig Sinn"). .cta-trust bleibt der
   Zeilen-RAHMEN (umbrechend); .trust-punkt ist EIN Punkt darin — nowrap haelt
   Symbol und Text zusammen, der Umbruch passiert nur ZWISCHEN Punkten.

   Ausrichtung — zweiter Anlauf, selber Tag: die erste Fassung (hier)
   nutzte align-items:center OHNE .ik-flex und lag bei 0,34-0,61 px, aber NUR
   fuer EINZEILIGE Punkte gemessen. An einem
   MEHRZEILIGEN Punkt widerlegt: align-items:center zieht das Symbol dort auf
   die Blockmitte statt die erste Zeile (24,47 px Versatz an ".nofit-liste",
   3 Zeilen Text). Uebernommen ist jetzt diese Regel (Abschnitt
   "Symbol-Ausrichtung"), die fuer ein- UND mehrzeilige Punkte
   funktioniert: align-items:flex-start + .ik-flex mit
   margin-block-start:calc((1lh - var(--ik-gr,20px)) / 2) am Symbol (Regel bei
   .ik-flex, Abschnitt 9). Nachgemessen auf diesen vier Seiten (auch am
   einzigen mehrzeiligen Fall hier, roi-rechner "Wann wir nicht passen" gibt es
   nicht — kontakt.html .cta-trust bei 320 px erzwungen): alle ≤ 1 px. */
.cta-trust{
  margin-top:16px; display:flex; flex-wrap:wrap; align-items:flex-start;
  row-gap:6px; column-gap:16px;
  font-family:var(--font-m); font-size:.78rem; line-height:1.5;
  color:rgba(242,245,252,.72);
}
.cta-panel .cta-trust{ justify-content:center; }
.cform .cta-trust{ margin-top:14px; }
.trust-punkt{ display:inline-flex; align-items:flex-start; gap:7px; white-space:nowrap; }

/* ============================================================
   11) Feinschrift hinter einem Infozeichen — entfallen
   ============================================================
   .fein-mehr ist am 07.09.2026 entfallen und durch css/ihint.css ersetzt
   (ein Zeichen, keine Beschriftung, Sprechblase bei Hover/Fokus/Tipp).
   Nebenbefund beim Umbau, deshalb hier notiert: .fein-mehr war ein <details>
   INNERHALB eines <p>. <details> ist Flow-Content, kein Phrasing-Content —
   der Parser hat das <p> davor stillschweigend geschlossen. Das neue Muster
   ist ein <span> und passt damit sauber in den Absatz. */

/* ============================================================
   12) Handyfassung (06.09.2026) — gilt NUR unter 640 px
   ============================================================
   Alles hier steht in einer Media-Query. Der Desktop bleibt damit Pixel fuer
   Pixel, wie er war (nachgemessen: Pixelvergleich 1440/1920 im Bericht).

   a) Zwei Fassungen derselben Ueberschrift: .nur-breit ab 640 px, .nur-handy
      darunter. Die Handy-Fassungen sind KUERZUNGEN — keine neue Zahl, keine
      neue Zusage (Handy-Prinzip 12).
   b) Zielgroessen: Handy-Prinzip 11 verlangt mindestens 48 px. Gemessen waren
      es vorher Menue-Knopf 44 px, Calendly-Zweitlink 40 px, Rechner-Reiter
      34 px (p4-handy.mjs, 375 und 390).
   c) Seitenlaenge: die Abstaende der Sektionen sind fuer den Schirm gebaut.
      Am Telefon kosten sie ohne Gewinn Hoehe. */
.nur-handy{ display:none; }
@media (min-width:640px){
  .nur-handy{ display:none !important; }
}
@media (max-width:639px){
  .nur-breit{ display:none !important; }
  h1.nur-handy, h2.nur-handy{ display:block; }

  /* --- b) Zielgroessen ---
     Die Seitenregeln stehen im <style>-Block NACH diesem <link>; bei gleicher
     Spezifitaet gewinnen sie. Erster Anlauf ohne die Typselektoren griff
     deshalb nicht (nachgemessen: Menue-Knopf blieb bei 44 px, Sektionsabstand
     bei 100 px). Mit `header`/`section`/`body` davor gewinnt die Regel hier. */
  header .nav-burger{ width:48px; height:48px; }
  .cal-extern{ display:inline-block; padding:14px 8px; margin:-14px -8px; min-height:48px; }
  .roi-tab{ min-height:48px; }

  /* --- c) Laenge: Sektionsabstaende und Hero-Vorlauf zurueckgenommen --- */
  body .sec{ padding:64px 0; }
  section.page-hero{ padding:128px 0 64px; }
  section.hero .hero-inner{ padding:120px 0 56px; }
  section.contact-sec{ padding:56px 0 72px; }

  /* --- Ueberschriften: zwei Zeilen sind die Grenze (Handy-Prinzip 2).
     Die Kurzfassungen allein reichten auf roi-rechner nicht — gemessen blieben
     H1 und CTA-H2 bei drei Zeilen. Zusaetzlich die Schriftgroesse am Telefon
     gedeckelt; der Desktop bleibt unberuehrt (eigene Media-Query). */
  section.page-hero h1, section.hero h1{ font-size:clamp(1.75rem,7.4vw,2.05rem); }
  body .sec h2, .cta-panel h2{ font-size:clamp(1.45rem,5.6vw,1.7rem); }

  /* --- Kontrast-Reserve im Hero: der Vorlauf ist am Telefon kuerzer (128 px
     statt 186), die Ueberschrift rutscht damit ueber den helleren Teil des
     Grats. Gemessen: die H1 auf roi-rechner kam bei 390 auf 2,35:1 gegen
     rgb(156,162,174) (Schwelle 3 fuer grosse Schrift). Der Verlauf bekommt
     hier mehr Deckung; die Flanke am Fuss bleibt bei 70 px, also ohne Kante. */
  section.page-hero, section.hero{
    background:linear-gradient(180deg,
      rgba(10,17,32,.88) 0%,
      rgba(8,13,24,.80) 55%,
      rgba(6,10,19,.72) calc(100% - 70px),
      rgba(5,8,15,0) 100%);
  }

  /* --- Sektionskoepfe zentriert (Handy-Prinzip 2) --- */
  .sec > .wrap > div[data-reveal] > .sec-label,
  .svc-copy > .sec-label{ justify-content:center; }
  body .sec h2, body .sec .sec-sub{ text-align:center; margin-left:auto; margin-right:auto; }
  .svc-copy{ text-align:center; }
  /* Stichpunkte bleiben linksbuendig: zentrierte Listen lesen sich schlecht. */
  .svc-copy .svc-list{ text-align:left; }
  .svc-copy .svc-list li{ justify-content:flex-start; }

  /* --- Knoepfe: volle Breite. Der Text DARF dabei zweizeilig werden statt aus
     der Pille zu ragen — dieselbe Loesung wie auf der Startseite (Prinzip 11:
     kein Knopftext ausserhalb seines Knopfes). Gemessen ragte
     "Kostenlose Automatisierungs-Analyse" sonst 79 px (390) bzw. 93 px (375)
     heraus, weil btn-arrow.css `white-space:nowrap` setzt. */
  .cta-panel .btn-arrow-fill,
  .roi-actions .btn-arrow-fill,
  .cta-panel .btn-ghost{ width:100%; justify-content:center; }
  .cta-panel .btn-ghost{ margin-left:0; margin-top:14px; }
  /* Typselektor davor ist Pflicht: css/btn-arrow.css wird NACH dieser Datei
     geladen und setzt `white-space:nowrap` mit derselben Spezifitaet — ohne
     `a.`/`button.` gewinnt sie, und der Text ragte weiter 79 bzw. 93 px aus
     der Pille (nachgemessen, nicht gerechnet). */
  a.btn-arrow-fill, button.btn-arrow-fill{ white-space:normal; line-height:1.3; padding-top:12px; padding-bottom:12px; }
  a.btn-arrow-fill .baf-text > span,
  button.btn-arrow-fill .baf-text > span{ white-space:normal; }
}

/* ============================================================
   13) Abnahme-Befunde vom 07.09.2026
   ============================================================ */

/* HOCH-1: die beiden ROI-Ergebniszahlen tragen jetzt sichtbar "Richtwert"
   (js/page-roi.js). Die Marke soll die Zahl begleiten, nicht mit ihr
   konkurrieren — Mono, klein, in --ice wie die Haken der Startseite. */
.roi-band .num-mark{
  display:inline-block; margin-right:8px;
  font-family:var(--font-m); font-size:.66rem; letter-spacing:.12em; text-transform:uppercase;
  color:var(--ice);
}

/* HOCH-2: der Glanz-Schein von .btn-primary (::before, geblurrte Farbkopie)
   hellt die Knopfflaeche unter dem weissen Text auf — gemessen bis
   rgb(74,124,227) = 3,97:1 statt 4,5:1. Auf diesen Seiten tragen Navigation,
   Mobilmenue und alle Primaeraufrufe seit heute den Arrow-Fill-Knopf; uebrig
   bleibt nur der <noscript>-Ersatzknopf auf kontakt.html. Fuer den wird der
   Schein gedeckelt: der Puls kostet dort nichts, der Kontrast schon.
   --blue-2 (#3B62D9) allein liefert 4,89:1. */
.btn-primary::before{ animation:none !important; opacity:.18 !important; }

/* MITTEL-3: Zielgroessen am Handy. Gemessen waren Regler 26 px und
   Footer-Links 28 px. Der Regler-Knopf darf optisch schlank bleiben, die
   antippbare Flaeche nicht. */
@media (max-width:639px){
  .roi-sliders input[type="range"]{ min-height:48px; }
  /* Pruefung 07.09. (Befund 4): die editierbaren Zahlenfelder neben den Reglern
     lagen bei 48x26 px. Hoehe hoch, Text bleibt unten-buendig zur Beschriftung. */
  /* .roi-sliders davor: die Inline-Regel .slider-num{min-height:26px} in
     roi-rechner.html laedt NACH dieser Datei und gewann bei gleicher
     Spezifitaet (nachgemessen: blieb 26 px). */
  .roi-sliders .slider-num{ min-height:48px; }
  footer .footer-link{ min-height:48px; padding-top:11px; padding-bottom:11px; }
  footer .foot-cols ul{ gap:4px; }
}

/* Nachtrag zu MITTEL-3: der Navigations-CTA (btn-sm) und die Wortmarke lagen
   bei 44 bzw. 39 px. Inline-Links mitten in einem Satz bleiben bewusst klein —
   WCAG 2.5.8 nimmt sie ausdruecklich aus, und ein 48-px-Kasten mitten im
   Fliesstext waere schlechter, nicht besser. */
@media (max-width:639px){
  header .btn-arrow-fill.btn-sm{ min-height:48px; }
  header .logo-grad, footer .logo-grad{ display:inline-block; padding:5px 0; min-height:48px; }
  .skip-link{ min-height:48px; padding-top:14px; padding-bottom:14px; }
}

/* Nachmessung 07.09.2026 — Zielgroessen, die beim ersten Durchgang durchgerutscht
   sind: `footer .footer-link{min-height:48px}` greift nur IM Footer. Dieselbe Klasse
   steht aber auch im Inhalt, jeweils allein in einem <li> und damit ein echtes
   Tippziel: 404.html (Weiterfuehrende Links, gemessen 161x30 und 265x30) und
   kontakt.html (Direktkontakt: Mailadresse 192x32, LinkedIn 173x32).
   Nur `li > .footer-link` — Links MITTEN im Satz bleiben bewusst klein
   (WCAG 2.5.8 nimmt Inline-Links ausdruecklich aus). */
@media (max-width:639px){
  main li > .footer-link{ display:inline-block; min-height:48px; padding-top:14px; padding-bottom:14px; }
}
