/* ===========================================================================
   VARIANTE A — Bildband + eingelegter Kasten
   Prinzip MLP: niedriges, vollbreites Bildband.
   Prinzip Imperia: Text links, Objektbild rechts, Headline zweizeilig mit
   farbig abgesetzter zweiter Zeile.
   Der Kasten ist bewusst breit und flach — er soll das Band rahmen,
   nicht ersetzen.
   =========================================================================== */

.heroA {
  --panel-pad: clamp(1.8rem, 5vw, 5rem);

  /* Der Schriftgrad der Ueberschrift und die Hoehe EINER ihrer Zeilen
     (Zeilenabstand 1.1). Beides als Token, weil die Lage des Objektbildes
     rechnerisch daran haengt — siehe .heroA__figure.
     --h1-fest ist der Grad, bei dem die Bildlage vom Kunden abgenommen
     wurde („Das Bild bleibt genau in derselben Position. Das ist sehr
     gut."). Er ist der Bezugspunkt und darf nicht mitwandern, wenn die
     Ueberschrift groesser gestellt wird. */
  /* EIN TICK KLEINER — 01.09.2026, Kundenwunsch nach dem Livegang: „Die
     Headline ragt leicht in das Bild hinein." Die neue Ueberschrift aus dem
     Briefing ist zweizeilig und laenger als die alte; 2,95 -> 2,7.
     Der Bildzug (.heroA__figure, -2 Zeilen) haengt an derselben Variable
     und rechnet sich von selbst nach. */
  --h1-groesse: clamp(1.9rem, 2.7vw, 2.7rem);
  --h1-fest:    clamp(1.9rem, 2.75vw, 2.75rem);
  --h1-zeile:      calc(1.1 * var(--h1-groesse));
  --h1-zeile-fest: calc(1.1 * var(--h1-fest));

  position: relative;
  /* NAVY ALS GRUND, WEISSER MARMORKASTEN DARAUF.
     Der Grund war zuerst weiss, dann Navy, kurz der Sandton des Knopfes und
     seit dem 24.08.2026 wieder Navy — so vom Kunden festgelegt. Der
     Marmorkasten steht damit frei auf dunklem Grund, statt wie urspruenglich
     nach unten in weisses Seitenpapier auszulaufen. Die weisse Kante unter
     dem Bildband traegt auf diesem Grund am staerksten: Weiss auf Navy sind
     17.63:1, auf Sand waren es 1.94:1. */
  /* NUR background-color. Der Abschnitt traegt seit dem 30.08.2026 die
     Klasse `fl-navy900` aus base.css: die Flaeche bleibt in ihrer eigenen
     Farbfamilie und atmet von #0A192E auf #16283F — 17 Einheiten ueber die
     volle Hoehe, also weit unter der Regel von 0,03 je Bildpunkt. Das ist
     kein Uebergang zu einer anderen Farbe, sondern derselbe Fall wie der
     Verlauf im FAQ-Kasten. Die Kante zur Cremeflaeche darunter bleibt
     sauber; sie liegt ohnehin unter dem geschwungenen Rand von .ref.
     Kurzschreibweise waere hier falsch — sie wuerde die Klasse
     ueberschreiben, weil hero-a.css nach base.css geladen wird. */
  background-color: var(--navy-900);
  /* MEHR LUFT NACH UNTEN als frueher, und zwar deutlich.

     Die Section darunter zieht sich mit ihrem geschwungenen Rand um bis zu
     92 px hier herein. Dieser Abstand muss GROESSER sein als diese Kurve,
     sonst legt sie sich auf den weissen Marmorkasten — und Creme auf Weiss
     ist keine sichtbare Kante. Genau das war beim ersten Versuch der Fall:
     nachgemessen blieben nur 15 px, die Kurve war ausschliesslich links und
     rechts neben dem Kasten zu erkennen.

     Mit 14vh bleiben ueber der Kurve rund 40 px Navy stehen — sie zeichnet
     sich damit ueber die ganze Breite ab, so wie in der Vorlage des Kunden.
     Faustregel beim Nachstellen: dieser Wert minus --ref-bogen-h aus
     referenzen.css ist der sichtbare Navy-Streifen. */
  padding-bottom: clamp(7rem, 14vh, 11rem);
}

/* --- Bildband ------------------------------------------------------------- */
.heroA__band {
  position: relative;
  height: clamp(340px, 48vh, 540px);
  overflow: hidden;
  background: var(--navy-800);
  /* WEISSE KANTE UNTER DEM BAND (Kundenwunsch 24.08.2026, nachgeschaerft:
     „deutlich dicker … mehr in das Navy Blue hinein").

     Bewusst ein Schlagschatten ohne Weichzeichnung und ohne Streuung, nur
     mit Versatz nach unten: das zeichnet einen sauberen weissen Streifen
     genau in dieser Hoehe UNTERHALB des Bandes — also im Navy, nicht im
     Film. Eine Umrandung ginge nicht: `box-sizing: border-box` aus dem
     Reset wuerde sie nach INNEN legen und damit den Film beschneiden, und
     `overflow: hidden` schneidet alles ab, was von innen herauswill.
     Der eigene Schatten eines Elements wird davon nicht erfasst.

     Der Streifen laeuft ueber die volle Breite, sichtbar ist er aber nur
     LINKS UND RECHTS des Hero-Kastens — der liegt auf z-index 3 darueber
     und deckt die Mitte ab. Genau das war gemeint. */
  box-shadow: 0 clamp(6px, 0.7vh, 9px) 0 0 #FFFFFF;
}
/* Standbild und Film liegen deckungsgleich übereinander — gleicher Ausschnitt,
   gleiche Tonung. Beide sind absolut gesetzt; der Film steht im Quelltext
   HINTER dem Bild und deckt es deshalb ab, solange er läuft. Bewusst OHNE
   z-index: der abdunkelnde Verlauf .heroA__band::after muss über beiden
   liegen, und das tut er nur, solange hier keine Stapelordnung aufgemacht
   wird. */
.heroA__band img,
.heroA__band video {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 112%;
  object-fit: cover;
  object-position: 50% 46%;
  transform: translateY(var(--shift, 0));
  /* Das Band ist Tonträger — hell und scharf bleibt nur das Objektbild. */
  filter: saturate(0.24) contrast(1.12) brightness(0.76);
  will-change: transform;
}

/* Der Film ist reine Kulisse: die Bildbeschreibung trägt das Standbild
   darunter, angefasst werden soll er nicht. */
.heroA__band video { pointer-events: none; }

/* Ruhige Darstellung: eine dauernd laufende Kamerafahrt im Hintergrund ist
   für empfindliche Menschen belastend. Wer im Betriebssystem weniger
   Bewegung angefordert hat, sieht das Standbild — der Film wird ausgeblendet.
   Das Skript im Hero hält ihn zusätzlich an; diese Regel greift auch dann,
   wenn kein JavaScript läuft. */
@media (prefers-reduced-motion: reduce) {
  .heroA__band video { display: none; }
}
.heroA__band::after {
  content: '';
  position: absolute;
  inset: 0;
  /* EIN durchgehender vertikaler Verlauf — ein zweiter, seitlicher Verlauf
     erzeugte eine sichtbare Kante bei ~65 % Breite. */
  background: linear-gradient(to bottom,
    rgba(10,25,46,0.66) 0%, rgba(10,25,46,0.40) 44%, rgba(10,25,46,0.52) 100%);
  pointer-events: none;
}

/* --- Der eingelegte Kasten ------------------------------------------------ */
.heroA__panel {
  position: relative;
  z-index: 3;
  /* Flacher Überstand: der Kasten sitzt tiefer, damit mehr Band sichtbar
     bleibt. Er beißt nur noch mit knapp einem Drittel seiner Höhe hinein. */
  margin: clamp(-150px, -14vh, -95px) auto 0;
  max-width: 1460px;
  width: calc(100% - var(--gutter) * 2);
  /* DECKENDES WEISS ALS UNTERLAGE. Der Kasten hatte hier bisher gar keine
     eigene Farbe — er lebte ausschliesslich von der Marmorlage darueber.
     Seit die auf 70 Prozent zurueckgenommen ist, braucht es diese Unterlage:
     ohne sie schiene durch die abgeschwaechte Lage das Navy des Grundes
     hindurch und der Kasten wuerde schmutzig. */
  background: #FFFFFF;
  display: grid;
  /* Textspalte dominiert — der Satz soll in die Breite laufen, nicht stapeln */
  grid-template-columns: minmax(0, 58fr) minmax(0, 42fr);
  /* WAAGERECHT ja, SENKRECHT nein. Solange das Panel eine einzige Zeile
     hatte, war `gap` nur der Abstand zwischen Text und Bild. Seit der Kopf
     eine eigene Zeile bekommen hat, wirkt derselbe Wert auch nach unten und
     hat Ueberschrift, Subline und Bild um 43 px auseinandergezogen. Genau
     das war die Luecke, die der Kunde gesehen hat. */
  column-gap: clamp(1.5rem, 3vw, 3rem);
  row-gap: 0;
  align-items: center;
  /* Rundum rund: der Kasten laeuft nicht mehr aus, er steht. */
  border-radius: var(--radius-img);
  isolation: isolate;
}

/* Der Kasten ist in drei Zonen aufgebaut:
   oben deckendes Weiß (er liegt auf dem dunklen Bildband und muss decken),
   in der Mitte die Marmorierung,
   unten löst er sich in das Seitenpapier auf — dadurch gibt es keine
   sichtbare Kante und keine optisch getrennten Abschnitte.

   Bewusst ohne mask-image/mask-composite aufgebaut: Mehrschicht-Masken mit
   Composite-Modus rendern in Safari und älteren Engines abweichend. Hier
   liegt stattdessen der Marmor als Vollfläche unten und wird von oben mit
   ganz normalen Verläufen abgedeckt — das funktioniert überall gleich. */

/* Schicht 1: Marmor, volle Fläche */
.heroA__panel::after {
  content: '';
  position: absolute;
  inset: 0;
  z-index: 0;
  pointer-events: none;
  border-radius: inherit;
  /* Calacatta mit feiner, scharf gezeichneter Äderung. Bewusst OHNE
     Multiply-Verdopplung: die hat die Fläche flächig angeschmutzt statt die
     Adern zu schärfen — das sah nach Schmutzspur aus, nicht nach Stein. */
  background: #FFFFFF url('../img/marble2.jpg') center / cover no-repeat;
  /* AUF 70 PROZENT ZURUECKGENOMMEN am 24.08.2026. Kundenwortlaut: „Die
     Marmoroptik muss um 30 % reduziert werden, sonst konkurriert die
     Marmoroptik zu stark mit dem Text." Die Aederung bleibt sichtbar,
     tritt aber hinter die Schrift zurueck. Ueber die Deckkraft der ganzen
     Lage geloest und nicht ueber ein aufgehelltes Bild — so bleibt die
     Datei unangetastet und der Wert ist an einer Stelle nachstellbar. */
  opacity: 0.7;
}

/* Schicht 2: Verläufe darüber.
   REIHENFOLGE IST ENTSCHEIDEND: In der background-Kurzschreibweise liegt der
   zuerst genannte Verlauf oben. Der senkrechte muss deshalb zuerst stehen —
   sonst überschreibt das deckende Weiß des waagerechten die Auflösung ins
   Seitenpapier auf der rechten Seite, und der Kasten bekommt unter dem Bild
   wieder eine sichtbare Kante. */
/* Schicht 2: Verläufe darüber. Wieder der Aufbau von vorher — oben
   deckendes Weiß, in der Mitte der Marmor, waagerecht zur Bildspalte hin
   zurückgenommen.

   EIN UNTERSCHIED zur alten Fassung: die letzten beiden Haltepunkte liefen
   auf `--paper-warm` aus, damit sich der Kasten unten ins weiße Seitenpapier
   auflöst. Das Papier ist jetzt navy — derselbe Verlauf würde den Kasten
   also nicht mehr auflösen, sondern unten einen weißen Balken vor dunklem
   Grund stehen lassen. Die beiden Stopps enden deshalb im Marmor statt im
   Papier; der Kasten bleibt bis zur Unterkante Marmor und hört dort sauber
   an seiner Rundung auf.

   REIHENFOLGE IST WEITERHIN ENTSCHEIDEND: In der Kurzschreibweise liegt der
   zuerst genannte Verlauf oben. */
.heroA__panel::before {
  content: '';
  position: absolute;
  inset: 0;
  z-index: 1;
  pointer-events: none;
  border-radius: inherit;
  background:
    linear-gradient(to bottom,
      #FFFFFF 0%,
      #FFFFFF 11%,
      rgba(255,255,255,0.42) 28%,
      rgba(255,255,255,0.42) 56%,
      rgba(255,255,255,0.34) 76%,
      rgba(255,255,255,0.30) 91%,
      rgba(255,255,255,0.30) 100%),
    linear-gradient(100deg,
      rgba(255,255,255,0) 34%,
      rgba(255,255,255,0.78) 62%,
      #FFFFFF 80%);
}

/* Umrandung als eigene Lage: oben und an den Seiten sichtbar, nach unten
   ausblendend. Eine geschlossene Linie würde die Auflösung des Kastens in
   die Seite zunichtemachen — deshalb die Maske. */
.heroA__rahmen {
  position: absolute;
  inset: 0;
  z-index: 3;
  pointer-events: none;
  /* Rundum, ohne Maske: der Kasten laeuft nicht mehr ins Papier aus,
     sondern steht als Flaeche auf Navy. Eine unten offene Linie waere
     dort ein Fehler. */
  border: 1px solid rgba(16, 41, 73, 0.22);
  border-radius: inherit;
}

.heroA__text, .heroA__figure { position: relative; z-index: 2; }

/* ---------------------------------------------------------------------------
   DER KOPF LIEGT UEBER BEIDEN SPALTEN.

   Kundenwunsch 24.08.2026: „Aus Einkommen wird Eigentum. Aus Eigentum wird
   Vermögen." gehoert in EINE Zeile — „dann geht quasi die Zeile ueber das
   Bild hin weiter." In der 58fr-Textspalte war der Satz dafuer zu lang und
   brach in zwei Zeilen.

   Der Kopf bekommt deshalb eine eigene Rasterzeile ueber die volle Breite
   (`grid-column: 1 / -1`). Darunter laeuft die alte Aufteilung weiter: Text
   links, Bild rechts. Weil der Kopf ueber dem Bild sitzt und nicht auf ihm,
   steht die Zeile weiter auf weissem Grund — kein Text auf Foto, kein
   Kontrastproblem.

   Nachgemessen bei 1440 px: der Satz braucht 931 px, die Panelbreite bietet
   rund 1300 px. Ab 980 px stapelt das Panel ohnehin einspaltig, dort darf
   und muss die Zeile brechen.
--------------------------------------------------------------------------- */
.heroA__kopf {
  grid-column: 1 / -1;
  position: relative;
  z-index: 2;
  /* DER KOPF FUEHRT DIESELBEN SPALTEN WIE DER KASTEN.
     Nur so laesst sich der Eyebrow exakt ueber dem Bild ausrichten: er sitzt
     in Spalte 2 und bekommt denselben rechten Innenabstand wie
     .heroA__figure — sein Kasten deckt sich damit auf den Pixel mit dem
     Bild, und `text-align: center` zentriert ihn wirklich UEBER DEM BILD
     und nicht ueber der Rasterspalte, die rechts breiter ist als das Bild.

     Seitlich deshalb ohne Polsterung: die tragen Eyebrow und Ueberschrift
     jetzt selbst, sonst waeren die Spalten gegen die des Kastens
     verschoben. */
  display: grid;
  grid-template-columns: minmax(0, 58fr) minmax(0, 42fr);
  column-gap: clamp(1.5rem, 3vw, 3rem);
  padding: var(--panel-pad) 0 0;
}

/* Der Eyebrow traegt seit dem 24.08.2026 den Sandton des Knopfes
   „Vorteile entdecken" (Kundenwunsch). Es ist die vertiefte Fassung
   --sand-schrift; der reine Sand misst als Schrift auf Weiss 1.94:1.

   OFFEN UND BEWUSST SO: gemessen sind 3.39:1. Fuer kleine Schrift verlangt
   die Regel 4.5:1. Der Ton, den der Eyebrow vorher trug (--gold, #A8874F),
   lag mit 3.36:1 aber praktisch gleich — es ist also kein Rueckschritt,
   sondern derselbe Lesewert im passenden Farbton. Wer das sauber
   aufloesen will, muss entweder den Eyebrow groesser setzen oder auf
   --gold-text (#86693A, 4.82:1) gehen; dann trifft er die Knopffarbe
   allerdings sichtbar nicht mehr. */
.heroA__eyebrow {
  /* NAVY seit dem 24.08.2026 (Kundenwunsch). Damit ist die Zeile zum ersten
     Mal richtig lesbar: 14.65:1 gegen den weissen Kasten. Vorher trug sie
     erst Gold (3.36:1) und dann den vertieften Sandton (3.39:1) — beide
     lagen unter den 4.5:1, die fuer eine Zeile dieser Groesse gelten. Das
     Fetten auf 600 half dem Auge, am Messwert aber nicht. Der Wechsel auf
     Navy loest das. */
  color: var(--navy-800);
}

.heroA__text {
  display: grid;
  /* OBEN statt MITTIG (Kundenwunsch 24.08.2026: „setze die Subline auch
     weiter nach oben"). Vorher stand hier `center`: der Textblock wurde
     gegen das hohe Bild in der Nachbarspalte zentriert, und weil das Bild
     hoeher ist als Subline plus Knoepfe, entstand darueber eine grosse
     Luecke. Mit `start` haengt der Text unmittelbar unter der Ueberschrift.
     Gemessen bei 1440 px: 72 px Luecke vorher, 12 px jetzt. */
  align-content: start;
  /* OBEN statt MITTIG IN DER RASTERZEILE. Der Kasten setzt
     `align-items: center`; die Zeilenhoehe gibt das Bild vor, und weil der
     Textblock niedriger ist, wurde er darin zentriert — daher die Luecke
     ueber der Subline. `align-self: start` haengt ihn oben ein. */
  align-self: start;
  /* Ohne Abstand nach oben. Seit die Wechselzeile entfallen ist, ruecken
     Subline und Knoepfe auf Kundenwunsch dorthin nach, wo sie stand.

     LINKS: dieselbe Kante wie die Ueberschrift, naemlich --panel-pad.
     Kurzzeitig stand hier eine zur Laufzeit gemessene Kante — solange die
     Ueberschrift mittig stand, liess sich ihr erster Buchstabe nicht in CSS
     ausdruecken. Seit sie linksbuendig an derselben Kante ansetzt, ergibt
     sich die Flucht von selbst; die Messung in site.js ist damit entfallen. */
  padding: 0 0 var(--panel-pad) var(--panel-pad);
}

/* ---------------------------------------------------------------------------
   Die drei Bausteine, die der Wording-Master neu vorgibt: Eyebrow über der
   Überschrift, Hinweis unter den Knöpfen, Gütezeile am Fuß.

   Sie sind ergänzt, nicht gestaltet. Der Eyebrow ist die vorhandene
   .kicker-Klasse; Hinweis und Gütezeile nehmen Schriftgrad und Farbe aus dem
   Satzbild, das im Panel ohnehin gilt. Kein neuer Ton, keine neue Größe,
   keine Umrandung — die Hero-Geometrie bleibt, wie sie war.
--------------------------------------------------------------------------- */
.heroA__eyebrow {
  margin-bottom: 14px;
  /* Mittig ueber die volle Kastenbreite und kraeftiger gesetzt
     (Kundenwunsch 24.08.2026: „muss mittig in den Kasten … und soll ein
     bisschen dicker geschrieben werden, damit man es besser lesen kann").
     .kicker steht auf 400; 600 ist der Sprung, der bei gesperrten Versalien
     in Cormorant wirklich traegt. Das hebt die Lesbarkeit spuerbar — den
     gemessenen Kontrast von 3.39:1 aendert es allerdings nicht, dafuer ist
     die Zeile mit rund 14 px zu klein. */
  /* RECHTS, UEBER DEM BILD (Kundenwunsch 24.08.2026: „Ich will, dass
     ‚Immobilien als Kapitalanlage' rechts ueber das Bild kommt.").
     Der Kopf laeuft ueber beide Spalten; rechtsbuendig endet der Eyebrow
     damit auf derselben Senkrechten wie die rechte Kante des Objektbilds —
     beide sitzen am Innenabstand des Kastens. */
  grid-column: 2;
  text-align: center;
  /* Deckt sich mit dem rechten Innenabstand von .heroA__figure — dadurch
     ist der Kasten des Eyebrows genau der Kasten des Bildes. */
  padding-right: var(--panel-pad);
  font-weight: 600;
}

/* Der Hinweis „Persönlich. Unverbindlich. Individuell auf deine Situation
   abgestimmt." stand hier bis zum 24.08.2026 und ist auf Kundenwunsch
   entfernt. Er steht weiterhin so im Wording-Master, Abschnitt 2 — wer ihn
   zurueckholt, findet die Regel in der Versionsgeschichte. */

/* Die Gütezeile schließt das Panel ab. Eine goldene Haarlinie davor setzt sie
   vom Hinweis ab, ohne einen zweiten Absatz aufzumachen — dieselbe Sprache
   wie die .rule-gold im übrigen Projekt. */
.heroA__guete {
  margin-top: 22px;
  padding-top: 18px;
  border-top: 1px solid var(--line-gold);
  font-size: clamp(0.86rem, 0.96vw, 0.96rem);
  letter-spacing: 0.06em;
  color: var(--ink-soft);
}

.heroA__h1 {
  /* Zwei Saetze, die miteinander umbrechen duerfen — `text-wrap: balance`
     aus .display verteilt sie.
     Am 24.08.2026 einen Tick groesser gestellt (Kundenwunsch): von
     clamp(1.9rem, 2.75vw, 2.75rem) auf clamp(2rem, 2.95vw, 2.95rem), also
     rund 7 Prozent. Nachgemessen bleibt der Satz damit bei 1024 px und
     darueber weiterhin EINZEILIG — das ist die Grenze, die nicht fallen
     darf. */
  font-size: var(--h1-groesse);
  /* ZWEIZEILIG, LINKSBUENDIG, ALS BLOCK MITTIG (Kundenwunsch 24.08.2026).

     Beide Zeilen beginnen auf derselben Kante — dieselbe Kante, an der auch
     Subline, Knoepfe und Guetezeile fluchten. Der Block als Ganzes steht
     mittig im Kasten.

     `width: max-content` macht den Block genau so breit wie seine laengste
     Zeile; `margin-inline: auto` zentriert ihn. Mit `text-align: center`
     waere jede Zeile fuer sich zentriert und die kuerzere zweite wuerde
     eingerueckt stehen — dann gaebe es keine gemeinsame linke Kante mehr,
     und die Flucht mit der Subline waere hin.

     `max-width: 100%` ist die Reissleine: unterhalb von rund 980 px passt
     die laengste Zeile nicht mehr, dort bricht der Satz normal um. */
  text-align: left;
  grid-column: 1 / -1;
  /* Dieselbe Kante wie .heroA__text darunter: beide setzen bei
     --panel-pad ab der linken Kastenkante an. Damit fluchten beide Zeilen
     der Ueberschrift mit Subline, Knoepfen und Guetezeile — ohne Messung,
     weil hier nichts mehr zentriert ist. */
  padding-inline: var(--panel-pad);
  line-height: 1.1;
  /* STAERKER — 01.09.2026, Optimierungsbriefing, Abschnitt 03: „Headline
     und Subline duerfen optisch nicht wie ein grosser Textblock wirken.
     Headline staerker, Subline schmaler setzen." Die Ueberschrift stand
     wie jede .display im Schnitt 300 und war damit kaum kraeftiger als die
     Unterzeile darunter (400). 500 ist ein echter Schnitt von Cormorant
     (fonts.css) und der kleinste Sprung, der die beiden Zeilen wirklich
     trennt; 600 saehe nach Fett aus, und das traegt diese Seite nirgends
     in Ueberschriften. */
  font-weight: 500;
  max-width: 100%;
}
.heroA__h1 .accent {
  display: block;
  color: var(--accent);
}
/* DER ABSCHLUSS „Nicht umgekehrt." — 01.09.2026, Optimierungsbriefing,
   Abschnitt 03: „kann in Gold oder durch einen deutlichen Zeilenumbruch
   hervorgehoben werden." Hier ist es beides: eigene Zeile UND Gold. Die
   erste Zeile ist lang, ein goldener Nachsatz in derselben Zeile ginge
   hinter ihr unter.
   FARBE: --gold-text #86693A, gemessen 5,13:1 auf dem weissen Kasten. Der
   Sand des Knopfes (#D9B485) misst dort 1,94:1 und ist als Schrift
   unbrauchbar; --gold (#A8874F) 3,36:1 traegt nur als Linie. Bei dieser
   Zeilengroesse (42 px) gaelte zwar die 3:1-Schwelle fuer grosse Schrift,
   aber unter 620 px faellt die Ueberschrift auf 23 px, und dann muss der
   Ton 4,5:1 halten — also von Anfang an der tiefe Ton.
   DIE UEBERSCHRIFT BLEIBT ZWEIZEILIG. Daran haengt die Lage des Bildes
   rechts (margin-top: -2 x --h1-zeile an .heroA__figure): die erste Zeile
   passt bei 1024 px und darueber in eine Zeile (gemessen), die zweite ist
   dieser Block. */
.heroA__h1-schluss {
  display: block;
  color: var(--gold-text);
}

/* DIE AUSZEICHNUNG IM KOPF IST ENTFALLEN — 30.08.2026.

   Hier stand `.heroA__h1 b { font-weight: 600 }`. Die Auszeichnung lag auf
   „Eigentum" und „Vermögen" im alten Satz, danach kurz auf der ersten von
   zwei Zeilen. Der Kunde hat den Kopfbereich am 30.08.2026 endgueltig
   festgelegt: EINE Zeile, „Deine Kapitalanlage-Immobilie." Bei einer
   einzigen Zeile gibt es nichts abzusetzen — die Ueberschrift steht im
   Schnitt 300 aus .display wie jede andere Ueberschrift der Seite.

   Mit ihr entfallen ist `.heroA__h1zwei`, der Grad der zweiten Zeile.
   Wer je wieder zwei ungleich grosse Zeilen setzt, muss daran denken, dass
   das Objektbild rechts mit einem negativen Abstand an der HOEHE der
   Ueberschrift haengt (siehe .heroA__figure) — zwei ungleiche Zeilen sind
   nicht `2 x --h1-zeile`. */

/* Die wechselnde Nutzenzeile trägt seit dem 24.08.2026 den Sandton des
   Knopfes „Vorteile entdecken" statt des Blaus — Kundenwunsch, damit sich
   die Farbe durch die Seite zieht. Es ist die vertiefte Fassung: der reine
   Sand misst als Schrift auf Weiß 1.94:1 und wäre selbst in dieser Größe
   nicht lesbar. Herleitung im Farbblock von base.css.
   Nur hier gesetzt, nicht an .rotator — die Klasse liegt global. */
.heroA__h1 .rotator {
  color: var(--sand-schrift);
}

/* „wirtschaftsstarken Standorten" steht fett — dieselbe Sprache wie
   „Eigentum" und „Vermögen" in der Überschrift (Kundenwunsch 24.08.2026).
   Der Fließtext liegt bei 400, die Hervorhebung deshalb bei 600: derselbe
   Sprung wie oben (300 → 600) wäre hier zu laut, ein kleinerer zu leise. */
.heroA__lead b {
  font-weight: 600;
}

.heroA__lead {
  /* Luft zwischen Ueberschrift und Subline (Kundenwunsch 24.08.2026:
     „sodass zwischen Subline und Headline mehr Platz ist"). Sie stand
     zwischenzeitlich auf 0 — damals lag die Ueberschrift in einer eigenen
     Rasterzeile und der alte Wert wirkte doppelt. Jetzt traegt dieser
     Abstand die Luecke allein.
     Er geht nur nach unten und beruehrt das Bild nicht: das haengt in der
     Nachbarspalte an seinem eigenen negativen Abstand. */
  margin-top: clamp(1.5rem, 3.2vh, 2.4rem);
  max-width: 100%;
  /* Optischer Ausgleich der kleineren x-Höhe von Jost. Die Herleitung stand
     in hero-b.css; die Datei ist mit Variante B am 24.08.2026 entfallen. */
  /* DEUTLICH KLEINER SEIT 30.08.2026 — Kundenwunsch: „Schreibe das kleiner."
     Vorher: clamp(1.37rem, 2.08vw, 2.08rem) — gemessen 30 px bei 1440.
     Jetzt gemessen 22 px bei 1440, also gut ein Viertel weniger.

     DIE UNTERGRENZE IST NICHT FREI GEWAEHLT. Der Fliesstext der Seite steht
     in base.css auf 16 px; darunter darf diese Zeile nicht rutschen, sonst
     ist die Unterzeile des Kopfbereichs kleiner als der Text im Fliess.
     Der Mindestwert 1.18rem sind 18.9 px — er greift ab rund 1220 px
     Fensterbreite und haelt bis 390 px hinunter Abstand zum Fliesstext.
     Die Obergrenze 1.6rem (25.6 px) faengt die ganz breiten Fenster ab;
     ohne sie stuende die Zeile bei 1920 px wieder bei 30 px. */
  font-size: clamp(1.18rem, 1.55vw, 1.6rem);
  line-height: 1.34;
  /* SCHMALER — 01.09.2026, Optimierungsbriefing, Abschnitt 03. Zwei
     Massnahmen, beide gegen den „grossen Textblock": der Schnitt geht von
     400 auf 300 (die Ueberschrift darueber ist auf 500 gegangen; der
     Abstand zwischen beiden ist damit zwei Stufen statt einer), und der
     Satzspiegel ist auf 30em gedeckelt — bei 22 px sind das 660 px, also
     die bisherige Spaltenbreite bei 1440; auf breiteren Fenstern lief die
     Zeile bisher bis 780 px und wurde zur Wand. Der Grad bleibt: die
     Untergrenze von 18,9 px ist am Fliesstext der Seite geeicht. */
  font-weight: 300;
  max-width: 30em;
  color: var(--ink-black);
  text-wrap: pretty;
}

/* ---------------------------------------------------------------------------
   DIE DREI MARKEN — 30.08.2026

   „Die Bank finanziert · Die Mieter zahlen mit · Steuern können sinken"

   Der Kunde hat viermal verlangt, dass die Vorteile in den ersten Bildschirm
   kommen. Massstab ist neocore.capital: deren Kopfbereich traegt vier
   Vorteile mit fetter Marke. Unserer trug bis heute nur eine Ueberschrift
   und einen Satz darueber, was WIR tun.

   NEBENEINANDER, NICHT UNTEREINANDER — und das ist der ganze Punkt.
   Eine erste Fassung stand als Liste aus vier Punkten mit je einer
   Erklaerzeile darunter. Der Kunde hat sie verworfen: zu viel Text.
   Untereinander waere es wieder eine Liste. Als EINE Zeile aus drei kurzen
   Marken liest es sich als Beschriftung, nicht als Aufzaehlung — man nimmt
   sie im Vorbeisehen mit, ohne sie zu lesen.

   ES IST EIN <p> MIT DREI <span>, KEINE <ul>. Das ist keine Formsache:
   Vorlesesoftware kuendigt eine Liste als „Liste mit drei Eintraegen" an
   und zaehlt sie durch. Hier ist es eine Zeile, und sie soll auch als eine
   Zeile vorgetragen werden.

   IN DER HANDSCHRIFT DES PROJEKTS, OHNE NEUE BAUTEILE.
   Gesperrte Versalien in --gold-text, dieselbe Sprache wie .kicker, nur in
   Gold. Getrennt durch einen feinen Mittelpunkt. KEINE Kaesten, KEINE
   Symbole, KEINE Schatten — der Kasten traegt schon Marmor, Verlauf,
   Rahmen und Foto.

   FARBE IST HIER EINE MESSUNG, KEIN GESCHMACK.
   Auf dem hellen Marmorkasten misst --gold-text (#86693A) 5.13:1 und traegt
   damit auch als kleine Versalzeile. Der naheliegende Sandton --sand
   (#D9B485) misst dort 1.94:1 und ist unbrauchbar; --sand-schrift kaeme auf
   3.39:1 und bliebe unter der Regel von 4.5:1. Wer die Farbe tauscht, muss
   neu messen.
--------------------------------------------------------------------------- */
.heroA__marken {
  margin: clamp(1.1rem, 2.4vh, 1.7rem) 0 0;
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  /* Der Zwischenraum traegt die Trennung mit — der Mittelpunkt allein
     stuende zu eng an beiden Marken. */
  gap: 0.5em clamp(0.7rem, 1.1vw, 1.05rem);
  font-family: var(--font-ui);
  font-size: clamp(0.79rem, 0.83vw, 0.86rem);
  font-weight: 600;
  /* ENGER GESPERRT ALS .kicker — nachgemessen, nicht geschaetzt.
     --track-wide sind 0.24em. Damit brauchten die drei Marken bei 1440 px
     675 px, die Textspalte bietet dort aber nur 655 px: die Zeile brach in
     zwei. Der Kunde will sie nebeneinander. 0.13em spart ueber die rund 60
     Zeichen genug ein, dass sie bei 1440 und 1920 px in EINER Zeile stehen.
     Unter 0.10em verliert die Versalzeile ihren Charakter und liest sich wie
     ein Wort — dort ist die Grenze, nicht beim Platz. */
  letter-spacing: 0.13em;
  text-transform: uppercase;
  color: var(--gold-text);
  line-height: 1.4;
}
/* Eine Marke bricht NIE in sich um. „Steuern können / sinken" ueber zwei
   Zeilen waere schlimmer als drei Marken untereinander: der Leser sucht dann
   nach dem Zusammenhang. Bei 1024 px stehen deshalb zwei Marken oben und
   eine darunter, bei 390 px jede fuer sich — der Kunde hat „nebeneinander in
   eine Zeile, WENN DER PLATZ REICHT" verlangt, und dort reicht er nicht. */
.heroA__marken span { white-space: nowrap; }
/* Der Mittelpunkt haengt an der Marke davor, nicht an der dahinter: bricht
   die Zeile um, steht er dadurch am Ende der oberen Zeile und nicht als
   erstes Zeichen der unteren. */
.heroA__marken span:not(:last-child)::after {
  content: '·';
  /* Der letzte Buchstabe einer gesperrten Marke schleppt seinen Zwischenraum
     hinter sich her. Ohne diesen Ausgleich stuende der Punkt sichtbar naeher
     an der folgenden Marke als an der eigenen. */
  margin-left: calc(0.72em - var(--track-wide));
  letter-spacing: 0;
  /* Blasser als die Schrift: der Punkt trennt, er zaehlt nicht mit.
     Als reines Trennzeichen traegt er keine Aussage — der Kontrastwert der
     Marken selbst bleibt davon unberuehrt. */
  color: var(--line-gold);
}

.heroA__actions {
  margin-top: 40px;
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 12px;
}

/* --- Objektbild rechts, Querformat --------------------------------------- */
.heroA__figure {
  position: relative;
  /* DAS BILD BLEIBT, WO ES IST — ausdruecklich: „Das Bild bleibt genau in
     derselben Position. Das ist sehr gut."

     Mit dem Wegfall der Wechselzeile ist der Kopf um genau eine Zeile
     kuerzer geworden, und alles darunter waere um diese Zeile nach oben
     gerutscht. Der Abstand hier haelt das Bild an seinem Platz und ist
     deshalb nicht geschaetzt, sondern GENAU diese eine Zeile:
     Zeilenhoehe 1.1 (aus .heroA__h1) mal dessen Schriftgrad. Gemessen war
     die Zeile 48 px bei 1920, 44 bei 1440, 39 bei 1280 und 33 bei 1024.

     Die Rechnung `2 x fest - aktuell` haelt das Bild AUCH DANN an seinem
     Platz, wenn die Ueberschrift groesser gestellt wird: waechst ihre Zeile
     um x, schrumpft dieser Abstand um dasselbe x. Genau das ist am
     24.08.2026 passiert, als die Ueberschrift um sieben Prozent zugelegt
     hat — das Bild steht danach unveraendert bei 209 / 191 / 173 / 151 px
     unter der Kastenoberkante. */
  padding: 0 var(--panel-pad) var(--panel-pad) 0;
  align-self: start;
  /* BILD DIREKT UNTER DEN EYEBROW (Kundenwunsch 24.08.2026).
     Die Ueberschrift laeuft ueber beide Spalten, das Bild begann deshalb
     erst unter ihr — rechts daneben stand eine leere Flaeche. Dieser
     negative Abstand zieht das Bild um genau die Hoehe der Ueberschrift
     nach oben, also um ihre zwei Zeilen: 2 x Zeilenhoehe 1.1 x Schriftgrad.
     Kein geschaetzter Wert — er haengt an denselben Token wie die
     Ueberschrift und wandert mit, wenn deren Groesse sich aendert.
     Die Ueberschrift steht links und ist deutlich schmaler als ihre Spalte;
     ihr Text kollidiert deshalb nicht mit dem Bild (nachgemessen).

     NACHGEZOGEN 30.08.2026. Hier stand `-2 * var(--h1-zeile)`, weil die
     Ueberschrift zwei Zeilen hatte. Seit der endgueltigen Fassung hat sie
     nur noch EINE („Deine Kapitalanlage-Immobilie."), also ist es EINE
     Zeilenhoehe. Waere die Zwei stehen geblieben, haette der Abstand das
     Bild um eine volle Zeile — rund 47 px bei 1440 — ueber die Oberkante
     des Kastens hinausgezogen.

     WAS DER WERT MEINT, ist unveraendert: „zieh das Bild um die Hoehe der
     Ueberschrift nach oben, damit es nicht erst unter ihr beginnt".
     Mit dem Wegfall der Kleinzeile sitzt seine Oberkante jetzt genau am
     Innenabstand des Kastens statt darunter — das ist die Folge davon,
     dass ueber ihm nichts mehr steht, und nicht eine eigene Entscheidung. */
  /* HOEHER — 31.08.2026, Kundenwunsch: „Du kannst das Bild wieder einen
     Tick nach oben verschieben." Mit dem Wortlaut aus dem Wording-Dokument
     ist die Ueberschrift wieder ZWEIZEILIG; der Zug um eine Zeile liess das
     Bild deshalb eine Zeile zu tief beginnen. Zwei Zeilen ist derselbe
     Gedanke wie am 24.08.: „zieh das Bild um die Hoehe der Ueberschrift
     nach oben, damit es nicht erst unter ihr beginnt."
     Vorher: calc(-1 * var(--h1-zeile)) */
  margin-top: calc(-2 * var(--h1-zeile));
}

/* Die Kleinzeile sitzt seit dem 31.08. IM Bildblock (Begruendung steht im
   HTML). Damit ist sie kein Rasterkind des Kastens mehr — Spaltenzuweisung
   und rechter Innenabstand von oben gehen ins Leere und werden hier
   zurueckgenommen. Mittig bleibt sie, denn mittig ueber dem Bild war sie
   auch vorher. */
.heroA__figure .heroA__eyebrow {
  grid-column: auto;
  padding-right: 0;
  margin-bottom: 14px;
}
.heroA__figure > div {
  position: relative;
  aspect-ratio: 5 / 4;      /* etwas höher als 4:3 — Gebäude steht trotzdem vollständig */
  overflow: hidden;
  border-radius: var(--radius-btn);
  background: var(--navy-800);
}
.heroA__figure img {
  width: 100%; height: 100%;
  object-fit: cover;
  object-position: 50% 55%;
  /* ZURUECKGENOMMEN am 30.08.2026 — Kundenwunsch: „gib dem Bild seine volle
     Farbe wieder zurück, so wie es davor war."

     Am 24.08. war das Bild an das Band angeglichen worden, weil beide
     Flächen farblich auseinanderliefen. Gemessen war das damals richtig:

                       B minus R     Sättigung   Helligkeit
       Band                17,9        0,284         65
       Bild angeglichen    15,4        0,209         91
       Bild ursprünglich   10,6        0,147        137

     Der Kunde will den ursprünglichen Zustand zurück. Der Filter ist damit
     ganz weg, nicht abgeschwächt — „so wie es davor war" heisst ohne.

     Der Navy-Schleier darunter faellt mit weg. Ich hatte ihn erst behalten
     wollen, aber die Historie ist eindeutig: er kam im selben Commit dazu
     (4bafae8, 24.08.) und war vorher nicht da. Er war der groessere Teil
     der Abdunklung — ihn stehen zu lassen haette den Auftrag nur halb
     erfuellt. */
  transform: scale(1.02);
  /* 2,2 s -> 0,6 s — Optimierungsbriefing 01.09.2026, P0 (keine Bewegung
     ueber 600 ms). Es ist nur der Zoom beim Ueberfahren. */
  transition: transform 0.6s var(--ease-soft);
}
/* ENTFERNT am 30.08.2026 zusammen mit dem Filter oben — Kundenwunsch, das
   Bild in seiner vollen Farbe zu zeigen.

   Hier lag der Navy-Schleier, der das Bild an das Band angeglichen hat:
   `linear-gradient(to bottom, rgba(10,25,46,0.35), rgba(10,25,46,0.28) 45%,
   rgba(10,25,46,0.31))` auf `.heroA__figure > div::after`, inset 0,
   z-index 2. Er stammt aus demselben Commit wie der Filter (4bafae8,
   24.08.) und war der groessere Teil der Abdunklung.

   Falls das Bild spaeter doch wieder an das Band herangeholt werden soll:
   erst den Schleier zurueckholen, dann den Filter — in dieser Reihenfolge,
   der Schleier allein reicht meistens.

   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   DRITTE STUFE — 31.08.2026: DAS BILD WIRD WIEDER LEICHT ABGEDUNKELT.
   Kundenwortlaut: „ein ganz kleiner Ticken, nicht viel, aber das Bild muss
   ein bisschen abgedunkelt werden."

   DER ALTE FILTER VOM 24.08. KOMMT NICHT ZURUECK, und das ist wichtig. Er
   stand auf `saturate(0.24) contrast(1.12) brightness(0.76)`, dazu der
   Navy-Schleier mit 0,28 bis 0,35 Deckkraft — zusammen hat er die
   Helligkeit um mehr als ein Drittel genommen und dem Bild die Farbe
   ausgetrieben. Genau das hat der Kunde am 30.08. abbestellt. „Ein ganz
   kleiner Ticken" ist etwas anderes.

   GESETZT IST DESHALB NUR `brightness(0.94)` — eine Stufe, kein Filterpaar:
     · KEINE Entsaettigung. `saturate` bleibt weg; die Farbe ist genau die,
       die der Kunde zurueckhaben wollte.
     · KEIN Kontrast. `contrast` bleibt weg.
     · KEIN Farbschleier. Der Navy-Schleier oben bleibt entfernt; er faerbt,
       er dunkelt nicht nur.
   Es ist also dieselbe Aufnahme in derselben Farbe, nur sechs Prozent
   dunkler.

   GEMESSEN am gerenderten Bildkasten bei 1440 px, ueber alle 455 x 364
   Bildpunkte gemittelt (Leuchtdichte nach 0,2126 R + 0,7152 G + 0,0722 B):

                      mittlere Helligkeit   Mittel R / G / B
       vorher              134,4 von 255    121,7 / 137,2 / 144,2
       jetzt               126,4 von 255    114,5 / 129,1 / 135,7
       Unterschied          -8,0  (-5,9 %)

     zum Vergleich, was NICHT gilt:
       Fassung 24.08.        rund  91        (Filter samt Schleier)
       urspruenglich         rund 137        (Messung vom 30.08.)

   Der Rahmen, den der Kunde genannt hat, war 0,93 bis 0,95. 0,94 liegt in
   der Mitte. Wer nachbessern will, aendert NUR diese eine Zahl.

   ZUR SCHRIFT: auf diesem Bild steht keine. Die Ueberschrift und alle
   Zeilen des Kopfbereichs liegen neben dem Bild auf dem Navyband, nicht
   darauf — die Abdunklung beruehrt keinen Kontrastwert. Nachgeprueft am
   Markup: der Bildkasten enthaelt nur das <img>; das <figcaption> ist seit
   dem 24.08.2026 aus dem Markup entfernt.
   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
/* Zweite Stufe der Abdunklung — 31.08.2026, der Kunde wollte nach
   0.94 „noch ein bisschen dunkler". Weiterhin NUR Helligkeit, keine
   Entsaettigung und kein Farbschleier — die waren am 24.08. drin und
   sind am 30.08. auf Kundenwunsch entfernt worden.
   Mittlere Helligkeit des gerenderten Bildes: 161 bei 0.94. */
.heroA__figure img { filter: brightness(0.86); }
.heroA__panel:hover .heroA__figure img { transform: scale(1.055); }
/* SCHLAEFT seit dem 24.08.2026. Die Bildunterschrift „Auswahl vor Angebot"
   ist auf Kundenwunsch aus dem Markup entfernt; diese Regeln greifen damit
   ins Leere und schaden nicht. Sie stehen vollstaendig da, falls wieder eine
   Unterschrift auf das Bild soll — dann genuegt ein <figcaption> im <div>
   der Figur, sonst nichts. */
.heroA__figure figcaption {
  position: absolute;
  left: 0; right: 0; bottom: 0;
  padding: 3rem 1.2rem 1rem;
  background: linear-gradient(to top, rgba(10,25,46,0.86) 0%, rgba(10,25,46,0.5) 45%, rgba(10,25,46,0) 100%);
  color: #fff;
  font-size: 0.77rem;
  font-weight: 500;
  letter-spacing: 0.2em;
  text-transform: uppercase;
}

/* --- Responsive ----------------------------------------------------------- */
@media (max-width: 980px) {
  .heroA { --panel-pad: clamp(1.4rem, 5vw, 2.2rem); }
  .heroA__panel {
    grid-template-columns: 1fr;
    margin-top: clamp(-120px, -12vh, -70px);
    gap: 0;
  }
  /* Text und Bild auf EINER gemeinsamen linken Kante */
  .heroA__text   { padding: var(--panel-pad) var(--panel-pad) 0; }
  .heroA__figure {
    padding: var(--panel-pad);
    /* FEHLER BEHOBEN 31.08.2026 — er stand hier seit dem Umbau auf zwei
       Rasterzeilen und war aelter als der neue Wortlaut.

       .heroA__figure traegt oben `margin-top: calc(-1 * var(--h1-zeile))`.
       Der Wert hat GENAU EINEN Zweck: im ZWEISPALTIGEN Kasten sitzt das Bild
       rechts NEBEN der Ueberschrift, und ohne diesen Zug begaenne es erst
       unter ihr — rechts stuende eine leere Flaeche.

       Hier gibt es keine zwei Spalten mehr. Der Kasten stapelt einspaltig,
       das Bild steht UNTER dem Text, und derselbe negative Abstand zieht es
       dann in den Text hinein. Nachgemessen bei 390, 620, 900 und 980 px:
       die Guetezeile „Diskret ausgewaehlt. Strukturiert geprueft.
       Langfristig begleitet." war an allen vier Breiten um 35 px vom Foto
       ueberdeckt — die zweite Zeile war schlicht nicht zu lesen.
       (Vor dem 31.08. waren es sogar 70 px: der Abstand hiess damals
       `-2 * var(--h1-zeile)`, weil die Ueberschrift zwei Zeilen hatte.)

       Unter 980 px gehoert der Zug deshalb auf 0. Am zweispaltigen Kasten
       darueber aendert das nichts. */
    margin-top: 0;
  }
  .heroA__h1 { font-size: clamp(1.95rem, 5.2vw, 2.5rem); }
}

@media (max-width: 620px) {
  .heroA__band { height: 300px; }
  .heroA__h1 {
    font-size: clamp(1.45rem, 6.4vw, 2.3rem);
    hyphens: auto;
    overflow-wrap: break-word;
  }
  .heroA__actions { flex-direction: column; align-items: stretch; }
  .heroA__actions .btn { justify-content: center; }

  /* ENGER GESTELLT AUF SCHMALEN FENSTERN — 30.08.2026.
     Bei 390 px steht jede Marke auf einer eigenen Zeile; die drei Zeilen
     kosten Hoehe, und der Kopfbereich ist hier ohnehin schon laenger als
     ein Bildschirm. Abstand nach oben und Zeilenzwischenraum sind deshalb
     zurueckgenommen — gemessene 12 px, die der Kasten dadurch kuerzer wird.
     Am Schriftgrad wird NICHT gespart: 12.6 px sind bei gesperrten Versalien
     die Untergrenze der Lesbarkeit. */
  .heroA__marken {
    margin-top: clamp(0.85rem, 1.9vh, 1.15rem);
    gap: 0.3em 0.75rem;
  }
}

/* ===========================================================================
   DER KASTEN BAUT SICH AUF — 31.08.2026

   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   DIE VORIGE GESTE IST ERSATZLOS ENTFALLEN. Der Kasten fuhr aus seiner
   eigenen Mittellinie auf, waagrecht nach oben und unten zugleich
   (`clip-path` von `inset(46% ...)` auf `inset(-4% ...)`). Kundenwortlaut
   vom 31.08.2026: „das gefaellt mir nicht, dass es so auffaehrt."
   Ausdrueckliche Ausschlusskriterien fuer den Ersatz: kein Aufziehen aus
   der Mitte, kein blosses Groesserwerden.
   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

   WAS JETZT PASSIERT, in einem Satz: der Kasten steht ZUERST NUR AUF SEINER
   UNTERKANTE und baut sich von dort in einem ruhigen Zug nach oben auf, bis
   er vollstaendig dasteht. Er kommt nicht auf einen zu, er faehrt nicht
   auseinander, er wird nicht groesser — er ENTSTEHT, von unten nach oben.

   WARUM AUSGERECHNET DAS. Der Kunde hat an dieser Seite genau eine Sache
   ausdruecklich gelobt: „Die Animation mit dem Haus, dass sich das Haus so
   aufbaut, gefaellt mir sehr, sehr gut. Genau das ist das, was wir haben
   wollen." Die Hauszeichnung in warum.css laeuft ueber eine Maske, die von
   unten nach oben ueber das Blatt geht. Der Kopfbereich nimmt diese
   Richtung auf. Es ist damit keine neue Idee, sondern dieselbe Idee an der
   ersten Stelle der Seite — was hier passiert, erklaert sich beim Haus
   noch einmal.

   TECHNISCH IST ES EINE EINZIGE BEWEGUNG (`clip-path` am Kasten). Von
   `inset(100% -4% -4% -4%)` auf `inset(-4% -4% -4% -4%)`: der obere
   Beschnitt wandert von der Unterkante an die Oberkante. BEWEGT WIRD NUR
   DER BESCHNITT. Lage, Groesse, Umbruch und Schriftsatz stehen die ganze
   Zeit fest — es wird nichts neu umbrochen und nichts skaliert.
   Die vier Prozent Ueberstand an den drei uebrigen Kanten sind Absicht und
   aus der vorigen Fassung uebernommen: der Kasten hat einen Radius und eine
   Marmorlage bis an die Kante, und `inset(0)` haette sie auf den Bildpunkt
   genau beschnitten — bei halben Bildpunkten wird daraus eine Haarlinie.

   ES IST BEWUSST NUR EINE BEWEGUNG. Erprobt war zusaetzlich, den Marmor
   ueber dieselbe Zeit von 0 auf seine 0.7 kommen zu lassen — der Kasten
   waere erst eine ruhige weisse Flaeche gewesen und haette sich dann
   geaedert. Das ist aus zwei Gruenden nicht eingebaut: der Kunde hat
   „ruhig und einmalig" verlangt, und zwei Dinge im selben Augenblick sind
   zwei Ereignisse; und es kostete bei 1920 x 1080 gemessene 10 Bilder je
   Sekunde (63,0 -> 53,4). Die Regel dafuer steht unten auskommentiert
   nicht mehr da — sie ist ersatzlos entfallen.

   DIE ZEITKURVE IST --ease-soft, cubic-bezier(0.33, 0, 0.15, 1). Sie
   beginnt langsam, nimmt in der Mitte Fahrt auf und laeuft lange aus. Das
   letzte Drittel der Strecke braucht mehr als die Haelfte der Zeit — die
   Bewegung hoert nicht auf, sie KOMMT ZUR RUHE. Genau das war die Vorgabe.

   NUR `clip-path`. Kein `transform` am Kasten, keine Maske, kein Filter,
   kein `scale`. Die Deckkraft des Kastens selbst fuehrt weiterhin die
   Grundregel in base.css; hier wird nur der Beschnitt bewegt.

   ---------------------------------------------------------------------
   BILDRATE — und warum die Geste so und nicht anders aussieht
   ---------------------------------------------------------------------
   Der Kopfbereich ist die teuerste Stelle der Seite: waehrend der Geste
   dekodiert der Browser gleichzeitig die Drohnenfahrt (2400 x 1598,
   autoplay). Gemessen bei 1920 x 1080, Median aus fuenf Laeufen, gezaehlt
   ueber 1,5 s ab dem Start der Geste:

     ganz ohne Geste am Kasten                        105,7 fps
     Aufbau von unten            ← GEWAEHLT            63,0 fps
                                 (im Einbau nachgemessen, Minimum 61,0)
     Aufbau von unten, dazu der Marmor                 53,4 fps
     die abgeloeste Geste aus der Mitte                57,8 fps
     Aufbau von OBEN nach unten                        39,1 fps
     Kasten kippt herein (rotate 0,42 Grad)            33,7 fps
     Ecken schaerfen sich (clip-path round 110 -> 12)  31,6 fps
     Kasten setzt sich senkrecht (translateY)          44,1 fps

   Das ist keine Feinheit, sondern der Grund fuer die Wahl. Alles, was den
   Kasten NEU ZEICHNEN laesst — eine Drehung, ein wandernder Eckradius,
   eine Verschiebung —, zwingt den Browser, die ganze Flaeche samt
   Marmorlage, Verlaeufen und Foto Bild fuer Bild neu zu rastern, und das
   zusammen mit der laufenden Filmdekodierung. Ein RECHTECKIGER Beschnitt
   tut das nicht: er schneidet die fertige Flaeche nur ab.
   Dass der Aufbau von UNTEN schneller ist als der von OBEN (62 gegen 39),
   hat denselben Grund: der Kasten beisst mit seinem oberen Drittel in das
   Filmband hinein. Laeuft die Schnittkante dort zuerst durch, faellt
   waehrend jedes Bildes zusaetzlich die Flaeche ueber dem Film an. Laeuft
   sie zuletzt durch, ist sie dort schon langsam geworden.

   WER DIESE GESTE AENDERT, MUSS NEU MESSEN. Die Grenze ist 50 Bilder je
   Sekunde bei 1920 x 1080.

   AUSLOESER bleibt `data-anim` aus site.js — derselbe Einlauf beim Laden,
   den der Kasten ohnehin hat (`--d: 260` als Versatz). Es kommt kein
   zweiter Schalter dazu.

   OHNE JAVASCRIPT gibt es kein `.is-ready`: der Kasten steht sofort
   vollstaendig da. Bei `reduce` ebenso.
   =========================================================================== */
/* KUERZER — 01.09.2026, Optimierungsbriefing P0: „Animationen maximal
   ca. 400 bis 600 ms … kaum Verzoegerung." Vorher 1250 ms Dauer plus
   120 ms plus --d 260 ms Vorlauf, der Kasten stand also erst nach 1,63 s
   ganz. Jetzt 600 ms Dauer, 40 ms Vorlauf, --d im Markup auf 80: fertig
   nach 720 ms. Die Geste selbst (Aufbau von unten) ist unveraendert; nur
   der Takt. Die Bildratenmessung oben gilt weiter — ein kuerzerer
   Beschnittlauf kostet nicht mehr je Bild als ein langer. */
.is-ready .heroA__panel[data-anim] {
  clip-path: inset(100% -4% -4% -4%);
  animation: heroA-aufbau 600ms var(--ease-soft)
             calc(var(--d, 0) * 1ms + 40ms) forwards;
}
@keyframes heroA-aufbau {
  from { clip-path: inset(100% -4% -4% -4%); }
  to   { clip-path: inset(-4% -4% -4% -4%); }
}

@media (prefers-reduced-motion: reduce) {
  .is-ready .heroA__panel[data-anim] {
    clip-path: none;
    animation: none;
  }
}

/* MOBIL, 01.09.2026 — Briefing 19 „keine Mini-Schriften": die Guetezeile
   stand bei 13,8 px. */
@media (max-width: 899px) {
  .heroA__guete { font-size: 0.9375rem; }              /* 15 px */
}
/* Untereinander gestapelt hingen die Trennpunkte am Zeilenende
   („DIE BANK FINANZIERT ·"). Sobald die Marken nicht mehr in einer Zeile
   stehen, trennt nichts mehr — der Punkt entfaellt. 01.09.2026. */
@media (max-width: 620px) {
  .heroA__marken span:not(:last-child)::after { content: none; }
}



/* ===========================================================================
   DER HERO AUF SCHMALEN FENSTERN — 04.09.2026, ZWEITE FASSUNG

   ERSTE FASSUNG WAR FALSCH ABGEGRENZT, und der Kunde hat es sofort gesehen:
   „Ich habe dir doch gesagt, dass du die Änderungen nur auf der mobilen
   Version anpassen sollst. Jetzt hast du die Änderungen auch auf der
   Desktop-Version angepasst. […] Setze die Desktop-Version wieder zurück,
   so wie sie war."

   Ich hatte den mittigen Satz fuer ALLE Breiten gesetzt, weil die Ansage
   zur Ueberschrift („mittig machen, das ist ganz wichtig") ohne Angabe
   einer Breite kam. Der Satz danach — „Bei der mobilen Ansicht geht es
   jetzt nur um die mobile Ansicht. Die Desktop-Version lässt du
   unangetastet" — gilt fuer den ganzen Kopfbereich. Zurueckgenommen sind
   deshalb auf dem Desktop:
       text-align: center an .heroA__h1 und .heroA__text
       grid-column: 1 / 2 an der Ueberschrift  (wieder 1 / -1)
       line-height 1.18                        (wieder 1.1)
       margin-top -1 x --h1-zeile am Bild      (wieder -2)
       justify-content: center an Knoepfen und Marken
       der Umbruch nach „Kapitalanlageimmobilien," und in der Guetezeile

   Alles davon steht jetzt in diesem Block und gilt nur bis 767 px.
   =========================================================================== */
.nur-mobil { display: none; }

@media (max-width: 767px) {
  /* Der Umbruch im Markup wird erst hier wirksam. Ein <br> auf display:none
     bricht nicht — deshalb genuegt das Umschalten der Anzeige, und das
     Markup bleibt fuer beide Faelle dasselbe. */
  .nur-mobil { display: inline; }

  .heroA__h1 {
    text-align: center;
    text-wrap: wrap;          /* balance aus .display wuerde den festen Umbruch uebergehen */
    line-height: 1.18;        /* der „ganz kleine Abstand" zwischen den zwei Zeilen */
    margin-inline: 0;         /* automatische Raender machen ein Rasterkind schmaler als seine Spalte */
    width: auto;
  }
  /* Der Kopfblock traegt dasselbe Raster 58fr / 42fr wie der Kasten; hier
     gibt es nur noch eine Spalte zu fuellen. Ohne das mass die Ueberschrift
     bei 390 px 184 px statt 342, und das lange Wort wurde getrennt. */
  .heroA__kopf { grid-template-columns: 1fr; }

  .heroA__text    { text-align: center; padding: 0 var(--panel-pad) var(--panel-pad); }
  .heroA__actions { justify-content: center; }
  .heroA__marken  { justify-content: center; }
  /* Zwei Marken oben, die dritte mittig darunter. Der Mittelpunkt haengt an
     der Marke davor; hinter der zweiten steht keiner, weil dort die Zeile
     endet. */
  .heroA__marken-um { flex-basis: 100%; text-align: center; }
  .heroA__marken span:nth-child(2)::after { content: none; }
  .heroA__guete { width: fit-content; margin-inline: auto; text-align: center; }

  /* Die drei Griffe aus der ersten Fassung, unveraendert: Kleinzeile ueber
     dem Bild weg, Bild unmittelbar unter die Knopfreihe, Guetezeile
     darunter (zweites Vorkommen aus dem Bildblock). */
  .heroA__figure .heroA__eyebrow { display: none; }
  .heroA__text .heroA__guete     { display: none; }
  .heroA__guete--mobil {
    display: block;
    margin-top: 20px;
    padding-top: 16px;
  }
  .heroA__figure { margin-top: 24px; }
}
