/* ============================================================
   marcy v2 - Ergänzungen zum One-Pager
   Wird NACH marcy.css geladen und ergänzt nur. Nichts aus dem
   Bestand ist überschrieben, damit die alten Seiten weiterlaufen.

   Grundlage: 01 Inhalte/_struktur-analyse.md und _design-audit.md
   ============================================================ */

/* ------------------------------------------------------------
   1 · Bento mit Hierarchie - „Meine Leistungen"

   Sechs gleiche Kacheln sagen: nichts ist wichtiger als der Rest.
   Die erste bekommt die doppelte Fläche, weil „Texte kommen von
   mir" der Kern der Positionierung ist. Prinzip aus 21st.dev
   übernommen, Farbwelt nicht - dort leuchtet alles.
   ------------------------------------------------------------ */
.bento {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 24px;
}
.bento > .karte { display: flex; flex-direction: column; }
/* Am 11.8. aufgegeben: die erste Kachel spannte 2 x 2 Felder. Marcels Ansage -
   die Sektion nahm zu viel Platz. Jetzt sechs gleiche Kacheln in zwei Reihen.
   Der Preis: die Hierarchie ist weg, „Inhalt & Texte" wiegt nicht mehr
   sichtbar schwerer als der Rest. Gemessen 1.479 -> darunter, siehe README. */
.bento > .karte.is-gross { grid-column: auto; grid-row: auto; }
.bento > .karte.is-gross .icon-gross { width: 72px; height: 72px; }

/* ------------------------------------------------------------
   Vitrinen in den Bento-Kacheln

   Die grosse Kachel stand mit `space-between` da: Icon oben, Text
   unten, dazwischen 380 px Leere. Statt sie mit einem generierten
   Bild zu fuellen (imagery.noGeneratedImagery - keine KI-Bilder,
   wo ein Bild etwas belegt) traegt sie jetzt eine gezeichnete
   Vitrine in derselben Linie wie die Icons: 1,5 px, eckige Enden,
   genau eine Neonflaeche.

   Die Vitrine ist dekorativ und traegt aria-hidden - die Aussage
   steht im Text darunter, nicht in der Zeichnung.
   ------------------------------------------------------------ */
/* Feste Hoehe statt flex-grow. Vorher wuchs die Vitrine der grossen Kachel
   auf 540 px und trieb die Sektion auf 1.479 px - die Zeichnung braucht
   diese Flaeche nicht, sie skaliert mit. Das inline-SVG hat viewBox und
   damit preserveAspectRatio: bei width und height je 100 % passt es sich
   ein und bleibt zentriert, ohne zu verzerren. */
.bento-vitrine {
  flex: 0 0 auto;
  height: 104px;
  display: flex; align-items: center; justify-content: center;
  margin: 0 0 20px;
  background: var(--greige);
  border-radius: var(--r-karte-klein);
  overflow: hidden;
  padding: 14px;
}
/* In den kleinen Kacheln faellt der greige Kasten weg. Er kostete Polsterung,
   und die Zeichnung schwamm darin im Letterbox: 306 x 104 Kasten fuer ein
   Bild im Verhaeltnis 300 x 164 heisst rund 139 x 76 gemalt und links und
   rechts Grau. Ohne Kasten steht die Zeichnung linksbuendig wie ein grosses
   Icon - der greige Kasten bleibt der grossen Kachel, wo das Bild traegt. */
/* 88 px waren zu klein fuer diese Zeichnungen. Bei 161 x 88 liegt der Massstab
   auf 0,537 - und weil vector-effect die Kontur bei 1,5 px festhaelt, wirkt sie
   wie 2,8 Zeichnungseinheiten. Die Linien werden schwer, die Browserpunkte
   winzig, das Ganze gedraengt: es liest sich wie abgeschnitten, obwohl
   nachgemessen keine Kante fehlt. 130 px bringen den Massstab auf 0,79 und
   damit die Linien wieder ins Verhaeltnis. Kostet 2 x 42 px Sektionshoehe. */
.bento .bento-vitrine {
  height: 130px;
  background: none; padding: 0; margin-bottom: 18px;
  justify-content: flex-start;
}
.bento .bento-vitrine svg { width: auto; }
/* Die grosse Kachel spannt zwei Rasterzeilen - ihre Hoehe bestimmen also die
   kleinen Kacheln daneben, nicht sie selbst. Ein Deckel haette hier nur
   Leerraum unter dem Text erzeugt (gemessen: 225 px). Deshalb waechst diese
   eine Vitrine mit, statt zu deckeln. Kompakter wird die Sektion ueber die
   KLEINEN Kacheln. */

.bento-vitrine svg { width: 100%; height: 100%; }
.bento-vitrine [stroke] { vector-effect: non-scaling-stroke; }

/* Enger als die uebrigen Karten (30 px): sechs Kacheln mal 60 px Polsterung
   sind allein 360 px Sektionshoehe. */
.bento > .karte { padding: 24px; }

@media screen and (max-width: 767px) {
  .bento-vitrine { height: 96px; padding: 12px; }
  .bento .bento-vitrine { height: 112px; }
}

@media screen and (max-width: 991px) {
  .bento { grid-template-columns: repeat(2, 1fr); }
}
@media screen and (max-width: 767px) {
  .bento { grid-template-columns: 1fr; }
}

/* ------------------------------------------------------------
   2 · Vorher/Nachher - entfallen

   Der Schieber war am 11.8. kurz der Aufmacher der Referenzen und
   ist am selben Tag auf Marcels Ansage ganz aus v2 heraus. Die
   Klasse `.beweis-linie` trug nur seinen Abstand nach unten und
   ist damit ebenfalls weg. Das Bauteil `.vergleich` steht
   unveraendert in marcy.css, wird aber seit dem Umzug von v2 auf
   `index.html` (11.8.) auf KEINER Seite mehr benutzt - die alten
   Seiten `leistungen.html` und `portfolio.html` sind entfallen.
   Es ist damit toter Bestand; ob es bleibt, entscheidet Marcel.
   ------------------------------------------------------------ */

/* ------------------------------------------------------------
   3 · Pakete - auf Greige, OHNE Einzelpreise

   Marcels Ansage: nur „ab 1.900 €" im Vorlauf, keine
   Paketpreise, keine Zahlungsmodalitäten und kein § 19 -
   das gehört ins Angebot, nicht auf die Seite.
   ------------------------------------------------------------ */
/* stretch statt start: alle drei Karten laufen auf gleiche Hoehe,
   auch wenn die Listen unterschiedlich lang sind. */
.pakete { display: grid; grid-template-columns: repeat(3, 1fr); gap: 24px; align-items: stretch; }
.paket {
  background: var(--weiss);
  border: 1px solid var(--rahmen);
  border-radius: var(--r-karte);
  padding: 30px;
  display: flex; flex-direction: column;
  /* Gleiche Hebung wie die Leistungskarten (.karte.is-hebt):
     200 ms, 8 px, kein Schatten - layout.motion.cardHover. */
  transition: transform 200ms ease-out, border-color 200ms ease-out;
}
.paket:hover, .paket:focus-within { transform: translateY(-8px); }
/* Keine schwarze Kante mehr am mittleren Paket (Marcels Ansage 11.8.).
   Alle drei Karten tragen dieselbe Haarlinie; die Hervorhebung macht
   allein die neone Badge. */
.paket-name {
  font-size: 11px; font-weight: 600; letter-spacing: 0.06em;
  text-transform: uppercase; color: var(--grau);
}

/* Alle drei Karten auf EINE Grundlinie (Marcels Ansage 11.8.).
   Vorher lagen Label, Titel, Trennlinie und Liste in jeder Karte auf einer
   anderen Höhe - aus zwei Gründen, die sich addierten:

   1. Nur die Standard-Karte trägt die Badge „Beliebt". Ihre Kopfzeile ist
      dadurch 28 px hoch, die nackten Labels daneben nur 17 - der Titel
      startete 11 px tiefer.
   2. Nur die Basis-Karte hat einen zweizeiligen Titel („One-Pager /
      bis 4 Seiten"). Alles darunter rutschte eine Zeile nach unten.

   Beide Köpfe laufen jetzt auf die Höhe der Badge, der Titel reserviert
   immer zwei Zeilen. Damit sitzen Trennlinie und Liste in allen drei
   Karten auf derselben Höhe - unabhängig davon, wie lang der Text ist. */
.paket > .paket-name,
.paket > .zwischen {
  min-height: 28px;
  display: flex; align-items: center; justify-content: space-between;
}
.paket-umfang {
  font-size: 24px; font-weight: 600; line-height: 1.3;
  letter-spacing: -0.01em; margin-top: 10px;
  /* 2 Zeilen à 1,3 - der Platz steht auch dann, wenn der Titel einzeilig ist. */
  min-height: 2.6em;
}
.paket-zeile {
  display: flex; justify-content: space-between; column-gap: 16px;
  font-size: 14px; padding: 11px 0;
  border-top: 1px solid var(--rahmen);
  color: var(--grau);
}
.paket-zeile b { color: var(--ink); font-weight: 500; text-align: right; }
/* Traegt die Haarlinie, seit die Zeile „Abstimmungsrunden" entfallen ist. */
.paket-liste { margin-top: 20px; padding-top: 20px; border-top: 1px solid var(--rahmen); }
.paket-liste li { font-size: 14px; line-height: 1.65; color: var(--grau); }
.paket-liste li::before { content: "-"; margin-right: 8px; color: var(--chrome); }

@media screen and (max-width: 991px) {
  .pakete { grid-template-columns: 1fr; }
}

/* ------------------------------------------------------------
   4 · Korrekturen aus dem Design-Audit
   ------------------------------------------------------------ */
/* `link-unter` lief in 16 und 14 px. Eine Groesse. */
.link-unter { font-size: 16px; }

/* Der Abstandsausreisser 104 px ist hier nicht uebernommen -
   alle Sektionen laufen auf 96/96, Hero auf 72/96. */

@media (prefers-reduced-motion: reduce) {
  .paket:hover, .paket:focus-within { transform: none; }
}

/* ------------------------------------------------------------
   6 · Kein Pin mehr

   Die Bühne (240vh, sticky) ist am 11.8. wieder entfallen: 2.160 px
   greige waren ein Viertel der Seitenhöhe und rissen die Grenze aus
   layout.sectionRhythm (Greige ≤ 20 % der sichtbaren Fläche).

   Der Effekt läuft jetzt in dem Fenster, in dem die Liste ohnehin
   sichtbar ist - kein zusätzlicher Platz, kein zusätzliches Grau.
   Gerechnet wird in marcy-v2.js.
   ------------------------------------------------------------ */

/* ------------------------------------------------------------
   7 · Hero - Person, zwei Einstiege, Kennzahlen

   Aus dem Vergleich mit soenkesproll.de und maxwbr.de (11.8.):
   beide zeigen das Gesicht im ersten Bildschirm, beide stellen
   Vertrauenssignale über die Falz, maxwbr bietet zwei Einstiege.
   ------------------------------------------------------------ */

/* Portrait rechts, Text links. Am 7.8. war das schon einmal so und wurde
   zurückgebaut, weil der Bogen weichen musste - am 11.8. auf Marcels Ansage
   wieder da. Der Bogen ist in dieser Sektion entfallen, auf den übrigen
   Seiten bleibt er.

   Die Bildspalte ist fest, die Textspalte flexibel: so bleibt das Portrait
   in jeder Fensterbreite gleich gross und der Text bricht um. */
.hero-raster {
  display: grid;
  /* minmax(0, 1fr) statt 1fr: sonst bläht das Logo-Laufband die Spalte auf.
     Gemessen bei 375 px waren es 2.796 px Spaltenbreite - sichtbar war das
     nicht, weil .laufband abschneidet, aber jede Breitenrechnung im Raster
     lief damit auf einer falschen Zahl. */
  /* 340 statt 380, Abstand 56 statt 64 (11.8., zweite Runde). Das Portrait
     stand mit 380 px als groesste Flaeche im ersten Bildschirm und drueckte
     die H1 daneben klein - nicht in Pixeln, sondern im Verhaeltnis. Die
     40 px, die es abgibt, gehen an die Textspalte und tragen dort die
     72-px-Zeile. */
  grid-template-columns: minmax(0, 1fr) 340px;
  column-gap: 56px;
  align-items: center;
}
.hero-text { min-width: 0; }

/* Grössere H1 NUR im Hero dieser Seite. Gemessen am 11.8.: V1 und V2 tragen
   dieselben 56 px, aber die Textspalte ist von 1.200 auf 756 px geschrumpft,
   weil rechts das Portrait steht. Dieselbe Schriftgrösse in einer 37 % engeren
   Spalte liest sich kleiner - die Zeile füllt nicht mehr.

   64 px reichten Marcel nicht - zweite Runde am 11.8.: 72 px, dazu ein
   engeres Portrait (340 statt 380). Beides zusammen, weil die Groesse hier
   ein VERHAELTNIS ist: die H1 stand schon bei 64 px absolut groesser als in
   V1 (56 px), wirkte neben der 380-px-Scheibe aber kleiner.

   Die Typo-Skala bleibt unangetastet: `t-h1` laeuft ueberall sonst auf 56.
   Der Lead waechst mit auf 20, sonst kippt das Verhaeltnis im Block.

   Obergrenze: die Textspalte misst bei 1.440 px jetzt 804 px, „Ohne deinen
   Aufwand." braucht 11 em - bei 72 px sind das 792 px. Mehr geht in dieser
   Aufteilung nicht, ohne dass eine dritte Zeile entsteht. */
.hero-raster .t-h1 {
  /* Die Formel IST die Rechnung aus dem Kommentar: Textspalte geteilt durch
     11 em. Spalte = Fensterbreite minus 240 Rand, 340 Bild, 56 Abstand.
     Bei 1.440 px greift die Obergrenze 72, darunter faedelt sich die Groesse
     selbst ein - sonst braeche die Zeile bei 1.201 px auf drei Zeilen. */
  font-size: clamp(50px, calc((100vw - 636px) / 11), 72px);
}
.hero-raster .hero-lead { font-size: 20px; }

/* Zwischen 992 und 1.200 px gilt noch der grosse Rand (120 px je Seite), das
   Bild ist aber weiter fest. Gemessen am 11.8. blieben dem Text bei 992 px
   ganze 248 px - die H1 lief auf FÜNF Zeilen. Feste Stufen fangen das nicht:
   die Spalte schrumpft in diesem Bereich um 52 %, eine Stufe deckt das nicht ab.

   Darum hier beides mitlaufend - Bildspalte als Anteil, H1 als clamp. Die
   Rechnung dahinter: „Ohne deinen Aufwand." ist die längste Zeile und misst
   in Inter 600 rund 11 em. Die H1 darf also höchstens Spaltenbreite / 11 gross
   sein. Bei 992 px sind das 43 px, bei 1.200 px sind es 56 px - genau der
   Korridor, den das clamp abfährt. */
@media screen and (min-width: 992px) and (max-width: 1200px) {
  .hero-raster { grid-template-columns: minmax(0, 1fr) 30%; column-gap: 48px; }
  .hero-bild { width: 100%; max-width: 340px; }
  .hero-raster .t-h1 { font-size: clamp(42px, 4.3vw, 56px); }
}
@media screen and (max-width: 991px) {
  /* Ab hier faellt der Rand auf 40 px, die Spalte wird schlagartig breiter.
     Zwei Zeilen bleiben bis hinunter zu rund 800 px moeglich. */
  .hero-raster .t-h1 { font-size: clamp(32px, 4.3vw, 42px); }
  .hero-raster .hero-lead { font-size: 18px; }
}
@media screen and (max-width: 767px) {
  /* Zweizeilig, immer - siehe die gerechnete Fassung weiter unten in
     dieser Datei (derselbe Breakpoint, spaetere Regel gewinnt). */
  .hero-raster .t-h1 { font-size: clamp(28px, 9vw, 42px); }
}
/* Rund statt Rechteck, 380 statt 440. Die Quelle ist 1024 x 1024, der Kreis
   schneidet also nichts weg. Damit tragen alle drei Portraits dieser Seite
   dieselbe Form: 34 px in der Nav-Pille, 88 px im Abschluss, 380 px hier.
   Weisses Shirt auf schwarzem Grund. Ich hatte kurz die durchgehend schwarze
   Fassung drin, damit die Flaeche im Kreis nicht bricht - auf Marcels Ansage
   zurueck: das weisse Shirt fuellt den unteren Bogen und traegt das Gesicht,
   statt es in einer schwarzen Scheibe zu isolieren. */
/* 50 % statt var(--r-pille): der Pillenradius ist ein FESTER Wert (100 px).
   Bei den kleinen Portraits (34 px Nav, 88 px Abschluss) liegt er ueber der
   halben Kantenlaenge und ergibt zufaellig einen Kreis - bei 380 px waeren es
   abgerundete Ecken. Ein Kreis braucht einen relativen Radius. */
.hero-bild {
  width: 340px; aspect-ratio: 1;
  border-radius: 50%; overflow: hidden;
  /* Reines Schwarz, nicht Ink: die Quelle ist am 11.8. auf #000 neu gerechnet
     (vorher #1A1A1A). Bei #1A1A1A staende an der Kreiskante eine Aufhellung
     gegen das Bild. Ausnahme von der Palette und nur hier - #000 ist keine
     Flaechen- oder Schriftfarbe der Marke, sondern der Grund eines Fotos. */
  background: #000;
}
.hero-bild img { width: 100%; height: 100%; object-fit: cover; display: block; }

/* Das Laufband läuft unter BEIDEN Spalten durch. */
.hero-raster .logo-zeile { grid-column: 1 / -1; }

@media screen and (max-width: 991px) {
  .hero-raster { grid-template-columns: minmax(0, 1fr) 280px; column-gap: 40px; }
  .hero-bild { width: 280px; }
}
@media screen and (max-width: 767px) {
  /* Einspaltig. Bis zum 11.8. stand das Bild UNTER dem Text - auf Marcels
     Ansage jetzt darüber und deutlich kleiner (160 statt 280 px).

     280 px waren drei Viertel der Fensterbreite: das Portrait beanspruchte
     mehr Fläche als die Aussage darüber und schob die Logo-Zeile aus dem
     ersten Bildschirm. 160 px lesen sich als Absender, nicht als Motiv.

     `order` dreht nur die ANZEIGE - im Quelltext steht der Text weiter
     zuerst, Vorlesesoftware und Tastatur bekommen also unverändert die
     Aussage vor dem Bild. */
  /* Dritte Runde am 11.8. (Marcels Ansage): das Portrait steht NEBEN dem
     Knopf, nicht mehr ueber der Headline. Damit beginnt die Seite mit der
     Aussage, und das Gesicht sitzt dort, wo es hingehoert - direkt am
     „Erstgespraech buchen", wie schon in der Nav-Pille.

     `display: contents` auf `.hero-text` loest den Zwischenbehaelter auf:
     H1, Lead, Knopf und Kennzahlen werden dadurch selbst zu Feldern DIESES
     Rasters. Ohne das liesse sich das Bild nicht neben den Knopf setzen -
     die beiden haben verschiedene Eltern. */
  .hero-raster {
    grid-template-columns: minmax(0, 1fr) auto;
    row-gap: 20px; column-gap: 20px;
    align-items: center;
  }
  .hero-text { display: contents; }

  /* Zeilen EXPLIZIT vergeben. Ohne das verteilt das Auto-Placement die
     Felder in DOM-Reihenfolge, und weil `.hero-bild` im Quelltext hinter
     den Kennzahlen steht, landete es darunter statt neben dem Knopf
     (11.8. im Bild gesehen). */
  .hero-raster .t-h1        { grid-column: 1 / -1; grid-row: 1; }
  .hero-raster .hero-lead   { grid-column: 1 / -1; grid-row: 2; }
  /* `align-self: center` an BEIDEN: `align-items` auf dem Raster allein
     reichte nicht, weil der Knopf aus marcy.css einen eigenen Aussenabstand
     nach oben traegt - gemessen lagen die Mittelpunkte 19 px auseinander. */
  .hero-raster .hero-cta    { grid-column: 1;      grid-row: 3;
                              justify-self: start; align-self: center; margin-top: 0; }
  /* 88 px: dieselbe Groesse wie das Portrait im alten Abschlussblock, knapp
     doppelte Knopfhoehe. Groesser zoege den Blick vom Knopf ab. */
  .hero-bild                { grid-column: 2;      grid-row: 3;
                              width: 88px; max-width: none;
                              justify-self: end; align-self: center; }
  .hero-raster .hero-zahlen { grid-column: 1 / -1; grid-row: 4; }
  .hero-raster .logo-zeile  { grid-column: 1 / -1; grid-row: 5; }

  /* Der Knopf brach zweizeilig um, sobald das Bild ihm die halbe Spalte
     nimmt. Er soll seine natuerliche Breite behalten. */
  .hero-raster .hero-cta { white-space: nowrap; }
}

/* Kennzahlen als ZEILE, nicht als 44-px-Ziffernblock. Auf /ueber-mich
   sind sie eine eigene Sektion; hier sind sie ein Beleg im Vorbeigehen,
   direkt vor den Kundenlogos. Reihenfolge im Hero: Versprechen →
   Handlung → Beleg in Zahlen → Beleg in Logos. */
.hero-zahlen {
  display: flex; flex-wrap: wrap;
  column-gap: 32px; row-gap: 10px;
  margin-top: 40px;
  font-size: 15px; color: var(--grau);
}
.hero-zahlen span { display: inline-flex; align-items: baseline; column-gap: 7px; }
.hero-zahlen strong {
  font-size: 17px; font-weight: 600; color: var(--ink);
  font-variant-numeric: tabular-nums;
}
/* Trenner zwischen den Angaben - Haarlinie statt Aufzählungspunkt,
   passend zu den Trennern in den Fallkarten. */
.hero-zahlen span + span { position: relative; }
.hero-zahlen span + span::before {
  content: ""; position: absolute; left: -16px; top: 2px; bottom: 2px;
  width: 1px; background: var(--rahmen);
}

/* Der Abstand zum Laufband schrumpft, weil jetzt die Zahlenzeile davor
   steht - sonst stünden 88 + 40 px Luft zwischen zwei Belegen. */
.hero .logo-zeile { margin-top: 48px; }

@media screen and (max-width: 767px) {
  .hero-zahlen { column-gap: 24px; }
  .hero-zahlen span + span::before { left: -12px; }
}

/* ------------------------------------------------------------
   8 · Screenscroll im Hover - Tempo von soenkesproll.de

   Gemessen am 11.8. aus der IX2-Definition der Referenz, nicht
   geschaetzt (`Webflow.require('ix2')`, Aktionslisten a-66
   „showcase-show" und a-67 „showcase-show-stop"):

   | | Referenz | v1 (marcy.css) | v2 hier |
   |---|---|---|---|
   | Weg      | −23 rem | −1.200 px | −1.200 px |
   | Dauer    | 1.000 ms | 20.000 ms | 3.870 ms |
   | Tempo    | **310 px/s** | 60 px/s | **310 px/s** |
   | Vorlauf  | 100 ms | keiner | 100 ms |
   | Zurueck  | 300 ms ease | 600 ms ease-out | 300 ms ease |

   Das Tempo der Referenz ist NICHT fest: ihr Weg steht in `rem` und
   ihre Wurzelgroesse laeuft mit der Fensterbreite (gemessen: 12,01 px
   bei 1.280 px Fenster, 13,49 px bei 1.440 px). Also 276 px/s dort und
   310 px/s hier. Uebernommen ist der Wert bei **1.440 px**, weil marcy
   alles auf dieser Breite bemisst (siehe die Flaechenanteile in
   01 Inhalte/ueber-mich.md). Unser Weg steht in px und ist damit auf
   jeder Breite gleich schnell - bewusst, denn unsere Rahmenhoehe ist
   auch fest.

   Uebernommen ist das TEMPO, nicht der Weg: die Referenz faehrt
   23 von 25,3 rem Rahmenhoehe, also knapp eine Rahmenhoehe. Ihre
   Aufnahmen sind 2- bis 4-mal so hoch wie der Rahmen. Unsere
   Screenscrolls sind das 14-fache (NICCOS: 3.360 px angezeigt auf
   240 px Rahmen, nativ 1200 x 6931) - eine Rahmenhoehe waeren 218 px
   und damit 6 % der Aufnahme, praktisch kein Bild. Der Weg bleibt
   deshalb bei 1.200 px, aus 20 s werden bei gleichem Tempo 3,87 s.

   Linear, nicht ease: ueber 3,87 s wuerde `ease` in der Mitte
   deutlich ueber 310 px/s hinausschiessen. Die Referenz kommt bei
   1 s Dauer mit ease auf dasselbe Gefuehl.

   Der Vorlauf von 100 ms ist der eigentliche Gewinn: wer mit dem
   Zeiger nur ueber die Karte streift, loest nichts aus.
   ------------------------------------------------------------ */
.browser-bild img { transition: transform 300ms ease; }
.fall:hover .browser-bild img,
.fall:focus-within .browser-bild img {
  transform: translateY(-1200px);
  transition: transform 3870ms linear 100ms;
}
@media screen and (max-width: 767px) {
  /* Rahmen ist hier 200 px, Weg 700 px - dasselbe Tempo: 700 / 2,26 s. */
  .fall:hover .browser-bild img,
  .fall:focus-within .browser-bild img {
    transform: translateY(-700px);
    transition: transform 2260ms linear 100ms;
  }
}
/* Muss NACH den Regeln oben stehen: die Sperre in marcy.css kommt aus einer
   frueheren Datei und hat dieselbe Spezifitaet - ohne diese Wiederholung
   liefe der Schwenk trotz „Bewegung reduzieren" wieder an. */
@media (prefers-reduced-motion: reduce) {
  .fall:hover .browser-bild img,
  .fall:focus-within .browser-bild img { transform: none; transition: none; }
}

/* ============================================================
   Abschluss linksbuendig - nur v2
   marcy.css setzt .abschluss auf `align-items: center` und
   `text-align: center`. Das gilt fuer den Bestand weiter; hier
   wird es nur fuer den One-Pager zurueckgenommen. Deshalb steht
   die Regel in dieser Datei und nicht drueben: gleiche
   Spezifitaet, spaeter geladen, gewinnt.

   Die Breitengrenzen bleiben (h2 900, Vorlauftext 640) - sie
   halten die Zeilenlaenge, unabhaengig von der Ausrichtung.
   ============================================================ */
.abschluss {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  column-gap: 64px;
  align-items: start;
  text-align: left;
}
/* Explizite Platzierung statt Auto-Fluss: im Markup steht das Foto VOR der
   Namenszeile (so braucht die zentrierte v1-Fassung keine Sonderregel).
   Ohne feste Zuweisung landete es damit in Zeile 1 Spalte 1 und schoebe
   den Text nach unten. */
.abschluss-foto    { grid-column: 2; grid-row: 1 / span 3; align-self: center;
                     width: 168px; height: 168px; }
.abschluss h2      { grid-column: 1; grid-row: 1; margin-top: 0; max-width: none; }
.abschluss .t-lead { grid-column: 1; grid-row: 2; margin-top: 18px; max-width: 620px; }
.abschluss-knoepfe { grid-column: 1; grid-row: 3; justify-content: flex-start;
                     margin-top: 30px; }

/* Unter 860 px ist neben der Ueberschrift kein Platz mehr fuer 168 px Bild:
   einspaltig, Foto zurueck nach oben und auf 96 px. */
@media screen and (max-width: 859px) {
  .abschluss { grid-template-columns: 1fr; row-gap: 0; }
  .abschluss-foto    { grid-column: 1; grid-row: 1; width: 96px; height: 96px; }
  .abschluss h2      { grid-row: 2; margin-top: 22px; }
  .abschluss .t-lead { grid-row: 3; }
  .abschluss-knoepfe { grid-row: 4; }
}

/* Der mausfolgende Neonschein (`.leuchten-punkt` aus marcy.css) laeuft in v2
   MIT - am 11.8. war er hier kurz abgeschaltet, das ist zurueckgenommen.

   Anlass der Abschaltung war die graue Namenszeile im Abschluss, die unter dem
   Schein stand; die Zeile selbst ist inzwischen geloescht. Der bekannte Wert
   bleibt trotzdem stehen: grauer Fliesstext #6B6B69 kommt auf voller Neonflaeche
   nur auf 4,42:1. Deshalb ist der Spitzenwert in marcy.css auf 0,45 Alpha
   gedeckelt und weich ausgeblendet - nicht aus Geschmack, sondern damit der
   Text darunter lesbar bleibt. Wer den Punkt kraeftiger stellt, reisst AA. */

/* ------------------------------------------------------------
   9 · Neon-Phase - der SEITENGRUND wechselt, nicht die Sektion

   Marcels Ansage (11.8.), Vorbild soenkesproll.de/#fallstudien:
   nach den vier Schritten faehrt der Grund auf Neon.

   DREI Fassungen, weil zwei falsch waren:
   1. Nur `#referenzen` faerben - harte Kante gegen die greige
      Ablauf-Sektion darueber. Ein Farbwechsel kann noch so weich
      fahren, wenn er an einer Sektionsgrenze endet, ist er ein
      Sprung.
   2. Ablauf UND Referenzen auf Greige - dann tragen beide
      denselben Grund, aber Greige stieg auf **47,9 %** der
      Seitenhoehe. `marcy-ci.json -> layout.sectionRhythm.greigeCap`
      deckelt 25 %. Referenzen ist mit 2.082 px die hoechste
      Sektion der Seite, greige sprengt den Deckel sofort.
   3. Gebaut: Ablauf UND Referenzen auf **Weiss**, `#preise` bleibt
      greige. Greige liegt damit bei **19,1 %** und unter dem
      Deckel. Nichts ist schwarz geworden.

   Neue Folge: weiss · greige · weiss · weiss · weiss · greige · weiss

   Warum das den Effekt sauber macht: `.sektion` ist in marcy.css
   schon `background: transparent`, damit das Leuchten durchscheint
   - den Grund traegt der `body`. Weisse Sektionen sind also
   Fenster auf den Body. Faehrt der Body auf Neon, faehrt der ganze
   sichtbare Grund mit, ueber Sektionsgrenzen hinweg. Es gibt keine
   Kante, weil es keine zweite Flaeche gibt.

   Preis dafuer: drei weisse Sektionen am Stueck (Leistungen,
   Ablauf, Referenzen), ohne sichtbare Grenze. Das ist gewollt -
   eine Linie mitten durch die Neonflaeche haette den Zweck des
   Umbaus wieder aufgehoben.

   Dauer 400 ms ease-out - layout.motion.reveal in marcy-ci.json,
   der Wert fuer „erscheint beim Scrollen".

   Vier Begleitregeln, gerechnet statt geschaetzt:
   – `--grau #6B6B69` erreicht auf Neon nur **4,40:1** und faellt
     unter AA (auf Weiss 5,34:1). Vorlauf- und Schritttexte gehen
     auf `--ink`: 14,34:1.
   – Haarlinien `--rahmen #DCDAD6` kommen auf Neon auf **1,15:1**,
     schwaecher als auf Weiss (1,40:1). Sie gehen auf `--chrome`:
     1,43:1 - dieselbe Sichtbarkeit wie auf Weiss. Derselbe Griff
     wie bei Greige (hairlineOnGreige). Betrifft die `.linie` im
     Ablauf; Sektionskanten tragen keine Linie mehr.
   – Die Schrittziffern tragen in der Phase `--neon-hover` #BEE800,
     also Ton in Ton wie im Vorbild, mit Ink-Ziffer darauf. Details
     bei der Regel selbst.
   – Ausserhalb der Phase bleibt es bei den Regeln aus marcy.css:
     erreicht neon, offen weiss mit Ring in `--chrome`. Die kurz
     eingebaute Greige-Fuellung ist wieder raus, Begruendung an
     der Stelle selbst.
   ------------------------------------------------------------ */
body { transition: background-color 400ms ease-out; }
/* 240 ms Vorlauf, nur beim Hereinfahren. Erst 120 ms (layout.motion.hover),
   auf Marcels Ansage verdoppelt auf den naechsten Wert, den das System fuehrt:
   marcy-ci.json -> layout.motion.accordion, 240 ms. Weiter oben gibt die
   Leiter nichts her - danach kaeme 400 ms, und das ist schon die Dauer des
   Farbwechsels selbst.

   Nur beim Hereinfahren, weil die Verzoegerung an DIESER Regel haengt: wird
   die Klasse gesetzt, gilt sie; wird sie entfernt, gilt wieder die Grundregel
   darueber mit Vorlauf null. Der Grund kommt also mit Anlauf und geht ohne
   Nachhang.

   Umgerechnet sind 240 ms bei ueblichem Scrolltempo (rund 1.000 px/s) etwa
   240 px Weg - fast so viel wie die 293 px Layoutluecke, die am 11.8. gerade
   beseitigt wurde. Der Unterschied: die Luecke war Leerraum im Bild, das hier
   ist Zeit. Wer langsam scrollt, sieht den Wechsel weiter direkt an Stufe IV;
   wer schnell scrollt, sieht ihn spaeter. Bei noch groesseren Werten kippt das
   in „reagiert nicht" - das ist die Grenze, nicht der Geschmack. */
body.is-neon-phase { background: var(--neon); transition-delay: 240ms; }

/* KEINE Haarlinie an den Grenzen. Am 11.8. kurz eingebaut, damit die drei
   weissen Sektionen am Stueck auseinander zu halten sind - auf Marcels Ansage
   wieder raus. Auf der Neonflaeche zog sie einen Strich quer durch eine
   Flaeche, die als eine gelesen werden soll, und genau das war der Zweck des
   ganzen Umbaus. Die Sektionen trennt jetzt nur noch ihr Abstand.

   Weil sie EINE Flaeche sind, addieren sich am Uebergang auch nicht zwei
   Polster: voller Abstand unten am Ablauf plus voller Abstand oben an den
   Referenzen waeren zwei Sektionsgrenzen zwischen Stufe IV und „Meine
   Referenzen". Beide gehen deshalb auf die HALBE Basis - zusammen also genau
   die eine Grenze, die dort hingehoert. Die Aussenkanten behalten sie voll.

   Als `calc` an `--sektion` gebunden und nicht mehr fest auf 48 px: Am 11.8.
   ist die Basis von 96 auf 72 px gekuerzt, und ein fester Wert waere dabei
   stehengeblieben. So zieht die Kopplung bei jeder weiteren Aenderung mit. */
#ablauf { padding-bottom: calc(var(--sektion) / 2); }
#referenzen { padding-top: calc(var(--sektion) / 2); }

/* HIER STAND EINE GREIGE-FUELLUNG FUER DIE ZIFFERN - am 11.8. wieder raus.
   Sie sollte die offenen Kreise auf dem neuen weissen Grund sichtbar halten,
   traf aber auch die ERREICHTEN: die tragen aus marcy.css einen neonen Ring,
   und mit greiger Fuellung darin sah das nach Fehler aus. Marcels Ansage:
   der Kreis ist neon.

   Es braucht keinen Ersatz. marcy.css regelt beide Zustaende schon richtig,
   auch auf Weiss:
   – erreicht: Neonfuellung, Neonring, Ziffer in Ink (14,34:1)
   – offen:    weisse Fuellung, Ring in `--chrome` (1,74:1 auf Weiss - dieselbe
               Groessenordnung wie die Haarlinien der Sektionen), Ziffer grau
   Der Ring traegt die Form, die Fuellung muss das nicht leisten. */

/* Kontrast in der Phase: alles, was direkt auf der Flaeche steht, auf Ink.
   Text in den weissen Fallkarten bleibt unberuehrt. */
body.is-neon-phase #ablauf .t-lead,
body.is-neon-phase #ablauf .ablauf-text p,
body.is-neon-phase #referenzen > .raster > .t-lead { color: var(--ink); }

body.is-neon-phase #ablauf .linie { background: var(--chrome); }

/* Ziffernkreise Ton in Ton, Marcels Ansage nach dem Vorbild: dort steht das
   „IV" in einem etwas anderen Blau als der Grund, nicht in einer Fremdfarbe.
   Hier also `--neon-hover` #BEE800 auf `--neon` #CEFA05 - der Schritt, den die
   CI fuer Neon ohnehin fuehrt, keine neue Farbe. Kein Rahmen: die Referenz
   setzt die Form auch nur ueber den Ton.

   Gemessen: `--neon-hover` auf Neon **1,17:1** (Referenz: ihr Blau auf Blau
   1,51:1 - sie ist also einen Hauch deutlicher). Die ZIFFER darauf ist Ink und
   kommt auf **12,21:1**; die Lesbarkeit haengt an ihr, nicht am Kreis.

   Alle vier Kreise gleich. Welcher Schritt dran ist, tragen weiter das
   Abblenden auf 45 % und die wachsende Fortschrittslinie in Ink. */
body.is-neon-phase #ablauf .ablauf-ziffer {
  background: var(--neon-hover);
  border-color: transparent;
  color: var(--ink);
}

/* marcy-ci.json layout.motion.reducedMotion: „setzt alle Dauern auf 0.01ms.
   Nicht optional." Die Farbe bleibt, nur das Aufblenden faellt weg. */
@media (prefers-reduced-motion: reduce) {
  body { transition-duration: 0.01ms; }
  /* Auch der Vorlauf faellt weg - sonst bleibt eine Wartezeit ohne Bewegung,
     also das Schlechteste aus beidem. */
  body.is-neon-phase { transition-delay: 0s; }
}

/* ============================================================
   § 12  Navigation - kein Umbruch im Link

   Vorgeschichte: V2 trug kurzzeitig fünf Menüpunkte statt vier
   in V1. Gemessen am 11.8. bei 1.100, 1.024 und 992 px stand
   „Über mich" dadurch zweizeilig (Linkhöhen 19 UND 38 px) und
   die Pille wurde ungleich hoch. Ich hatte den Abstand in diesem
   Bereich auf 18 px gedrückt.

   Am selben Tag ist „Preise" auf Marcels Ansage aus dem Kopf
   heraus - der Abschnitt bleibt, der Menüpunkt geht, der Fuss
   verlinkt ihn weiter. Damit stehen wieder vier Punkte da und
   der Abstand aus marcy.css (28 px) trägt von allein. Die
   Sonderregel ist entfallen; die Nav ist jetzt 1:1 wie in V1.

   `nowrap` bleibt als Sicherung stehen: es kostet nichts und
   fängt den Fall ab, dass später wieder ein Punkt dazukommt.
   ============================================================ */
.nav-link { white-space: nowrap; }

/* ============================================================
   § 13  Fuss MIT Abschluss

   Marcels Ansage am 11.8. nach dem Vorbild soenkesproll.de: der
   Abschlussblock gehört in den Fuss, nicht darüber.

   Vorher standen zwei Blöcke mit demselben Auftrag untereinander -
   eine weisse Sektion („Lass uns 20 Minuten sprechen") und
   direkt darunter der schwarze Fuss mit denselben Wegen. Die
   weisse Sektion trug 480 px Höhe für einen Knopf, den der Fuss
   ohnehin hätte tragen können.

   Jetzt ein Block: Ansprache links, Wege rechts, Abbinder unten.
   Das spart rund 400 px Seitenhöhe und stellt den Abschluss
   dorthin, wo beim Runterscrollen ohnehin Schluss ist.

   Das Portrait ist entfallen (Marcels Freigabe) - es stand als
   zweites Bild derselben Person auf der Seite und hätte den
   Block neben drei Spalten überladen.
   ============================================================ */
/* 72 statt 96 oben, und der Abbinder rueckt naeher (Marcels Ansage: „Fuss
   schmaler"). Der Block traegt jetzt eine einzeilige H2 statt einer
   dreizeiligen - die Hoehe faellt dadurch von rund 730 auf rund 520 px. */
.fuss-mit-cta { padding-top: 72px; padding-bottom: 56px; }

.fuss-cta {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  /* 56 statt 80: gemessen am 11.8. blieben der linken Spalte bei 1.440 px
     nur 583 px, Headline plus Knopf brauchen aber 601 - der Knopf brach
     unter die Headline, genau das, was hier weg sollte. Die 24 px kommen
     aus diesem Abstand. */
  column-gap: 56px;
  align-items: start;
}

/* Headline und Knopf NEBENEINANDER auf einer Grundlinie (Marcels Vorschlag
   11.8.: „CTA neben Headline und Logo dann drunter"). Das spart die Zeile,
   die der Knopf vorher unter der Headline belegte.

   Kein max-width mehr: die Zeile misst bei 1.440 px rund 600 px und braucht
   den Platz, den ihr das Raster ohnehin gibt. Wird es eng, bricht der Knopf
   ueber `flex-wrap` unter die Headline - derselbe Zustand wie vorher, nur
   eben erst dann. */
.fuss-cta-text {
  display: flex; align-items: center; flex-wrap: wrap;
  column-gap: 28px; row-gap: 22px;
}
.fuss-cta-text .t-h2 { margin: 0; }

/* Seit dem 11.8. traegt der Fuss NUR die Headline und EINEN Knopf - kein
   Lead, keine Linie, keine Inhaberzeile (Marcels Ansage). Weil die Zeile
   allein steht und kurz ist, darf sie gross sein: 44 px, gegen 40 im
   Fliesstext. Das ist die einzige Stelle, an der eine H2 die Skala nach
   oben verlaesst - sie hat hier auch nichts neben sich. */
.fuss-mit-cta .t-h2 { font-size: 44px; line-height: 1.15; letter-spacing: -0.02em; }

/* t-h2 und t-lead stehen sonst auf Weiss und tragen Ink. Hier nicht. */
.fuss-mit-cta .t-h2 { color: var(--weiss); }
.fuss-cta .abschluss-knoepfe {
  display: flex; flex-wrap: wrap; gap: 12px;
  /* 0: der Knopf steht neben der Headline, nicht darunter. */
  margin-top: 0;
}

/* 32 statt 56 zwischen den Spalten. Gemessen am 11.8.: die drei Spalten
   belegten 533 px, der linken Zeile blieben 611 - sie braucht 635. Weil
   `.raster` bei 1.200 px deckelt, half auch ein breiteres Fenster nicht;
   bei 1.600 px stand dieselbe Zahl. Die fehlenden Pixel kommen aus diesem
   Abstand, nicht aus der Schriftgroesse: die Headline soll gross bleiben. */
.fuss-spalten { display: grid; grid-template-columns: repeat(3, auto); column-gap: 32px; }

/* Abbinder: Marke links, Zeile rechts - beide auf einer Grundlinie. */
/* Der Abbinder ist am 11.8. ganz entfallen - erst die Haarlinie, dann die
   Inhaberzeile, zuletzt der ganze Block (Marcels Ansage: „Logo sieht so
   alleine aus und nimmt unnoetig Platz weg"). Die Marke steht jetzt klein
   am Ende der CTA-Spalte, der Claim gar nicht mehr: er ist woertlich die
   H1 der Seite und stand im Fuss ein zweites Mal.

   22 px hoch - dieselbe Groessenordnung wie in der Nav-Pille (30 px), aber
   eine Stufe leiser, weil die Marke hier nur noch abbindet. */
/* Marke und Slogan nebeneinander (Marcels Ansage 11.8.: „Logo vielleicht
   groesser? und daneben den Slogan"). Der Slogan war am selben Tag kurz
   ganz raus - allein unter dem Block wiederholte er nur die H1. NEBEN der
   Wortmarke liest er sich als das, was er ist: die Zeile zur Marke.

   Explizit Zeile 2, Spalte 1 - nicht dem Auto-Placement ueberlassen. Der
   Unterschied ist sichtbar: laesst man das Raster selbst verteilen, spannt
   Zeile 1 bis zur Unterkante der VIER Navigationseintraege und die Marke
   rutscht 140 px unter die Headline. */
.fuss-marke {
  grid-column: 1; grid-row: 2;
  margin-top: 44px;
  display: flex; align-items: center; flex-wrap: wrap;
  column-gap: 20px; row-gap: 8px;
}
/* 32 statt 22 px - zwei Stufen ueber der Nav-Pille (30 px) waere zu laut,
   darunter verschwaende sie. Die Wortmarke bleibt die Datei, nie Text
   (marcy-ci.json, harte Regel 5). */
/* `.fuss-marke .fuss-logo`, nicht `.fuss-logo`: marcy.css Zeile 847 setzt
   `.fuss-marke img { height: 26px }` - Klasse plus Element schlaegt eine
   Klasse allein. Gemessen kamen sonst 26 px statt der gesetzten 32 an. */
.fuss-marke .fuss-logo { display: block; height: 32px; width: auto; }
/* marcy.css setzt hier margin-top: 16px fuer den gestapelten Fall. */
.fuss-marke .fuss-claim { margin-top: 0; font-size: 15px; }
/* Die Spalten spannen beide Zeilen, sonst zoege Zeile 1 sie in die Hoehe. */
.fuss-spalten { grid-column: 2; grid-row: 1 / span 2; }


/* Einspaltig schon ab 1.100, nicht erst ab 992. Gemessen am 11.8.: bei 992 px
   blieben der Ansprache neben den drei Spalten nur noch rund 320 px - die H2
   lief auf drei Zeilen, der Lead auf sechs. Genau das, was hier weg sollte. */
/* Einspaltig unter 1.440 px - nicht erst unter 1.100.
   Gemessen am 11.8.: die Zeile „Headline + Knopf" braucht 635 px. Weil
   `.raster` bei 1.200 px deckelt und die drei Spalten 485 px halten, hat die
   linke Spalte NUR bei 1.440 px genug Platz (659 px). Darunter brach der
   Knopf unter die Headline, die linke Haelfte wurde bis zu 83 px hoeher als
   die rechte - genau die Unwucht, die weg sollte.

   Also: entweder beide Haelften stehen sauber nebeneinander, oder alles
   steht untereinander. Kein Zwischending. */
@media screen and (max-width: 1439px) {
  .fuss-cta { grid-template-columns: minmax(0, 1fr); row-gap: 48px; }
  /* Einspaltig faellt die feste Platzierung weg: alles steht untereinander,
     das Logo als letztes. Den Abstand traegt dann der row-gap des Rasters. */
  .fuss-spalten { grid-column: 1; grid-row: auto; justify-content: start; column-gap: 56px; }
  .fuss-marke { grid-column: 1; grid-row: auto; margin-top: 0; }
}
/* „Lass uns loslegen." stand auf dem Rechner auf t-h2 (40 px) und damit auf
   derselben Stufe wie die Sektionsueberschriften der Seite. Der Fuss schliesst
   ab, er eroeffnet nicht - deshalb eine Stufe leiser. Auf dem Telefon steht
   die Zeile aus demselben Grund auf 26 (Block weiter unten). */
.fuss-mit-cta .t-h2 { font-size: 34px; }

@media screen and (max-width: 767px) {
  .fuss-mit-cta { padding-top: 56px; padding-bottom: 48px; }
  /* 32 → 26. Die Zeile stand damit GROESSER als die Sektionstitel
     der Seite (28 px) und las sich auf dem Telefon wie die Headline
     der Seite statt wie ihr Abschluss (Marcels Rueckmeldung 11.8.).
     26 setzt sie eine Stufe darunter - sie schliesst ab, sie eroeffnet
     nicht. Auf dem Rechner bleibt die Groesse unveraendert. */
  .fuss-mit-cta .t-h2 { font-size: 26px; }
  /* marcy.css setzt den Claim im Fuss auf dem Telefon auf 14 px; hier
     stand er als `.fuss-marke .fuss-claim` mit hoeherer Spezifitaet
     auf 15 und hat das ueberstimmt. */
  .fuss-marke .fuss-claim { font-size: 14px; }
  .fuss-spalten { grid-template-columns: 1fr 1fr; column-gap: 24px; row-gap: 32px; }
  .fuss-cta .abschluss-knoepfe .btn { width: 100%; justify-content: center; }
}

/* ============================================================
   § 14  Burger-Menü (Marcels Ansage 11.8.)

   Vorher gab es unter 992 px ÜBERHAUPT KEINE Navigation:
   `marcy.css` setzt dort `.nav-links { display: none }` - ohne
   Ersatz. Auf dem Telefon standen nur Wortmarke und Knopf, die
   vier Menüpunkte waren schlicht nicht erreichbar.

   Das Blatt fährt von RECHTS ein. Der Erstgespräch-Knopf wandert
   mit hinein: in der Pille wird es auf 375 px sonst zu eng
   (Wortmarke + Knopf + Burger passen nicht nebeneinander).

   Genau EINE Neonfläche im offenen Menü: der Knopf am Fuss.
   ============================================================ */
.burger {
  display: none;
  width: 44px; height: 44px;            /* 44 px Mindestziel, WCAG 2.5.8 */
  padding: 0; border: 0; background: none; cursor: pointer;
  align-items: center; justify-content: center;
  border-radius: 50%;
}
/* Drei Striche, der mittlere kuerzer (Marcels Vorlage 11.8.). Die
   ungleiche Laenge macht das Zeichen unverwechselbar - mit drei gleichen
   Strichen sieht es aus wie jedes andere Menue. */
.burger span {
  display: block;
  width: 20px; height: 1.5px; background: var(--ink);
  transition: transform 220ms ease, opacity 160ms ease, width 220ms ease;
}
.burger span + span { margin-top: 4.5px; }
.burger span:nth-child(2) { width: 14px; }
/* Der Burger sitzt rechts in der Pille - also waechst der kurze Strich
   nach LINKS, buendig mit den anderen. Ohne das haengt er in der Luft. */
.burger { flex-direction: column; align-items: flex-start; }

/* Offen: der mittlere blendet aus, die aeusseren kreuzen sich.
   6 px ist der Weg zur Mitte: Strichhoehe 1,5 plus Abstand 4,5. */
.burger[aria-expanded="true"] span:first-child { transform: translateY(6px) rotate(45deg); }
.burger[aria-expanded="true"] span:nth-child(2) { opacity: 0; width: 20px; }
.burger[aria-expanded="true"] span:last-child  { transform: translateY(-6px) rotate(-45deg); }

/* Der Grund liegt UNTER dem Blatt und schliesst bei Klick.

   z-index 110/111 statt 90/91: `.nav-halter` liegt in marcy.css auf 100.
   Bei 90/91 schwebte die Pille MIT Wortmarke und Burger ueber dem offenen
   Blatt - am 11.8. im Bild gesehen. Beide muessen darueber. */
.menue-grund {
  position: fixed; inset: 0; z-index: 110;
  background: rgba(26, 26, 26, 0.45);
  opacity: 0; transition: opacity 260ms ease;
}
.menue-grund.is-auf { opacity: 1; }

.menue {
  position: fixed; top: 0; right: 0; bottom: 0; z-index: 111;
  width: min(86vw, 380px);
  background: var(--weiss);
  box-shadow: -8px 0 40px rgba(26, 26, 26, 0.14);
  padding: 24px var(--rand-klein, 28px) 32px;
  display: flex; flex-direction: column;
  transform: translateX(100%);
  transition: transform 300ms cubic-bezier(.22,.61,.36,1);
  overflow-y: auto;
}
.menue.is-auf { transform: translateX(0); }

/* Das `hidden`-Attribut wieder wirksam machen. `.menue` und `.menue-grund`
   setzen `display: flex` bzw. `block` - beides schlaegt das Attribut, und
   das geschlossene Blatt stand dann mit `translateX(100%)` 275 px RECHTS
   AUSSERHALB im Layout. Gemessen am 11.8. bei 320 px Fensterbreite:
   `scrollWidth` 357 statt 320, die Seite liess sich seitlich wegschieben.

   Das JS setzt `hidden` beim Oeffnen auf false und beim Schliessen zurueck
   (marcy-v2.js), diese Regel greift also nur im geschlossenen Zustand. */
.menue[hidden], .menue-grund[hidden] { display: none; }

.menue-kopf { display: flex; justify-content: flex-end; margin-bottom: 20px; }
.menue-zu {
  width: 44px; height: 44px; padding: 0; border: 0; background: none;
  cursor: pointer; display: flex; align-items: center; justify-content: center;
  border-radius: 50%; color: var(--ink);
}

.menue-liste { display: flex; flex-direction: column; }
.menue-liste a {
  font-size: 22px; font-weight: 600; letter-spacing: -0.01em;
  color: var(--ink); text-decoration: none;
  padding: 16px 0;
  border-bottom: 1px solid var(--rahmen);
}
.menue-liste a[aria-current="page"] { color: var(--grau); }

.menue-fuss { margin-top: 28px; }
.menue-fuss .btn { width: 100%; justify-content: center; }

@media screen and (max-width: 991px) {
  .burger { display: flex; }
  /* Der Knopf steht jetzt im Blatt, nicht mehr in der Pille. */
  .nav-kontakt { display: none; }
}
@media screen and (min-width: 992px) {
  /* Auf dem Schreibtisch existiert das Blatt nicht - auch nicht fuer
     Tastatur oder Vorlesesoftware. */
  .menue, .menue-grund { display: none; }
}

/* Wenn das Blatt offen ist, scrollt die Seite dahinter nicht mit. */
body.menue-offen { overflow: hidden; }

@media (prefers-reduced-motion: reduce) {
  .menue, .menue-grund, .burger span { transition-duration: 0.01ms; }
}

/* ============================================================
   § 15  Ablauf - Doppelstrich auf Mobil

   Marcels Befund 11.8.: unter 768 px stehen ZWEI versetzte
   Striche untereinander.

   Ursache in marcy.css: die Linie besteht aus zwei Lagen -
   `::before` ist die graue Grundlinie, `::after` die schwarze
   Fortschrittsfüllung. Beide teilen sich auf dem Schreibtisch
   dieselbe Regel (`left: 27px; top: 56px; bottom: -40px`).

   Der Mobil-Block ab Zeile 1244 rückt aber NUR `::before` auf
   die kleinere Ziffer (`left: 21px; top: 44px; bottom: -32px`).
   `::after` blieb auf den Desktop-Werten stehen - 6 px daneben
   und 12 px zu hoch. Genau der zweite Strich.

   Hier bekommen beide Lagen dieselben Werte.
   ============================================================ */
@media screen and (max-width: 767px) {
  .ablauf-schritt:not(:last-child)::before,
  .ablauf-schritt:not(:last-child)::after {
    left: 21px; top: 44px; bottom: -32px;
  }
}

/* ============================================================
   § 16  Keine Hover-Zustände auf Touch

   Marcels Ansage 11.8.: „den Mouse-Over-Effekt in Mobile
   entfernen, macht keinen Sinn."

   Er hat recht, und es ist mehr als kosmetisch: auf einem
   Touchgerät gibt es kein Verlassen des Elements. Der Zustand
   bleibt nach dem Antippen HÄNGEN - die Karte steht dann dauerhaft
   8 px hoch, bis irgendwo anders hingetippt wird.

   `hover: none` trifft Touch, ohne an der Fensterbreite zu hängen:
   ein schmales Fenster auf dem Schreibtisch behält seinen Hover,
   ein breites Tablet verliert ihn.
   ============================================================ */
@media (hover: none) {
  .karte.is-hebt:hover,
  .paket:hover, .paket:focus-within,
  .thema:hover,
  .projekt:hover, .projekt:focus-within {
    transform: none;
  }
  .btn:hover { background-color: inherit; }
  .btn.is-primaer:hover { background: var(--neon); }
  .btn.is-sekundaer:hover { background: transparent; color: var(--ink); }
  .btn.is-sekundaer.is-hell:hover { background: transparent; color: var(--weiss); }
}

/* ============================================================
   § 17  Schieber auf Mobil - Leistungen und Preise

   Marcels Ansage 11.8.: „nicht 6 Reihen und nur eine genutzt."
   Gemeint ist der Platz: auf 375 px standen die sechs
   Leistungskarten als sechs volle Reihen untereinander und die
   drei Preiskarten ebenso. Das waren allein dort rund 2.900 px
   Scrollweg für Inhalt, der nebeneinander gehört.

   Jetzt eine Schiene, die seitlich läuft - mit Fangpunkten, damit
   sie nicht zwischen zwei Karten stehen bleibt. Die Pfeile sind
   ZUSÄTZLICH: gewischt werden kann ohnehin, und wer eine Maus
   oder Tastatur hat, kommt über die Knöpfe weiter.

   Auf dem Schreibtisch ändert sich nichts - dort bleibt das Raster.
   ============================================================ */
.schieber-kopf { display: none; }

@media screen and (max-width: 767px) {
  .bento.is-schiene,
  .pakete.is-schiene,
  .reihe-3.is-schiene {
    display: flex;
    grid-template-columns: none;           /* das Raster ausser Kraft */
    overflow-x: auto;
    /* `proximity` statt `mandatory`, und KEIN `scroll-behavior: smooth`.
       Beides gemessen am 11.8.: mit `mandatory` faengt der Fangpunkt jeden
       programmatischen Lauf sofort zurueck - weder scrollBy({smooth}) noch
       ein direkt gesetztes scrollLeft bei aktivem scroll-behavior bewegten
       die Schiene auch nur einen Pixel (scrollLeft blieb auf 20 bzw. 0).
       Mit `proximity` faengt sie beim Wischen weiterhin sauber, laesst den
       Pfeilen aber ihren Weg. */
    scroll-snap-type: x proximity;
    /* Die Schiene laeuft von Kante zu Kante, die KARTEN aber nicht: der
       negative Aussenabstand hebt den Rasterrand auf, der Innenabstand
       setzt ihn fuer die Karten wieder. Erste und letzte Karte stehen
       damit genau auf derselben Linie wie Ueberschrift und Vorlauftext.

       `scroll-padding-inline` ist der Teil, der am 11.8. gefehlt hat:
       ohne ihn faengt der Snap-Punkt die Karte an der Fensterkante statt
       am Rasterrand - die erste Karte klebte nach dem ersten Wischen
       links an, waehrend rechts der volle Rand stand. */
    margin-inline: calc(var(--rand) * -1);
    padding-inline: var(--rand);
    scroll-padding-inline: var(--rand);
    gap: 16px;
    scrollbar-width: none;                 /* Firefox */
    -webkit-overflow-scrolling: touch;
  }
  .bento.is-schiene::-webkit-scrollbar,
  .pakete.is-schiene::-webkit-scrollbar,
  .reihe-3.is-schiene::-webkit-scrollbar { display: none; }

  .bento.is-schiene > .karte,
  .pakete.is-schiene > .paket,
  .reihe-3.is-schiene > .karte {
    flex: 0 0 82%;
    scroll-snap-align: start;
    /* Der Sonderfall „grosse Kachel" gilt nur im Raster. In der Schiene
       laufen alle sechs gleich breit - sonst spränge die Fangweite. */
    grid-column: auto; grid-row: auto;
  }
  .bento.is-schiene > .karte.is-gross h3 { font-size: 22px; }

  /* Die zwei Pfeilknoepfe ueber der Schiene sind am 11.8. entfallen
     (Marcels Ansage: „einfacher Swipe-Effekt reicht").

     Sie kosteten 44 px Knopfhoehe plus 16 px Abstand - also 60 px Leere
     zwischen Vorlauftext und erster Karte, und zwar in jeder der beiden
     Schienen. Dass gewischt werden kann, zeigt die angeschnittene zweite
     Karte (`flex: 0 0 82%`) deutlich genug.

     WICHTIG, damit „Swipe reicht" auch ohne Finger gilt: die Schiene
     traegt im HTML `tabindex="0"` und ist damit per Tastatur scrollbar.
     Ohne das waeren die Karten fuer Tastaturnutzer nicht erreichbar,
     sobald die Knoepfe weg sind. */
  .schieber-kopf { display: none; }
}

@media (prefers-reduced-motion: reduce) {
  .bento.is-schiene, .pakete.is-schiene, .reihe-3.is-schiene { scroll-behavior: auto; }
}

/* ============================================================
   Hero: wechselnde zweite Zeile mit Neonmarkierung

   Neon als FLAECHE mit schwarzer Schrift - 14,34:1, so verlangt
   es color.rules. Nie umgekehrt.

   `box-decoration-break: clone` ist Pflicht: bricht die Zeile um,
   bekaeme der zweite Teil sonst keinen eigenen Anfang und die
   Flaeche liefe als ein durchgehender Balken ueber den Rand.

   Die Markierung liegt auf dem WECHSELNDEN Teil, „Ohne" bleibt
   unmarkiert. So zeigt die Flaeche, was sich aendert.
   ============================================================ */
.tipp { white-space: nowrap; }

/* Platz fuer die LAENGSTE Botschaft dauerhaft reservieren.

   Ohne das springt die Ueberschrift bei jedem Wechsel und schiebt
   Vorlauftext, Knopf und Kennzahlenzeile mit.

   2,16em sind exakt zwei Zeilen (Zeilenhoehe 1,08). In `em`, damit der
   Wert die clamp-Groesse der H1 mitnimmt.

   Stand 11.8. reicht das, weil KEINE der fuenf Botschaften laenger ist
   als 15 Zeichen („deinen Aufwand."). Gemessen: bis 16 Zeichen bleibt
   die Zeile zweizeilig, ab 18 bricht sie um - dann waeren wieder 3,24em
   noetig und der Hero 77 px hoeher. **Wird eine Botschaft laenger,
   diesen Wert nachrechnen.** Liste in marcy-v2.js. */
.hero-text h1 { min-height: 2.16em; }
@media screen and (max-width: 767px) {
  /* Schmaler brechen die Zeilen ohnehin anders; eine feste Mindesthoehe
     erzeugt dort nur Leere unter der Ueberschrift. */
  .hero-text h1 { min-height: 0; }
}
.tipp-text {
  background: var(--neon);
  color: var(--ink);
  box-decoration-break: clone;
  -webkit-box-decoration-break: clone;
  padding: 0 0.09em;
}
/* Schreibmarke. `step-end` statt weichem Verlauf: ein Cursor blinkt,
   er blendet nicht. */
.tipp-strich {
  display: inline-block;
  width: 0.055em; height: 0.78em;
  margin-left: 0.08em;
  vertical-align: -0.04em;
  background: var(--ink);
  animation: tippstrich 1.05s step-end infinite;
}
@keyframes tippstrich { 0%, 100% { opacity: 1 } 50% { opacity: 0 } }

/* Ohne Bewegung steht der Claim still und ohne Schreibmarke -
   die Zeile ist Marke, keine Animation. */
@media (prefers-reduced-motion: reduce) {
  .tipp-strich { display: none; }
}
.no-js .tipp-strich { display: none; }


/* ============================================================
   § 18  Hero-Vorlauf auf Mobil kuerzen

   Marcels Ansage 11.8.: der Fokus gehoert auf „Deine Website.
   Ohne deinen Aufwand." Gemessen standen auf 375 px rund 200 px
   Leerraum zwischen Nav-Pille und Portrait - die Headline begann
   erst bei 42 % der Fensterhoehe.
   ============================================================ */
@media screen and (max-width: 767px) {
  .sektion.hero { padding-top: 24px; }
}

/* ============================================================
   § 19  Kurzfassung des Vorspanns auf Mobil

   Marcels Ansage 11.8.: „man muss die Logos sehen im Viewport."
   Der volle Vorspann lief auf 375 px über VIER Zeilen und schob
   die Kundenlogos aus dem ersten Bildschirm.

   Die kurze Fassung lässt den Google-Eintrag und die
   ausformulierte Wochenangabe weg - beides steht weiter unten
   in den Leistungen und in den Fragen. Kein verstecktes
   Zusatzwort: beide Fassungen sind echter Inhalt, je nach
   Fensterbreite sichtbar.
   ============================================================ */
.nur-klein { display: none; }

@media screen and (max-width: 767px) {
  .nur-gross { display: none; }
  .nur-klein { display: inline; }
}

/* ============================================================
   § 20  Hero auf Mobil straffen, Headline grösser

   Marcels Ansage 11.8.: „viel kompakter und ersten zwei Sätze
   grösser."

   Gemessen bei 375 px waren allein die LÜCKEN 218 px hoch:
   Vorspann 28 + 20 Rastergang, Kennzahlen 40 + 20, Logo-Zeile
   48 + 20, dazu 24/44 Sektionspolster. Die Abstände stammen aus
   der Schreibtischfassung, wo sie in einer 804-px-Spalte richtig
   sitzen - auf 335 px sind sie doppelt so gross wie nötig.

   Die H1 wächst von 30 auf 36 px und läuft dadurch dreizeilig
   („Deine Website. / Ohne deinen / Aufwand."). Das kostet 54 px,
   die Straffung bringt rund 100 - netto bleibt es kompakter.
   ============================================================ */
@media screen and (max-width: 767px) {
  .sektion.hero { padding-top: 16px; padding-bottom: 32px; }
  .hero-raster { row-gap: 14px; }

  /* ZWEI Zeilen, immer - Marcels Ansage vom 11.8. Die vorherige Fassung
     stand auf 36 px fest und reservierte den Platz fuer drei Zeilen; die
     kurzen Botschaften liessen dann eine Zeile leer.

     Jetzt umgekehrt: die Schrift wird so weit gedeckelt, dass die LAENGSTE
     Botschaft in zwei Zeilen passt. Gemessen bei 357 px Fenster
     (Spalte 280 px), „Ohne deinen Aufwand." in Inter 600:
       320 px Fenster (280 px Spalte)  →  bis 26 px zweizeilig
       375 px Fenster (335 px Spalte)  →  bis 30 px
       430 px Fenster (390 px Spalte)  →  bis 36 px
     Daraus `clamp(28px, 9vw, 42px)`: bei 375 px sind das 30 px, bei
     430 px 34,4 px - jeweils der groesste Wert, der noch zweizeilig
     bleibt. Am 11.8. von 7,4vw angehoben (Marcels Ansage „H1 groesser").

     Bei 320 px liegt 26 px GENAU auf der Grenze, ohne Reserve. Wer die
     Untergrenze anhebt, bekommt dort drei Zeilen.

     `min-height` auf zwei Zeilen haelt das Layout still, waehrend getippt
     und geloescht wird. Der Hinweis in marcy-v2.js („keine Botschaft ueber
     15 Zeichen") gilt weiter und ist hier die eigentliche Bedingung -
     wird eine Botschaft laenger, reicht auch 25 px nicht mehr. */
  .hero-raster .t-h1 {
    font-size: clamp(28px, 9vw, 42px); line-height: 1.12;
    min-height: calc(2 * 1.12em);
  }

  .hero-raster .hero-lead   { margin-top: 10px; }
  .hero-raster .hero-zahlen { margin-top: 14px; }
  .hero-raster .logo-zeile  { margin-top: 22px; }
}

/* ============================================================
   Hero-Portrait: oben an der Überschrift, nicht zentriert

   Drei Fassungen an einem Tag, hier die Begründung der letzten:

   1. `align-items: center` der ganzen Textspalte - das Bild lag auf
      Höhe von Vorlauftext und Knopf (Mitte 396 px gegen 264 px der H1).
   2. Mitte auf die H1-Mitte gerechnet (`margin-top: -82px`, 320 px).
      Damit begann das Bild bei 104 px - ZEHN PIXEL ÜBER der
      Sektionskante (114 px), es ragte oben heraus. Unten blieben
      182 px Leere neben Knopf und Kennzahlen.
   3. Oben bündig mit der Überschrift, 380 px - flankierte den ganzen
      Textblock (186–606) statt nur dessen obere Hälfte.
   4. Jetzt 340 px (Marcels Ansage 11.8., „etwas kleiner"). Das Bild
      läuft von 190 bis 530 px; unter ihm bleiben 76 px bis zum Ende
      der Textspalte, was auf Höhe der Kennzahlenzeile ausläuft.

   Der Vorteil gegenüber Fassung 2 ist nicht nur optisch: `margin-top: 4px`
   ist ein FESTER kleiner Wert statt einer Rechnung aus H1- und Bildhöhe.
   Ändert sich die Größe der Überschrift, bleibt das Bild oben bündig -
   es muss nichts nachgerechnet werden.

   Nur ab 992 px. Darunter steht das Raster einspaltig.
   ============================================================ */
@media screen and (min-width: 992px) {
  .hero-raster { align-items: start; }
  .hero-bild   { width: 340px; margin-top: 4px; }
}

/* ============================================================
   „Meine Leistungen" nach dem Vorbild vierless.de

   Kopfzeile: Überschrift links, Vorlauftext und Knopf rechts -
   sie stehen auf einer Linie statt untereinander.

   Kacheln: das Raster läuft auf SECHS Spalten, damit sich zwei
   Breiten mischen lassen.

     is-hoch   2 Spalten, 2 Reihen   Karte 1 und 2 (links, mittig)
     is-flach  2 Spalten, 1 Reihe    Karte 3 und 4 (rechts gestapelt)

   Vier Kacheln wie in der Vorlage. Bis zum 11.8. waren es sechs, die
   zwei übrigen lagen als `is-breit` in einer dritten Reihe - auf
   Marcels Ansage gekürzt. Die Klasse `is-breit` bleibt definiert,
   damit eine fünfte oder sechste Kachel ohne Umbau zurückkann.

   Die flachen Karten tragen KEINE Vitrine: bei einer Reihe Höhe
   bliebe für das Bild kein Platz, der Text würde herausgedrückt.
   Im Vorbild ist es genauso - die beiden rechten Kacheln sind reiner
   Text.
   ============================================================ */
.leistungen-kopf {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  column-gap: 48px; align-items: start;
}
.leistungen-kopf-text .t-lead { margin: 14px 0 0; max-width: 560px; }
/* Der Knopf sitzt oben rechts auf Hoehe der Ueberschrift, nicht mittig
   zum Textblock - sonst haengt er zwischen den Zeilen. */
.leistungen-kopf > .btn { align-self: start; }

@media screen and (min-width: 992px) {
  .bento { grid-template-columns: repeat(6, 1fr); }
  .bento > .karte           { grid-column: span 2; }
  .bento > .karte.is-hoch   { grid-row: span 2; }
  .bento > .karte.is-breit  { grid-column: span 3; }
  .bento > .karte.is-flach .bento-vitrine { display: none; }
}

@media screen and (max-width: 991px) {
  /* Einspaltig - der Knopf rutscht unter den Text und steht links,
     nicht ueber die volle Breite gedehnt. */
  .leistungen-kopf { grid-template-columns: 1fr; row-gap: 24px; }
  .leistungen-kopf > .btn { justify-self: start; }
}

/* ============================================================
   § 21  Herausforderungen - Liste links, Aussage rechts

   Marcels Ansage 11.8., Vorbild soenkesproll.de. Uebernommen ist
   die STRUKTUR (Liste mit Nummern, grosse Aussage daneben,
   Wechsel beim Scrollen). Nicht uebernommen:

   · Blau und Kursiv - marcy-ci.json typography.rules schliesst
     Kursiv aus, Auszeichnung laeuft ueber Medium 500; Blau ist
     keine marcy-Farbe
   · Versalien in der Ueberschrift
   · der Erklaersatz je Punkt - Beschluss vom 7.8.,
     „Keine Erklaertexte" in ENTSCHEIDUNGEN.md
   ============================================================ */
.hf2-raster {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 1.05fr);
  column-gap: 72px;
  /* `center` statt `start` (Marcels Ansage 11.8.): die Buehne sitzt jetzt
     auf halber Hoehe der Liste, nicht an deren Oberkante. Weil die Liste
     vier Zeilen hoch ist und die Buehne nur drei Zeilen fuellt, stand sie
     vorher optisch zu weit oben. */
  align-items: center;
}

.hf2-liste { list-style: none; margin: 0; padding: 0; border-top: 1px solid var(--chrome); }
.hf2-liste li { border-bottom: 1px solid var(--chrome); }

/* Ein <button>, kein <div>: die Punkte sind anklickbar und muessen
   mit der Tastatur erreichbar sein. */
.hf2-knopf {
  display: flex; align-items: baseline; column-gap: 14px;
  width: 100%; padding: 22px 0;
  background: none; border: 0; cursor: pointer; text-align: left;
  font: inherit; color: var(--grau);
  transition: color 260ms ease-out;
}
.hf2-nr { font-size: 15px; font-weight: 500; font-variant-numeric: tabular-nums; }
.hf2-titel { font-size: 17px; line-height: 1.4; }

/* Der aktive Punkt traegt Ink und einen neonen Marker - genau EINE
   Neonflaeche in dieser Ansicht (color.accentRule). */
.hf2-knopf[aria-current="true"] { color: var(--ink); }
.hf2-knopf[aria-current="true"] .hf2-titel { font-weight: 500; }
.hf2-marker {
  width: 7px; height: 7px; border-radius: 50%;
  background: transparent;
  transform: scale(0); transition: transform 260ms cubic-bezier(.22,.61,.36,1);
}
.hf2-knopf[aria-current="true"] .hf2-marker { background: var(--neon); transform: scale(1); }
.hf2-knopf:focus-visible { outline: 2px solid var(--ink); outline-offset: 3px; }

/* Die Mindesthoehe haelt den Platz fuer die laengste Fassung frei, damit
   die Buehne beim Wechsel nicht in der Hoehe springt.

   `justify-self: center` (Marcels Ansage 11.8.): der Block sitzt jetzt
   mittig zwischen dem Ende der Liste und dem rechten Rand, statt an der
   Spaltenkante zu kleben. Der TEXT bleibt linksbuendig - zentrierte
   Fliesszeilen sind in dieser CI nirgends vorgesehen. */
.hf2-buehne { position: relative; min-height: 240px; justify-self: center; }

/* Der halbe Spaltenabstand zurueck. `justify-self: center` zentriert in der
   SPALTE - die beginnt aber erst hinter dem 72-px-Gang. Gemessen lag die
   Buehne dadurch 36 px rechts der Mitte des freien Raums (Freiraum 670–1320,
   Mitte 995; Buehne-Mitte 1031). Die Haelfte des Gangs holt sie genau dorthin.

   Nur zweispaltig - einspaltig gibt es keinen Gang, den man ausgleichen
   muesste. */
@media screen and (min-width: 1200px) {
  /* Erst ab 1.200 px. Bei 992 zog der Ausgleich die Buehne in die Liste
     hinein (gemessen: Kollision) - dort ist der freie Raum schlicht zu
     schmal, um noch etwas zu verschieben. Darunter bleibt die Buehne in
     ihrer Spalte.

     -72, nicht -36: der negative Rand verschiebt die Buehne nicht nur, er
     VERBREITERT auch den Raum, in dem `justify-self: center` zentriert.
     Der Block wandert deshalb nur um die Haelfte. Mit -36 blieben 18 px
     Abweichung stehen, mit -72 sind es 0. */
  .hf2-buehne { margin-left: -72px; }
}

/* Die Geisterzahl steht UEBER der Aussage, nicht dahinter. Erste
   Fassung hatte sie absolut hinter den Text gelegt - gemessen
   ueberlappten die Kaesten (Zahl 245–435, Text 287–425) und die
   Aussage stand mitten in der Ziffer.

   `--chrome`: dieselbe Stufe wie die Haarlinien, damit die Ziffer
   nicht als zweite Aussage gelesen wird. */
.hf2-zahl {
  display: block;
  font-size: 150px; font-weight: 600; line-height: 0.82;
  letter-spacing: -0.04em;
  /* `--greige` (#EBEAE8) - Marcels Ansage 11.8., zweite Runde: „die Zahlen
     bitte in dem Greige." Vorher stand hier `--grau` (#6B6B69), davor
     `--chrome`. Auf Weiss ist Greige sehr blass (rund 1,1:1) - das ist hier
     RICHTIG und kein Kontrastfehler: die Ziffer traegt `aria-hidden` und
     ist reine Zeichnung. Die Nummer als Information steht in der Liste
     links, dort in Ink bzw. Grau. */
  color: var(--greige);
  user-select: none; pointer-events: none;
  font-variant-numeric: tabular-nums;
  margin-left: -6px;
}
.hf2-aussage {
  font-size: 40px; font-weight: 600; line-height: 1.15;
  letter-spacing: -0.02em; color: var(--ink);
  margin: 18px 0 0; max-width: 16ch;
}
/* Die Frage darunter. Sie ist der Teil, den marcy bis zum 11.8. bewusst
   NICHT hatte („Keine Erklaertexte", 7.8.) - Marcel hat den Beschluss an
   dieser Stelle aufgehoben. Es ist auch kein Erklaersatz: die Zeile
   BEHAUPTET nichts, sie fragt zurueck. */
.hf2-frage {
  font-size: 19px; line-height: 1.5; color: var(--grau);
  margin: 14px 0 0; max-width: 34ch;
}

/* Nur Deckkraft und 8 px Weg - layout.motion erlaubt keine groesseren
   Spruenge beim Erscheinen. */
.hf2-buehne.is-wechsel .hf2-zahl,
.hf2-buehne.is-wechsel .hf2-aussage,
.hf2-buehne.is-wechsel .hf2-frage { opacity: 0; transform: translateY(8px); }
.hf2-zahl, .hf2-aussage, .hf2-frage { transition: opacity 220ms ease-out, transform 220ms ease-out; }

@media screen and (max-width: 991px) {
  .hf2-raster { grid-template-columns: minmax(0, 1fr); row-gap: 40px; }
  /* Die Buehne steht OBEN - sie ist die Aussage, die Liste der Fortschritt. */
  .hf2-buehne { order: -1; min-height: 180px; }
  .hf2-zahl { font-size: 112px; }
  .hf2-aussage { font-size: 30px; max-width: none; }
  .hf2-frage { font-size: 18px; max-width: none; }
}
@media screen and (max-width: 767px) {
  /* Kompakter als zuvor. Gemessen am 11.8. auf 375 und 390 px lag das
     Grauband bei 900 px - ausserhalb eines 667- bzw. 844-px-Fensters, also
     unsichtbar. Der Inhalt war schlicht hoeher als der Bildschirm.
     Zahl 72 statt 92, Zeilen 13 statt 18 px Polster, Buehne 150 statt 200:
     zusammen rund 130 px weniger. */
  .hf2-zahl { font-size: 72px; }
  .hf2-aussage { font-size: 24px; }
  .hf2-frage { font-size: 16px; margin-top: 8px; }
  .hf2-knopf { padding: 13px 0; }
  .hf2-titel { font-size: 15px; }
  .hf2-buehne { min-height: 150px; }
  .hf2-raster { row-gap: 24px; }
}
@media (prefers-reduced-motion: reduce) {
  .hf2-zahl, .hf2-aussage, .hf2-frage, .hf2-marker, .hf2-knopf { transition-duration: 0.01ms; }
}

/* ------------------------------------------------------------
   Werkzeugliste in der Kachel „Technik & Livegang"

   Form nach dem Vorbild vierless.de: Icon, Name, Haarlinie unter
   jeder Zeile. NICHT uebernommen sind die Hersteller-Logos -
   `imagery` und CLAUDE.md Regel 4 schliessen fremde Markenzeichen
   aus, und Nachzeichnen ausdruecklich auch. Die Icons stehen
   deshalb in der eigenen Sprache: 1,5 px Kontur, eckige Enden,
   genau eine Neonflaeche je Zeichen.
   ------------------------------------------------------------ */
.werkzeuge { list-style: none; margin: 20px 0 0; padding: 0; }
.werkzeuge li {
  display: flex; align-items: center; column-gap: 12px;
  padding: 11px 0;
  border-bottom: 1px solid var(--rahmen);
  font-size: 15px; color: var(--ink);
}
.werkzeuge li:first-child { border-top: 1px solid var(--rahmen); }
.wz-icon { width: 22px; height: 22px; flex: 0 0 auto; }


/* ============================================================
   § 22  Textmarker in der Ueberschrift

   Marcels Ansage 11.8.: „Herausforderungen gelb markieren."

   Neon als FLAECHE mit Ink-Schrift - 14,34:1. Nie andersherum:
   `#CEFA05` als Schriftfarbe erreicht auf Weiss nur 1,21:1
   (marcy-ci.json, harte Regel 6).

   `box-decoration-break: clone` sorgt dafuer, dass beide Haelften
   markiert bleiben, wenn das Wort ueber zwei Zeilen bricht - ohne
   das traegt nur das erste Stueck Farbe.

   Das Padding ist in `em` gerechnet, damit die Markierung in jeder
   Schriftgroesse gleich eng am Wort sitzt.
   ============================================================ */
.markiert {
  background: var(--neon);
  color: var(--ink);
  padding: 0.02em 0.1em;
  border-radius: 2px;
  -webkit-box-decoration-break: clone;
  box-decoration-break: clone;
}

/* ============================================================
   § 23  Die Sektion bleibt stehen, bis alle vier Punkte durch sind

   Marcels Ansage 11.8.: „Section und Viewport so lange fixieren,
   bis alle 4 Punkte durch sind." Ohne das scrollte die Liste aus
   dem Bild, waehrend noch Punkte ausstanden - man sah 04 nie in
   Ruhe, sondern nur im Vorbeiziehen.

   `overflow: visible` ist PFLICHT: marcy.css Zeile 85 setzt
   `.sektion { overflow: hidden }` fuer den Bogen, und ein
   Vorfahre mit `overflow: hidden` macht `position: sticky` bei
   allen Nachkommen wirkungslos. Das ist am selben Tag schon
   einmal aufgelaufen.

   Die Polster wandern von der Sektion in die Klebeschicht -
   sonst zaehlten sie doppelt: einmal oben an der langen Buehne
   und einmal im festgehaltenen Inhalt.
   ============================================================ */
.hf2-sektion {
  overflow: visible;
  /* 56 px Vorlauf zur Hero (Marcels Ansage 11.8.: „Abstand zur Hero ist zu
     gering"). Vorher 0 - die Ueberschrift klebte 72 px unter dem Laufband,
     was fuer den Sektionswechsel zu knapp war. */
  padding-top: 56px;
  padding-bottom: 0;
}

/* Die Buehne ist der Scrollweg. 100vh davon sind das Fenster selbst,
   der Rest ist der Weg, ueber den die vier Punkte laufen.

   210vh statt 300vh (Marcels Befund 11.8.: „die Gesamtlaenge fuehlt sich
   sehr lang an"). Bei 300vh hielt der Pin ueber 1.800 px - die Sektion
   allein war fast ein Drittel der Seite. Jetzt sind es 990 px. */
/* Die Buehne ist der Scrollweg. 100vh davon sind das Fenster selbst,
   der Rest ist der Weg, ueber den die vier Punkte laufen.

   210vh statt 300vh (Marcels Befund 11.8.: „die Gesamtlaenge fuehlt sich
   sehr lang an"). Bei 300vh hielt der Pin ueber 1.800 px - die Sektion
   allein war fast ein Drittel der Seite. Jetzt sind es 990 px.

   KEIN eigener Hintergrund: die Buehne war am 11.8. kurz greige, damit
   unter dem Inhalt sofort die naechste Flaeche stand. Marcel hat das
   verworfen - die naechste Sektion darf waehrend des Pins hereinschauen. */
.hf2-lang { height: 210vh; position: relative; }

/* Die Klebeschicht ist NICHT bildschirmhoch.

   Erste Fassung war `min-height: 100vh` mit `align-items: center`.
   Gemessen: der Inhalt ist 434 px hoch, die Schicht 900 - also 233 px
   Luft oben UND unten, und vom Logo-Laufband bis zur Ueberschrift
   waren es 305 px. Marcels Befund: „weniger White Space hier und
   untendrunter auch."

   Jetzt ist die Schicht so hoch wie ihr Inhalt und klebt mit 96 px
   Abstand unter der Nav-Pille. Der Weissraum entsteht damit nicht mehr
   aus einer Zentrierung in einem zu grossen Kasten, sondern ist gesetzt. */
.hf2-klebt {
  position: sticky;

  /* 150 statt 96 px (Marcels Befund 11.8.: „die Headline wird vom Menue
     ueberdeckt"). Die Nav-Pille endet gemessen bei 94 px - bei top: 96
     klebte die Ueberschrift zwei Pixel darunter und beruehrte sie fast.
     150 px geben ihr 56 px Luft. */
  top: 150px;

  /* Fuellt den Rest des Fensters. Damit ist der ganze sichtbare Bereich
     Teil des festgehaltenen Blocks - die Sektion wirkt fixiert, statt dass
     nur ein 526-px-Streifen haengt und darunter Leere durchlaeuft. */
  min-height: calc(100vh - 150px);
  display: flex; flex-direction: column;
  padding-top: 0; padding-bottom: 0;
}
/* Der Inhalt oben, das Band unten - `auto` schiebt es an den Fuss. */
.hf2-klebt > .raster { width: 100%; }
.hf2-grauband {
  margin-top: auto;
  /* 96 px - genau das Sektionspolster aus marcy.css. Das Band IST damit der
     obere Abstand der Leistungen; deren eigenes padding-top faellt weg
     (Marcels Befund 11.8.: „dieser Blank Space darf nicht entstehen").
     Vorher addierten sich 140 px Band und 96 px Polster zu 236 px leerem
     Grau, bevor „Meine Leistungen" begann. */
  height: 96px;
  background: var(--greige);
  /* Volle Fensterbreite, nicht nur Rasterbreite. */
  margin-inline: calc(var(--rand) * -1);
}
.hf2-klebt > .raster { width: 100%; }

@media screen and (max-width: 991px) {
  /* Kuerzerer Weg auf kleinen Geraeten: dort ist 1vh weniger Pixel und
     der Daumen legt dieselbe Strecke in mehr Wischern zurueck. */
  .hf2-lang { height: 190vh; }
}
@media screen and (max-width: 767px) {
  .hf2-lang { height: 180vh; }
  .hf2-klebt { top: 132px; min-height: calc(100vh - 132px); }
  .hf2-grauband { height: 72px; }
  .hf2-sektion { padding-top: 40px; }
}

/* Bei „Bewegung reduzieren" faellt der Pin weg: die Sektion ist dann
   so hoch wie ihr Inhalt und die vier Punkte stehen untereinander da.
   Der Inhalt bleibt vollstaendig - es fehlt nur die Inszenierung. */
@media (prefers-reduced-motion: reduce) {
  .hf2-lang { height: auto; }
  .hf2-klebt { position: static; min-height: 0; }
  .hf2-grauband { display: none; }
}

/* ============================================================
   § 24  Ablauf-Ziffern: arabisch statt roemisch

   Marcels Ansage 11.8. - I · II · III · IV wurden zu 01 · 02 ·
   03 · 04, passend zur Liste in „Kennst du folgende
   Herausforderungen?". Der Rest der Sektion bleibt unberuehrt.

   `tabular-nums` ist noetig, seit dort Ziffern stehen: in der
   Proportionalschrift ist die 1 schmaler als die 0, wodurch „01"
   und „04" unterschiedlich breit im Kreis saessen. Das Sperren
   faellt von 0,04em auf 0,02em - roemische Ziffern brauchen es,
   arabische wirken damit auseinandergezogen.
   ============================================================ */
.ablauf-ziffer {
  font-variant-numeric: tabular-nums;
  letter-spacing: 0.02em;
}

/* ============================================================
   Mobil: Portrait wandert aus dem Hero in die Nav-Pille

   Marcels Ansage 11.8. Im Hero stand es auf 88 px neben dem Knopf
   und nahm ihm die halbe Zeile; in der Pille ist es dauerhaft
   sichtbar - auf jeder Seite, in jeder Scrollposition - und führt
   mit einem Antippen zum Erstgespräch.

   Das ersetzt zugleich den `nav-kontakt`-Knopf, der auf Mobil
   ohnehin ausgeblendet ist: der Weg zum Kontakt war dort nur noch
   über das Burger-Menü erreichbar, also zwei Antippen tief.

   44 px Tippziel nach WCAG 2.5.8 - das Bild misst 40 px, der Link
   dehnt sich mit Innenabstand auf 44.
   ============================================================ */
.nav-portraet { display: none; }

@media screen and (max-width: 991px) {
  .nav-portraet {
    display: flex; align-items: center; justify-content: center;
    width: 44px; height: 44px; flex: 0 0 auto;
    margin-left: auto; margin-right: 4px;
    /* KEIN Neonkreis. `.nav-portraet` traegt in marcy.css
       `background: var(--neon)` - das stammt aus der alten Nav-Pille, in
       der das Portrait bewusst auf Neon sass. Marcels Ansage 11.8.: hier
       nicht. Auch `overflow: hidden` und der Pillenradius von dort werden
       aufgehoben, sonst schnitte der 44-px-Kasten das 40-px-Bild an. */
    background: none; overflow: visible; border-radius: 0;
  }
  .nav-portraet img {
    width: 40px; height: 40px;
    border-radius: 50%; object-fit: cover;
    background: #000;                    /* wie die uebrigen Portraits */
    display: block;
  }
  /* Der Burger stand vorher rechtsbuendig durch `margin-left:auto`.
     Den traegt jetzt das Portrait, sonst kleben beide zusammen. */
  .burger { margin-left: 0; }

  /* Das Portrait im Hero entfaellt - es steht jetzt oben. */
  .hero-bild { display: none; }
}


/* ============================================================
   § 24  Leistungen ohne eigenes Kopfpolster

   Das Grauband am Fuss der festgehaltenen Sektion ist bereits der
   Abstand. Ohne diese Regel stuenden 96 px Band PLUS 96 px
   Sektionspolster uebereinander - 192 px leeres Grau, bevor die
   Ueberschrift beginnt. Marcel: „dieser Blank Space darf nicht
   entstehen."

   Greift nur, solange die Sektion direkt auf die festgehaltene
   folgt; bei „Bewegung reduzieren" faellt das Band weg und das
   Polster kommt zurueck.
   ============================================================ */
#herausforderungen + #leistungen { padding-top: 0; }

@media (prefers-reduced-motion: reduce) {
  #herausforderungen + #leistungen { padding-top: 96px; }
}

/* ============================================================
   Sehr schmale Geräte (iPhone SE, 320 px)

   Zwei Befunde aus der Mobil-QA vom 11.8., beide nur unter 360 px:

   1. Die Überschrift bricht dreizeilig. Bei 320 px misst die Spalte
      280 px, und `8vw` ergibt 25,6 px - knapp über der Grenze. Die
      reine Textbreitenrechnung sagte „passt", gemessen wurde aber
      drei Zeilen: der Umbruch fällt VOR „Ohne", nicht innerhalb der
      markierten Phrase (`.tipp` trägt `nowrap`). Deshalb hier fest
      25 px statt einer Rechnung.

   2. Die Fußzeile lief 37 px über. Sie steht ab 767 px auf zwei
      Spalten; bei 320 px sind das zweimal 146 px plus 40 px Abstand
      = 332 px in einer 280-px-Spalte. Einspaltig ist die einzige
      Lösung, die ohne Kürzen der Linktexte auskommt.
   ============================================================ */
@media screen and (max-width: 359px) {
  .hero-raster .t-h1 { font-size: 25px; }
  .fuss-zeile { grid-template-columns: 1fr; gap: 28px; }
  .kennzahlen { grid-template-columns: 1fr; row-gap: 20px; }
}


/* ============================================================
   § 25  Sehr niedrige Fenster (iPhone SE und aehnlich)

   Gemessen am 11.8. auf 375 x 667: das Grauband lag bei 794 px,
   also 127 px unter dem Fensterrand - unsichtbar. Der Block passt
   dort schlicht nicht in die Hoehe.

   Die Regel haengt an der HOEHE, nicht an der Breite: ein Telefon
   quer und ein sehr kleines Fenster auf dem Schreibtisch haben
   dasselbe Problem.

   Der Vorlauftext entfaellt hier - er wiederholt, was die
   Ueberschrift schon fragt, und ist der guenstigste Verzicht.
   ============================================================ */
@media screen and (max-height: 700px) {
  .hf2-sektion .t-lead { display: none; }
  .hf2-sektion .luecke-64 { height: 28px; }
  .hf2-sektion .luecke-16 { height: 0; }
  .hf2-buehne { min-height: 120px; }
  .hf2-zahl { font-size: 60px; }
  .hf2-aussage { font-size: 21px; }
  .hf2-frage { font-size: 15px; }
  .hf2-knopf { padding: 10px 0; }
  .hf2-raster { row-gap: 18px; }
  .hf2-grauband { height: 56px; }
  .hf2-klebt { top: 132px; min-height: calc(100vh - 132px); }
}


/* ============================================================
   § 26  Unter 480 px Fensterhoehe kein Pin

   Telefon im Querformat und sehr flache Fenster: dort bleiben nach
   der Nav-Pille rund 280 px. Gemessen am 11.8. bei 667 x 375 lag
   das Grauband bei 481 px, also 106 px unterhalb des Randes - der
   festgehaltene Block passt schlicht nicht.

   Statt ihn zu quetschen faellt der Pin dort ganz weg: die Sektion
   laeuft normal mit, die vier Punkte stehen untereinander lesbar da.
   Derselbe Rueckfall wie bei „Bewegung reduzieren".
   ============================================================ */
@media screen and (max-height: 480px) {
  .hf2-lang { height: auto; }
  .hf2-klebt { position: static; min-height: 0; }
  .hf2-grauband { display: none; }
  #herausforderungen + #leistungen { padding-top: 96px; }
}

/* ============================================================
   § 27  Screenscrolls laufen auf Touch von allein

   Marcels Ansage 11.8.: „Lass in Mobile diese Videos automatisch
   scrollen, endless scroll."

   Warum dort vorher NICHTS passierte: der Effekt hing in
   `marcy.css` allein an `.fall:hover` und `:focus-within`. Auf
   einem Touchgerät gibt es kein Hover - der Screenscroll stand
   also still, und die Karten zeigten nur den obersten Streifen.

   `alternate` statt eines harten Rücksprungs: die Fahrt kehrt am
   Ende um und läuft zurück. Ein Sprung auf Null wäre ein sichtbarer
   Ruck; ein echter Endlos-Loop ginge nur mit doppeltem Bild, und
   ein Screenshot hat oben und unten verschiedene Inhalte.

   Die vier Fälle starten VERSETZT. Ohne das führen alle vier
   synchron dieselbe Bewegung aus, was mechanisch wirkt.

   `hover: none` trifft Touch, ohne an der Fensterbreite zu hängen -
   ein schmales Fenster auf dem Schreibtisch behält seinen Hover.
   ============================================================ */
/* `hover: none` ODER schmales Fenster. Nur `hover: none` reichte NICHT:
   gemessen am 11.8. meldet ein schmal gezogenes Desktop-Fenster weiterhin
   `hover: hover` - dort lief die Animation also nicht an, obwohl die Seite
   im Mobil-Layout stand. Genau der Fall, in dem Marcel „laeuft immer noch
   nicht" sah. Das Komma verodert die beiden Bedingungen. */
@media (hover: none), screen and (max-width: 991px) {
  .browser-bild img {
    animation: fall-scrollen 22s linear infinite;
    /* PAUSIERT, bis die Karte im Bild ist - marcy-v2.js schaltet um.
       Marcels Ansage 11.8.: „erst starten, wenn der Nutzer da angelangt
       ist." Ohne das laeuft die Fahrt im Verborgenen und der Besucher
       trifft sie mitten im Bild an. */
    animation-play-state: paused;
    transition: none;
  }
  .fall.is-laeuft .browser-bild img { animation-play-state: running; }

  /* Kein Versatz mehr: jede Karte beginnt oben, sobald SIE sichtbar wird. */
  .fall:hover .browser-bild img,
  .fall:focus-within .browser-bild img { transform: none; }
}

/* Immer von oben nach unten (Marcels Ansage 11.8.). `alternate` fuhr die
   Strecke auch rueckwaerts - die Seite lief dann von unten nach oben, was
   kein Mensch so scrollt.

   Der Ruecksprung auf Null wird ausgeblendet statt gefahren: 0–86 % faehrt
   abwaerts, 86–92 % blendet aus, bei 93 % steht das Bild wieder oben, bis
   100 % ist es zurueck. Ohne diese Blende waere der Sprung ein sichtbarer
   Ruck. */
@keyframes fall-scrollen {
  0%   { transform: translateY(0);      opacity: 1; }
  86%  { transform: translateY(-700px); opacity: 1; }
  92%  { transform: translateY(-700px); opacity: 0; }
  93%  { transform: translateY(0);      opacity: 0; }
  100% { transform: translateY(0);      opacity: 1; }
}

@media (prefers-reduced-motion: reduce) {
  .browser-bild img { animation: none; }
}

/* ============================================================
   Mobil: Logo-Band kleiner

   Marcels Ansage 11.8. Auf dem Handy nahm die Reihe zu viel vom
   ersten Bildschirm - die Logos sind Beleg, nicht Hauptaussage.
   Alle Höhen um ein Viertel zurück, die Sonderfälle im selben
   Verhältnis (sie sind aus den Seitenverhältnissen hergeleitet,
   siehe startseite.md § 2 - deshalb hier nicht eingeebnet).
   ============================================================ */
@media screen and (max-width: 767px) {
  .laufband-satz img                { height: 26px; }
  .laufband-satz .logo-niccos       { height: 21px; }
  .laufband-satz .logo-gw           { height: 30px; }
  .laufband-satz .logo-eisfive      { height: 30px; }
  .laufband-satz .logo-selectliving { height: 15px; }
}

/* ============================================================
   § 28  /ueber-mich - Portrait neben den Namen, Umbruch im Titel

   Marcels Befund 11.8.: „auf der Ueber-mich-Seite wirkt das Bild
   verloren" und „der Text sieht hier auch komisch aus".

   ZUM BILD: es stand auf Mobil als 280-px-Kreis UNTER dem ganzen
   Textblock - nach Ueberschrift, Rolle, Vorspann und zwei Knoepfen.
   Dort ist es kein Portrait mehr, sondern ein Nachtrag. Jetzt sitzt
   es klein neben dem Namen, wie das Portrait im Hero der Startseite
   neben dem Knopf.

   `display: contents` loest den Textbehaelter auf, damit Ueberschrift
   und Bild Felder DESSELBEN Rasters werden - sonst liessen sie sich
   nicht nebeneinander setzen, sie haben verschiedene Eltern.

   ZUM UMBRUCH: die Ueberschrift trug „Digital -<br>". Auf schmalen
   Fenstern brach die Zeile vor dem Strich, der dadurch ALLEIN auf
   einer Zeile stand. Jetzt bindet ein geschuetztes Leerzeichen den
   Strich ans Wort, und der harte Umbruch gilt nur noch ab 768 px.
   ============================================================ */
.br-gross { display: inline; }

@media screen and (max-width: 767px) {
  .br-gross { display: none; }

  /* Portrait ÜBER dem Namen (Marcels Ansage 11.8.), einspaltig.

     Die frueheren Regeln hier setzten `display: contents` auf das erste
     Kind, um das 96-px-Portrait neben die Ueberschrift zu ziehen. Seit
     das Bild im Quelltext VOR dem Textblock steht, traf diese Regel das
     BILD: es verlor damit seine Box - und mit ihr Rundung, Breite und
     `overflow: hidden`. Das `<img>` wurde direktes Rasterkind und lief
     eckig ueber die volle Breite. Deshalb ist der Block ersetzt, nicht
     ergaenzt. */
  .person-hero { grid-template-columns: 1fr; row-gap: 20px; }
  .person-hero-bild { width: 140px; max-width: none; }
}

/* ============================================================
   § 29  Kontakt - Überschrift über dem Formular, beides mittig

   Marcels Ansage 11.8.: „den ganzen Text rauslöschen, Form
   zentriert und Headline darüber, in Mobile und Desktop."

   Vorher: Text links, Formular rechts (1fr / 560px). Die linke
   Spalte trug einen Vorspann und die drei Schritte „Formular
   ausfüllen / Termin wählen / Erstgespräch per Video" - beides
   erklärte, was das Formular daneben ohnehin zeigt. Beides ist
   im Markup entfallen, hier fällt die Spalte weg.
   ============================================================ */
.kontakt-oben {
  grid-template-columns: minmax(0, 1fr);
  justify-items: center;
  gap: 32px;
}
.kontakt-text { padding-top: 0; text-align: center; max-width: 720px; }
.kontakt-formular { width: 100%; max-width: 560px; }

/* ============================================================
   § 30  Kontakt auf Mobil - das Formular führt, sonst nichts

   Marcels Vorgabe 11.8. (zweiter Screenshot): kein sichtbarer
   Vorspann über dem Formular, wenig Vorlauf, die ganze Karte in
   einem Bildschirm.

   Die Überschrift bleibt im Dokument - sie ist die einzige H1
   dieser Seite, Suchmaschinen und Vorlesesoftware brauchen sie.
   Sichtbar ist sie nur ab 768 px. `clip` statt `display: none`,
   damit sie im Zugänglichkeitsbaum bleibt (dieselbe Technik wie
   `.sr` in marcy.css).

   Ein erster Anlauf hatte stattdessen das FORMULAR geschrumpft -
   Marcels Befund: „jetzt ist die Form mega klein." Umgekehrt ist
   richtig: die Karte behält ihre Grösse, der Rahmen gibt nach.
   ============================================================ */
@media screen and (max-width: 767px) {
  .kontakt-oben { gap: 18px; }
  .kontakt-text .t-h2 { font-size: 28px; line-height: 1.2; }
  #anfrage { padding: 20px 20px 20px !important; }
}

/* Die Überschrift ist ÜBERALL sichtbar (Marcels Ansage 11.8.: „du hast die
   Headline immer noch nicht auf Mobile hinzugefügt").

   Ein früherer Stand versteckte sie unter 720 px Fensterhöhe, weil dort das
   Formular knapp wurde. Nachgerechnet reicht der Platz aber: auf 375 x 667
   endet die Karte bei 589 px, es bleiben 78 - die Überschrift braucht mit
   Abstand 58. Sie bleibt also stehen, das Formular rückt entsprechend nach. */

/* ============================================================
   § 31  Kontakt - Reihenfolge und Höhe des Formulars

   ZWEI Befunde aus der Messung am 11.8.:

   1. Die Überschrift stand auf Mobil BEI y=815, also UNTER dem
      Formular. Ursache: `marcy.css` setzt dort
      `.kontakt-formular { order: -1 }` - sinnvoll, solange links
      ein langer Textblock stand, den niemand vor dem Formular
      lesen wollte. Der Text ist weg, die Überschrift gehört
      darüber (Marcels Ansage: „Headline da drüber").

   2. Die Bühne war 507 px hoch, obwohl Schritt 1 nur 375 px
      braucht. Alle drei Schritte liegen im selben Rasterfeld
      (1 / 1) und tragen nur `visibility: hidden` - sie belegen
      also weiter Platz, und der höchste bestimmt die Höhe. Unter
      dem „Weiter"-Knopf standen dadurch 132 px leeres Greige.

      `height: 0` statt einer festen Höhe: die Bühne nimmt damit
      die Höhe des jeweils aktiven Schrittes an und wächst mit,
      wenn Schritt 2 mehr Felder hat.
   ============================================================ */
.kontakt-formular { order: 0; }
.kontakt-text { order: -1; }

/* KEIN `height: 0` mehr auf den inaktiven Schritten.

   Marcels Ansage 11.8.: „vielleicht fixiert man den Weiter-Button im
   Formular so, dass die Stelle immer gleich bleibt. Zwischen Schritt 1,
   2 und 3 springt er in Mobile."

   Genau das war die Folge: mit `height: 0` nahm die Bühne die Höhe des
   jeweils aktiven Schrittes an - Schritt 1 ist 486 px hoch, Schritt 3
   nur 435, also wanderte der Knopf bei jedem Wechsel. Ohne die Regel
   spannen alle drei Schritte dasselbe Rasterfeld, der höchste bestimmt
   die Höhe, und der Knopf steht fest.

   Der Preis ist etwas Leerraum in den kürzeren Schritten. Das ist der
   bessere Tausch: ein Knopf, der bei jedem Schritt an derselben Stelle
   liegt, ist mit dem Daumen ohne Nachsuchen erreichbar. */

@media (prefers-reduced-motion: reduce) {
  .ms-buehne { transition: none; }
}

/* ============================================================
   § 32  Kontakt - Überschrift unter die Nav

   Die Überschrift stand gemessen bei y=146. Die Nav-Pille reicht
   bis 160 - sie war also nicht weg, sondern DAHINTER. Die Sektion
   trägt inline `padding-top:40px`; auf Mobil ist das zu wenig.
   ============================================================ */
@media screen and (max-width: 991px) {
  .sektion.hero:has(.kontakt-oben) { padding-top: 28px !important; padding-bottom: 24px !important; }
}

/* ============================================================
   § 33  Herausforderungen auf Mobil - Luft über dem Grauband

   Marcels Befund 11.8.: „alles leicht nach oben schieben, sodass
   wir Abstand haben zwischen der Section und dem grauen Block."

   Das Band sitzt über `margin-top: auto` am Fuss der Klebeschicht.
   Der Abstand darüber ist der REST - und der war auf Mobil fast
   null, weil der Inhalt die Schicht schon füllte. Ein fester
   Innenabstand am Raster erzwingt die Luft.
   ============================================================ */
@media screen and (max-width: 767px) {
  .hf2-klebt > .raster { padding-bottom: 36px; }
}

/* ============================================================
   § 34  Leistungen auf Mobil - Knopf unter die Karten

   Marcels Ansage: „Erstgespräch buchen CTA unter die Cards."
   Auf dem Schreibtisch steht er rechts neben der Überschrift
   (Vorbild vierless.de); auf Mobil rutschte er dadurch zwischen
   Vorlauftext und erste Karte und trennte beides.
   ============================================================ */
@media screen and (max-width: 767px) {
  #leistungen .raster { display: flex; flex-direction: column; }
  #leistungen .leistungen-kopf { order: 0; }
  #leistungen .leistungen-kopf .btn { display: none; }
  #leistungen .schieber-kopf { order: 1; }
  #leistungen #leistungen-schiene { order: 2; }
  #leistungen .luecke-48 { order: 1; }
  /* Der Knopf als eigene Zeile NACH der Schiene, aber in seiner natuerlichen
     Breite und linksbuendig - genau wie der Knopf unter den Preisen (Marcels
     Ansage 11.8.). Er lief vorher auf width:100% mit zentrierter Schrift:
     gemessen 335 px gegen 229 px unter den Preisen, zwei verschiedene
     Knopfformen fuer denselben Weg. */
  #leistungen .leistungen-knopf-mobil { order: 3; margin-top: 28px; }
}
@media screen and (min-width: 768px) {
  .leistungen-knopf-mobil { display: none; }
}



/* ============================================================
   § 35  Kontakt - flache Fenster

   Zwei Stufen, beide an der HÖHE, nicht an der Breite: ein Laptop
   mit 800 px und ein Tablet quer mit 768 px haben dasselbe
   Platzproblem wie ein Telefon, melden aber Desktop-Breiten.

   Bis 880 px: der Rahmen gibt nach, die Karte bleibt gross.
   Bis 720 px: zusätzlich fällt die KOPFZEILE des Formulars weg
   („Marcel Schyga - dauert ungefähr eine Minute"). Sie ist der
   günstigste Verzicht: freundlich, aber keine Information, die
   zum Ausfüllen nötig wäre. Das Portrait steht ohnehin in der
   Nav-Pille daneben.

   Die Tippziele bleiben in beiden Stufen bei mindestens 44 px
   (WCAG 2.5.8) - daran wird nicht gespart.
   ============================================================ */
@media screen and (max-height: 880px) {
  /* Der Nav-Halter steht im Fluss und belegt auf Mobil schon 86 px. Ein
     grosses Sektionspolster kommt oben drauf - gemessen waren es 88 px
     zwischen Pille und Überschrift. 28 px reichen: die Überschrift steht
     dann rund 40 px unter der Pille, und der Gewinn geht an das Formular. */
  .sektion.hero:has(.kontakt-oben) { padding-top: 28px !important; padding-bottom: 20px !important; }
  #anfrage { padding: 18px 18px 18px !important; }
  .ms-kopf-bild { width: 38px; height: 38px; }
  .ms-kopf-zeile { font-size: 12px; line-height: 1.35; }
  .ms-fortschritt { margin-top: 14px; }
  .ms-zaehler { margin-top: 12px; font-size: 11px; }
  .ms-frage { font-size: 24px; margin-top: 5px; }
  .wahl-liste { row-gap: 8px; margin-top: 14px; }
  .wahl { padding: 12px 15px; font-size: 15px; }
  .wahl:has(input:checked) { padding: 11.5px 14.5px; }
  .ms-fuss { margin-top: 14px; }
}

/* Nur auf echten Telefonen: flach UND schmal (Marcels Ansage 11.8.
   „in Mobile nur"). Ein flaches Fenster auf dem Schreibtisch - etwa ein
   Laptop mit 800 px oder ein halbhoch gezogenes Fenster - behält die
   Schreibtisch-Masse. */
@media screen and (max-height: 720px) and (max-width: 767px) {
  /* Die Kopfzeile entfällt - rund 60 px, die sonst nirgends zu holen sind. */
  .ms-kopf { display: none; }
  .kontakt-text .t-h2 { font-size: 26px; }
  .kontakt-oben { gap: 14px; }
  .ms-fortschritt { margin-top: 0; }
  /* Marcels Ansage 11.8.: „leicht groesser, hier ist doch der Platz."
     Gemessen endete die Karte auf 375 x 667 bei 630 px - 37 px blieben
     ungenutzt. Frage, Auswahlzeilen und Abstaende holen sie sich. */
  .ms-frage { font-size: 23px; }
  .wahl-liste { row-gap: 9px; margin-top: 14px; }
  .wahl { padding: 13px 16px; font-size: 15px; }
  .wahl:has(input:checked) { padding: 12.5px 15.5px; }
  .ms-fuss { margin-top: 14px; }
}


/* ============================================================
   § 36  Kontakt auf dem Schreibtisch - enger an die Nav

   Marcels Befund 11.8.: „in Desktop ist zu viel Platz zwischen
   Headline und Hero."

   Gemessen bei 1.440 x 900: der Nav-Halter steht im Fluss und
   belegt 113 px, darauf kamen 40 px Sektionspolster - die
   Überschrift begann bei 153, also 60 px unter der Pille.
   Mit 16 px sind es 36 - genug Luft, ohne dass die Seite
   leer wirkt.
   ============================================================ */
@media screen and (min-width: 768px) {
  .sektion.hero:has(.kontakt-oben) { padding-top: 16px !important; }
  .kontakt-oben { gap: 24px; }
}


/* ============================================================
   Über mich, Schreibtisch: Portrait rechts - dieselbe Stelle wie
   im Hero der Startseite

   Marcels Ansage 11.8. Die Werte sind von dort ÜBERNOMMEN, nicht
   geschätzt; gemessen bei 1440 px auf `index.html`:

     Bildbreite            340 px
     Abstand rechts        0 px  (bündig an der Rasterkante)
     Versatz zur H1        +4 px (sitzt auf der Schriftlinie, nicht
                                  auf der Kastenkante der Überschrift)
     Textspalte            804 px
     Spaltenabstand        56 px  (1200 − 804 − 340)

   `minmax(0, 1fr)` statt fester 804 px, damit die Textspalte bei
   schmaleren Fenstern mitgeht - bei 1200 px Raster ergibt sich exakt
   dieselbe Rechnung.

   ACHTUNG: Diese Regel stand schon einmal hier und ist am 11.8. durch
   eine parallele Bearbeitung aus der Datei verschwunden. Wenn das
   Portrait auf Über mich plötzlich wieder über dem Namen steht, ist
   sie erneut weg - dann hier nachsehen, nicht am Markup suchen.
   ============================================================ */
@media screen and (min-width: 992px) {
  .person-hero {
    grid-template-columns: minmax(0, 1fr) 340px;
    column-gap: 56px;
    align-items: start;
    justify-items: stretch;
  }
  .person-hero-bild {
    grid-column: 2; grid-row: 1;
    width: 340px; margin-top: 4px;
  }
  .person-hero > div:not(.person-hero-bild) { grid-column: 1; grid-row: 1; }
}


/* ============================================================
   § 37  Kontaktseite - Luft unter der Karte

   Der Fuss-CTA und die Kontakt-Überschrift trugen kurzzeitig
   denselben Satz („Lass uns loslegen."), auf dem Schreibtisch
   beide gleichzeitig im Bild. Ich hatte daraufhin den Fuss-CTA
   auf dieser Seite ausgeblendet - Marcels Ansage: „Footer-CTA
   ausblenden ist nicht die Lösung."

   Richtig ist es am Wortlaut: die Überschrift heisst jetzt
   „Dein Erstgespräch.", der Fuss behält sein „Lass uns
   loslegen." Beide dürfen nebeneinander stehen.

   Geblieben ist nur die Luft unter der Karte, damit der Fuss
   nicht direkt an ihr klebt.
   ============================================================ */
@media screen and (min-width: 768px) {
  .sektion.hero:has(.kontakt-oben) { padding-bottom: 96px !important; }
}


/* ============================================================
   § 38  Kontakt-Formular auf Mobil - Schritt 2 und 3 in ein Fenster

   Marcels Ansage 11.8.: „Schritt 2 und 3 so anpassen, dass alles
   im selben Viewport bleibt, notfalls Text kürzen."

   Schritt 1 passte bereits; die beiden folgenden sind länger:
   Schritt 2 trägt zwei Auswahlfelder, eine lange Frage und ein
   Textfeld, Schritt 3 vier Eingabefelder plus Einwilligung.

   Gekürzt wird an den Abständen und am Textfeld, nicht an den
   Tippzielen - die bleiben bei 44 px (WCAG 2.5.8).

   Ausserdem: der Zurück-Link stand mit 16 px Zeilenabstand plus
   eigener Zeile unter dem Knopf und wirkte abgesetzt. 10 px
   binden ihn an den Knopf, ohne dass er zum Knopf wird.
   ============================================================ */
@media screen and (max-width: 767px) {
  /* Die Spalten von `.reihe` untereinander sind auf Mobil ohnehin
     gestapelt - der Zeilenabstand darf enger sein. */
  .ms-schritt > div[style*="row-gap"] { row-gap: 12px !important; margin-top: 18px !important; }
  .feld-gruppe { margin-top: 0; }
  .ms-hinweis { margin-top: 4px; }

  /* Das Textfeld ist der grösste Einzelposten in Schritt 2. */
  /* Inline steht `min-height:98px` am Element - nur !important gewinnt. */
  .ms-schritt .feld-text { min-height: 84px !important; }

  /* Die Einwilligungszeile in Schritt 3. */
  .ms-einwilligung, .ms-schritt label[for*="dsgvo"], .ms-schritt .feld-check { margin-top: 4px; }

  .ms-fuss { margin-top: 14px; row-gap: 10px; }
  .ms-zurueck { padding: 4px 0; }
}


/* ============================================================
   § 39  Abgeschnittener Text bekommt Auslassungspunkte

   Marcels Ansage 11.8.: „oder … hinzufügen überall wo es zu
   lang ist." Auf schmalen Feldern brach der Platzhalter vorher
   mitten im Wort ab („Vor- und Nach", „deine@adress") - ohne
   jedes Zeichen, das sagt: hier fehlt etwas.

   `text-overflow: ellipsis` wirkt auf dem Feld selbst und
   damit auch auf seinen Platzhalter. Bei Labels braucht es
   zusätzlich `white-space: nowrap`, sonst brechen sie um statt
   zu kürzen - der Umbruch ist dort aber erwünscht, deshalb
   greift die Regel nur für die INHALTE der Felder.
   ============================================================ */
.feld, .feld-select {
  text-overflow: ellipsis;
}
.feld::placeholder { text-overflow: ellipsis; }

/* ============================================================
   § 40  Zurück-Link näher an den Knopf

   Marcels Befund: „Zurück überall auf Mobile bisschen höher,
   wirkt deplatziert." Er stand mit 16 px Zeilenabstand unter
   dem Knopf und dazu mit dem Aussenabstand des Fusses - in
   Summe rund 30 px, was ihn absetzte statt anzubinden.
   ============================================================ */
@media screen and (max-width: 767px) {
  .ms-fuss { row-gap: 8px; margin-top: 12px; }
  .ms-zurueck { padding: 2px 0; }
}


/* ============================================================
   § 41  Zurück direkt unter Weiter

   Marcels Ansage: „den Zurück-Button würde ich direkt unter dem
   Weiter-Button platzieren."

   `marcy.css` stellt den Fuss auf Mobil als `column-reverse` mit
   `align-items: stretch` - der Knopf füllt die Breite, der
   Zurück-Link darunter ebenfalls und wirkte dadurch wie ein
   zweiter Knopf. Jetzt sitzt er mittig und direkt darunter, mit
   6 px Abstand.
   ============================================================ */
@media screen and (max-width: 767px) {
  .ms-fuss { row-gap: 6px; margin-top: 14px; }
  .ms-zurueck { align-self: center; padding: 6px 12px; }
}

/* ============================================================
   Markierte Überschriften: Zeilenabstand für die Unterlängen

   Gemessen bei 390 px, „Kennst du folgende <mark>Herausforderungen</mark>?":
     font-size 28, line-height 32,2 (1,15em)
     Zeile 1 endet bei 675 px, die Neonfläche der Zeile 2 beginnt bei 673
     → 2 px Überlappung, und genau dort sitzt das „g" von „folgende".

   Die Neonfläche einer Zeile deckt die volle Schriftbox ab; bei 1,15em
   Zeilenabstand ragt die Unterlänge der Zeile darüber hinein und wird
   verdeckt. 1,3em schafft die nötige Luft, ohne die Überschrift
   auseinanderzuziehen.

   Gilt NUR für Überschriften mit Markierung - unmarkierte behalten den
   engen Satz aus marcy.css. `:has()` trägt in allen Zielbrowsern; wo es
   fehlt, bleibt es beim bisherigen Verhalten (2 px Überlappung), also
   kein Bruch.
   ============================================================ */
h1:has(.markiert), h2:has(.markiert), h3:has(.markiert) { line-height: 1.3; }

/* ============================================================
   Der Hero füllt auf dem Handy den ersten Bildschirm allein

   Marcels Ansage 11.8.: In keinem Viewport sollen Hero und die
   Folgesektion gleichzeitig zu sehen sein - „Kennst du folgende
   Herausforderungen?" nahm dem Hero die Dominanz.

   Gemessen bei 390 x 844: Hero endete bei 602 px, die Überschrift der
   Folgesektion stand ab 642 px - sie ragte 202 px in den ersten
   Bildschirm.

   `100svh` statt `100vh`: `vh` rechnet auf iOS mit eingeklappter
   Adressleiste und wäre beim Laden zu hoch - dann schöbe der Hero die
   Folgesektion erst recht ins Bild, sobald die Leiste einfährt. `svh`
   ist die kleinste Fassung und damit die sichere.

   Der Inhalt wird mittig gesetzt, statt oben zu kleben: sonst entstünde
   unter der Logo-Zeile ein Loch von rund 240 px.
   ============================================================ */
@media screen and (max-width: 767px) {
  .sektion.hero {
    min-height: 100vh;          /* Rückfall für Browser ohne svh */
    min-height: 100svh;
    display: flex; flex-direction: column; justify-content: center;
  }
}


/* ============================================================
   § 42  Der Weiter-Knopf steht fest - an jeder Stelle

   Marcels Ansage 11.8.: „vielleicht fixiert man den Weiter-Button
   im Formular so, dass die Stelle immer gleich bleibt. Zwischen
   Schritt 1, 2 und 3 springt er in Mobile."

   Die Ursache lag tiefer als gedacht: JEDER Schritt trägt seinen
   eigenen `.ms-fuss` mit eigenem Knopf, und der sitzt direkt
   hinter dem Inhalt. Weil die drei Schritte unterschiedlich hoch
   sind, wanderte der Knopf mit - gemessen 570 / 519 / 492 px,
   also bis zu 78 px Sprung.

   Alle drei Schritte liegen ohnehin im selben Rasterfeld (1 / 1)
   und sind damit gleich hoch. Fehlt nur, den Fuss an den UNTEREN
   Rand zu binden statt an den Inhalt: Schritt als Spalten-Flex,
   Fuss mit `margin-top: auto`.

   Damit steht der Knopf in allen drei Schritten an derselben
   Stelle - mit dem Daumen ohne Nachsuchen erreichbar.
   ============================================================ */
.ms-schritt {
  display: flex; flex-direction: column;
  height: 100%;
}
.ms-schritt > .ms-fuss { margin-top: auto; }

/* Der Zurück-Link direkt unter dem Knopf, nicht abgesetzt. Auf dem
   Schreibtisch bleibt er links daneben (`space-between` aus marcy.css). */
@media screen and (max-width: 767px) {
  .ms-fuss { row-gap: 4px !important; margin-top: 16px; }
  .ms-zurueck { align-self: center; padding: 4px 12px; margin: 0; }
}


/* Der Zurück-Link belegt auch dort Platz, wo es ihn nicht gibt.

   In Schritt 1 fehlt er - `marcy.css` setzt `.ms-zurueck[hidden]
   { display: none }`. Weil der Fuss auf Mobil `column-reverse` ist
   und über `margin-top: auto` unten sitzt, war der Fuss dort 31 px
   kürzer und der Knopf entsprechend tiefer: gemessen 613 gegen 582.

   `visibility: hidden` statt `display: none` hält den Platz frei.
   Das Element bleibt damit aus der Tab-Reihenfolge und aus dem
   Zugänglichkeitsbaum - in Schritt 1 gibt es kein Zurück, und das
   soll auch niemand angeboten bekommen. */
@media screen and (max-width: 767px) {
  .ms-zurueck[hidden] {
    display: block !important;
    visibility: hidden;
    pointer-events: none;
  }
}


/* ============================================================
   § 43  Die flachsten Telefone (bis 700 px Höhe)

   Der Platzhalter für den Zurück-Link aus § 42 macht Schritt 1
   um 31 px höher - nötig, damit der Knopf nicht springt, aber auf
   dem iPhone SE (375 x 667) ragte die Karte damit 45 px über den
   Rand.

   Die 45 px kommen aus vier kleinen Posten statt aus einem
   grossen: Vorlauf, Zeilenabstand, Überschrift, Auswahlzeilen.
   Die Tippziele bleiben bei 44 px (WCAG 2.5.8).
   ============================================================ */
@media screen and (max-height: 700px) and (max-width: 767px) {
  .sektion.hero:has(.kontakt-oben) { padding-top: 16px !important; padding-bottom: 12px !important; }
  .kontakt-oben { gap: 8px; }
  .kontakt-text .t-h2 { font-size: 22px; }
  .ms-frage { font-size: 20px; }
  .wahl { padding: 11px 14px; }
  .wahl:has(input:checked) { padding: 10.5px 13.5px; }
  .wahl-liste { row-gap: 7px; margin-top: 12px; }

  /* Schritt 3 ist der höchste - vier Eingabefelder, Labels und die
     Einwilligung. Gemessen ragte er auf 375 x 667 noch 21 px über den
     Rand, nachdem Schritt 1 schon passte. */
  .ms-schritt > div[style*="row-gap"] { row-gap: 8px !important; margin-top: 12px !important; }
  .feld { padding: 9px 12px; }
  .feld-label { font-size: 12px; }
  .ms-schritt .feld-text { min-height: 72px !important; }

  /* Letzte 40 px auf 375 x 667: Kopfzeile ist hier ohnehin schon weg
     (§ 35), also geben Fortschritt, Zähler und Frage nach. Die
     Auswahlzeilen bleiben bei 44 px. */
  .ms-fortschritt { margin-top: 0; }
  .ms-zaehler { margin-top: 6px; font-size: 10px; }
  .ms-frage { font-size: 18px; margin-top: 2px; }
  #anfrage { padding: 14px 14px 14px !important; }
  .ms-fuss { margin-top: 10px; }
}

/* ============================================================
   § 46  Mobiler Hero: Vollhoehe zurueckgenommen, Logos groesser
   Marcels Ansage 12.8.

   NIMMT ZWEI BESCHLUESSE VOM 11.8. ZURUECK - beide standen im
   selben Ziel („der Hero soll den ersten Bildschirm allein
   fuellen"), und beide erzeugten genau das, was jetzt stoert:

   1. `min-height: 100svh` mit `justify-content: center`
      (Block „Der Hero fuellt auf dem Handy den ersten Bildschirm
      allein"). Gemessen bei 375 x 812: Hero 812 px hoch, Inhalt
      nur 446 px - 159 px Leere ueber der H1 und 191 px unter der
      Logo-Zeile. Das war der „grosse Abstand zu den Partner-Logos".
   2. Logo-Hoehen um ein Viertel zurueck (Block „Mobil: Logo-Band
      kleiner"). Sie waren klein, DAMIT das Band in den vollen
      Bildschirm passt. Ohne die Vollhoehe entfaellt der Grund.

   Folge, die bewusst in Kauf genommen wird: die Folgesektion
   „Kennst du folgende Herausforderungen?" kann jetzt wieder in den
   ersten Bildschirm ragen. Genau das sollte der 11.8.-Beschluss
   verhindern. Wenn das wieder stoert, ist es eine Entscheidung
   zwischen beidem - nicht beides gleichzeitig zu haben.
   ============================================================ */
@media screen and (max-width: 767px) {
  /* Hoehe wieder aus dem Inhalt statt aus dem Fenster. */
  .sektion.hero {
    min-height: 0;
    justify-content: flex-start;
  }

  /* Logos: von 75 % auf rund 88 % der Rechnerhoehen. Die
     Verhaeltnisse untereinander bleiben, sie sind aus den
     Seitenverhaeltnissen hergeleitet (startseite.md § 2). */
  .laufband-satz img                { height: 30px; }
  .laufband-satz .logo-niccos       { height: 25px; }
  .laufband-satz .logo-gw           { height: 35px; }
  .laufband-satz .logo-eisfive      { height: 35px; }
  .laufband-satz .logo-selectliving { height: 18px; }
}

/* ============================================================
   § 47  Kontaktformular: Ueberschrift und Knopfabstand
   Marcels Ansage 12.8.

   1 · DIE UEBERSCHRIFT IST NICHT MEHR ZENTRIERT.
   `.kontakt-text` stand auf `text-align: center` und 720 px
   Breite, das Formular auf 560 px. Gemessen bei 375 px: die H1
   begann bei x 64, das Formular bei x 20 - sie war gegenueber
   ihrem eigenen Inhalt eingerueckt („soll nicht verschoben sein").
   Jetzt linksbuendig und auf dieselbe Breite wie das Formular,
   damit beide auf einer Kante stehen. Das ist ausserdem die
   Regel des Restes der Website: jede Ueberschrift beginnt an der
   Rasterkante, keine steht zentriert.

   2 · DER KNOPF BERUEHRT DEN INHALT NICHT MEHR.
   `.ms-fuss` haengt per `margin-top: auto` am unteren Rand (§ 42).
   Fuellt ein Schritt den Kasten aber ganz aus, kollabiert `auto`
   auf 0 - und der neone Knopf klebte an der letzten weissen
   Optionskarte. Gemessen: Schritt 1 = 0 px, Schritt 2 = 63,
   Schritt 3 = 72 (Rechner) bzw. 0 / 38 / 65 (Telefon).
   `padding-top` wirkt zusaetzlich zu `margin-top: auto` und
   sichert den Mindestabstand, ohne die Bindung nach unten
   aufzugeben.
   ============================================================ */
.kontakt-text {
  text-align: left;
  max-width: 560px;
  width: 100%;
}
.ms-schritt > .ms-fuss { padding-top: 28px; }

@media screen and (max-width: 767px) {
  .ms-schritt > .ms-fuss { padding-top: 20px; }
}
