/* ============================================================================
   CLARA WESTPHAL IMMOBILIEN — Ihre Maklerin in Timmendorfer Strand
   Basis-Stufe (Starter). Standbilder, ein Einblende-Effekt je Abschnitt, dazu
   Hover und Fokus. Kein Parallax, kein Scrub, kein Zaehler, kein Bildwechsel,
   kein `background-attachment: fixed`.

   HERKUNFT
   --------
   1:1 uebertragen aus dem Claude-Design-Entwurf "Makler Clara Westphal
   Timmendorfer Strand.dc.html" (Projekt 9e200815-1fb2-4f84-b0ef-82a1c23232f8),
   Uebernahme am 30.10.2026 nach `docs/regeln/vorlagen.md` und den
   Entscheidungen von Benedikt vom 30.10.2026: Aufbau, Reihenfolge, Texte,
   Farben, Schriften, Groessen, Abstaende und Bildzuschnitte wie im Entwurf;
   Schriften 1:1; Kontaktdaten wie im Entwurf; Logo als Bild; Bewegung ruhig.

   Der Entwurf laedt Marcellus, Plus Jakarta Sans, Cormorant Garamond, Jost
   und DM Serif Display von Google Fonts und die Laufzeit `support.js`. Er
   traegt 13 Hover-Angaben der Claude-Design-Umgebung (vier Menuepunkte,
   Kontakt-Knopf, Hero-Knopf, dreimal "Besichtigung anfragen", "Gespraech
   vereinbaren", "Immobilie bewerten lassen" im Ablauf, zwei
   Formular-Knoepfe), eine Fokus-Angabe am Sprungverweis, 22
   Bedingungsbloecke sc-if (Menuezeile, Menue-Knopf, Handy-Menue, zwei
   Hero-Fassungen, drei Formularschritte, Zurueck-Knopf, neun
   Fehlermeldungen, zwei Statusmeldungen, zwei mailto-Knoepfe), vier
   Schleifen sc-for (Raum-Reiter, Immobilienart, Ablauf, Tageszeit) und eine
   `DCLogic`-Klasse mit Breiten- und Scroll-Zustand, Raumwahl, Schrittfolge,
   Formularpruefung und dem Aufbau einer Mail. Nichts davon laeuft ohne die
   Claude-Design-Umgebung (V1).

   Alle Masse sind die des Entwurfs, auch sein Kastenmodell: Er setzt ein
   globales `box-sizing: border-box`, hier ebenso. Kopf, Hero und
   Leistungsleiste tragen ihren Innenabstand INNERHALB der 1400 px (Inhalt
   hoechstens 1288 px), die Abschnitte darunter und der Fuss ausserhalb
   (Inhalt hoechstens 1400 px). Ab rund 1512 px stehen die oberen drei
   deshalb 56 px weiter innen. So ist der Entwurf; das ist nicht
   "gerade gezogen".

   Was der Entwurf je nach Fenster per Skript umschaltet, steht hier in
   Media Queries an denselben Grenzen, nur min-width (V5):
     (min-width: 900px) and (min-aspect-ratio: 1/1)
                 Hero breit: Foto mit Schleier, Text links (heroWide)
     1080 px     Menuezeile statt Menue-Knopf, Logo 40 statt 30 px hoch,
                 linke Spalte im Verkaufsablauf klebt (wide, logoH,
                 stickyPos)
   Hochkant-Fenster ab 1080 px zeigen deshalb Menuezeile und schmalen Hero
   zugleich, Querformat von 900 bis 1079 px breiten Hero und Menue-Knopf —
   wie im Entwurf. Alle Raster laufen wie dort ohne Media Query ueber
   `repeat(auto-fit, minmax(min(100%, X), 1fr))`.

   ABWEICHUNGEN VOM ENTWURF, JEDE MIT GRUND
   ----------------------------------------
    1. LAUFZEIT ENTFERNT (V1, V6). Huelle und Kopfblock der
       Claude-Design-Umgebung, die Bedingungsbloecke und Schleifen, die
       Platzhalter in doppelten geschweiften Klammern, die Hover- und die
       Fokus-Angabe, `onClick`/`onChange`/`onInput`/`onSubmit`, `DCLogic`,
       `support.js`, das Werkzeug-Skript von Claude Design und die
       Kennungen `data-screen-label` sind weg. Inline-Stile sind Klassen mit
       den Werten aus `:root`, Hover ist `:hover`, die Fokus-Angabe
       `:focus`, die Schleifen sind ausgeschrieben. Die Editor-Eigenschaft
       `headingFont` ist fest auf ihre Vorgabe gesetzt: Marcellus 400.
       Falle `a:hover`: Die globale Regel `a:hover { color: #1D2428 }` des
       Entwurfs erreichte dort nur Verweise ohne eigene Farbe (Einwilligung,
       Telefon und Mail im Kontakt, "Anrufen" im Handy-Menue). Mit Klassen
       wuerde sie auch die weissen Knoepfe treffen; jeder Verweis, der im
       Entwurf eine eigene Farbe traegt, behaelt sie hier deshalb beim
       Darueberfahren ausdruecklich.
    2. SCHRIFTEN SELBST AUSGELIEFERT (V3, V4, Entscheidung 2). Genau die
       Familien und Schnitte, die der Entwurf zeigt: Marcellus 400 (einziger
       Schnitt, 14 552 B) und Plus Jakarta Sans (variable Datei, Achse
       200-800, freigegeben 400-700 wie im Entwurf bestellt, 27 348 B),
       latin-Teilmenge mit demselben `unicode-range` wie bei Google. Zusammen
       41 900 B, Budget 120 KB. Cormorant Garamond, Jost und DM Serif Display
       stehen im Entwurf nur zur Auswahl im Editor und werden nie gezeigt;
       sie sind nicht geladen. Kein preconnect, kein Stylesheet von Google.
       Keine Kursive, kein fetter Marcellus.
    3. VERMERK-LEISTE UND UMBRANDUNG (A17, V14, V19). Die feste Leiste ist
       26 px hoch (--notice). Deshalb beginnen Seitengrund und Kopfleiste
       26 px tiefer, die Sprungziele halten 110 statt 84 px Abstand, #top
       und #inhalt halten 26 px (der Logo-Verweis und "Zum Inhalt springen"
       landen wie im Entwurf ganz oben; ohne die 26 px an #inhalt stand die
       Seite nach dem Sprung bei 26 statt 0, und der Hero rutschte 26 px
       unter die Kopfleiste), die klebende Spalte im Ablauf haelt 158 statt
       132 px, der Sprungverweis erscheint bei 34 statt 8 px.
    4. SPERRHINWEIS (V14). `noindex, nofollow`; Seitenbeschreibung und
       og:description enden auf "Fiktives Beispielprojekt."
    5. BILDER LOKAL (V3, Entscheidung 6). Dieselben Dateien unter img/ statt
       makler/img/. Das Titelbild ist von 4096 x 2294 auf 1920 x 1075 px
       verkleinert, der Name hero-4k bleibt wie im Entwurf. Es wiegt
       317 878 B — mehr als die 250 KB, die die Basis-Stufe dem Hero-Bild
       laesst. Staerker verdichten laesst Entscheidung 6 nicht zu; das ist
       offen und Benedikts Entscheidung. Im Projekt liegt zusaetzlich
       makler/img/hero.webp, dasselbe Motiv in 1344 x 752 px (198 740 B);
       der Entwurf verwendet sie nicht.
       `width`/`height` im Markup nennen die echten Masse. Genau ein Bild
       vorgeladen, das Titelbild (V18); og:image zeigt auf img/hero-4k.webp.
    6. HERO AUS EINEM STUECK. Der Entwurf legt ihn zweimal an (zweimal
       <h1 id="hero-h1">) und zeigt per Skript eine Fassung. Hier steht er
       einmal, und CSS schaltet an derselben Grenze um. Die Vorzeile hat je
       Fassung einen anderen Text; beide stehen in derselben Zeile, je
       Ansicht ist einer sichtbar. Der Knopf hat wie im Entwurf nur breit
       einen Hover-Zustand. Im Markup steht der Text vor dem Foto (die
       Reihenfolge der schmalen Fassung); breit liegt der Text ueber Foto
       und Schleier (z-index 1).
    7. SCHLEIER IM HERO (V9). Der Verlauf des Entwurfs (Deckung .9 bei 0 %,
       .72 bei 30 %, 0 bei 56 %) faellt durch: Die Zeilenenden liegen auf
       den Kiefern in der Bildmitte, dort bleiben Vorzeile, Ueberschrift und
       Vorspann bei 1,42 bis 2,30 : 1 (Tabelle unter KONTRASTE). Er laeuft
       jetzt mit .9 bei 0 %, .8 bei 52 % und 0 bei 72 % aus. Der Text endet
       nie weiter rechts als bei 52 % der Buehne, auf deren Breite sich der
       Verlauf bezieht (Rand 4vw + Spalte 48vw). Ein Rollbalken von 15 bis
       17 px macht die Buehne schmaler, die vw-Masse aber nicht; dann sind
       es hoechstens 53 %. Bis dorthin deckt der Schleier mindestens .8
       bzw. .76; das hielte die Vorzeile selbst ueber reinem Schwarz bei
       5,23 bzw. 4,71 : 1. An diesem Foto gemessen bleiben es mindestens
       5,44 bzw. 5,10 : 1.
       Ein Verlauf, der schon bei 48 % auf .8 faellt und bei 68 % endet,
       reicht nicht: Ab 933 px passt die Vorzeile in eine Zeile, "STRAND"
       endet dann bei 52 % auf der dunklen Kiefer, wo er nur noch .64
       deckt (bei 935 x 700 blieben 3,93 : 1). Sichtbar: Die Kiefer in der
       Mitte wird blasser, die Villa rechts bleibt bis auf ihren linken
       Rand frei.
    8. HANDY-MENUE OHNE SKRIPT (V8). Statt Knopf plus Zustand ein
       <details>/<summary>; "aufgeklappt" meldet der Browser selbst,
       "Menue"/"Schliessen" schaltet [open]. Die Liste liegt absolut unter der
       Leiste, an derselben Stelle wie im Entwurf (dort im Fluss der
       Kopfleiste), unten mit der Linie, die die gescrollte Kopfleiste zieht.
       Ihr Grund ist deckend #F8F6F1 statt rgba(248,246,241,.97) mit
       Unschaerfe: Die Unschaerfe der Kopfleiste (backdrop-filter) reicht
       nicht unter die herausragende Liste, und eine eigene saehe dort den
       Seiteninhalt nicht. Ohne sie schienen die 3 % als scharfe Schrift
       durch; mit ihr sind sie unsichtbar, deckend sieht es also gleich aus.
       Nach einem Sprung klappt js/seite.js das Menue zu (closeMenu; wie im
       Entwurf nicht bei "Anrufen"), ebenso beim Wechsel ueber 1080 px oder
       die Hero-Grenze (onMq). Ohne Skript bleibt es offen, bis man den
       Knopf noch einmal drueckt.
    9. LINIE UNTER DER KOPFLEISTE (V7, V8). Der Entwurf liest dafuer bei
       jedem Scrollen scrollY (> 20 px). Hier meldet ein IntersectionObserver
       nur, ob eine 1-px-Marke, die bei 20 px endet, aus dem Bild ist, und
       js/seite.js setzt eine Klasse; kein Stilwert wird aus der
       Scroll-Position gerechnet. Ohne Skript bleibt die Linie durchsichtig
       wie am Seitenanfang des Entwurfs.
   10. RAUM-REITER OHNE SKRIPT (V8). Statt tablist/tab/tabpanel mit Zustand
       drei Radios mit :checked; ihre Beschriftungen sind die Reiter. Bild,
       Ueberschrift und Text aller drei Raeume stehen im Markup, zwei sind
       ausgeblendet (die versteckten Bilder laedt der Browser erst, wenn sie
       gezeigt werden). Der Name der Reiterliste "Raeume der Wohnung" haengt
       als Beschreibung an jedem Radio. Der Fokusring der Reiter liegt
       innen (outline-offset -2px) statt 3 px aussen: Die Reiter liegen Kante
       an Kante unter dem Foto, aussen laege der Ring auf dem Foto und auf
       den Nachbarn.
   11. WAHLKNOEPFE ALS RADIOS (V8). Immobilienart (vier Kacheln) und
       Tageszeit (drei Felder, Vorgabe "Flexibel") waren aria-pressed-Knoepfe
       mit Zustand im Skript; hier Radios in <label> mit gestalteter <span>,
       gleiche Masse und Farben, Fokusring wie im Entwurf 3 px aussen. Die
       <span> bleibt wie der Knopf des Entwurfs so breit wie ihr Rasterfeld
       (min-width 0), statt mit einem langen Wort mitzuwachsen.
   12. WERTEINSCHAETZUNG IN DREI SCHRITTEN PER KLEINEM SKRIPT (V8, V12).
       js/seite.js setzt `data-schritt` am Formular; CSS zeigt den Schritt,
       den Zaehler "Schritt N von 3", die Balken, "Zurueck" und den
       Hauptknopf ("Weiter", im dritten Schritt "Anfrage senden"). Ohne
       Pruefung: "Weiter" geht immer weiter. Ohne Skript stehen alle drei
       Schritte untereinander, Zaehler, Balken und "Zurueck" sind
       ausgeblendet, unten steht nur "Anfrage senden". Verschwindet
       "Zurueck" unter dem Fokus (zurueck in Schritt 1), geht der Fokus auf
       den Hauptknopf statt an den Seitenanfang.
   13. FORMULARE SENDEN NICHTS (V12). In beiden Formularen sind Pruefung,
       Fehlermeldungen, Statusmeldung ("Der Online-Versand ist noch nicht
       eingerichtet ...") und der Knopf "Anfrage als E-Mail oeffnen" weg,
       ebenso `aria-invalid`/`aria-describedby`, die auf die Meldungen
       zeigten. Beide Absende-Knoepfe sind type="button", kein action, nichts
       faengt ein Absenden ab. Die leeren Statuszeilen hielten Abstand: 22 px
       unter der Knopfzeile im Wertformular und 40 px zwischen Knopf und
       "* Pflichtfeld" im Kontaktformular. Beides haelt jetzt ein Rand.
   14. KOPFZEILE DES WERTFORMULARS (V5). "Schritt 1 von 3" steht nowrap neben
       der Ueberschrift; unter 412 px Fensterbreite ragte die Zeile ueber den
       Rand (bei 360 px 36,6 px, waagerechter Ueberlauf der ganzen Seite).
       Die Zeile darf jetzt umbrechen, die Ueberschrift zaehlt dabei mit
       ihrem laengsten Wort: Erst wenn auch "Werteinschaetzung" neben dem
       Zaehler keinen Platz mehr hat (unter rund 460 px), rutscht der Zaehler
       unter die Ueberschrift. Breiter alles wie im Entwurf.
   15. LOGO IM KOPF DARF SCHRUMPFEN (V5). Logo (30 px hoch = 266 px breit)
       und "Menue" passten unter rund 408 px nicht nebeneinander: Bei 360 px
       ragte der Knopf 27,7 px aus dem Fenster, geoeffnet als "Schliessen"
       59,4 px, bei 412 px noch 7,4 px. Statt fester Hoehe jetzt hoechstens
       30 bzw. 40 px hoch und hoechstens so breit wie der Platz; bei 360 px
       ist es rund 218 px breit, geoeffnet rund 186 px. Breiter als rund
       440 px (geoeffnet) bzw. 408 px (zu) steht es wie im Entwurf.
   16. WEICHE TRENNSTRICHE (V5). Bei 360 px ragten acht Woerter aus ihren
       Kaesten: "Schlafzimmer" 8,1 px, "Badezimmer" 4,3 px (Reiter),
       "Wohnflaeche" 17,5 px (Daten der Wohnung), "Mehrfamilienhaus" 35 px
       (Kachel), in Ueber mich "Ansprechpartnerin." 6,2 px (Ueberschrift),
       "Lockangebots." 12,0, "Professionelle" 4,1 und "Interessenten." 5,0 px
       (Liste). Sie tragen &shy; an einer Silbengrenze, "Mehrfamilienhaus"
       an zweien ("Mehr-", "familien-"), weil auch "Mehrfamilien-" bei
       360 px nicht in die Kachel passt. In Reitern, Daten und Kachel steht
       das Wort allein im Kasten; dort erscheint der Strich nur, wo es nicht
       passt (Reiter unter 410, Daten und Kachel unter 432 px). Im
       Fliesstext nimmt der Browser den Strich dagegen ueberall, wo eine
       Zeile in dem Wort endet; dort ist er erst ab 368 px (Ueberschrift)
       bzw. 376 px (Liste) mit `hyphens: none` abgeschaltet (gemessen
       stehen die Woerter ohne Trennung bis 365 bzw. 371 px ueber). Breiter
       bricht alles wie im Entwurf, nachgemessen von 360 bis 1700 px.
       (&shy; statt `hyphens: auto`, weil Chrome unter Windows ohne
       Woerterbuch nicht trennt.)
   17. FOKUSRING IM FUSS (V9, Nicht-Text). #2B4F4B auf #1D2428 sind
       1,74 : 1, praktisch unsichtbar; dort ist er #FFFFFF (15,73 : 1).
   18. PLATZHALTER IM TEXTFELD (V9). Der Entwurf setzt keine Farbe; Chrome
       zeigt #757575 (4,61 : 1 auf Weiss), Firefox rund 54 % der Schrift
       (3,53 : 1). Hier #4A5552, deckend, die Kleintextfarbe des Entwurfs:
       7,74 : 1 auf #FFFFFF.
   19. EINBLENDEN ERGAENZT (V7, Entscheidung 5). Der Entwurf blendet nichts
       ein. Die fuenf Abschnitte Immobilien, Ueber mich, Wertermittlung,
       Verkaufsablauf und Kontakt tragen [data-reveal] und erscheinen einmal
       (400 ms, 12 px). Hero und Leistungsleiste nicht: Das LCP-Element
       steht im ersten Frame, die Leiste bei vielen Fenstern ebenfalls.
       Ohne Skript und bei "Bewegung reduzieren" ist alles sofort da.
   20. ABSCHNITT #rechtliches AM ENDE (V17, wie in jeder Vorlage). Impressum
       und Datenschutzerklaerung im Fuss und in beiden Einwilligungen zeigen
       wie im Entwurf auf eineuroweb.de (Entscheidung 7).
   21. KONTAKTDATEN WIE IM ENTWURF (Entscheidung 3, bewusst abweichend von
       V10): Strandweg 114, 23669 Timmendorfer Strand, 01230 123456789,
       ostseemakler@eineuroweb.de. Benedikt hat sie geprueft.
   22. ZUSAETZLICH AUS DEM MUSTER: <html lang="de"> (der Entwurf hat keins),
       `decoding="async"` an beiden Logos, `loading="lazy"` am Fusslogo wie
       im Entwurf; das Kopflogo bleibt ohne lazy, es steht immer oben im
       Bild. Symbol im Reiter als data:-Adresse (gruene Flaeche ohne
       Buchstaben), damit der Browser nicht nach /favicon.ico fragt.
   23. TAGESZEIT IM KONTAKTFORMULAR (V5). Die drei Felder teilen sich die
       Spalte neben dem Wunschtermin. Bei 480 bis 690 px und auf JEDEM
       Fenster ab 1120 px bleiben dort nur 48 bis 79 px fuer das Wort;
       "Nachmittag" braucht 80, "Vormittag" 67,9, "Flexibel" 52,4 px. Im
       Entwurf deckt das Nachbarfeld den Rest zu: bei 1280 px steht dort
       "Vormitta" und "Nachmitta" (Nachbau mit seinen Knoepfen, 214 px
       breite Leiste). Ab 400 px duerfen die Woerter hier an der
       Silbengrenze umbrechen ("Vor-/mittag", "Nach-/mittag",
       "Flexi-/bel", &shy;); sie stehen dann zweizeilig im selben 50 px
       hohen Feld. Masse, Farben und Anordnung bleiben. Darunter trennen sie
       nicht: Bei 360 px ragt "Nachmittag" wie im Entwurf 1 px in den
       Innenabstand, unsichtbar.

   BEWUSST WIE IM ENTWURF
   ----------------------
   - Die linke Spalte im Verkaufsablauf klebt ab 1080 px (position: sticky),
     waehrend ihre fuenf Schritte vorbeilaufen. Reines CSS: Nichts bewegt
     sich mit der Scroll-Position, nichts aendert sich, der Abschnitt bleibt
     nicht stehen. Das ist kein "gepinnter Abschnitt" im Sinn von
     VORLAGEN-STUFEN, sondern dieselbe Technik wie der erlaubte klebende Kopf.
     Achtung: Ein Vorfahr mit overflow hidden/auto schaltet sticky ab; wer je
     einen Rahmen braucht, nimmt overflow-x: clip.
   - "Energieausweis: [Angaben folgen]" steht so, mit eckiger Klammer, im
     Entwurf und deshalb auch hier.
   - Die Linien (#D8D0C2, #D0C7B7, #5A7A76, #3A4448) und die Feldrahmen
     (#C9C0B0, 1,80 : 1 auf Weiss) bleiben wie im Entwurf; ueber jedem Feld
     steht seine Beschriftung.
   - Das Fehlerrot #A3352A des Entwurfs kommt nur in den entfallenen
     Meldungen vor und steht deshalb nicht in `:root`.

   KONTRASTE — GERECHNET, NICHT GESCHAETZT (V9)
   --------------------------------------------
   WCAG-2.1-Relativluminanz, sRGB. Halbtransparente Flaechen sind vorher im
   sRGB-Raum verrechnet, so wie der Browser es tut.

     --tinte #1D2428      auf --grund #F8F6F1 ......... 14,56 : 1   OK
     --tinte              auf --sand #EEE9E0 .......... 13,01 : 1   OK
     --tinte              auf --weiss #FFFFFF ......... 15,73 : 1   OK
     --tinte              auf --bildgrund #E2DBCE ..... 11,43 : 1   OK
     --vorspann #2E3A3F   auf --grund ................. 10,84 : 1   OK
     --vorspann           auf --sand ..................  9,69 : 1   OK
     --leise #4A5552      auf --grund .................  7,17 : 1   OK
     --leise              auf --sand ..................  6,40 : 1   OK
     --leise              auf --weiss (Platzhalter) ...  7,74 : 1   OK
     --gruen #2B4F4B      auf --grund .................  8,37 : 1   OK
     --gruen              auf --sand ..................  7,48 : 1   OK
     --weiss              auf --gruen (Knoepfe) .......  9,04 : 1   OK
     --weiss              auf --tinte (Hover) ......... 15,73 : 1   OK
   WERTERMITTLUNG, Grund --gruen #2B4F4B:
     --weiss (Ueberschrift, Liste) .....................  9,04 : 1   OK
     --gruen-vorzeile #D3E0DD ..........................  6,66 : 1   OK
     --gruen-text #E4ECEA ..............................  7,53 : 1   OK
   FUSS, Grund --tinte #1D2428:
     --fuss-text #D5DAD8 ............................... 11,12 : 1   OK
     --weiss (Verweise) ................................ 15,73 : 1   OK

   KOPFLEISTE. rgba(248,246,241,.97) laesst 3 % durch. Gerechnet gegen
   alles, was darunter durchlaeuft: ueber #1D2428 wird sie #F1F0EB (--tinte
   13,78, --gruen 7,92), ueber #2B4F4B #F2F1EC (13,91 / 7,99), ueber
   Schwarz #F1EFEA (13,69 / 7,87) — OK. Das Handy-Menue ist deckend
   --grund (Abweichung 8): --tinte 14,56, "Anrufen" --gruen 8,37.

   HERO SCHMAL. Der Text steht auf --grund, nicht auf dem Foto (Werte oben).

   HERO BREIT. Dunkle Schrift auf hellem Schleier ueber dem Foto. Gemessen
   im Browser mit den echten Schriften, Massen und dem echten Foto: Schrift
   unsichtbar geschaltet, dann jeder Bildpunkt unter jeder Textzeile gegen
   die Schriftfarbe gerechnet; je Fenster der DUNKELSTE Punkt.
   Verlauf des Entwurfs (.9 / .72 bei 30 % / 0 bei 56 %):
     Fenster      Vorzeile   h1 --tinte   Vorspann   "Aktuelle Angebote"
     900 x 700      1,53       2,42         3,62        10,00
     1024 x 768     1,42       2,40         1,66         3,48
     1280 x 800     5,92       2,58         6,38         7,25
     1440 x 900     6,28       2,30         5,47         6,48
     1920 x 1080    5,83       2,85         7,10         6,36    FAELLT DURCH
   > Folge: Abweichung 7. Mit dem neuen Verlauf (.9 / .8 bei 52 % / 0 bei
   > 72 %), am 31.10.2026 an der fertigen Seite nachgemessen: im Raster
   > (1 616 Fenster; Breite 900 bis 1500 px in 5-px-, bis 3800 px in 20-
   > und 80-px-Schritten; Hoehe 717 bis 1113 px, nur dazwischen aendert
   > sich der Hero mit der Hoehe) und im Feinbereich 920 bis 1010 px, wo
   > die Vorzeile in eine Zeile springt (2 307 Fenster, jedes Pixel, Hoehe
   > in 10-px-Schritten). Je ohne Rollbalken, mit 15 px (Chrome unter
   > Windows 11) und mit 17 px (klassischer Balken, nachgestellt), je mit
   > `text-wrap: balance` und mit gierigem Umbruch (Browser ohne balance).
   > Auswahl, ohne Rollbalken:
     900 x 700      5,75      10,08         8,13        11,49
     935 x 700      5,58      10,31         8,25        10,52
     935 x 800      5,49      10,09         8,17        10,69
     960 x 900      5,98      10,02         9,12        11,92
     1024 x 768     5,88       9,99         7,63        10,63
     1080 x 1080    5,85      10,21         7,52        10,43
     1280 x 800     7,46      10,15         9,43        10,52
     1440 x 900     7,52       9,96         8,27        10,45
     1920 x 1080    7,46      10,00         8,72        10,42
     2560 x 1440    7,51      10,04         9,43        12,28
     3440 x 1440    7,58       9,79        10,31        12,58   alles OK
   Schlechtester Wert ueber alle 3 904 Fenster, Vorzeile / h1 / Vorspann /
   "Aktuelle Angebote": ohne Rollbalken 5,44 (933 x 747) / 9,77 / 7,12 /
   9,91; mit 15 px 5,16 (934 x 907) / 9,75 / 6,81 / 9,91; mit 17 px 5,10
   (933 x 887) / 9,77 / 6,73 / 9,93 — OK. Gieriger Umbruch verschiebt je
   Fenster den Vorspann um bis zu 1,9, die anderen Zeilen um hoechstens
   0,08; die schlechtesten Werte bleiben dieselben. Doppelte Pixeldichte
   aendert die Werte um hoechstens 0,24 (zehn Fenster verglichen).
   Rechnerische Untergrenze, Schleier ueber reinem Schwarz am weitesten
   rechts liegenden Zeilenende (Abweichung 7): --gruen 5,23, --tinte 9,11,
   --vorspann 6,78; mit 17 px Rollbalken 4,71 / 8,19 / 6,10 — OK.
   "Immobilie bewerten lassen" steht auf seinem eigenen gruenen Grund
   (--weiss 9,04). Die gemessenen Werte gelten fuer dieses Foto, die
   Untergrenze fuer jedes: Tauscht die persoenliche Vorschau das
   Titelbild, bleibt sie, solange der Text in seiner Spalte steht.

   NICHT-TEXT (nur zur Einordnung; V9 gilt fuer Text). Fokusring #2B4F4B auf
   --grund 8,37, auf --sand 7,48, auf --weiss 9,04; im Fuss #FFFFFF 15,73.
   Feldrahmen #C9C0B0 auf --weiss 1,80, Linien #D8D0C2 auf --grund 1,42.
   ========================================================================= */


/* ── Schriften · selbst ausgeliefert, kein Abruf zu einem fremden Server ── */

@font-face {
  font-family: "Marcellus";
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url("../vendor/fonts/marcellus-400-latin.woff2") format("woff2");
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

@font-face {
  font-family: "Plus Jakarta Sans";
  font-style: normal;
  font-weight: 400 700;          /* Datei traegt wght 200-800, freigegeben 400-700 */
  font-display: swap;
  src: url("../vendor/fonts/plus-jakarta-sans-400-700-latin.woff2") format("woff2");
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}


/* ── Tokens · jeder Wert aus dem Entwurf ─────────────────────────────────── */

:root {
  --grund: #F8F6F1;          /* Seitengrund, Formularkaesten, gewaehlter Reiter */
  --kopf-grund: rgba(248, 246, 241, 0.97);  /* Kopfleiste */
  --tinte: #1D2428;          /* Text, Ueberschriften, Fuss, Hover der Knoepfe */
  --gruen: #2B4F4B;          /* Knoepfe, Vorzeilen, Verweise, Fokusring, Wertermittlung */
  --weiss: #FFFFFF;          /* Knopfschrift, Felder, Kacheln, Verweise im Fuss */
  --vorspann: #2E3A3F;       /* Vorspann, Fliesstext, Leistungsleiste, Einwilligung */
  --leise: #4A5552;          /* Kleintext, Daten, Hinweise, Platzhalter */
  --sand: #EEE9E0;           /* Ueber mich, Kontakt, Karte der Wohnung */
  --bildgrund: #E2DBCE;      /* Grund hinter den Fotos */
  --himmel: #BCD4E6;         /* Grund der Hero-Buehne und hinter dem Hero-Foto */
  --linie: #D8D0C2;          /* Linien: Kopfleiste, Menue, Leiste, Reiter, Daten, Ablauf, Balken */
  --linie-sand: #D0C7B7;     /* Linien auf --sand */
  --feldrand: #C9C0B0;       /* Rahmen der Felder, Kacheln und der Tageszeit */
  --gruen-vorzeile: #D3E0DD; /* Vorzeile auf Gruen */
  --gruen-text: #E4ECEA;     /* Vorspann auf Gruen */
  --gruen-linie: #5A7A76;    /* Linien der Liste auf Gruen */
  --fuss-text: #D5DAD8;      /* Text im Fuss */
  --fuss-linie: #3A4448;     /* Trennlinie im Fuss */

  --schrift: "Plus Jakarta Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
  --feldschrift: "Plus Jakarta Sans", sans-serif;   /* so an Knoepfen und Feldern */
  --titelschrift: "Marcellus", Georgia, serif;

  --breite: 1400px;
  --rand: clamp(20px, 4vw, 56px);
  --abschnitt: clamp(80px, 10vw, 152px);
  --notice: 26px;            /* feste Hinweisleiste aus A17 */
  --kopf: 84px;              /* Kopfleiste */
}


/* ── Grundlage · die globalen Regeln des Entwurfs ────────────────────────── */

html {
  scroll-behavior: smooth;
  -webkit-text-size-adjust: 100%;
}

body {
  margin: 0;
  padding-top: var(--notice);
  background: var(--grund);
  color: var(--tinte);
  font-family: var(--schrift);
  -webkit-font-smoothing: antialiased;
}

*,
*::before,
*::after { box-sizing: border-box; }

a {
  color: var(--gruen);
  text-underline-offset: 3px;
}

a:hover { color: var(--tinte); }

:focus-visible {
  outline: 2px solid var(--gruen);
  outline-offset: 3px;
  border-radius: 2px;
}

/* Sprungverweis; die Fokus-Angabe des Entwurfs ist `:focus`. */
.skip {
  position: absolute;
  left: -9999px;
  top: calc(var(--notice) + 8px);
  z-index: 100;
  padding: 10px 16px;
  background: var(--gruen);
  color: var(--weiss);
}

.skip:hover { color: var(--weiss); }
.skip:focus { left: 8px; }

/* Abweichung 9: Die Marke endet 20 px unter dem Seitenanfang; js/seite.js
   beobachtet sie. Ein IntersectionObserver zaehlt einen Kasten, der den
   Fensterrand nur beruehrt, noch als sichtbar. Endet sie bei 20 px, ist sie
   also genau ab scrollY > 20 aus dem Bild, wie im Entwurf. */
.kopf-marke {
  position: absolute;
  top: 19px;
  left: 0;
  width: 1px;
  height: 1px;
  pointer-events: none;
}

/* Versteckte Radios fuer Reiter, Kacheln und Tageszeit (Abweichungen 10, 11).
   Ohne `display: none`, sonst waeren sie mit der Tastatur nicht erreichbar. */
.wahl {
  position: absolute;
  width: 1px;
  height: 1px;
  margin: 0;
  opacity: 0;
  pointer-events: none;
}


/* ── Kopfleiste ──────────────────────────────────────────────────────────── */

.kopf {
  position: fixed;
  top: var(--notice);
  left: 0;
  right: 0;
  z-index: 50;
  background: var(--kopf-grund);
  border-bottom: 1px solid transparent;
  -webkit-backdrop-filter: blur(10px);
  backdrop-filter: blur(10px);
}

.kopf.is-gescrollt { border-bottom-color: var(--linie); }

.kopf__innen {
  max-width: var(--breite);
  margin: 0 auto;
  padding: 0 var(--rand);
  height: var(--kopf);
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 24px;
}

/* Abweichung 15: min-width 0 und die Hoechstmasse lassen das Logo schmal
   werden, wo es neben dem Menue-Knopf sonst aus dem Fenster schoebe. */
.kopf__marke {
  display: flex;
  align-items: center;
  min-width: 0;
}

.kopf__logo {
  display: block;
  width: auto;
  height: auto;
  max-width: 100%;
  max-height: 30px;
}

.kopf__nav {
  display: none;
  align-items: center;
  gap: 32px;
}

.kopf__link {
  color: var(--tinte);
  text-decoration: none;
  font-size: 15px;
  font-weight: 600;
}

.kopf__link:hover { text-decoration: underline; }

/* Knoepfe mit gruenem Grund. Breite und Hoehe je Stelle wie im Entwurf. */
.knopf {
  display: inline-flex;
  align-items: center;
  background: var(--gruen);
  color: var(--weiss);
  text-decoration: none;
  font-weight: 600;
}

.knopf:hover {
  background: var(--tinte);
  color: var(--weiss);
}

.knopf--kopf { height: 50px; padding: 0 26px; font-size: 15px; }
.knopf--karte { height: 54px; padding: 0 24px; font-size: 15px; }
.knopf--gross { height: 56px; padding: 0 28px; font-size: 16px; }
.knopf--start { align-self: flex-start; }

/* Knopf mit Rahmen (Haus und Villa). */
.knopf-rahmen {
  display: inline-flex;
  align-items: center;
  height: 50px;
  padding: 0 22px;
  border: 1px solid var(--gruen);
  color: var(--gruen);
  text-decoration: none;
  font-size: 15px;
  font-weight: 600;
}

.knopf-rahmen:hover {
  background: var(--gruen);
  color: var(--weiss);
}

/* Handy-Menue: <details> statt Knopf mit Zustand (Abweichung 8). Der Knopf
   traegt dieselben Masse wie der <button> des Entwurfs. */
.menue__knopf {
  display: flex;
  align-items: center;
  justify-content: center;
  height: 46px;
  padding: 0 18px;
  border: 1px solid var(--tinte);
  background: transparent;
  color: var(--tinte);
  font: 600 15px var(--feldschrift);
  cursor: pointer;
  list-style: none;
}

.menue__knopf::-webkit-details-marker { display: none; }

.menue__auf { display: none; }
.menue[open] .menue__zu { display: none; }
.menue[open] .menue__auf { display: inline; }

/* Bezugsrahmen ist die feste Kopfleiste, nicht <details>: So liegt die Liste
   ueber die volle Breite direkt unter der Leiste, wie im Entwurf. Deckend
   statt 97 % (Abweichung 8): Die Unschaerfe der Kopfleiste reicht nicht unter
   die Liste, und ohne sie schiene der Text darunter scharf durch. */
.menue__liste {
  position: absolute;
  top: 100%;
  left: 0;
  right: 0;
  display: flex;
  flex-direction: column;
  padding: 4px var(--rand) 24px;
  background: var(--grund);
  border-top: 1px solid var(--linie);
  border-bottom: 1px solid transparent;
}

.kopf.is-gescrollt .menue__liste { border-bottom-color: var(--linie); }

.menue__link {
  padding: 15px 0;
  border-bottom: 1px solid var(--linie);
  color: var(--tinte);
  text-decoration: none;
  font-family: var(--titelschrift);
  font-size: 26px;
}

.menue__knoepfe {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 12px;
  margin-top: 20px;
}

.menue__anruf,
.menue__kontakt {
  display: flex;
  align-items: center;
  justify-content: center;
  height: 54px;
  text-decoration: none;
  font-size: 15px;
  font-weight: 600;
}

/* "Anrufen" traegt im Entwurf keine eigene Farbe: Verweisfarbe, beim
   Darueberfahren --tinte. "Kontakt" hat keinen Hover-Zustand. */
.menue__anruf { border: 1px solid var(--gruen); }

.menue__kontakt,
.menue__kontakt:hover {
  background: var(--gruen);
  color: var(--weiss);
}


/* ── Hero ────────────────────────────────────────────────────────────────── */
/* Schmal (Ausgangszustand): Text oben auf --grund, Foto 4:3 darunter. */

.hero {
  padding-top: var(--kopf);
  background: var(--grund);
}

.hero__rahmen { padding: 36px clamp(20px, 6vw, 56px) 36px; }

.hero__inhalt {
  display: flex;
  flex-direction: column;
  gap: 22px;
}

.hero__zeile {
  margin: 0;
  font-size: 13px;
  font-weight: 600;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--gruen);
}

.hero__zeile-breit { display: none; }

.hero__titel {
  margin: 0;
  font-family: var(--titelschrift);
  font-weight: 400;
  font-size: clamp(40px, 10vw, 72px);
  line-height: 1.04;
  text-wrap: balance;
}

.hero__vorspann {
  margin: 0;
  font-size: 17px;
  line-height: 1.7;
  color: var(--vorspann);
  text-wrap: pretty;
}

.hero__knoepfe {
  display: flex;
  flex-direction: column;
  gap: 14px;
}

.hero__knopf {
  display: flex;
  align-items: center;
  justify-content: center;
  height: 56px;
  background: var(--gruen);
  color: var(--weiss);
  text-decoration: none;
  font-size: 16px;
  font-weight: 600;
}

/* Schmal ohne Hover-Zustand wie im Entwurf (Abweichung 6). */
.hero__knopf:hover { color: var(--weiss); }

.hero__link {
  align-self: center;
  color: var(--tinte);
  font-size: 16px;
  font-weight: 600;
}

.hero__bild {
  display: block;
  width: 100%;
  height: auto;
  aspect-ratio: 4 / 3;
  object-fit: cover;
  object-position: 75% 50%;
  background: var(--himmel);
}

.hero__schleier { display: none; }


/* ── Leistungsleiste ─────────────────────────────────────────────────────── */

.leiste { border-bottom: 1px solid var(--linie); }

.leiste__innen {
  max-width: var(--breite);
  margin: 0 auto;
  padding: 22px var(--rand);
  display: flex;
  flex-wrap: wrap;
  justify-content: space-between;
  gap: 10px 32px;
  font-size: 15px;
  color: var(--vorspann);
}

.leiste__stark {
  font-weight: 600;
  color: var(--tinte);
}


/* ── Abschnitte ──────────────────────────────────────────────────────────── */

.abschnitt { padding: var(--abschnitt) var(--rand); }
.abschnitt--sand { background: var(--sand); }

section[id] { scroll-margin-top: calc(var(--notice) + var(--kopf)); }
.hero[id] { scroll-margin-top: var(--notice); }

/* Ziel von "Zum Inhalt springen": <main> beginnt mit dem Hero 26 px tiefer
   und haelt deshalb dieselben 26 px wie #top; so landet der Sprung wie im
   Entwurf bei 0 (Abweichung 3). */
#inhalt { scroll-margin-top: var(--notice); }

.rahmen {
  max-width: var(--breite);
  margin: 0 auto;
}

.vorzeile {
  margin: 0;
  font-size: 14px;
  font-weight: 600;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--gruen);
}

.vorzeile--karte { font-size: 13px; letter-spacing: 0.16em; }
.vorzeile--gruen { color: var(--gruen-vorzeile); }

.titel {
  margin: 0;
  font-family: var(--titelschrift);
  font-weight: 400;
}

.titel--h2 { font-size: clamp(38px, 4.4vw, 68px); line-height: 1.04; text-wrap: balance; }
.titel--wert { font-size: clamp(42px, 5vw, 80px); line-height: 1.02; text-wrap: balance; }
.titel--kontakt { font-size: clamp(40px, 4.8vw, 76px); line-height: 1.02; text-wrap: balance; }
.titel--p1 { font-size: clamp(30px, 2.8vw, 44px); line-height: 1.1; }
.titel--objekt { font-size: clamp(28px, 2.4vw, 38px); line-height: 1.1; }
.titel--raum { font-size: 24px; }
.titel--form { font-size: 30px; }
.titel--schritt { font-size: 26px; line-height: 1.2; }


/* ── Immobilien ──────────────────────────────────────────────────────────── */

.immo {
  display: flex;
  flex-direction: column;
  gap: clamp(48px, 6vw, 80px);
}

.immo__kopf {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 420px), 1fr));
  gap: 20px 72px;
  align-items: end;
}

.immo__titelblock {
  display: flex;
  flex-direction: column;
  gap: 20px;
}

.immo__intro {
  margin: 0;
  max-width: 520px;
  font-size: 17px;
  line-height: 1.75;
  color: var(--leise);
}

.immo__fussnote {
  margin: 0;
  font-size: 13px;
  line-height: 1.6;
  color: var(--leise);
}

/* Die Wohnung: links Foto und Reiter, rechts Text. */
.p1 {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 460px), 1fr));
  gap: 0;
  background: var(--sand);
}

.p1__medien {
  display: flex;
  flex-direction: column;
  min-width: 0;
}

.p1__bild {
  display: block;
  width: 100%;
  height: auto;
  aspect-ratio: 3 / 2;
  object-fit: cover;
  background: var(--bildgrund);
}

.p1__reiter {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  border-top: 1px solid var(--linie);
}

.reiter {
  display: flex;
  align-items: center;
  justify-content: center;
  min-height: 56px;
  padding: 10px 12px;
  border-bottom: 3px solid transparent;
  background: transparent;
  color: var(--tinte);
  font: 600 15px var(--feldschrift);
  text-align: center;
  cursor: pointer;
}

.p1__text {
  padding: clamp(28px, 4vw, 56px);
  display: flex;
  flex-direction: column;
  gap: 22px;
  min-width: 0;
}

.p1__raum {
  display: flex;
  flex-direction: column;
  gap: 10px;
}

.p1__raumtext {
  margin: 0;
  font-size: 16px;
  line-height: 1.75;
  color: var(--vorspann);
  text-wrap: pretty;
}

/* Abweichung 10: Raum 1 steht, bis ein anderes Radio gewaehlt ist. */
.p1__bild--2,
.p1__bild--3,
.p1__raum--2,
.p1__raum--3 { display: none; }

#raum-2:checked ~ .p1__medien .p1__bild--1,
#raum-3:checked ~ .p1__medien .p1__bild--1,
#raum-2:checked ~ .p1__text .p1__raum--1,
#raum-3:checked ~ .p1__text .p1__raum--1 { display: none; }

#raum-2:checked ~ .p1__medien .p1__bild--2,
#raum-3:checked ~ .p1__medien .p1__bild--3 { display: block; }

#raum-2:checked ~ .p1__text .p1__raum--2,
#raum-3:checked ~ .p1__text .p1__raum--3 { display: flex; }

#raum-1:checked ~ .p1__medien .reiter--1,
#raum-2:checked ~ .p1__medien .reiter--2,
#raum-3:checked ~ .p1__medien .reiter--3 {
  border-bottom-color: var(--gruen);
  background: var(--grund);
}

#raum-1:focus-visible ~ .p1__medien .reiter--1,
#raum-2:focus-visible ~ .p1__medien .reiter--2,
#raum-3:focus-visible ~ .p1__medien .reiter--3 {
  outline: 2px solid var(--gruen);
  outline-offset: -2px;
  border-radius: 2px;
}

/* Kenndaten: vier Spalten bei der Wohnung, drei bei Haus und Villa. */
.daten {
  margin: 0;
  display: grid;
  gap: 12px;
}

.daten > div {
  display: flex;
  flex-direction: column;
  gap: 2px;
}

.daten dt {
  font-size: 13px;
  color: var(--leise);
}

.daten dd {
  margin: 0;
  font-weight: 600;
}

.daten--p1 {
  grid-template-columns: repeat(4, minmax(0, 1fr));
  border-top: 1px solid var(--linie-sand);
  border-bottom: 1px solid var(--linie-sand);
  padding: 16px 0;
}

.daten--p1 dd { font-size: 17px; }

.daten--objekt {
  grid-template-columns: repeat(3, minmax(0, 1fr));
  border-top: 1px solid var(--linie);
  border-bottom: 1px solid var(--linie);
  padding: 14px 0;
}

.daten--objekt dd { font-size: 16px; }

.p1__preiszeile {
  display: flex;
  flex-wrap: wrap;
  justify-content: space-between;
  align-items: flex-end;
  gap: 16px 24px;
  margin-top: auto;
  padding-top: 8px;
}

.p1__preisblock {
  display: flex;
  flex-direction: column;
  gap: 4px;
}

.klein {
  font-size: 13px;
  color: var(--leise);
}

.preis {
  font-family: var(--titelschrift);
  font-size: 30px;
  line-height: 1;
}

.preis--gross { font-size: 36px; }

/* Haus und Villa */
.angebote {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 440px), 1fr));
  gap: clamp(24px, 3vw, 40px);
}

.objekt {
  display: flex;
  flex-direction: column;
  gap: 22px;
}

.objekt__bild {
  display: block;
  width: 100%;
  height: auto;
  aspect-ratio: 3 / 2;
  object-fit: cover;
  background: var(--bildgrund);
}

.objekt__text {
  display: flex;
  flex-direction: column;
  gap: 12px;
}

.objekt__beschreibung {
  margin: 0;
  font-size: 16px;
  line-height: 1.75;
  color: var(--leise);
  text-wrap: pretty;
}

.objekt__preiszeile {
  display: flex;
  flex-wrap: wrap;
  justify-content: space-between;
  align-items: center;
  gap: 16px;
}


/* ── Ueber mich ──────────────────────────────────────────────────────────── */

.ueber {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 400px), 1fr));
  gap: clamp(40px, 7vw, 120px);
  align-items: center;
}

.ueber__bild {
  display: block;
  width: 100%;
  max-width: 560px;
  height: auto;
  aspect-ratio: 4 / 5;
  object-fit: cover;
  background: var(--bildgrund);
}

.ueber__text {
  display: flex;
  flex-direction: column;
  gap: 26px;
}

.ueber__vorspann {
  margin: 0;
  max-width: 560px;
  font-size: 18px;
  line-height: 1.75;
  color: var(--vorspann);
  text-wrap: pretty;
}

.ueber__liste {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-direction: column;
}

.ueber__liste li {
  border-top: 1px solid var(--linie-sand);
  padding: 16px 0;
  display: grid;
  grid-template-columns: minmax(0, 200px) minmax(0, 1fr);
  gap: 16px;
}

.ueber__liste li:last-child { border-bottom: 1px solid var(--linie-sand); }

.ueber__begriff {
  font-family: var(--titelschrift);
  font-size: 21px;
}

.ueber__erklaerung {
  font-size: 16px;
  line-height: 1.65;
  color: var(--leise);
}

/* Abweichung 16: Im Fliesstext nimmt der Browser einen weichen Trennstrich
   ueberall, wo eine Zeile in diesem Wort endet, nicht nur, wo das Wort nicht
   passt. Ueberschrift und Liste trennen deshalb nur, solange die Woerter
   sonst ueberstehen (gemessen: Ueberschrift bis 365 px, Liste bis 371 px),
   mit 2 bis 4 px Reserve. Breiter brechen sie wie im Entwurf. */
@media (min-width: 368px) {
  .ueber .titel--h2 {
    -webkit-hyphens: none;
    hyphens: none;
  }
}

@media (min-width: 376px) {
  .ueber__erklaerung {
    -webkit-hyphens: none;
    hyphens: none;
  }
}


/* ── Wertermittlung ──────────────────────────────────────────────────────── */

.wert {
  background: var(--gruen);
  color: var(--weiss);
}

.wert__raster {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 420px), 1fr));
  gap: 56px clamp(48px, 7vw, 120px);
  align-items: start;
}

.wert__text {
  display: flex;
  flex-direction: column;
  gap: 26px;
}

.wert__vorspann {
  margin: 0;
  max-width: 500px;
  font-size: 18px;
  line-height: 1.75;
  color: var(--gruen-text);
  text-wrap: pretty;
}

.wert__liste {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 200px), 1fr));
  gap: 0 28px;
  font-size: 16px;
}

.wert__liste li {
  border-top: 1px solid var(--gruen-linie);
  padding: 14px 0;
}

.wform {
  background: var(--grund);
  color: var(--tinte);
  padding: clamp(24px, 4vw, 48px);
  display: flex;
  flex-direction: column;
  gap: 22px;
}

/* Abweichung 14: flex-wrap, und die Ueberschrift zaehlt beim Umbrechen nur
   mit ihrem laengsten Wort; daneben fuellt sie den Platz wie im Entwurf. */
.wform__kopf {
  display: flex;
  flex-wrap: wrap;
  justify-content: space-between;
  align-items: baseline;
  gap: 16px;
}

.wform__kopf .titel--form { flex: 1 1 0; }

.wform__stand {
  font-size: 14px;
  font-weight: 600;
  color: var(--gruen);
  white-space: nowrap;
}

.wform__balken {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 6px;
}

.wform__balken span {
  height: 3px;
  background: var(--linie);
}

.wform__balken span:first-child,
.wform[data-schritt="2"] .wform__balken span:nth-child(2),
.wform[data-schritt="3"] .wform__balken span { background: var(--gruen); }

/* Abweichung 12: Ohne Skript traegt das Formular kein data-schritt, dann
   stehen alle drei Schritte da und Zaehler, Balken und "Zurueck" fehlen. */
.wform:not([data-schritt]) .wform__stand,
.wform:not([data-schritt]) .wform__balken { display: none; }

.wform[data-schritt] .schritt { display: none; }

.wform[data-schritt="1"] .schritt--1,
.wform[data-schritt="2"] .schritt--2,
.wform[data-schritt="3"] .schritt--3 { display: flex; }

.schritt {
  display: flex;
  flex-direction: column;
  gap: 18px;
}

.schritt--1 {
  margin: 0;
  padding: 0;
  border: 0;
  gap: 12px;
}

.schritt__frage {
  font-size: 16px;
  font-weight: 600;
  margin-bottom: 12px;
}

.kacheln {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 10px;
}

.kachel {
  position: relative;
  display: flex;
  cursor: pointer;
}

/* min-width 0: Die Kachel bleibt so breit wie ihr Feld im Raster, wie der
   Knopf des Entwurfs; ein zu langes Wort stuende ueber, statt die Kachel zu
   verbreitern (Abweichung 11). */
.kachel__feld {
  flex: 1 1 auto;
  min-width: 0;
  display: flex;
  align-items: center;
  min-height: 60px;
  padding: 10px 14px;
  border: 1px solid var(--feldrand);
  background: var(--weiss);
  color: var(--tinte);
  font: 600 16px var(--feldschrift);
  text-align: left;
}

.kachel input:checked + .kachel__feld {
  border-color: var(--gruen);
  background: var(--gruen);
  color: var(--weiss);
}

.wform__knoepfe {
  display: flex;
  flex-wrap: wrap;
  justify-content: space-between;
  gap: 12px;
  margin-bottom: 22px;          /* Abweichung 13: Platz der leeren Statuszeile */
}

.wform__zurueck {
  display: none;
  height: 54px;
  padding: 0 22px;
  border: 1px solid var(--tinte);
  background: transparent;
  color: var(--tinte);
  font: 600 15px var(--feldschrift);
  cursor: pointer;
}

.wform[data-schritt="2"] .wform__zurueck,
.wform[data-schritt="3"] .wform__zurueck { display: inline-block; }

.wform__weiter {
  margin-left: auto;
  height: 54px;
  padding: 0 28px;
  border: 0;
  background: var(--gruen);
  color: var(--weiss);
  font: 600 16px var(--feldschrift);
  cursor: pointer;
}

.wform__weiter:hover { background: var(--tinte); }

/* Felder beider Formulare */
.feld {
  display: flex;
  flex-direction: column;
  gap: 8px;
}

.feld__name {
  font-size: 15px;
  font-weight: 600;
}

/* Auswahllisten, Zahl- und Datumsfelder (Gewicht 500, Innenabstand 12 px) */
.feld__wahl {
  height: 52px;
  padding: 0 12px;
  border: 1px solid var(--feldrand);
  border-radius: 0;
  background: var(--weiss);
  color: var(--tinte);
  font: 500 16px var(--feldschrift);
}

/* Text-, Telefon- und Mailfelder (Gewicht 400, Innenabstand 14 px) */
.feld__eingabe {
  height: 52px;
  padding: 0 14px;
  border: 1px solid var(--feldrand);
  border-radius: 0;
  background: var(--weiss);
  color: var(--tinte);
  font: 400 16px var(--feldschrift);
}

.feld__text {
  padding: 12px 14px;
  border: 1px solid var(--feldrand);
  border-radius: 0;
  background: var(--weiss);
  color: var(--tinte);
  font: 400 16px/1.6 var(--feldschrift);
  resize: vertical;
}

/* Abweichung 18 */
.feld__text::placeholder {
  color: var(--leise);
  opacity: 1;
}

.feldreihe {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, var(--spalte)), 1fr));
  gap: var(--luecke);
}

.feldreihe--130 { --spalte: 130px; --luecke: 16px; }
.feldreihe--180 { --spalte: 180px; --luecke: 20px; }
.feldreihe--200 { --spalte: 200px; --luecke: 16px; }
.feldreihe--weit { --luecke: 20px; }

.einwilligung {
  display: flex;
  gap: 12px;
  align-items: flex-start;
}

.einwilligung__feld {
  flex: none;
  width: 22px;
  height: 22px;
  margin: 2px 0 0;
  accent-color: var(--gruen);
}

.einwilligung__text {
  font-size: 15px;
  line-height: 1.55;
  color: var(--vorspann);
}

/* Fokusring der versteckten Radios auf ihrer sichtbaren Flaeche, wie der
   Ring, den der Entwurf an seinen Knoepfen zeigt (Abweichung 11). */
.kachel input:focus-visible + .kachel__feld,
.tageszeit__wahl input:focus-visible + .tageszeit__feld {
  outline: 2px solid var(--gruen);
  outline-offset: 3px;
  border-radius: 2px;
}


/* ── Verkaufsablauf ──────────────────────────────────────────────────────── */

.ablauf {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 380px), 1fr));
  gap: 48px clamp(48px, 7vw, 120px);
  align-items: start;
}

.ablauf__kopf {
  display: flex;
  flex-direction: column;
  gap: 22px;
}

.ablauf__vorspann {
  margin: 0;
  max-width: 440px;
  font-size: 17px;
  line-height: 1.75;
  color: var(--leise);
}

.ablauf__knopf { margin-top: 8px; }

.ablauf__liste {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-direction: column;
}

.ablauf__schritt {
  border-top: 1px solid var(--linie);
  padding: 30px 0;
  display: grid;
  grid-template-columns: 72px minmax(0, 1fr);
  gap: 20px;
}

.ablauf__nr {
  font-family: var(--titelschrift);
  font-size: 44px;
  line-height: 0.9;
  color: var(--gruen);
}

.ablauf__inhalt {
  display: flex;
  flex-direction: column;
  gap: 8px;
}

.ablauf__text {
  margin: 0;
  font-size: 16px;
  line-height: 1.75;
  color: var(--leise);
  text-wrap: pretty;
}

/* Die Schlusslinie: ein leerer Listenpunkt wie im Entwurf. */
.ablauf__ende { border-top: 1px solid var(--linie); }


/* ── Kontakt ─────────────────────────────────────────────────────────────── */

.kontakt {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 400px), 1fr));
  gap: 56px clamp(48px, 7vw, 120px);
  align-items: start;
}

.kontakt__links {
  display: flex;
  flex-direction: column;
  gap: 30px;
}

.kontakt__kopf {
  display: flex;
  flex-direction: column;
  gap: 22px;
}

.kontakt__vorspann {
  margin: 0;
  max-width: 460px;
  font-size: 17px;
  line-height: 1.75;
  color: var(--vorspann);
}

.kontakt__liste {
  margin: 0;
  display: flex;
  flex-direction: column;
}

.kontakt__zeile {
  border-top: 1px solid var(--linie-sand);
  padding: 16px 0;
  display: grid;
  grid-template-columns: 100px minmax(0, 1fr);
  gap: 16px;
}

.kontakt__zeile:last-child { border-bottom: 1px solid var(--linie-sand); }

.kontakt__zeile dt {
  font-size: 13px;
  font-weight: 600;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--leise);
  padding-top: 3px;
}

.kontakt__zeile dd {
  margin: 0;
  font-size: 17px;
}

.kontakt__adresse {
  font-style: normal;
  line-height: 1.5;
}

.kontakt__stark { font-weight: 600; }
.kontakt__mail { overflow-wrap: anywhere; }

.kform {
  background: var(--grund);
  padding: clamp(24px, 4vw, 48px);
  display: flex;
  flex-direction: column;
  gap: 20px;
}

.zeitwahl {
  margin: 0;
  padding: 0;
  border: 0;
  display: flex;
  flex-direction: column;
  gap: 8px;
  min-width: 0;
}

.zeitwahl__name {
  font-size: 15px;
  font-weight: 600;
  margin-bottom: 8px;
}

.tageszeit {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  border: 1px solid var(--feldrand);
}

.tageszeit__wahl {
  position: relative;
  display: flex;
  cursor: pointer;
}

/* Abweichung 23: Unter 400 px trennen die drei Woerter nicht (dort passen
   sie, bei 360 px bleibt "Nachmittag" 1 px im Innenabstand wie im Entwurf).
   Ab 400 px duerfen sie an der Silbengrenze umbrechen, statt vom Nachbarfeld
   abgeschnitten zu werden. */
.tageszeit__feld {
  flex: 1 1 auto;
  min-width: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  height: 50px;
  padding: 0 6px;
  background: var(--weiss);
  color: var(--tinte);
  font: 600 14px var(--feldschrift);
  text-align: center;
  -webkit-hyphens: none;
  hyphens: none;
}

@media (min-width: 400px) {
  .tageszeit__feld {
    -webkit-hyphens: manual;
    hyphens: manual;
  }
}

.tageszeit__wahl input:checked + .tageszeit__feld {
  background: var(--gruen);
  color: var(--weiss);
}

.kform__knopf {
  height: 58px;
  border: 0;
  background: var(--gruen);
  color: var(--weiss);
  font: 600 16px var(--feldschrift);
  cursor: pointer;
  margin-bottom: 20px;          /* Abweichung 13: Platz der leeren Statuszeile */
}

.kform__knopf:hover { background: var(--tinte); }

.kform__hinweis {
  margin: 0;
  font-size: 13px;
  color: var(--leise);
}


/* ── Fuss ────────────────────────────────────────────────────────────────── */

.fuss {
  background: var(--tinte);
  color: var(--fuss-text);
  padding: 64px var(--rand) 40px;
}

.fuss__innen {
  max-width: var(--breite);
  margin: 0 auto;
  display: flex;
  flex-direction: column;
  gap: 40px;
}

.fuss__oben {
  display: flex;
  flex-wrap: wrap;
  justify-content: space-between;
  align-items: flex-end;
  gap: 32px;
}

.fuss__logo {
  display: block;
  height: 120px;
  width: auto;
  max-width: 100%;
}

.fuss__kontakt {
  display: flex;
  flex-direction: column;
  gap: 6px;
  font-size: 15px;
  line-height: 1.6;
}

/* Im Entwurf mit eigener Farbe und ohne Hover-Zustand (Abweichung 1). */
.fuss a,
.fuss a:hover { color: var(--weiss); }

.fuss__unten {
  border-top: 1px solid var(--fuss-linie);
  padding-top: 24px;
  display: flex;
  flex-wrap: wrap;
  justify-content: space-between;
  gap: 16px;
}

.fuss__name { font-size: 14px; }

.fuss__recht {
  display: flex;
  flex-wrap: wrap;
  gap: 12px 28px;
}

.fuss__recht a {
  font-size: 15px;
  font-weight: 600;
}

/* Abweichung 17 */
.fuss :focus-visible { outline-color: var(--weiss); }


/* ── Rechtlicher Hinweis am Seitenende (V17) ─────────────────────────────── */

.rechtliches {
  max-width: calc(var(--breite) + 2 * var(--rand));
  margin: 0 auto;
  padding: 28px var(--rand) 40px;
  font-size: 14px;
  line-height: 1.7;
  color: var(--leise);
}

.rechtliches h2 {
  margin: 0 0 6px;
  font-size: 15px;
  font-weight: 600;
  color: var(--tinte);
}

.rechtliches p {
  margin: 0;
  max-width: 64ch;
}


/* ── Breiten · dieselben Grenzen wie im Skript des Entwurfs ──────────────── */

/* Hero breit (heroWide): Foto fuellt die Buehne, Schleier, Text links. */
@media (min-width: 900px) and (min-aspect-ratio: 1/1) {
  .hero__buehne {
    position: relative;
    min-height: clamp(600px, calc(92svh - 84px), 940px);
    display: flex;
    align-items: center;
    overflow: hidden;
    background: var(--himmel);
  }

  .hero__bild {
    position: absolute;
    inset: 0;
    height: 100%;
    aspect-ratio: auto;
    object-position: 60% 40%;
    background: none;
  }

  /* Abweichung 7: heller als der Verlauf des Entwurfs (.9 / .72 bei 30 % /
     0 bei 56 %); bis 52 %, wo der Text hoechstens endet, deckt er .8. */
  .hero__schleier {
    display: block;
    position: absolute;
    inset: 0;
    background: linear-gradient(90deg, rgba(248, 246, 241, 0.9) 0%, rgba(248, 246, 241, 0.8) 52%, rgba(248, 246, 241, 0) 72%);
  }

  .hero__rahmen {
    position: relative;
    z-index: 1;
    width: 100%;
    max-width: var(--breite);
    margin: 0 auto;
    padding: 64px var(--rand);
  }

  .hero__inhalt {
    max-width: min(620px, 48vw);
    gap: 28px;
  }

  .hero__zeile { font-size: 14px; }
  .hero__zeile-breit { display: inline; }
  .hero__zeile-schmal { display: none; }

  .hero__titel {
    font-size: clamp(46px, 5vw, 82px);
    letter-spacing: -0.01em;
  }

  .hero__vorspann {
    max-width: 520px;
    font-size: clamp(17px, 1.3vw, 19px);
  }

  .hero__knoepfe {
    flex-direction: row;
    flex-wrap: wrap;
    align-items: center;
    gap: 14px 28px;
  }

  .hero__knopf {
    display: inline-flex;
    justify-content: normal;
    height: 58px;
    padding: 0 30px;
  }

  .hero__knopf:hover { background: var(--tinte); }

  .hero__link { align-self: auto; }
}

/* Breit (wide): Menuezeile, groesseres Logo, klebende Spalte im Ablauf. */
@media (min-width: 1080px) {
  .kopf__nav { display: flex; }
  .menue { display: none; }
  .kopf__logo { max-height: 40px; }

  .ablauf__kopf {
    position: sticky;
    top: calc(var(--notice) + 132px);
  }
}


/* ── Einblenden: genau ein Effekt je Abschnitt (Abweichung 19) ───────────── */
/* Der Ausgangszustand haengt an `.has-reveal`, und die Klasse setzt allein
   `js/reveal.js`. Ohne Javascript ist deshalb nichts versteckt. */

.has-reveal [data-reveal] {
  opacity: 0;
  transform: translateY(12px);
}

.has-reveal [data-reveal].is-in {
  opacity: 1;
  transform: none;
  transition: opacity 400ms ease-out, transform 400ms ease-out;
}


/* ── Weniger Bewegung: abschalten, nicht verkuerzen ─────────────────────── */
/* Die ersten beiden Regeln stehen so im Entwurf. */

@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }

  * {
    transition: none !important;
    animation: none !important;
  }

  .has-reveal [data-reveal],
  .has-reveal [data-reveal].is-in {
    opacity: 1;
    transform: none;
  }
}
