/* ==========================================================================
   Mey Immobilien — Facelift 2026 · CSS-only, kein Template-Eingriff
   --------------------------------------------------------------------------
   NACHJUSTIEREN: alles Einstellbare steht in Abschnitt 0. Mobil werden nur
   dieselben Variablen überschrieben (0b), es gibt keine zweite Regelmenge.

   LADEPOSITION (zwingend): muss als LETZTES Stylesheet laden, nach
   `customstyle`. Enqueue mit Priorität 100 — das Child-functions.php läuft
   vor dem Parent, zu Priorität 10 wäre `customstyle` nicht registriert.

   mobile.css lädt VOR dieser Datei: Regeln ohne Media Query hebeln daher
   Media-Query-Regeln aus mobile.css aus. Wo das nicht gewollt ist, steht die
   Regel in einer min-width-Query.

   `!important` nur in vier Fällen, jeder am Ort begründet:
   a) Inline-Styles aus dem Seiteneditor · b) Inline-Styles aus den Vorlagen
   c) Theme-Regeln mit eigenem !important · d) Child-CSS mit ID-Spezifität

   Ausführliche Begründungen und die offenen Theme-Punkte:
   template-konflikte.md im Projektordner.
   ========================================================================== */


/* ===== 0 · STELLSCHRAUBEN ===== */

:root {
  /* ---- Schriftfamilien ------------------------------------------------- */
  --mey-display: 'Geist', 'Helvetica Neue', Helvetica, Arial, sans-serif;
  --mey-sans:    'Source Sans 3', 'Segoe UI', system-ui, -apple-system, sans-serif;

  /* rem statt em: im verschachtelten Theme-Markup würden sich em aufmultiplizieren */
  /* Optischer Ausgleich: x-Höhe/em gemessen — Open Sans 0,535 · Geist 0,530 ·
   Source Sans 3 0,486. Überschriften brauchen keinen Ausgleich, Fließtext
   rund x1,10. Das alte Menü stand in Versalien, daher --fs-menu als eigene
   Stufe. `font-size-adjust` bewusst nicht: rendert ohne Browserunterstützung
   anders als mit. */

  /* clamp: 27px bei 1025px, 32px ab ~1450px. Justieren über die clamp-Enden. */
  --fs-hero:     clamp(1.5rem, 1rem + 1.1vw, 2rem);
  --fs-h1:       2rem;      /* 32px  Seitentitel             */
  --fs-h2:       1.625rem;  /* 26px  Sektionstitel           */
  --fs-h3:       1.25rem;   /* 20px  Modultitel, Kartentitel */
  --fs-h4:       1.0625rem; /* 17px                          */
  --fs-lead:     1.125rem;  /* 18px  Vorspann                */
  --fs-body:     1rem;      /* 16px  Fließtext               */
  --fs-small:    .9375rem;  /* 15px  Kartentext, Sekundäres  */
  --fs-meta:     .875rem;   /* 14px  Eckdaten, IDs           */
  --fs-label:    .875rem;   /* 14px  Eyebrows (Versalien)    */
  --fs-boxtitle: 1.0625rem; /* 17px  Panel- und Fußzeilentitel */
  --fs-menu:     1.0625rem; /* 17px  Hauptmenü               */
  --fs-price:    .8125rem;  /* 13px  Grundwert für alle drei Angaben der
                                  Kartenzeile. Obergrenze ist die
                                  Einzeiligkeit; die hängt an der KARTEN-,
                                  nicht der Viewportbreite — deshalb unten
                                  eine Container-Query.                     */
  --fs-price-lg: 1.5rem;    /* 24px  Preis Detailseite       */

  /* ---- Zeilenhöhen ----------------------------------------------------- */
  --lh-text:  1.5;    /* Fließtext — durchgängig auf allen Seiten */
  --lh-snug:  1.35;   /* Kartentitel, kompakte Listen             */
  --lh-head:  1.18;   /* Überschriften                            */
  --lh-tight: 1.08;   /* Hero                                     */

  /* Silbentrennung: Mindestwortlänge / Zeichen vor / nach dem Trennstrich.
   8 4 3 = trennt erst ab Komposita, kein "Im-mobilien", keine Zweibuchstaben-
   Reste. Setzt <html lang="de"> voraus. */
  --hyphen-limits: 8 4 3;

  /* ---- Laufweiten ------------------------------------------------------ */
  --ls-head:  -.02em;
  --ls-hero:  -.028em;
  --ls-label: .12em;

  /* ---- Raumskala ------------------------------------------------------- */
  --sp-1: .25rem;  --sp-2: .5rem;   --sp-3: .75rem;
  --sp-4: 1rem;    --sp-5: 1.5rem;  --sp-6: 2rem;    --sp-7: 3rem;

  /* ---- Zusammengesetzte Abstände — die Hebel gegen "zu viel Luft" ------- */
  --space-section: 3.5rem;  /* 56px  volle Sektionen (CTA-Bänder) */
  --space-block:   2.25rem; /* 36px  zwischen großen Blöcken      */
  --space-card:    1.25rem; /* 20px  Karten-Innenabstand          */
  --gap-grid:      1.5rem;  /* 24px  Rasterabstand                */

  /* Hausmuster als gezeichnete Kontur statt Bitmap — scharf, kein Bildrequest.
   Zwei versetzte Häuser je Kachel ergeben einen halbversetzten Rapport.
   Justieren: --pattern-size (Dichte), stroke-opacity (Stärke). */
  --pattern-size: 56px;
  --pattern-house: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 56 56"><g fill="none" stroke="%232c2f34" stroke-opacity=".09" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"><path d="M6 16 L14 9 L22 16 M8.5 16 V23 H19.5 V16"/><path d="M34 44 L42 37 L50 44 M36.5 44 V51 H47.5 V44"/></g></svg>');

  /* KI-Badge: Symbol als data-URI, keine Icon-Schrift. Austausch siehe Abschnitt 14. */
  /* Symbolkacheln der Startseiten-Boxen: Kachel und Symbol darin. */
  --ico-tile:  4rem;      /* 64px — war 52px */
  --ico-glyph: 2rem;      /* 32px — war 22px */

  /* Reiter-Innenabstand. Als VARIABLE, nicht als Regel: eine Regel im
   Mobilblock stünde vor der Grundregel und verlöre nach Position. */
  --tab-px: var(--sp-4);

  /* Beschriftung der mobilen Filterleiste. Das Theme zeigt dort nur ein
     Symbol; was es tut, muss man erraten. */
  --filter-label: "Objekte filtern";

  --ai-badge-text: "KI-generiert";
  --ai-badge-icon: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="%23ffffff"><path d="M10 3.5 11.9 11.1 19.5 13 11.9 14.9 10 22.5 8.1 14.9 0.5 13 8.1 11.1Z"/><path d="M19 2 19.7 4.3 22 5 19.7 5.7 19 8 18.3 5.7 16 5 18.3 4.3Z"/></svg>');

  /* Vorschaubilder: Bildmaterial 1,19:1 bis 1,48:1, 4:3 beschneidet am wenigsten. */
  --ratio-thumb: 4 / 3;

  /* Hero-Verhältnis, entkoppelt die Anzeigehöhe vom Bildmaterial
   (object-fit: cover). Sinnvoller Bereich 2,2 bis 2,4. */
  --hero-ratio: 2.4 / 1;

  /* ---- Layout — Bestandsmaß, bewusst unverändert ----------------------- */
  --content-max:    1060px;
  --content-gutter: 20px;

  /* Luft um Logo und Navigation. Die Menüpunkte rechnen mit diesem Wert,
   damit ihre Höhe zur Logohöhe passt. */
  --header-y: 1.25rem;   /* 20px — Bestand war 12px */

  /* ---- Buttons --------------------------------------------------------- */
  --btn-h:  46px;
  --btn-px: 1.625rem;   /* 26px */
  --btn-fs: .9375rem;   /* 15px */

  /* Zeilenbudget der Karten — Mindest- UND Maximalhöhe. Nur so liegen Preis,
   Eckdaten und CTA über alle Karten auf einer Linie. */
  --card-title-lines: 3;
  --card-text-lines:  3;

  /* ---- Form ------------------------------------------------------------ */
  --r-btn: 5px;  --r-badge: 5px;  --r-img: 6px;  --r-card: 8px;

  /* Elevation flach: der Rahmen trägt, der Schatten hebt nur eben ab. */
  --e-rest:  0 1px 2px rgba(26, 22, 20, .035);
  --e-hover: 0 2px 6px rgba(26, 22, 20, .05);
  --e-float: 0 6px 20px rgba(26, 22, 20, .09);   /* Menü, Formularkarte */

  /* ---- Bewegung -------------------------------------------------------- */
  --dur:  150ms;
  --ease: cubic-bezier(.2, .6, .25, 1);

  /* Rotwert unverändert aus den Theme-Optionen; steckt auch in Inline-Styles. */
  --accent: #8a2237;  --accent-dark: #6f1a2c;
  --tint:   #f7f1f2;  --ring: rgba(138, 34, 55, .20);

  --ink: #1a1614;  --ink-2: #322c29;  --ink-3: #45403c;
  --muted: #6e6763;  --muted-2: #8b837d;  --muted-3: #9a928c;

  --bg: #fbfaf9;  --surface: #ffffff;  --soft: #f4f1ed;  --topbar: #f2efeb;
  --line: #e8e4e0;  --line-2: #ede9e5;  --line-3: #cfc8c2;
  --dark-2: #1a1614;
}

/* ---- 0b · Mobil: NUR Variablen überschreiben -------------------------- */
@media (max-width: 834px) {
  :root {
    --fs-hero: 1.75rem;  --fs-h1: 1.5rem;  --fs-h2: 1.3125rem;
    --fs-h3: 1.125rem;   --fs-lead: 1.0625rem;
    --fs-price-lg: 1.25rem;

    --space-section: 2.5rem;  --space-block: 1.75rem;
    --space-card: 1.125rem;   --gap-grid: 1.25rem;

    --btn-h: 44px;  --btn-px: 1.375rem;  --tab-px: var(--sp-2);
  }

  /* Unterseiten mobil eine Stufe weniger: dort fassen Brotkrumenband und Fuß
   die Sektion schon ein, auf der Startseite ist der Abstand die einzige
   Grenze. */
  body:not(.home) { --space-section: 1.875rem; }
}

/* 0c · Mobil: die zwei Stellen, an denen Variablen nicht reichen. Beide
   folgen den Breakpoints des THEMES (667/640), nicht eigenen. */
@media screen and (max-width: 667px) {
  /* Untereinander gestapelte Info-Boxen brauchen eine sichtbare Fuge. */
  .boxcontent { margin-bottom: 10px; }
}
@media screen and (max-width: 640px) {
  /* mobile.css stapelt mit `margin: 1.5% 0` — zu dicht. FESTER Wert: ein
   Prozentabstand löst sich gegen die Breite auf und wächst damit in die
   falsche Richtung. */
  /* Nur Spalten MIT Inhalt: der Baukasten benutzt leere Spalten als
   Platzhalter. Logik umgedreht, weil die leere Spalte `<div class="inner">
   </div>` enthält — weder `:has(*)`-leer noch `:empty`. Und der naheliegende
   Ausweg ist ungültig: :has() darf kein weiteres :has() enthalten. */
  /* Platzhalterspalte ganz aus dem Fluss; gestapelt hat sie keine Aufgabe. */
  :is(.col1-1, .col1-2, .col1-3, .col1-4, .col2-3, .col3-4):not(:has(.inner > *)) {
    display: none !important;   /* mobile.css:? setzt `display:block !important`
                                   für dieselben Spalten — → Fall c */
  }
  :is(.col1-1, .col1-2, .col1-3, .col1-4, .col2-3, .col3-4) { margin: 0; }
  /* Nur nach unten — ein Abstand oben addiert sich auf den Block davor. */
  :is(.col1-1, .col1-2, .col1-3, .col1-4, .col2-3, .col3-4):has(.inner > *) {
    margin: 0 0 var(--space-block);
  }
  /* Ausnahme: Spalten mit NUR einer Liste. Mobil riss der Spaltenabstand sonst
   mitten in der Liste eine Lücke auf. */
  :is(.col1-1, .col1-2, .col1-3, .col1-4, .col2-3, .col3-4):has(> .inner > ul:only-child),
  :is(.col1-1, .col1-2, .col1-3, .col1-4, .col2-3, .col3-4):has(> .inner > ol:only-child) {
    margin-bottom: 0;
  }
  /* Die letzte Spalte gibt ihren Fußabstand ab. Muss NACH der Regel darüber
   stehen: bei gleicher Spezifität entscheidet die Reihenfolge. */
  /* „Keine weitere Spalte MIT INHALT dahinter" — die ausgeblendete
   Platzhalterspalte bleibt ja Geschwisterelement. `.inner > *` steht
   innerhalb des :has(); ein verschachteltes :has() wäre ungültig. */
  :is(.col1-1, .col1-2, .col1-3, .col1-4, .col2-3, .col3-4):not(:has(~ :is(
      .col1-1, .col1-2, .col1-3, .col1-4, .col2-3, .col3-4) .inner > *)) {
    margin-bottom: 0;
  }
  /* .columns bringt zusätzlich `padding: 10px 0` mit — dieselbe Verdopplung
     eine Ebene höher. Den Abstand tragen die Spalten. */
  .columns { padding-top: 0; padding-bottom: 0; }
}



/* ===== 1 · SCHRIFTLADEN =====
   Selbst gehostet (DSGVO), Variable Fonts: 3 Dateien, 92 KB. Liegen in
   css/fonts/ neben der CSS, damit ein auf css/ beschränkter FTP-Zugang
   genügt. Darunter die Theme-Faces mit `font-display: swap` — fonts.css
   deklariert sie ohne, Default `block` = bis zu 3 s unsichtbarer Text. */

@font-face { font-family: 'Geist'; font-style: normal; font-weight: 100 900; font-display: swap;
  src: url('/wp-content/themes/bo-beladomo-child/css/fonts/geist-latin-var.woff2') format('woff2'); }
@font-face { font-family: 'Source Sans 3'; font-style: normal; font-weight: 200 900; font-display: swap;
  src: url('/wp-content/themes/bo-beladomo-child/css/fonts/source-sans-3-latin-var.woff2') format('woff2'); }
@font-face { font-family: 'Source Sans 3'; font-style: italic; font-weight: 200 900; font-display: swap;
  src: url('/wp-content/themes/bo-beladomo-child/css/fonts/source-sans-3-latin-italic-var.woff2') format('woff2'); }

@font-face { font-family: 'Open Sans'; font-style: normal; font-weight: 400; font-display: swap;
  src: url('/wp-content/themes/bo-beladomo/fonts/open-sans-v15-latin-regular.woff2') format('woff2'); }
@font-face { font-family: 'Open Sans'; font-style: normal; font-weight: 600; font-display: swap;
  src: url('/wp-content/themes/bo-beladomo/fonts/open-sans-v15-latin-600.woff2') format('woff2'); }
@font-face { font-family: 'Open Sans'; font-style: normal; font-weight: 700; font-display: swap;
  src: url('/wp-content/themes/bo-beladomo/fonts/open-sans-v15-latin-700.woff2') format('woff2'); }
@font-face { font-family: 'Lato'; font-style: normal; font-weight: 300; font-display: swap;
  src: url('/wp-content/themes/bo-beladomo/fonts/lato-v14-latin-300.woff2') format('woff2'); }
@font-face { font-family: 'Lato'; font-style: normal; font-weight: 400; font-display: swap;
  src: url('/wp-content/themes/bo-beladomo/fonts/lato-v14-latin-regular.woff2') format('woff2'); }
@font-face { font-family: 'Lato'; font-style: normal; font-weight: 700; font-display: swap;
  src: url('/wp-content/themes/bo-beladomo/fonts/lato-v14-latin-700.woff2') format('woff2'); }


/* ===== 2 · BASIS & TYPOGRAFIE =====
   Das Theme verdrahtet 'Open Sans' und 'Lato' an rund 20 Stellen fest; zwei
   Sammelregeln decken alle ab. */

body {
  font-family: var(--mey-sans);
  font-size: 100%;                 /* 88% ≈ 14px  →  16px */
  line-height: var(--lh-text);
  color: var(--muted);
  background-color: var(--bg);
  background-image: none;          /* bg-pattern.png raus */
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}

:is(input, select, textarea, button, .psbutton, .profilename,
    button.simplefavorite-button) { font-family: var(--mey-sans); }

:is(h1, h2, h3, h4, h5, h6, .pagetitle, .headerbox-headline, .logotitle,
    .propprice, .prop-price, .separator-headline h4) {
  font-family: var(--mey-display);
  color: var(--ink);
  font-weight: 600;
  letter-spacing: var(--ls-head);
  line-height: var(--lh-head);
}

/* Der Theme-Reset setzt alle Überschriften auf `margin: 0`. Abstand nach
   unten immer, nach oben nur bei vorausgehendem Inhalt. Editor-Inline-Werte
   schlagen diese Regel — so gewollt. */
:is(h1, h2, h3, h4, h5) { margin: 0 0 var(--sp-3); }
:is(.page-entry, .tabtext, .textwidget) :is(p, ul, ol, table) + :is(h2, h3, h4) {
  margin-top: var(--space-block);
}
/* Diese beiden stehen allein in ihrer Zeile bzw. mittig zwischen Linien —
   ein Grundabstand würde die Ausrichtung stören. */
:is(.slogan h1, .separator-headline h4) { margin: 0; }

h1, .pagetitle { font-size: var(--fs-h1); }
h2 { font-size: var(--fs-h2); }
h3 { font-size: var(--fs-h3); line-height: var(--lh-snug); }
h4 { font-size: var(--fs-h4); line-height: var(--lh-snug); }
h5 { font-size: var(--fs-body); line-height: var(--lh-snug); }
:is(h2, h3, h4, h5) a { color: var(--ink); }

p {
  color: var(--muted);
  font-size: var(--fs-body);
  line-height: var(--lh-text);
  padding: 0;
  margin: 0 0 var(--sp-4);
}
p:last-child { margin-bottom: 0; }
li { line-height: var(--lh-text); }

/* Listen auf den Absatzrhythmus. Nur die SENKRECHTEN Werte — der linke Rand
   trägt die Einrückung und ist je Listentyp bewusst verschieden. Deshalb
   Langformen statt der Kurzform. */
:is(.page-entry, .tabtext, .textwidget, .columns, .toggle-more, .content) :is(ul, ol) {
  margin-top: 0;
  margin-bottom: var(--sp-4);
}
:is(.page-entry, .tabtext, .textwidget, .columns, .toggle-more, .content) :is(ul, ol) > li {
  margin-top: 0;
  margin-bottom: var(--sp-2);
}
:is(.page-entry, .tabtext, .textwidget, .columns, .toggle-more, .content) :is(ul, ol) > li:last-child {
  margin-bottom: 0;
}

/* Das Theme gibt Absätzen in Spalten `padding: 5px 15px 5px 0`; der
   senkrechte Anteil verschiebt den Rhythmus, der rechte bleibt. */
.columns p { padding-top: 0; padding-bottom: 0; }

/* `pretty` verhindert Schusterjungen im Fließtext, `balance` gleicht die
   Zeilenlängen in Überschriften aus. */
html { hyphenate-limit-chars: var(--hyphen-limits); }

:is(p, li) { text-wrap: pretty; hyphens: auto; overflow-wrap: break-word; }

:is(h1, h2, h3, h4, h5, .pagetitle, .headerbox-headline, .slogan h1,
    .separator-headline h4, .ctacontainer h1, .ctacontainer h2, .ctacontainer h3) {
  text-wrap: balance;
  overflow-wrap: break-word;   /* Notbremse: nichts läuft je aus der Spalte */
}

/* Überschriften nicht trennen — in großen Graden unruhig. Ausnahme schmale
   Spalten, dort reißen Komposita sonst Löcher in den Satz. */
.propbox h2 { hyphens: auto; }
@media (max-width: 834px) {
  :is(h1, h2, h3, .pagetitle, .headerbox-headline) { hyphens: auto; }
}

/* Der halbtransparente Weiß-Layer über dem Muster wird nicht mehr gebraucht */
/* ---- Abstandshierarchie, drei Ebenen -----------------------------------
       SEKTION  --space-section  56/40   .page-content, .slogan, .ctacontainer
       BLOCK    --space-block    36/28   Karten, Sidebar-Boxen, Reiter
       ELEMENT  --sp-4 … --sp-2  16/12/8 Absätze, Listen, Punkte
   Verschachtelte .page-content bekommen nichts (Regel unten), sonst
   summiert sich das Sektionspadding doppelt. */
.page-content {
  background: transparent;
  padding-top: var(--space-section);
  padding-bottom: var(--space-section);
}

/* ---- RANDAUSGLEICH — der zweite, nötige Teil der Hierarchie ------------
   Gleiches Padding erzeugt noch keine gleichen Fugen: bringt das erste oder
   letzte Element einen eigenen Außenabstand mit, addiert er sich darauf. An
   den sichtbaren Kanten gemessen lagen so 56 bis 92px für dieselbe Fuge.
   Es sind überall dieselben Verursacher — kein Seiten-, sondern ein
   Elementproblem. Sie geben ihren Abstand nur AM SEKTIONSRAND ab. */

/* 1 · Spaltenränder des Themes (`margin: 1.5% 0`) sind ein Float-Artefakt. */
:is(.col-ttc, .col-otc) { margin-top: 0; margin-bottom: 0; }
/* …und nicht von INNEN: ein Kindabstand fällt durch einen Container ohne
   Innenabstand und Rahmen HINDURCH und landet außerhalb — der Inspektor
   zeigt ihn dann an keinem der beiden Kästen. `display: flow-root`
   schließt den Kasten ab. */
:is(.col-ttc, .col-otc) { display: flow-root; }
/* Der eingefangene Abstand: letztes Kind hat nichts mehr zu trennen. */
.col-ttc > :last-child,
.col-ttc > :last-child > :last-child,
.col-ttc > :last-child > :last-child > :last-child { margin-bottom: 0; }
/* ID-Stärke nötig: `#tabContainer` (1,0,0) schlägt die Kette darüber, die
   trotz dreier Pseudoklassen nur auf (0,4,0) kommt. Eine ID wiegt mehr als
   beliebig viele Klassen — Spezifität wird nicht addiert. */
.col-ttc #tabContainer:last-child { margin-bottom: 0; }

/* 2 · Der Block der drei Infoboxen, wenn er die Sektion eröffnet. */
.page-content > .ib:first-child { margin-top: 0; }

/* 3 · Trennüberschrift ganz oben verdoppelt nur das Padding. */
.page-content > .separator-headline:first-child { margin-top: 0; }

/* 4 · Allgemeiner Fall: der Abstand eines LETZTEN Kindes kann sich gegen
   nichts anderes richten als die Unterkante des Elternteils. Zwei Ebenen,
   weil Außenabstände durch padding-lose Hüllen HINDURCHFALLEN. */
.page-content > :last-child,
.page-content > :last-child > :last-child { margin-bottom: 0; }

/* 6 · Stoßen zwei Sektionen aneinander, ist EIN Abstand gemeint, nicht
   zwei. Die untere gibt ihr oberes Padding ab. */
.page-content + .page-content { padding-top: 0; }

/* 5 · Die letzte Sidebar-Box: die Sidebar ist eine NEBENSPALTE, ihr Abstand
   verlängert eine Spalte, und die Sektionshöhe folgt der höheren. */
/* `!important`, weil die Grundregel für .sidebarbox selbst eines trägt
   (Inline-Abstand aus der Vorlage) — Wichtigkeit vor Spezifität.
   NICHT `:last-child`: wo `.sidebar-separator` zwischen den Boxen steht, ist
   die letzte Box nicht letztes Kind. Die :last-child-Fassung steht als
   EIGENE Regel darunter — in einer Selektorliste würde ein ungültiger
   Selektor die ganze Regel verwerfen. */
#sidebar > .sidebarbox:not(:has(~ .sidebarbox)) { margin-bottom: 0 !important; }
#sidebar > .sidebarbox:last-child { margin-bottom: 0 !important; }

/* ---- Offene Floats einfangen -------------------------------------------
   Der Baukasten setzt sein `<div class="clear">` auf /kontakt/ an die
   falsche Stelle, der Float läuft aus dem <article> heraus.
   DAS SIEHT WIE EIN KASKADENFEHLER AUS: das Formular darunter hat
   `clear: both` und `margin-top`; der Abstand steht im Inspektor, ist nicht
   durchgestrichen — und wirkt nicht. Das ist CLEARANCE: beim Freiräumen
   setzt der Browser eine berechnete, auch NEGATIVE Strecke vor den
   Außenabstand und zehrt ihn auf. Dagegen anzuschreiben ist aussichtslos;
   man muss den Float einfangen. */
:is(article, .page-entry, .col-ttc):has(> :is(.col1-1, .col1-2, .col1-3,
    .col1-4, .col2-3, .col3-4)) {
  display: flow-root;
}

/* Erreichbarkeiten auf /kontakt/: die Zeilen waren mit geschützten
   Leerzeichen ausgerichtet — in einer Proportionalschrift unmöglich, und CSS
   kommt nicht heran (Textknoten). Ersatz-Markup in template-konflikte.md.
   Hier nur: gleiche Abstände für die beiden Zwischenüberschriften. */
:is(.col1-1, .col1-2, .col1-3, .col2-3) > .inner > strong {
  display: block;
  margin: var(--sp-5) 0 var(--sp-2);
}
:is(.col1-1, .col1-2, .col1-3, .col2-3) > .inner > strong:first-child { margin-top: 0; }
:is(.page-entry, .tabtext, .textwidget) p:empty { display: none; }

/* Eigene Klasse statt nacktem <strong>: wpautop legt ohnehin ein <p> darum. */
.hours-title {
  margin: var(--sp-5) 0 var(--sp-2);
  font-weight: 600;
}
.hours-title:first-child { margin-top: 0; }
.hours-title strong { font-weight: inherit; }

.hours {
  display: grid;
  /* FESTE erste Spalte: zwei Listen sind zwei Raster, mit `max-content`
   stünden die Wertespalten versetzt. Stellschraube --hours-col. */
  grid-template-columns: var(--hours-col, 8rem) auto;
  gap: var(--sp-2) var(--sp-4);
  margin: 0 0 var(--sp-4);
}
.hours dt { font-weight: 400; color: var(--muted); }
.hours dd { margin: 0; font-variant-numeric: tabular-nums; }

/* Lesbare Zeilenlänge nur im echten Fließtext */
:is(.page-entry, .tabtext) :is(p, li) { max-width: 42em; }

/* Versalien nur, wo sie Struktur tragen. Die NAVIGATION ist ausgenommen —
   dort waren sie der Grund, warum die Kopfleiste kräftiger wirkte. */
:is(.content-button a, a.boxbutton, .headerbox-button a, .post-more,
    .contactform button,
    .wpcf7 .wpcf7-submit, .psbutton, .pslink,
    .boxcontent h3, .cboxcontent h3, .requestformtitle) {
  text-transform: none;
}

/* Label-Rolle: klein, fett, weit gesperrt */
:is(.footer-box .footerboxtitle, .sidebarbox .widgettitle,
    .propbox .prop-location, .breadcrumb, table th) {
  font-size: var(--fs-label);
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: var(--ls-label);
  line-height: var(--lh-snug);
}

::selection { background: var(--accent); color: #fff; }


/* ===== 2b · BESTANDSBEREINIGUNG — gepunktete Rahmen =====
   31 Stellen mit 1px-#ccc-Punktrahmen, das auffälligste Alterssignal.
   Stilart und Farbe zentral umgestellt, Geometrie unangetastet. Ein
   pauschales `* { border-style: solid }` wäre gefährlich: Elemente mit
   border-width > 0 und border-style:none bekämen einen sichtbaren Rahmen. */

#tabContainer .tabtext,
.boxcontent,
.cboxcontent,
.meta-category,
.postbox,
.propbox,
.propimagewrap,
.request-list-box,
.request-single-box,
.service-list-box,
.sidebarbox,
.team-profile-data,
.team-profile-image img,
.teambox,
ul.commentlist li {
  border-style: solid;
  border-color: var(--line);
}

.bo-favlist,
.page-nav,
.postmeta {
  border-top-style: solid;
  border-top-color: var(--line);
}

#sidebar .widgettitle,
#tabContainer .tabtext h3,
#topmenu li:hover > ul > li,
#topmenu ul li,
.blog-list-box,
.favorites-list li,
.footer-box .footerboxtitle,
.headerbox-headline,
.headerbox-headline-mobile,
.pagetitle,
.propbox .propbox-separator,
.propfacts a,
.request-single-box table td {
  border-bottom-style: solid;
  border-bottom-color: var(--line);
}


/* ===== 3 · LAYOUT & RAUM =====
   Inhaltsbreite bleibt beim Bestandsmaß (1060 + 20px, content-box). */

/* Innenabstand der Inhaltsspalte auf allen Breiten; schrumpft mobil über
   --space-block von selbst. Horizontal Bestandsmaß 15px. */
.ib           { margin: var(--sp-5) 0 var(--space-block); }

/* Seitentitel auf die Raumskala. Der Innenabstand gibt dem Trennstrich Luft
   und löst auf der Objektseite die Überschneidung mit .propicons. */
.pagetitle { margin: 0 0 var(--sp-5); padding-bottom: var(--sp-3); }

/* Die Objektübersicht verschachtelt .page-content in .page-content —
   die innere darf das Außenmaß nicht ein zweites Mal aufschlagen. */
.page-content .page-content { padding: 0; }

/* homepage.php gibt die Hüllen für Team- und Blog-Box immer aus, den Inhalt
   nur bei aktivem Modul — zwei leere .page-content, die trotzdem Abstand
   reservieren. Selbstheilend, sobald ein Modul aktiviert wird. */
.page-content:not(:has(*)) { padding: 0; }

/* Sektionsabstand aus EINER Quelle: der Seiteneditor setzt auf .ctacontainer
   ein Inline-`padding:80px 0`, zusammen mit .inner-section verdoppelt.
   → Fall a. */
.homepage-section .inner-section { padding: 0; }
.ctacontainer { padding: var(--space-section) 0 !important; }

/* ---- Der Inline-Außenabstand der CTA-Wrapper ---------------------------
   Die Vorlagen schreiben `style="margin:<X>px 0 !important"` in die Seite.
   Inline-!important schlägt jede Stylesheet-Regel; kompensieren ginge nur
   mit negativem --space-section.
   `display: contents` löst es anders: der Wrapper erzeugt gar keinen Kasten
   mehr — was es nicht gibt, hat auch keinen Außenabstand.
   WER DEM WRAPPER SPÄTER EINE FLÄCHE GIBT, MUSS DIESE REGEL ENTFERNEN.
   Sauber bleibt: die drei Werte in den Theme-Optionen auf 0. */
.col-full.cb.ct { display: contents; }

/* Der Seiteneditor schreibt in cta3 ein `style="margin:-25px 0 0 30px"`.
   `!important` ist PFLICHT: gegen einen Inline-Style verliert jede Regel
   ohne, egal wie spezifisch. Der linke Einzug bleibt, nur die vertikale
   Verschiebung fällt. */
.ctacontainer .columns :is(.col1-2, .col2-3, .col3-4) > .inner > div[style*="margin"] {
  margin-top: 0 !important;
  margin-bottom: 0 !important;
}

.separator-headline { margin: var(--space-block) 0 var(--sp-5); }
.separator-headline > span::before,
.separator-headline > span::after { height: 1px; background: var(--line); }
.separator-headline h4 { font-size: var(--fs-h2); }

hr { height: 1px; background: var(--line); margin: var(--space-block) 0 var(--sp-5); }

/* Info-Boxen: Float-Reihe → Grid. :has() als Wächter; fällt es aus,
   entfallen Container- und Kindregel gemeinsam und das Float-Layout
   bleibt intakt. */
.ib:has(> .col-otc) {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
  gap: var(--gap-grid);
}
.ib:has(> .col-otc) > .col-otc { width: auto; margin: 0; float: none; display: flex; }
.ib:has(> .col-otc) > .clear   { display: none; }


/* ===== 4 · KOPFBEREICH ===== */

.topline {
  background: var(--topbar);
  border-bottom: 1px solid var(--line);
  padding: var(--sp-2) 0;
}
/* Obere Leiste leichter als das Hauptmenü — sie ist Nebennavigation. */
.topline-menu ul li {
  font-size: var(--fs-meta); font-weight: 500;
  text-transform: uppercase; letter-spacing: .03em;
}
.topline-data span  { font-size: var(--fs-meta); color: var(--ink-3); }
:is(.topline-menu ul li a, .topline-content a) { color: var(--ink-3); }
.topline-data span i { color: var(--accent); }

#header { border-bottom: 1px solid var(--line); }
.logo { padding: var(--header-y) 0; }

@media (min-width: 1025px) {
  #header {
    position: sticky; top: 0; z-index: 10050;   /* .slidercontent liegt auf 10003 */
    background: rgba(255, 255, 255, .92);
    -webkit-backdrop-filter: saturate(180%) blur(14px);
    backdrop-filter: saturate(180%) blur(14px);
  }

  /* Versalien wie im Bestand. Die Laufweite ist empirisch die größte, die noch
   hineinpasst: .02em mit 11px hält von 1040 bis 1600px einzeilig. */
  #topmenu ul li   {
    font-size: var(--fs-menu); font-weight: 700;
    text-transform: uppercase; letter-spacing: .02em;
  }
  #topmenu ul li a {
    padding: calc(var(--header-y) + 15px) 11px calc(var(--header-y) + 20px);
    color: var(--ink-3);
    transition: color var(--dur) var(--ease);
  }
  /* Aktiver Punkt: 2px Unterstrich in Rot statt reinem Farbwechsel */
  #topmenu > ul > li > a::after {
    content: ""; position: absolute; left: 11px; right: 11px;
    bottom: calc(var(--header-y) + 12px);
    height: 2px; background: var(--accent);
    transform: scaleX(0); transform-origin: left;
    transition: transform var(--dur) var(--ease);
  }
  #topmenu > ul > li:is(:hover, .current-menu-item, .current_page_parent,
                        .current_page_ancestor) > a::after { transform: scaleX(1); }

  #topmenu ul ul {
    border: 1px solid var(--line);
    border-radius: var(--r-card);
    box-shadow: var(--e-float);
    overflow: hidden;
    padding: var(--sp-1) 0;
  }
  #topmenu li:hover > ul > li { border-bottom: none; height: auto; }
  /* Das Theme setzt `#topmenu ul ul li a` (1,1,1) auf feste 13px und schlägt
   damit die Größe am <li>. */
  #topmenu ul ul li a { padding: var(--sp-3) var(--sp-5); font-size: var(--fs-small); }
  #topmenu ul ul li:hover { background: var(--tint); }

  /* 1025–1199px ist .header-right zu schmal für die volle Menügröße — ohne
   Straffung bricht die Leiste zweizeilig. */
  @media (max-width: 1199px) {
    #topmenu ul li   { font-size: var(--fs-small); }
    #topmenu ul li a { padding: calc(var(--header-y) + 15px) 9px calc(var(--header-y) + 20px); }
    #topmenu > ul > li > a::after { left: 9px; right: 9px; }
  }
}

/* Mobile Filterleiste: das Theme zeigt nur ein Symbol ohne Beschriftung,
   damit ist nicht erkennbar, dass ein Tippen die Suche aufklappt.
   BREAKPOINT 834, nicht 1024 — mobile.css legt die Klappmechanik nur dort
   an; auf 1024 stand der Knopf über einer ohnehin offenen Leiste. */
@media (max-width: 834px) {
  .immotax .mobileselect {
    display: flex; align-items: center; justify-content: space-between;
    box-sizing: border-box;
    min-height: var(--btn-h);
    padding: 0 var(--sp-4);
    background: var(--soft);
    border: 1px solid var(--line);
    border-radius: var(--r-btn);
    color: var(--ink-3);
    font-size: var(--fs-small); font-weight: 600; letter-spacing: .02em;
    text-align: left;
    cursor: pointer;
  }
  .immotax .mobileselect::before { content: var(--filter-label); }
  .immotax .mobileselect i { font-size: 1.25rem; color: var(--accent); }

  /* ---- Der halb offene Filter beim Erstaufruf ----------------------------
   Zwei Mechaniken für dieselbe Klappe, die sich widersprechen:
   mobile.css schließt über die HÖHE (`height: 0` lässt Innenabstand und
   Rahmen stehen — 34px Streifen), die Vorlage über die ANZEIGEART
   (`.toggle()` liest den aktuellen display-Wert, der auf `block` steht, und
   SCHLIESST deshalb beim ersten Klick).
   Beide müssen auf dieselbe Eigenschaft. Die Hover-Regel fällt ersatzlos:
   auf Touchgeräten gibt es kein Hover, mit Maus klappte der Filter beim
   Darüberfahren auf. */
  .immotax .immo-mobiletoggle {
    display: none;
    height: auto;
    visibility: visible;
    margin-top: 0 !important;   /* → Theme-Regel mit !important, Fall c */
  }
  .immotax:hover .immo-mobiletoggle { height: auto; }

  /* UND ES SIND ZWEI SKRIPTE: die Vorlage toggelt `.hbox-taxsearch`,
   js/script.js zusätzlich das <form> darin. Beide lesen display — bei
   verschiedenen Ausgangszuständen laufen sie gegeneinander. */
  .immotax .hbox-taxsearch form.taxonomy-drilldown-dropdowns { display: none; }
}

/* --- iOS zoomt bei Feldern unter 16px hinein -----------------------------
   Safari auf dem iPhone vergrößert die Seite automatisch, sobald ein
   Eingabefeld mit einer Schriftgröße UNTER 16px den Fokus bekommt — und
   zoomt danach nicht wieder heraus. Die Seite bleibt leicht vergrößert und
   lässt sich seitlich verschieben; das sieht aus wie ein Layoutfehler, ist
   aber keiner. Alle Felder standen auf 15px.
   Der Ausweg über `maximum-scale=1` im Viewport wäre der falsche: er nimmt
   allen Nutzern das Zoomen. 16px im Feld kostet nichts und löst es an der
   Ursache. Nur mobil — auf dem Desktop bleibt die Skala bei 15px. */
@media (max-width: 834px) {
  :is(.contactform, .wpcf7, .sidebarbox, .hbox-taxsearch) :is(
      input:not([type="submit"]):not([type="button"]):not([type="checkbox"]):not([type="radio"]),
      textarea, select) {
    font-size: 16px;
  }
}

/* Formularfelder mobil je eine eigene Zeile; das Theme stellt sie in zwei
   gefloatete .formcolumn zu je 48 %. */
@media (max-width: 834px) {
  .contactform .formcolumn,
  .wpcf7 .formcolumn {
    float: none;
    width: 100%;
  }
}

/* PADDING, nicht margin: aneinandergrenzende Ränder VERSCHMELZEN zum
   größeren statt sich zu addieren — ein margin-top war wirkungslos. */
@media (max-width: 1024px) {
  #sidebar { padding-top: var(--space-block); }
}

/* Mobiles Menü: mobile.css regiert ab 1024px abwärts, Korrektur in dieselbe Query. */
@media (max-width: 1024px) {
  /* Burger: drei 2px-Striche statt 5px-Balken. Die Dreh-Animation bleibt Theme. */
  /* Der Kasten saß zu hoch: `top: 5px` plus negative Ränder aus dem Theme. */
  /* `top: 50%` setzt voraus, dass der BEZUGSKASTEN so hoch ist wie das, worin
   zentriert werden soll. `.mobilebutton` liegt in `#topmenu` (60px), der
   Kopf ist 90px — daher 15px zu hoch; beim Öffnen wächst #topmenu auf 373px
   und der Knopf wandert mitten ins Menü.
   `top: 0; bottom: 0` spannt #topmenu auf die Höhe von #header auf.
   `pointer-events`: der nun höhere, unsichtbare Nav-Kasten würde sonst über
   dem rechten Kopfbereich Klicks schlucken. */
  #topmenu {
    top: 0; bottom: 0;
    pointer-events: none;
  }
  #topmenu > * { pointer-events: auto; }
  /* `#head-mobile` ist leer, liegt aber über den rechten zwei Dritteln des
   Logos — die Logoverlinkung war dort nicht anklickbar (Bestandsfehler). */
  #head-mobile:empty { pointer-events: none; }
  .mobilebutton {
    top: 50%;
    margin-top: 0;
    transform: translateY(-50%);
  }
  .mobilebutton::before {
    top: 16px; right: 22px;
    width: 22px; height: 2px;
    background: var(--ink-3);
    border-radius: 1px;
  }
  .mobilebutton::after {
    top: 23px; right: 22px;
    width: 22px; height: 5px;
    border-top: 2px solid var(--ink-3);
    border-bottom: 2px solid var(--ink-3);
    border-radius: 1px;
  }
  .mobilebutton.menu-opened::before,
  .mobilebutton.menu-opened::after {
    top: 23px; right: 22px;
    width: 21px; height: 2px;
    background: var(--ink-3);
    border: 0;
  }

  #topmenu ul {
    border-bottom: none;
    border-radius: 0 0 var(--r-card) var(--r-card);
    box-shadow: var(--e-float);
    padding: var(--sp-2) 0 var(--sp-3) 15px;
  }
  #topmenu ul li      { border-bottom: 1px solid var(--line-2); }
  #topmenu ul li a    { padding: var(--sp-4) 15px; font-size: var(--fs-body); }
  #topmenu ul ul li a { padding: var(--sp-3) 15px var(--sp-3) 28px; }
  #topmenu ul li:is(.current-menu-item, .current_page_item) > a {
    font-weight: 700; color: var(--accent);
  }
}

/* Breadcrumb-Leiste war ein dunkles Vollband und damit das schwerste Element. */
.pagetop {
  background: var(--topbar);
  border-bottom: 1px solid var(--line);
  padding: var(--sp-3) 0;
}
/* ---- Brotkrumen: der Seitentitel fliegt raus ---------------------------
   DER HAKEN SIND DIE TRENNZEICHEN: die Vorlage schreibt die „>" zwischen die
   <span>-Glieder als nackte TEXTKNOTEN, für CSS nicht adressierbar — wer nur
   das letzte <span> ausblendet, behält ein freies „>" am Zeilenende.
   Deshalb der Umweg über die Schriftgröße: Leiste auf 0, Glieder zurück, und
   das Trennzeichen als ::before am Glied selbst. */
/* SPEZIFITÄT: die Label-Regel oben führt `.breadcrumb` in einem :is(), das
   (0,2,0) erreicht. Über `.pagetop` kommt diese Regel selbst auf (0,2,0). */
.pagetop .breadcrumb { color: var(--muted-2); font-size: 0; }
.breadcrumb > span {
  font-size: var(--fs-label);
  letter-spacing: var(--ls-label);
}
/* Den Seitentitel nur weglassen, wenn ein PFAD übrig bleibt — bei zwei
   Gliedern stünde sonst ein einzelner Punkt, und das ist kein Pfad. */
.breadcrumb > span:last-of-type:not(:nth-of-type(2)) { display: none; }
.breadcrumb > span:not(:first-of-type)::before {
  content: "\203A";
  margin: 0 var(--sp-2);
  /* Das Trennzeichen stand auf einer RAHMENfarbe (1,4:1). Linien dürfen
   zurücktreten, ein Schriftzeichen muss gelesen werden. */
  color: var(--muted-2);
  font-size: 1.15em;
  vertical-align: baseline;
}

/* Ausnahme Übersichtsseiten: dort ist das zweite Glied der Seitentitel
   selbst — zugleich aber die KATEGORIEEBENE, auf die die Objektseiten
   verweisen. Es bleibt stehen, mit der kurzen Beschriftung aus
   --crumb-self. Wer die Ausnahme nicht will, löscht diesen Block. */
.page-id-11 { --crumb-self: "Immobilien"; }
.page-id-13 { --crumb-self: "Referenzen"; }

:is(.page-id-11, .page-id-13) .breadcrumb > span:last-of-type [property="name"] {
  font-size: 0;   /* verbirgt den langen Titel, ohne ihn aus dem
                     Markup zu nehmen — die strukturierten Daten bleiben. */
  /* letter-spacing MUSS mit auf 0: absolute Länge, wird pro Zeichen addiert
     auch bei Schriftgröße 0. */
  letter-spacing: 0;
}
:is(.page-id-11, .page-id-13) .breadcrumb > span:last-of-type [property="name"]::after {
  content: var(--crumb-self);
  font-size: var(--fs-label);
  letter-spacing: var(--ls-label);
  color: var(--muted-2);
}
.breadcrumb a { color: var(--muted); transition: color var(--dur) var(--ease); }
.breadcrumb a:hover { color: var(--accent); text-decoration: none; }

.slogan {
  background: transparent;
  border-top: none;
  border-bottom: 1px solid var(--line);
  margin: 0;
  /* Das Band trägt eine Zeile: Blockmaß statt Sektionsmaß. */
  padding: var(--space-block) 0;
}
.slogan h1 { font-size: var(--fs-h2); }   /* h1-Stufe wirkte hier zu groß */



/* ===== 5 · HERO (nur Startseite) =====
   Die Copy sitzt auf einem hellen PANEL, nicht auf dem Bild — dunkler Text
   auf hellem Grund ist motivunabhängig lesbar. Neu sind Milchglas statt
   deckendem Weiß, Radius, Lichtkante und die Position rechts.
   Der frühere Verlauf ist entfallen, mit ihm `overflow: hidden` auf
   .image-wrapper, das nur seine Begrenzung war. */

.image-wrapper { position: relative; }

/* Nur die Startseite: auf der Objektdetailseite gibt es ebenfalls eine
   .slideshow (Galerie), die nicht beschnitten werden darf. */
.home .slideshow img {
  aspect-ratio: var(--hero-ratio);
  object-fit: cover;
  width: 100%; height: auto;
}

@media (min-width: 1025px) {
  .home .slidercontent {
    top: 50%; transform: translateY(-50%);
    left: 0; right: 0;
    max-width: calc(var(--content-max) + 2 * var(--content-gutter));
    margin: 0 auto;
    padding: 0 var(--content-gutter);
    box-sizing: border-box;
    text-align: left;
  }
  /* Panel RECHTS wie im Bestand — bei allen fünf Slider-Motiven steht das
   Gebäude links im Bild. */
  /* 28rem: schmalster Wert, bei dem Überschrift und Absatz noch halten. */
  .home .boxwrap { max-width: 28rem; margin-left: auto; }
  /* DIE DECKKRAFT IST EINE UNTERGRENZE. Gegen den ungünstigsten Fall
   gerechnet (Panel über schwarzem Bildbereich): 0,82 → 11,8:1 ·
   0,70 → 8,5:1 (hier) · 0,58 → 5,9:1 (Minimum). Wer weiter aufmacht, muss
   den Text mitdunkeln. */
  .home .headerbox {
    background: rgba(255, 255, 255, .70);
    -webkit-backdrop-filter: saturate(170%) blur(26px);
            backdrop-filter: saturate(170%) blur(26px);
    border: 1px solid rgba(255, 255, 255, .5);   /* Lichtkante am Glas */
    border-radius: var(--r-card);
    box-shadow: 0 10px 34px rgba(26, 22, 20, .16);
    width: auto;
    padding: var(--sp-6);
    line-height: var(--lh-text);
  }
  .home .headerbox-headline {
    font-size: var(--fs-hero);
    line-height: var(--lh-tight);
    letter-spacing: var(--ls-hero);
    color: var(--ink);
    border-bottom: none;
    padding: 0;
    margin: 0 0 var(--sp-4);
  }
  .home .headerbox-content { margin: 0; }
  /* SATZBILD: Überschrift lief auf 62–69 % der Panelbreite, der Absatz auf
   76–99 % — das Auge liest zwei Spaltenbreiten in einem Kasten. 42ch und
   Trennung aus ergeben 66–75 %, also dasselbe Maß wie die Überschrift. */
  /* --ink-2, nicht --muted: im ungünstigsten Fall liegt --muted bei 2,9:1.
   Im Hero ist die Copy Primärinhalt, nicht Beiwerk. */
  .home .headerbox-text p {
    max-width: 42ch;
    hyphens: manual;
    color: var(--ink-2);
    font-size: var(--fs-lead);
  }
  .home :is(.headerbox-content ul li, .headerbox-content ul li a) {
    color: var(--ink-2);
  }
  /* sp-5 statt sp-6: der Innenabstand des Panels addiert sich darunter */
  .home .headerbox-button { display: inline-block; width: auto; margin: var(--sp-5) 0 0; }
}

/* Mobil ist die Kopfbox immer offen. Das Theme klappt sie über `:hover` auf —
   auf Touchgeräten ist „hover" ein Antippen, der Inhalt war hinter einer
   Interaktion versteckt, die niemand erwartet. */
@media (max-width: 1024px) {
  .headerbox .mobiletoggle {
    height: auto;
    visibility: visible;
    /* `!important` nötig: templates/infotextbox.php schreibt beim Klick ein
       INLINE `display: none`. → Fall b. */
    display: block !important;
  }

  /* Drei Theme-Regeln setzen den Pfeil, alle (0,2,0) — deshalb dreifach. */
  .headerbox-headline::after,
  .headerbox-headline.mobhead::after,
  .headerbox-headline.starthead::after { content: none; }

  /* mobile.css gibt `.headerbox:hover` 15px Kopfabstand. Bei offener Box ist
     das ein Sprung, sobald der Zeiger sie berührt. */
  .headerbox:hover :is(.taxsearch, .headerbox-text) { margin-top: 0; }

  /* Der Button saß bündig an der Unterkante — das Theme gibt nur `padding: 0 10px`. */
  .headerbox { padding-bottom: var(--sp-5); }
}

/* 481–1024px: Kasten bleibt, nur ruhiger gestaltet */
@media (min-width: 481px) and (max-width: 1024px) {
  .headerbox {
    background: rgba(255, 255, 255, .94);
    -webkit-backdrop-filter: saturate(160%) blur(14px);
    backdrop-filter: saturate(160%) blur(14px);
    border-radius: var(--r-card);
    box-shadow: var(--e-float);
    overflow: hidden;
  }
}
.headerbox-headline { border-bottom: 1px solid var(--line); font-size: var(--fs-h2); }

/* Der Hero-Text trägt ein Inline-`line-height: 1.8em` aus dem Seiteneditor.
   Einzige Stelle, an der ein Inhaltswert der Skala widerspricht. */
:is(.headerbox-text, .headerbox) p { line-height: var(--lh-text) !important; }

/* Slider-Pfeile als CSS-Form gezeichnet: die Fontello-Glyphe sitzt in ihrer
   Em-Box hoch, damit ist sie nicht exakt zentrierbar. */
:is(.cycle-prev, .cycle-next) > i { display: none; }
:is(.cycle-prev, .cycle-next)::before {
  content: "";
  width: .5rem; height: .5rem;
  border-right: 2px solid currentColor;
  border-bottom: 2px solid currentColor;
  border-radius: 1px;
}
.cycle-prev::before { transform: rotate(135deg); margin-left: 3px; }
.cycle-next::before { transform: rotate(-45deg); margin-right: 3px; }

:is(.cycle-prev, .cycle-next) {
  width: 36px; height: 36px; padding: 0;
  display: grid; place-items: center;
  border-radius: var(--r-card);
  background: rgba(255, 255, 255, .86);
  -webkit-backdrop-filter: blur(8px); backdrop-filter: blur(8px);
  color: var(--ink);
  font-size: 15px; line-height: 1;
  box-shadow: var(--e-rest);
  opacity: 0; pointer-events: none; z-index: 10004;
  transition: opacity var(--dur) var(--ease), background var(--dur) var(--ease);
}
.cycle-prev { left: var(--sp-5); }
.cycle-next { right: var(--sp-5); }
/* `display: grid` muss auch im Hover gelten — das Theme setzt dort
   `display: block` mit (0,2,0), ohne Grid greift place-items nicht. */
.image-wrapper:hover :is(.cycle-prev, .cycle-next) {
  display: grid; opacity: 1; pointer-events: auto;
}
:is(.cycle-prev, .cycle-next):hover { background: #fff; }


/* ===== 6 · PANELS =====
   Ein Rezept für alle Flächen: Rahmen trägt, Schatten hebt minimal ab. */

:is(.boxcontent, .cboxcontent, .sidebarbox, .propbox, .hbox-taxsearch,
    .propimagewrap) {
  /* Der Theme-Reset kennt kein border-box; ohne das schlägt Padding auf die Breite. */
  box-sizing: border-box;
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: var(--r-card);
  box-shadow: var(--e-rest);
}
:is(.boxcontent, .cboxcontent, .propbox) {
  transition: border-color var(--dur) var(--ease), box-shadow var(--dur) var(--ease);
}
:is(.boxcontent, .cboxcontent, .propbox):hover {
  border-color: var(--line-3);
  box-shadow: var(--e-hover);
}

/* --- Info-Boxen: zentriert, mit gefülltem Button ------------------------ */
:is(.boxcontent, .cboxcontent) {
  width: 100%;
  display: flex; flex-direction: column;
  text-align: center;
  padding: var(--sp-6) var(--sp-5) var(--sp-5);
}
/* Die getönte Kachel sitzt auf dem <i>, nicht auf ::before — dort liegt das
   Symbol. Maße in rem, damit das inline gesetzte font-size aus dem
   Icon-Shortcode sie nicht verschiebt. */
.boxcontent .info-icon i,
.boxcontent :is([class^="icon-"], [class*=" icon-"]) {
  display: inline-grid; place-items: center;
  width: var(--ico-tile); height: var(--ico-tile);
  border-radius: var(--r-card);
  background: var(--tint);
  color: var(--accent);
  margin: 0 0 var(--sp-4);
}
.boxcontent .info-icon i::before,
.boxcontent :is([class^="icon-"], [class*=" icon-"])::before {
  width: var(--ico-glyph); height: var(--ico-glyph);
  vertical-align: 0;
  color: inherit;   /* schlägt colors.css bei gleicher Spezifität durch Position */
}
:is(.boxcontent, .cboxcontent) h3 {
  color: var(--ink);
  margin: 0 0 var(--sp-2) !important;   /* Theme setzt hier !important */
  padding: 0 !important;
}
:is(.boxcontent, .cboxcontent) p { font-size: var(--fs-small); }
.boxcontent .boxtext { flex: 1 1 auto; display: flex; flex-direction: column; }
.boxcontent .boxtext p { flex: 1 1 auto; margin-bottom: 0; }
.boxcontent > .clear { display: none; }

/* Sidebar-Box (8 von 11 Seiten). Die Boxen tragen Inline-padding und
   -margin aus dem Template; der Abstand sitzt auf der Box, damit jeder
   Inhaltstyp ihn erbt. → Fall b. */
.sidebarbox {
  padding: var(--sp-5) !important;
  margin: 0 0 var(--space-block) !important;
  overflow: hidden;
}
/* ID-Spezifität: das Theme setzt `#sidebar .widgettitle` (1,1,0), eine
   Klassenregel verliert dagegen. */
#sidebar .sidebarbox .widgettitle,
.sidebarbox .widgettitle {
  color: var(--muted-2);
  /* Titel, nicht Eyebrow: im Bestand 15,8px. Auf Label-Größe herabgestuft
     wirkte er deutlich kleiner als vorher. */
  font-size: var(--fs-boxtitle);
  margin: calc(var(--sp-5) * -1) calc(var(--sp-5) * -1) var(--sp-5);
  padding: var(--sp-4) var(--sp-5);
  border-bottom: 1px solid var(--line);
}
.sidebarbox img   { border-radius: var(--r-img); }

/* ---- Bestandsfehler: leeres Angebots-Widget, Weißfläche unter dem Footer
   /leistungen/ war beim ersten Aufruf 6706px hoch, Footer endet bei 2616 —
   4090px Weißfläche, Widget leer, beides weg nach einmal Scrollen.
   URSACHE: cycle2 mit `data-cycle-loader="wait"` PARKT seine Slides am
   <body>, um sie zu vermessen; dort liegen sie tausende Pixel unterhalb des
   Sichtfelds, und WordPress hat den Bildern `loading="lazy"` verpasst — der
   Browser lädt nicht, cycle2 wartet ewig.
   KORREKTUR: geparkte Slides an den oberen Bildschirmrand. NICHT
   `display: none` (verhindert das Laden) und keine Größenänderung (cycle2
   vermisst sie geparkt). Hebt sich selbst auf, sobald cycle2 sie einräumt.
   Eigentlicher Ort der Reparatur: `data-cycle-loader` aus dem Widget. */
body > div:has(> a > img.attachment-prop-box-thumb) {
  position: fixed;
  top: 0; left: 0;
  z-index: -1;
  opacity: 0;
  pointer-events: none;
}

/* Karte und Anfrageformular füllen ihre Box; `overflow: hidden` beschneidet
   sie auf die Rundung. */
.sidebarbox:has(#map-canvas),
.sidebarbox:has(> .requestformtitle) {
  padding: 0 !important;   /* dieselbe Begründung wie oben: Inline-Style
                              aus dem Template, siehe Fall b */
}
/* Der Innenabstand gehört auf die Ebene MIT dem Hintergrund — sonst entsteht
   eine eingesetzte Insel in der weißen Box. */
.sidebarbox:has(> .requestformtitle) > .requestform { padding: 0; }
/* templates/single-contact.php setzt hier alles inline (margin, padding,
   width) — deshalb `!important`. `width: auto` statt 100%: bei border-box
   füllt ein Block damit seinen Elternteil. → Fall b. */
.sidebarbox .contactform {
  box-sizing: border-box;
  width: auto !important;
  /* Waagerecht knapper als senkrecht: in einer 336px-Spalte nehmen 24px
     beidseitig den Feldern ein Siebtel der Breite. */
  padding: var(--sp-5) var(--sp-4) !important;
}

/* ---- Die zweite Kontaktbox der Sidebar auf dieselbe Bauform ------------
   Die beiden kommen aus zwei Systemen: Objektseite = Vorlagenausgabe des
   Themes mit eigenem Formular und verstecktem Objektbezug, Leistungen = ein
   Text-Widget mit CF7-Shortcode. CSS kann sie nicht zu demselben Formular
   machen, wohl aber zu derselben BOX. */
.sidebarbox:has(> .textwidget .wpcf7) {
  padding: 0 !important;   /* → Fall b: Inline-Style aus der Vorlage */
  overflow: hidden;        /* beschneidet Titelleiste auf die Boxrundung */
}
/* ID-Spezifität: der Titel trägt oben negative Ränder, die ein Boxpadding
   aufheben sollen — das es hier nicht mehr gibt. */
#sidebar .sidebarbox:has(> .textwidget .wpcf7) > .widgettitle {
  /* box-sizing ist Pflicht, nicht Feinschliff: das Theme gibt beiden Ebenen
     `width: 100%` bei content-box. */
  box-sizing: border-box;
  width: 100%;
  margin: 0;
  padding: var(--sp-4) var(--sp-5);
  background: var(--accent);
  color: #fff;
  border: 0;
  font-size: var(--fs-small); font-weight: 600; letter-spacing: .04em;
  text-transform: none;
}
.sidebarbox:has(> .textwidget .wpcf7) > .textwidget {
  box-sizing: border-box;
  width: 100%;
  background: var(--soft);
  padding: var(--sp-5) var(--sp-4);
  text-align: left;
}
/* Volle Breite nur für EINGABEfelder — ein `input` ohne Typfilter erwischt
   auch die Checkbox. */
.sidebarbox:has(> .textwidget .wpcf7) :is(
    input:not([type="submit"]):not([type="checkbox"]):not([type="radio"]),
    textarea, select) { width: 100%; box-sizing: border-box; }
.sidebarbox:has(> .textwidget .wpcf7) .wpcf7-submit { width: 100%; }
/* Das Theme zieht CF7-Checkboxen mit `margin-left:-35px` aus der Zeile. */
.sidebarbox .wpcf7-acceptance input[type="checkbox"] {
  float: none; width: auto; margin: 0 var(--sp-2) 0 0;
}
.sidebarbox .wpcf7-acceptance .wpcf7-list-item { margin: 0; }
.sidebarbox .wpcf7-acceptance label {
  display: flex; align-items: flex-start; gap: var(--sp-2);
}

/* Die Formularfläche stand auf #f0f1f6 — der einzige kalte Ton der Seite. */
.sidebarbox .contactform { background: var(--soft); }

/* Widget-Titel ohne negative Ränder: sie heben ein Padding auf, das es hier nicht gibt. */
.sidebarbox:has(#map-canvas) > .widgettitle,
.sidebarbox:has(> .requestformtitle) > .widgettitle { margin: 0; }

/* Anfrageformular ist offen, der Aufklapppfeil hätte nichts mehr zu tun.
   `!important`, weil das Theme-Skript beim Klick inline display setzt. */
.requestform { display: block !important; }
.openrequestform { display: none; }
.requestformtitle { cursor: default; }

/* Überschriften in der Sidebar auf Textgröße — sie gliedern, sie rufen nicht. */
#sidebar h3 { font-size: 1em; }

/* Slider „Neueste Angebote": die Bildgröße `prop-box-thumb` wurde per
   add_image_size NIE registriert, WordPress liefert die Originaldatei und
   die Slidehöhen schwankten. Festes Verhältnis plus `object-fit: cover`,
   Ausschnitt aus der Mitte. Selektor auf (0,1,2) wie im Theme. */
.slideprops div img {
  aspect-ratio: var(--ratio-thumb);
  object-fit: cover;
  object-position: center;
  width: 100%;
  height: auto;
  border-radius: var(--r-img);   /* das Theme setzt hier 2px und schlug mit
                                    (0,1,2) die Sidebar-Regel */
}
.sidebarbox p     { font-size: var(--fs-small); }
.sidebarbox ul li { line-height: var(--lh-text); }
.sidebarbox :is(.wpcf7-form, .textwidget) { margin: 0; padding: 0; width: 100%; }
/* getrennt, weil eine ID in einer :is()-Gruppe deren Spezifität auf ID-Stärke
   hebt — siehe Hinweis bei den Buttons. */
.sidebarbox #searchform { margin: 0; padding: 0; width: 100%; }

/* --- Akkordeon (Über uns) ---------------------------------------------- */
/* Aufklapper, die keine mehr sind: das Child-CSS hält `.toggle-more` offen.
   Pluszeichen und Zeigerhand versprachen eine Aktion, die es nicht gibt. */
.toggle-box { margin: var(--space-block) 0; max-width: none; }

.toggle-headline {
  background: var(--soft);
  border: 1px solid var(--line);
  border-radius: var(--r-card);
  padding: var(--sp-3) var(--sp-4);
  margin: var(--sp-5) 0 0;          /* Abstand ZWISCHEN den Gruppen */
}
.toggle-box > .toggle-headline:first-child { margin-top: 0; }

.toggle-headline h2 {
  font-size: var(--fs-h3);
  cursor: default;
}
/* Das Pluszeichen bleibt als Gliederungsmarke. Das Theme setzt es als
   `float: left` — ein Float bildet eine eigene Zeilenbox und richtet sich
   NICHT an der Grundlinie aus; als Flex-Element sitzt es mittig. */
.toggle-headline h2 {
  display: flex; align-items: center; gap: var(--sp-3);
}
.toggle-headline h2::before {
  float: none;
  margin-right: 0;
  font-size: 1.15em;
  line-height: 1;
  color: var(--accent) !important;   /* → Fall d: Child-CSS mit höherer Spezifität */
}
.toggle-box, .toggle-headline, .toggle-headline * { cursor: default; }

.toggle-more {
  border: 1px solid var(--line);
  border-radius: var(--r-card);
  padding: var(--sp-4) var(--sp-5);   /* waagerecht bündig mit dem Kopf + 1 Stufe */
  margin-top: var(--sp-2);
}

.foerderung {
  background: var(--tint);
  border: 1px solid rgba(138, 34, 55, .12);
  border-radius: var(--r-card);
  padding: var(--sp-5);
}
.foerderung p {
  color: var(--ink); background: none; text-shadow: none;
  -webkit-background-clip: border-box; background-clip: border-box;
}


/* ===== 7 · IMMOBILIENKARTEN =====
   Float-Raster → Grid. Auf der Archivseite gibt es ZWEI verschachtelte .pl;
   der :has()-Wächter trifft nur die kartenführende.
   Gleiche Kartenhöhe und gemeinsame Grundlinie entstehen über das
   Zeilenbudget — ohne das wandert der Preis um bis zu 74px. */

.pl-home:has(> [class^="col-"]),
.pl:has(> [class^="col-"]) {
  display: grid;
  /* 300px statt 270: bei ~900px Breite entstanden sonst drei schmale Karten
     mit umbrechender Angabenzeile. */
  grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
  gap: var(--gap-grid);
}
.pl-home:has(> [class^="col-"]) > [class^="col-"],
.pl:has(> [class^="col-"]) > [class^="col-"] {
  width: auto; margin: 0; float: none; display: flex;
}
.pl-home:has(> [class^="col-"]) > .clear,
.pl:has(> [class^="col-"]) > .clear { display: none; }
/* UND DIE CLEARFIX-PSEUDOELEMENTE GLEICH MIT: `::before`/`::after` mit
   `content: " "` sind erzeugte Boxen — und in einem Grid-Container sind
   erzeugte Boxen GRID-ITEMS. Auf der Merkliste belegte `::before` die erste
   Zelle. Wo ein Float-Layout zu Grid wird, muss der Clearfix mit weg. */
.pl:has(> [class^="col-"])::before,
.pl:has(> [class^="col-"])::after { display: none; }

:is(.pl, .pl-home) .propbox { width: 100%; }
/* Im Archiv umschließt ein <a> die ganze Karte; inline würde es die
   randlose Bildkante stören. */
.pl .propbox > a { display: block; }

.propbox {
  padding: var(--space-card);
  overflow: hidden;
}

/* Bild randlos. Die Selektoren müssen (0,3,0) erreichen wie
   `.pl .propbox .propthumb` im Theme. */
.propbox .propthumb,
.pl .propbox .propthumb,
.pl-home .propbox .propthumb {
  margin: calc(var(--space-card) * -1) calc(var(--space-card) * -1) var(--sp-4);
  border: none; border-radius: 0;
}
/* Startseite und Archiv bauen die Karte verschieden: hier ist .propthumb
   direktes Kind von .propbox und damit Flex-Element. `> * {flex:0 0 100%}`
   bindet seine Breite dann an die INHALTSbreite und der randlose Überstand
   verpufft — die Basis muss ihn mitrechnen. `align-self` hilft nicht, die
   Breite ist hier die HAUPTachse. */
.propbox > .propthumb { flex: 0 0 calc(100% + 2 * var(--space-card)); }

.propbox .propthumb img {
  aspect-ratio: var(--ratio-thumb);
  object-fit: cover;
  transition: transform 450ms var(--ease);
}
.propbox:hover .propthumb img { transform: scale(1.025); }

/* Badges — kleine Radien, keine Pillen */
/* ---- Merkliste ---------------------------------------------------------
   Drei strukturelle Ursachen: die Vorlage legt Einleitung und Liste in ZWEI
   .page-content; `.bo-favlist` bringt aus dem Theme ein eigenes Maßsystem
   mit; und die beiden Schaltflächen sind nach links und rechts gefloatet.
   Der Kasten wird flachgelegt und zur Werkzeugzeile — kein neues Markup,
   die Flexbox ordnet die vorhandenen Kinder. */
.bo-favlist {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--sp-3);
  margin: 0;
  padding: 0;
  border-top: none;   /* überschreibt die Bestandsbereinigung oben */
}
.bo-favlist > .clear { display: none; }
/* Das Raster bricht als Ganzes in die nächste Zeile. */
.bo-favlist > .pl { flex: 1 1 100%; margin: var(--sp-5) 0 0; }
/* Die Leermeldung trug ihren Abstand über padding-top am h3. */
.bo-favlist h3.nofavs { flex: 1 1 100%; padding-top: 0; margin: 0; }

/* Der Float muss ausdrücklich weg: im Flex-Container ist er wirkungslos,
   `margin`/`padding` aus derselben Theme-Regel sind es nicht. */
button.simplefavorites-clear,
button.simplefavorites-update {
  float: none;
  margin: 0;
  display: inline-flex; align-items: center;
  height: var(--btn-h);
  padding: 0 var(--btn-px);
  background: var(--surface);
  border: 1px solid var(--line-3);
  border-radius: var(--r-btn);
  color: var(--ink-3);
  font-size: var(--fs-meta); font-weight: 600;
  line-height: 1;
  transition: background var(--dur) var(--ease), border-color var(--dur) var(--ease);
}
button.simplefavorites-clear:hover,
button.simplefavorites-update:hover {
  background: var(--soft); border-color: var(--muted-3); color: var(--ink);
}
button.simplefavorites-clear::before,
button.simplefavorites-update::before { padding-right: var(--sp-2); }
/* `content: ; clear: both` aus dem Theme erzeugt ein leeres Pseudoelement. */
button.simplefavorites-clear::after,
button.simplefavorites-update::after { display: none; }

/* Auch die freistehenden Merken-Schaltflächen runden. */
:is(.bo-favorites-list, button.simplefavorite-button, .simplefavorite-button) {
  border-radius: var(--r-btn);
}

.propbox button.simplefavorite-button {
  bottom: var(--sp-3); left: var(--sp-3);
  padding: var(--sp-2) var(--sp-3);
  border: none; border-radius: var(--r-badge);
  background: rgba(255, 255, 255, .94);
  -webkit-backdrop-filter: blur(8px); backdrop-filter: blur(8px);
  box-shadow: var(--e-rest);
  font-size: var(--fs-label); font-weight: 600;
  color: var(--ink);
  transition: background var(--dur) var(--ease), color var(--dur) var(--ease),
              box-shadow var(--dur) var(--ease);
}
.propbox button.simplefavorite-button:hover { background: #fff; box-shadow: var(--e-hover); }

/* Das Plugin tauscht beim Klick auf den gefüllten Stern — der IST das
   Feedback; eine rote Vollfläche hat ihn vorher überdeckt. */
.propbox button.simplefavorite-button.active {
  background: rgba(255, 255, 255, .96);
  color: var(--ink);
  box-shadow: inset 0 0 0 1px var(--accent), var(--e-hover);
}
.propbox button.simplefavorite-button.active i {
  color: var(--accent);
  transform: scale(1.1);
}
.propbox button.simplefavorite-button i {
  transition: color var(--dur) var(--ease), transform var(--dur) var(--ease);
}
/* .sold war die alte gedrehte Fahne und wurde vom overflow beschnitten. */
:is(.propbox .newobj, .propbox .sold) {
  transform: none;
  top: var(--sp-3); right: var(--sp-3); left: auto;
  width: auto;
  padding: var(--sp-2) var(--sp-3);
  border-radius: var(--r-badge);
  background: var(--accent); color: #fff;
  font-size: var(--fs-label); font-weight: 700; letter-spacing: .08em;
  box-shadow: none;
}

/* Zeilenbudget: Mindest- und Maximalhöhe, damit alles darunter auf einer Linie liegt. */
.propbox .prop-location {
  color: var(--muted-2);
  margin: 0 0 var(--sp-2);
  display: -webkit-box; -webkit-line-clamp: 1; -webkit-box-orient: vertical;
  overflow: hidden;
  min-height: calc(var(--lh-snug) * 1em);
}
.propbox .prop-location a { color: var(--muted-2); }

.propbox h2 { margin: 0 0 var(--sp-3); }
:is(.pl, .pl-home) .col-otc .propbox h2 {
  font-size: var(--fs-h3);
  line-height: var(--lh-snug);
  display: -webkit-box; -webkit-line-clamp: var(--card-title-lines);
  -webkit-box-orient: vertical; overflow: hidden;
  min-height: calc(var(--card-title-lines) * var(--lh-snug) * 1em);
}
:is(.propbox h2, .propbox h2 a) { transition: color var(--dur) var(--ease); }
.propbox:hover :is(h2, h2 a) { color: var(--accent); }

.propbox .proptext p {
  font-size: var(--fs-small);
  line-height: var(--lh-text);
  margin: 0;
  display: -webkit-box; -webkit-line-clamp: var(--card-text-lines);
  -webkit-box-orient: vertical; overflow: hidden;
  min-height: calc(var(--card-text-lines) * var(--lh-text) * 1em);
}

.propbox .propbox-separator { border-bottom: 1px solid var(--line-2); margin: var(--sp-3) 0; }

/* Preis, Fläche und Zimmerzahl sind EINE Angabengruppe. Der Preis hebt sich
   über Fettung ab, nicht über Größe — genau das war die Umbruchursache.
   SPEZIFITÄT: das Theme setzt `.pl .propbox .prop-price` (0,3,0) mit
   `width:45% !important`; bei zwei !important entscheidet die Spezifität. */
/* Die Angabenzeile soll die volle Kartenbreite nutzen. Einen Wrapper gibt es
   im Markup nicht — deshalb wird der Elterncontainer zum Flex-Raster; die
   .clear-Divs des Themes wirken weiter als Zeilenumbruch. */
:is(.propbox, .prop-all-left) {
  display: flex;
  flex-wrap: wrap;
  align-content: flex-start;
}
:is(.propbox, .prop-all-left) > * { flex: 0 0 100%; min-width: 0; }
:is(.propbox, .prop-all-left) > :is(.prop-price, .prop-size, .prop-rooms) {
  flex: 0 0 auto;
}
.propbox :is(.prop-price, .prop-size, .prop-rooms),
:is(.pl, .pl-home) .propbox :is(.prop-price, .prop-size, .prop-rooms) {
  display: inline-block;
  width: auto !important;
  float: none;
  margin: 0 var(--sp-2) 0 0;
  padding: 0;
  font-size: var(--fs-price);
  line-height: var(--lh-snug);
  white-space: nowrap;
  vertical-align: middle;   /* baseline ließ die drei je nach Icon-Höhe
                               unterschiedlich hoch sitzen */
}
/* Die Größe regelt sich nach der KARTEN-, nicht der Viewportbreite: ab 287px
   Inhalt 14px, ab 322px 15px. Gemessen wird der INHALTSkasten. Ohne diese
   Leiter bräuchte es Viewport-Ausnahmen, die bei jeder Rasteränderung
   wieder falsch wären. */
.propbox { container-type: inline-size; }
/* Die Variable steht auf dem NACHFAHREN: eine Container-Query fragt immer
   den nächsten Vorfahren ab, ein Element kann sich nicht selbst abfragen. */
@container (min-width: 290px) {
  .propbox :is(.prop-price, .prop-size, .prop-rooms) { --fs-price: .9rem; }
}
@container (min-width: 322px) {
  .propbox :is(.prop-price, .prop-size, .prop-rooms) { --fs-price: .9375rem; }
}

.propbox .prop-price,
:is(.pl, .pl-home) .propbox .prop-price {
  font-family: var(--mey-display);
  font-weight: 700;
  color: var(--ink);
  letter-spacing: -.01em;
}
.propbox :is(.prop-size, .prop-rooms),
:is(.pl, .pl-home) .propbox :is(.prop-size, .prop-rooms) {
  color: var(--muted-2); font-weight: 400;
}
/* Kein zusätzlicher Abstand: die Symbole bringen ihre Randluft seit
   Abschnitt 15 in der eigenen viewBox mit. */
.propbox :is(.prop-size, .prop-rooms) i { margin-right: 0; }

/* Muss NACH der margin-Kurzform stehen, die `margin-right: auto` sonst
   zurücksetzt. */
:is(.propbox, .prop-all-left) > .prop-price,
:is(.pl, .pl-home) .propbox > .prop-price,
:is(.pl, .pl-home) .prop-all-left > .prop-price   { margin-right: auto; }
:is(.propbox, .prop-all-left) > .prop-rooms,
:is(.pl, .pl-home) .propbox > .prop-rooms,
:is(.pl, .pl-home) .prop-all-left > .prop-rooms   { margin-right: 0; }

/* Fußzeile ohne Absolutpositionierung — durch das Zeilenbudget ist alles
   darüber gleich hoch. */
.propbox .prop-id {
  display: block;
  font-size: var(--fs-small); color: var(--muted-3);
}

/* --- Filterleiste ------------------------------------------------------- */
/* `#properties .hbox-taxsearch` ist (1,1,0); eine reine Klassenregel
   verliert dagegen. */
#properties .hbox-taxsearch,
.hbox-taxsearch {
  box-sizing: border-box;
  background: var(--surface);
  padding: var(--sp-4);
  margin: 0 0 var(--space-block);
}
/* Das Theme baut die Leiste über Prozentbreiten; bei größerer Schrift passt
   „Zurücksetzen" nicht mehr hinein. Als Flex-Layout verteilt sie sich selbst.
   Struktur: .taxparent > ul + div.taxonomy-drilldown-button — der Wrapper
   ist das Flex-Element. Das <form> darf kein Flex-Container werden, sonst
   schrumpft .taxparent auf Inhaltsbreite. */
.hbox-taxsearch form.taxonomy-drilldown-dropdowns { display: block; width: 100%; }

.hbox-taxsearch .taxparent {
  display: flex; flex-wrap: wrap; align-items: center;
  gap: var(--sp-3);
  width: 100%; box-sizing: border-box;
}
.hbox-taxsearch .taxparent > ul {
  display: flex; flex-wrap: wrap; align-items: center;
  gap: var(--sp-3);
  flex: 1 1 340px;
  width: auto; float: none; margin: 0; padding: 0;
  box-sizing: border-box;
}
.hbox-taxsearch .taxparent > ul > li {
  flex: 1 1 170px;
  width: auto !important;   /* Theme setzt 32% bzw. 100% !important */
  margin: 0 !important;
}
/* Die Buttons müssen im Umbruch mitgehen statt aus der Leiste zu laufen. */
.hbox-taxsearch .taxonomy-drilldown-button {
  display: flex; align-items: center; gap: var(--sp-3);
  flex-wrap: wrap; flex: 0 1 auto; min-width: 0;
  margin: 0; padding: 0; width: auto; float: none;
}
/* Das Theme gibt den beiden Buttons 6px bzw. 7px Rand — sichtbarer Versatz. */
.hbox-taxsearch .taxonomy-drilldown-button > * { margin: 0; }
.hbox-taxsearch .chosen-container { width: 100% !important; }  /* chosen.js setzt inline px */
/* chosen.min.css bringt eigene 13px mit. Gilt auch für die aufgeklappte
   Liste, die chosen ans Ende des <body> hängt. */
:is(.hbox-taxsearch .chosen-container, .chosen-drop, .chosen-results) :is(span, li, input) {
  font-size: var(--fs-small);
}
/* Das Theme gibt den chosen-Feldern asymmetrisches Padding, wodurch der Text
   zu hoch stand. */
.hbox-taxsearch .chosen-container-single .chosen-single {
  border-radius: var(--r-btn);
  border: 1px solid var(--line);
  background: var(--surface);
  box-shadow: none;
  box-sizing: border-box;
  height: var(--btn-h);
  padding: 0 0 0 40px;
  line-height: calc(var(--btn-h) - 2px);
  color: var(--ink-3);
}
.hbox-taxsearch .chosen-container-single .chosen-single > span {
  height: auto; line-height: inherit; margin: 0;
}

/* Maße der Filter-Buttons: siehe Abschnitt 8, dort zusammengefasst. */

/* --- Seitenblättern ----------------------------------------------------- */
.post-nav :is(a, .current) {
  display: inline-block;               /* war inline: vertikales Padding wirkungslos */
  padding: var(--sp-2) var(--sp-3);
  border-radius: var(--r-btn);
  font-weight: 600; font-size: var(--fs-small);
  transition: background var(--dur) var(--ease);
}
.post-nav .current {
  background: transparent; color: var(--accent);
  box-shadow: inset 0 -2px 0 var(--accent); border-radius: 0;
}
.post-nav a:hover { background: var(--soft); }


/* ===== 8 · BUTTONS & LINKS =====
   Alle über inline-flex zentriert; <input>-Buttons zentrieren nativ,
   brauchen aber eine feste Höhe statt min-height. */

:is(.content-button a, a.boxbutton, .headerbox-button a,
    .taxsearch .pslink, .hbox-taxsearch .pslink) {
  display: inline-flex; align-items: center; justify-content: center;
  min-height: var(--btn-h);
  padding: 0 var(--btn-px);
  font-size: var(--btn-fs); font-weight: 600;
  border-radius: var(--r-btn);
  text-align: center;
  box-sizing: border-box;
  transition: background var(--dur) var(--ease), border-color var(--dur) var(--ease),
              color var(--dur) var(--ease);
}
:is(.contactform button, .wpcf7 .wpcf7-submit,
    .psbutton, .contactform input[type="submit"]) {
  height: var(--btn-h);
  padding: 0 var(--btn-px);
  line-height: 1;
  font-size: var(--btn-fs); font-weight: 600;
  border-radius: var(--r-btn);
  box-sizing: border-box;
  transition: background var(--dur) var(--ease);
}

/* Der Kommentar-Button steht AUSSERHALB aller :is()-Gruppen: `#respond
   input#submit` enthält zwei IDs, und :is() übernimmt die Spezifität seines
   stärksten Mitglieds — die Gruppe hätte (2,0,2) geerbt. Eine einzelne ID
   vergiftet die ganze Gruppe. */
#respond input#submit {
  display: inline-flex; align-items: center; justify-content: center;
  height: var(--btn-h); padding: 0 var(--btn-px); line-height: 1;
  font-size: var(--btn-fs); font-weight: 600;
  background: var(--accent); color: #fff;
  border: 1px solid transparent; border-radius: var(--r-btn);
  box-sizing: border-box; text-transform: none;
  transition: background var(--dur) var(--ease);
}
#respond input#submit:hover { background: var(--accent-dark); box-shadow: none; }

/* SPEZIFITÄT: `:is()` erbt die Spezifität seines stärksten Mitglieds — die
   Gruppe oben kommt nur auf (0,2,0), Theme und customstyle haben (0,2,1).
   Die betroffenen Fälle werden hier einzeln nachgezogen. */
:is(.content-button a, a.boxbutton, .headerbox-button a, .contactform button,
    .wpcf7 .wpcf7-submit, .psbutton) {
  background: var(--accent); color: #fff; border: 1px solid transparent;
}
.ctacontainer .content-button a,
.page-content .content-button a {
  display: inline-flex; align-items: center; justify-content: center;
  min-height: var(--btn-h);
  padding: 0 var(--btn-px);
  margin: var(--sp-3) var(--sp-3) 0 0;
  font-size: var(--btn-fs); font-weight: 600;
  background: var(--accent); color: #fff;
  border: 1px solid transparent;
  border-radius: var(--r-btn);
  box-sizing: border-box;
}
.ctacontainer .content-button a:hover,
.page-content .content-button a:hover { background: var(--accent-dark); color: #fff; }
:is(.content-button a, a.boxbutton, .headerbox-button a, .contactform button,
    .wpcf7 .wpcf7-submit, .psbutton):hover {
  background: var(--accent-dark); color: #fff;
}
.headerbox-button { background: none; margin: var(--sp-4) 0 0; }
.headerbox-button:hover { background: none; }

/* Hover ändert nur Farbe, nie Geometrie. Das Theme greift an drei Stellen in
   die Maße ein — alle drei neutralisiert. */
:is(.content-button a, a.boxbutton, .headerbox-button a, .contactform button,
    .wpcf7 .wpcf7-submit, .psbutton,
    .taxsearch .pslink, .hbox-taxsearch .pslink):hover {
  border-width: 1px;
  border-style: solid;
  box-shadow: none;
}

/* Das Theme animiert hier das Padding — ersetzt, sonst springt der Button. */
a.boxbutton {
  align-self: center;
  margin-top: auto;
}
a.boxbutton:hover { padding: 0 var(--btn-px); }
:is(.boxcontent .boxtext, .cboxcontent) a.boxbutton { margin-top: var(--sp-5); }

/* 2 · Sekundär hell */
:is(.taxsearch .pslink, .hbox-taxsearch .pslink) {
  background: transparent; border: 1px solid var(--line-3); color: var(--ink-3);
}
:is(.taxsearch .pslink, .hbox-taxsearch .pslink):hover {
  background: var(--surface); border-color: var(--muted-2);
}

/* Das Theme streut die Maße der Filter-Buttons über vier Regeln und erzwingt
   `border-radius: 0 !important` — die einzige Stelle, an der hier ein
   !important nötig ist. */
.hbox-taxsearch .psbutton, .taxsearch .psbutton, #sidebar .psbutton,
.hbox-taxsearch .pslink,  .taxsearch .pslink {
  height: var(--btn-h);
  min-height: var(--btn-h);
  width: auto;
  padding: 0 var(--btn-px);
  margin: 0;
  font-size: var(--btn-fs);
  font-weight: 600;
  border-radius: var(--r-btn) !important;
  box-sizing: border-box;
}

/* Der Buttonblock darf umbrechen: auf schmalen Schirmen passen zwei Buttons
   nicht neben die Auswahlfelder. */

.hbox-taxsearch .taxonomy-drilldown-button > * { flex: 1 1 auto; }

/* Unter 640px stapelt sich alles: Auswahlfelder über volle Breite, darunter
   die beiden Buttons nebeneinander. */
@media (max-width: 640px) {
  .hbox-taxsearch .taxparent > ul,
  .hbox-taxsearch .taxonomy-drilldown-button { flex: 1 1 100%; }
}

/* Karten-CTA. `.propbox .post-more` ist (0,2,1) und schlüge eine Klassenregel. */
.propbox .post-more, .post-more {
  color: var(--accent);
  font-size: var(--fs-meta); font-weight: 600;
  word-spacing: .16em;
  transition: color var(--dur) var(--ease);
}
.post-more:hover { color: var(--accent-dark); }

/* .toggle-more mitgeführt: dort steht Text ohne <p>, Links wurden sonst blau. */
:is(p, li, label, .toggle-more) a {
  color: var(--accent);
  text-decoration-thickness: 1px;
  text-underline-offset: .18em;
  transition: color var(--dur) var(--ease);
}
:is(p, li, label, .toggle-more) a:hover { color: var(--accent-dark); text-decoration: underline; }


/* ===== 9 · FORMULARE ===== */

:is(.contactform, .wpcf7) :is(
    input:not([type="radio"]):not([type="checkbox"]):not([type="submit"]),
    textarea, select) {
  border: 1px solid #ddd8d3;
  border-radius: var(--r-btn);
  padding: var(--sp-3) var(--sp-4);
  font-size: var(--fs-small);
  line-height: var(--lh-text);
  background: var(--bg);
  color: var(--ink);
  transition: border-color var(--dur) var(--ease), box-shadow var(--dur) var(--ease),
              background var(--dur) var(--ease);
}
:is(.contactform, .wpcf7) :is(input, textarea, select):focus {
  border-color: var(--accent);
  background: var(--surface);
  box-shadow: 0 0 0 3px var(--ring);
  outline: none;
}
:is(.contactform, .wpcf7) label {
  color: var(--ink-3); font-size: var(--fs-meta); font-weight: 600;
  /* Das Theme setzt `margin: 7px 0 0 0` — also NICHTS zwischen Beschriftung
     und Feld. 4px darunter, 8px darüber: die Beschriftung gehört sichtbar
     zum Feld UNTER ihr. */
  display: block;
  margin: var(--sp-2) 0 var(--sp-1);
}
:is(.contactform label.agreelabel, .contactform label.agreelabel a,
    .wpcf7-acceptance label) {
  font-weight: 400; font-size: var(--fs-meta); color: var(--muted-3);
}
/* `.wpcf7 form .wpcf7-response-output` (0,3,0) schlägt jede Klassenregel.
   Die Statusfarben setzt CF7 separat und bleiben erhalten. */
/* CF7 baut Formulare aus <p>-Wrappern — Struktur, keine Absätze. Das Theme
   gibt jedem <p> in .columns asymmetrisches Padding. */
.ctacontainer .wpcf7 p { padding: 0; margin: 0 0 var(--sp-3); }

/* .screen-reader-response ist eine Vorlese-Hilfe mit leerem <p>. Optisch weg,
   für Screenreader erhalten — deshalb nicht display:none. */
.wpcf7 .screen-reader-response {
  position: absolute;
  width: 1px; height: 1px;
  padding: 0; margin: -1px;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
  border: 0;
}

/* Der Lade-Indikator von CF7 ist bis zum Absenden unsichtbar, belegte aber
   über seine Ränder rund 72px Breite neben dem Button. */
/* --- Der Ladekringel von Contact Form 7 ---------------------------------
   CF7 blendet ihn mit `visibility: hidden` aus. Das versteckt ihn, nimmt ihm
   aber NICHT seinen Platz: 24px Kasten plus Ränder bleiben im Textfluss.
   Wo der Absendeknopf über die volle Breite läuft (CTA-Karte, Sidebar),
   findet der Kringel daneben keinen Platz mehr und bricht in eine eigene
   Zeile — gemessen 33px Leerraum unter dem Knopf, dauerhaft.

   `position: absolute` nimmt ihn aus dem Fluss, ohne die Mechanik von CF7
   anzufassen: Ein- und Ausblenden läuft weiterhin über deren
   `visibility`-Regel. Bewusst NICHT über `display: none` plus
   `.submitting`-Klasse gelöst — das hinge an einem Klassennamen des Plugins,
   und bei einer Umbenennung bliebe der Kringel für immer unsichtbar. Hier
   kann höchstens die Position verrutschen, nie die Rückmeldung ausfallen.

   Die Knopfzeile wird dafür zur Flex-Zeile. Zwei Eigenschaften erledigen
   das Problem:
     • Flex bricht standardmäßig NICHT um — der Kringel kann also keine
       zweite Zeile mehr erzeugen, egal wie breit der Knopf ist.
     • Er ist mit 24px niedriger als der Knopf (46px) und trägt deshalb
       nichts zur Zeilenhöhe bei.
   Damit steht er neben dem Knopf, wie es Contact Form 7 vorsieht. */
.wpcf7 form p:has(> .wpcf7-spinner) {
  display: flex;
  align-items: center;
}
.wpcf7-spinner { flex: none; margin: 0 0 0 var(--sp-4); }

/* Nur wo der Knopf die VOLLE Breite hat (CTA-Karte, Sidebar), bleibt daneben
   kein Platz — dort zieht ein negativer Rand den Kringel über das rechte
   Knopfende. Die Beschriftung steht dort mittig, er verdeckt sie also nicht.
   Bei einem schmalen Knopf wäre dasselbe falsch: auf „Senden" läge er mitten
   im Wort. Deshalb getrennt und nicht pauschal. */
:is(.ctacontainer, .sidebarbox) .wpcf7-spinner {
  margin-left: calc(-24px - var(--sp-4));
}

/* Der Vorspann in der Formularkarte ist ein blankes <span> aus dem
   Seiteneditor — als Inline-Element trägt es keinen Abstand. */
.ctacontainer .inner:has(.wpcf7) > span { display: block; margin: 0 0 var(--sp-4); }

.wpcf7 form .wpcf7-response-output {
  border-radius: var(--r-btn);
  border-width: 1px;
  font-size: var(--fs-meta);
  line-height: var(--lh-text);
  margin: var(--sp-4) 0 0;
  padding: var(--sp-3) var(--sp-4);
}

/* CF7 setzt JEDE Zeile in ein eigenes <p>, auch die Beschriftung — ein Feld
   besteht aus ZWEI Absätzen. Jetzt zwei Stufen: 4px zum eigenen Feld, 8px
   zur nächsten Gruppe.
   ERKANNT WIRD DAS FELD: `p:has(label)` trifft nichts, die Beschriftungen
   sind blanker Text im Absatz. Nur das Feld steckt in einem Element. */
.wpcf7 form p { margin-bottom: var(--sp-1); }
.wpcf7 form p:has(.wpcf7-form-control-wrap) { margin-bottom: var(--sp-2); }

/* Formulare ohne eigene Karte (Sidebar, CTA). Bewusst schwach (0,1,0),
   damit die Kartenregel darunter (0,2,0) ihren Wert behält. */
.wpcf7 { margin-top: var(--sp-5); }

/* Formularkarte in der Hauptspalte. Ausgenommen: Sidebar (die Box IST eine
   Karte), CTA-Sektionen und verschachtelte Container. Ein einzelnes :not()
   mit Liste hält die Spezifität bei (0,2,0) statt (0,5,0). */
:is(.contactform, .wpcf7):not(.sidebarbox *, .ctacontainer *, .wpcf7 *, .contactform *) {
  box-sizing: border-box;
  width: 100%;
  /* Vor dem Formular stehen ungeclearte Floats. */
  clear: both;
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: var(--r-card);
  box-shadow: var(--e-rest);
  padding: var(--sp-6);
  /* Muss HIER stehen: das Theme setzt
     `.page-template-contact-form .contactform{margin-top:0}` mit (0,2,0). */
  margin: var(--space-block) 0;
}
/* Das Theme gibt dem inneren <form> nochmals Breite und Abstände. */
:is(.contactform, .wpcf7):not(.sidebarbox *, .ctacontainer *) .wpcf7-form {
  width: 100%; margin: 0; padding: 0;
}

/* --- /anfragen/: verschachtelte .contactform in der Karte ----------------
   Dort steckt eine .contactform INNERHALB der .wpcf7. Sie bringt aus dem
   Theme `width: calc(100% - 25px)` mit — die Felder standen dadurch 25px
   schmaler als die Karte und rechts blieb eine ungleiche Fuge (33px links
   gegen 60px rechts). Abstände und Fläche liefert die Karte, der innere
   Container braucht beides nicht. */
.wpcf7 .contactform { width: 100%; margin: 0; padding: 0; border: 0; }

/* Und die Felder selbst: `.contactform input, .wpcf7 input` setzt
   `width: calc(100% - 2px)`. Die 2px sind ein Rest aus der Zeit vor
   box-sizing und lassen jedes Feld minimal kürzer enden als sein Nachbar.
   Ankreuz- und Zahlenfelder ausdrücklich ausgenommen — die haben eigene,
   gewollte Breiten. */
:is(.contactform, .wpcf7) :is(
    input[type="text"], input[type="email"], input[type="tel"],
    input[type="url"], input[type="password"], input[type="search"],
    textarea) { width: 100%; }

/* --- Auswahlgruppen (Haus/Wohnung, Ausstattung, Datenschutz) -------------
   Das Theme floatet das Ankreuzfeld nach links und gibt ihm 30px Breite; die
   Beschriftung daneben findet ihre Grundlinie dann nur zufällig. Als
   Flex-Zeile sitzen Feld und Text sicher auf einer Linie, und die Gruppe
   bricht mit gleichmäßigen Abständen um statt über Ränder am inline-block. */
:is(.contactform, .wpcf7) :is(.wpcf7-radio, .wpcf7-checkbox, .wpcf7-acceptance) {
  display: flex; flex-wrap: wrap;
  gap: var(--sp-2) var(--sp-5);
}
/* Der Eintrag selbst wird zur Flex-Zeile, NICHT nur ein <label> darin:
   Contact Form 7 schreibt bei Auswahlfeldern gar kein <label>, sondern
   `<span class="wpcf7-list-item"><input><span class="…-label">`. Nur die
   Zustimmung hat eines. Beide Fälle sind so abgedeckt; doppelte Abstände
   entstehen nicht, weil der Eintrag dann nur ein einziges Kind hat. */
:is(.contactform, .wpcf7) .wpcf7-list-item {
  margin: 0;
  display: flex; align-items: center; gap: var(--sp-2);
}
:is(.contactform, .wpcf7) .wpcf7-list-item label {
  display: flex; align-items: center; gap: var(--sp-2);
}
:is(.contactform, .wpcf7) .wpcf7-list-item input[type="radio"],
:is(.contactform, .wpcf7) .wpcf7-list-item input[type="checkbox"] {
  width: auto; margin: 0; float: none; flex: none;
}
/* Die Zustimmung ist ein mehrzeiliger Satz, kein Schlagwort: dort oben
   ausrichten statt mittig, sonst wandert das Kästchen in die Satzmitte.

   SPEZIFITÄT, und zwar knapp: das Child-CSS baut für die Zustimmung einen
   hängenden Einzug von Hand —

       .sidebarbox .wr.clearfix .wpcf7-acceptance input,
       .page-id-17143|570|17378 .wr.clearfix .wpcf7-acceptance input
       { float: left; margin: 4px -10px 10px -35px }
       … dieselben Selektoren für label { display: block; margin-left: 20px }

   Das sind (0,4,1) — mehr als die Regeln oben, die nur auf (0,2,1) kommen.
   Auf /leistungen/, /ueber-uns/, /immobilienbewertung-kostenlos/ und
   /home-staging/ blieb das Kästchen deshalb gefloatet und der Text mit 20px
   Einzug daneben: gemessen 22px Lücke statt 8, und das Kästchen saß 35px
   links außerhalb seiner Zeile.
   `form.wpcf7-form` bringt diese Regeln auf (0,4,2) bzw. (0,5,1) und damit
   sicher darüber — nicht nur gleichauf, wo die Reihenfolge entscheiden
   müsste. Der hängende Einzug ist mit der Flex-Zeile ohnehin überflüssig. */
.wpcf7 form.wpcf7-form .wpcf7-acceptance .wpcf7-list-item label {
  display: flex;
  align-items: flex-start;
  gap: var(--sp-2);
  margin-left: 0;
}
.wpcf7 form.wpcf7-form .wpcf7-acceptance .wpcf7-list-item input[type="checkbox"] {
  float: none;
  width: auto;
  margin: .2em 0 0;
}
:is(.contactform, .wpcf7) .wpcf7-acceptance .wpcf7-list-item label {
  align-items: flex-start;
}
:is(.contactform, .wpcf7) .wpcf7-acceptance input[type="checkbox"] {
  margin-top: .2em;
}

/* Einzeilige Felder exakt auf Buttonhöhe — vorher 49 gegen 46px. */
:is(.contactform, .wpcf7) :is(
    input:not([type="radio"]):not([type="checkbox"]):not([type="submit"]), select) {
  height: var(--btn-h);
  padding: 0 var(--sp-4);
}
:is(.contactform, .wpcf7) textarea { padding: var(--sp-3) var(--sp-4); }

.sidebarbox input#searchinput {
  border-radius: var(--r-btn); border: 1px solid var(--line);
  padding: var(--sp-3); font-style: normal;
}
.sidebarbox input#searchsubmit {
  border-radius: var(--r-btn); padding: var(--sp-3); font-weight: 600;
}


/* ===== 10 · CTA-SEKTIONEN =====
   Die Hintergründe werden per Inline-<style> IM BODY gesetzt, also nach
   jedem Stylesheet. Nur hier ist !important sachlich begründet. */

/* → Fall a: `100% 100%` verzerrte das Foto nicht-proportional. */
:is(.cta1box-section, .cta2box-section, .cta3box-section) {
  background-size: cover !important;
  background-position: center !important;
}

/* Die flächige Grau-Deckung drückte den Kontrast auf ~3:1. Heller/dunkler:
   nur die zwei Alpha-Werte anfassen. */
:is(.cta1box-section, .cta3box-section) > .ol {
  background-color: transparent !important;
  background-image: linear-gradient(100deg,
      rgba(20, 16, 14, .90) 0%, rgba(20, 16, 14, .64) 100%);
}

/* cta2 wird zur hellen Ruhefläche — die Seite hätte sonst drei dunkle Bahnen
   hintereinander. Der Scrim muss ÜBER das Hausmuster, aber unter den Text. */
.cta2box-section > .ol {
  background-color: var(--soft) !important;
  border-radius: var(--r-card);
}
.cta2box-section .inner-section {
  position: relative;
  border: 1px solid var(--line);
  border-radius: var(--r-card);
  box-shadow: none;                  /* Child-CSS setzt hier inset 0 3px 8px */
  overflow: hidden;
}
.cta2box-section .inner-section::before {
  content: ""; position: absolute; inset: 0;
  display: block;        /* .clearfix::before setzt display:table — als Tabelle
                            schrumpft das Pseudoelement trotz inset:0 auf 0×0 */
  /* Zwei Ebenen: Hausmuster über fast deckender Ruhefläche. */
  background: var(--pattern-house) 0 0 / var(--pattern-size) var(--pattern-size) repeat,
              rgba(244, 241, 237, .985);
  pointer-events: none;
}
.cta2box-section .inner-section > * { position: relative; z-index: 1; }

.ctacontainer :is(h1, h2, h3) { color: #fff; font-size: var(--fs-h2); }
.ctacontainer :is(p, .cta-inner) { color: rgba(255, 255, 255, .82); }
.ctacontainer p { font-size: var(--fs-lead); }

/* Der Seiteneditor setzt JEDEN Textknoten der CTA-Sektionen auf #ffffff; in
   cta2 liegt er aber auf HELLEM Grund. → Fall a.
   WARUM NICHT AM ATTRIBUT: `[style*="color"]` erzeugte eine gegenseitige
   Abhängigkeit — die Korrektur wirkte nur, solange der Inline-Style da war,
   und beim Entfernen fiel der Kontrast von 16:1 auf 1,1:1. An der SEKTION
   stimmt die Farbe in beiden Zuständen; die Inline-Styles können also
   gefahrlos aus dem Dashboard entfernt werden. */
.cta2box-section :is(h1, h2, h3, h4),
.cta2box-section :is(h1, h2, h3, h4) span { color: var(--ink) !important; }
.cta2box-section :is(p, p span, .cta-inner, .cta-inner > span,
                     .inner > span) { color: var(--muted) !important; }

/* :only-of-type trifft die Einzelbuttons und lässt das Paar in cta2 nebeneinander. */
.ctacontainer .content-button:only-of-type { display: block; margin-top: var(--sp-3); }
.ctacontainer .content-button:only-of-type a { display: inline-flex; }

/* Sekundär nur in cta1 links: dort ist der Formular-Submit die Hauptaktion. */
.cta1box-section .col1-2:first-of-type .content-button a {
  background: transparent; border: 1px solid rgba(255, 255, 255, .55); color: #fff;
}
.cta1box-section .col1-2:first-of-type .content-button a:hover {
  background: rgba(255, 255, 255, .12); border-color: rgba(255, 255, 255, .8); color: #fff;
}
/* Zweiter Button in cta2 wird Sekundär-Hell. Er trägt style="color:#fff" im
   Quelltext — auf heller Fläche sonst unsichtbar. */
.cta2box-section .ctacontainer .content-button:last-of-type a,
.cta2box-section .content-button:last-of-type a {
  background: transparent; border: 1px solid var(--line-3);
  color: var(--ink) !important;
}
.cta2box-section .content-button:last-of-type a:hover {
  background: var(--surface); border-color: var(--muted-2);
}

/* :has(.wpcf7) statt Spaltenposition, damit es auf jede CTA-Sektion passt. */
@media (min-width: 835px) {
  .ctacontainer .inner:has(.wpcf7) {
    background: var(--surface);
    border-radius: var(--r-card);
    padding: var(--sp-6);
    margin: 0;
    box-shadow: var(--e-float);
  }
  /* Nur die Farbe drehen, nicht die Größe — die Überschrift stand im Bestand
     auf 26px. */
  .ctacontainer .inner:has(.wpcf7) :is(h1, h2, h3) { color: var(--ink); }
  .ctacontainer .inner:has(.wpcf7) :is(h1, h2, h3) [style*="color"] { color: var(--ink) !important; }
  .ctacontainer .inner:has(.wpcf7) p { color: var(--muted); font-size: var(--fs-small); }
  /* `> [style*="color"]` darf NICHT in :is() stehen — führende Kombinatoren
     sind dort ungültig und werden still verworfen. */
  .ctacontainer .inner:has(.wpcf7) p [style*="color"],
  .ctacontainer .inner:has(.wpcf7) > [style*="color"],
  .ctacontainer .inner:has(.wpcf7) > span {
    color: var(--muted) !important;
  }
  .ctacontainer .inner:has(.wpcf7) input:not([type="submit"]) { width: 100%; }
}

/* Formular in der CTA-Sektion, auf ALLEN Breiten. Die Karte ist
   Desktopsache, Feldmaße und Absendeknopf sind es nicht — mobil fiel der
   Knopf sonst auf die Themewerte zurück (14px/300 statt 15px/700).
   Das Theme hat (0,3,0); diese Selektoren liegen gleich und stehen später. */
.ctacontainer .wpcf7 .wpcf7-form {
  width: 100%; margin: 0; padding: 0;
}
.ctacontainer .wpcf7 .wpcf7-submit {
  margin: var(--sp-2) 0 0;
  width: 100%;
  height: var(--btn-h); padding: 0 var(--btn-px);
  font-size: var(--btn-fs); font-weight: 700;
  border-radius: var(--r-btn);
}
@media (max-width: 834px) {
  /* Ohne Karte braucht das Formular mobil die volle Spaltenbreite. */
  .ctacontainer .wpcf7 input:not([type="submit"]),
  .ctacontainer .wpcf7 textarea { width: 100%; box-sizing: border-box; }
}


/* ===== 11 · FOOTER ===== */

.footer { background: var(--dark-2); }
.footer-widgets { padding: var(--sp-7) 0 var(--sp-6); }
.footer-box .footerboxtitle {
  border-bottom: none;
  padding: 0; margin: 0 0 var(--sp-4);
  color: #7c746f;
  font-size: var(--fs-boxtitle);   /* im Bestand 13,9px, nicht Label-Größe */
}
:is(.footer-box, .footer-box p) {
  color: #cdc7c2; font-size: var(--fs-small); line-height: var(--lh-text);
}
.footer-box ul { margin: 0; }
.footer-box ul li {
  list-style-type: none; padding-left: 0;
  line-height: var(--lh-text); margin-bottom: var(--sp-3);
}
.footer-box a { color: #e4dfda; transition: color var(--dur) var(--ease); }
.footer-box a:hover { color: #fff; }
.footer-box #map-canvas { border-radius: var(--r-img); overflow: hidden; }

.bottomline {
  border-top: 1px solid #2a2421;
  padding: var(--sp-5) 0;
  font-size: var(--fs-meta);
  color: var(--muted-3);
}
.bottomline a { color: var(--muted-2); }
.bottomline a:hover { color: #fff; }

/* Zertifikatsgrafiken: kombinierte Bitmaps mit transparenten bzw. weißen
   Ecken — border-radius allein hätte nichts zum Abschneiden, erst der helle
   Rahmen macht die Rundung lesbar. Einzelne Siegel innerhalb einer Datei
   kann CSS nicht runden. */
/* Bilder im Textfluss wie Karten runden, außer sie haben eine eigene Regel. */
:is(.page-entry, .tabtext, .textwidget, .cboxcontent) img:not(.footer-badges) {
  border-radius: var(--r-img);
}

/* iwabasic-Widget: nur die Rundung angleichen, alles andere bleibt beim Plugin. */
/* Kein iframe, also erreichbar. Maße setzt das Plugin per Skript — daher !important. */
#iwa-widget :is(.iwabasic-widget1, .iwabasic-widget-content) {
  border-radius: var(--r-card) !important;
  overflow: hidden;
}
#iwa-widget .iwabasic-btn { border-radius: var(--r-btn) !important; }

:is(img.footer-badges, .partner-badges-intro img, .partner-badges img) {
  border-radius: var(--r-badge);
  display: inline-block;
  vertical-align: middle;
}
:is(.partner-badges-intro, .partner-badges) img {
  background: var(--surface);
  border: none;          /* die weiße Fläche mit Innenabstand rahmt genug */
  padding: 3px;
  box-sizing: border-box;
  margin: 0;
}
.partner-badges-intro p {
  display: flex; flex-wrap: wrap; align-items: center;
  gap: var(--sp-3); margin: var(--sp-2) 0 0;
}
.partner-badges-intro a { display: inline-flex; }

#gototop {
  background: rgba(255, 255, 255, .92);
  -webkit-backdrop-filter: blur(10px); backdrop-filter: blur(10px);
  border: 1px solid var(--line);
  box-shadow: var(--e-hover);
  border-radius: var(--r-card);
  width: 40px; height: 40px; padding: 0;
  right: var(--sp-5); bottom: var(--sp-5);
  text-align: center; line-height: 38px;   /* kein grid: Theme-JS setzt display inline */
}
#gototop:hover { background: #fff; }
#gototop a { color: var(--ink); font-size: var(--fs-body); }


/* ===== 12 · OBJEKTDETAILSEITE ===== */

/* Kein Kopfabstand: der Bildrahmen fluchtet mit dem ersten Sidebar-Element. */
.propimagewrap { padding: var(--sp-3); margin: 0 0 var(--sp-4); }
.propimagewrap img { border-radius: var(--r-img); }

.propprice {
  font-size: var(--fs-price-lg);
  line-height: var(--lh-snug);
  margin: var(--sp-1) 0 var(--sp-4);
}
.propfacts   { font-size: var(--fs-meta); color: var(--muted-2); padding-top: var(--sp-2); }
.propfacts a { border-bottom: 1px solid var(--line); color: var(--muted-2); }
/* .propicons wird per margin-top:-45px auf die Titelzeile gezogen; da es dem
   Titel im DOM folgt und floatet, muss der Platz reserviert werden.
   Doppelt abgesichert: Body-Klasse für Browser ohne :has(). */
@media (min-width: 835px) {
  /* Der Versatz des Themes ist RELATIV — jeder Innenabstand am Titel schiebt
     Icons und Trennstrich mit. Absolut am <header> verankert sitzen sie fest. */
  .single-property header,
  header:has(> .propicons) { position: relative; }
  .propicons {
    position: absolute; top: 0; right: 0;
    margin: 0; float: none; clear: none;
  }
  .single-property .pagetitle,
  .pagetitle:has(+ .propicons) { padding-right: 260px; }

  /* Drucken/Mailen standen auf 22px, der Stern auf 12px. */
  .propicons i.icon-print,
  .propicons i.icon-mail { font-size: 18px; }
}

/* Der Aufklapper verbirgt beim ersten Klick die einzige Bildübersicht.
   `display: none` nimmt ihn samt Klickfläche aus der Seite. */
.single-property .openpager { display: none; }

.requestformtitle {
  border-radius: 0;                  /* die Box beschneidet jetzt selbst */
  padding: var(--sp-4) var(--sp-5);  /* wie der Widget-Titel */
  font-size: var(--fs-small); font-weight: 600; letter-spacing: .04em;
}

/* Das Theme gibt #tabitems eine feste Höhe von 38px; zusätzliches Padding
   sprengte den Kasten. Höhe freigeben statt Padding draufsetzen. */
/* Seitentitel eine Stufe herunter — darunter stehen Preis und Eckdaten. */
.single-property :is(h1, .pagetitle) { font-size: var(--fs-h2); }

/* Reiter und Inhalt als eine Karte: der Streifen sitzt über negative Ränder
   bündig an der Kartenkante. */
#tabContainer {
  margin: var(--space-block) 0;
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: var(--r-card);
  padding: var(--sp-5);
  overflow: hidden;
}
#tabContainer #tabitems {
  height: auto;
  background: var(--soft);
  border-bottom: 1px solid var(--line);
  margin: calc(var(--sp-5) * -1) calc(var(--sp-5) * -1) var(--sp-5);
  padding: 0 var(--sp-4);
}
/* Zwei Dinge schoben schmale Geräte waagerecht auf: #tabContainer hat eine
   feste `width` bei content-box (deshalb box-sizing, nicht die Breite
   anfassen), und die Reiterzeile konnte nicht umbrechen. */
#tabContainer, #tabContainer #tabitems { box-sizing: border-box; }
#tabContainer #tabitems { display: flex; flex-wrap: wrap; }
#tabContainer #tabitems > li { float: none; }

@media (max-width: 834px) {
  #tabContainer { padding: var(--sp-4); }
  #tabContainer #tabitems {
    margin: calc(var(--sp-4) * -1) calc(var(--sp-4) * -1) var(--sp-4);
    padding: 0 var(--sp-2);
  }
}
#tabContainer #tabitems li a {
  height: auto; line-height: 1;
  padding: var(--sp-3) var(--tab-px);
  background: transparent;
  border-right: none;
  color: var(--muted);
  font-size: var(--fs-small); font-weight: 600;
  border-radius: var(--r-btn) var(--r-btn) 0 0;
  transition: color var(--dur) var(--ease), background var(--dur) var(--ease);
}
#tabContainer #tabitems li a:hover { background: var(--soft); color: var(--ink); }
/* `#tabContainer ul#tabitems li a.active` aus customstyle hat ein
   Elementteil mehr und gewinnt dadurch. */
#tabContainer ul#tabitems li a.active,
#tabContainer #tabitems li a.active {
  background: transparent; color: var(--accent);
  box-shadow: inset 0 -2px 0 var(--accent);
  border-radius: 0;
}
/* Kein Kopfabstand: den trägt der Fußabstand der Reiterleiste. */
#tabContainer .tabtext { border: none; padding: 0; margin: 0; }
#tabContainer .tabtext h3 {
  text-transform: none; width: auto; border-bottom: none;
  padding: 0; margin: var(--sp-5) 0 var(--sp-2);
  font-size: var(--fs-h3);
}

/* Datentabellen — Kopf als Label, Zeilentrenner, keine Zebrastreifen */
table { border-collapse: collapse; width: 100%; }
table th {
  color: var(--muted-2); text-align: left;
  padding: var(--sp-3) var(--sp-4);
  border-bottom: 1px solid var(--line);
}
table td {
  padding: var(--sp-3) var(--sp-4);
  border-bottom: 1px solid var(--line-2);
  font-size: var(--fs-small); color: var(--ink-3);
}

#pager { background: transparent; margin-top: var(--sp-4); }
#pager img { border-radius: var(--r-img); transition: opacity var(--dur) var(--ease); }
#pager img:hover { opacity: .78; }
:is(.openvideo, .opengall) {
  background: rgba(255, 255, 255, .92);
  -webkit-backdrop-filter: blur(8px); backdrop-filter: blur(8px);
  border-radius: var(--r-card);
  box-shadow: var(--e-rest);
}


/* ===== 14 · KENNZEICHNUNG KI-GENERIERTER BILDER =====
   EU AI Act. Die Kennzeichnung hängt an einer DATEINAMENS-KONVENTION: jedes
   Bild mit `ki-generiert` im Dateinamen bekommt das Badge automatisch —
   ohne HTML-Eingriff und ohne dass es jemand vergessen kann.
   Zwei Fälle: <img> können keine Pseudoelemente tragen, das Badge sitzt am
   umgebenden Element (:has()); in den CTA-Sektionen steht das Bild als
   background-image im Inline-Style.
   ICON TAUSCHEN: <path d="…"> in --ai-badge-icon ersetzen. `#` muss %23
   heißen, der viewBox-Wert ist mit zu übernehmen. */

/* Nachfahren-:has() statt Kindselektor: in den Karten liegt zwischen Rahmen
   und Bild noch ein <a>, im Slider nicht. */
:is(.propthumb, .page-entry p, .textwidget p):has(img[src*="ki-generiert"]),
[class*="box-section"][style*="ki-generiert"] {
  position: relative;
}

/* Im Hero nicht am einzelnen Slide: .slider-item bildet einen eigenen
   Stapelkontext, in dem das Pseudoelement beim Wechsel verschwände. */
.image-wrapper:has(img[src*="ki-generiert"]) { position: relative; }

:is(.propthumb, .page-entry p, .textwidget p):has(img[src*="ki-generiert"])::after,
.image-wrapper:has(img[src*="ki-generiert"])::before,
[class*="box-section"][style*="ki-generiert"]::after {
  content: var(--ai-badge-text);
  position: absolute;
  right: var(--sp-3); bottom: var(--sp-3);
  z-index: 5;
  padding: 4px 9px 4px 23px;
  background: var(--ai-badge-icon) 7px 50% / 10px 10px no-repeat,
              rgba(18, 15, 13, .55);
  -webkit-backdrop-filter: blur(6px);
  backdrop-filter: blur(6px);
  border-radius: var(--r-badge);
  color: rgba(255, 255, 255, .92);
  font-family: var(--mey-sans);
  font-size: 10px; font-weight: 600; letter-spacing: .05em; line-height: 1.4;
  white-space: nowrap;
  pointer-events: none;   /* verdeckt keine Links darunter */
}

/* Auf den CTA-Bändern unten links, damit es dem Text nicht in die Quere kommt. */
[class*="box-section"][style*="ki-generiert"]::after {
  right: auto; left: var(--sp-5); bottom: var(--sp-4);
}
/* über den Slides (z-index 100) */
/* Im Hero OBEN rechts: unten rechts liegt das Cookie-Banner, unten links der
   Hero-Button. In den Karten bleibt es unten rechts. */
.image-wrapper:has(img[src*="ki-generiert"])::before {
  z-index: 1002;   /* über den Slides (z-index 100) */
  top: var(--sp-3); bottom: auto;
}

/* ===== 13 · INTERAKTION & BARRIEREFREIHEIT ===== */

:where(a, button, input, select, textarea, [tabindex]):focus-visible {
  outline: 2px solid var(--accent);
  outline-offset: 3px;
  border-radius: var(--r-btn);
}

img { max-width: 100%; }

@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: .001ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: .001ms !important;
    scroll-behavior: auto !important;
  }
  .animated { animation: none !important; opacity: 1 !important; }
}


/* Cookie-Hinweis (Complianz): fremdes Plugin, liegt auf jeder Seite. Bewusst
   nur Schriftgrößen — Farben und Verhalten bleiben, damit ein Update nichts
   zerlegt. */
#cmplz-cookiebanner-container :is(.cmplz-message, .cmplz-link, p, li, span, label, td) {
  font-size: var(--fs-small);
}
/* Die Richtlinienseite setzt ihre Größen auch auf span und div. */
:is(.cmplz-document, #cmplz-document) :is(p, li, td, th, span, div, a, label, i) {
  font-size: var(--fs-small);
}
/* Die Tabellen ragen schon im Bestand seitlich heraus — lange Kennungen
   lassen sich nicht umbrechen. */
:is(.cmplz-document, #cmplz-document) :is(div, p, td, th, li) {
  min-width: 0;
  overflow-wrap: anywhere;
}
:is(.cmplz-document, #cmplz-document) table { table-layout: fixed; width: 100%; }
#cmplz-cookiebanner-container :is(.cmplz-btn, .cmplz-title) {
  font-size: var(--fs-body);
}

/* ===== 15 · SYMBOLE — Ablösung der Icon-Schrift =====
   MECHANIK: die Fontello-Glyphe wird unterdrückt (content: "") und das
   ::before zu einer Fläche, die per `mask` von einer SVG-Kontur beschnitten
   wird. Die Fläche ist `currentColor` — dadurch erben die Symbole Farbe und
   Hover genau wie vorher die Schrift.
   WARUM SO: kein zusätzlicher Request, nichts das ablaufen kann, jedes
   Symbol einzeln austauschbar, und die Fontello-Dateien bleiben unangetastet.
   HERKUNFT: ein Teil stammt aus Font Awesome Pro 7.3.1 (Copyright 2026
   Fonticons, Inc., kommerzielle Lizenz, fontawesome.com/license) — selbst
   gehostet als eingebettete Pfade, nicht über Kit oder CDN. Die übrigen
   Konturen sind eigens gezeichnet. */

:root {
  /* Strichstärke: in allen SVGs unten gleich gesetzt. Bewusst nicht variabel —
     eine data-URI löst keine Variable auf. */

  --ico-home:    url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" fill="%23000"><path d="M277.8 8.6c-12.3-11.4-31.3-11.4-43.5 0l-224 208c-9.6 9-12.8 22.9-8 35.1S18.8 272 32 272l16 0 0 176c0 35.3 28.7 64 64 64l288 0c35.3 0 64-28.7 64-64l0-176 16 0c13.2 0 25-8.1 29.8-20.3s1.6-26.2-8-35.1l-224-208zM240 320l32 0c26.5 0 48 21.5 48 48l0 96-128 0 0-96c0-26.5 21.5-48 48-48z"/></svg>');   /* FA solid/house */
  --ico-calc:    url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512" fill="%23000"><path d="M64 0C28.7 0 0 28.7 0 64L0 448c0 35.3 28.7 64 64 64l256 0c35.3 0 64-28.7 64-64l0-384c0-35.3-28.7-64-64-64L64 0zM96 64l192 0c17.7 0 32 14.3 32 32l0 32c0 17.7-14.3 32-32 32L96 160c-17.7 0-32-14.3-32-32l0-32c0-17.7 14.3-32 32-32zm16 168a24 24 0 1 1 -48 0 24 24 0 1 1 48 0zm80 24a24 24 0 1 1 0-48 24 24 0 1 1 0 48zm128-24a24 24 0 1 1 -48 0 24 24 0 1 1 48 0zM88 352a24 24 0 1 1 0-48 24 24 0 1 1 0 48zm128-24a24 24 0 1 1 -48 0 24 24 0 1 1 48 0zm80 24a24 24 0 1 1 0-48 24 24 0 1 1 0 48zM64 424c0-13.3 10.7-24 24-24l112 0c13.3 0 24 10.7 24 24s-10.7 24-24 24L88 448c-13.3 0-24-10.7-24-24zm232-24c13.3 0 24 10.7 24 24s-10.7 24-24 24-24-10.7-24-24 10.7-24 24-24z"/></svg>');   /* FA solid/calculator */
  --ico-chat:    url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 544" fill="%23000"><path d="M0 128L0 352c0 53 43 96 96 96l32 0 0 72c0 13.3 10.7 24 24 24 5.2 0 10.2-1.7 14.4-4.8l115.2-86.4c4.2-3.1 9.2-4.8 14.4-4.8l120 0c53 0 96-43 96-96l0-224c0-53-43-96-96-96L96 32C43 32 0 75 0 128zm192 32a32 32 0 1 1 0 64 32 32 0 1 1 0-64zm128 0a32 32 0 1 1 0 64 32 32 0 1 1 0-64zM150.5 286.1c9.9-8.8 25-8 33.9 1.9 17.6 19.7 43.1 32 71.6 32s53.9-12.3 71.6-32c8.8-9.9 24-10.7 33.9-1.9s10.7 24 1.9 33.9C337 349.4 298.6 368 256 368s-81-18.6-107.3-48c-8.8-9.9-8-25 1.9-33.9z"/></svg>');   /* FA solid/message-smile */
  --ico-mail:    url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" fill="%23000"><path d="M48 64c-26.5 0-48 21.5-48 48 0 15.1 7.1 29.3 19.2 38.4l208 156c17.1 12.8 40.5 12.8 57.6 0l208-156c12.1-9.1 19.2-23.3 19.2-38.4 0-26.5-21.5-48-48-48L48 64zM0 196L0 384c0 35.3 28.7 64 64 64l384 0c35.3 0 64-28.7 64-64l0-188-198.4 148.8c-34.1 25.6-81.1 25.6-115.2 0L0 196z"/></svg>');   /* FA solid/envelope */
  --ico-phone:   url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" fill="%23000"><path d="M160.2 25C152.3 6.1 131.7-3.9 112.1 1.4l-5.5 1.5c-64.6 17.6-119.8 80.2-103.7 156.4 37.1 175 174.8 312.7 349.8 349.8 76.3 16.2 138.8-39.1 156.4-103.7l1.5-5.5c5.4-19.7-4.7-40.3-23.5-48.1l-97.3-40.5c-16.5-6.9-35.6-2.1-47 11.8l-38.6 47.2C233.9 335.4 177.3 277 144.8 205.3L189 169.3c13.9-11.3 18.6-30.4 11.8-47L160.2 25z"/></svg>');   /* FA solid/phone */
  --ico-mobile:  url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512" fill="%23000"><path d="M80 0C44.7 0 16 28.7 16 64l0 384c0 35.3 28.7 64 64 64l224 0c35.3 0 64-28.7 64-64l0-384c0-35.3-28.7-64-64-64L80 0zm72 416l80 0c13.3 0 24 10.7 24 24s-10.7 24-24 24l-80 0c-13.3 0-24-10.7-24-24s10.7-24 24-24z"/></svg>');   /* FA solid/mobile */
  --ico-fax:     url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" fill="%23000"><path d="M160 64l0 80 64 0 0-80 146.7 0 45.3 45.3 0 34.7 64 0 0-34.7c0-17-6.7-33.3-18.7-45.3L416 18.7C404 6.7 387.7 0 370.7 0L224 0c-35.3 0-64 28.7-64 64zM32 128c-17.7 0-32 14.3-32 32L0 448c0 17.7 14.3 32 32 32l48 0c17.7 0 32-14.3 32-32l0-288c0-17.7-14.3-32-32-32l-48 0zm448 64l-320 0 0 256c0 17.7 14.3 32 32 32l288 0c17.7 0 32-14.3 32-32l0-224c0-17.7-14.3-32-32-32zM224 288a24 24 0 1 1 48 0 24 24 0 1 1 -48 0zm0 96a24 24 0 1 1 48 0 24 24 0 1 1 -48 0zM336 264a24 24 0 1 1 0 48 24 24 0 1 1 0-48zM312 384a24 24 0 1 1 48 0 24 24 0 1 1 -48 0zM424 264a24 24 0 1 1 0 48 24 24 0 1 1 0-48zM400 384a24 24 0 1 1 48 0 24 24 0 1 1 -48 0z"/></svg>');   /* FA solid/fax */
  --ico-area:    url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="%23000" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><path d="M9.2 3.4H5.2a1.8 1.8 0 0 0-1.8 1.8v4M14.8 3.4h4a1.8 1.8 0 0 1 1.8 1.8v4M9.2 20.6h-4a1.8 1.8 0 0 1-1.8-1.8v-4M14.8 20.6h4a1.8 1.8 0 0 0 1.8-1.8v-4"/></svg>');
  --ico-rooms:   url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="%23000" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><rect x="3.4" y="3.4" width="7.4" height="7.4" rx="1.8"/><rect x="13.2" y="3.4" width="7.4" height="7.4" rx="1.8"/><rect x="3.4" y="13.2" width="7.4" height="7.4" rx="1.8"/><rect x="13.2" y="13.2" width="7.4" height="7.4" rx="1.8"/></svg>');
  --ico-left:    url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="%23000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m14.5 4.5-7.5 7.5 7.5 7.5"/></svg>');
  --ico-right:   url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="%23000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m9.5 4.5 7.5 7.5-7.5 7.5"/></svg>');
  --ico-filter:  url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="%23000" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><path d="M3.4 7.2h9.4M17.4 7.2h3.2M3.4 16.8h3.2M11.4 16.8h9.2"/><circle cx="15.1" cy="7.2" r="2.3"/><circle cx="9.1" cy="16.8" r="2.3"/></svg>');
  --ico-up:      url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="%23000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m5.5 13.5 6.5-6.5 6.5 6.5"/><path d="m5.5 19 6.5-6.5 6.5 6.5"/></svg>');
  --ico-star-o:  url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 -32 576 544" fill="%23000"><path d="M288.1-32c9 0 17.3 5.1 21.4 13.1L383 125.3 542.9 150.7c8.9 1.4 16.3 7.7 19.1 16.3s.5 18-5.8 24.4L441.7 305.9 467 465.8c1.4 8.9-2.3 17.9-9.6 23.2s-17 6.1-25 2L288.1 417.6 143.8 491c-8 4.1-17.7 3.3-25-2s-11-14.2-9.6-23.2L134.4 305.9 20 191.4c-6.4-6.4-8.6-15.8-5.8-24.4s10.1-14.9 19.1-16.3l159.9-25.4 73.6-144.2c4.1-8 12.4-13.1 21.4-13.1zm0 76.8L230.3 158c-3.5 6.8-10 11.6-17.6 12.8l-125.5 20 89.8 89.9c5.4 5.4 7.9 13.1 6.7 20.7l-19.8 125.5 113.3-57.6c6.8-3.5 14.9-3.5 21.8 0l113.3 57.6-19.8-125.5c-1.2-7.6 1.3-15.3 6.7-20.7l89.8-89.9-125.5-20c-7.6-1.2-14.1-6-17.6-12.8L288.1 44.8z"/></svg>');   /* FA regular/star */
  --ico-star:    url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 -32 576 544" fill="%23000"><path d="M309.5-18.9c-4.1-8-12.4-13.1-21.4-13.1s-17.3 5.1-21.4 13.1L193.1 125.3 33.2 150.7c-8.9 1.4-16.3 7.7-19.1 16.3s-.5 18 5.8 24.4l114.4 114.5-25.2 159.9c-1.4 8.9 2.3 17.9 9.6 23.2s16.9 6.1 25 2L288.1 417.6 432.4 491c8 4.1 17.7 3.3 25-2s11-14.2 9.6-23.2L441.7 305.9 556.1 191.4c6.4-6.4 8.6-15.8 5.8-24.4s-10.1-14.9-19.1-16.3L383 125.3 309.5-18.9z"/></svg>');   /* FA solid/star */
}

/* Bewusst explizit statt [class^="icon-"]: nur die vorkommenden Symbole
   werden ersetzt. Ein späteres bleibt Fontello — sichtbar, nicht kaputt. */
:is(.icon-home, .icon-calc, .icon-chat, .icon-mail, .icon-mail-alt,
    .icon-phone, .icon-mobile, .icon-fax, .icon-resize-full-alt,
    .icon-th-large, .icon-left-open, .icon-right-open, .icon-left-dir,
    .icon-right-dir, .icon-filter, .icon-angle-double-up,
    .sf-icon-star-empty, .sf-icon-star-full)::before {
  content: "";
  display: inline-block;
  width: 1em; height: 1em;
  vertical-align: -.145em;
  /* `color: inherit` ist nötig: currentColor löst sich am PSEUDO-Element auf,
     und das Theme färbt einzelne ::before eigens ein. */
  color: inherit;
  background-color: currentColor;
  -webkit-mask: var(--ico) center / contain no-repeat;
          mask: var(--ico) center / contain no-repeat;
}

.icon-home::before             { --ico: var(--ico-home); }
.icon-calc::before             { --ico: var(--ico-calc); }
.icon-chat::before             { --ico: var(--ico-chat); }
:is(.icon-mail, .icon-mail-alt)::before { --ico: var(--ico-mail); }
.icon-phone::before            { --ico: var(--ico-phone); }
.icon-mobile::before           { --ico: var(--ico-mobile); }
.icon-fax::before              { --ico: var(--ico-fax); }
.icon-resize-full-alt::before  { --ico: var(--ico-area); }
.icon-th-large::before         { --ico: var(--ico-rooms); }
:is(.icon-left-open, .icon-left-dir)::before   { --ico: var(--ico-left); }
:is(.icon-right-open, .icon-right-dir)::before { --ico: var(--ico-right); }
.icon-filter::before           { --ico: var(--ico-filter); }
.icon-angle-double-up::before  { --ico: var(--ico-up); }

/* Das Plugin tauscht die Klasse von leerem auf gefüllten Stern — der Wechsel
   IST das Feedback, ohne eine Zeile JavaScript. */
.sf-icon-star-empty::before    { --ico: var(--ico-star-o); }
.sf-icon-star-full::before     { --ico: var(--ico-star); }
