body,form,figure{margin:0;padding:0}img{border:0}header,footer,nav,section,aside,article,figure,figcaption{display:block}body{font-size:100.01%}select,input,textarea{font-size:99%}#container,.inside{position:relative}#main,#left,#right{float:left;position:relative}#main{width:100%}#left{margin-left:-100%}#right{margin-right:-100%}#footer{clear:both}#main .inside{min-height:1px}.ce_gallery>ul,.content-gallery>ul{margin:0;padding:0;overflow:hidden;list-style:none}.ce_gallery>ul li,.content-gallery>ul li{float:left}.ce_gallery>ul li.col_first,.content-gallery>ul li.col_first{clear:left}.float_left,.media--left>figure{float:left}.float_right,.media--right>figure{float:right}.block{overflow:hidden}.media{display:flow-root}.clear,#clear{height:.1px;font-size:.1px;line-height:.1px;clear:both}.invisible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.custom{display:block}#container:after,.custom:after{content:"";display:table;clear:both}
@media (max-width:767px){#wrapper{margin:0;width:auto}#container{padding-left:0;padding-right:0}#main,#left,#right{float:none;width:auto}#left{right:0;margin-left:0}#right{margin-right:0}}img{max-width:100%;height:auto}.audio_container audio{max-width:100%}.video_container video{max-width:100%;height:auto}.aspect,.responsive{position:relative;height:0}.aspect iframe,.responsive iframe{position:absolute;top:0;left:0;width:100%;height:100%}.aspect--16\:9,.responsive.ratio-169{padding-bottom:56.25%}.aspect--16\:10,.responsive.ratio-1610{padding-bottom:62.5%}.aspect--21\:9,.responsive.ratio-219{padding-bottom:42.8571%}.aspect--4\:3,.responsive.ratio-43{padding-bottom:75%}.aspect--3\:2,.responsive.ratio-32{padding-bottom:66.6666%}.aspect--9\:16,.responsive.ratio-916{padding-bottom:177.7777%}.aspect--1\:1,.responsive.ratio-11{padding-bottom:100%}
/* =========================================================
   app.css fuer Visura
   Globale Basis-Styles und Brand-Tokens (Platzhalter).
   Inhaltssprache: Deutsch.

   Einbindung: NICHT per Template, sondern im Backend ueber
   Layout > External style sheets (Pfad: files/css/app.css).
   ========================================================= */

/* ---------- Brand-Tokens (Platzhalter) ----------
   TODO: Mit den echten Marken-Tokens befuellen.
   Es sind bewusst KEINE erfundenen Markenfarben gesetzt, nur neutrale
   Defaults (Schwarz/Weiss/Grau), die ersetzt werden muessen.
*/
:root {
    /* Farben (TODO: durch Brand-Farben ersetzen) */
    --color-bg: #ffffff;        /* TODO: Hintergrund */
    --color-text: #1a1a1a;      /* TODO: Textfarbe */
    --color-primary: #1a1a1a;   /* TODO: Primaer-/Akzentfarbe (kein Brand-Wert) */
    --color-muted: #6b7280;     /* TODO: gedaempfter Text */
    --color-border: #e5e7eb;    /* TODO: Linien und Rahmen */

    /* Typografie (TODO: durch Brand-Schrift ersetzen) */
    --font-base: "Switzer", system-ui, -apple-system, "Segoe UI", Roboto, Arial, sans-serif;
    --font-heading: var(--font-base); /* TODO: eigene Headline-Schrift */

    /* Layout-Tokens */
    --measure: 70ch;
    --space: 1rem;
    --radius: 0.25rem;
}

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

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

body {
    margin: 0;
    font-family: var(--font-base);
    /* Typografie 1:1 aus visura.css: Basisschrift skaliert bis 1.075rem (~17.2px).
       Fehlte im Port -> Body-Text war ueberall auf UA-Default 16px = ~7% zu klein. */
    font-weight: 400;
    font-size: clamp(1rem, .96rem + .2vw, 1.075rem);
    letter-spacing: -.005em;
    color: var(--color-text);
    background-color: var(--color-bg);
    line-height: 1.6;
}

h1, h2, h3, h4, h5, h6 {
    font-family: var(--font-heading);
    line-height: 1.2;
}

img,
picture,
video,
canvas,
svg {
    display: block;
    max-width: 100%;
    height: auto;
}

input,
button,
textarea,
select {
    font: inherit;
}

a {
    color: inherit;
    text-decoration: none;
}

/* =========================================================
   Design-Basis (einmalig, 1:1 aus visura.css uebernommen)
   Tokens, .wrap und Reveal-Utilities. Werden von ALLEN RSCE-
   Elementen genutzt. Bei weiteren Elementen NICHT erneut anhaengen.
   Hinweis: Paper-Hintergrund (globaler Body-Bg) ist noch nicht gesetzt,
   das ist ein separater Foundation-Schritt.
   ========================================================= */

/* Switzer (Variable Font, 1:1 aus visura.css). Datei liegt unter files/fonts/
   und wird ueber /files/fonts/ ausgeliefert (public/files-Symlink noetig). */
@font-face {
    font-family: "Switzer";
    src: url("/files/fonts/Switzer-Variable.woff2") format("woff2");
    font-weight: 100 900;
    font-style: normal;
    font-display: swap;
}

:root {
    --paper: oklch(0.987 0.0015 75);
    --paper-2: oklch(0.957 0.0028 75);
    --paper-3: oklch(0.93 0.004 75);
    --ink: oklch(0.18 0.004 75);
    --ink-soft: oklch(0.46 0.005 75);
    --ink-faint: oklch(0.64 0.006 75);
    --on-ink: oklch(0.965 0.002 75);
    --ink-2: oklch(0.34 0.006 75);
    --dark: oklch(0.145 0.005 75);

    --pad-x: clamp(1.75rem, 7vw, 8rem);
    --sec: clamp(6rem, 13vw, 13rem);
    --maxw: 1320px;
    --navh: clamp(78px, 9vh, 108px);
    --gap: clamp(18px, 2.4vw, 38px);
    --ease: cubic-bezier(.22, .7, .16, 1);
}

.wrap{max-width:var(--maxw);margin-inline:auto;padding-inline:var(--pad-x)}

/* Heading-Basis 1:1 aus visura.css (Z.35). Ohne explizites font-weight defaulten
   Ueberschriften auf bold (700); visura nutzt 500. Plus line-height/tracking/balance.
   Element-Regeln (.page-hero h1 usw.) ueberschreiben das bei Bedarf. */
h1,h2,h3,h4{font-weight:500;line-height:1;letter-spacing:-.035em;text-wrap:balance}
/* Fliesstext-Umbruch 1:1 aus visura.css (Z.36). Verhindert einzelne Waisen
   (letztes Wort allein in der letzten Zeile) und verbessert den Zeilenumbruch;
   fehlte im Port -> Absaetze (z.B. Leistungs-Cards) brachen anders um als in der Vorlage. */
p{text-wrap:pretty}

/* Reveal-Animation (Fade-in beim Scrollen).
   Greift nur, wenn das Dokument die Klasse .js traegt und visura.js den
   IntersectionObserver setzt (Klasse .in). Ist beides nicht portiert,
   bleiben Inhalte sichtbar (kein .js -> .js .rv inaktiv). */
.rv{transition:opacity 1s var(--ease),transform 1.15s var(--ease)}
.js .rv{opacity:0;transform:translateY(10px)}
.rv.in{opacity:1;transform:none}
.rv.d1{transition-delay:.09s}.rv.d2{transition-delay:.2s}.rv.d3{transition-delay:.32s}.rv.d4{transition-delay:.44s}
@media(prefers-reduced-motion:reduce){.js .rv{opacity:1;transform:none;transition:none}}

/* === rsce_hero_subpage === */
.page-hero{padding-top:clamp(3.5rem,8vw,7rem);padding-bottom:clamp(2.5rem,5vw,4.5rem)}
/* .breadcrumb: Werte aus visura.css Z.92 + Group-Reset Z.627 zusammengefuehrt.
   font-size/letter-spacing stammen aus dem spaeteren Group-Reset (.875rem/.05em) und gewinnen im Cascade. */
.breadcrumb{display:flex;gap:.6em;font-weight:300;color:var(--ink-faint);margin-bottom:clamp(1.6rem,3vw,2.4rem);text-transform:none;letter-spacing:.05em;font-size:.875rem}
.breadcrumb a{font-weight:300;color:var(--ink-soft)}
.breadcrumb a:hover{color:var(--ink)}
.breadcrumb span{color:var(--ink-2)}
.breadcrumb .cur{font-weight:700;color:var(--ink)}
.page-hero h1{font-size:clamp(2.6rem,6vw,5rem);font-weight:500;letter-spacing:-.04em;line-height:1;max-width:18ch}
.page-hero .lead{color:var(--ink-soft);font-size:clamp(1.15rem,1.6vw,1.5rem);line-height:1.45;max-width:54ch;margin-top:clamp(1.4rem,2.5vw,2rem)}
/* Stellen-Hero (rsce_hero_stelle, erkennbar an der Eckdaten-Liste .ekv): der lange
   Stellentitel "Immobilienmakler:in (m/w/d)" ist breiter als 18ch und bricht mit dem
   Default-Cap zweizeilig. Soll ist einzeilig, darum den Cap hier aufheben. Greift nur
   auf den Stellen-Hero (Subpage-Heros ohne .ekv behalten den 18ch-Cap). */
.page-hero:has(.ekv) h1{max-width:none}
.page-img{margin-top:clamp(2.5rem,5vw,4rem);width:75vw;margin-left:calc(50% - 37.5vw);margin-right:calc(50% - 37.5vw)}
/* contao_figure umschliesst das Bild mit <figure>; ohne Reset greift der UA-Default
   margin:1em 40px (vertikaler Abstand + 40px seitlicher Einzug). 1:1 hat die Quelle
   ein nacktes <img> ohne Margin. Gilt auch fuer .page-img in rsce_marg. */
.page-img figure{margin:0}
.page-img img{width:100%;height:clamp(400px,74vh,880px);object-fit:cover}
@media(max-width:860px){.page-img{width:100vw;margin-left:calc(50% - 50vw);margin-right:calc(50% - 50vw)}}

/* Leistungs-Unterseite (Checkbox "Leistungs-Unterseite" im Element -> .page-hero--leistung).
   Variante des Seitenkopfs fuer Verkaufen/Vermieten/Grundstueck:
   - Ueberschrift ohne 18ch-Cap und Lead breiter -> weniger Umbrueche (2 statt 3 Zeilen).
   Das Hero-Bild bleedet wie auf allen Unterseiten (Basis-.page-img, 75vw) - 1:1 wie die
   Referenz (verkaufen.html nutzt .page-hero ohne Modifier). KEIN Bild-Override hier. */
.page-hero--leistung h1{max-width:none}
.page-hero--leistung .lead{max-width:72ch}
/* === /rsce_hero_subpage === */

/* === rsce_cta === */
/* CTA-Band 1:1 aus visura.css. .btn/.lnk/.bleed sind global (visura.css),
   liegen hier weil dieses Element sie zuerst braucht; bei weiteren Elementen
   mit denselben Buttons NICHT erneut anhaengen. Tokens stammen aus dem
   Foundation-Block oben. */
.bleed{width:100vw;margin-left:calc(50% - 50vw);margin-right:calc(50% - 50vw)}
.btn{display:inline-flex;align-items:center;gap:.7em;font-size:.78rem;font-weight:600;letter-spacing:.16em;padding:1.1em 1.8em;background:var(--ink);color:var(--on-ink);border:none;border-radius:0;cursor:pointer;font-family:inherit;transition:background .3s var(--ease)}
.btn:hover{background:oklch(0.26 0.006 75)}
.btn .ar{transition:transform .35s var(--ease)}
.btn:hover .ar{transform:translateX(.22em)}
.btn.light{background:var(--on-ink);color:var(--ink)}
.btn.light:hover{background:#fff}
.lnk{display:inline-flex;align-items:center;gap:.55em;font-size:.78rem;font-weight:600;letter-spacing:.16em;color:var(--ink)}
.lnk .ar{transition:transform .4s var(--ease)}
.lnk:hover .ar{transform:translateX(.2em)}
.lnk.light{color:var(--on-ink)}
.cta-band{background:var(--dark);color:var(--on-ink);text-align:center;padding:clamp(4.5rem,9vw,8rem) clamp(2rem,5vw,5rem)}
.cta-band h2{font-size:clamp(2.2rem,5vw,4rem);font-weight:500;letter-spacing:-.04em;max-width:20ch;margin:0 auto}
.cta-band p{color:oklch(0.82 0.006 75);max-width:50ch;margin:1.6rem auto 0;font-size:1.1rem;line-height:1.6}
.cta-band .acts{display:flex;gap:24px;justify-content:center;align-items:center;flex-wrap:wrap;margin-top:clamp(2.4rem,4vw,3rem)}
.cta-band :focus-visible{outline-color:var(--on-ink)}
/* === /rsce_cta === */

/* === footer === */
/* Footer als Custom-HTML-Element (kein RSCE). Markup/Werte 1:1 aus visura.css.
   .g12/.tnum sind generische Utilities (visura.css), liegen hier weil der Footer
   sie zuerst braucht; bei weiteren Elementen NICHT erneut anhaengen. Tokens und
   .wrap stammen aus dem Foundation-Block oben. */
.g12{display:grid;grid-template-columns:repeat(12,1fr);gap:var(--gap)}
.tnum{font-variant-numeric:tabular-nums;font-feature-settings:"tnum"}

/* Reset analog zum globalen *{margin:0;padding:0} aus visura.css. WICHTIG: nur auf die
   Grid-Inhalte (.foot *) beschraenken, NICHT footer.site * - sonst wuerde der Reset den
   .wrap-Container (margin-inline:auto, padding-inline) ueberschreiben und die Zentrierung killen. */
.foot *{margin:0;padding:0}

footer.site{background:var(--paper-2);padding-block:clamp(5rem,9vw,8rem) clamp(2.8rem,4vw,3.4rem)}
/* Zentriert den Footer-Inhalt analog .wrap, falls das Markup keinen .wrap-Container hat
   (>: greift nur, wenn .foot direkter Kind von footer.site ist; mit .wrap zentriert .wrap). */
footer.site > .foot{max-width:var(--maxw);margin-inline:auto;padding-inline:var(--pad-x)}
.foot{align-items:start;row-gap:clamp(2.5rem,5vw,3.5rem)}
.foot .brand-cell{grid-column:1 / span 5}
.foot .brand-cell .brand-logo{height:clamp(28px,5.2vw,42px);width:auto;max-width:100%;margin-bottom:clamp(1rem,2vw,1.5rem)}
.foot .b1{font-weight:600;font-size:clamp(2.2rem,5vw,3.4rem);letter-spacing:.18em;display:block}
.foot .tag{color:var(--ink-soft);max-width:34ch;margin-top:1.3rem;font-size:.95rem}
.foot .col{grid-column:span 2}
.foot .col:nth-of-type(2){grid-column:7 / span 2}
.foot .col:nth-of-type(3){grid-column:9 / span 2}
.foot .col:nth-of-type(4){grid-column:11 / span 2}
/* .foot h3: Werte aus visura.css Z.321 + Group-Reset Z.624 zusammengefuehrt (.875rem/.05em/text-transform:none gewinnen im Cascade) */
.foot h3{font-size:.875rem;font-weight:600;letter-spacing:.05em;text-transform:none;color:var(--ink-soft);margin-bottom:1.3rem}
.foot ul{list-style:none;display:flex;flex-direction:column;gap:.75rem;font-size:.94rem;color:var(--ink-soft)}
.foot a:hover{color:var(--ink)}
.foot-base{grid-column:1 / -1;display:flex;justify-content:space-between;margin-top:clamp(3.5rem,7vw,5.5rem);font-size:.82rem;color:var(--ink-soft);flex-wrap:wrap;gap:12px}
@media(max-width:860px){
  .foot .brand-cell{grid-column:1 / -1}
  .foot .col,.foot .col:nth-of-type(2),.foot .col:nth-of-type(3),.foot .col:nth-of-type(4){grid-column:span 4}
}
@media(max-width:560px){
  .foot .col,.foot .col:nth-of-type(2),.foot .col:nth-of-type(3),.foot .col:nth-of-type(4){grid-column:span 6}
}
/* === /footer === */

/* === rsce_leistungs_cards === */
/* Leistungs-Cards 1:1 aus visura.css (.split / .srv-block / .srv-points).
   margin/padding werden hier lokal genullt, weil app.css keinen globalen
   *{margin:0;padding:0}-Reset hat (visura.css Z.27). */

/* Global: verhindert horizontalen Scrollbalken durch Bleed-Elemente
   (visura.css body, Z.33). Wird auch von .cta-band.bleed benoetigt.
   clip statt hidden: klippt horizontal identisch, erzeugt aber KEINEN Scroll-Container
   -> position:sticky (z.B. rsce_galerie .sc-cap) bleibt funktionsfaehig. hidden wuerde
   den body zum Scrollport machen und das Sticky brechen. */
body{overflow-x:clip}

/* Vertikalabstand der Card-Sektionen. In visura.css via section{padding-block:var(--sec)}
   plus inline padding-top:0; hier scoped auf .srv-sec statt globalem section-Reset. */
.srv-sec{padding-bottom:var(--sec)}

.split{display:grid;grid-template-columns:1fr 1fr;gap:clamp(2.5rem,5vw,5.5rem);align-items:center}
.split + .split{margin-top:clamp(4rem,8vw,7rem)}
.split .txt h2{font-size:clamp(1.8rem,3.4vw,2.8rem);margin:0 0 1.2rem}
.split .txt p{color:var(--ink-soft);font-size:1.08rem;line-height:1.6;margin:0}
.split .txt p + p{margin-top:1rem}
.split .txt .lnk{margin-top:2rem}
.split .img{overflow:hidden}
.split .img figure{margin:0}
.split .img img{width:100%;height:clamp(360px,54vh,620px);object-fit:cover}
.split.rev .txt{order:2}

/* Bild klebt an der aeusseren Viewport-Kante (visura.css Z.648-650):
   normale Card Bild rechts -> rechts bleed, .rev Card Bild links -> links bleed. */
.srv-block .img{margin-right:calc(50% - 50vw)}
.srv-block.rev .img{margin-left:calc(50% - 50vw);margin-right:0}

.srv-points{list-style:none;margin:1.5rem 0 2rem;padding:0;display:grid;grid-template-columns:1fr 1fr;gap:.75rem 1.6rem}
.srv-points li{position:relative;padding-left:1.3em;color:var(--ink-soft);font-size:1rem;line-height:1.4}
.srv-points li::before{content:"";position:absolute;left:0;top:.55em;width:6px;height:6px;border-radius:50%;background:var(--ink)}

/* Bullet-Points einzeln einblenden, sobald die Liste in den Viewport scrollt
   (.in setzt app.js). 1:1 aus visura.css Z.639-644. Ohne .js sofort sichtbar. */
.js .srv-points li{opacity:0;transform:translateY(8px);transition:opacity .8s var(--ease),transform .95s var(--ease)}
.srv-points.in li{opacity:1;transform:none}
.srv-points.in li:nth-child(2){transition-delay:.08s}
.srv-points.in li:nth-child(3){transition-delay:.16s}
.srv-points.in li:nth-child(4){transition-delay:.24s}
.srv-points.in li:nth-child(5){transition-delay:.32s}

/* Bild-Hover: langsames Zoomen beim Hover ueber die Card */
.srv-block .img img{transition:transform 1.5s var(--ease)}
.srv-block:hover .img img{transform:scale(1.03)}

@media(max-width:860px){.split{grid-template-columns:1fr}.split.rev .txt{order:0}.split .img{margin-top:2.2rem}.srv-block .img,.srv-block.rev .img{margin-left:0;margin-right:0}}
@media(max-width:560px){.srv-points{grid-template-columns:1fr}}
/* === /rsce_leistungs_cards === */

/* === rsce_steps === */
/* Vertikalabstand nur unten (Original hatte padding-top:0). Scoped auf .steps-sec
   statt globalem section-Reset, konsistent mit .srv-sec. */
.steps-sec{padding-bottom:var(--sec)}
.head{display:flex;justify-content:space-between;align-items:flex-end;gap:30px;margin-bottom:clamp(3rem,6vw,5rem)}
/* margin:0 weil app.css keinen globalen *{margin:0}-Reset hat (Original visura.css schon).
   Ohne ihn schiebt der UA-Default-margin der <h2> (~.83em) die Notiz rechts bei
   align-items:flex-end ~45px nach unten -> Notiz steht nicht mehr auf Hoehe der Ueberschrift. */
.head h2{font-size:clamp(1.9rem,4.4vw,3.4rem);font-weight:500;letter-spacing:-.035em;max-width:18ch;margin:0}
.head .note{text-align:right;color:var(--ink-soft);font-size:.95rem;max-width:32ch}
.steps{display:grid;grid-template-columns:repeat(auto-fit,minmax(230px,1fr));gap:clamp(2rem,3vw,3.2rem)}
.step h3{font-size:clamp(1.3rem,1.9vw,1.65rem);margin-bottom:.7rem}
.step p{color:var(--ink-soft);font-size:1rem;line-height:1.5}
/* Reveal der Steps (inert ohne visura.js: ohne .js bleibt alles sichtbar) */
.steps .step.rv{opacity:1;transform:none;transition:none}
.js .steps .step h3,.js .steps .step p{opacity:0;transform:translateY(8px);transition:opacity .8s var(--ease),transform .95s var(--ease)}
.steps .step p{transition-delay:.14s}
.steps .step.in h3,.steps .step.in p{opacity:1;transform:none}
.steps .step.d1 h3{transition-delay:.09s}.steps .step.d1 p{transition-delay:.23s}
.steps .step.d2 h3{transition-delay:.2s}.steps .step.d2 p{transition-delay:.34s}
.steps .step.d3 h3{transition-delay:.32s}.steps .step.d3 p{transition-delay:.46s}
@media(prefers-reduced-motion:reduce){.js .steps .step h3,.js .steps .step p{opacity:1;transform:none;transition:none}}
.steps.flow{display:flex;flex-direction:column}
.steps.flow .step{display:grid;grid-template-columns:minmax(0,5fr) minmax(0,7fr);gap:clamp(1.5rem,5vw,5rem);align-items:baseline;padding-block:clamp(1.6rem,3vw,2.6rem)}
.steps.flow .step h3{font-size:clamp(1.6rem,2.8vw,2.4rem);margin-bottom:0}
.steps.flow .step p{font-size:1.05rem;max-width:46ch}
@media(max-width:680px){.steps.flow .step{grid-template-columns:1fr;gap:.55rem}}
@media(max-width:860px){.head{flex-direction:column;align-items:flex-start;gap:14px}.head .note{text-align:left}}
/* === /rsce_steps === */

/* === rsce_trust_band === */
/* Hellgraues Kennzahlen-Band, volle Breite (.bleed). Markup/CSS aus
   visura-html-website (.trust / .stats / .stat). Kollaps-Modell wie im Original
   (dort section{padding-block} + inline padding-top:0): nur padding-bottom, den
   oberen Abstand liefert der Vorgaenger. padding-block verdoppelte die Luecke
   (Steps->Trust = 2x --sec). .rv-Reveal-Infrastruktur ist oben in app.css definiert. */
.trust-sec{padding-bottom:var(--sec)}
.trust{background:var(--paper-2);padding-block:clamp(2.6rem,5vw,4rem)}
.stats{display:grid;grid-template-columns:repeat(3,1fr);gap:clamp(2rem,4vw,4rem)}
.stat .v{font-size:clamp(2.2rem,4vw,3.4rem);font-weight:500;letter-spacing:-.03em;font-variant-numeric:tabular-nums;line-height:1}
.stat .k{color:var(--ink-soft);font-size:.95rem;margin-top:.7rem;line-height:1.45}
@media(max-width:680px){.stats{grid-template-columns:1fr}}
/* === /rsce_trust_band === */

/* === rsce_offene_stellen === */
/* Offene-Stellen-Sektion 1:1 aus karriere.html. .head / .head h2 / .head-Breakpoint
   werden bereits von rsce_steps definiert und hier mitbenutzt (nicht doppeln).
   Werte, die in der Quelle vom *{margin:0}-Reset bzw. den globalen body/h-Defaults
   kommen (font-weight 500, Body-Schriftgroesse), sind lokal gesetzt. */

/* Vertikalabstand beider Sektionen (Quelle: section{padding-block:var(--sec)} + inline padding-top:0). */
.stellen-sec{padding-bottom:var(--sec)}

.jobs a{display:grid;grid-template-columns:1fr auto;gap:1.5rem;align-items:start;padding:clamp(1.8rem,3vw,2.8rem) clamp(.8rem,1.5vw,1.4rem)}
.jobs h3{font-size:clamp(1.5rem,2.8vw,2.3rem);font-weight:500;line-height:1;letter-spacing:-.035em;margin:0}
.jobs .chips{display:flex;gap:.5rem;flex-wrap:wrap;margin-top:1rem}
.jobs .chips span{font-size:.875rem;letter-spacing:.02em;color:var(--ink-soft);background:var(--paper-2);padding:.45em .9em}
.jobs .desc{color:var(--ink-soft);font-size:1rem;margin-top:1rem;max-width:58ch;line-height:1.5}
.jobs .ar{font-size:1.3rem;opacity:0;transform:translateX(-6px);transition:.45s var(--ease);align-self:center}
.jobs a:hover .ar{opacity:1;transform:none}

/* Abschlusstext: in der Quelle <p class="prose"> mit Body-Defaults (Groesse/Zeilenhoehe/Farbe). */
.prose{max-width:64ch;font-size:clamp(1rem,.96rem + .2vw,1.075rem);line-height:1.6;color:var(--ink)}
.prose>*+*{margin-top:1.2em}
/* === /rsce_offene_stellen === */

/* === rsce_stelle_punkte === */
/* Aufgaben-/Profil-Sektion der Stellen-Detailseite. Markup nutzt .head + .srv-points
   (bereits von rsce_steps bzw. rsce_leistungs_cards definiert, nicht doppeln).
   Hier nur der Vertikalabstand (Quelle: section{padding-block:var(--sec)} + inline padding-top:0). */
.punkte-sec{padding-bottom:var(--sec)}
/* === /rsce_stelle_punkte === */

/* === rsce_showcase === */
/* Grossflaechiges Bild mit Text-Overlay unten. Markup/CSS 1:1 aus
   visura-html-website (.showcase / .cap / .claim / .w75). Im Original hatte die
   Section padding:0; der weisse Abstand oben/unten kam von den Nachbar-Sektionen
   (je var(--sec)). Hier liefert .showcase-sec diesen Abstand selbst, .showcase
   bleibt Positionierungs-Kontext fuer die absolute .cap. .bleed (volle Breite)
   ist oben in app.css definiert. .showcase figure{margin:0} neutralisiert den
   contao_figure-Wrapper. Tokens (--pad-x, --on-ink, --sec) aus dem Foundation-Block. */
.showcase-sec{padding-block:var(--sec)}
/* Abstand unten optional abschaltbar: RSCE-Checkbox "Abstand unten entfernen" setzt
   .flush-b -> die Sektion schliesst buendig an das folgende Element an. */
.showcase-sec.flush-b{padding-bottom:0}
.showcase{position:relative;isolation:isolate}
.showcase figure{margin:0}
.showcase img{width:100%;height:clamp(440px,72vh,860px);object-fit:cover}
.showcase .cap{position:absolute;inset:auto 0 0 0;padding:clamp(2.5rem,6vw,5rem) var(--pad-x);text-align:center;color:var(--on-ink);background:linear-gradient(to top,oklch(0.145 0.005 75/.7),transparent)}
.showcase .cap .claim{font-size:clamp(1.8rem,4vw,3.4rem);font-weight:500;letter-spacing:-.035em;line-height:1.05}
.w75{width:75vw;margin-inline:auto}
@media(max-width:860px){.w75{width:100vw}}
/* === /rsce_showcase === */

/* === rsce_text_bild === */
/* Einfache Text/Bild-Sektion. .split / .split .txt / .split .img werden bereits
   vom Leistungs-Block definiert und hier mitbenutzt (plain .split = KEIN srv-block,
   also kein Bild-Bleed und kein Hover-Zoom). h2-Gewicht/Tracking kommen aus der
   globalen Heading-Basis. Hier nur der Sektions-Abstand. */
.split-sec{padding-bottom:var(--sec)}
/* === /rsce_text_bild === */

/* === rsce_verlass === */
/* "Worauf Sie sich verlassen": Punkte links (Titel + Text), Bild rechts.
   Markup/CSS 1:1 aus visura-html-website/eigentuemer.html (.verlass). .head /
   .head h2 sind bereits von rsce_steps definiert (nicht doppeln). Kollaps-Modell
   wie bei .trust-sec/.faq-sec (Original: Section inline padding-top:0): nur
   padding-bottom, den oberen Abstand liefert der Vorgaenger (.marg-sec).
   padding-block verdoppelte die Luecke marg->verlass (2x var(--sec)).
   .verlass .v-img figure{margin:0} neutralisiert den contao_figure-Wrapper. */
.verlass-sec{padding-bottom:var(--sec)}
/* app.css hat keinen globalen *{margin:0}-Reset (visura.css Z.27), darum h3/p hier
   explizit margin:0, sonst blaehen UA-Default-Margins die Liste auf (Punkte zu weit
   auseinander, Bild wirkt nicht buendig). .head h2 ohne max-width-Cap, damit die
   Ueberschrift einzeilig bleibt (Default .head h2{max-width:18ch} bricht hier um). */
.verlass-sec .head h2{max-width:none;margin:0}
.verlass{display:grid;grid-template-columns:1fr 1fr;gap:clamp(2.5rem,5vw,5.5rem);align-items:center}
.verlass .v-list .it{padding-block:clamp(.9rem,2vw,1.5rem)}
.verlass .v-list .it h3{font-size:clamp(1.3rem,2vw,1.7rem);font-weight:500;letter-spacing:-.01em;margin:0 0 .5rem}
.verlass .v-list .it p{color:var(--ink-soft);max-width:40ch;line-height:1.5;margin:0}
.verlass .v-img{margin:0;overflow:hidden}
.verlass .v-img figure{margin:0}
.verlass .v-img img{width:100%;height:clamp(440px,58vh,660px);object-fit:cover;transition:transform 1.5s var(--ease)}
.verlass:hover .v-img img{transform:scale(1.03)}
@media(max-width:760px){.verlass{grid-template-columns:1fr;gap:2rem}}
/* === /rsce_verlass === */

/* === header/nav === */
/* Header/Navigation 1:1 aus visura.css: sticky Header (header.site), .nav-Leiste,
   Brand-Logo, Desktop-Menue (nav.menu) und Kontakt-CTA (.nav-cta). Tokens
   (--navh/--maxw/--pad-x/--paper/--ink.../--ease) und .wrap stammen aus dem
   Foundation-Block oben.
   Der <nav class="menu">-Wrapper kommt vom Navigationsmodul (CSS-Klasse "menu" in
   den Modul-Experteneinstellungen); nav_visura.html.twig gibt nur die <a> aus.
   Burger-Button (.nav-burger) und Mobile-Overlay (.m-nav) werden per JS erzeugt
   (files/js/app.js, portiert aus visura.js), nicht im Markup.
   WICHTIG: Der Group-Reset am Ende dieses Blocks (visura.css Z.627-629) steht wie in
   der Quelle NACH den Basisregeln und gewinnt im Cascade fuer
   text-transform/letter-spacing/font-size (.875rem/.05em/none) bei nav.menu a,
   .nav-cta und .m-cta. Deshalb hier nicht inline gemerged, sondern 1:1 nachgestellt. */
header.site{position:sticky;top:0;z-index:40;background:rgba(250,250,249,.82);background:color-mix(in oklch,var(--paper) 80%,transparent);-webkit-backdrop-filter:blur(16px) saturate(1.1);backdrop-filter:blur(16px) saturate(1.1)}
.nav{display:flex;align-items:center;justify-content:space-between;height:var(--navh);max-width:var(--maxw);margin-inline:auto;padding-inline:var(--pad-x)}
.brand{display:flex;align-items:center;gap:.7em}
.brand .b1{font-weight:600;font-size:1.32rem;letter-spacing:.22em}
.brand-logo{display:block;height:clamp(18px,2.1vw,24px);width:auto}
/* overflow:visible hebt Contao-Core .block{overflow:hidden} auf: die mod_navigation
   bekommt automatisch die Klasse "block", die sonst die Unterstreichung abschneidet
   (::after sitzt per bottom:-6px unter dem Link). Die Quelle (visura.css) hat kein
   "block", deshalb trat das Clipping erst in Contao auf. */
nav.menu{display:flex;gap:clamp(18px,2.6vw,40px);overflow:visible}
nav.menu a{font-size:.74rem;font-weight:400;letter-spacing:.13em;color:var(--ink-soft);transition:color .3s;white-space:nowrap}
nav.menu a:hover,nav.menu a.active,nav.menu a.trail{color:var(--ink)}
nav.menu a{position:relative}
nav.menu a::after{content:"";position:absolute;left:0;bottom:-6px;height:1.5px;width:100%;background:var(--ink);transform:scaleX(0);transform-origin:left;transition:transform .45s var(--ease)}
/* Unterstreichung beim Hover UND fuer die aktuelle Seite (1:1 wie visura.css).
   Contao markiert die exakte Seite per a.active, Unterseiten den zugehoerigen
   Top-Level-Punkt per a.trail -> beide bleiben dauerhaft unterstrichen.
   aria-current="page" als robuste Absicherung, falls die active-Klasse fehlt. */
nav.menu a:hover::after,nav.menu a.active::after,nav.menu a.trail::after,nav.menu a[aria-current="page"]::after{transform:scaleX(1)}
@media(prefers-reduced-motion:reduce){nav.menu a::after{transition:none}}
.nav-cta{font-size:.74rem;font-weight:600;letter-spacing:.13em;color:var(--ink);display:inline-flex;gap:.5em;align-items:center;transition:gap .35s var(--ease);white-space:nowrap}
.nav-cta:hover{gap:.85em}

/* Mobile: Burger + Fullscreen-Overlay (beides per JS erzeugt, siehe app.js) */
.nav-burger{display:none;position:fixed;top:0;right:calc(var(--pad-x) - 10px);z-index:45;width:44px;height:var(--navh);align-items:center;justify-content:center;border:0;background:none;color:var(--ink);cursor:pointer;-webkit-tap-highlight-color:transparent}
.nav-burger span{position:absolute;left:50%;top:50%;width:25px;height:1.5px;background:currentColor;transform:translate(-50%,-50%);transition:transform .45s var(--ease),margin-top .45s var(--ease)}
.nav-burger span:nth-child(1){margin-top:-3.5px}
.nav-burger span:nth-child(2){margin-top:3.5px}
.nav-burger.open span:nth-child(1){margin-top:0;transform:translate(-50%,-50%) rotate(45deg)}
.nav-burger.open span:nth-child(2){margin-top:0;transform:translate(-50%,-50%) rotate(-45deg)}
.m-nav{position:fixed;inset:0;z-index:35;background:var(--paper);display:flex;flex-direction:column;justify-content:center;padding-block:clamp(96px,16vh,150px) clamp(40px,8vh,64px);padding-inline:var(--pad-x);opacity:0;visibility:hidden;transition:opacity .5s var(--ease),visibility .5s}
.m-nav.open{opacity:1;visibility:visible}
.m-links{display:flex;flex-direction:column;gap:clamp(.4rem,2vh,1rem)}
.m-links a{font-size:clamp(2rem,8.5vw,3.1rem);font-weight:500;letter-spacing:-.025em;line-height:1.05;color:var(--ink-soft);opacity:0;transform:translateY(8px);transition:color .3s var(--ease),opacity .55s var(--ease),transform .55s var(--ease)}
.m-links a.active,.m-links a:hover{color:var(--ink)}
.m-cta{margin-top:clamp(2rem,5.5vh,3.4rem);display:inline-flex;align-items:center;gap:.5em;font-size:.82rem;font-weight:600;letter-spacing:.14em;color:var(--ink);opacity:0;transform:translateY(8px);transition:opacity .55s var(--ease),transform .55s var(--ease),gap .35s var(--ease)}
.m-cta:hover{gap:.85em}
.m-nav.open .m-links a,.m-nav.open .m-cta{opacity:1;transform:none}
.m-nav.open .m-links a:nth-child(1){transition-delay:.07s}
.m-nav.open .m-links a:nth-child(2){transition-delay:.13s}
.m-nav.open .m-links a:nth-child(3){transition-delay:.19s}
.m-nav.open .m-links a:nth-child(4){transition-delay:.25s}
.m-nav.open .m-links a:nth-child(5){transition-delay:.31s}
.m-nav.open .m-cta{transition-delay:.36s}
body.nav-open{overflow:hidden}

/* Breakpoints 1:1 aus visura.css (Z.358-362, nur die Header/Nav-Regeln) */
@media(max-width:1040px){nav.menu{gap:18px}nav.menu a{font-size:.7rem;letter-spacing:.1em}}
@media(max-width:860px){nav.menu{display:none}.nav-burger{display:flex}.nav-cta{display:none}}

/* Group-Reset (visura.css Z.627-629), nur die hier portierten Selektoren. Steht wie
   in der Quelle NACH den obigen Regeln -> .875rem/.05em/none gewinnen im Cascade.
   .btn UND .lnk gehoeren in der Quelle in diese Gruppe: setzt sie auf .875rem (statt .78rem)
   und letter-spacing .05em (statt .16em) -> Buttons/Links korrekt gross (nicht zu klein). */
.btn,.lnk,.nav-cta,nav.menu a,.m-cta{text-transform:none;letter-spacing:.05em;font-size:.875rem}
/* === /header/nav === */

/* === rsce_bild === */
/* Breite Bild-Sektion: Bild auf 75vw zentriert (weisse Seitenmargins), ab 860px
   volle Breite. Bild-Werte 1:1 aus visura.css .page-img (ohne dessen margin-top;
   Vertikalabstand hier ueber Section-Padding, damit kein Margin-Collapse). */
.bild-sec{padding-block:clamp(2.5rem,5vw,4rem)}
.bild-sec .bild{width:75vw;margin-left:calc(50% - 37.5vw);margin-right:calc(50% - 37.5vw);overflow:hidden}
.bild-sec .bild figure{margin:0}
.bild-sec .bild img{width:100%;height:clamp(400px,74vh,880px);object-fit:cover}
@media(max-width:860px){.bild-sec .bild{width:100vw;margin-left:calc(50% - 50vw);margin-right:calc(50% - 50vw)}}
/* === /rsce_bild === */

/* === rsce_bildbanner === */
/* Bild-Banner: Bild ueber die volle Fensterbreite (.bleed, global in app.css),
   kuerzere Banner-Hoehe. Bild-Werte 1:1 aus visura-html-website (kontakt.html
   .bleed-Bild: height clamp(320px,42vh,460px), object-fit:cover). Im Original
   hatte die Section padding-top:0 und der Abstand kam von den Nachbarn; hier
   traegt .bildbanner-sec den weissen Abstand oben UND unten selbst
   (padding-block:var(--sec)), analog rsce_showcase. .bildbanner figure{margin:0}
   neutralisiert den contao_figure-Wrapper. Tokens aus dem Foundation-Block. */
.bildbanner-sec{padding-block:var(--sec)}
.bildbanner figure{margin:0}
.bildbanner img{width:100%;height:clamp(320px,42vh,460px);object-fit:cover}
/* === /rsce_bildbanner === */

/* === rsce_werte === */
/* "Wofuer wir stehen": Ueberschrift (.head / .head h2 bereits global definiert) +
   zweispaltiges Werte-Raster (.values .it), 1:1 aus visura.css (ueber-uns.html).
   Im Original hatte die Section padding-top:0 (Abstand oben vom Nachbarn) + unten
   den Section-Default; hier padding-bottom:var(--sec), analog rsce_steps.
   .head / .rv / .d1-.d4 sind global (Foundation-Block) -> NICHT doppeln. */
.werte-sec{padding-bottom:var(--sec)}
.values{display:grid;grid-template-columns:1fr 1fr;gap:clamp(2.2rem,4vw,3.4rem) clamp(3rem,7vw,7rem)}
.values .it h3{font-size:clamp(1.5rem,2.6vw,2.1rem);margin-bottom:.6rem}
.values .it p{color:var(--ink-soft);max-width:42ch;line-height:1.5}
@media(max-width:680px){.values{grid-template-columns:1fr}}
/* === /rsce_werte === */

/* === rsce_marg === */
/* Bild oben (page-img-Stil) + zweispaltiger Textblock (.marg): links kleine
   Randnotiz, rechts groesserer Fliesstext mit Fettteil und Link. Markup/CSS 1:1
   aus visura-html-website/eigentuemer.html. .page-img-Regeln sind bereits von
   rsce_hero_subpage definiert (nicht doppeln); hier nur margin-top:0 (Bild sitzt
   oben) und der Abstand Bild -> Textblock. WICHTIG: app.css hat keinen globalen
   *{margin:0}-Reset (visura.css Z.27), darum p-Margins explizit setzen, sonst
   blaehen UA-Default-Margins den Text auf.
   Kollaps-Modell wie bei .trust-sec/.faq-sec: nur padding-bottom, den oberen
   Abstand liefert der Hero (padding-bottom ~4.5rem, Bild sitzt direkt darunter).
   padding-block verdoppelte die Luecke Lead->Bild (Hero-pb + var(--sec) ~17rem). */
.marg-sec{padding-bottom:var(--sec)}
.marg-sec .page-img{margin-top:0}
.marg-sec .page-img figure{margin:0}
.marg-sec .page-img + .marg{margin-top:clamp(2.5rem,5vw,4.5rem)}
.marg{display:grid;grid-template-columns:[mar] 4fr [main] 8fr;gap:clamp(2rem,4vw,4rem)}
.marg-side{grid-column:mar;margin-top:.5em}
.marg-side p{color:var(--ink-soft);font-size:.9rem;max-width:26ch;line-height:1.5;margin:0}
.marg-main{grid-column:main}
.marg-main p{font-size:clamp(1.2rem,1.9vw,1.6rem);color:var(--ink-soft);max-width:54ch;line-height:1.5;margin:0}
.marg-main p + p{margin-top:1.1em}
.marg-main strong{color:var(--ink);font-weight:500}
.marg-main .lnk{margin-top:1.6rem}
@media(max-width:760px){.marg{grid-template-columns:1fr}.marg-side{margin-top:0;margin-bottom:1.4rem}}
/* === /rsce_marg === */

/* === rsce_statement === */
/* Ruhige Statement-/Quote-Sektion (.stmt) 1:1 aus visura.css (ueber-uns.html, Z.439-440):
   grosser, gedaempfter (grauer, --ink-faint) Text mit hervorgehobenem dunklem
   Abschluss (strong, --ink). Spacing 1:1 aus der Quelle: die Section hat inline
   padding-top:0, der Abstand oben kommt allein vom Element darueber (z.B. rsce_werte
   mit padding-bottom:var(--sec)). Darum hier NUR padding-bottom:var(--sec), KEIN top -
   sonst verdoppelt sich der Abstand. Analog rsce_werte/rsce_stellen/rsce_text_bild.
   Tokens und .wrap stammen aus dem Foundation-Block. */
.stmt-sec{padding-bottom:var(--sec)}
.stmt p{font-size:clamp(2rem,5.2vw,4.2rem);font-weight:500;letter-spacing:-.04em;line-height:1.07;max-width:20ch;color:var(--ink-faint)}
.stmt p strong{font-weight:500;color:var(--ink)}
/* === /rsce_statement === */

/* === rsce_kontakt === */
/* Kontaktsektion "Direkt erreichbar" 1:1 aus visura.css/kontakt.html.
   Linke Spalte = Kontaktdaten (RSCE), rechte Spalte = Form-Generator-Formular
   (per insert_form eingebettet). Das Formular-Markup ist Contao-Standard
   (.widget / .widget-text / .widget-select / .widget-textarea / .widget-checkbox /
   .widget-submit); die Regeln bilden den .field-Look der Quelle darauf ab. */
.kontakt-sec{padding-bottom:var(--sec)}

/* Kontakt-Seite: der Bild-Banner folgt direkt auf .kontakt-sec, die bereits
   padding-bottom:var(--sec) liefert. Der freistehende Banner traegt selbst
   padding-top:var(--sec) -> ohne Scope verdoppelt sich die Luecke Button->Banner.
   In der Referenz (kontakt.html) hat die Banner-Section padding-top:0, der Abstand
   kommt allein vom Contact. RSCE-Sektionen sind keine direkten section+section-
   Geschwister, darum via main:has() statt Nachbar-Selektor - trifft nur die
   Kontakt-Seite, Banner auf anderen Seiten bleiben freistehend. */
main:has(.kontakt-sec) .bildbanner-sec{padding-top:0}

/* minmax(0,1fr) statt 1fr: Contaos Textarea (cols="40") wuerde die Spalte sonst zu
   breit machen -> Grid laeuft ueber, rechts/links abgeschnitten. min-width:0 erlaubt Schrumpfen. */
.contact{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:clamp(3rem,6vw,7rem);align-items:start}
.contact-head,.contact-form{min-width:0}
/* h2-Groesse: Inline-Override aus kontakt.html (Z.54) statt der groesseren .contact-head-Default. */
.contact-head h2{font-size:clamp(1.7rem,3vw,2.4rem);margin-bottom:1.4rem}
.contact-head .lead{color:var(--ink-soft);font-size:1.1rem;max-width:32ch;margin-bottom:3rem}
.chan{display:flex;flex-direction:column;gap:1.5rem}
.chan .row{display:flex;justify-content:space-between;align-items:baseline;gap:20px}
.chan .k{font-weight:600;color:var(--ink-soft);text-transform:none;letter-spacing:.05em;font-size:.875rem}
.chan .v{font-size:1.18rem;font-weight:500}

/* Formular: Contao-Form-Generator-Markup auf den Design-.field-Look gebracht. */
.contact-form .widget{margin-bottom:.9rem}
.contact-form .widget label{display:block;font-weight:600;color:var(--ink-soft);margin-bottom:.55rem;text-transform:none;letter-spacing:.05em;font-size:.875rem}
/* Contao rendert vor Pflicht-Labels <span class="invisible">Pflichtfeld</span>;
   .invisible wird sonst nur von Contaos Frontend-CSS versteckt (laden wir nicht). */
.contact-form .invisible{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}
.contact-form .widget-text input,.contact-form .widget-textarea textarea,.contact-form .widget-select select{width:100%;background:var(--paper-2);border:none;border-radius:0;padding:1em 1.1em;font-family:inherit;font-size:1rem;color:var(--ink);transition:background .3s}
.contact-form .widget-text input::placeholder,.contact-form .widget-textarea textarea::placeholder{color:var(--ink-soft)}
.contact-form .widget-text input:focus,.contact-form .widget-textarea textarea:focus,.contact-form .widget-select select:focus{outline:2px solid var(--ink);outline-offset:2px;background:var(--paper-3)}
.contact-form .widget-textarea textarea{min-height:104px;resize:vertical}

/* Consent-Checkbox (.consent-Look). */
.contact-form .widget-checkbox{margin:1.4rem 0 .2rem}
.contact-form .widget-checkbox fieldset{border:none;margin:0;padding:0}
.contact-form .widget-checkbox legend{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0)}
.contact-form .widget-checkbox span{display:flex;gap:.65em;align-items:flex-start}
.contact-form .widget-checkbox input{margin-top:.15em;width:17px;height:17px;accent-color:var(--ink);flex-shrink:0;cursor:pointer}
.contact-form .widget-checkbox label{font-weight:400;font-size:.875rem;color:var(--ink-soft);line-height:1.5;letter-spacing:normal}
.contact-form .widget-checkbox a{text-decoration:underline;text-underline-offset:2px}
.contact-form .widget-checkbox a:hover{color:var(--ink)}

/* Submit-Button (.btn + Pfeil). */
.contact-form .widget-submit{margin-top:1.8rem}
.contact-form .widget-submit button{display:inline-flex;align-items:center;gap:.7em;font-size:.78rem;font-weight:600;letter-spacing:.16em;padding:1.1em 1.8em;background:var(--ink);color:var(--on-ink);border:none;border-radius:0;cursor:pointer;font-family:inherit;transition:background .3s var(--ease)}
.contact-form .widget-submit button:hover{background:oklch(0.26 0.006 75)}
.contact-form .widget-submit button::after{content:"\2192";transition:transform .35s var(--ease)}
.contact-form .widget-submit button:hover::after{transform:translateX(.22em)}

/* Bestaetigungs-/Fehlermeldung des Formulars. */
.contact-form .confirmation,.contact-form p.error,.contact-form .widget .error{font-size:.875rem;color:var(--ink-soft);margin-top:.9rem;line-height:1.45}

@media(max-width:860px){.contact{grid-template-columns:1fr}}
/* === /rsce_kontakt === */

/* === rsce_galerie === */
/* Galerie mit mitlaufendem Text (.sc-grid/.sc-cap/.sc-imgs) 1:1 aus visura.css
   (ueber-uns.html, Z.442-451): links eine sticky Caption, die beim Scrollen stehen
   bleibt, waehrend rechts die Bildspalte durchlaeuft. Das "Blockieren" ist reines
   CSS-Sticky (.sc-cap position:sticky), kein JS. --navh/--gap/--ink-soft aus dem
   Foundation-Block. Bilder faden ueber .rv (IntersectionObserver, app.js) ein.
   Spacing: Quelle hat inline padding-top:0 -> hier padding-bottom-only, der obere
   Abstand kommt vom Element darueber. .sc-imgs figure{margin:0} neutralisiert den
   contao_figure-Wrapper; die <figcaption> liegt im .sc-fig-Block. */
.galerie-sec{padding-bottom:var(--sec)}
.sc-grid{display:grid;grid-template-columns:.82fr 1.18fr;gap:clamp(2rem,5vw,5rem);align-items:start}
.sc-cap{position:sticky;top:calc(var(--navh) + 1.5rem);align-self:start}
/* Contao rendert das Element in <div class="mod_article ... block">. Contao-Core
   setzt .block{overflow:hidden} (vgl. nav.menu-Override oben) -> der Artikel wird zum
   Scroll-/Clipping-Container und bricht das position:sticky der .sc-cap (Caption
   scrollt mit statt zu bleiben). Nur auf Artikeln mit Galerie via :has() aufheben;
   body{overflow-x:clip} klippt weiterhin horizontal, kein horizontaler Scrollbalken. */
.mod_article:has(.sc-cap){overflow:visible}
.sc-cap .label{display:block;margin-bottom:1.1rem}
.sc-cap h3{font-size:clamp(1.7rem,3vw,2.5rem);margin-bottom:.7rem;font-weight:500;letter-spacing:-.03em}
.sc-cap p{color:var(--ink-soft);max-width:34ch}
.sc-imgs{display:flex;flex-direction:column;gap:var(--gap)}
.sc-imgs figure{overflow:hidden;margin:0}
.sc-imgs img{width:100%;aspect-ratio:4/3;object-fit:cover}
.sc-imgs figcaption{margin-top:.7rem;color:var(--ink-soft);font-size:.84rem}
@media(max-width:820px){.sc-grid{grid-template-columns:1fr}.sc-cap{position:static}}
/* === /rsce_galerie === */

/* === rsce_dip === */
/* Versetzte Bilder, paarweise. Werte 1:1 aus visura.css (.dip). Markup-Anpassung:
   Grid-Kind ist .dip-fig (statt <figure>), weil contao_figure sein eigenes <figure>
   mitbringt; die Bildunterschrift liegt als .dip-cap darunter (statt <figcaption>).
   Aspect/Versatz/Spalten bleiben 1:1. Pro .dip-Reihe: 1. Bild links (4:5, oben),
   2. Bild rechts (3:4, nach unten versetzt). .dip + .dip = Abstand zwischen den
   Reihen. Tokens (--gap/--sec/--ink/--ink-soft) aus dem Foundation-Block. */
.dip-sec{padding-bottom:var(--sec)}
.dip{display:grid;grid-template-columns:1fr 1fr;gap:var(--gap);align-items:start}
.dip + .dip{margin-top:clamp(2rem,5vw,4rem)}
.dip .dip-fig figure{overflow:hidden;margin:0}
.dip .dip-fig:nth-child(1) figure img{aspect-ratio:4/5}
.dip .dip-fig:nth-child(2){margin-top:clamp(3rem,10vw,9rem)}
.dip .dip-fig:nth-child(2) figure img{aspect-ratio:3/4}
.dip img{width:100%;object-fit:cover}
.dip .dip-cap{margin-top:1em;color:var(--ink-soft);font-size:.92rem}
.dip .dip-cap .t{display:block;color:var(--ink);font-weight:500}
@media(max-width:680px){.dip{grid-template-columns:1fr;gap:clamp(2rem,6vw,3rem)}.dip .dip-fig:nth-child(2){margin-top:0}}
/* === /rsce_dip === */

/* === Immobilien-Liste + Inserat-Detailseite: portiert aus visura.css === */
.lb :focus-visible,.cta-band :focus-visible,.statement :focus-visible{outline-color:var(--on-ink)}
.btn.ghost{background:transparent;color:var(--ink);box-shadow:inset 0 0 0 1.5px var(--ink)}
.btn.ghost:hover{background:var(--ink);color:var(--on-ink)}
.prose p{color:var(--ink-soft);font-size:1.1rem;line-height:1.65}
.prose h2{font-size:clamp(1.7rem,3vw,2.4rem);margin-top:2em}
.prose h3{font-size:clamp(1.3rem,2vw,1.7rem);margin-top:1.6em}
.prose strong{color:var(--ink);font-weight:600}
.result-bar{display:flex;justify-content:space-between;align-items:baseline;gap:20px;margin-bottom:clamp(2rem,4vw,3rem);flex-wrap:wrap}
.result-bar .cnt{font-size:1.05rem}.result-bar .cnt b{font-weight:600}
.result-bar .sort{font-size:.9rem;color:var(--ink-soft)}
.no-results{padding:clamp(3rem,7vw,6rem) 0;color:var(--ink-soft);font-size:1.1rem;line-height:1.5;text-align:center;max-width:46ch;margin-inline:auto}
.cards{display:grid;grid-template-columns:repeat(auto-fill,minmax(min(330px,100%),1fr));gap:clamp(2rem,3vw,3rem) var(--gap)}
.card{display:flex;flex-direction:column;cursor:pointer}
.card .im{position:relative;overflow:hidden;margin-bottom:1.3rem}
.card .im img{width:100%;height:clamp(240px,30vh,300px);object-fit:cover;filter:saturate(.94);transition:transform 1.4s var(--ease),filter .7s var(--ease)}
.card:hover .im img{transform:scale(1.05);filter:saturate(1.08) brightness(1.02)}
.card .badge{position:absolute;top:0;left:0;background:var(--ink);color:var(--on-ink);font-size:.64rem;font-weight:600;letter-spacing:.18em;padding:.65em 1em}
.card h3{font-size:clamp(1.25rem,1.8vw,1.5rem);font-weight:500;letter-spacing:-.02em}
.card .loc{color:var(--ink-soft);font-size:.92rem;margin-top:.35rem}
.card .meta{display:flex;gap:18px;margin-top:1rem;font-size:.86rem;color:var(--ink-soft);font-variant-numeric:tabular-nums;flex-wrap:wrap}
.card .price{font-size:1.3rem;font-weight:500;font-variant-numeric:tabular-nums;margin-top:1rem}
.cards.mag{grid-template-columns:repeat(6,1fr)}
.cards.mag .card{grid-column:span 2}
.cards.mag .card:nth-child(-n+2){grid-column:span 3}
.cards.mag .card:nth-child(-n+2) .im img{height:clamp(320px,40vh,440px)}
@media(max-width:860px){
  .cards.mag{grid-template-columns:1fr 1fr}
  .cards.mag .card,.cards.mag .card:nth-child(-n+2){grid-column:span 1}
  .cards.mag .card:nth-child(-n+2) .im img{height:clamp(240px,30vh,300px)}
}
@media(max-width:560px){.cards.mag{grid-template-columns:1fr}}
/* Breite Immobilien-Seite: Vorlage nutzt <body class="wide"> mit
   ".wide main{--maxw:1700px;--pad-x:clamp(1.75rem,5vw,5.5rem)}". In Contao
   wird kein Body-Class gesetzt, daher per :has() gekoppelt: an die
   immobilien_liste (Listenseite) UND an .exp-layout (Detailseite/Reader, immer
   vorhanden; robuster als .exp-gallery, das nur bei Bildern rendert). Der
   <main>-Wrapper umfasst alle Sektionen (Hero, Galerie, Infoblock, Impressionen,
   Aehnliche Objekte, Filter/Cards; alle .wrap erben die Tokens); Header und
   Footer liegen ausserhalb und bleiben bei --maxw 1320. */
main:has(.immobilien-liste),main:has(.exp-layout){--maxw:1700px;--pad-x:clamp(1.75rem,5vw,5.5rem)}
.immo-layout{display:grid;grid-template-columns:300px 1fr;gap:clamp(2.5rem,4vw,4.5rem);align-items:start}
.filt-toggle{display:none}
.filt{position:sticky;top:clamp(94px,11vh,120px);max-height:calc(100vh - 130px);overflow:auto;padding-right:10px}
.filt-head{display:flex;justify-content:space-between;align-items:baseline;margin-bottom:.4rem}
.filt-head h2{font-size:1.4rem}
.filt-head .reset{font-size:.7rem;font-weight:600;letter-spacing:.12em;color:var(--ink-soft);background:none;border:none;cursor:pointer}
.filt-head .reset:hover{color:var(--ink)}
.fgrp{padding-block:clamp(1.2rem,2vw,1.5rem)}
.fh{font-size:.7rem;font-weight:600;letter-spacing:.16em;color:var(--ink-soft);margin-bottom:.95rem}
.fseg{display:flex;gap:6px;flex-wrap:wrap}
.fseg.eq .fseg-b{flex:1;text-align:center;padding-inline:.5em}
.fseg-b{font-family:inherit;font-size:.82rem;font-weight:500;color:var(--ink-soft);background:var(--paper-2);border:none;border-radius:0;padding:.72em 1em;cursor:pointer;transition:background .25s,color .25s;white-space:nowrap}
.fseg-b:hover{color:var(--ink)}
.fseg-b.active{background:var(--ink);color:var(--on-ink)}
.frange{display:flex;align-items:center;gap:10px}
.frange input{flex:1;min-width:0;background:var(--paper-2);border:none;border-radius:0;padding:.85em 1em;font-family:inherit;font-size:.95rem;color:var(--ink)}
.frange input::placeholder{color:var(--ink-soft)}
.frange input:focus{outline:2px solid var(--ink);outline-offset:2px}
.frange .fdash{color:var(--ink-faint);flex-shrink:0}
.fsel{width:100%;font-family:inherit;font-size:.95rem;color:var(--ink);background:var(--paper-2);border:none;border-radius:0;padding:.85em 2.4em .85em 1em;appearance:none;-webkit-appearance:none;cursor:pointer;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath d='M1 1l5 5 5-5' fill='none' stroke='%237a7a76' stroke-width='1.4'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 1em center}
.fsel:focus{outline:2px solid var(--ink);outline-offset:2px}
.fchecks{display:grid;grid-template-columns:1fr;gap:.8rem}
.fchecks.two{grid-template-columns:1fr 1fr;gap:.8rem 1.2rem}
.fcheck{display:flex;align-items:center;gap:.6em;font-size:.95rem;color:var(--ink-soft);cursor:pointer}
.fcheck input{width:17px;height:17px;accent-color:var(--ink);flex-shrink:0;cursor:pointer}
.fcheck:hover{color:var(--ink)}
.factions{margin-top:1.4rem}
.factions .btn{width:100%;justify-content:center}
.sortbox{display:inline-flex;align-items:center;gap:.6em;font-size:.85rem;color:var(--ink-soft);white-space:nowrap}
.sortbox select{font-family:inherit;font-size:.9rem;font-weight:500;color:var(--ink);background:var(--paper-2);border:none;border-radius:0;padding:.6em 2.2em .6em .9em;appearance:none;-webkit-appearance:none;cursor:pointer;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath d='M1 1l5 5 5-5' fill='none' stroke='%237a7a76' stroke-width='1.4'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right .8em center}
.sortbox select:focus{outline:2px solid var(--ink);outline-offset:2px}
.exp-gallery{display:grid;grid-template-columns:minmax(0,2.45fr) minmax(0,1fr);gap:var(--gap);align-items:stretch}
.eg-main{overflow:hidden;min-height:0}
.eg-main img{width:100%;height:clamp(440px,66vh,760px);object-fit:cover;transition:opacity .35s var(--ease)}
.eg-thumbs{display:flex;flex-direction:column;gap:var(--gap);min-height:0}
.eg-thumb{flex:1 1 0;min-height:0;position:relative;overflow:hidden;border:none;padding:0;margin:0;background:var(--paper-2);cursor:pointer;display:block;width:100%}
.eg-thumb img{width:100%;height:100%;object-fit:cover;opacity:.72;transition:transform 1.2s var(--ease),opacity .4s var(--ease)}
.eg-thumb:hover img,.eg-thumb.is-active img{opacity:1}
.eg-thumb:hover img{transform:scale(1.05)}
.eg-more::after{content:attr(data-more);position:absolute;inset:0;display:grid;place-items:center;color:var(--ink);background:color-mix(in oklch,var(--paper) 64%,transparent);-webkit-backdrop-filter:blur(14px) saturate(1.1);backdrop-filter:blur(14px) saturate(1.1);font-size:.72rem;font-weight:600;letter-spacing:.05em}
.exp-layout{display:grid;grid-template-columns:1.6fr 1fr;gap:clamp(3rem,6vw,6rem);align-items:start;margin-top:clamp(3rem,6vw,5rem)}
.exp-main .label{display:block;margin-bottom:1.2rem}
.exp-main h1{font-size:clamp(2rem,4vw,3.2rem);font-weight:500;letter-spacing:-.035em;margin-bottom:.5rem}
.exp-main .loc{color:var(--ink-soft);font-size:1.1rem;margin-bottom:2.4rem}
.exp-specs{display:grid;grid-template-columns:repeat(auto-fit,minmax(120px,1fr));gap:1.6rem 1.8rem;margin-bottom:clamp(2.6rem,4vw,3.4rem)}
.exp-specs .k{font-size:.66rem;font-weight:600;letter-spacing:.14em;color:var(--ink-soft);margin-bottom:.4rem}
.exp-specs .v{font-size:1.2rem;font-weight:500;font-variant-numeric:tabular-nums}
.exp-feat{columns:2;column-gap:3rem;list-style:none;margin-top:1rem}
.exp-feat li{padding:.5rem 0;color:var(--ink-soft);break-inside:avoid}
.ekv{display:flex;flex-wrap:nowrap;gap:clamp(1.2rem,2.2vw,2.6rem);margin:1.2rem 0 0}
.ekv dt{font-size:.875rem;font-weight:600;letter-spacing:.05em;color:var(--ink-soft);margin-bottom:.4rem;white-space:nowrap}
.ekv dd{font-size:1.1rem;font-weight:500;margin:0;font-variant-numeric:tabular-nums;white-space:nowrap}
@media(max-width:1200px){.ekv{flex-wrap:wrap;gap:1.6rem 2.8rem}}
.exp-side{position:sticky;top:clamp(96px,12vh,128px)}
.exp-side .price{font-size:clamp(1.8rem,2.6vw,2.4rem);font-weight:500;font-variant-numeric:tabular-nums}
.exp-side .price small{display:block;font-size:.66rem;font-weight:600;letter-spacing:.16em;color:var(--ink-soft);margin-bottom:.5rem}
.exp-side .ppsm{margin-top:.5rem;color:var(--ink-soft);font-size:.92rem}
.exp-side .agent{display:flex;align-items:center;gap:14px;margin:1.8rem 0}
.exp-side .agent .ph{width:52px;height:52px;border-radius:50%;background:var(--paper-3);flex-shrink:0;display:grid;place-items:center;color:var(--ink);font-weight:600;font-size:1.02rem;letter-spacing:.03em}
.exp-side .agent .an{font-weight:500}.exp-side .agent .ar{font-size:.85rem;color:var(--ink-soft)}
.exp-side .btn{width:100%;justify-content:center;margin-top:.6rem}
.exp-side .ln{display:block;text-align:center;margin-top:1rem;font-size:.92rem;color:var(--ink-soft)}
/* font-size:.875rem + letter-spacing:.05em wie im Original: dort gehoert .card-peek
   zur .875rem-Sammelregel (visura.css), die nach dem Block kommt und .66rem/.18em
   ueberschreibt. app.css' Sammelregel liess .card-peek aus -> Pill blieb zu klein und
   zu weit gesperrt (v.a. im grossen Objekt-Slider). Hier direkt auf den Endwert. */
.card-peek{position:absolute;left:0;bottom:0;width:100%;padding:1.15em 1.3em;display:flex;align-items:center;gap:.55em;
  font-size:.875rem;font-weight:600;letter-spacing:.05em;color:var(--ink);
  background:color-mix(in oklch,var(--paper) 64%,transparent);-webkit-backdrop-filter:blur(14px) saturate(1.1);backdrop-filter:blur(14px) saturate(1.1);
  transform:translateY(12px);opacity:0;transition:transform .55s var(--ease),opacity .45s var(--ease)}
.card:hover .card-peek{transform:translateY(0);opacity:1}
.card-peek .ar{transition:transform .5s var(--ease)}
.card:hover .card-peek .ar{transform:translateX(4px)}
.imp{display:grid;grid-template-columns:repeat(12,1fr);gap:var(--gap);align-items:start}
.imp figure{overflow:hidden;margin:0}
.imp img{width:100%;height:100%;object-fit:cover}
.imp .f1{grid-column:1 / span 7}.imp .f1 img{aspect-ratio:7/5}
.imp .f2{grid-column:8 / span 5;margin-top:clamp(2rem,7vw,6rem)}.imp .f2 img{aspect-ratio:4/5}
.imp .f3{grid-column:1 / span 5;margin-top:clamp(1rem,3vw,2.5rem)}.imp .f3 img{aspect-ratio:5/4}
.imp .f4{grid-column:7 / span 6;margin-top:clamp(1rem,3vw,2.5rem)}.imp .f4 img{aspect-ratio:16/10}
.imp figcaption{margin-top:.7rem;color:var(--ink-soft);font-size:.82rem}
@media(max-width:760px){.imp{grid-template-columns:1fr 1fr;gap:clamp(14px,3vw,22px)}.imp figure{grid-column:auto!important;margin-top:0!important}.imp img{aspect-ratio:4/5!important}}
@media(max-width:860px){
  .immo-layout{grid-template-columns:1fr}
  .filt{position:static;max-height:none;overflow:visible;display:none;padding-right:0;margin-bottom:2rem}
  .filt.open{display:block}
  .filt-toggle{display:inline-flex;margin-bottom:1.6rem}
  .split,.contact,.exp-layout,.exp-gallery{grid-template-columns:1fr}
  .eg-main img{height:clamp(240px,46vh,420px)}
  .eg-thumbs{flex-direction:row}
  .eg-thumb{height:clamp(84px,15vh,120px)}
  .exp-side{position:static}
  .split.rev .txt{order:0}
  .split .img{margin-top:2.2rem}
  .exp-feat{columns:1}
}
.lb{position:fixed;inset:0;z-index:60;background:rgba(20,20,19,.97);background:oklch(0.145 0.005 75/.97);display:flex;flex-direction:column;opacity:0;visibility:hidden;transition:opacity .35s var(--ease),visibility .35s}
.lb.open{opacity:1;visibility:visible}
.lb-top{display:flex;justify-content:space-between;align-items:center;gap:20px;padding:clamp(1rem,2.5vw,1.6rem) clamp(1.25rem,4vw,3rem);color:var(--on-ink);flex-shrink:0}
.lb-count{font-size:.875rem;letter-spacing:.05em;font-variant-numeric:tabular-nums;color:oklch(0.82 0.006 75)}
.lb-close{background:none;border:none;color:var(--on-ink);cursor:pointer;font-family:inherit;font-size:1.5rem;line-height:1;width:44px;height:44px;display:inline-flex;align-items:center;justify-content:center}
.lb-stage{flex:1;display:flex;align-items:center;justify-content:center;gap:clamp(.5rem,2vw,1.5rem);padding:0 clamp(.75rem,3vw,2.5rem) clamp(1.25rem,3vw,2.5rem);min-height:0}
.lb-fig{flex:1;min-width:0;height:100%;margin:0;display:flex;align-items:center;justify-content:center}
.lb-fig img{max-width:100%;max-height:100%;width:auto;height:auto;object-fit:contain}
.lb-nav{flex-shrink:0;width:clamp(46px,5vw,60px);height:clamp(46px,5vw,60px);display:inline-flex;align-items:center;justify-content:center;background:rgba(255,255,255,.12);color:var(--on-ink);border:none;cursor:pointer;font-family:inherit;font-size:1.2rem;transition:background .25s var(--ease)}
.lb-nav:hover{background:rgba(255,255,255,.22)}
.lb-nav[disabled]{opacity:.28;cursor:default}
.lb-nav[disabled]:hover{background:rgba(255,255,255,.12)}
@media(max-width:640px){.lb-nav{position:absolute;top:50%;transform:translateY(-50%);z-index:2}.lb-prev{left:8px}.lb-next{right:8px}.lb-stage{padding-inline:0}}
@media(prefers-reduced-motion:reduce){.lb{transition:none}}
.card-legal{margin-top:.7rem;font-size:.76rem;color:var(--ink-soft);line-height:1.5}
.exp-side .provision{margin-top:.5rem;color:var(--ink-soft);font-size:.86rem;line-height:1.45}
.lb-thumbs{display:flex;gap:8px;align-items:center;justify-content:center;justify-content:safe center;overflow-x:auto;flex-shrink:0;padding:0 clamp(.75rem,3vw,2.5rem) clamp(1rem,2.5vw,1.6rem);scrollbar-width:none}
.lb-thumbs::-webkit-scrollbar{display:none}
.lb-thumb{flex:0 0 auto;width:74px;height:56px;padding:0;border:none;background:none;cursor:pointer;opacity:.45;transition:opacity .25s var(--ease)}
.lb-thumb img{width:100%;height:100%;object-fit:cover;display:block}
.lb-thumb:hover{opacity:.8}
.lb-thumb.is-active{opacity:1}
@media(max-width:640px){.lb-thumb{width:60px;height:46px}}
.lb-cap{color:oklch(0.82 0.006 75);text-align:center;font-size:.9rem;line-height:1.4;flex-shrink:0;padding:0 clamp(.75rem,3vw,2.5rem) clamp(.9rem,2vw,1.3rem)}

/* Detail-Prose: erstes Element ohne grossen Abstand oben (unabhaengig vom Editor-HTML) */
.prose > :first-child{margin-top:0}

/* Impressionen-Kopf: Notiz vertikal mittig zur Ueberschrift (statt unten) */
.imp-head{align-items:center}
@media(max-width:860px){.imp-head{align-items:flex-start}}

/* ============================================================
   Startseite (home): Hero, Suche-Tabs, Objekt-Slider, Standorte,
   Statement "Einsicht". 1:1 portiert aus visura-html-website/visura.css.
   .showcase / .w75 / .card-peek sind bereits oben definiert (nicht doppelt).
   .imgfield (Bild-Hover-Punktfeld) auf Wunsch sitewide aktiv (Block unten + app.js initImgfields).
   ============================================================ */
body.home{--sec:clamp(7rem,15vw,15rem)}
body.home section + section:not(.statement){padding-top:0}

body.home section.statement + section{padding-top:var(--sec)}
body.home form{margin-top:0}

/* padding-bottom:var(--sec) liefert den Abstand Hero -> "Immobilien finden".
   Im Original kam er aus section{padding-block:var(--sec)}; app.css hat das nicht
   global, darum hier scoped (Nachbar #immobilien hat section+section{padding-top:0}). */
.hero{padding-top:clamp(3.25rem,7vw,7rem);padding-bottom:var(--sec);position:relative;isolation:isolate}
.hero>.wrap{position:relative;z-index:1}

.modfield{position:absolute;left:0;right:0;top:0;z-index:0;pointer-events:none;overflow:hidden;
  -webkit-mask-image:linear-gradient(to bottom,#000 0%,#000 56%,transparent 100%);
          mask-image:linear-gradient(to bottom,#000 0%,#000 56%,transparent 100%)}
.modfield i{position:absolute;width:7px;height:7px;background:color-mix(in srgb,var(--ink),transparent 93%);
  transform:translate(-50%,-50%) scale(1);transition:transform .4s var(--ease);will-change:transform}
@media(prefers-reduced-motion:reduce){.modfield i{transition:none}}

/* imgfield: Bild-Hover-Punktraster (folgt dem Cursor ueber jedem Inhaltsbild).
   Auf Wunsch sitewide aktiv (JS: app.js initImgfields). 1:1 aus visura-html-website. */
.imgfield{position:absolute;pointer-events:none;overflow:hidden}
.imgfield i{position:absolute;width:7px;height:7px;background:#fff;opacity:0;
  transform:translate(-50%,-50%) scale(1);
  transition:opacity .3s var(--ease),transform .3s var(--ease);will-change:opacity,transform}
@media(prefers-reduced-motion:reduce){.imgfield i{transition:none}}

.hero-head{text-align:center;max-width:1000px;margin:0 auto}
.hero-head .eyebrow{display:inline-block;margin-bottom:clamp(1.8rem,3.5vw,2.6rem)}
.hero-head h1{font-size:clamp(2.6rem,6.4vw,5.6rem);font-weight:500;letter-spacing:-.04em;line-height:1;max-width:20ch;margin-inline:auto}
.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}
.hero-head h1 .rotor{display:block;position:relative;height:1em;margin-top:.04em}
.hero-head h1 .rw{position:absolute;left:0;right:0;top:0;opacity:0;clip-path:inset(0 0 100% 0);transition:clip-path .6s var(--ease),opacity .35s var(--ease)}
.hero-head h1 .rw.is-active{opacity:1;clip-path:inset(0 0 0 0)}
@media(prefers-reduced-motion:reduce){.hero-head h1 .rw{transition:none}}
.hero-head .hero-sub{color:var(--ink-soft);font-size:clamp(1.1rem,1.4vw,1.4rem);line-height:1.45;max-width:48ch;margin:clamp(1.6rem,2.6vw,2.2rem) auto 0}
.hero-head .hero-actions{display:flex;gap:28px;justify-content:center;align-items:center;flex-wrap:wrap;margin-top:clamp(2rem,3.4vw,2.8rem)}
.hero-feature{display:grid;grid-template-columns:3fr 1fr;gap:clamp(2rem,3vw,4rem);align-items:stretch;margin-top:clamp(4rem,8vw,8rem);width:100vw;margin-left:calc(50% - 50vw);margin-right:calc(50% - 50vw);padding-right:var(--pad-x)}
.hf-img{overflow:hidden}
.hf-img img{width:100%;height:clamp(560px,88vh,1100px);object-fit:cover}
.hf-info{display:flex;flex-direction:column;justify-content:center;align-self:stretch}
.hf-info .label{display:block;margin-bottom:1.3rem}
.hf-title{font-size:clamp(1.95rem,2.43vw,2.6rem);font-weight:500;letter-spacing:-.01em;line-height:1.08;margin-bottom:.7rem}
.hf-loc{color:var(--ink-soft);font-size:.98rem;line-height:1.45;margin-bottom:1.8rem}
.hf-specs{padding:clamp(1.3rem,1.6vw,1.7rem) 0;display:flex;flex-direction:column;gap:1rem;margin-bottom:1.8rem}
.hf-specs .r{display:flex;justify-content:space-between;align-items:baseline;gap:14px}
.hf-specs .k{font-size:.68rem;font-weight:600;letter-spacing:.12em;color:var(--ink-faint)}
.hf-specs .v{font-size:1.1rem;font-weight:500;font-variant-numeric:tabular-nums}
.hf-price{font-size:clamp(1.5rem,1.9vw,1.9rem);font-weight:500;font-variant-numeric:tabular-nums;margin-bottom:1.4rem}
.hf-price small{display:block;font-size:.66rem;font-weight:600;letter-spacing:.16em;color:var(--ink-faint);margin-bottom:.45rem}

.search{background:var(--paper-2);padding:clamp(1.4rem,2vw,2rem);margin-bottom:clamp(3rem,6vw,5rem)}
.s-tabs{display:flex;gap:6px;margin-bottom:clamp(1.1rem,2vw,1.5rem);position:relative}
.s-tab{font-family:inherit;font-size:.74rem;font-weight:600;letter-spacing:.1em;color:var(--ink-soft);background:none;border:none;cursor:pointer;padding:.7em 1.15em;transition:.25s var(--ease);position:relative;z-index:1}
.s-tab:hover{color:var(--ink)}
.s-tab.active{color:var(--on-ink)}
.s-fields{display:grid;grid-template-columns:2.4fr 1fr 1fr auto;gap:12px}
.s-fields input,.s-fields select{font-family:inherit;font-size:1rem;color:var(--ink);background:var(--paper);border:none;border-radius:0;padding:1.05em 1.15em;appearance:none;-webkit-appearance:none}
.s-fields input::placeholder{color:var(--ink-soft)}
.s-fields select{color:var(--ink-soft);cursor:pointer;padding-right:2.6em;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath d='M1 1l5 5 5-5' fill='none' stroke='%237a7a76' stroke-width='1.4'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 1.15em center}
.s-fields input:focus,.s-fields select:focus{outline:2px solid var(--ink);outline-offset:2px}
.s-fields .btn{white-space:nowrap;height:100%}

/* Im Original lag der Slider IN der #immobilien-Sektion; der Abstand nach unten
   (Slider -> Standorte) kam aus deren section{padding-block:var(--sec)}. Hier ist der
   Slider eine eigene Sektion -> padding-bottom:var(--sec) liefert denselben Abstand.
   NUR unten (section+section{padding-top:0} haelt die Luecke search -> Slider bei
   .search margin-bottom). */
.slider-sec{padding-bottom:var(--sec)}
.slider-wrap{width:100vw;margin-left:calc(50% - 50vw);margin-right:calc(50% - 50vw)}
.slider-head{display:flex;justify-content:flex-end;gap:10px;padding-inline:clamp(1.25rem,3.5vw,3.5rem);margin-bottom:clamp(1.3rem,2.4vw,1.9rem)}
.sl-arrow{width:54px;height:54px;display:inline-flex;align-items:center;justify-content:center;border:none;background:var(--paper-2);color:var(--ink);cursor:pointer;font-family:inherit;font-size:1.15rem;transition:background .3s var(--ease),color .3s var(--ease),opacity .3s var(--ease)}
.sl-arrow:hover{background:var(--ink);color:var(--on-ink)}
.sl-arrow[disabled]{opacity:.28;cursor:default}
.sl-arrow[disabled]:hover{background:var(--paper-2);color:var(--ink)}
.slider{--edge:calc(max(0px,(100vw - var(--maxw)) / 2) + var(--pad-x));display:flex;gap:var(--gap);align-items:flex-start;overflow-x:auto;scroll-snap-type:x mandatory;scroll-behavior:smooth;padding-left:var(--edge);padding-right:clamp(1.25rem,3.5vw,3.5rem);scroll-padding-left:var(--edge);padding-bottom:6px;scrollbar-width:none;-ms-overflow-style:none}
.slider::-webkit-scrollbar{display:none}
.slider{cursor:grab}
.slider.dragging,.slider.dragging *{cursor:grabbing;user-select:none}
.slider.dragging .pf .im img{transition:none}
.pf{display:flex;flex-direction:column;flex:0 0 auto;scroll-snap-align:start;width:clamp(360px,41vw,540px)}
.pf.w-lg{width:clamp(450px,55vw,700px)}
.pf.w-sm{width:clamp(300px,31vw,400px)}
.pf .im{display:block;position:relative;overflow:hidden;margin-bottom:1.4rem;height:clamp(480px,65vh,680px)}
.pf.h-lg .im{height:clamp(560px,77vh,800px)}
.pf.h-sm .im{height:clamp(400px,53vh,540px)}
.pf .im img{width:100%;height:100%;object-fit:cover;filter:saturate(.94);transition:transform 1.9s var(--ease),filter .7s var(--ease)}
.pf:hover .im img{transform:scale(1.045);filter:saturate(1.08) brightness(1.02)}
.pf:hover .card-peek{transform:translateY(0);opacity:1}
.pf:hover .card-peek .ar{transform:translateX(4px)}
.pf .cap{display:flex;justify-content:space-between;align-items:baseline;gap:18px}
.pf h3{font-size:clamp(1.4rem,2.2vw,1.9rem);font-weight:500;letter-spacing:-.03em}
.pf .sub{color:var(--ink-soft);font-size:.92rem;margin-top:.45rem}
.pf .tag{font-size:.66rem;font-weight:600;letter-spacing:.16em;color:var(--ink-faint);white-space:nowrap}
.pf-foot{display:flex;justify-content:flex-end;margin-top:clamp(2.4rem,4vw,3.4rem);padding-inline:clamp(1.25rem,3.5vw,3.5rem)}

/* Standorte-Sektion: Abstand nach unten (im Original via section{padding-block:var(--sec)};
   hier fehlte er, daher explizit). */
#lagen{padding-bottom:var(--sec)}
.idx{position:relative;display:grid;grid-template-columns:1fr 1fr}
.idx-row{display:flex;justify-content:flex-start;align-items:center;gap:14px;width:100%;text-align:left;background:none;border:none;cursor:pointer;font-family:inherit;padding:clamp(.8rem,1.4vw,1.2rem) 0;color:var(--ink-faint);transition:color .4s var(--ease)}
.idx:hover .idx-row{color:oklch(0.72 0.006 75)}
.idx .idx-row:hover{color:var(--ink)}
.idx-row .iln{font-size:clamp(1.6rem,4vw,3rem);font-weight:500;letter-spacing:-.035em;line-height:1.1}
.idx-row .ilc{font-size:.76rem;color:var(--ink-faint);font-variant-numeric:tabular-nums;white-space:nowrap}
.idx-prev{position:absolute;top:0;left:0;z-index:5;pointer-events:none;width:clamp(200px,18vw,300px);aspect-ratio:4/3;overflow:hidden;opacity:0;transform-origin:bottom left;transform:translate(1.25rem,calc(-100% - 1.25rem)) scale(.92);transition:opacity .4s var(--ease),transform .55s var(--ease)}
.idx.show .idx-prev{opacity:1;transform:translate(1.25rem,calc(-100% - 1.25rem)) scale(1)}
.idx-layer{position:absolute;inset:0;background-size:cover;background-position:center;background-repeat:no-repeat;opacity:0;transition:opacity .8s var(--ease)}
.idx-layer.on{opacity:1}
.idx-dots{position:absolute;bottom:.9em;left:0;width:100%;display:flex;gap:.45em;justify-content:center;z-index:2}
.idx-dots span{width:6px;height:6px;background:rgba(255,255,255,.5);transition:background .4s var(--ease)}
.idx-dots span.on{background:#fff}
@media(max-width:600px){.idx{grid-template-columns:1fr}}
@media(hover:none){.idx-prev{display:none}.idx .idx-row{color:var(--ink)}}
.statement{position:relative;isolation:isolate;background:var(--dark);color:var(--on-ink);padding-block:clamp(3rem,6.2vw,6.5rem);overflow:hidden}
.statement .bg{position:absolute;inset:0;z-index:-1}
.statement .bg img{width:100%;height:100%;object-fit:cover;filter:brightness(.4) contrast(1.05)}
.statement .bg::after{content:"";position:absolute;inset:0;background:linear-gradient(108deg,oklch(0.145 0.005 75/.9),oklch(0.145 0.005 75/.5))}
.statement .inner{grid-column:2 / span 8}
.statement .label{color:oklch(0.72 0.006 75);display:block;margin-bottom:2.2rem}
.statement .quote{font-size:clamp(2.4rem,6vw,5rem);font-weight:500;line-height:1.04;letter-spacing:-.04em;max-width:18ch}
.statement .quote b{font-weight:300}
.statement p{color:oklch(0.83 0.006 75);max-width:52ch;margin-top:2.4rem;font-size:1.1rem;line-height:1.7}
.statement .st-foot{margin-top:clamp(2.6rem,5vw,3.5rem)}

.statement .wrap{position:relative;z-index:1}
.statement .mark{position:absolute;right:-2%;bottom:-7%;z-index:0;width:clamp(300px,42vw,640px);height:auto;pointer-events:none;
  transform:translate(calc(var(--px,0)*1px),calc(var(--py,0)*1px));transition:transform .5s var(--ease)}
.statement .mark svg{display:block;width:100%;height:auto;fill:color-mix(in oklch, var(--paper), transparent 86%)}
@media(max-width:860px){.statement .mark{display:none}}
@media(prefers-reduced-motion:reduce){.statement .mark{transition:none}}
@media(max-width:860px){
  .hero-feature{grid-template-columns:1fr;gap:0;padding-right:0}
  .hf-img img{height:clamp(380px,60vh,640px)}
  .hf-info{margin-top:2rem;padding-inline:var(--pad-x)}
  .s-fields{grid-template-columns:1fr}
  .pf,.pf.w-lg,.pf.w-sm{width:min(84vw,440px)}
  .pf .im,.pf.h-lg .im,.pf.h-sm .im{height:clamp(440px,62vh,580px)}
  .srv-layout{grid-template-columns:1fr;gap:2.4rem}
  .srv-media img{min-height:clamp(300px,46vh,460px)}
  .srv-col{justify-content:flex-start}
  .srv .ar{opacity:.5;transform:none}
  .statement .inner{grid-column:1 / -1}
  .about{grid-template-columns:1fr}
  .about .img{margin-top:2.2rem}
  body.home form{margin-top:2.5rem}
}

/* Label-Typografie der Startseite (entspricht der gruppierten Regel der Quelle) */
.hf-specs .k,.hf-price small,.s-tab,.pf .tag{text-transform:none;letter-spacing:.05em;font-size:.875rem}

/* Statement-Hintergrund: contao_figure liefert ein <figure> in .bg; auf volle Groesse ziehen */
.statement .bg figure{margin:0;width:100%;height:100%}

/* Tab-Indikator fuer .s-tabs (Suche). Ohne ihn waere der aktive Tab (--on-ink) unsichtbar. */
.tabs-ink{position:absolute;top:0;left:0;height:100%;background:var(--ink);z-index:0;pointer-events:none;transition:transform .5s var(--ease),width .5s var(--ease)}

/* Leistungen-Sektion (.srv-layout): Bild links + Service-Liste rechts. 1:1 aus visura.css.
   Mobil-Overrides stehen bereits im @media(max-width:860px)-Block oben.

   Margin-Reset (scoped): im Original killt *{margin:0;padding:0} (visura.css Z.27) alle
   Default-UA-Margins. app.css hat diesen Reset bewusst NICHT global. Ohne ihn blaehen die
   Browser-Defaults von <h3> (~1.17em) und <p> (~1em) jede .srv-Karte auf -> Layout wirkt
   "zu lang gezogen", riesige Luecke zwischen Titel und Text. Abstaende kommen ausschliesslich
   aus row-gap/padding-block, darum hier scoped nullen.

   Spacing nach unten: app.css hat kein globales section{padding-block:var(--sec)}; jede Sektion
   bringt es selbst mit. #leistungen fehlte das -> Bild stiess direkt an die folgende dunkle
   Sektion. NUR padding-bottom (kein top), damit body.home section + section{padding-top:0}
   die Kollaps-Regel oben nicht bricht - gleiches Muster wie .stmt-sec / .srv-sec. */
#leistungen{padding-bottom:var(--sec)}
#leistungen h2,#leistungen h3,#leistungen p{margin:0}
.srv-layout{display:grid;grid-template-columns:minmax(0,5.7fr) minmax(0,6.3fr);gap:clamp(2rem,5vw,5.5rem);align-items:stretch}
.srv-media{overflow:hidden}
.srv-media figure,.srv-media picture{display:contents}
.srv-media img{width:100%;height:100%;min-height:clamp(440px,62vh,700px);object-fit:cover;filter:contrast(1.02)}
.srv-col{display:flex;flex-direction:column;justify-content:center}
.srv{display:grid;grid-template-columns:1fr auto;column-gap:1.4rem;row-gap:.45rem;align-items:baseline;padding-block:clamp(1.15rem,2vw,1.7rem)}
.srv h3{grid-column:1;font-size:clamp(1.7rem,3vw,2.6rem);font-weight:500;letter-spacing:-.03em}
.srv p{grid-column:1;color:var(--ink-soft);font-size:.97rem;line-height:1.5;max-width:44ch}
.srv .ar{grid-column:2;grid-row:1 / span 2;align-self:center;justify-self:end;font-size:1.3rem;color:var(--ink);opacity:0;transform:translateX(-6px);transition:.45s var(--ease)}
.srv:hover .ar{opacity:1;transform:none}

/* Haeufige Fragen (FAQ-Accordion). Regeln 1:1 aus visura.css (.faq). Kollaps-Modell
   wie im Original (section{padding-block} + inline padding-top:0): nur padding-bottom,
   den oberen Abstand liefert der Vorgaenger. padding-block verdoppelte die Luecke
   (Trust->FAQ = 2x --sec).
   Hoehen-Animation (.faq .a) + Plus/Kreuz-Marker werden per app.js (.is-open) gesteuert. */
.faq-sec{padding-bottom:var(--sec)}
.faq details{padding:clamp(1.3rem,2vw,1.7rem) clamp(.4rem,1vw,1rem)}
.faq details + details{margin-top:.4rem}
.faq summary{display:flex;justify-content:space-between;gap:20px;align-items:center;cursor:pointer;list-style:none;
  font-size:clamp(1.1rem,1.6vw,1.35rem);font-weight:500}
.faq summary::-webkit-details-marker{display:none}
/* Marker bewusst groesser als die Referenz-Basis (1.4rem): Kundenwunsch, +/x praesenter.
   line-height:1 haelt die summary-Flexzeile ruhig. visura.css wurde mitgezogen (sync). */
.faq summary::after{content:"+";font-weight:400;font-size:1.75rem;line-height:1;color:var(--ink-faint);transition:transform .3s}
.faq details.is-open summary::after{transform:rotate(45deg)}
.faq .a{color:var(--ink-soft);line-height:1.6;max-width:64ch;margin-top:1rem;overflow:hidden;transition:height .4s var(--ease),margin-top .4s var(--ease)}

/* === rsce_richtwert === */
/* Richtwert-Rechner: grauer Panel (.rw-panel) mit Formular links und weisser
   Ergebnis-Karte rechts. Tokens (--paper*, --ink*, --on-ink, --ease) aus dem
   Foundation-Block; .head/.wrap global. Die Live-Berechnung macht app.js
   (initRichtwert), CSS ist rein praesentational. */
.richtwert{padding-block:clamp(2.5rem,5vw,4rem)}
.rw-panel{display:grid;grid-template-columns:1.08fr .92fr;gap:clamp(2rem,4vw,4.25rem);align-items:stretch;background:var(--paper-2);padding:clamp(1.75rem,3.4vw,2.85rem)}

/* Formularspalte */
.rw-form{display:flex;flex-direction:column;min-width:0}
.rw-grid{display:grid;grid-template-columns:1fr 1fr;column-gap:clamp(1.25rem,2vw,1.75rem);row-gap:clamp(1.2rem,2.2vw,1.55rem)}
.rw-field{min-width:0;display:flex;flex-direction:column}
.rw-field label{font-size:.82rem;font-weight:500;color:var(--ink-soft);letter-spacing:.01em;margin-bottom:.55rem}
.rw-sel{position:relative}
.rw-field select,.rw-field input{width:100%;font-family:inherit;font-size:1rem;color:var(--ink);background:var(--paper);border:1px solid var(--paper-3);border-radius:0;padding:.95em 1.05em;transition:background .25s,border-color .25s}
.rw-field select{appearance:none;-webkit-appearance:none;-moz-appearance:none;padding-right:2.6em;cursor:pointer;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%237a7975' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");
  background-repeat:no-repeat;background-position:right 1.05em center}
.rw-field select:hover,.rw-field input:hover{border-color:var(--ink-faint)}
.rw-field select:focus,.rw-field input:focus{outline:2px solid var(--ink);outline-offset:2px;border-color:var(--ink)}

.rw-btn{align-self:flex-start;margin-top:clamp(1.75rem,3vw,2.4rem);display:inline-flex;align-items:center;font-family:inherit;font-size:.95rem;font-weight:500;letter-spacing:.01em;color:var(--on-ink);background:var(--ink);border:none;border-radius:0;padding:1.15em 2em;cursor:pointer;transition:background .3s var(--ease)}
.rw-btn:hover{background:oklch(0.26 0.006 75)}

/* Ergebnis-Karte */
.rw-result{display:flex;flex-direction:column;min-width:0;background:var(--paper);border:1px solid var(--paper-3);padding:clamp(1.75rem,3vw,2.6rem)}
.rw-rlabel{font-size:.9rem;font-weight:500;color:var(--ink-soft);letter-spacing:.01em}
.rw-value{font-size:clamp(2.3rem,4.3vw,3.5rem);font-weight:500;line-height:1.06;letter-spacing:-.03em;color:var(--ink);margin:.85rem 0 0;font-variant-numeric:tabular-nums}
.rw-unit{font-size:.95rem;color:var(--ink-soft);margin:1rem 0 0;font-variant-numeric:tabular-nums}
.rw-note{font-size:.875rem;color:var(--ink-soft);line-height:1.55;margin:clamp(1.4rem,2.5vw,2rem) 0 0;max-width:40ch}
.rw-cta{display:inline-flex;align-items:center;align-self:flex-start;gap:.55em;font-size:.95rem;font-weight:600;color:var(--ink);letter-spacing:.005em;margin-top:clamp(1.6rem,2.5vw,2.1rem)}
.rw-cta .ar{transition:transform .35s var(--ease)}
.rw-cta:hover .ar{transform:translateX(.22em)}

@media(max-width:860px){.rw-panel{grid-template-columns:1fr;gap:clamp(1.75rem,4vw,2.4rem)}}
@media(max-width:520px){.rw-grid{grid-template-columns:1fr}.rw-btn{align-self:stretch;justify-content:center}}
/* === /rsce_richtwert === */

/* === rsce_rechtstext === */
/* Reines Textelement fuer lange Rechtstexte (Impressum, Datenschutz, AGB).
   Begrenzte Lesebreite, gedaempfter Fliesstext (--ink-soft), dunkle Ueberschriften
   (--ink). Der Inhalt kommt als tinyMCE-HTML, darum traegt .rt-body die komplette
   Prosa-Typografie. WICHTIG: app.css hat keinen globalen *{margin:0}-Reset (vgl.
   rsce_marg), darum alle Block-Margins (p, h2-h4, ul/ol, li) explizit setzen -
   sonst blaehen UA-Default-Margins den Text auf. Section-Spacing/.wrap/.rv aus dem
   Foundation-Block. :where() haelt die Spezifitaet niedrig, damit Overrides leicht
   bleiben. Oben nur ein kleiner Abstand (der Hero darueber liefert den Hauptabstand),
   unten der volle --sec vor dem Footer - sonst klafft eine grosse Luecke unterm Titel. */
.rechtstext-sec{padding-top:clamp(1.25rem,3vw,2.5rem);padding-bottom:var(--sec)}
.rechtstext{max-width:74ch}

.rt-title{font-size:clamp(2.1rem,5vw,3.4rem);color:var(--ink);margin:0 0 clamp(1.6rem,3vw,2.6rem)}

.rt-body{color:var(--ink-soft);line-height:1.7;font-size:clamp(1rem,1.15vw,1.0625rem)}
.rt-body :where(h2,h3,h4){color:var(--ink);font-weight:500;letter-spacing:-.02em;line-height:1.2}
.rt-body h2{font-size:clamp(1.4rem,2.6vw,1.9rem);margin:clamp(2rem,4vw,3rem) 0 .7em}
.rt-body h3{font-size:clamp(1.15rem,2vw,1.4rem);margin:clamp(1.6rem,3vw,2.2rem) 0 .5em}
.rt-body h4{font-size:1.05rem;margin:1.5rem 0 .4em}
.rt-body :where(h2,h3,h4):first-child{margin-top:0}
.rt-body p{margin:0 0 1em}
.rt-body ul,.rt-body ol{margin:0 0 1em;padding-left:1.4em}
.rt-body li{margin:.3em 0}
.rt-body li::marker{color:var(--ink-faint)}
.rt-body a{color:var(--ink);text-decoration:underline;text-underline-offset:.15em;text-decoration-thickness:.05em;transition:opacity .2s var(--ease)}
.rt-body a:hover{opacity:.6}
.rt-body strong,.rt-body b{color:var(--ink);font-weight:500}
.rt-body :last-child{margin-bottom:0}

.rt-stand{margin:clamp(2rem,4vw,3rem) 0 0;font-size:.85rem;color:var(--ink-faint)}
/* === /rsce_rechtstext === */

/* Hero-Ueberschrift: Vorlauf ("Sie verdienen das richtige") in einer Zeile, Rotor-Wort darunter.
   Vorlauf als eigene Block-Zeile; 20ch-Bremse aufgehoben, Schrift leicht angepasst, damit der
   Satz auf Desktop in eine Zeile passt (auf Mobil bricht er sauber um). */
.hero-head{max-width:1200px}
.hero-head h1{font-size:clamp(2.5rem,6vw,5rem);max-width:none}
.hero-head h1 .hero-lead{display:block}

/* Ueber uns (.about): grosse Aussage links, Bild rechts. 1:1 aus visura.css.
   Basis fehlte (nur @860-Override war portiert). contao_figure-Wrapper neutralisieren. */
/* Vertikalabstand oben UND unten. Unten (Ueber uns -> Kontakt) analog #lagen /
   #leistungen / .kontakt-sec. Oben: im Original liefert die Regel
   "body.home section.statement + section{padding-top:var(--sec)}" den Abstand nach
   der dunklen Statement-Sektion (#eigentuemer.statement). In Contao greift diese
   Nachbar-Regel nicht (RSCE-Sektionen sind keine direkten section+section-Geschwister),
   und .statement bringt selbst nur inneres padding-block, keinen Abstand danach.
   Darum hier explizit padding-top:var(--sec) - liefert die Luecke Statement -> Ueber uns
   1:1 wie in der Referenz, ohne sich zu verdoppeln (Statement hat kein padding-bottom:var(--sec)). */
#ueber-uns{padding-block:var(--sec)}
.about{display:grid;grid-template-columns:1fr 1fr;gap:clamp(2.5rem,5vw,5.5rem);align-items:center}
.about .txt p{font-size:clamp(1.3rem,1.9vw,1.75rem);font-weight:400;line-height:1.4;letter-spacing:-.015em;max-width:24ch}
.about .txt .sub{font-size:1.05rem;color:var(--ink-soft);line-height:1.55;max-width:42ch;margin-top:1.6rem}
.about .txt .lnk{margin-top:2.4rem}
.about .img{overflow:hidden}
.about .img figure{display:contents}
.about .img img{width:100%;height:clamp(380px,56vh,660px);object-fit:cover}

