/*
 Theme Name:   Hello Elementor Child – Mössinger
 Theme URI:    https://moessinger.grafikreich.ch
 Description:  Child-Theme für Hello Elementor mit CASAWP Template-Overrides
 Author:       Grafikreich
 Author URI:   https://grafikreich.ch
 Template:     hello-elementor
 Version:      1.0.1
 License:      GNU General Public License v2 or later
 Text Domain:  hello-elementor-child
*/

/* ==========================================================================
   INHALT
   1. Basis
   2. Design-Tokens          – einzige Stelle mit Elementor-Anbindung
   3. Objektkarte & Archiv   – .ma / .ma-grid / .ma-card
   4. Detailseite            – .mossinger-single
   ========================================================================== */


/* ==========================================================================
   1. BASIS
   ========================================================================== */

html {
    font-size: 16px !important;
}


/* ==========================================================================
   2. DESIGN-TOKENS
   --------------------------------------------------------------------------
   Einzige Stelle im Projekt, die --e-global-* referenziert. Alles andere
   spricht ausschliesslich --ma-*. Ändert Elementor je eine Variablen-ID,
   ist nur dieser Block betroffen.

   WICHTIG – Aufhänger ist `body`, nicht `:root`:
   Elementor deklariert seine Globals auf `body.elementor-kit-12`. CSS-
   Variablen vererben nur nach unten, `:root` (= <html>) ist der Elternknoten
   von <body> und sieht sie deshalb nicht. Auf :root deklariert, würde jeder
   Token still auf seinen Fallback zurückfallen und die Elementor-Anbindung
   wäre wirkungslos.

   Die Fallbacks entsprechen den am 10.08.2026 im Kit hinterlegten Werten.
   Sie greifen nur, wenn die Elementor-Variable fehlt – sind also produktive
   Werte, keine Platzhalter.
   ========================================================================== */

body {

    /* --- Farben -----------------------------------------------------------
       primary / secondary / text / accent sind Elementor-System-Globals mit
       festen Slugs. fb00089 und 0b6f23b sind projekteigene Globals: deren IDs
       werden von Elementor generiert und ändern sich, wenn die Farbe in den
       Site-Settings gelöscht und neu angelegt wird. Bei Farbabweichungen
       zuerst hier prüfen.                                                  */
    --ma-green:         var(--e-global-color-primary,   #27583C);
    --ma-secondary:     var(--e-global-color-secondary, #D8D2CB);
    --ma-black:         var(--e-global-color-text,      #111111);
    --ma-white:         var(--e-global-color-accent,    #FFFFFF);
    --ma-green-reduced: var(--e-global-color-fb00089,   #27583CAB);  /* Custom-Global */
    --ma-grey:          var(--e-global-color-0b6f23b,   #C7C7C7);    /* Custom-Global */

    /* Nicht aus Elementor – bewusst lokal definiert */
    --ma-green-dark:    #2a5621;

    /* --- Typografie ------------------------------------------------------
       Elementor gibt pro Typografie-Global nur die Sub-Properties aus, die im
       Kit gesetzt sind. Fehlt eine, greift der Fallback.                   */
    --ma-font:     var(--e-global-typography-primary-font-family,   'Archivo'), sans-serif;
    --ma-fw-light: var(--e-global-typography-text-font-weight,       200);
    --ma-fw-bold:  var(--e-global-typography-primary-font-weight,    800);
    --ma-fw-black: var(--e-global-typography-secondary-font-weight,  900);
    --ma-tt:       var(--e-global-typography-primary-text-transform, uppercase);

    /* Rollen laut Kit-12:
         3a235ad   = h1
         primary   = h2
         secondary = h3
         text      = Fliesstext
       Die Namen folgen den Rollen, nicht mehr der Reihenfolge im Kit.

       --ma-h1 ist derzeit bewusst ungenutzt: der einzige echte h1 im Projekt
       ist der Titel der Objekt-Detailseite, und der laeuft absichtlich auf
       h2-Groesse, weil Objekttitel sehr lang werden. Der Token bleibt korrekt
       gemappt stehen, damit ein spaeterer echter h1 sofort richtig sitzt. */
    --ma-h1:       var(--e-global-typography-3a235ad-font-size,   6rem);
    --ma-h2:       var(--e-global-typography-primary-font-size,   3rem);
    --ma-h3:       var(--e-global-typography-secondary-font-size, 1.5rem);
    --ma-text:     var(--e-global-typography-text-font-size,      1.25rem);

    /* Das Kit fuehrt eine eigene Zeilenhoehe fuer den Fliesstext (1.5rem bei
       1.25rem Schrift, mobil 1.25em). Vorher stand hier fix 1.5 – deutlich
       luftiger als das Kit vorgibt. */
    --ma-lh-text:  var(--e-global-typography-text-line-height,    1.5rem);
    --ma-lh-h2:    var(--e-global-typography-primary-line-height, 1em);

    /* --- Layout ---------------------------------------------------------- */
    --ma-lh:    1.5;
    --ma-max-w: 1600px;
    --ma-pad-h: 50px;
    --ma-pad-v: 80px;

    /* --- Icons ------------------------------------------------------------
       Der Papierflieger sitzt auf zwei Submit-Buttons, die CASAMAIL bzw. das
       Fallback-Formular rendern - beide als background-image, weil ein
       <input type="submit"> weder Kindelemente noch Pseudoelemente aufnimmt.
       Als Token steht der Pfad einmal statt zweimal im Stylesheet.
       Die Fuellfarbe ist fest weiss: beide Buttons sind grün gefüllt. Das
       Suchprofil nutzt denselben Flieger, dort aber als Inline-SVG mit
       currentColor (custom-form-ma-suchprofil.phtml).
       Quelle: paper-plane-1.svg, Mediathek 2026/08.                        */
    /* Langer Pfeil (arrow-long-right.svg, Mediathek 2026/08) als
       Hintergrundbild, in beiden Zustandsfarben. Gebraucht fuer Submits, die
       CASAMAIL als <input type="submit"> rendert - die nehmen weder ein
       Kindelement noch ein Pseudoelement auf, ein Inline-SVG geht dort also
       nicht, und ein Hintergrundbild erbt keine Textfarbe.
       ACHTUNG: die Farbwerte stehen hier literal drin. Eine Data-URI kann
       keine CSS-Variable aufloesen, die Hex-Werte lassen sich also nicht an
       --ma-green / --ma-secondary haengen. Aendern sich Primaer- oder
       Sekundaerfarbe in den Elementor-Globals, muessen diese beiden Zeilen
       mitgezogen werden.
       Der Suchprofil-Button hat das Problem nicht: dort steht derselbe Pfad
       als Inline-SVG mit currentColor und faerbt von allein mit. */
    --ma-icon-arrow-secondary: url("data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%3E%3Cpath%20fill='%23D8D2CB'%20d='M17.5303%2017.5303C17.2374%2017.8232%2016.7626%2017.8232%2016.4697%2017.5303C16.1768%2017.2374%2016.1768%2016.7626%2016.4697%2016.4697L20.1893%2012.75L2%2012.75C1.58579%2012.75%201.25%2012.4142%201.25%2012C1.25%2011.5858%201.58579%2011.25%202%2011.25L20.1894%2011.25L16.4697%207.53033C16.1768%207.23744%2016.1768%206.76256%2016.4697%206.46967C16.7626%206.17678%2017.2374%206.17678%2017.5303%206.46967L21.4697%2010.409C22.3483%2011.2877%2022.3483%2012.7123%2021.4697%2013.591L17.5303%2017.5303Z'/%3E%3C/svg%3E");
    --ma-icon-arrow-primary:   url("data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%3E%3Cpath%20fill='%2327583C'%20d='M17.5303%2017.5303C17.2374%2017.8232%2016.7626%2017.8232%2016.4697%2017.5303C16.1768%2017.2374%2016.1768%2016.7626%2016.4697%2016.4697L20.1893%2012.75L2%2012.75C1.58579%2012.75%201.25%2012.4142%201.25%2012C1.25%2011.5858%201.58579%2011.25%202%2011.25L20.1894%2011.25L16.4697%207.53033C16.1768%207.23744%2016.1768%206.76256%2016.4697%206.46967C16.7626%206.17678%2017.2374%206.17678%2017.5303%206.46967L21.4697%2010.409C22.3483%2011.2877%2022.3483%2012.7123%2021.4697%2013.591L17.5303%2017.5303Z'/%3E%3C/svg%3E");

    /* --- Kompatibilitäts-Aliase ------------------------------------------
       Die Detailseite (.mossinger-single, Abschnitt 4) ist durchgängig gegen
       --ms-* geschrieben. Statt ~780 Zeilen mechanisch umzubenennen – wobei
       --ms-h1/--ms-h2 auf denselben Token zeigen und beim Umbenennen leicht
       auseinanderlaufen – zeigen die Aliase auf die kanonischen Tokens.
       Es gibt weiterhin genau eine Quelle pro Wert.
       Media-Query-Overrides wie `.mossinger-single{--ms-pad-h:20px}` bleiben
       davon unberührt und funktionieren wie bisher.                        */
    --ms-green:         var(--ma-green);
    --ms-green-dark:    var(--ma-green-dark);
    --ms-white:         var(--ma-white);
    --ms-black:         var(--ma-black);
    --ms-grey:          var(--ma-grey);
    --ms-font:          var(--ma-font);
    --ms-fw-light:      var(--ma-fw-light);
    --ms-fw-bold:       var(--ma-fw-bold);
    --ms-fw-black:      var(--ma-fw-black);
    --ms-tt:            var(--ma-tt);
    --ms-h2:            var(--ma-h2);
    --ms-body:          var(--ma-text);
    --ms-secondary:     var(--ma-secondary);
    --ms-max-width:     var(--ma-max-w);
    /* Seitenabstand der Detailseite: 100px, mobil 25px. Bewusst eigener
       Wert statt --ma-pad-h (50px) - das Archiv behaelt seinen Rhythmus. */
    --ms-pad-h:         100px;
    --ms-pad-v:         var(--ma-pad-v);
}


/* ==========================================================================
   3. OBJEKTKARTE & ARCHIV
   --------------------------------------------------------------------------
   Gilt für alle drei Ausspielungen der Objektkarte:
     – Archivseite            (casawp-archive.php + single-archive.phtml)
     – [ma_neueste]           (functions.php)
     – [ma_referenzen]        (functions.php)
   Alle drei liefern denselben Wrapper .ma > .ma-grid > .ma-card.
   ========================================================================== */

.ma {
    font-family: var(--ma-font);
    font-weight: var(--ma-fw-light);
    color: var(--ma-black);
    width: 100%;

    /* Sicherheitsnetz gegen horizontales Scrollen durch überlange Inhalte.
       Bewusst `clip` und nicht `hidden`: hidden macht das Element zum Scroll-
       Container, wodurch overflow-y implizit auf auto springt – das bricht
       position:sticky in Nachfahren und kann ungewollte Scrollbereiche
       erzeugen. clip schneidet nur ab, ohne Scroll-Container.
       Auf `body` hätte es gar nicht gewirkt: overflow von body propagiert auf
       den Viewport, das Element selbst clippt dann nicht (live gemessen). */
    overflow-x: clip;
}
.ma *,.ma *::before,.ma *::after{box-sizing:border-box;margin:0;padding:0}
.ma-inner{width:100%;max-width:var(--ma-max-w);margin:0 auto;padding-left:var(--ma-pad-h);padding-right:var(--ma-pad-h)}
.ma-filters{background:var(--ma-green);width:100%;border-radius:0}
.ma-filters-grid{display:grid;grid-template-columns:1fr 1fr 1fr;gap:2px;background:var(--ma-white);width:100%}
.ma-filters-grid select,.ma-filter-slot select,.ma-filter-slot .form-control{width:100%!important;background:var(--ma-secondary)!important;border:none!important;border-radius:0!important;color:var(--ma-green)!important;font-family:var(--ma-font)!important;font-weight:var(--ma-fw-light)!important;font-size:var(--ma-text)!important;letter-spacing:.02em!important;text-transform:var(--ma-tt)!important;padding:1.125rem 2.75rem 1.125rem 1.375rem!important;cursor:pointer!important;appearance:none!important;-webkit-appearance:none!important;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' stroke='white' stroke-width='1.5' fill='none'/%3E%3C/svg%3E")!important;background-repeat:no-repeat!important;background-position:right 1.25rem center!important;outline:none!important;box-shadow:none!important;min-height:3rem!important;height:100%!important;transition:background-color .15s!important;line-height:2.1875rem!important}
.ma-filters-grid select:hover,.ma-filter-slot select:hover,.ma-filter-slot .form-control:hover{background-color:var(--ma-green)!important;color:var(--ma-white) !important}
.ma-filters-grid select option,.ma-filter-slot select option{background:var(--ma-green)!important;color:var(--ma-white)!important;text-transform:none!important;font-size:var(--ma-text)!important;font-weight:300!important;letter-spacing:0!important}

/* ── Custom-Dropdown ───────────────────────────────────────────────────────
   Die native Optionsliste eines <select> rendert das Betriebssystem, nicht
   die Seite: Hintergrund, Hoverfarbe und Schrift bleiben dort Systemsache
   (auf macOS grau-transluzent, unter Windows wieder anders). Die Regel
   `select option{...}` weiter oben greift deshalb nur teilweise.
   Loesung: das <select> bleibt im DOM - CasaWP haengt seinen AJAX-Filter an
   dessen change-Event und $form.serialize() liest den Wert daraus -, wird
   aber unsichtbar gestellt. Sichtbar ist .ma-select mit eigenem Trigger und
   eigener Liste. Aufgebaut von maBuildSelects() in casawp-archive.php.
   Ohne JS bleibt das native Feld stehen und funktioniert wie bisher. */
.ma-filters{position:relative;z-index:5}
.ma-filter-slot{position:relative;height:100%}
.ma-select{position:relative;width:100%;height:100%}

/* Das Original liegt deckungsgleich unter dem Trigger, aber unsichtbar und
   ohne Mausziel. `display:none` waere einfacher, wuerde aber mit der Regel
   `.ma-filter-slot select[style*="display: none"]{display:block!important}`
   kollidieren, die das Availability-Feld wieder hervorholt. */
.ma-select>select{position:absolute!important;left:0;top:0;width:100%!important;height:100%!important;min-height:0!important;opacity:0!important;pointer-events:none!important;z-index:-1}

.ma .ma-select-trigger{display:flex;align-items:center;justify-content:space-between;gap:1rem;width:100%;min-height:3rem;height:100%;background:var(--ma-secondary);color:var(--ma-green);border:none;border-radius:0;outline:none;box-shadow:none;font-family:var(--ma-font);font-weight:var(--ma-fw-light);font-size:var(--ma-text);letter-spacing:.02em;text-transform:var(--ma-tt);line-height:1.4;text-align:left;padding:1.125rem 1.375rem;cursor:pointer;transition:background-color .15s,color .15s}
.ma .ma-select-trigger:hover,
.ma .ma-select-trigger:focus-visible,
.ma .ma-select.is-open .ma-select-trigger{background:var(--ma-green);color:var(--ma-white)}
.ma-select-value{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ma-select-caret{flex:0 0 auto;width:0.75rem;height:0.5rem;transition:transform .15s}
.ma-select.is-open .ma-select-caret{transform:rotate(180deg)}

/* Die Liste haengt am Feld, nicht am Raster: sie darf ueber die Karte und
   ueber die Nachbarspalten hinauslaufen. */
/* Die Liste laeuft in voller Hoehe aus - kein eigener Scrollbereich, sonst
   sind die letzten Eintraege angeschnitten und man scrollt in einem Feld,
   das aussieht wie ein Menue. Nur auf sehr flachen Fenstern greift weiter
   unten eine Notbremse, damit die Liste erreichbar bleibt. */
.ma-select-list{display:none;position:absolute;z-index:60;top:100%;left:0;right:0;margin:0;padding:0;list-style:none;background:var(--ma-white);box-shadow:0 12px 32px rgba(0,0,0,.16)}
.ma-select.is-open .ma-select-list{display:block}
.ma .ma-select-option{display:block;margin:0;padding:0.75rem 1.375rem;font-family:var(--ma-font);font-weight:var(--ma-fw-light);font-size:calc(var(--ma-text) * 0.9);letter-spacing:.02em;text-transform:var(--ma-tt);color:var(--ma-green);line-height:1.4;cursor:pointer;transition:background-color .12s,color .12s}
.ma .ma-select-option:hover,
.ma .ma-select-option.is-active{background:var(--ma-secondary);color:var(--ma-green)}
.ma .ma-select-option.is-selected{background:var(--ma-green);color:var(--ma-white)}
/* Der Platzhalter ("Kategorie waehlen") ist eine Ruecksetz-Zeile, keine
   gleichwertige Auswahl - deshalb abgesetzt und leiser. Er erscheint nur,
   wenn tatsaechlich etwas zurueckzusetzen ist; solange nichts gewaehlt ist,
   laesst maBuildSelects() ihn weg (er stand sonst als gruener Balken ueber
   der Liste und wiederholte nur, was der Trigger schon anzeigt). */
.ma .ma-select-option.is-placeholder{color:var(--ma-green-reduced);border-bottom:1px solid color-mix(in srgb, var(--ma-secondary) 60%, transparent)}

/* Reicht der Platz unter dem Feld nicht, klappt die Liste nach oben auf.
   Ohne das waere sie am unteren Bildrand angeschnitten - sie hat ja bewusst
   keinen eigenen Scrollbereich. Gesetzt wird .is-up von maBuildSelects()
   beim Oeffnen, gemessen an der tatsaechlichen Listenhoehe.
   Auf Mobil ist das der Regelfall: die drei Felder stehen gestapelt und die
   Listen werden 300px und hoeher (live gemessen: Orte 329px). */
.ma-select.is-up .ma-select-list{top:auto;bottom:100%;box-shadow:0 -12px 32px rgba(0,0,0,.16)}

/* Notbremse fuer flache Fenster: lieber scrollen als eine Liste, an deren
   Ende man nicht herankommt - dort reicht auch nach oben der Platz nicht. */
@media (max-height:640px){
  .ma-select-list{max-height:70vh;overflow-y:auto;overscroll-behavior:contain}
}
.ma-filter-slot,.ma-filter-slot .casawp-filter,.ma-filter-slot .form-group,.ma-filter-slot label{margin:0!important;padding:0!important;display:block!important}
.ma-filter-slot .form-group>label,.ma-filter-slot .control-label{display:none!important}
select[name="availabilities[]"]{display:none!important;height:0!important;width:0!important;overflow:hidden!important;position:absolute!important}
.casawp-filterform{display:contents!important}
.casawp-filterform>.form-group{display:none}
.ma-filters-grid .chosen-container,.ma-filter-slot .chosen-container{display:none!important}
.ma-filter-slot select[style*="display: none"]{display:block!important}
.ma-search-btn{display:none!important;background:var(--ma-white);color:var(--ma-green);border:none;font-family:var(--ma-font);font-weight:var(--ma-fw-light);font-size:var(--ma-text);letter-spacing:.02em;text-transform:var(--ma-tt);padding:1.125rem 2.5rem;cursor:pointer;display:flex;align-items:center;gap:0.625rem;white-space:nowrap;min-height:3rem;transition:background .15s;line-height:2.1875rem}
.ma-search-btn:hover{background:var(--ma-grey)}.ma-search-btn svg{width:1.125rem;height:1.125rem;flex-shrink:0}


/* margin-top haelt den Abstand zum Hero. Die Karte selbst ist entsaettigt -
   das passiert in der Google-Maps-Konfiguration (styles: saturation -100) in
   casawp-archive.php und nicht per CSS-filter: ein filter auf dem Container
   wuerde die gruenen Marker gleich mit entfaerben. */
.ma-map {width:100%;height:23.75rem;overflow:hidden;background:#e9e9e9;position:relative;margin-top:clamp(2rem,4vw,4rem)}
.ma-map>*,.ma-map .casawp-map,.ma-map #casawp-map,.ma-map iframe,.ma-map>div{width:100%!important;height:100%!important;display:block!important}

.ma-grid-wrap{padding:64px 0}

/* --------------------------------------------------------------------------
   Grid: 70/30 – beide Spalten tragen mehrere Objekte
   --------------------------------------------------------------------------
   Die Spalten sind echte Container (.ma-grid-col), keine reine CSS-Zuweisung
   auf flachem Markup. Das ist notwendig, nicht bequem: CSS-Grid teilt sich
   Zeilen ueber alle Spalten. Wuerde man die Karten flach lassen und nur per
   nth-child auf Spalte 1 bzw. 2 verteilen, zoege jede Zeile die schmale
   rechte Karte auf die Hoehe der breiten linken – unter jeder rechten Karte
   staende rund ein Drittel ihrer Hoehe als Luecke. Die beiden Spalten
   muessen unabhaengig voneinander stapeln, und genau das leisten nur
   getrennte Container.

   Auf der Archivseite ist .ma-grid gleichzeitig .casawp-ajax-archive-list –
   CasaWP ersetzt den Inhalt bei jeder Filteraenderung durch eine flache
   Kartenliste und wirft die Spalten dabei weg. maRewrapGrid() in
   casawp-archive.php baut sie nach jedem AJAX-Durchlauf wieder auf.

   Aufteilung (ma_grid_main_count() in functions.php): die erste Haelfte
   links, der Rest rechts – bewusst nicht abwechselnd. So bleibt die
   DOM-Reihenfolge die Objektreihenfolge, und im Mobil genuegt
   `display:contents` auf den Spalten, um sauber 1,2,3,4… zu stapeln.
   -------------------------------------------------------------------------- */
.ma-grid{display:grid;grid-template-columns:minmax(0,60fr) minmax(0,40fr);column-gap:48px;row-gap:0;align-items:start}

/* "Mehr anzeigen"
   --------------------------------------------------------------------------
   Nachladbare Listen ([ma_referenzen], siehe functions.php) rendern alle
   Karten und blenden die noch nicht freigegebenen aus. display:none nimmt sie
   aus dem Raster, sonst rissen sie Luecken auf; sie haengen flach hinter den
   Spalten und werden vom Skript beim Einblenden einsortiert.
   Drei Klassen im Selektor, weil `.ma-card{display:flex}` weiter unten sonst
   ueber die Reihenfolge gewaenne.
   Die Schaltflaeche liegt ausserhalb von .ma-grid, sie waere dort selbst eine
   Rasterzelle. Optik wie der Karten-Button; das .ma-Praefix ist noetig, weil
   hello-elementor/reset.css `button` mit Kontur und rosa Text stylt. */
.ma-grid .ma-card.ma-card--verborgen{display:none}
.ma-more-wrap{display:flex;justify-content:center;margin-top:2.5rem}
/* display:flex aus der Regel darueber wuerde das hidden-Attribut sonst
   uebersteuern - die Browser-Grundregel dafuer ist nur ein Elementselektor. */
.ma-more-wrap[hidden]{display:none}
.ma .ma-more{display:inline-flex;align-items:center;justify-content:center;background:var(--ma-secondary);color:var(--ma-green);border:none;border-radius:0;cursor:pointer;font-family:var(--ma-font);font-weight:var(--ma-fw-light);font-size:max(0.75rem,calc(var(--ma-text) * 0.7));letter-spacing:.09em;text-transform:var(--ma-tt);padding:16px 40px;transition:background .15s,color .15s}
.ma .ma-more:hover,
.ma .ma-more:focus-visible{background:var(--ma-green);color:var(--ma-white)}
.ma .ma-more[hidden]{display:none}
.ma-grid-col{display:flex;flex-direction:column;gap:48px;min-width:0}

/* Nur eine Spalte im Markup (1 Objekt): ueber beide Spuren ziehen statt 30%
   leer stehen zu lassen. Bewusst an einer eigenen Klasse statt an
   :only-child – CasaWP schiebt per AJAX eine (ausgeblendete) .casawp-
   pagination in den Grid-Container, womit die Hauptspalte kein Einzelkind
   mehr waere und die Regel ausgerechnet im AJAX-Fall aussetzte. */
.ma-grid--onecol{grid-template-columns:1fr}
.ma-grid>.ma-no-results{grid-column:1/-1}

/* ── Card: Bild oben, Infos darunter ── */
.ma-card{display:flex;flex-direction:column;text-decoration:none!important;color:var(--ma-black);position:relative}
/* Referenzkarte: kein Link, kein Preis, keine Fakten - nur Bild, Ort und
   Titel. Der Aufbau ist derselbe wie bei der Angebotskarte, es fallen nur
   Teile weg (ma_render_card(), $opt in functions.php). Hier braucht es
   deshalb bloss zwei Korrekturen: der Titel ist kein <a> mehr und darf den
   Mauszeiger nicht als klickbar ausgeben, und ohne CTA-Button darunter
   schliesst die Karte direkt nach dem Titel ab. */
.ma-card--ohne-link{cursor:default}
.ma-card--ohne-link .ma-card-img{cursor:default}
.ma .ma-card--ohne-link .ma-card-title{margin-bottom:0}

/* --------------------------------------------------------------------------
   Härtung gegen Elementor
   --------------------------------------------------------------------------
   Steht die Karte in einer Elementor-Seite (Shortcode), greifen zusätzliche
   Plugin-Regeln, die es auf der reinen PHP-Archivseite nicht gibt:

     .elementor-kit-N a { color: … }   – globale Linkfarbe   (0,1,1)
     .elementor img     { height: auto }                     (0,1,1)

   Unsere Basisregeln haben nur 0,1,0 bzw. 0,1,1 und verlieren – bei
   Gleichstand entscheidet die Ladereihenfolge, und Elementors Dateien werden
   nach style.css eingebunden. Zusätzlich hängt diese Reihenfolge davon ab, ob
   WP Fastest Cache ein kombiniertes Bundle ausliefert (ausgeloggt) oder die
   Einzeldateien (eingeloggt) – die Darstellung war deshalb nicht stabil.

   Die folgenden Regeln liegen bei 0,2,x bzw. 0,3,0 und gewinnen in jedem Fall.
   -------------------------------------------------------------------------- */
.ma .ma-card{color:var(--ma-black)}
.ma .ma-card a{color:inherit}
.ma .ma-card .ma-card-info{color:var(--ma-black)}

/* Titelfarbe im Zeilen-Grid.
   Früher stand hier !important plus ein `*`-Selektor auf alle Nachfahren:
   die Text-Animation .cool-split zerlegte den Titel in einzelne Zeichen und
   schrieb in jedes ein Inline-`color`. Die Animation ist raus – nachgemessen:
   kein .cool-split im DOM, kein Inline-Style, keine Zeichen-Zerlegung.
   Die einzigen konkurrierenden Regeln sind `h3{color:inherit}` aus bs3.css
   und reset.css (0,0,1), dagegen genügt die Spezifität dieses Selektors
   (0,3,0) mit Abstand.
   Bewusst auf .ma-grid eingegrenzt: die Regel gilt fuer die Kartenliste,
   nicht fuer beliebige .ma-card ausserhalb davon. */
.ma .ma-grid .ma-card-title{color:var(--ma-green)}
.ma .ma-card .ma-card-address{color:var(--ma-green-reduced)}
.ma .ma-card .ma-card-price{color:var(--ma-green)}
.ma .ma-card .ma-card-fact-label{color:var(--ma-green-reduced)}
.ma .ma-card .ma-card-fact-value{color:var(--ma-black)}
.ma .ma-card .ma-card-cta{color:var(--ma-green)}
.ma .ma-card .ma-card-cta:hover{color:var(--ma-white)}

/* Bild füllt den Container vollständig – schlägt `.elementor img{height:auto}`.
   Kein aspect-ratio: die Höhe kommt vom gestreckten Flex-Item, das Seiten-
   verhältnis regelt object-fit. Sonst rechnet der Browser aus der Breite eine
   3:2-Höhe und lässt unten einen Streifen Container-Hintergrund stehen. */
.ma .ma-card-img a{display:block;width:100%;height:100%}
.ma .ma-card-img img{width:100%;height:100%;object-fit:cover;display:block;aspect-ratio:auto}

/* Das Seitenverhaeltnis sitzt am Container, nicht am <img> – so bleibt die
   Bildflaeche stabil, egal welches Format das hochgeladene Foto hat.
   Featured-Karte 4:3, die schmalen Karten der rechten Spalte quadratisch. */
.ma-card-img{position:relative;width:100%;aspect-ratio:4/3;overflow:hidden;background:var(--ma-grey)}
.ma-grid-col-side .ma-card-img{aspect-ratio:1/1}
.ma-card-img a{display:block;width:100%;height:100%}
.ma-card-img img{width:100%;height:100%;object-fit:cover;display:block;aspect-ratio:auto}
.ma-card-no-img{width:100%;height:100%;display:flex;align-items:center;justify-content:center;color:rgba(0,0,0,.25);font-size:0.875rem;letter-spacing:.1em;text-transform:var(--ma-tt)}

/* Alle Zustaende tragen dieselbe Optik: 2px weisse Kontur, 20% weisse
   Fuellung, weisse Schrift. Die Zustandsklassen bleiben als Haken im Markup
   erhalten, faerben aber nicht mehr – der Unterschied steckt jetzt allein im
   Text ("Reserviert", "Verkauft", "Referenz"). */
.ma-badge{position:absolute;top:14px;left:14px;z-index:3;font-family:var(--ma-font);font-weight:var(--ma-fw-light);font-size:max(0.625rem,calc(var(--ma-text) * 0.6));letter-spacing:.06em;text-transform:var(--ma-tt);color:var(--ma-white);background:color-mix(in srgb, var(--ma-white) 20%, transparent);border:2px solid var(--ma-white);padding:6px 14px;line-height:1.4}
.ma-badge-available{display:none!important}

.ma-card-info{background:transparent;padding:24px 0 0;flex:1;display:flex;flex-direction:column;min-width:0}

.ma-card-address{font-family:var(--ma-font);font-weight:var(--ma-fw-light);font-size:max(0.6875rem,calc(var(--ma-text) * 0.65));letter-spacing:.09em;text-transform:var(--ma-tt);color:var(--ma-green-reduced);margin-bottom:12px}

.ma-card-title-link{text-decoration:none!important}
/* Der Objekttitel ist ein <h3> und lief damit auf der Sekundaer-Typografie
   des Kits - so war es hier immer gemeint. Gerendert wurde er aber in der
   Primaer-Stufe (48px / 800 statt 24px / 900): das Elementor-Kit setzt
   `.elementor-kit-12 h3{font-size:var(--e-global-typography-primary-font-size)}`
   und liegt mit (0,1,1) ueber dem blossen `.ma-card-title` (0,1,0).
   Mit `.ma` davor (0,2,0) ist das entschieden. Die Karten stehen in jedem
   Fall in einem .ma-Wrapper - Archiv wie Shortcode-Raster.
   Gesteuert wird die Groesse weiterhin ueber --ma-h3, also ueber die
   Sekundaer-Typografie im Elementor-Kit. */
.ma .ma-card-title{font-family:var(--ma-font);font-weight:var(--ma-fw-black);font-size:var(--ma-h3);letter-spacing:.02em;text-transform:var(--ma-tt);color:var(--ma-green);line-height:1.25;margin-bottom:16px}
/* Alle Objekttitel tragen dieselbe Groesse, auch in der schmalen Spalte -
   die frueheren Sonderwerte fuer die rechte Spalte (x 0.72) und fuer Mobil
   sind bewusst entfallen.
   Gesteuert wird die Groesse ueber --ma-h3, also ueber H3 im Elementor-Kit
   (--e-global-typography-secondary-font-size); der Fallback hier ist 1.5rem.
   Aendert sich die Vorgabe, wird sie dort angepasst und nicht hier. */

.ma-card-divider{border:none;border-top:1px solid rgba(0,0,0,.15);margin:0}

/* Lange Komposita umbrechen.
   Objekttitel wie „…Baulandreserve und Architekturprojekt" sind ein einziges
   unbrechbares Wort. Bei `overflow-wrap: normal` (Default) ragt die Textzeile
   aus ihrer Box – auf 375px waren das 132px, die das ganze Dokument auf 472px
   aufgezogen und horizontales Scrollen erzeugt haben. Die Boxen selbst sind
   dabei korrekt breit, deshalb ist das mit blossem Messen der Elemente nicht
   zu sehen.
   `hyphens: auto` trennt sauber (html lang="de" ist gesetzt), break-word ist
   der Notnagel für Fälle ohne gültige Trennstelle. */
.ma-card-title,
.ma-card-address,
.ma-card-price,
.ma-card-fact-label,
.ma-card-fact-value{overflow-wrap:break-word;hyphens:auto}

.ma-card-price{font-family:var(--ma-font);font-weight:var(--ma-fw-light);font-size:calc(var(--ma-text) * 0.9);color:var(--ma-green);padding:0 0 20px}

/* Zwei Spalten, Label klein und versal ueber dem Wert, beides linksbuendig. */
.ma-card-facts{display:grid;grid-template-columns:1fr 1fr;column-gap:24px;row-gap:18px;padding:20px 0 0}
.ma-card-fact{display:flex;flex-direction:column;gap:4px;min-width:0}
.ma-card-fact-label{text-align:left;font-weight:var(--ma-fw-light);font-size:max(0.625rem,calc(var(--ma-text) * 0.55));letter-spacing:.09em;text-transform:var(--ma-tt);color:var(--ma-green-reduced);line-height:1.3}
.ma-card-fact-value{text-align:left;font-weight:var(--ma-fw-light);font-size:calc(var(--ma-text) * 0.8);color:var(--ma-black);line-height:1.3}

/* Button ueber die volle Kartenbreite, Flaeche in der Sekundaerfarbe, Text und
   Kontur in der Primaerfarbe. Laeuft im normalen Fluss – die fruehere absolute
   Positionierung (bottom:-25px) liess ihn unten aus der Karte ragen, wofuer
   .ma-grid-wrap eigens Bodenpadding vorhalten musste. */
.ma-card-cta{display:flex;align-items:center;justify-content:center;gap:12px;width:100%;margin-top:32px;background:var(--ma-secondary);color:var(--ma-green)!important;border:none;text-decoration:none!important;font-family:var(--ma-font);font-weight:var(--ma-fw-light);font-size:max(0.75rem,calc(var(--ma-text) * 0.7));letter-spacing:.09em;text-transform:var(--ma-tt);padding:16px 24px;transition:background .15s,color .15s}
.ma-card-cta:hover{background:var(--ma-green);color:var(--ma-white)!important}
/* 16px statt der frueheren 13px: der lange Pfeil liegt als schmales Band in
   der Mitte einer quadratischen viewBox und wirkt bei gleicher Kastengroesse
   deutlich kleiner als der fruehere schraege Pfeil. */
.ma-card-cta-arrow{width:16px;height:16px;flex-shrink:0}

.ma-no-results{text-align:center;padding:5rem 0;font-size:1.125rem;font-weight:var(--ma-fw-light);color:rgba(0,0,0,.4)}
.casawp-ajax-archive-list > .casawp-pagination,.ma-grid > .casawp-pagination{display:none!important}
/* Serverseitig stehen die ersten fuenf Karten in den beiden Spalten, der Rest
   liegt flach dahinter - der waere sonst bis zum ersten Lauf von raster()
   sichtbar. Die :has()-Bedingung sorgt dafuer, dass das nur greift, solange
   die Spalten stehen: nach einem Filterlauf schickt CasaWP eine flache Liste
   ohne Spalten, und die soll sichtbar bleiben, auch wenn das Skript
   ausfaellt. */
.casawp-ajax-archive-list:has(.ma-grid-col) > .ma-card{display:none}
/* Die Seitenzahlen sind aus dem Archiv verschwunden - portioniert wird ueber
   "Mehr anzeigen" (casawp-archive.php). CasaWP schiebt seine eigene
   Pagination trotzdem in die AJAX-Antwort, die Regel darueber blendet sie
   aus. Die Gestaltung bleibt fuer den Fall stehen, dass die Pagination an
   anderer Stelle wieder auftaucht. */
.casawp-pagination{all:unset}.casawp-pagination .pagination,.casawp-pagination ul,.casawp-pagination nav{all:unset;display:flex;justify-content:center;gap:2.5rem;margin-top:3.5rem;list-style:none}
.casawp-pagination a,.casawp-pagination span,.casawp-pagination li a,.casawp-pagination li span{font-family:var(--ma-font)!important;font-weight:var(--ma-fw-black)!important;font-size:calc(var(--ma-text) * 0.7)!important;letter-spacing:.1em!important;text-decoration:none!important;padding:0.75rem 1.125rem!important;color:var(--ma-black)!important;transition:background .2s,color .2s!important;display:inline-block!important;background:transparent!important;border-radius:0!important}
.casawp-pagination a:hover,.casawp-pagination .active a,.casawp-pagination .active span,.casawp-pagination .current{background:var(--ma-green)!important;border-color:var(--ma-green)!important;color:var(--ma-white)!important}

/* Aufbau wie auf der Kontaktseite: der Container traegt die Sekundaerfarbe
   auf 30% Deckkraft und laeuft ueber die volle Breite, darauf sitzt das
   Formular in vollem Sekundaer, dessen Felder sind weiss.
   Die Breitenbegrenzung sitzt innen (.ma-profile .ma-inner), sonst stuende
   die Flaeche als zentriertes Band mit hellen Raendern. */
.ma-profile{background:color-mix(in srgb, var(--ma-secondary) 30%, transparent);padding:var(--ma-pad-v) 0;max-width:none;margin:0;width:100%}
/* Aufbau wie auf der Kontaktseite: Text frei auf dem Seitenhintergrund,
   nur das Formular sitzt auf der beigen Flaeche. Der fruehere vollflaechig
   gruene Textblock entfaellt. */
.ma-profile-grid{display:grid;grid-template-columns:1fr 1fr;gap:48px;align-items:start}
.ma-profile-text{background:transparent;padding:0;display:flex;flex-direction:column;justify-content:flex-start}
/* Kleinzeile ueber dem Titel, Figur wie auf der Frontpage ("WARUM
   MOESSINGER"). Typo bewusst dieselbe wie bei den uebrigen Kleinlabels der
   Seite (Karten-Button, Faktenlabels): versal, gesperrt, leicht.
   Der Selektor nennt .ma-profile-text mit, sonst gewaenne die allgemeine
   Absatzregel weiter unten (0,1,1) beim Schriftgrad. */
.ma-profile-text .ma-profile-eyebrow{font-family:var(--ma-font);font-weight:var(--ma-fw-light);font-size:max(0.75rem,calc(var(--ma-text) * 0.7));letter-spacing:.09em;text-transform:var(--ma-tt);color:var(--ma-green);line-height:1.3;margin:0 0 10px}
.ma-profile-text h2{font-family:var(--ma-font);font-weight:var(--ma-fw-black);font-size:var(--ma-h2);line-height:var(--ma-lh-h2);text-transform:var(--ma-tt);letter-spacing:.02em;color:var(--ma-green);margin-bottom:20px}
/* Zweiteilige Ueberschrift – dieselbe Typo-Figur wie "HIER SIND
   *WIR ZUHAUSE.*" auf der Kontaktseite: erster Teil fett und aufrecht,
   zweiter leicht und kursiv.
   Die Gewichte kommen aus den Tokens, nicht als 800/200 hart im Code:
   --ma-fw-bold und --ma-fw-light loesen im Kit exakt zu diesen Werten auf
   (nachgemessen), bleiben so aber an die Elementor-Globals gebunden. */
.ma-profile-title-strong{font-weight:var(--ma-fw-bold);font-style:normal}
.ma-profile-title-light{font-weight:var(--ma-fw-light);font-style:italic}
.ma-profile-text p{font-size:var(--ma-text);font-weight:var(--ma-fw-light);color:var(--ma-green);line-height:var(--ma-lh-text)}
/* Formularflaeche in vollem Sekundaer – die 30% liegen eine Ebene hoeher
   auf .ma-profile, genau wie auf der Kontaktseite gemessen. */
/* Zehn Spalten statt zwei. minmax(0,1fr) und nicht 1fr: 1fr hat als
   Mindestbreite auto, also min-content - ein langes Wort im Label oder eine
   breite Auswahl zieht die Spur dann auf und die Anteile verschieben sich
   (live gemessen: PLZ und Ort kamen auf 200/196 statt 30/70). Mit der
   Untergrenze 0 darf die Spur schmaler werden als ihr Inhalt und die
   Aufteilung haelt.
   Die Felder sind ohnehin nicht alle halb breit -
   PLZ und Ort teilen sich 30/70 -, und mit zehn Spuren laesst sich jede
   gewuenschte Aufteilung als Vielfaches ausdruecken, ohne verschachtelte
   Raster.
   Die Zuordnung laeuft ueber :has() und den Feldnamen statt ueber
   Huellklassen im Template: die .form-group-Wrapper liefert die
   Plugin-Ansicht (renderContactFormElement), an die kommt das Template gar
   nicht heran. Kommt ein Feld dazu, ist es standardmaessig halb breit. */
.ma-profile-form{background:var(--ma-secondary);padding:48px;display:grid;grid-template-columns:repeat(10,minmax(0,1fr));gap:24px 20px;align-content:start}
.ma-profile-form > .form-group{grid-column:span 5}
.ma-profile-form .span2{grid-column:span 10}

/* PLZ schmal, Ort breit. */
.ma-profile-form > .form-group:has(input[name="postal_code"]){grid-column:span 3}
.ma-profile-form > .form-group:has(input[name="locality"]){grid-column:span 7}
/* height:auto ist Pflicht, kein Aufraeumen.
   CasaWP laedt seine eigene bs3.css mit `.form-control{height:34px}` und
   `.casawp-form-control{height:34px}` - ein Bootstrap-3-Erbe aus einer Zeit
   mit 14px-Schrift. Das Plugin haengt beide Klassen an jedes Feld
   (contact-form-element.phtml). Bei 20px Schrift braucht die Zeile mit
   Innenabstand aber 45px: Auswahlfelder schnitten den Text unten ab.
   Diese Regel liegt bei 0,1,1 und schlaegt die Klassenselektoren (0,1,0)
   unabhaengig von der Ladereihenfolge. */
.ma-profile-form input,.ma-profile-form select,.ma-profile-form textarea{width:100%;height:auto;background:var(--ma-white);border:none;border-radius:0;color:var(--ma-green);font-family:var(--ma-font);font-weight:var(--ma-fw-light);font-size:var(--ma-text);letter-spacing:normal;text-transform:none;padding:8px 16px;outline:none;appearance:none;-webkit-appearance:none;transition:background .2s}
.ma-profile-form select{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' stroke='%232a5621' stroke-width='1.5' fill='none'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 0.875rem center}
.ma-profile-form select option{background:var(--ma-white);color:var(--ma-green-dark);text-transform:none;font-size:1rem;font-weight:300;letter-spacing:0}
.ma-profile-form input::placeholder,.ma-profile-form textarea::placeholder{color:var(--ma-green-reduced)}
.ma-profile-form select{color:var(--ma-green)}
/* Fokus faerbt nicht mehr die Flaeche ein – auf Weiss waere das ein
   Rueckschritt in der Lesbarkeit. Stattdessen eine Innenkontur.
   Der Selektor braucht die Pseudoklasse, um die Haertungsregel weiter
   unten (`.ma .ma-profile-form input{box-shadow:none}`, 0,3,0) zu schlagen. */
.ma .ma-profile-form input:focus,
.ma .ma-profile-form select:focus,
.ma .ma-profile-form textarea:focus{background:var(--ma-white);box-shadow:inset 0 0 0 2px var(--ma-green-reduced)}
/* Textarea traegt live ein eigenes, engeres Padding als die Einzeiler. */
.ma-profile-form textarea{min-height:100px;resize:vertical;padding:5px 14px}

/* Kontur der Eingabefelder entfernen.
   hello-elementor/reset.css stylt input[type="text"], [type="email"] usw. mit
   `1px solid #666` und 3px Radius. Der Attribut-Selektor liegt bei 0,1,1 –
   exakt gleichauf mit `.ma-profile-form input`, und reset.css wird nach der
   Child-style.css geladen, gewinnt den Gleichstand also. Select und Textarea
   trifft das Reset nicht, die waren schon konturlos.
   Erhöht laufen nur die Eigenschaften, die das Reset anfasst – Layout und
   Typografie bleiben oben bei 0,1,1, damit spätere Overrides greifen. */
.ma .ma-profile-form input,
.ma .ma-profile-form select,
.ma .ma-profile-form textarea{border:none;border-radius:0;outline:none;box-shadow:none}

/* Beschriftungen sichtbar ueber dem Feld – fett, versal, gruen.
   Groesse und Abstand exakt wie auf der Kontaktseite gemessen: --ma-h3
   (1.5rem), letter-spacing normal, 10px Abstand nach unten. */
.ma-profile-form .control-label{display:block;font-family:var(--ma-font);font-weight:var(--ma-fw-black);font-size:var(--ma-h3);letter-spacing:normal;text-transform:uppercase;color:var(--ma-green);line-height:1.2;margin-bottom:10px}

/* --------------------------------------------------------------------------
   Anbindung an das CasaWP-Markup
   --------------------------------------------------------------------------
   Das Suchprofil wird seit der CASA-Anbindung von CasaWP gerendert
   ([casawp_contactform id="ma-suchprofil"]). Dessen Element-Ansicht liefert
   pro Feld:

     <div class="form-group is-required">
       <label class="control-label">…</label>
       <input class="form-control casawp-form-control">
       <span class="help-block">Fehler</span>
     </div>

   .form-group ist damit die Rasterzelle, nicht mehr ein blankes <div>.
   -------------------------------------------------------------------------- */
.ma-profile-formwrap{min-width:0}
.ma-profile-form .form-group{min-width:0}
.ma-profile-form .span2 .form-group{margin:0}

/* Spam-Falle des Plugins: muss im DOM bleiben und befuellbar sein, darf aber
   weder sichtbar sein noch eine Rasterzelle belegen. Kein display:none –
   manche Bots fuellen genau die Felder, die so ausgezeichnet sind, nicht aus,
   und dann greift die Falle nicht mehr. */
/* Bewusst px und nicht rem: das ist keine Gestaltungsgroesse, sondern eine
   Positionierung aus dem sichtbaren Bereich heraus. In rem haenge der Wert
   an der Schriftgroesse – aendert die sich, wandert das Feld unter Umstaenden
   zurueck ins Bild. */
.ma-profile-trap{position:absolute;left:-9999px;width:1px;height:1px;overflow:hidden}

/* Pflichtfeld-Markierung. Gilt fuer beide Formulare: das Objektformular auf
   der Detailseite liefert dasselbe Markup (.form-group.is-required >
   label.control-label), CasaWP setzt die Klasse dort aus dem serverseitigen
   InputFilter - die Sternchen stimmen also immer mit dem ueberein, was das
   Formular tatsaechlich verlangt, und muessen nicht von Hand gepflegt werden.
   Land traegt die Klasse ebenfalls, ist aber ausgeblendet und vorbelegt. */
.ma-profile-form .form-group.is-required>.control-label::after,
.ms-contact .form-group.is-required>.control-label::after{content:"*";margin-left:4px}

/* Feldfehler und Statusmeldungen */
.ma-profile-form .help-block,
.ma-profile-error{display:block;font-size:calc(var(--ma-text) * 0.8);font-weight:var(--ma-fw-light);color:#8b1a1a;margin-top:6px}
.ma-profile-form .form-group.has-error .form-control{box-shadow:inset 0 0 0 2px #8b1a1a}
/* Diagnoseblock der Sammelmeldung - nur fuer angemeldete Administratoren im
   Markup, siehe custom-form-ma-suchprofil.phtml. */
.ma-profile-debug{margin-top:10px;padding:12px 14px;background:var(--ma-white);color:#8b1a1a;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:0.75rem;line-height:1.4;white-space:pre-wrap;overflow-x:auto}
.ma-profile-success{font-family:var(--ma-font);font-weight:var(--ma-fw-light);font-size:var(--ma-text);color:var(--ma-green);line-height:1.5;margin:0}
.ma-profile-form--sent{background:var(--ma-secondary);padding:48px;display:block}

/* Einwilligung
   --------------------------------------------------------------------------
   Kaestchen links, Text rechts – als Raster, damit die zweite Zeile des
   Textes unter der ersten steht und nicht unter der Checkbox.
   Die Breitenregel der uebrigen Felder (`.ma-profile-form input{width:100%}`)
   wuerde das Kaestchen auf Feldbreite ziehen; die Ausnahme steht auf .ma
   (0,2,1), schlaegt damit auch die Haertungsregel gegen reset.css. */
.ma-profile-consent-label{display:grid;grid-template-columns:auto 1fr;gap:12px;align-items:start;cursor:pointer;font-family:var(--ma-font);font-weight:var(--ma-fw-light);font-size:calc(var(--ma-text) * 0.85);line-height:1.45;color:var(--ma-green)}
.ma .ma-profile-consent input[type="checkbox"]{width:18px;height:18px;min-width:18px;margin:2px 0 0;padding:0;background:var(--ma-white);border:none;border-radius:0;box-shadow:none;appearance:none;-webkit-appearance:none;cursor:pointer}
/* Haken als Grafik statt als Innenkontur – ein gefuelltes Kaestchen allein
   liest sich auf den ersten Blick wie ein deaktiviertes Feld. Aufbau wie beim
   Pfeil der Auswahlfelder weiter oben. */
.ma .ma-profile-consent input[type="checkbox"]:checked{background-color:var(--ma-green);background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='10' viewBox='0 0 12 10'%3E%3Cpath d='M1 5l3.5 3.5L11 1.5' stroke='%23ffffff' stroke-width='2' fill='none' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:center;background-size:11px 9px}
/* Das Hidden-Feld gehoert zur Checkbox (Laminas schickt darueber den
   unchecked-Wert mit) und darf keine Rasterspalte belegen. */
.ma-profile-consent input[type="hidden"]{display:none}
.ma .ma-profile-consent input[type="checkbox"]:focus{box-shadow:inset 0 0 0 2px var(--ma-green-reduced)}
.ma .ma-profile-consent.has-error input[type="checkbox"]{box-shadow:inset 0 0 0 2px #8b1a1a}
/* Der Link zur Datenschutzerklaerung lief in der Sekundaerfarbe - also
   beige auf beigem Panel und damit unsichtbar. Quelle ist das Elementor-Kit:
   `.elementor-kit-12 a{color:var(--e-global-color-secondary)}` liegt bei
   0,1,1, genau wie das frühere `.ma-profile-consent a`, steht als Inline-
   Style aber spaeter im <head> und gewann den Gleichstand. Mit `.ma` davor
   (0,2,1) ist das entschieden.
   Ruhezustand ohne Unterstrich; Unterstrich erst beim Hover/Fokus, sonst
   waere der Link von der umgebenden Zeile nicht zu unterscheiden - die
   traegt dieselbe gruene Farbe.
   .ms-contact-form-wrapper steht mit drin: dort rendert CASAMAIL dasselbe
   Einwilligungsfeld, aktuell ohne Link, aber mit derselben Kit-Regel im
   Ruecken, falls einer dazukommt. */
.ma .ma-profile-consent a,
.mossinger-single .ms-contact-form-wrapper a{color:var(--ma-green);text-decoration:none}
.ma .ma-profile-consent a:hover,
.ma .ma-profile-consent a:focus-visible,
.mossinger-single .ms-contact-form-wrapper a:hover,
.mossinger-single .ms-contact-form-wrapper a:focus-visible{color:var(--ma-green-dark);text-decoration:underline;text-underline-offset:2px}
/* Submit-Button des Suchprofils
   --------------------------------------------------------------------------
   Die Selektoren tragen bewusst das .ma-Präfix. hello-elementor bringt in
   reset.css eigene Regeln für `button` und `[type="submit"]` mit (1px Kontur
   und Text in #CC3366) – `[type="submit"]` liegt mit 0,1,0 gleichauf mit
   `.ma-profile-submit`, und reset.css wird nach der Child-style.css geladen,
   gewinnt den Gleichstand also. Mit `.ma .ma-profile-submit` (0,2,0) bzw.
   `:hover` (0,2,1) ist das eindeutig entschieden.

   Flacher Button auf dem beigen Formular: grüner Text ohne Fläche, füllt sich
   beim Hover grün und dreht den Text auf Weiss. */
/* Layout und Typografie bleiben bei 0,1,0, damit die Mobile-Regel weiter
   greift (`.ma-profile-submit{grid-column:1/2}` im 768px-Block).
   Gefuellt gruen mit weisser Schrift und Papierflieger, linksbuendig – wie
   "NACHRICHT SENDEN" auf der Kontaktseite. Die angeschraegte clip-path-Form
   entfaellt hier, der Button ist ein Rechteck. */
.ma-profile-submit{grid-column:span 10;gap:12px;font-family:var(--ma-font);font-weight:var(--ma-fw-light);font-size:var(--ma-text);letter-spacing:.02em;text-transform:uppercase;padding:10px 20px;cursor:pointer;justify-self:start;transition:background .15s,color .15s}
.ma-profile-submit-icon{width:20px;height:20px;flex-shrink:0}

/* Nur die Eigenschaften, die reset.css überschreibt, laufen erhöht.
   `display` gehoert dazu: reset.css setzt `[type="submit"], button
   {display:inline-block}` (0,1,1) und schlaegt `.ma-profile-submit`
   (0,1,0). Ohne Flex-Container lief `align-items:center` ins Leere und
   das Pfeil-SVG stand als Inline-Element auf der Schriftlinie statt
   mittig - live gemessen 4.5px zu hoch. */
.ma .ma-profile-submit{display:inline-flex;align-items:center;background:var(--ma-green);color:var(--ma-secondary);border:none;border-radius:0;outline:none;box-shadow:none}
/* Beim Hover tauschen Flaeche und Schrift die Rollen: Sekundaerfarbe als
   Grund, Primaerfarbe als Schrift. Der Pfeil ist ein Inline-SVG mit
   currentColor und geht ohne Zutun mit. */
.ma .ma-profile-submit:hover,
.ma .ma-profile-submit:focus-visible{background:var(--ma-secondary);color:var(--ma-green)}
.ma .ma-profile-submit:disabled{opacity:.55;cursor:default;background:var(--ma-green);color:var(--ma-secondary)}

.ma-profile .ma-inner{max-width:var(--ma-max-w);margin:0 auto;padding-left:var(--ma-pad-h);padding-right:var(--ma-pad-h)}

@media(max-width:1024px){
  .ma{--ma-pad-h:2rem}
  .ma-filters-grid{grid-template-columns:1fr 1fr}
  .ma-map{height:18.75rem}
  .ma-profile-grid{gap:32px}
  .ma-profile-form{padding:32px}
  /* 60/40 bleibt, nur die Spalten ruecken zusammen. Schriftgroessen brauchen
     hier keine Sonderwerte: Karten haengen an --ma-text, die Titel an
     --ma-h3, die Ueberschrift an --ma-h2. Alle bringen ihre Stufen aus dem
     Elementor-Kit mit. */
  .ma-grid{column-gap:32px}
  .ma-grid-col{gap:32px}
}
@media(max-width:767px){
  .ma{--ma-pad-h:1rem}
  .ma-filters-grid{grid-template-columns:1fr}
  .ma-search-btn{width:100%;justify-content:center}
  .ma-map{height:15rem}
  .ma-grid-wrap{padding:2rem 0 3rem}

  /* Mobil eine Spalte. Die Zeilenplatzierung der Featured-Karte muss dabei
     explizit zurueckgesetzt werden – ohne `grid-row:auto` spannt sie weiter
     ueber 100 Zeilen und die uebrigen Karten landen unter ihr im Nichts.
     Hier greift wieder row-gap statt margin-top, weil es nur noch eine
     Spalte mit lauter belegten Zeilen gibt. */
  /* Eine Spalte. Die Spalten-Container loesen sich per display:contents auf,
     ihre Karten werden damit direkte Grid-Items und stapeln in DOM- und
     damit Objektreihenfolge. Der Abstand kommt jetzt vom row-gap des Grids,
     der gap der Container ist mit display:contents wirkungslos. */
  .ma-grid{grid-template-columns:1fr;column-gap:0;row-gap:40px}
  .ma-grid-col{display:contents}

  /* Auf Handybreite ist quadratisch zu hoch – alle Bilder auf 3:2. */
  .ma-grid .ma-card-img,
  .ma-grid-col-side .ma-card-img{aspect-ratio:3/2}

  .ma-card-info{padding:20px 0 0}
  .ma-card-facts{row-gap:14px;padding:16px 0 0}
  .ma-card-cta{margin-top:24px;padding:14px 20px}
  .ma-filters-grid select,.ma-filter-slot select,.ma-filter-slot .form-control{font-size:1rem!important;padding:0.875rem 2.25rem 0.875rem 1rem!important;min-height:2.5rem!important}
  .ma .ma-select-trigger{font-size:1rem;padding:0.875rem 1rem;min-height:2.5rem}
  .ma .ma-select-option{font-size:0.9375rem;padding:0.625rem 1rem}
  .ma-profile-grid{grid-template-columns:1fr;gap:32px}
  /* Kein Panel mehr, also auch kein Innenabstand – der Text sitzt frei. */
  .ma-profile-text{padding:0}
  /* Gestapelt: eine Spur, jedes Feld ueber die volle Breite. Die
     :has()-Regeln fuer PLZ und Ort muessen mit zurueckgesetzt werden, sonst
     verlangten sie 3 bzw. 7 Spuren in einem einspurigen Raster. */
  .ma-profile-form{grid-template-columns:1fr;padding:24px}
  .ma-profile-form > .form-group,
  .ma-profile-form > .form-group:has(input[name="postal_code"]),
  .ma-profile-form > .form-group:has(input[name="locality"]),
  .ma-profile-form .span2,
  .ma-profile-submit{grid-column:span 1}
}


/* ==========================================================================
   4. DETAILSEITE
   --------------------------------------------------------------------------
   Markup: single.phtml. Durchgängig gegen --ms-* geschrieben; diese sind in
   Abschnitt 2 als Aliase auf die kanonischen Tokens definiert.
   ========================================================================== */

.mossinger-single *,
.mossinger-single *::before,
.mossinger-single *::after {
    box-sizing: border-box;
    margin: 0;
    padding: 0;
}

.mossinger-single {
    font-family: var(--ms-font);
    font-weight: var(--ms-fw-light);
    font-size: var(--ms-body);
    color: var(--ms-black);
    width: 100%;
}

/* Inhalt = min(1600px, 100vw - 2x Seitenabstand).
   Der Deckel liegt auf max-width inklusive Padding, sonst schrumpfte der
   Inhalt auf 1600 minus Rand statt auf glatte 1600. */
.ms-container {
    width: 100%;
    max-width: calc(var(--ms-max-width) + var(--ms-pad-h) * 2);
    margin: 0 auto;
    padding: 0 var(--ms-pad-h);
}

/* ═══════════════════════
   HERO
═══════════════════════ */
/* Objekttitel unter dem Slider: Titelgroesse (h2 = primary) in der
   Primaerfarbe. Steht nicht mehr im Bild, also keine weisse Schrift und
   keine Abdunklung mehr noetig. */
.ms-objecttitle {
    padding: 48px 0 0;
}

/* Silbentrennung nach deutschen Regeln.
   Objekttitel wie "3,5-Zimmer Eigentumswohnung mit Garten" enthalten lange
   Komposita, die als ein unbrechbares Wort gelten - auf schmalen Displays
   ragten sie ueber den Rand hinaus.
   `hyphens: auto` trennt sauber, weil das Dokument lang="de" traegt; ohne
   diese Sprachangabe kennt der Browser keine Trennstellen. `overflow-wrap`
   ist der Notnagel fuer Woerter ohne gueltige Trennstelle.
   Die Objektkarten im Archiv arbeiten seit jeher so - der Detailseite fehlte
   es. */
.ms-object-title,
.ms-contact-title,
.ms-allgemeines p,
.ms-allgemeines li,
.ms-fact-label,
.ms-fact-value {
    -webkit-hyphens: auto;
    hyphens: auto;
    overflow-wrap: break-word;
}

/* Objekttitel auf der Primaer-Typografie (--ms-h2 zeigt auf
   --e-global-typography-primary-font-size, 3rem) - so stand es hier immer.
   Gerendert wurde er aber in der eigenen H1-Stufe des Kits: der Titel ist ein
   <h1>, und `.elementor-kit-12 h1{font-size:var(--e-global-typography-
   3a235ad-font-size)}` liegt mit (0,1,1) ueber dem blossen .ms-object-title
   (0,1,0) - live gemessen 59.2px statt 48px.
   Mit .mossinger-single davor (0,2,0) ist das entschieden. Dieselbe Stelle
   wie bei den Kartentiteln im Archiv, dort war es die h3-Regel des Kits.
   Das Schriftgewicht war nie betroffen, die Kit-Regel setzt fuer h1 keins. */
.mossinger-single .ms-object-title {
    font-family: var(--ms-font);
    font-weight: var(--ms-fw-bold);
    font-size: var(--ms-h2);
    line-height: var(--ma-lh-h2);
    letter-spacing: 0.02em;
    text-transform: var(--ms-tt);
    color: var(--ms-green);
    margin: 0;
}

/* ═══════════════════════
   ALLGEMEINES
═══════════════════════ */
/* Seitenabstand kommt vom .ms-container darin, nicht von der Sektion. */
.ms-allgemeines {
    padding: var(--ms-pad-v) 0;
}

/* Zwischen Faktenblock und Text standen zweimal --ms-pad-v, also 160px: das
   Bodenpadding des einen plus das Kopfpadding des anderen. Seit der
   Faktenblock keine eigene Flaeche mehr hat, liest sich das als eine Luecke -
   und die war zu gross.
   Nur die Kombination der beiden wird zusammengezogen, nicht .ms-allgemeines
   allgemein: hat ein Objekt keine Beschreibung, folgt auf die Fakten direkt
   die Karte, und dort sollen die 80px stehen bleiben. */
.ms-facts + .ms-allgemeines {
    padding-top: 0;
}

/* Kurzfassung und Volltext liegen beide im DOM, sichtbar ist immer genau
   eine. Die Klasse .ms-text--gekuerzt setzt ms-text.js beim Aufbau - ohne
   JavaScript existiert weder die Kurzfassung noch der Knopf, dann steht
   schlicht der ganze Text da. */
.ms-text-kurz { display: none; }
.ms-text--gekuerzt .ms-text-kurz { display: block; }
.ms-text--gekuerzt .ms-text-voll { display: none; }

/* Die Kurzfassung ist ein einzelnes <p> ohne die Absatzabstaende des
   Volltexts - sie soll sich vom gerenderten Inhalt nicht unterscheiden. */
.ms-text .ms-text-kurz {
    font-family: var(--ms-font);
    font-weight: var(--ms-fw-light);
    font-size: var(--ms-body);
    line-height: var(--ma-lh-text);
    color: var(--ms-black);
    margin: 0;
}

/* Textzeile statt Flaeche: der Block liegt frei auf dem Seitenhintergrund,
   ein gefuellter Knopf saesse dort zu schwer. Der Selektor nennt
   .mossinger-single mit, weil reset.css `[type="button"], button` bei
   (0,1,1) trifft und ein blosses .ms-text-more (0,1,0) verloere. */
.mossinger-single .ms-text-more {
    display: inline-block;
    margin-top: 1rem;
    padding: 0;
    background: none;
    border: none;
    border-radius: 0;
    outline: none;
    box-shadow: none;
    font-family: var(--ms-font);
    font-weight: var(--ms-fw-light);
    font-size: var(--ms-body);
    letter-spacing: 0.02em;
    text-transform: var(--ms-tt);
    color: var(--ms-green);
    text-decoration: underline;
    text-underline-offset: 4px;
    cursor: pointer;
    transition: color 0.15s;
}
.mossinger-single .ms-text-more:hover,
.mossinger-single .ms-text-more:focus-visible { color: var(--ms-green-dark); }

/* Ueberschriften im Beschreibungstext laufen auf Textgroesse, nur fett -
   sie sollen den Objekttitel darueber nicht konkurrenzieren. */
.ms-allgemeines h2,
.ms-allgemeines h3,
.ms-allgemeines h4 {
    font-family: var(--ms-font);
    font-weight: var(--ms-fw-bold);
    font-size: var(--ms-body);
    letter-spacing: 0.03em;
    text-transform: var(--ms-tt);
    line-height: var(--ma-lh-text);
    color: var(--ms-green);
    margin-bottom: 0;
}

.ms-allgemeines hr {
    border: none;
    margin: 24px 0 40px;
}

.ms-allgemeines p {
    font-size: var(--ms-body);
    font-weight: var(--ms-fw-light);
    line-height: 1.75;
    color: var(--ms-black);
    max-width: 100%;
    margin-bottom: 1.2em;
}

.ms-allgemeines p:last-child {
    margin-bottom: 0;
}

/* ═══════════════════════
   FACTS & FIGURES
═══════════════════════ */
/* Volle Flaeche in der Sekundaerfarbe, Schrift in der Primaerfarbe.
   Das fruehere Bild links ist entfallen, damit auch das 40%/1fr-Raster. */
/* Ohne eigene Flaeche: der Block steht frei auf dem Seitenhintergrund, wie
   der Textabschnitt darunter. Das Padding bleibt und haelt den Abstand zum
   Titel darueber und zum Text darunter. */
.ms-facts {
    display: block;
    padding: var(--ms-pad-v) 0;
}

/* Inhalt liegt im normalen Seitenraster - die Flaeche traegt .ms-facts. */
.ms-facts-content {
    width: 100%;
    max-width: calc(var(--ms-max-width) + var(--ms-pad-h) * 2);
    margin: 0 auto;
    padding: 0 var(--ms-pad-h);
    color: var(--ms-green);
}

/* Zweiteilige Titel: erster Teil fett, zweiter leicht (200) und kursiv -
   dieselbe Figur wie im Suchprofil der Archivseite
   (.ma-profile-title-strong / .ma-profile-title-light). */
.ms-title-strong { font-weight: var(--ms-fw-bold); font-style: normal; }
.ms-title-light  { font-weight: var(--ms-fw-light); font-style: italic; }

.ms-facts-datapoints {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 0 48px;
}

/* Die Ausstattung ist eine Aufzaehlung und keine einzelne Kennzahl - sie
   laeuft ueber alle Spalten, sonst quetscht sich eine lange Komma-Liste in
   ein Drittel der Breite. */
.ms-fact-row--breit { grid-column: 1 / -1; }

.ms-fact-row {
    display: flex;
    flex-direction: column;
    padding: 10px 0;
    border-bottom: 1px solid color-mix(in srgb, var(--ms-green) 25%, transparent);
}

.ms-fact-row:last-child {
    border-bottom: none;
}

.ms-fact-label {
    font-family: var(--ms-font);
    font-weight: var(--ms-fw-bold);
    font-size: var(--ms-body);
    letter-spacing: 0.1em;
    text-transform: var(--ms-tt);
    color: var(--ms-green);
    margin-bottom: 2px;
}

.ms-fact-value {
    font-family: var(--ms-font);
    font-weight: var(--ms-fw-light);
    font-size: var(--ms-body);
    color: var(--ms-green);
}

/* ═══════════════════════
   LIGHTBOX
   ───────────────────────
   Oeffnet per Klick auf ein Sliderbild. Bewusst ohne Thumbnail-Leiste:
   auf dem Handy frisst die Bildflaeche, die man eigentlich sehen will.
═══════════════════════ */
.ms-lightbox {
    position: fixed;
    inset: 0;
    z-index: 9999;
    display: none;
    align-items: center;
    justify-content: center;
    background: color-mix(in srgb, var(--ms-black) 94%, transparent);
    padding: 64px 88px;
}

.ms-lightbox.is-open {
    display: flex;
}

.ms-lightbox-stage {
    max-width: 100%;
    max-height: 100%;
    display: flex;
    align-items: center;
    justify-content: center;
}

.ms-lightbox-stage img {
    max-width: 100%;
    max-height: calc(100vh - 128px);
    width: auto;
    height: auto;
    object-fit: contain;
    display: block;
}

/* Nur das Icon: keine Flaeche, keine Kontur.
   Der Selektor traegt den Container mit (0,2,0). Eine einzelne Klasse
   verliert hier gegen hello-elementors reset.css, die nach dem
   Child-Stylesheet laedt und `button` eine 1px-Kontur in #CC3366 gibt -
   live nachgemessen, mit 0,2,0 reicht die Spezifitaet ohne !important. */
.ms-lightbox .ms-lightbox-close,
.ms-lightbox .ms-lightbox-arrow {
    position: absolute;
    background: none;
    border: 0;
    border-radius: 0;
    color: var(--ms-white);
    cursor: pointer;
    padding: 12px;
    display: flex;
    align-items: center;
    justify-content: center;
    transition: color 0.15s;
}

/* Schliessen ist weiterhin ein Strich-Icon, die Pfeile sind Flaechen-Icons
   - deshalb getrennte Regeln statt einer gemeinsamen. */
.ms-lightbox-close svg {
    width: 28px;
    height: 28px;
    stroke: currentColor;
    fill: none;
    stroke-width: 2;
    stroke-linecap: round;
}

.ms-lightbox-arrow svg {
    width: 34px;
    height: 34px;
    fill: currentColor;
    stroke: none;
}


.ms-lightbox-close { top: 16px; right: 20px; }
.ms-lightbox-prev  { left: 16px;  top: 50%; transform: translateY(-50%); }
.ms-lightbox-next  { right: 16px; top: 50%; transform: translateY(-50%); }

/* Hover und Tastaturfokus wechseln auf die Primaerfarbe - kein Rahmen,
   keine Flaeche. Der Fokus nutzt bewusst dieselbe Rueckmeldung wie der
   Hover: eine Kontur waere hier genau das, was gestalterisch weg soll. */
.ms-lightbox .ms-lightbox-close:hover,
.ms-lightbox .ms-lightbox-arrow:hover,
.ms-lightbox .ms-lightbox-close:focus-visible,
.ms-lightbox .ms-lightbox-arrow:focus-visible {
    color: var(--ms-green);
    outline: none;
}

.ms-lightbox-counter {
    position: absolute;
    bottom: 20px;
    left: 50%;
    transform: translateX(-50%);
    margin: 0;
    font-family: var(--ms-font);
    font-weight: var(--ms-fw-light);
    font-size: var(--ms-body);
    color: var(--ms-white);
    letter-spacing: 0.08em;
}

/* Zeigt an, dass sich das Bild oeffnen laesst - der einzige Hinweis, da
   bewusst kein Button im Slider sitzt.
   Auf dem Slide, nicht auf dem <img>: das traegt pointer-events:none und
   waere fuer den Zeiger gar nicht vorhanden. */
.ms-slide { cursor: zoom-in; }

@media (max-width: 767px) {
    .ms-lightbox { padding: 56px 12px; }
    .ms-lightbox-stage img { max-height: calc(100vh - 112px); }
    .ms-lightbox-close svg { width: 22px; height: 22px; }
    .ms-lightbox-arrow svg { width: 26px; height: 26px; }
    .ms-lightbox-prev  { left: 4px; }
    .ms-lightbox-next  { right: 4px; }
}

/* ═══════════════════════
   HEADER AUF DER OBJEKTSEITE
═══════════════════════ */
/* Auf der Detailseite liegt ganz oben der bildschirmbreite Hero - ein Header
   darueber verdeckt das erste Bild. Er bleibt deshalb verborgen, bis der Hero
   nach oben aus dem Bild gelaufen ist.
   Verborgen ist der Ruhezustand und wird hier gesetzt, sichtbar schaltet das
   Skript in single.phtml per .ms-header-sichtbar am <body>. Andersherum -
   Klasse fuers Verbergen - blitzte der Header beim Laden kurz auf, bevor das
   Skript liefe.

   Gegriffen wird auf <header> selbst und nicht auf die Container darin:
   Elementors Sticky-Funktion legt vom Header zur Laufzeit eine fixierte Kopie
   an, es gibt also mehr Container als im Quelltext stehen und ihre Klassen
   wechseln beim Scrollen. visibility vererbt sich von <header> nach unten und
   erreicht damit Original wie Kopie, ohne dass hier eine einzige
   Container-Klasse genannt werden muesste.

   opacity und nicht transform: ein transform auf dem Header wuerde fuer die
   fixierten Kinder einen neuen Bezugsrahmen aufspannen - sie wuerden am
   Header kleben statt am Fenster und beim Scrollen mitwandern. opacity
   erzeugt nur einen Stapelkontext, keinen Bezugsrahmen, und laesst das
   Sticky-Verhalten damit unangetastet.
   Der Wert multipliziert sich mit dem der Kinder - Elementors
   Motion-Effects schreiben der Sticky-Kopie beim Scrollen ein eigenes
   Inline-opacity; das bleibt erhalten, sobald der Header auf 1 steht.

   visibility zusaetzlich zu opacity, damit die Links waehrend des
   Verbergens aus der Tabulatorreihenfolge fallen. Der Platz im Fluss bleibt
   erhalten, der Seiteninhalt springt beim Umschalten also nicht. */
body.single-casawp_property .elementor-location-header {
    visibility: hidden;
    opacity: 0;
    pointer-events: none;
    transition: opacity 0.25s ease, visibility 0.25s;
}

body.single-casawp_property.ms-header-sichtbar .elementor-location-header {
    visibility: visible;
    opacity: 1;
    pointer-events: auto;
}

@media (prefers-reduced-motion: reduce) {
    body.single-casawp_property .elementor-location-header {
        transition: none;
    }
}

/* ═══════════════════════
   KARTE
═══════════════════════ */
.ms-map {
    width: 100%;
    height: 50vh;
    min-height: 360px;
    background: #e8e8e0;
    position: relative;
}

.ms-map iframe {
    width: 100%;
    height: 100%;
    border: none;
    filter: saturate(0.65);
}

/* Aufgezogen werden nur die Container, die CasaWP selbst liefert
   (.casawp-map und #map-canvas mit seiner Inline-Hoehe von 400px). Die
   Ebenen darunter gehoeren der Google-Maps-API: deren Panes sind absolut
   positioniert und werden per transform verschoben. Die frueheren
   Selektoren `.casawp-map > div > div`, `[aria-label="Karte"]` und `canvas`
   haben genau diese Ebenen auf `position:relative` und eine feste Groesse
   gezwungen - damit war die Karte weder zu ziehen noch zu zoomen. */
.ms-map > *,
.ms-map .casawp-map,
.ms-map #map-canvas {
    width: 100% !important;
    height: 100% !important;
}

.ms-map .casawp-map {
    position: absolute !important;
    top: 0 !important;
    left: 0 !important;
    right: 0 !important;
    bottom: 0 !important;
}

.ms-map #map-canvas { position: relative !important; }

/* ═══════════════════════
   KONTAKT
═══════════════════════ */
/* Kontaktformular – Aufbau identisch zum Suchprofil der Archivseite
   (.ma-profile): der ganze Block trägt den Hintergrund, der Text steht frei
   darauf, nur das Formular sitzt auf der volldeckenden beigen Fläche.
   Die beiden früheren bündigen Panels (grün links, beige rechts) entfallen.

   Farbwerte von der Kontaktseite übernommen und nachgemessen: Block
   --ms-secondary bei 30%, Formularfläche volles --ms-secondary.

   Der Block läuft über die volle Breite und schliesst ohne Abstand an die
   Karte darüber an – das frühere margin-top:200px ist weg. Die Breiten-
   begrenzung sitzt jetzt innen, sonst stünde der Hintergrund als
   zentriertes Band mit weissen Rändern. */
.ms-contact {
    background: color-mix(in srgb, var(--ms-secondary) 30%, transparent);
    padding: var(--ms-pad-v) 0;
    margin: 0;
    max-width: none;
    width: 100%;
    display: block;
}

/* Seitenpadding sitzt innen, nicht am Block: nur so deckt sich die
   Inhaltskante mit .ms-container, dem Standardcontainer der übrigen
   Sektionen. Läge es aussen, wäre der Inhalt hier um --ms-pad-h breiter als
   überall sonst auf der Seite. */
.ms-contact-inner {
    display: grid;
    /* Text und Formular je zur Haelfte. minmax(0,…) haelt lange Woerter im
       Titel davon ab, die Spalte aufzuziehen. */
    grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
    gap: 48px;
    align-items: start;
    width: 100%;
    /* Dieselbe Rechnung wie .ms-container und .ms-facts-content: das Padding
       gehoert in die Obergrenze hinein, sonst begrenzt sie den Inhalt und
       nicht den Kasten.
       Vorher stand hier die nackte --ms-max-width. Der Kontaktblock war damit
       um zweimal --ms-pad-h schmaler als der uebrige Inhalt - auf 1440px
       faellt das nicht auf, weil dort ohnehin beide an der Fensterbreite
       haengen, ab rund 1800px lief er aber sichtbar eingerueckt mit. */
    max-width: calc(var(--ms-max-width) + var(--ms-pad-h) * 2);
    margin: 0 auto;
    padding: 0 var(--ms-pad-h);
}

.ms-contact-left {
    background: transparent;
    padding: 0;
    display: flex;
    flex-direction: column;
    justify-content: flex-start;
}

.ms-contact-form-wrapper {
    background: var(--ms-secondary);
    padding: 3rem;
    display: flex;
    flex-direction: column;
    justify-content: flex-start;
}

.ms-contact-title {
    font-family: var(--ms-font);
    font-weight: var(--ms-fw-bold);
    font-size: var(--ms-h2);
    line-height: 1.0;
    text-transform: var(--ms-tt);
    letter-spacing: 0.02em;
    color: var(--ms-green);
    margin-bottom: 24px;
}

.ms-contact-text {
    font-family: var(--ms-font);
    font-weight: var(--ms-fw-light);
    font-size: var(--ms-body);
    color: var(--ms-green);
    line-height: var(--ma-lh-text);
}

/* Dasselbe zehnspurige Raster wie im Suchprofil - die beiden Formulare
   sollen sich gleich lesen. Vorher lief hier alles untereinander.
   CASAMAIL liefert seine Felder teils in .casawp-row-Zeilen verpackt; die
   loesen sich weiter unten per display:contents auf, damit ihre Felder
   direkte Rasterzellen werden und mitmachen. */
.ms-contact .casawp-contact-form,
.ms-contact .casawp-contactform-form,
.ms-contact-form-wrapper form {
    display: grid !important;
    grid-template-columns: repeat(10, minmax(0, 1fr)) !important;
    column-gap: 1.25rem !important;
    row-gap: 0 !important;
    align-content: start !important;
}

/* Standardbreite halb; danach die Ausnahmen je Feld.
   Die Reihenfolge steht explizit als `order` und nicht implizit im Markup:
   CASAMAIL gibt Telefon vor E-Mail aus, gewuenscht ist es umgekehrt. Mit
   durchnummerierten Werten bleibt die Abfolge auch dann stabil, wenn das
   Plugin seine Feldreihenfolge aendert. */
.ms-contact .casawp-contactform-form > .form-group,
.ms-contact .casawp-contact-form > .form-group,
.ms-contact-form-wrapper form > .form-group,
.ms-contact [class*="casawp-col-"] {
    grid-column: span 5;
    /* Auffangwert. Ohne ihn stehen unbenannte Rasterzellen bei order 0 und
       damit vor allen nummerierten Feldern - so landete CASAMAILs Hinweis
       "Bitte füllen Sie alle Felder aus." ganz oben im Formular. Alles ohne
       eigene Nummer sammelt sich jetzt am Ende. */
    order: 20;
}

/* CASAMAIL setzt den Hinweis in eine eigene Spalte neben dem Absenden-Knopf,
   ohne Eingabefeld darin - deshalb ueber die Abwesenheit von Feldern
   gegriffen und nicht ueber einen Feldnamen. Volle Breite direkt ueber dem
   Knopf, dort steht er im gestapelten Raster am sinnvollsten. */
.ms-contact .casawp-contactform-form [class*="casawp-col-"]:not(:has(input)):not(:has(select)):not(:has(textarea)) {
    grid-column: span 10;
    order: 10;
}

.ms-contact .casawp-contactform-form :is(.form-group, [class*="casawp-col-"]):has(input[name="firstname"])   { grid-column: span 5;  order: 1; }
.ms-contact .casawp-contactform-form :is(.form-group, [class*="casawp-col-"]):has(input[name="lastname"])    { grid-column: span 5;  order: 2; }
.ms-contact .casawp-contactform-form :is(.form-group, [class*="casawp-col-"]):has(input[name="street"])      { grid-column: span 10; order: 3; }
.ms-contact .casawp-contactform-form :is(.form-group, [class*="casawp-col-"]):has(input[name="postal_code"]) { grid-column: span 3;  order: 4; }
.ms-contact .casawp-contactform-form :is(.form-group, [class*="casawp-col-"]):has(input[name="locality"])    { grid-column: span 7;  order: 5; }
/* Land ausgeblendet. Bewusst display:none auf der Huelle und nicht
   `disabled` oder ein Entfernen aus dem Markup: das <select> bleibt damit im
   Formular und schickt seinen vorausgewaehlten Wert (CH) weiter mit - CasaWP
   fuehrt das Feld serverseitig als Pflichtangabe, ohne Wert im POST
   scheiterte die Pruefung. Ein leeres Pflichtfeld haette ausserdem die
   Browserpruefung blockiert ("invalid form control is not focusable"); hier
   ist es vorbelegt, der Fall tritt nicht ein.
   Soll das Feld wieder sichtbar werden, reicht es, diese Regel gegen die
   frueheren Werte `grid-column: span 10; order: 6;` zu tauschen. */
.ms-contact .casawp-contactform-form :is(.form-group, [class*="casawp-col-"]):has(select[name="country"])    { display: none !important; }
.ms-contact .casawp-contactform-form :is(.form-group, [class*="casawp-col-"]):has(input[name="emailreal"])   { grid-column: span 5;  order: 7; }
.ms-contact .casawp-contactform-form :is(.form-group, [class*="casawp-col-"]):has(input[name="phone"])       { grid-column: span 5;  order: 8; }
.ms-contact .casawp-contactform-form :is(.form-group, [class*="casawp-col-"]):has(textarea)                  { grid-column: span 10; order: 9; }
.ms-contact .casawp-contactform-form :is(.form-group, [class*="casawp-col-"]):has(input[type="submit"])      { grid-column: span 10; order: 11; }

/* Der Aufraeum-Div der Bootstrap-Zeilen ist im Raster eine leere Zelle. */
.ms-contact .clearBoth { display: none !important; }

.ms-contact .casawp-contact-form .form-group,
.ms-contact .casawp-contactform-form .form-group,
.ms-contact-form-wrapper .form-group {
    margin: 0 0 1.5625rem !important; /* 25px – exakt wie Kontakt-Seite */
}

.ms-contact .casawp-contact-form input[type="text"],
.ms-contact .casawp-contact-form input[type="email"],
.ms-contact .casawp-contact-form input[type="tel"],
.ms-contact .casawp-contact-form textarea,
.ms-contact .casawp-contactform-form input[type="text"],
.ms-contact .casawp-contactform-form input[type="email"],
.ms-contact .casawp-contactform-form input[type="tel"],
.ms-contact .casawp-contactform-form textarea,
.ms-contact-form-wrapper input[type="text"],
.ms-contact-form-wrapper input[type="email"],
.ms-contact-form-wrapper input[type="tel"],
.ms-contact-form-wrapper textarea {
    /* Felderoptik wie im Suchprofil der Archivseite: weisse Fläche, keine
       Kontur, normale Schriftgrösse und Schreibweise.
       !important bleibt nötig, weil CASAMAIL eigene Inline-/Plugin-Styles
       mitbringt (u. a. height:30px). */
    width: 100% !important;
    height: auto !important;
    min-height: 0 !important;
    background: var(--ms-white) !important;
    border: none !important;
    border-radius: 0 !important;
    color: var(--ms-green) !important;
    font-family: var(--ms-font) !important;
    font-weight: var(--ms-fw-light) !important;
    font-size: var(--ms-body) !important;
    line-height: 1.4 !important;
    padding: 8px 16px !important;
    letter-spacing: normal !important;
    text-transform: none !important;
    box-sizing: border-box !important;
    box-shadow: none !important;
    outline: none !important;
    appearance: none !important;
    -webkit-appearance: none !important;
    transition: background 0.2s !important;
}

.ms-contact input::placeholder,
.ms-contact textarea::placeholder {
    color: var(--ma-green-reduced) !important;
    opacity: 1 !important;
}

/* Fokus färbt die Fläche nicht mehr ein – auf Weiss wäre das ein Rückschritt
   in der Lesbarkeit. Stattdessen eine Innenkontur. */
.ms-contact input:focus,
.ms-contact textarea:focus,
.ms-contact select:focus {
    background-color: var(--ms-white) !important;
    box-shadow: inset 0 0 0 2px var(--ma-green-reduced) !important;
}

.ms-contact textarea {
    resize: vertical !important;
    min-height: 7.5rem !important;
}

/* Textarea traegt live ein eigenes, engeres Padding als die Einzeiler
   (5px/14px statt 8px/16px). Der Selektor wiederholt die Kette der
   Feldregel weiter oben: die liegt bei 0,3,1 und ist ebenfalls !important –
   ein kurzes `.ms-contact textarea` (0,1,1) verliert dagegen. Gleichstand
   plus spaetere Position entscheidet hier fuer diese Regel. */
.ms-contact .casawp-contact-form textarea,
.ms-contact .casawp-contactform-form textarea,
.ms-contact-form-wrapper textarea {
    padding: 5px 14px !important;
}

.ms-contact .casawp-contact-form button[type="submit"],
.ms-contact .casawp-contactform-form button[type="submit"],
.ms-contact .casawp-contactform-form input[type="submit"],
.ms-contact-form-wrapper button[type="submit"],
.ms-contact-form-wrapper input[type="submit"] {
    /* Identisch zum Submit des Suchprofils: gefüllt grün, weisse Schrift,
       linksbündig. Die angeschrägte clip-path-Form entfällt.
       Der Papierflieger läuft über background-image und nicht über ein
       eingebettetes SVG: CASAMAIL rendert hier ein <input type="submit">,
       das keine Kindelemente und keine Pseudoelemente aufnehmen kann. */
    background: var(--ms-green) var(--ma-icon-arrow-secondary) no-repeat right 20px center !important;
    background-size: 20px 20px !important;
    color: var(--ms-secondary) !important;
    border: none !important;
    border-radius: 0 !important;
    outline: none !important;
    font-family: var(--ms-font) !important;
    font-weight: var(--ms-fw-light) !important;
    font-size: var(--ms-body) !important;
    letter-spacing: 0.02em !important;
    text-transform: var(--ms-tt) !important;
    padding: 10px 52px 10px 20px !important;
    cursor: pointer !important;
    transition: background-color 0.15s, color 0.15s !important;
    box-shadow: none !important;
    align-self: flex-start !important;
    margin-top: 0.5rem !important;
    width: auto !important;
    display: inline-block !important;
}

/* Nur background-color, nicht die Kurzform: die würde den Papierflieger
   mitentfernen. */
/* Hover dreht Flaeche und Schrift um. background-image muss mit umgestellt
   werden: der Pfeil liegt als Hintergrundbild in fester Farbe vor und wuerde
   sonst in Sekundaerfarbe auf sekundaerfarbenem Grund verschwinden.
   Spezifitaet: diese Regel liegt bei (0,3,1) und damit gleichauf mit der
   Grundregel `.ms-contact .casawp-contactform-form input[type="submit"]`.
   Beide sind !important, den Gleichstand entscheidet die Position - deshalb
   muss dieser Block hinter der Grundregel stehen bleiben. */
.ms-contact button[type="submit"]:hover,
.ms-contact input[type="submit"]:hover,
.ms-contact button[type="submit"]:focus-visible,
.ms-contact input[type="submit"]:focus-visible {
    background-color: var(--ms-secondary) !important;
    background-image: var(--ma-icon-arrow-primary) !important;
    color: var(--ms-green) !important;
}

/* Beschriftungen stehen sichtbar über dem Feld – fett, versal, grün.
   Die Anrede-Radios bleiben über .casawp-gender-radios komplett
   ausgeblendet, ihre Labels tauchen damit nicht mit auf.
   Groesse bewusst aus dem Kit-Token für h3 – der frühere Alias wurde im
   Mobilblock lokal kleingedrückt und ist inzwischen entfallen. */
.ms-contact .control-label,
.ms-contact .form-group > label {
    display: block !important;
    font-family: var(--ms-font) !important;
    font-weight: var(--ms-fw-black) !important;
    font-size: var(--ma-h3) !important;
    letter-spacing: normal !important;
    text-transform: uppercase !important;
    color: var(--ms-green) !important;
    line-height: 1.2 !important;
    margin: 0 0 10px !important;
}

/* CASAMAIL packt manche Feldpaare in eine .casawp-row. display:contents
   loest die Zeile auf, ihre Spalten werden damit direkte Kinder des
   Formularrasters und lassen sich dort einzeln platzieren. Ohne das waere
   jede Zeile eine einzige Rasterzelle und die 30/70-Aufteilung von PLZ und
   Ort ginge nicht. */
.ms-contact .casawp-row {
    display: contents !important;
}
/* Die Bootstrap-Breiten (casawp-col-md-5/7) sind im Raster gegenstandslos -
   die Breite kommt jetzt aus grid-column. */
.ms-contact [class*="casawp-col-"] {
    width: auto !important;
    float: none !important;
    padding-left: 0 !important;
    padding-right: 0 !important;
}

/* CASAMAIL: Spam-Trap und Anrede ausblenden */
#theApsoluteRealEmailField {
    display: none !important;
    visibility: hidden !important;
}
.ms-contact .casawp-gender-radios {
    display: none !important;
}

/* CASAMAIL: Country-Select */
.ms-contact .casawp-contactform-form select {
    width: 100% !important;
    height: auto !important;
    background-color: var(--ms-white) !important;
    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' stroke='%232a5621' stroke-width='1.5' fill='none'/%3E%3C/svg%3E") !important;
    background-repeat: no-repeat !important;
    background-position: right 0.875rem center !important;
    border: none !important;
    border-radius: 0 !important;
    color: var(--ms-green-dark) !important;
    font-family: var(--ms-font) !important;
    font-weight: var(--ms-fw-light) !important;
    font-size: var(--ms-body) !important;
    padding: 8px 16px !important;
    letter-spacing: normal !important;
    text-transform: none !important;
    appearance: none !important;
    -webkit-appearance: none !important;
    -moz-appearance: none !important;
    outline: none !important;
    box-shadow: none !important;
    box-sizing: border-box !important;
}
.ms-contact .casawp-contactform-form select option {
    background: var(--ms-white);
    color: var(--ms-green-dark);
    text-transform: none;
}

/* ─────────────────────────────────────────────────
   Fallback-Kontaktformular (ms_render_fallback_form in single.phtml)
   Wird angezeigt, wenn CASAMAIL nichts liefert – und landet im selben
   .ms-contact-form-wrapper wie das reguläre Formular. Deshalb dieselbe
   Optik wie das Suchprofil der Archivseite.
   Selektoren mit .ms-contact davor (0,2,1), weil hello-elementor/reset.css
   input[type="text"] mit 0,1,1 und später ladend sonst die Kontur setzt.
   ───────────────────────────────────────────────── */

    .ms-placeholder-form {
      display: flex;
      flex-direction: column;
      gap: 0;
    }
    .ms-contact .ms-placeholder-form input,
    .ms-contact .ms-placeholder-form textarea {
      width: 100%;
      background: var(--ms-white);
      border: none;
      border-radius: 0;
      box-shadow: none;
      color: var(--ms-green);
      font-family: var(--ms-font);
      font-weight: var(--ms-fw-light);
      font-size: var(--ms-body);
      letter-spacing: normal;
      text-transform: none;
      padding: 0.75rem 1.25rem;
      outline: none;
      appearance: none;
      -webkit-appearance: none;
      transition: background 0.2s;
      margin-bottom: 1.5625rem; /* 25px */
    }
    .ms-contact .ms-placeholder-form input::placeholder,
    .ms-contact .ms-placeholder-form textarea::placeholder {
      color: var(--ms-green);
      opacity: 1;
    }
    .ms-contact .ms-placeholder-form input:focus,
    .ms-contact .ms-placeholder-form textarea:focus {
      background: rgba(0,0,0,0.16);
    }
    .ms-contact .ms-placeholder-form textarea {
      min-height: 7.5rem;
      resize: vertical;
      margin-bottom: 0;
    }
    .ms-placeholder-form .ms-form-msg {
      margin-top: 0.75rem;
      color: var(--ms-green-dark);
    }
    /* Gefüllt grün mit Papierflieger – wie alle Submits. */
    .ms-contact .ms-placeholder-form button {
      background: var(--ms-green) var(--ma-icon-arrow-secondary) no-repeat right 20px center;
      background-size: 20px 20px;
      border: none;
      border-radius: 0;
      outline: none;
      color: var(--ms-secondary);
      font-family: var(--ms-font);
      font-weight: var(--ms-fw-light);
      font-size: var(--ms-body);
      letter-spacing: 0.02em;
      text-transform: var(--ms-tt);
      padding: 10px 52px 10px 20px;
      cursor: pointer;
      transition: background-color 0.15s, color 0.15s;
      align-self: flex-start;
      margin-top: 0.5rem;
    }
    .ms-contact .ms-placeholder-form button:hover,
    .ms-contact .ms-placeholder-form button:focus-visible {
      background-color: var(--ms-secondary);
      background-image: var(--ma-icon-arrow-primary);
      color: var(--ms-green);
    }

/* ═══════════════════════════════════════════════════
   RESPONSIVE – Tablet (≤ 1024px)
═══════════════════════════════════════════════════ */

    @media (max-width: 1024px) {
    .mossinger-single {
        --ms-pad-h: 32px;
    }

    /* Der Seitenabstand kommt allein vom .ms-container - die Sektion selbst
       hat keinen mehr, sonst doppelter Rand. */
    .ms-facts-datapoints {
        grid-template-columns: repeat(2, 1fr);
    }


    /* margin-top entfällt: der Block schliesst auf allen Breiten direkt an
       die Karte an. */
    /* Ab hier gestapelt: Text oben, Formular darunter ueber die volle
       Breite. Zweispaltig blieben dem Formular nur rund 280px, und da es
       innen selbst zweispaltig ist, kam PLZ auf 71px heraus - nicht mehr
       bedienbar. Gestapelt hat es hier rund 680px und die Feldaufteilung
       geht auf.
       Der Text darueber vertraegt die volle Breite gut, er ist kurz. */
    .ms-contact-inner {
        grid-template-columns: 1fr;
        gap: 32px;
    }

    .ms-contact-form-wrapper {
        padding: 2.5rem;
    }
}

/* ═══════════════════════════════════════════════════
   RESPONSIVE – Mobil (≤ 767px, wie im Elementor-Kit)
═══════════════════════════════════════════════════ */
@media (max-width: 767px) {
    .mossinger-single {
        /* Schriftgroessen stehen hier bewusst nicht mehr: das Kit bringt
           eigene Mobilstufen mit, frueher wurden sie hier fix ueberstimmt. */
        --ms-pad-h: 25px;   /* mobiles Grundpadding, gilt über --ms-pad-h überall */
        --ms-pad-v: 48px;
    }

    .ms-facts-datapoints {
        grid-template-columns: 1fr;
    }


    .ms-objecttitle {
        padding-top: 32px;
    }

    /* Gestapelt. Der gap darf jetzt stehen bleiben – es gibt kein zweites
       Panel mehr, zwischen dem der Seitenhintergrund durchblitzen könnte. */
    .ms-contact-inner {
        grid-template-columns: 1fr;
        gap: 24px;
    }

    .ms-contact-left {
        padding: 0;
    }

    .ms-contact-form-wrapper {
        padding: 24px;
    }

    /* Gestapelt: eine Spur, jedes Feld ueber die volle Breite. Die
       feldweisen Spannweiten muessen mit zurueckgesetzt werden, sonst
       verlangten sie 3, 5 oder 10 Spuren in einem einspurigen Raster - das
       Raster legte dafuer implizite Spalten an und die Felder standen
       weiterhin nebeneinander, in willkuerlichen Breiten.
       Die order-Werte bleiben, die Reihenfolge stimmt gestapelt genauso.

       Das !important ist hier noetig und nicht bequem: die Feldregeln oben
       tragen `:has(input[name="firstname"])` und liegen damit bei (0,4,1),
       eine Sammelregel mit `:has(input)` kaeme nur auf (0,3,1) und verloere.
       Ein Nachbauen aller Feldnamen im Medienblock waere die Alternative -
       zwei Listen, die beim naechsten Feld auseinanderlaufen. */
    .ms-contact .casawp-contact-form,
    .ms-contact .casawp-contactform-form,
    .ms-contact-form-wrapper form {
        grid-template-columns: 1fr !important;
    }
    .ms-contact .casawp-contactform-form > .form-group,
    .ms-contact .casawp-contact-form > .form-group,
    .ms-contact-form-wrapper form > .form-group,
    .ms-contact [class*="casawp-col-"],
    .ms-contact .casawp-contactform-form :is(.form-group, [class*="casawp-col-"]) {
        grid-column: 1 / -1 !important;
    }
}

/* ════════════════════════════════════════
   MOBIL-HERO SLIDER (nur ≤768px)
════════════════════════════════════════ */
/* Hero-Slider auf allen Breiten. Randlos bis zur Bildschirmkante: der
   Slider sitzt im Container-Fluss, bricht aber ueber die negative
   Randtechnik aus. 100vw statt 100% - die Breite bezieht sich auf den
   Viewport, nicht auf den Elternabstand. Die Verschiebung der Spur rechnet
   ebenfalls in vw, deshalb muessen beide dieselbe Einheit haben. */
.ms-hero-slider {
    display: block;
    position: relative;
    width: 100vw;
    margin-left: calc(50% - 50vw);
    margin-right: calc(50% - 50vw);
    height: 66vh;
    min-height: 320px;
    overflow: hidden;
    background: var(--ms-grey);
}

/* Die Stufen stehen bewusst direkt hier und nicht in den Sammelbloecken
   weiter oben: die Basisregel steht in der Datei NACH jenen Bloecken und
   wuerde sie bei gleicher Spezifitaet ueberschreiben. */
@media (max-width: 1024px) {
    .ms-hero-slider { height: 45vh; }
}
@media (max-width: 767px) {
    /* 50vh sind hochkant wenig Bildflaeche - ein festes Verhaeltnis
       traegt hier besser. */
    .ms-hero-slider {
        height: 50vh;
        min-height: 0;
    }
}

.ms-slider-track {
    display: flex;
    height: 100%;
    transition: transform 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94);
    will-change: transform;
}

/* Hoehe kommt vom Slider, nicht vom Viewport: frueher war der Slider
   100vh hoch, jetzt 66vh - ein Slide mit 100vh haette den Track ueberragt. */
.ms-slide {
    flex: 0 0 100vw;
    width: 100vw;
    height: 100%;
    position: relative;
    overflow: hidden;
}

.ms-slide img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    display: block;
    pointer-events: none;
    user-select: none;
    -webkit-user-drag: none;
}

/* Vollbild-Hinweis unten rechts.
   Rein visuell: pointer-events:none laesst den Klick auf das Slide
   durchfallen, das die Lightbox ohnehin oeffnet - so gibt es genau ein
   Klickziel statt zweier fuer dieselbe Aktion.
   Der Schlagschatten wie bei den Pfeilen, damit das weisse Icon auch auf
   hellen Bildbereichen lesbar bleibt. */
/* Position auf die sichtbaren Kanten der uebrigen Bedienelemente
   ausgerichtet, nicht auf deren Kaesten:
     Pfeil  - Button 44px bei right:16px, Icon 34px darin zentriert
              -> Glyphkante bei 16 + (44-34)/2 = 21px
     Punkt  - Leiste bei bottom:14px, 5px Innenabstand am Punkt
              -> sichtbare Unterkante bei 14 + 5 = 19px
   Mit 16/14 sass das Icon optisch naeher am Rand als alles andere. */
.ms-slider-fullscreen {
    position: absolute;
    right: 21px;
    bottom: 19px;
    z-index: 10;
    display: flex;
    color: var(--ms-white);
    pointer-events: none;
}

.ms-slider-fullscreen svg {
    width: 26px;
    height: 26px;
    fill: currentColor;
    stroke: none;
    filter: drop-shadow(0 1px 3px rgba(0, 0, 0, 0.55));
}

/* Pfeil-Buttons */
/* Ohne Flaeche, nur das Icon in Weiss. Die Klickflaeche bleibt trotzdem
   44x44 - kleiner ist auf Touch unzuverlaessig zu treffen. */
.ms-slider-arrow {
    position: absolute;
    top: 50%;
    transform: translateY(-50%);
    z-index: 10;
    background: none;
    border: 0;
    border-radius: 0;
    color: var(--ms-white);
    width: 44px;
    height: 44px;
    display: flex;
    align-items: center;
    justify-content: center;
    cursor: pointer;
    transition: opacity 0.2s;
    -webkit-tap-highlight-color: transparent;
}

/* Hover und Fokus wechseln auf die Primaerfarbe statt zu verblassen.
   Container im Selektor aus demselben Grund wie bei der Lightbox. */
.ms-hero-slider .ms-slider-arrow:hover,
.ms-hero-slider .ms-slider-arrow:focus-visible {
    color: var(--ms-green);
    outline: none;
}

/* Die neuen Pfeile sind fill-basiert, nicht stroke-basiert wie die alten -
   `stroke` und `fill:none` haetten sie unsichtbar gemacht.
   Der Schlagschatten ersetzt die weggefallene Flaeche: ein weisser Pfeil auf
   einem hellen Foto verschwindet sonst. Kostet keine Flaeche und ist auf
   dunklem Grund nicht zu sehen. */
.ms-slider-arrow svg {
    width: 34px;
    height: 34px;
    fill: currentColor;
    stroke: none;
    filter: drop-shadow(0 1px 3px rgba(0, 0, 0, 0.55));
}
.ms-slider-prev { left: 16px; }
.ms-slider-next { right: 16px; }

/* Dots */
/* gap 0: der Abstand entsteht aus dem Padding der Punkte, das zugleich
   ihre Trefferflaeche bildet. */
.ms-slider-dots {
    position: absolute;
    bottom: 14px;
    left: 50%;
    transform: translateX(-50%);
    display: flex;
    gap: 0;
    z-index: 10;
}

/* Sichtbar sind 5px, anklickbar 15px: das Padding vergroessert die
   Trefferflaeche, `background-clip: content-box` haelt die Farbe trotzdem
   auf dem inneren Punkt. Ein 5px-Ziel waere auf Touch kaum zu treffen. */
.ms-slider-dot {
    box-sizing: content-box;
    width: 5px;
    height: 5px;
    padding: 5px;
    border-radius: 50%;
    background: rgba(255,255,255,0.45);
    background-clip: content-box;
    cursor: pointer;
    transition: background 0.2s, transform 0.2s;
}

.ms-slider-dot.active {
    background: #fff;
    background-clip: content-box;
    transform: scale(1.25);
}

@media (max-width: 767px) {
    /* Desktop-Hero ausblenden */
    /* Slider einblenden */
}
