/* ═══ symbole-homepage.css ═══ */
/* symbole-homepage.css — nur die Symbole, die Homepage und Ratgeber benutzen.
   Gebaut von scripts/symbole-homepage.py aus Bootstrap Icons v1.11.3 (MIT,
   https://icons.getbootstrap.com/); nicht von Hand ändern, neu bauen. */
@font-face{font-display:block;font-family:bootstrap-icons;src:url('/fonts/symbole-homepage.woff?v=4436ccfe56') format('woff')}
.bi::before,[class*=" bi-"]::before,[class^=bi-]::before{display:inline-block;font-family:bootstrap-icons!important;font-style:normal;font-weight:400!important;font-variant:normal;text-transform:none;line-height:1;vertical-align:-.125em;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}
.bi-arrow-left-right::before{content:"\f12b"}
.bi-arrow-repeat::before{content:"\f130"}
.bi-arrow-return-right::before{content:"\f132"}
.bi-arrow-right::before{content:"\f138"}
.bi-arrow-up-square::before{content:"\f147"}
.bi-bank2::before{content:"\f62f"}
.bi-book::before{content:"\f194"}
.bi-building-fill-lock::before{content:"\f872"}
.bi-building-lock::before{content:"\f878"}
.bi-buildings::before{content:"\f87d"}
.bi-buildings-fill::before{content:"\f87c"}
.bi-calendar-event::before{content:"\f1e8"}
.bi-calendar-event-fill::before{content:"\f1e7"}
.bi-cash-coin::before{content:"\f632"}
.bi-cash-stack::before{content:"\f246"}
.bi-chat-dots::before{content:"\f24a"}
.bi-check-circle-fill::before{content:"\f26a"}
.bi-check2::before{content:"\f272"}
.bi-check2-circle::before{content:"\f270"}
.bi-check2-square::before{content:"\f271"}
.bi-chevron-down::before{content:"\f282"}
.bi-clipboard-check-fill::before{content:"\f71b"}
.bi-clipboard-data::before{content:"\f28c"}
.bi-clock::before{content:"\f293"}
.bi-clock-fill::before{content:"\f291"}
.bi-clock-history::before{content:"\f292"}
.bi-cloud-haze2::before{content:"\f6f7"}
.bi-droplet::before{content:"\f30d"}
.bi-droplet-fill::before{content:"\f30b"}
.bi-envelope::before{content:"\f32f"}
.bi-envelope-fill::before{content:"\f32c"}
.bi-exclamation-octagon-fill::before{content:"\f336"}
.bi-exclamation-triangle-fill::before{content:"\f33a"}
.bi-eye::before{content:"\f341"}
.bi-file-earmark-pdf::before{content:"\f63e"}
.bi-file-earmark-ruled::before{content:"\f385"}
.bi-file-earmark-x::before{content:"\f38f"}
.bi-fire::before{content:"\f7f6"}
.bi-geo-alt::before{content:"\f3e8"}
.bi-geo-alt-fill::before{content:"\f3e7"}
.bi-graph-up-arrow::before{content:"\f673"}
.bi-hand-index::before{content:"\f403"}
.bi-house-heart::before{content:"\f776"}
.bi-house-heart-fill::before{content:"\f775"}
.bi-info-circle::before{content:"\f431"}
.bi-info-circle-fill::before{content:"\f430"}
.bi-key::before{content:"\f44f"}
.bi-lightning-charge::before{content:"\f46d"}
.bi-list-check::before{content:"\f473"}
.bi-people::before{content:"\f4d0"}
.bi-people-fill::before{content:"\f4cf"}
.bi-person-check-fill::before{content:"\f4d5"}
.bi-person-lock::before{content:"\f8a8"}
.bi-person-vcard::before{content:"\f8c9"}
.bi-person-vcard-fill::before{content:"\f8c8"}
.bi-phone::before{content:"\f4e7"}
.bi-plus-circle::before{content:"\f4fa"}
.bi-receipt::before{content:"\f50f"}
.bi-receipt-cutoff::before{content:"\f50e"}
.bi-send::before{content:"\f6c0"}
.bi-shield-check::before{content:"\f52f"}
.bi-shield-fill-check::before{content:"\f531"}
.bi-shield-lock::before{content:"\f538"}
.bi-telephone::before{content:"\f5c1"}
.bi-telephone-fill::before{content:"\f5b4"}
.bi-telephone-x::before{content:"\f5c0"}
.bi-thermometer-snow::before{content:"\f5d0"}
.bi-tools::before{content:"\f5db"}
.bi-universal-access-circle::before{content:"\f825"}
.bi-whatsapp::before{content:"\f618"}
.bi-x-octagon-fill::before{content:"\f626"}


/* ═══ tokens.css ═══ */
/* ════════════════════════════════════════════════════════════════════════════
   tokens.css — Shared Design Tokens (Brand + Semantik + Typo + Spacing)
   ────────────────────────────────────────────────────────────────────────────
   Eine Datei, von ALLEN vier Surfaces geladen (Admin, Mieter-Portal,
   Eigentuemer-Portal, oeffentliche Homepage). Aenderungen hier propagieren
   ueberall.

   Layering:
     tokens.css           ← Foundation (DIESE Datei). Brand + Semantik + Typo.
     app.css              ← Bootstrap-Erweiterungen (Admin-Forms etc.)
     app.industrial.css   ← Admin-Theme-Override (Dark/Light, Neon-Akzent)
     portal.css           ← Portale: gemeinsame Komponenten ueber tokens
     (inline-Style)       ← Pro-Portal-Akzent (Mieter blau / Eigentuemer gruen)

   Brand-Entscheidung (Adrian):
     Aktuell sind --brand-* Platzhalter, die zu den bisher genutzten Werten
     passen. Sobald Adrian ein finales Logo + Hausfarbe hat, hier die fuenf
     ROOT-Variablen umstellen — alle vier Surfaces folgen automatisch.
   ════════════════════════════════════════════════════════════════════════════ */

:root {

  /* ── Brand ─────────────────────────────────────────────────────────────────
     Markenname entschieden 2026-05-08: "Rottensteiner Hausverwaltung"
     2026-05-16: Brand-Palette auf "Bodensee" geupdated (Audit-Befund: drei
     parallele Token-Namensraeume — siehe /docs/design-system/README.md).
     Neue Werte synchron mit public.css. Alle vier Surfaces sollen perspekti-
     visch auf --color-* migrieren. */
  --brand-name:                'Rottensteiner Hausverwaltung';
  --brand-primary:             #2D6B8E;     /* Bodensee-Mittelblau */
  --brand-primary-hover:       #1A4D6B;
  --brand-primary-on:          #FFFFFF;     /* Text auf Brand-Primary */

  /* ── Bodensee-Surface-Palette (NEUE Single-Source-of-Truth) ───────────────
     Semantische Namen statt Farbnamen ("ink" statt "dark" — bleibt stabil
     auch wenn die konkrete Farbe in Zukunft wechselt). */
  --color-ink:                 #15243C;     /* Haupttext + dunkle Surfaces */
  --color-ink-soft:            #6B5E4E;     /* Sekundaertext (warmer Erd-Ton) */
  --color-ink-faint:           #ACA193;     /* Captions, sehr leise */
  --color-brand:               #2D6B8E;     /* See-Blau, Haupt-Akzent */
  --color-brand-deep:          #1A4D6B;     /* See-Blau dunkel (Hover) */
  --color-brand-mist:          #B8D4E3;     /* Morgennebel-Hell, Highlight */
  --color-brand-haze:          #E5EFF5;     /* Sehr heller Brand-Hintergrund */
  --color-paper:               #F7F2EA;     /* Warmes Bodenseepapier */
  --color-paper-deep:          #EDE5D4;     /* Schilf-Beige */
  --color-line:                #DDD4C2;     /* Sanfter Trenner (warm) */
  --color-line-soft:           #ECE5D8;     /* Subtiler Trenner */
  --color-accent:              #C8553D;     /* Apfelblueten-Akzent (sparsam!) */
  --color-admin-accent:        #5BB0D9;     /* Helles See-Blau — Admin-Industrial Akzent (Dark) */
  --color-admin-accent-light:  #2D6B8E;     /* Bodensee-Blau — Admin-Industrial Akzent (Light) */

  --brand-accent-mieter:       #1E3A5F;     /* Akzent fuer Mieter-Portal */
  --brand-accent-eigentuemer:  #2D4A3E;     /* Akzent fuer Eigentuemer-Portal (gruen) */
  --brand-accent-industrial:   #5BB0D9;     /* Akzent fuer Admin-Industrial (helles See-Blau, Dark) */

  /* ── Semantische Statusfarben ──────────────────────────────────────────────
     Identisch ueber alle Surfaces. Werden ggf. pro Theme noch ge-tweaked. */
  --color-success:             #15803D;
  --color-success-bg:          #DCFCE7;
  --color-success-on:          #FFFFFF;
  --color-success-dark:        #00E08F;     /* Dark-Theme/Begehung-Erfolg (hoher Kontrast auf dunklem BG) */
  --color-warning:             #B45309;
  --color-warning-bg:          #FEF3C7;
  --color-warning-on:          #1A1A1A;
  --color-danger:              #B91C1C;
  --color-danger-bg:           #FEE2E2;
  --color-danger-on:           #FFFFFF;
  --color-info:                #1D4ED8;
  --color-info-bg:             #DBEAFE;
  --color-info-on:             #FFFFFF;
  --color-muted:               #525252;
  --color-muted-bg:            #E5E5E5;
  --color-muted-on:            #FFFFFF;
  --color-accent-gold:         #FFD166;     /* Portal-Gold-Akzent (Nav-aktiv, Schnellzugriff) */

  /* ── HITL-Ampel (Autonomie-Stufe) ──────────────────────────────────────────
     Bewusst nicht success/warning/danger nachgemalt — semantisch anders:
     gruen = autonom, gelb = HITL-Pflicht, rot = blockiert. Eine HITL-Pille
     "rot" ist KEIN Fehler, sondern eine bewusste Autonomie-Entscheidung. */
  --color-traffic-rot:         #7F1D1D;
  --color-traffic-rot-bg:      #FECACA;
  --color-traffic-rot-on:      #FFFFFF;
  --color-traffic-gelb:        #92400E;
  --color-traffic-gelb-bg:     #FDE68A;
  --color-traffic-gelb-on:     #1A1A1A;
  --color-traffic-gruen:       #14532D;
  --color-traffic-gruen-bg:    #BBF7D0;
  --color-traffic-gruen-on:    #FFFFFF;

  /* ── Typografie ────────────────────────────────────────────────────────────
     Sans-Stack: Geist (lokal) → System-UI. Mono-Stack: JetBrains Mono → ui-mono.
     Konvention: keine fonts.googleapis.com — privacy + offline (Schriften liegen lokal). */
  --font-sans:                 'Geist', -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif;
  --font-mono:                 'JetBrains Mono', 'Geist Mono', ui-monospace, 'SF Mono', Consolas, monospace;
  --font-display:              var(--font-sans);

  --fs-xs:     0.75rem;
  --fs-sm:     0.85rem;
  --fs-base:   0.95rem;
  --fs-lg:     1.15rem;
  --fs-xl:     1.4rem;
  --fs-2xl:    1.85rem;

  --fw-regular: 400;
  --fw-medium:  500;
  --fw-bold:    600;

  /* ── Spacing-Skala (4px-Raster) ─────────────────────────────────────────── */
  --space-1: 0.25rem;
  --space-2: 0.5rem;
  --space-3: 0.75rem;
  --space-4: 1rem;
  --space-5: 1.5rem;
  --space-6: 2rem;
  --space-7: 3rem;
  --space-8: 4rem;

  /* ── Border-Radien ─────────────────────────────────────────────────────── */
  --radius-sm: 4px;
  --radius-md: 8px;
  --radius-lg: 12px;
  --radius-xl: 16px;
  --radius-pill: 9999px;

  /* ── Schatten (sehr dezent, Industrial-tauglich) ──────────────────────── */
  --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.04);
  --shadow-md: 0 2px 6px rgba(0, 0, 0, 0.06);
  --shadow-lg: 0 8px 24px rgba(0, 0, 0, 0.08);

  /* ── Fokus-Ring (gilt fuer alle Surfaces) ───────────────────────────────── */
  --focus-ring-width: 3px;
  --focus-ring-offset: 2px;
  /* Bis 04.10.2026 das helle Industrial-Blau des Verwaltungsbereichs (dunkles
     Design, entfallen am 30.09.2026) — auf dem hellen Portal nur 2,2:1.
     See-Blau hat auf Weiss 5,8:1 (Prüfung Barrierefreiheit 04.10.2026). */
  --focus-ring-color: var(--color-brand);

  /* ════════════════════════════════════════════════════════════════════════
     Public-Surface-Tokens (Bodensee-Homepage)
     ────────────────────────────────────────────────────────────────────────
     Status 2026-05-28 nach UI-Audit: das Repo hat **zwei stabile**
     Token-Familien, KEINE laufende Migration mehr:

       --color-*       Foundation/Bodensee-Surface (semantisch, theme-stabil)
       --hv-*          Admin-Industrial (theme-variant: Light/Dark)

     Beide sind Single-Source-of-Truth fuer ihre Surface. Die Aliases unten
     (--dark/--blue/--cream/--surface/--border/--text/--text-muted/--accent-spark)
     werden von public.css + ~25 Homepage-Views aktiv genutzt — keine
     "Backward-Compat", sondern produktive API. Tot war nur --dark-soft (raus).

     Wenn du neuen Public-Homepage-Code schreibst: --color-*-Tokens nutzen
     (semantisch klarer). Bestehende --dark/--blue/--cream-Stellen muessen
     NICHT migriert werden — sind via Aliases korrekt resolved.
     ════════════════════════════════════════════════════════════════════════ */

  /* Public-Homepage-Surface-Tokens (Bodensee-Palette) */
  --dark:                      var(--color-ink);
  --blue:                      var(--color-brand);
  --blue-dark:                 var(--color-brand-deep);
  --blue-light:                var(--color-brand-haze);
  --blue-mid:                  var(--color-brand-mist);
  --cream:                     var(--color-paper);
  --cream-dark:                var(--color-paper-deep);
  --surface:                   #FFFFFF;
  --border:                    var(--color-line);
  --text:                      var(--color-ink);
  --text-muted:                var(--color-ink-soft);
  --accent-spark:              var(--color-accent);

  /* Typografie-Aliases (Public benutzt eigene Display-Font Fraunces) */
  --font-display-public:       'Fraunces', Georgia, 'Times New Roman', serif;
  --font-sans-public:          'Geist', -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif;
}

/* ════════════════════════════════════════════════════════════════════════════
   Globaler Fokus-Ring
   ────────────────────────────────────────────────────────────────────────────
   Konsistent ueber Admin und beide Portale. Nutzt :focus-visible (nur Tastatur),
   sodass Maus-Klicks keinen sichtbaren Ring triggern.
   ════════════════════════════════════════════════════════════════════════════ */
:where(a, button, input, select, textarea, [tabindex]):focus-visible {
  outline: var(--focus-ring-width) solid var(--focus-ring-color);
  outline-offset: var(--focus-ring-offset);
  border-radius: var(--radius-sm);
}

/* Bootstrap ersetzt bei Knöpfen, Menüpunkten und Formularfeldern den Rahmen
   durch einen blassen Schatten (outline: 0) — und ein leeres Pflichtfeld verlor
   selbst den: Wer mit der Tastatur in die Schadensmeldung oder die
   Portal-Anmeldung ging, sah nicht, wo er tippt. Diese Datei kommt nach
   Bootstrap, gleiche Spezifität gewinnt (Prüfung Barrierefreiheit 04.10.2026). */
.btn:focus-visible,
.nav-link:focus-visible,
.dropdown-item:focus-visible,
.form-control:focus-visible,
.form-select:focus-visible,
.form-check-input:focus-visible {
  outline: var(--focus-ring-width) solid var(--focus-ring-color);
  outline-offset: var(--focus-ring-offset);
  box-shadow: none;
}

/* ════════════════════════════════════════════════════════════════════════════
   .hv-skip-link — Skip-to-content-Link (BFSG / WCAG 2.4.1)
   ────────────────────────────────────────────────────────────────────────────
   Unsichtbar bis Tab-Fokus, dann oben links. Konsistent ueber alle Surfaces.
   Public-Layout hat seine eigene .skip-link mit Bodensee-Farben, die hier
   ist die universelle Variante fuer Admin + beide Portale + Auth.
   ════════════════════════════════════════════════════════════════════════════ */
.hv-skip-link {
  position: absolute;
  top: -100px;
  left: 0;
  z-index: 10000;
  background: var(--color-ink, #15243C);
  color: #fff;
  padding: 0.75rem 1.25rem;
  border-radius: 0 0 var(--radius-md, 8px) 0;
  font-weight: 700;
  font-size: 0.9rem;
  text-decoration: none;
  transition: top 0.2s ease;
}
.hv-skip-link:focus,
.hv-skip-link:focus-visible {
  top: 0;
  outline: 3px solid var(--color-brand, #2D6B8E);
  outline-offset: 2px;
  color: #fff;
}

/* ════════════════════════════════════════════════════════════════════════════
   .hv-pill — Status-Pille (semantik + HITL-Ampel)
   ────────────────────────────────────────────────────────────────────────────
   Ersetzt Bootstrap-`badge bg-*` an allen Stellen, an denen ein Status oder
   eine Autonomie-Ampel angezeigt wird. Die Klasse setzt nur Layout (Padding,
   Radius, Schrift); die Variante (success / warning / danger / info / muted /
   traffic-*) bringt Hintergrund + Vordergrund.

   Nutzung:
     <span class="hv-pill hv-pill--success">Bezahlt</span>
     <span class="hv-pill hv-pill--traffic-gelb">HITL: gelb</span>

   Die Vorlagen schreiben die Klassen direkt. Den Helfer {{statusPill …}} mit
   seiner Zuordnung Status → Variante gab es bis 05.10.2026; ihn benutzten nur
   Seiten der alten Verwaltungs-App (Ausbau Sitzung 8).
   ════════════════════════════════════════════════════════════════════════════ */
.hv-pill {
  display: inline-flex;
  align-items: center;
  gap: var(--space-1);
  padding: 0.15rem 0.6rem;
  border-radius: var(--radius-pill);
  font-size: var(--fs-xs);
  font-weight: var(--fw-medium);
  font-family: var(--font-sans);
  line-height: 1.4;
  white-space: nowrap;
  vertical-align: baseline;
  letter-spacing: 0.01em;
}
.hv-pill--success      { background: var(--color-success-bg); color: var(--color-success); }
.hv-pill--warning      { background: var(--color-warning-bg); color: var(--color-warning); }
.hv-pill--danger       { background: var(--color-danger-bg);  color: var(--color-danger);  }
.hv-pill--info         { background: var(--color-info-bg);    color: var(--color-info);    }
.hv-pill--muted        { background: var(--color-muted-bg);   color: var(--color-muted);   }
.hv-pill--traffic-rot   { background: var(--color-traffic-rot-bg);   color: var(--color-traffic-rot);   }
.hv-pill--traffic-gelb  { background: var(--color-traffic-gelb-bg);  color: var(--color-traffic-gelb);  }
.hv-pill--traffic-gruen { background: var(--color-traffic-gruen-bg); color: var(--color-traffic-gruen); }

/* Dark-Theme-Override (Industrial Admin): Hintergruende sind im Dark-Mode
   sehr hell → Pille wird zu grell. Auf gedaempfte Versionen mit Alpha. */
[data-theme="dark"] .hv-pill--success      { background: rgba(34, 197, 94, 0.18); color: #6EE7A7; }
[data-theme="dark"] .hv-pill--warning      { background: rgba(245, 158, 11, 0.18); color: #FCD34D; }
[data-theme="dark"] .hv-pill--danger       { background: rgba(239, 68, 68, 0.18);  color: #FCA5A5; }
[data-theme="dark"] .hv-pill--info         { background: rgba(59, 130, 246, 0.18); color: #93C5FD; }
[data-theme="dark"] .hv-pill--muted        { background: rgba(160, 160, 160, 0.18); color: #D4D4D4; }
[data-theme="dark"] .hv-pill--traffic-rot   { background: rgba(220, 38, 38, 0.22);  color: #FCA5A5; }
[data-theme="dark"] .hv-pill--traffic-gelb  { background: rgba(234, 179, 8, 0.22);  color: #FDE047; }
[data-theme="dark"] .hv-pill--traffic-gruen { background: rgba(34, 197, 94, 0.22);  color: #86EFAC; }

@media print {
  .hv-pill {
    background: transparent !important;
    color: #000 !important;
    border: 1px solid #000;
    padding: 0.05rem 0.4rem;
  }
}

/* ════════════════════════════════════════════════════════════════════════════
   Field-Level-Validation (CSS-only, kein JS)
   ────────────────────────────────────────────────────────────────────────────
   Pattern: <input required pattern="..." />
            <small class="hv-field-error">Bitte E-Mail im Format ... eingeben</small>

   Sichtbarkeitslogik nutzt :user-invalid (Browser-native, greift erst nach
   Blur oder Submit-Versuch — kein roter Initial-Hint bei leeren Feldern).
   Fallback fuer Browser ohne :user-invalid: :invalid:not(:placeholder-shown)
   :not(:focus). Damit der Fallback greift, sollte das Eingabefeld einen
   placeholder haben (z.B. " " als Spacer fuer Floating-Labels).

   Die Klasse .hv-form-error markiert serverseitige Validation-Fehler — die
   bleibt unabhaengig vom user-invalid-Zustand sichtbar.
   ════════════════════════════════════════════════════════════════════════════ */
.hv-field-error {
  display: none;
  font-size: var(--fs-xs);
  color: var(--color-danger);
  margin-top: 0.25rem;
  line-height: 1.35;
}

/* :user-invalid (modern) — greift nach User-Interaktion */
.form-control:user-invalid + .hv-field-error,
.form-select:user-invalid + .hv-field-error,
textarea:user-invalid + .hv-field-error {
  display: block;
}

/* Fallback :invalid + :not(:placeholder-shown) :not(:focus) */
.form-control:invalid:not(:placeholder-shown):not(:focus) + .hv-field-error,
.form-select:invalid:not(:focus) + .hv-field-error,
textarea:invalid:not(:placeholder-shown):not(:focus) + .hv-field-error {
  display: block;
}

/* Border-Akzent fuer invalid Eingaben (gleiche Sichtbarkeitslogik) */
.form-control:user-invalid,
.form-select:user-invalid,
textarea:user-invalid {
  border-color: var(--color-danger);
}
.form-control:invalid:not(:placeholder-shown):not(:focus),
textarea:invalid:not(:placeholder-shown):not(:focus) {
  border-color: var(--color-danger);
}

/* Server-seitige Inline-Fehler (immer sichtbar wenn die Klasse gesetzt ist) */
.hv-form-error {
  display: block;
  font-size: var(--fs-xs);
  color: var(--color-danger);
  margin-top: 0.25rem;
  line-height: 1.35;
}
.hv-form-error::before {
  content: '⚠ ';
  font-weight: var(--fw-bold);
}

/* Form-Field mit Server-Fehler: Container bekommt eine ID, die im
   form-errors-Partial als Anchor-Link verlinkt ist. Scroll-Margin-Top
   sorgt dafuer, dass der Anchor nicht hinter der Sidebar-Header verschwindet. */
.hv-field--error {
  scroll-margin-top: 80px;
}
.hv-field--error .form-control,
.hv-field--error .form-select,
.hv-field--error textarea {
  border-color: var(--color-danger);
}

/* ════════════════════════════════════════════════════════════════════════════
   Tabellen-Pattern (Phase 2.2)
   ────────────────────────────────────────────────────────────────────────────
   .hv-num         numerische Zelle (rechtsbuendig + Mono + tabular-nums)
   .hv-table-clickable  ganze Zeile als Click-Target (data-href)
   [data-density]  Density-Toggle (compact | cozy | comfy)
   ════════════════════════════════════════════════════════════════════════════ */
.hv-num {
  text-align: right;
  font-family: var(--font-mono);
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
}

.hv-table-clickable tbody tr[data-href] {
  cursor: pointer;
  transition: background-color 120ms ease;
}
.hv-table-clickable tbody tr[data-href]:hover {
  background-color: rgba(0, 0, 0, 0.025);
}
[data-theme="dark"] .hv-table-clickable tbody tr[data-href]:hover {
  background-color: rgba(255, 255, 255, 0.04);
}

/* Density-Toggle: globale Einstellung in localStorage 'hv-density'.
   Default = cozy (Bootstrap-Default). Compact spart 30 % Vertikal-Raum,
   Comfy ist fuer Lese-Modus. */
[data-density="compact"] .table > :not(caption) > * > *,
[data-density="compact"] table > :not(caption) > * > * {
  padding-top: 0.25rem;
  padding-bottom: 0.25rem;
}
[data-density="compact"] .table,
[data-density="compact"] table.table-sm {
  font-size: var(--fs-xs);
}
[data-density="comfy"] .table > :not(caption) > * > *,
[data-density="comfy"] table > :not(caption) > * > * {
  padding-top: 0.85rem;
  padding-bottom: 0.85rem;
}

/* Density-Toggle-Button selbst (in Sidebar-Footer einsetzbar) */
.hv-density-toggle {
  display: inline-flex;
  gap: 1px;
  background: var(--color-muted-bg, #E5E5E5);
  border-radius: var(--radius-pill);
  padding: 2px;
}
.hv-density-toggle button {
  background: transparent;
  border: 0;
  padding: 0.15rem 0.55rem;
  font-size: var(--fs-xs);
  color: var(--color-muted);
  border-radius: var(--radius-pill);
  cursor: pointer;
}
.hv-density-toggle button[aria-pressed="true"] {
  background: var(--brand-primary, #1E3A5F);
  color: var(--brand-primary-on, #fff);
}
[data-theme="dark"] .hv-density-toggle {
  background: rgba(255, 255, 255, 0.06);
}
[data-theme="dark"] .hv-density-toggle button[aria-pressed="true"] {
  background: var(--brand-accent-industrial);
  color: #0A0A0B;
}

/* ════════════════════════════════════════════════════════════════════════════
   Mobile-Bottom-Nav (Phase 2.3)
   ────────────────────────────────────────────────────────────────────────────
   Fixe Navigation am unteren Bildschirmrand auf Mobile (<768px). Verdeckt
   die Sidebar nicht — Sidebar bleibt als Hamburger/Offcanvas verfuegbar.
   Touch-Targets mindestens 44x44 px (Apple/Google-Guideline).
   ════════════════════════════════════════════════════════════════════════════ */
.hv-bottom-nav {
  position: fixed;
  bottom: 0;
  left: 0;
  right: 0;
  z-index: 1030;
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 0;
  background: var(--brand-primary, #1E3A5F);
  border-top: 1px solid rgba(255, 255, 255, 0.1);
  padding: 0.25rem 0 max(0.25rem, env(safe-area-inset-bottom));
  box-shadow: 0 -2px 8px rgba(0, 0, 0, 0.08);
}
[data-theme="dark"] .hv-bottom-nav {
  background: #0F1418;
  border-top-color: rgba(255, 255, 255, 0.08);
}
.hv-bottom-nav-item {
  position: relative;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  min-height: 44px;
  padding: 0.35rem 0.5rem;
  background: transparent;
  border: 0;
  text-decoration: none;
  color: rgba(255, 255, 255, 0.65);
  font-size: var(--fs-xs);
  line-height: 1.1;
  transition: color 100ms ease;
  cursor: pointer;
}
.hv-bottom-nav-item:hover,
.hv-bottom-nav-item:focus-visible {
  color: rgba(255, 255, 255, 0.92);
}
.hv-bottom-nav-item.active {
  color: var(--brand-accent-industrial, #5BB0D9);
}
.hv-bottom-nav-item i {
  font-size: 1.15rem;
  margin-bottom: 2px;
}
.hv-bottom-nav-item span {
  font-size: 0.65rem;
  letter-spacing: 0.02em;
}
/* Ungelesene-Mails-Badge: roter Kreis oben rechts am Icon */
.hv-bottom-nav-badge {
  position: absolute;
  top: 2px;
  left: 50%;
  margin-left: 0.4rem;
  min-width: 1.05rem;
  padding: 0.05rem 0.3rem;
  background: var(--hv-danger, #d92d20);
  color: #fff;
  font-size: 0.6rem;
  font-weight: 700;
  line-height: 1.3;
  text-align: center;
  border-radius: 10px;
  pointer-events: none;
}

/* Bottom-Nav verdeckt unteren Content — Padding fuer den Content auf Mobile */
@media (max-width: 767.98px) {
  body:has(.hv-bottom-nav) .hv-content,
  body:has(.hv-bottom-nav) main {
    padding-bottom: 4.5rem;
  }
}

/* ════════════════════════════════════════════════════════════════════════════
   Inline-Hilfe — Tooltip-Popover (Phase 2.5)
   ────────────────────────────────────────────────────────────────────────────
   Klick-getriggertes Popover fuer komplexe Felder (Kappungsgrenze,
   Verteilerschluessel, AfA-Restwert, Mietspiegel). Kein Hover, weil Mobile
   das nicht hat. Keine Wall-of-Text — max. 2-3 Saetze pro Tip.
   ════════════════════════════════════════════════════════════════════════════ */
.hv-tip {
  cursor: pointer;
  color: var(--color-muted, #525252);
  margin-left: 0.25rem;
  font-size: 0.95em;
  vertical-align: middle;
  transition: color 100ms ease;
}
.hv-tip:hover,
.hv-tip:focus-visible {
  color: var(--brand-primary, #1E3A5F);
}
[data-theme="dark"] .hv-tip:hover,
[data-theme="dark"] .hv-tip:focus-visible {
  color: var(--brand-accent-industrial, #5BB0D9);
}

/* Popover-Variante: schmaler + im Industrial-Look */
.popover.hv-tip-popover {
  max-width: 300px;
  font-size: var(--fs-sm);
  border: 1px solid var(--hv-border, #e5e7eb);
  box-shadow: var(--shadow-lg);
}
.popover.hv-tip-popover .popover-header {
  font-weight: var(--fw-bold);
  font-size: var(--fs-sm);
  background: var(--color-muted-bg, #f1f5f9);
  border-bottom: 0;
}
.popover.hv-tip-popover .popover-body {
  font-size: var(--fs-sm);
  line-height: 1.5;
}
[data-theme="dark"] .popover.hv-tip-popover {
  background: #1A1A1B;
  border-color: rgba(255, 255, 255, 0.12);
  color: #E5E5E5;
}
[data-theme="dark"] .popover.hv-tip-popover .popover-header {
  background: #0F1418;
  color: #fff;
}
[data-theme="dark"] .popover.hv-tip-popover .popover-arrow::after {
  border-top-color: #1A1A1B;
  border-bottom-color: #1A1A1B;
}

/* ════════════════════════════════════════════════════════════════════════════
   Auto-Save-Indikator (Phase 2.1)
   ────────────────────────────────────────────────────────────────────────────
   Wird in Wizard-Steps (Mieterhoehung, NK, Onboarding) eingesetzt.
   ════════════════════════════════════════════════════════════════════════════ */
.hv-autosave {
  display: inline-flex;
  align-items: center;
  gap: 0.35rem;
  font-size: var(--fs-xs);
  color: var(--color-success);
  opacity: 0;
  transition: opacity 200ms ease;
  pointer-events: none;
}
.hv-autosave.hv-autosave-visible {
  opacity: 1;
}
.hv-autosave::before {
  content: '✓';
  font-weight: var(--fw-bold);
}
[data-theme="dark"] .hv-autosave {
  color: #6EE7A7;
}

/* ════════════════════════════════════════════════════════════════════════════
   Step-Wizard (Phase 3.1)
   ────────────────────────────────────────────────────────────────────────────
   Fortschrittsanzeige fuer Multi-Step-Forms. Status:
   done = grün + Haken + klickbar; active = Brand + fett; todo = muted.
   ════════════════════════════════════════════════════════════════════════════ */
.hv-step-wizard-list {
  list-style: none;
  padding: 0;
  margin: 0;
  display: flex;
  flex-wrap: wrap;
  gap: 0.5rem;
  font-size: var(--fs-sm);
}
.hv-step-wizard-item {
  display: inline-flex;
  align-items: center;
  gap: 0.5rem;
  padding: 0.35rem 0.75rem;
  border-radius: var(--radius-pill);
  background: transparent;
}
.hv-step-wizard-item + .hv-step-wizard-item::before {
  content: '›';
  color: var(--color-muted);
  margin-right: 0.25rem;
  font-size: 1.1em;
}
.hv-step-wizard-num {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 22px;
  height: 22px;
  border-radius: 50%;
  font-size: var(--fs-xs);
  font-weight: var(--fw-bold);
  background: var(--color-muted-bg);
  color: var(--color-muted);
}
.hv-step-wizard-item.done .hv-step-wizard-num {
  background: var(--color-success);
  color: var(--color-success-on);
}
.hv-step-wizard-item.active .hv-step-wizard-num {
  background: var(--brand-primary);
  color: var(--brand-primary-on);
}
.hv-step-wizard-titel {
  color: var(--color-muted);
  text-decoration: none;
}
.hv-step-wizard-item.done .hv-step-wizard-titel { color: var(--color-success); }
.hv-step-wizard-item.done a.hv-step-wizard-titel:hover { text-decoration: underline; }
.hv-step-wizard-item.active .hv-step-wizard-titel {
  color: var(--brand-primary);
  font-weight: var(--fw-bold);
}
[data-theme="dark"] .hv-step-wizard-num {
  background: rgba(255, 255, 255, 0.1);
  color: rgba(255, 255, 255, 0.7);
}
[data-theme="dark"] .hv-step-wizard-item.done .hv-step-wizard-num {
  background: rgba(34, 197, 94, 0.3);
  color: #6EE7A7;
}
[data-theme="dark"] .hv-step-wizard-item.done .hv-step-wizard-titel { color: #6EE7A7; }
[data-theme="dark"] .hv-step-wizard-item.active .hv-step-wizard-num {
  background: var(--brand-accent-industrial);
  color: #0A0A0B;
}
[data-theme="dark"] .hv-step-wizard-item.active .hv-step-wizard-titel {
  color: var(--brand-accent-industrial);
}

/* ════════════════════════════════════════════════════════════════════════════
   Onboarding-Tour-Spotlight (Phase 3.6)
   ────────────────────────────────────────────────────────────────────────────
   Dunkler Backdrop mit "ausgeschnittenem" Spotlight um das Tour-Ziel-Element.
   Bubble (.hv-tour-bubble) zeigt Titel + Markdown-Body + Skip/Weiter.
   ════════════════════════════════════════════════════════════════════════════ */
.hv-tour-overlay {
  position: fixed;
  inset: 0;
  z-index: 1090;
  pointer-events: none;
}
.hv-tour-overlay::before {
  content: '';
  position: absolute;
  inset: 0;
  background: rgba(10, 10, 11, 0.55);
  backdrop-filter: blur(2px);
  pointer-events: auto;
}
.hv-tour-spotlight {
  position: absolute;
  border-radius: var(--radius-md);
  box-shadow: 0 0 0 9999px rgba(10, 10, 11, 0.55), 0 0 0 3px var(--brand-accent-industrial);
  pointer-events: none;
  transition: all 200ms ease;
}
.hv-tour-bubble {
  position: absolute;
  max-width: 360px;
  background: #fff;
  color: #1A1A1A;
  border-radius: var(--radius-md);
  padding: 1rem 1.15rem;
  box-shadow: var(--shadow-lg);
  pointer-events: auto;
  font-size: var(--fs-sm);
  line-height: 1.5;
}
.hv-tour-bubble h3 {
  margin: 0 0 0.5rem 0;
  font-size: var(--fs-base);
  font-weight: var(--fw-bold);
}
.hv-tour-bubble p { margin: 0 0 0.5rem 0; }
.hv-tour-bubble p:last-child { margin-bottom: 0; }
.hv-tour-bubble ul { margin: 0 0 0.75rem 0; padding-left: 1.25rem; }
.hv-tour-bubble strong { color: var(--brand-primary); }
.hv-tour-actions {
  display: flex;
  gap: 0.5rem;
  align-items: center;
  margin-top: 0.85rem;
  padding-top: 0.75rem;
  border-top: 1px solid var(--hv-border, #e5e7eb);
}
.hv-tour-progress {
  font-size: var(--fs-xs);
  color: var(--color-muted);
  margin-right: auto;
}
[data-theme="dark"] .hv-tour-bubble {
  background: #1A1A1B;
  color: #E5E5E5;
}
[data-theme="dark"] .hv-tour-bubble strong { color: var(--brand-accent-industrial); }
[data-theme="dark"] .hv-tour-actions { border-top-color: rgba(255, 255, 255, 0.1); }

/* ════════════════════════════════════════════════════════════════════════════
   A11y: prefers-reduced-motion (Phase 3.5)
   ────────────────────────────────────────────────────────────────────────────
   Wenn der User reduced-motion eingestellt hat, schalten wir Animationen
   + Transitions global ab. Greift auf alle hv-* Komponenten, Bootstrap
   (.fade, .collapse) UND inline transition-Werte.
   ════════════════════════════════════════════════════════════════════════════ */
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
    scroll-behavior: auto !important;
  }
}

/* ════════════════════════════════════════════════════════════════════════════
   S-NAV — Klick-Feedback bei klassischer Navigation (alle 4 Surfaces)
   ──────────────────────────────────────────────────────────────────────────── */

/* Top-Progress-Bar (gesteuert von public/js/nav-progress.js). */
.hv-nav-progress {
  position: fixed;
  top: 0;
  left: 0;
  height: 3px;
  width: 0;
  background: var(--brand-primary, #2D6B8E);
  box-shadow: 0 0 8px rgba(45, 107, 142, 0.55);
  opacity: 0;
  z-index: 2000;
  pointer-events: none;
  transition: width 0.2s ease, opacity 0.2s ease;
}
@media (prefers-reduced-motion: reduce) {
  /* Balken bleibt als reines „läuft"-Signal, aber ohne laufende Animation. */
  .hv-nav-progress { transition: none; }
}

/* View-Transitions: BEWUSST DEAKTIVIERT (Entscheidung 2026-06-10 nach 3
   Guard-Iterationen). @view-transition { navigation: auto } erzeugt in Chromium
   beim Browser-Teardown/Viewport-Resize einen in-page NICHT abfangbaren
   "Transition was aborted"-pageerror (weder pagereveal/pageswap-Catch noch
   früher unhandledrejection-Filter noch skipTransition halfen — die Seite ist
   beim Abort bereits in Zerstörung). Das verschmutzt jeden automatisierten
   Browser-Lauf und maskiert echte Fehler. Der Weiß-Blitz ist stattdessen über
   den dunklen Erst-Paint (Inline-Style in main.handlebars) gelöst, das
   Klick-Feedback über die Top-Progress-Bar (nav-progress.js). Die vt-guard-/
   skipTransition-Mechanik bleibt harmlos bestehen, falls VT später (besserer
   Browser-Support) reaktiviert wird. */

/* ════════════════════════════════════════════════════════════════════════════
   S-CHART/S-LOAD — Skeleton-Platzhalter (alle Surfaces; .hv-skeleton liegt sonst
   nur in app.css = Admin, fehlt aber im Portal/Public). Theme-neutral.
   ──────────────────────────────────────────────────────────────────────────── */
.hv-skeleton {
  position: relative;
  width: 100%;
  border-radius: 6px;
  background: linear-gradient(90deg,
    rgba(128, 128, 128, 0.06) 0%,
    rgba(128, 128, 128, 0.12) 50%,
    rgba(128, 128, 128, 0.06) 100%);
  background-size: 200% 100%;
  animation: hv-skeleton-pulse 1.5s ease-in-out infinite;
}
.hv-skeleton-msg {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  font-size: 0.85rem;
  color: var(--color-ink-soft, #6c757d);
  white-space: nowrap;
}
@keyframes hv-skeleton-pulse {
  0%   { background-position: 200% 0; }
  100% { background-position: -200% 0; }
}
@media (prefers-reduced-motion: reduce) {
  .hv-skeleton { animation: none; }
}

/* Chart-Container: reserviert Platz (kein CLS/Leerblitz) + Skeleton liegt als
   Overlay über dem Canvas, bis nav die [data-chart-skeleton]-Elemente entfernt. */
.hv-chart-wrap { position: relative; }
.hv-chart-skeleton {
  position: absolute;
  inset: 0;
  height: auto !important;
  border-radius: 8px;
}

/* ════════════════════════════════════════════════════════════════════════════
   S-FILE — gestylter Datei-Upload (deutsch + Dateiname). Ersetzt das native,
   teils englische <input type=file>. Label umschließt das visuell versteckte
   Input; JS (app.js / portal-init.js) füllt [data-upload-name].
   ──────────────────────────────────────────────────────────────────────────── */
.hv-upload { position: relative; display: inline-flex; align-items: center; gap: 10px; flex-wrap: wrap; cursor: pointer; max-width: 100%; }
.hv-upload__input {
  position: absolute; width: 1px; height: 1px;
  padding: 0; margin: -1px; overflow: hidden;
  clip: rect(0 0 0 0); border: 0;
}
.hv-upload__btn {
  display: inline-flex; align-items: center; gap: 6px;
  padding: 0.45rem 0.9rem; border-radius: 8px;
  border: 1px solid var(--color-line, #ced4da);
  background: var(--color-paper-deep, #f1f3f5);
  color: var(--color-ink, #15243C);
  font-size: 0.9rem; font-weight: 500; white-space: nowrap;
}
.hv-upload:hover .hv-upload__btn,
.hv-upload:focus-within .hv-upload__btn {
  border-color: var(--brand-primary, #2D6B8E);
  background: var(--color-brand-haze, #E5EFF5);
}
.hv-upload__name { font-size: 0.85rem; color: var(--color-ink-soft, #6c757d); word-break: break-word; }


/* ═══ buttons.css ═══ */
/* ════════════════════════════════════════════════════════════════════════════
   buttons.css — Konsolidierte Button-Hierarchie (Design-System-Audit 2026-05-16)
   ────────────────────────────────────────────────────────────────────────────
   Vor diesem Refactor: 17 verschiedene Button-Varianten ueber 4 Surfaces
   (btn-blue / btn-cta-primary / btn-hero / btn-nav / btn-outline-dark /
    btn-cta-secondary / btn-hero-ghost / btn-cookie-* / btn-wohnung / …)

   Nachher: Drei semantische Varianten × drei Groessen, plus Bootstrap-
   Kompatibilitaet. Legacy-Namen sind als Aliases (Multi-Selektor) erhalten,
   sodass kein View geaendert werden muss.

   Verwendung (neu):
     <button class="ds-btn ds-btn--primary">Hauptaktion</button>
     <button class="ds-btn ds-btn--secondary">Sekundaer</button>
     <button class="ds-btn ds-btn--ghost">Tertiaer</button>
     <button class="ds-btn ds-btn--primary ds-btn--sm">Klein</button>
     <button class="ds-btn ds-btn--primary ds-btn--lg">Gross</button>

   "ds-" als Prefix = "design-system". Vermeidet Kollision mit Bootstrap
   (.btn) und alten Custom-Klassen.

   Migration: Sub-Agent kann in einem zweiten Schritt iterativ Views auf die
   neuen .ds-btn-Klassen umstellen. Aliases unten loeschen wenn 100% migriert.
   ════════════════════════════════════════════════════════════════════════════ */

/* ── Basis ──────────────────────────────────────────────────────────────── */
.ds-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 0.5rem;
  padding: 0.75rem 1.6rem;
  border: 1px solid transparent;
  border-radius: var(--radius-md, 10px);
  font-family: var(--font-sans, system-ui, sans-serif);
  font-size: 0.92rem;
  font-weight: 600;
  line-height: 1.2;
  text-decoration: none;
  white-space: nowrap;
  cursor: pointer;
  transition: background 0.2s, color 0.2s, border-color 0.2s, box-shadow 0.2s, transform 0.2s;
  -webkit-appearance: none;
  appearance: none;
}

.ds-btn:disabled,
.ds-btn[aria-disabled="true"] {
  opacity: 0.55;
  cursor: not-allowed;
  pointer-events: none;
}

.ds-btn:focus-visible {
  outline: var(--focus-ring-width) solid var(--color-brand, #2D6B8E);
  outline-offset: 2px;
}

/* Loading-State: Pseudo-Element-Spinner, ersetzt Button-Text-Position */
.ds-btn[data-loading="true"] {
  position: relative;
  color: transparent !important;
  pointer-events: none;
}
.ds-btn[data-loading="true"]::after {
  content: '';
  position: absolute;
  inset: auto;
  width: 1rem;
  height: 1rem;
  border-radius: 50%;
  border: 2px solid currentColor;
  border-right-color: transparent;
  color: var(--color-paper, #fff);
  animation: ds-btn-spin 0.7s linear infinite;
}
@keyframes ds-btn-spin {
  to { transform: rotate(360deg); }
}

/* ── Variante: Primary (Hauptaktion, max 1 pro Screen) ─────────────────── */
.ds-btn--primary {
  background: var(--color-brand, #2D6B8E);
  color: #fff;
  border-color: var(--color-brand, #2D6B8E);
}
.ds-btn--primary:hover {
  background: var(--color-brand-deep, #1A4D6B);
  border-color: var(--color-brand-deep, #1A4D6B);
  color: #fff;
  transform: translateY(-1px);
  box-shadow: 0 8px 20px rgba(45, 107, 142, 0.35);
}
.ds-btn--primary:active {
  transform: translateY(0);
  box-shadow: 0 2px 6px rgba(45, 107, 142, 0.25);
}

/* ── Variante: Secondary (Outline-Stil, fuer Sekundaer-Aktionen) ───────── */
.ds-btn--secondary {
  background: transparent;
  color: var(--color-ink, #15243C);
  border-color: var(--color-line, #DDD4C2);
  border-width: 1.5px;
}
.ds-btn--secondary:hover {
  background: var(--color-paper-deep, #EDE5D4);
  border-color: var(--color-ink, #15243C);
  color: var(--color-ink, #15243C);
}

/* Secondary auf dunklem Hintergrund (Hero, CTA-Strip, Footer) */
.ds-btn--secondary.ds-btn--on-dark {
  color: rgba(255,255,255,0.78);
  border-color: rgba(255,255,255,0.2);
}
.ds-btn--secondary.ds-btn--on-dark:hover {
  color: #fff;
  background: rgba(255,255,255,0.07);
  border-color: rgba(255,255,255,0.45);
}

/* ── Variante: Ghost (Text-only, leichte Aktion) ───────────────────────── */
.ds-btn--ghost {
  background: transparent;
  color: var(--color-brand, #2D6B8E);
  border-color: transparent;
  padding: 0.55rem 0.85rem;
}
.ds-btn--ghost:hover {
  background: var(--color-brand-haze, #E5EFF5);
  color: var(--color-brand-deep, #1A4D6B);
}

/* ── Variante: Danger (Loeschen, kritische Aktion) ─────────────────────── */
.ds-btn--danger {
  background: var(--color-danger, #B91C1C);
  color: #fff;
  border-color: var(--color-danger, #B91C1C);
}
.ds-btn--danger:hover {
  background: #8B0F0F;
  border-color: #8B0F0F;
  transform: translateY(-1px);
  box-shadow: 0 8px 20px rgba(185, 28, 28, 0.35);
}

/* ── Groessen ──────────────────────────────────────────────────────────── */
.ds-btn--sm {
  padding: 0.45rem 1rem;
  font-size: 0.82rem;
  border-radius: var(--radius-sm, 6px);
}
.ds-btn--lg {
  padding: 0.9rem 1.85rem;
  font-size: 1rem;
  border-radius: 10px;
}

/* Full-Width-Variante (vor allem fuer Mobile-CTAs) */
.ds-btn--block {
  display: flex;
  width: 100%;
}

/* ════════════════════════════════════════════════════════════════════════
   LEGACY-ALIASES (2026-05-16)
   ────────────────────────────────────────────────────────────────────────
   Existierende Klassen werden auf die neuen Tokens gemappt, sodass kein
   View-Refactor noetig ist. Bei Aenderungen am Look-and-Feel:
   AUSSCHLIESSLICH die .ds-btn--*-Klassen oben aendern — die Aliases
   erben automatisch.
   ════════════════════════════════════════════════════════════════════════ */

/* Primary-Variante: btn-blue, btn-cta-primary, btn-hero, btn-nav */
.btn-blue,
.btn-cta-primary,
.btn-hero,
.btn-nav {
  background: var(--color-brand);
  color: #fff !important;
  border: 1px solid var(--color-brand);
  padding: 0.75rem 1.6rem;
  border-radius: var(--radius-md, 10px);
  font-weight: 600;
  font-size: 0.92rem;
  text-decoration: none;
  display: inline-flex;
  align-items: center;
  gap: 0.4rem;
  white-space: nowrap;
  transition: background 0.2s, transform 0.2s, box-shadow 0.2s;
}
.btn-blue:hover,
.btn-cta-primary:hover,
.btn-hero:hover,
.btn-nav:hover {
  background: var(--color-brand-deep) !important;
  color: #fff !important;
  transform: translateY(-1px);
  box-shadow: 0 8px 20px rgba(45, 107, 142, 0.35);
}
/* Hero-spezifisch: groesseres Padding */
.btn-hero { padding: 0.9rem 1.85rem; font-size: 0.95rem; font-weight: 700; }
/* Nav-spezifisch: kleineres Padding (passt in Navbar-Hoehe) */
.btn-nav  { padding: 0.45rem 1.1rem !important; font-size: 0.875rem; }

/* Secondary-Variante: btn-outline-dark, btn-cta-secondary, btn-hero-ghost */
.btn-outline-dark {
  background: transparent;
  color: var(--color-ink);
  border: 1.5px solid var(--color-line);
  padding: 0.7rem 1.6rem;
  border-radius: var(--radius-md, 10px);
  font-weight: 600;
  font-size: 0.92rem;
  text-decoration: none;
  display: inline-flex;
  align-items: center;
  gap: 0.4rem;
  transition: all 0.2s;
}
.btn-outline-dark:hover {
  border-color: var(--color-ink);
  color: var(--color-ink);
  background: var(--color-paper-deep);
}

/* Secondary-Variante "on-dark": CTA-Strip, Hero-Ghost */
.btn-cta-secondary,
.btn-hero-ghost {
  background: transparent;
  color: rgba(255,255,255,0.78);
  border: 1px solid rgba(255,255,255,0.2);
  padding: 0.85rem 1.75rem;
  border-radius: var(--radius-md, 10px);
  font-weight: 600;
  font-size: 0.92rem;
  text-decoration: none;
  display: inline-flex;
  align-items: center;
  gap: 0.5rem;
  transition: all 0.22s;
}
.btn-cta-secondary:hover,
.btn-hero-ghost:hover {
  color: #fff;
  background: rgba(255,255,255,0.07);
  border-color: rgba(255,255,255,0.45);
}

/* Cookie-Banner-Buttons: btn-cookie-accept (primary), btn-cookie-decline (ghost-on-dark) */
.btn-cookie-accept {
  background: var(--color-brand);
  color: #fff;
  border: none;
  padding: 0.55rem 1.25rem;
  border-radius: var(--radius-sm, 8px);
  font-size: 0.83rem;
  font-weight: 600;
  cursor: pointer;
  transition: background 0.2s;
}
.btn-cookie-accept:hover { background: var(--color-brand-deep); }

.btn-cookie-decline {
  background: transparent;
  color: rgba(255,255,255,0.55);
  border: 1px solid rgba(255,255,255,0.18);
  padding: 0.55rem 1.25rem;
  border-radius: var(--radius-sm, 8px);
  font-size: 0.83rem;
  cursor: pointer;
  transition: color 0.2s, border-color 0.2s;
}
.btn-cookie-decline:hover { color: #fff; border-color: rgba(255,255,255,0.35); }

/* Wohnung-Card-Button: btn-wohnung (Sonderfall — Outline-Light) */
.btn-wohnung {
  display: block;
  text-align: center;
  background: var(--color-brand-haze);
  color: var(--color-brand-deep);
  border: 1px solid var(--color-brand-mist);
  padding: 0.65rem;
  border-radius: var(--radius-sm, 8px);
  font-weight: 700;
  font-size: 0.875rem;
  text-decoration: none;
  margin-top: 1rem;
  transition: all 0.2s;
}
.btn-wohnung:hover {
  background: var(--color-brand);
  color: #fff;
  border-color: var(--color-brand);
}


/* ═══ forms.css ═══ */
/* ════════════════════════════════════════════════════════════════════════════
   forms.css — Vereinheitlichtes Form-Pattern (Public-Surface)
   ────────────────────────────────────────────────────────────────────────────
   2026-05-16 Audit-Folge: 4 Public-Forms (Vormerk-Mieter, Vormerk-Eigentuemer,
   Kontakt, Schadensmeldung) hatten je eigene Layout-Logik. Diese Datei
   liefert das gemeinsame Pattern.

   Verwendung:
     <form class="ds-form" method="post" action="...">
       <div class="ds-form__row">                <!-- 2-Spalter -->
         <div class="ds-field ds-field--required">
           <label for="vorname">Vorname</label>
           <input id="vorname" name="vorname" type="text" required
                  autocomplete="given-name" placeholder=" ">
           <small class="ds-field__error">Bitte Vornamen angeben</small>
         </div>
         <div class="ds-field ds-field--required">…</div>
       </div>

       <div class="ds-field">                    <!-- 1-Spalter -->
         <label for="anmerkung">Anmerkung (optional)</label>
         <textarea id="anmerkung" name="anmerkung" rows="4" placeholder=" "></textarea>
       </div>

       <!-- Honeypot fuer Spam-Bots (versteckt, Bots fuellen es aus) -->
       <input type="text" name="firma_name" tabindex="-1" autocomplete="off"
              style="position:absolute;left:-9999px" aria-hidden="true">

       <button type="submit" class="ds-btn ds-btn--primary ds-btn--lg ds-btn--block">
         Anfrage senden
       </button>
     </form>
   ════════════════════════════════════════════════════════════════════════════ */

.ds-form {
  display: flex;
  flex-direction: column;
  gap: var(--space-4, 1rem);
}

/* Row = 2-Spalter (auf Mobile: 1-Spalter) */
.ds-form__row {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: var(--space-4, 1rem);
}
@media (max-width: 640px) {
  .ds-form__row { grid-template-columns: 1fr; }
}

/* Section-Heading innerhalb des Forms (z.B. "Ihre Daten" / "Ihr Anliegen") */
.ds-form__section {
  font-family: var(--font-display);
  font-size: 0.85rem;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 0.12em;
  color: var(--blue);
  margin: var(--space-5, 1.5rem) 0 var(--space-2, 0.5rem);
  padding-bottom: var(--space-2, 0.5rem);
  border-bottom: 1px solid var(--border);
}
.ds-form__section:first-child { margin-top: 0; }

/* Field = Label + Input + (optional) Error/Helper */
.ds-field {
  display: flex;
  flex-direction: column;
  gap: 0.35rem;
}

.ds-field > label {
  font-size: 0.82rem;
  font-weight: 500;
  color: var(--text-muted);
  letter-spacing: 0.005em;
  font-family: var(--font-sans);
}

/* Required-Stern auto */
.ds-field--required > label::after {
  content: ' *';
  color: var(--accent-spark);
  font-weight: 700;
}

.ds-field > input,
.ds-field > select,
.ds-field > textarea {
  display: block;
  width: 100%;
  padding: 0.65rem 0.85rem;
  background: var(--surface);
  border: 1.5px solid var(--border);
  border-radius: var(--radius-md, 8px);
  font-family: var(--font-sans);
  font-size: 0.95rem;
  color: var(--dark);
  line-height: 1.4;
  transition: border-color 0.18s, box-shadow 0.18s;
  -webkit-appearance: none;
  appearance: none;
}

.ds-field > textarea {
  resize: vertical;
  min-height: 120px;
  font-family: var(--font-sans);
}

.ds-field > select {
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 8' fill='none' stroke='%236B5E4E' stroke-width='1.8' stroke-linecap='round'><path d='M1 1 L6 6 L11 1'/></svg>");
  background-repeat: no-repeat;
  background-position: right 1rem center;
  background-size: 12px 8px;
  padding-right: 2.4rem;
}

.ds-field > input::placeholder,
.ds-field > textarea::placeholder { color: var(--text-muted); opacity: 0.55; }

.ds-field > input:hover,
.ds-field > select:hover,
.ds-field > textarea:hover { border-color: var(--blue-mid); }

.ds-field > input:focus,
.ds-field > select:focus,
.ds-field > textarea:focus {
  border-color: var(--blue);
  outline: none;
  box-shadow: 0 0 0 3px rgba(45, 107, 142, 0.18);
}

/* Validation: nur nach User-Interaktion (Modern Browser via :user-invalid).
   Placeholder=" " trick erlaubt :placeholder-shown-Fallback. */
.ds-field > input:user-invalid,
.ds-field > select:user-invalid,
.ds-field > textarea:user-invalid {
  border-color: var(--color-danger, #B91C1C);
}
.ds-field > input:invalid:not(:placeholder-shown):not(:focus),
.ds-field > textarea:invalid:not(:placeholder-shown):not(:focus) {
  border-color: var(--color-danger, #B91C1C);
}

.ds-field__error {
  display: none;
  font-size: 0.8rem;
  color: var(--color-danger, #B91C1C);
  margin-top: 0.15rem;
  line-height: 1.4;
  font-family: var(--font-sans);
}

.ds-field > input:user-invalid ~ .ds-field__error,
.ds-field > select:user-invalid ~ .ds-field__error,
.ds-field > textarea:user-invalid ~ .ds-field__error,
.ds-field > input:invalid:not(:placeholder-shown):not(:focus) ~ .ds-field__error,
.ds-field > textarea:invalid:not(:placeholder-shown):not(:focus) ~ .ds-field__error {
  display: block;
}

.ds-field__helper {
  font-size: 0.78rem;
  color: var(--text-muted);
  line-height: 1.5;
  margin-top: 0.15rem;
  font-family: var(--font-sans);
}

/* Server-side Error (immer sichtbar, nicht an :invalid gekoppelt) */
.ds-field--server-error > input,
.ds-field--server-error > select,
.ds-field--server-error > textarea {
  border-color: var(--color-danger, #B91C1C);
  background: #FEE2E2;
}
.ds-field--server-error .ds-field__error { display: block; }

/* Checkbox/Radio (z.B. fuer Datenschutz-Zustimmung) */
.ds-field--check {
  flex-direction: row;
  align-items: flex-start;
  gap: 0.65rem;
}
.ds-field--check > input[type="checkbox"],
.ds-field--check > input[type="radio"] {
  width: 1.15rem;
  height: 1.15rem;
  margin-top: 0.15rem;
  accent-color: var(--blue);
  flex-shrink: 0;
}
.ds-field--check > label {
  font-size: 0.88rem;
  color: var(--dark);
  font-weight: 400;
  line-height: 1.55;
  text-transform: none;
  letter-spacing: 0;
}
.ds-field--check > label a {
  color: var(--blue);
  text-decoration: underline;
}

/* Form-Card-Wrapper: gemeinsamer Container fuer Public-Formulare */
.ds-form-card {
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--radius-lg, 14px);
  padding: var(--space-6, 2rem);
  max-width: 580px;
  margin: 0 auto;
}
.ds-form-card__title {
  font-family: var(--font-display);
  font-size: 1.4rem;
  font-weight: 600;
  margin-bottom: 0.4rem;
  color: var(--dark);
}
.ds-form-card__intro {
  font-size: 0.92rem;
  color: var(--text-muted);
  margin-bottom: var(--space-5, 1.5rem);
  line-height: 1.6;
  font-family: var(--font-sans);
}

/* Success-State nach erfolgreichem Submit */
.ds-form-success {
  background: var(--surface);
  border: 1px solid var(--blue-mid);
  border-radius: var(--radius-lg, 14px);
  padding: var(--space-6, 2rem);
  text-align: center;
  max-width: 580px;
  margin: 0 auto;
}
.ds-form-success__icon {
  width: 64px;
  height: 64px;
  background: var(--blue-light);
  color: var(--blue);
  border-radius: 50%;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  font-size: 1.8rem;
  margin-bottom: var(--space-3, 0.75rem);
}
.ds-form-success__title {
  font-family: var(--font-display);
  font-size: 1.4rem;
  font-weight: 600;
  margin-bottom: 0.4rem;
}
.ds-form-success__text {
  color: var(--text-muted);
  font-size: 0.95rem;
  line-height: 1.6;
}


/* ═══ public.css ═══ */
/* ════════════════════════════════════════════════════════════════════════════
   public.css — Oeffentliche Homepage (rottensteiner-hausverwaltung.de)
   ────────────────────────────────────────────────────────────────────────────
   Refactor 2026-05-16: Aus views/layouts/public.handlebars (1355 Zeilen
   inline) ausgelagert. Quickwin-D-Folge (CSP-Hardening), gleichzeitig:
     - Display-Font Fraunces (variable, lokal gehostet, OFL)
     - Body-Font Geist (variable, lokal gehostet, OFL)
     - Bodensee-Color-Palette (warmer, regionaler) statt generischer Saas-Blau
     - Hero mit Layered-Gradient + SVG-Wellen-Pattern statt flach #2d2d2d
     - Foto-Container im Warum-Block (statt Person-Icon-Placeholder)

   Variablen-Namen (--dark, --blue, --cream …) bleiben gleich → bestehender
   Code funktioniert weiter. Nur die HEX-Werte sind angepasst.
   ════════════════════════════════════════════════════════════════════════════ */

/* ── @font-face: lokal gehostet, kein Google-CDN ───────────────────────── */
@font-face {
  font-family: 'Fraunces';
  src: url('/fonts/Fraunces-Variable.woff2?v=269a61876b') format('woff2-variations'),
       url('/fonts/Fraunces-Variable.woff2?v=269a61876b') format('woff2');
  font-weight: 100 900;
  font-style: normal;
  font-display: swap;
}

@font-face {
  font-family: 'Geist';
  src: url('/fonts/Geist-Variable.woff2?v=f5fdfd9874') format('woff2-variations'),
       url('/fonts/Geist-Variable.woff2?v=f5fdfd9874') format('woff2');
  font-weight: 100 900;
  font-style: normal;
  font-display: swap;
}

/* ── Design-Tokens ──────────────────────────────────────────────────────
   2026-05-16 Audit-Folge: --dark/--blue/--cream sind jetzt Aliases auf
   die semantischen --color-* Tokens in tokens.css. Aenderungen an der
   Bodensee-Palette werden NUR DORT vorgenommen (Single-Source-of-Truth).
   Public-Layout laedt tokens.css VOR public.css.
   ───────────────────────────────────────────────────────────────────── */
:root {
  /* Fraunces-Display-Font wird im Public verwendet — die Token-Aliases
     fuer --font-display-public / --font-sans-public kommen aus tokens.css.
     Hier nur die public-spezifischen Kuerzel fuer die Animations- und
     Variable-Font-Settings. */
  --font-display:  var(--font-display-public);
  --font-sans:     var(--font-sans-public);
  --fraunces-soft-default: 50;
  --fraunces-wonk-default: 0;

  /* Flaechen-Ton der hellen Abschnitte (04.09.2026).
     Vorher: reines #FFFFFF. In einer Palette aus warmem Papier (#F7F2EA) und
     warmen Linien (#DDD4C2) war das der einzige kalte Ton auf der Seite — und
     weisse Karten auf weissem Grund hingen nur an ihrem 1px-Rand.
     Jetzt: Abschnitt warm gebrochen, Karte bleibt reinweiss. Damit hebt sich
     jede Karte von selbst ab, ohne einen einzigen zusaetzlichen Schatten. */
  --flaeche-warm:  #FDFAF5;

  /* Apfelblueten-Akzent, zugriffssichere Tiefe (04.09.2026).
     --color-accent (#C8553D) aus tokens.css ist fuer Kleintext zu hell:
     4,18:1 auf der warmen Flaeche, 3,48:1 auf Schilf-Beige — beides unter
     den 4,5:1, die unsere Barrierefreiheitserklaerung zusichert. Dieser Ton
     schafft 6,04 / 5,02 / 6,29 auf warm / beige / weiss und bleibt derselbe
     Farbfamilie. Der Palettenwert bleibt fuer Flaechen und Schatten gueltig. */
  --akzent-warm:   #A83C27;
}

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

body {
  font-family: var(--font-sans);
  color: var(--text);
  background: var(--cream);
  line-height: 1.65;
  font-feature-settings: 'ss01', 'cv05';   /* Geist: subtiles Glyphen-Polish */
}

/* Headlines + Section-Titles nutzen Display-Font.
   Eyebrow + UI-Text bleibt Sans. */
h1, h2, h3, .section-title, .hero h1, .cta-strip h3, .footer-brand {
  font-family: var(--font-display);
  font-feature-settings: 'ss01';
  font-variation-settings: 'opsz' 80, 'SOFT' 50;
}

/* ── BFSG: Skip-Link & globaler Fokus-Indikator ─────────────── */
.skip-link {
  position: absolute;
  top: -100px;
  left: 0;
  z-index: 10000;
  background: var(--dark);
  color: #fff;
  padding: .75rem 1.25rem;
  border-radius: 0 0 8px 0;
  font-weight: 700;
  font-size: .9rem;
  text-decoration: none;
  transition: top .2s;
}
.skip-link:focus,
.skip-link:focus-visible {
  top: 0;
  outline: var(--focus-ring-width) solid var(--blue);
  outline-offset: 2px;
  color: #fff;
}

a:focus-visible,
button:focus-visible,
input:focus-visible,
select:focus-visible,
textarea:focus-visible,
[tabindex]:focus-visible {
  outline: var(--focus-ring-width) solid var(--blue);
  outline-offset: 2px;
  border-radius: 4px;
}

/* Knöpfe, Menüpunkte und Formularfelder: Bootstrap-Ausnahmen in tokens.css. */

/* Auf dem dunklen Marineblau (Fuß, Kopfbereich, Streifen) hatte See-Blau nur
   2,7:1; Morgennebel-Hell hat dort rund 10:1. */
.footer a:focus-visible,
.footer button:focus-visible,
.hero a:focus-visible,
.hero button:focus-visible,
.cta-strip a:focus-visible,
.cta-strip button:focus-visible {
  outline-color: var(--blue-mid);
}

/* ── Bootstrap-Default-Blau → Bodensee-Design-System ─────────────────────────
   An mehreren Stellen nutzt der öffentliche Auftritt rohe Bootstrap-Klassen
   (.btn-primary, .btn-outline-primary, .text-primary, ungestylte Links,
   nav-pills-Tabs). Deren Default-Blau #0d6efd fällt aus der Bodensee-Palette,
   und die aktive nav-pill kombiniert das Blau mit dem globalen Muted-Text-
   Override unten → brauner Text auf Blau, Kontrast 1.4:1 (WCAG-Fail). Hier
   einmalig auf --color-brand (#2D6B8E) gemappt. Nur Farben — kein Layout.
   ─────────────────────────────────────────────────────────────────────────── */
body {
  --bs-primary-rgb: 45, 107, 142;          /* #2D6B8E → text-/bg-/border-primary */
  --bs-link-color-rgb: 45, 107, 142;       /* ungestylte Links (Ratgeber, Breadcrumb) */
  --bs-link-hover-color-rgb: 26, 77, 107;  /* #1A4D6B (brand-deep) für Hover */
}

.btn-primary {
  --bs-btn-bg: var(--color-brand);
  --bs-btn-border-color: var(--color-brand);
  --bs-btn-hover-bg: var(--color-brand-deep);
  --bs-btn-hover-border-color: var(--color-brand-deep);
  --bs-btn-active-bg: var(--color-brand-deep);
  --bs-btn-active-border-color: var(--color-brand-deep);
  --bs-btn-disabled-bg: var(--color-brand);
  --bs-btn-disabled-border-color: var(--color-brand);
  --bs-btn-focus-shadow-rgb: 45, 107, 142;
}

.btn-outline-primary {
  --bs-btn-color: var(--color-brand);
  --bs-btn-border-color: var(--color-brand);
  --bs-btn-hover-bg: var(--color-brand);
  --bs-btn-hover-border-color: var(--color-brand);
  --bs-btn-active-bg: var(--color-brand);
  --bs-btn-active-border-color: var(--color-brand);
  --bs-btn-disabled-color: var(--color-brand);
  --bs-btn-disabled-border-color: var(--color-brand);
  --bs-btn-focus-shadow-rgb: 45, 107, 142;
}

/* nav-pills (Kontakt-Tabs, Portal-Preview-Tabs): aktive Pille auf Design-Blau
   mit weißer Schrift (Kontrast 5.8:1). Das color:#fff !important schlägt den
   .nav-link-Muted-Override weiter unten; die :hover-Variante verhindert, dass
   .nav-link:hover{background:cream} die aktive Pille auf Weiß-auf-Creme kippt. */
.nav-pills {
  --bs-nav-pills-link-active-bg: var(--color-brand);
  --bs-nav-pills-link-active-color: #fff;
}
.nav-pills .nav-link.active,
.nav-pills .show > .nav-link,
.nav-pills .nav-link.active:hover,
.nav-pills .nav-link.active:focus {
  color: #fff !important;
  background-color: var(--color-brand);
}

/* ── Navbar ──────────────────────────────────────────────── */
.navbar {
  background: var(--surface);
  border-bottom: 1px solid var(--border);
  padding: 0.9rem 0;
  transition: box-shadow 0.3s;
}

.navbar.scrolled {
  box-shadow: 0 2px 24px rgba(21,36,60,0.07);
}

.navbar-brand {
  font-weight: 700;
  font-size: 1.05rem;
  color: var(--dark) !important;
  letter-spacing: -0.01em;
  display: flex;
  align-items: center;
  gap: 0.65rem;
  font-family: var(--font-display);
  font-variation-settings: 'opsz' 36, 'SOFT' 50;
}

/* Brand-Mark: SVG-Logo (Haus+Welle) statt "R"-im-Quadrat.
   Die Farben werden via currentColor gesteuert — Logo passt sich
   automatisch hellem/dunklem Container an. */
.brand-mark {
  width: 36px;
  height: 36px;
  display: flex;
  align-items: center;
  justify-content: center;
  color: var(--dark);
  flex-shrink: 0;
  transition: color 0.2s, transform 0.2s;
}
.navbar-brand:hover .brand-mark { color: var(--blue); transform: rotate(-3deg); }

.brand-mark svg {
  width: 100%;
  height: 100%;
}

/* :not(.btn-nav): das !important hier hatte das color:#fff des „Vormerken"-CTA
   (buttons.css .btn-nav) überschrieben → braune Schrift auf Brand-Blau,
   Kontrast ~1.3:1 (axe serious). Der CTA behält sein eigenes Styling. */
.nav-link:not(.btn-nav) {
  font-size: 0.875rem;
  font-weight: 500;
  color: var(--text-muted) !important;
  padding: 0.4rem 0.85rem !important;
  border-radius: 6px;
  transition: all 0.18s;
}

.nav-link:not(.btn-nav):hover {
  color: var(--dark) !important;
  background: var(--cream);
}

/* .btn-nav: definiert in /css/buttons.css (Design-System) */

/* ── Burger-Toggle-Animation (Hamburger → X) ─────────────────────────────
   Bootstrap-Navbar-Toggler toggelt aria-expanded auf dem Button — wir
   nutzen das als CSS-State fuer die Transition. */
.navbar-toggler-anim {
  width: 40px;
  height: 40px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
}
.navbar-toggler-icon-anim {
  position: relative;
  width: 24px;
  height: 18px;
  display: inline-block;
}
.navbar-toggler-icon-anim span {
  position: absolute;
  left: 0;
  width: 100%;
  height: 2px;
  background: var(--dark);
  border-radius: 2px;
  transition: transform 0.25s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.18s ease;
  transform-origin: center;
}
.navbar-toggler-icon-anim span:nth-child(1) { top: 0; }
.navbar-toggler-icon-anim span:nth-child(2) { top: 8px; }
.navbar-toggler-icon-anim span:nth-child(3) { top: 16px; }

/* aria-expanded="true" → X-Form */
.navbar-toggler-anim[aria-expanded="true"] .navbar-toggler-icon-anim span:nth-child(1) {
  transform: translateY(8px) rotate(45deg);
}
.navbar-toggler-anim[aria-expanded="true"] .navbar-toggler-icon-anim span:nth-child(2) {
  opacity: 0;
  transform: scaleX(0.3);
}
.navbar-toggler-anim[aria-expanded="true"] .navbar-toggler-icon-anim span:nth-child(3) {
  transform: translateY(-8px) rotate(-45deg);
}

@media (prefers-reduced-motion: reduce) {
  .navbar-toggler-icon-anim span { transition: none; }
}

/* ── Hero — Layered Gradient + Topografie-Wellen-Pattern statt flach ──
   Pattern als inline-SVG-Background; sehr subtil, evokiert
   Bodensee-Wellen ohne kitschig zu sein.
   .hero--with-photo: aktiv wenn /images/hero-bodensee.jpg existiert
   (server-Auto-Detect). Das Foto liegt UNTER dem Gradient als Layer. */
.hero {
  background:
    /* Subtiler heller Schimmer oben rechts */
    radial-gradient(ellipse 80% 60% at 85% 0%, rgba(45,107,142,0.35), transparent 70%),
    /* Tieferer Mid-Layer */
    radial-gradient(ellipse 60% 90% at 0% 100%, rgba(184,212,227,0.08), transparent 60%),
    /* Wellen-Pattern (sehr subtil, rgba 0.04 opacity) */
    url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='400' height='200' viewBox='0 0 400 200'><g fill='none' stroke='%23E5EFF5' stroke-width='0.6' opacity='0.18'><path d='M0,40 Q100,20 200,40 T400,40' /><path d='M0,80 Q100,60 200,80 T400,80' /><path d='M0,120 Q100,100 200,120 T400,120' /><path d='M0,160 Q100,140 200,160 T400,160' /></g></svg>"),
    /* Basis-Farbe: Tiefes See-Nachtblau */
    linear-gradient(180deg, #15243C 0%, #0F1B2E 100%);
  color: #fff;
  padding: 7rem 0 5.5rem;
  position: relative;
  overflow: hidden;
}

/* Hero mit echtem Foto: legt das Foto UNTER den Overlay-Gradient.
   Overlay bleibt opaque genug fuer 4.5:1 Textkontrast (WCAG AA). */
.hero--with-photo {
  background:
    /* Dark Overlay fuer Text-Lesbarkeit */
    linear-gradient(180deg, rgba(21,36,60,0.78) 0%, rgba(15,27,46,0.92) 100%),
    /* Subtiles Wellen-Pattern bleibt drueber */
    url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='400' height='200' viewBox='0 0 400 200'><g fill='none' stroke='%23E5EFF5' stroke-width='0.6' opacity='0.12'><path d='M0,40 Q100,20 200,40 T400,40' /><path d='M0,80 Q100,60 200,80 T400,80' /><path d='M0,120 Q100,100 200,120 T400,120' /><path d='M0,160 Q100,140 200,160 T400,160' /></g></svg>"),
    /* Bodensee-Foto, Center-Crop */
    url('/images/hero-bodensee.jpg') center/cover no-repeat,
    /* Fallback */
    linear-gradient(180deg, #15243C 0%, #0F1B2E 100%);
}

.hero::before {
  content: '';
  position: absolute;
  top: 0; right: 0;
  width: 45%;
  height: 100%;
  background: linear-gradient(135deg, transparent, rgba(45,107,142,0.18));
  /* Hier stand `border-left: 1px solid rgba(255,255,255,0.05)`. Gemeint war
     eine leise Lichtkante am Panel — angekommen ist eine Naht, die vom oberen
     bis zum unteren Rand durchlief und dabei mitten durch die Zeile
     „Persönlich verwaltet" schnitt. Entfernt 04.09.2026.

     Damit war die Kante aber erst halb weg: ein 135°-Verlauf ist an seiner
     linken Kante nur ganz oben durchsichtig und weiter unten schon eingefaerbt
     — dadurch blieb dort eine sichtbare Stufe stehen. Die Maske blendet die
     linke Kante ueber ein Drittel der Panelbreite ein, unabhaengig davon,
     welche Richtung der Verlauf darunter nimmt. */
  -webkit-mask-image: linear-gradient(to right, transparent, #000 34%);
          mask-image: linear-gradient(to right, transparent, #000 34%);
  pointer-events: none;
}

/* Sehr subtile horizontale "Wasseroberflaeche" auf 60% Hoehe */
/* ── Treibende Wellen im Seitenkopf (04.09.2026) ────────────────────────────
   Vorher lag hier eine waagerechte 1px-Zierlinie auf 60 % Hoehe. Sie hatte
   keinen Bezug zum Rest und wird jetzt als bewegte Wellenebene gebraucht.

   Wie die Tiefe entsteht, ohne zwei Elemente zu kosten: die Ebene traegt ZWEI
   Wellenmuster mit unterschiedlicher Kachelbreite (400 px und 600 px). Beide
   werden von derselben Verschiebung getragen, brauchen aber unterschiedlich
   lang fuer eine Kachel — dadurch driften sie gegeneinander. Darunter bleibt
   das Muster im .hero-Hintergrund stehen: bewegte Oberflaeche ueber ruhigem
   Grund.

   Verschoben wird um 1200 px — das kleinste gemeinsame Vielfache von 400 und
   600. Nur dort stehen beide Muster wieder exakt auf Anfang, nur dort ist die
   Schleife nahtlos. Wer die Zahlen aendert, muss das Vielfache mitziehen.

   Bewegt wird ausschliesslich per transform: das laeuft auf der Grafikkarte,
   loest kein Neuzeichnen aus und kostet kein einziges geladenes Byte. */
.hero::after {
  content: '';
  position: absolute;
  top: 0;
  left: 0;
  /* Zwei volle Zyklen Vorrat, nicht einer. Mit exakt 1200 px sitzt die rechte
     Kante nach einem Durchlauf genau auf der Fensterkante — eine Rundung auf
     Subpixel reisst dort einen Haarriss auf, und die Schleife springt sichtbar.
     Mit 2400 px ist immer Material da. (Nachgemessen 04.09.2026.) */
  width: calc(100% + 2400px);
  height: 100%;
  pointer-events: none;
  background-repeat: repeat-x, repeat-x;
  background-size: 400px 200px, 600px 260px;
  background-position: 0 38%, 0 62%;
  background-image:
    /* Oberflaeche: engere Kachel, wirkt dadurch schneller */
    url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='400' height='200' viewBox='0 0 400 200'><g fill='none' stroke='%23E5EFF5' stroke-width='0.7' opacity='0.20'><path d='M0,60 Q100,34 200,60 T400,60'/><path d='M0,110 Q100,84 200,110 T400,110'/></g></svg>"),
    /* Tiefe: breitere Kachel, wirkt dadurch langsamer */
    url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='600' height='260' viewBox='0 0 600 260'><g fill='none' stroke='%23B8D4E3' stroke-width='0.8' opacity='0.13'><path d='M0,90 Q150,52 300,90 T600,90'/><path d='M0,170 Q150,132 300,170 T600,170'/></g></svg>");
  animation: hero-wellen 40s linear infinite;
}

@keyframes hero-wellen {
  from { transform: translate3d(0, 0, 0); }
  to   { transform: translate3d(-1200px, 0, 0); }
}

/* Wer Bewegung systemweit abgeschaltet hat, sieht das ruhige Bild — so, wie
   die Barrierefreiheitserklaerung es zusichert. */
@media (prefers-reduced-motion: reduce) {
  .hero::after { animation: none; }
}

.hero-label {
  display: inline-flex;
  align-items: center;
  gap: 0.5rem;
  font-size: 0.72rem;
  font-weight: 600;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: #B8D4E3;
  background: rgba(45,107,142,0.18);
  border: 1px solid rgba(184,212,227,0.25);
  padding: 0.4rem 1rem;
  border-radius: 50px;
  margin-bottom: 1.75rem;
  font-family: var(--font-sans);
}

.hero h1 {
  font-size: clamp(2.5rem, 5.5vw, 4.5rem);
  font-weight: 600;
  line-height: 1.05;
  letter-spacing: -0.025em;
  margin-bottom: 1.5rem;
  color: #fff;
  /* Fraunces Display-Variant: groessere Optical-Size, weichere Caps */
  font-variation-settings: 'opsz' 144, 'SOFT' 70, 'wght' 600;
}

.hero h1 span {
  color: #B8D4E3;
  font-style: italic;
  font-variation-settings: 'opsz' 144, 'SOFT' 100, 'wght' 500;
}

.hero-lead {
  font-size: 1.08rem;
  color: rgba(255,255,255,0.72);
  max-width: 480px;
  line-height: 1.7;
  margin-bottom: 2.5rem;
  font-family: var(--font-sans);
}

/* .btn-hero, .btn-hero-ghost: definiert in /css/buttons.css (Design-System) */

.hero-stats {
  display: flex;
  gap: 2rem;
  margin-top: 3.5rem;
  padding-top: 2.5rem;
  border-top: 1px solid rgba(255,255,255,0.08);
}

.hero-stat-num {
  font-size: 2.15rem;
  font-weight: 600;
  color: #fff;
  letter-spacing: -0.03em;
  line-height: 1;
  font-family: var(--font-display);
  font-variation-settings: 'opsz' 100, 'wght' 600;
}

.hero-stat-label {
  font-size: 0.75rem;
  color: rgba(255,255,255,0.5);
  letter-spacing: 0.08em;
  text-transform: uppercase;
  margin-top: 0.3rem;
  font-family: var(--font-sans);
}

/* ── Sections ────────────────────────────────────────────── */
.section { padding: 5.5rem 0; }
.section-alt { background: var(--cream-dark); }
.section-white { background: var(--flaeche-warm); }

.eyebrow {
  font-size: 0.7rem;
  font-weight: 700;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  /* Vorher --blue: damit war die ganze Seite einfarbig und der Akzent der
     Marke ungenutzt. Die Vorzeile ist die richtige Stelle dafuer — klein,
     wiederkehrend, nie als Flaeche. Das Blau bleibt den Knoepfen und
     Verweisen vorbehalten und wirkt dadurch wieder. (04.09.2026) */
  color: var(--akzent-warm);
  margin-bottom: 0.85rem;
  display: block;
  font-family: var(--font-sans);
}

.section-title {
  font-size: clamp(1.85rem, 3.5vw, 2.6rem);
  font-weight: 600;
  color: var(--dark);
  line-height: 1.12;
  letter-spacing: -0.02em;
  margin-bottom: 0.85rem;
  font-variation-settings: 'opsz' 80, 'SOFT' 60, 'wght' 600;
}

.section-sub {
  font-size: 1rem;
  color: var(--text-muted);
  max-width: 520px;
  line-height: 1.7;
  font-family: var(--font-sans);
}

/* ── Wohnung Cards ───────────────────────────────────────── */
.wohnung-card {
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: 14px;
  overflow: hidden;
  transition: all 0.3s ease;
}

.wohnung-card:hover {
  transform: translateY(-6px);
  box-shadow: 0 20px 48px rgba(21,36,60,0.1);
  border-color: var(--blue-mid);
}

.wohnung-img {
  height: 190px;
  background: var(--cream-dark);
  display: flex;
  align-items: center;
  justify-content: center;
  color: var(--text-muted);
  font-size: 2.75rem;
  position: relative;
}

.wohnung-badge {
  position: absolute;
  top: 1rem;
  left: 1rem;
  background: var(--blue);
  color: #fff;
  font-size: 0.7rem;
  font-weight: 700;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  padding: 0.3rem 0.7rem;
  border-radius: 6px;
}

.wohnung-body { padding: 1.4rem; }

.wohnung-title {
  font-size: 1.05rem;
  font-weight: 700;
  color: var(--dark);
  margin-bottom: 0.3rem;
}

.wohnung-address {
  font-size: 0.85rem;
  color: var(--text-muted);
  margin-bottom: 1rem;
}

.wohnung-specs {
  display: flex;
  gap: 0.75rem;
  flex-wrap: wrap;
  padding: 0.85rem 0;
  border-top: 1px solid var(--border);
  border-bottom: 1px solid var(--border);
  margin-bottom: 1rem;
}

.spec-pill {
  display: flex;
  align-items: center;
  gap: 0.3rem;
  background: var(--cream);
  border: 1px solid var(--border);
  padding: 0.25rem 0.65rem;
  border-radius: 50px;
  font-size: 0.8rem;
  font-weight: 500;
  color: var(--dark);
}

.spec-pill i { color: var(--blue); font-size: 0.75rem; }

.wohnung-price {
  font-size: 1.3rem;
  font-weight: 600;
  color: var(--dark);
  letter-spacing: -0.02em;
  font-family: var(--font-display);
}

.wohnung-price small {
  font-size: 0.78rem;
  font-weight: 400;
  color: var(--text-muted);
  font-family: var(--font-sans);
}

/* .btn-wohnung: definiert in /css/buttons.css */

/* ── Service Cards ───────────────────────────────────────── */
.service-card {
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: 14px;
  padding: 1.85rem;
  height: 100%;
  transition: all 0.25s;
  position: relative;
}

.service-card:hover {
  border-color: var(--blue-mid);
  box-shadow: 0 8px 32px rgba(45,107,142,0.12);
  transform: translateY(-3px);
}

.service-icon {
  width: 48px;
  height: 48px;
  background: var(--blue-light);
  border-radius: 10px;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 1.25rem;
  color: var(--blue);
  margin-bottom: 1.15rem;
  transition: all 0.25s;
}

.service-card:hover .service-icon {
  background: var(--blue);
  color: #fff;
}

/* Service-Illustration: Custom-SVG-Block (2026-05-16). Eigenstaendiger
   Look statt generischer Bootstrap-Icons. Monoline-Stil passend zum Logo. */
.service-illustration {
  width: 88px;
  height: 88px;
  background: var(--blue-light);
  border-radius: var(--radius-lg, 14px);
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 14px;
  color: var(--blue);
  margin-bottom: 1.25rem;
  transition: background 0.25s, color 0.25s, transform 0.3s cubic-bezier(0.34, 1.56, 0.64, 1);
}
.service-illustration svg {
  width: 100%;
  height: 100%;
}
.service-card:hover .service-illustration {
  background: var(--blue);
  color: #fff;
  transform: rotate(-3deg) scale(1.05);
}

.service-cta {
  font-size: 0.88rem;
  font-weight: 600;
  color: var(--blue);
  margin-top: 1.15rem;
  display: inline-flex;
  align-items: center;
  gap: 0.4rem;
  transition: gap 0.2s, color 0.2s;
  font-family: var(--font-sans);
}
.service-card:hover .service-cta {
  color: var(--blue-dark);
  gap: 0.6rem;
}

.service-card h5 {
  font-size: 1.05rem;
  font-weight: 600;
  color: var(--dark);
  margin-bottom: 0.55rem;
  font-family: var(--font-display);
  font-variation-settings: 'opsz' 36, 'wght' 600;
}

.service-card p {
  font-size: 0.9rem;
  color: var(--text-muted);
  line-height: 1.65;
  margin: 0;
  font-family: var(--font-sans);
}

/* ── Why Numbers ─────────────────────────────────────────── */
.why-row {
  display: flex;
  gap: 1rem;
  padding: 1.5rem;
  border-radius: 12px;
  transition: background 0.2s;
}

.why-row:hover { background: var(--cream); }

.why-num {
  font-size: 0.95rem;
  font-weight: 600;
  color: var(--blue);
  letter-spacing: -0.02em;
  background: var(--blue-light);
  border: 1px solid var(--blue-mid);
  width: 38px;
  height: 38px;
  border-radius: 10px;
  display: flex;
  align-items: center;
  justify-content: center;
  flex-shrink: 0;
  margin-top: 0.1rem;
  font-family: var(--font-display);
  font-variation-settings: 'opsz' 36, 'wght' 600;
}

.why-row h5 {
  font-size: 1rem;
  font-weight: 600;
  color: var(--dark);
  margin-bottom: 0.3rem;
  font-family: var(--font-display);
}

.why-row p {
  font-size: 0.9rem;
  color: var(--text-muted);
  margin: 0;
  line-height: 1.65;
}

/* ── CTA ─────────────────────────────────────────────────── */
.cta-strip {
  background:
    radial-gradient(ellipse 60% 80% at 100% 0%, rgba(45,107,142,0.35), transparent 60%),
    linear-gradient(135deg, #15243C 0%, #0F1B2E 100%);
  border-radius: 18px;
  padding: 3rem 3.5rem;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 2rem 3rem;
  flex-wrap: wrap;
  position: relative;
  overflow: hidden;
}
/* Der Textblock hatte keine Breitenbegrenzung, nahm die volle Zeile und
   draengte die Knoepfe in die naechste — rechts blieben rund 60 % der
   Flaeche leer, ausgerechnet an der Stelle, an der jemand anfragen soll.
   Jetzt teilen sich Text und Knoepfe die Leiste. (04.09.2026) */
.cta-strip > div:first-child { flex: 1 1 26rem; min-width: 0; }

.cta-strip h3 {
  font-size: 1.85rem;
  font-weight: 600;
  color: #fff;
  letter-spacing: -0.02em;
  margin-bottom: 0.4rem;
  font-variation-settings: 'opsz' 80, 'SOFT' 60, 'wght' 600;
}

.cta-strip p {
  color: rgba(255,255,255,0.6);
  font-size: 0.95rem;
  margin: 0;
  font-family: var(--font-sans);
}

/* ── Buttons ─────────────────────────────────────────────────────────────
   .btn-blue, .btn-outline-dark, .btn-hero(-ghost), .btn-nav,
   .btn-cta-(primary|secondary), .btn-cookie-(accept|decline), .btn-wohnung
   sind alle in /css/buttons.css definiert (Design-System).
   ──────────────────────────────────────────────────────────────────────── */

/* ── Footer ──────────────────────────────────────────────── */
.footer {
  background:
    linear-gradient(180deg, #15243C 0%, #0F1B2E 100%);
  color: rgba(255,255,255,0.72);
  padding: 4rem 0 2rem;
}

.footer-brand {
  font-size: 1.05rem;
  font-weight: 600;
  color: #fff;
  display: flex;
  align-items: center;
  gap: 0.65rem;
  margin-bottom: 0.95rem;
  font-variation-settings: 'opsz' 36, 'SOFT' 50;
}

/* Zeichen im Fuß auf der weißen Kachel wie Browser-Reiter und Handy-Symbol
   (Adrian, 05.10.2026: überall hell; bis dahin hellblau auf dem Dunkelblau):
   Ecken 16,4 % der Kante, Zeichnung #15243C. */
.footer-brand-mark {
  width: 36px;
  height: 36px;
  display: flex;
  align-items: center;
  justify-content: center;
  flex-shrink: 0;
  background: #FFFFFF;
  border-radius: 5.9px;
  color: var(--dark);
}
.footer-brand-mark svg { width: 100%; height: 100%; }

/* Spaltentitel im Fuss: vorher <h6> — auf jeder Seite ein Sprung von h2/h3
   auf h6. Jetzt <h2 class="footer-titel">, Aussehen unverändert (28.09.2026).
   Weiss mit 0.4 hatte auf dem Marineblau 3,7:1 statt der 4,5:1, die die
   Barrierefreiheitserklärung verspricht; 0.6 sind rund 6,4:1 (Prüfung 04.10.2026). */
.footer h6,
.footer .footer-titel {
  font-size: 0.7rem;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: rgba(255,255,255,0.6);
  margin-bottom: 1rem;
  font-weight: 700;
  font-family: var(--font-sans);
}

.footer p { font-size: 0.88rem; line-height: 1.7; }

.footer-links { list-style: none; padding: 0; margin: 0; }
.footer-links li { margin-bottom: 0.55rem; }
.footer-links a {
  color: rgba(255,255,255,0.6);
  text-decoration: none;
  font-size: 0.88rem;
  transition: color 0.18s;
}
.footer-links a:hover { color: #fff; }
/* Die lange Mail-Adresse im Fuß ragte zwischen 992 und etwa 1075 px Fensterbreite
   (Laptop mit Windows-Scrollbalken, 125 % Zoom) aus ihrer Spalte; die ganze Seite
   ließ sich dann seitlich schieben. Gemessen 05.10.2026: 1024 px Fenster → Seite
   1038 px breit (Verbesserungs-Durchsicht, F9). Jetzt bricht sie am Rand um. */
.footer-links a[href^="mailto:"] { overflow-wrap: anywhere; }

.portal-link {
  display: inline-flex;
  align-items: center;
  gap: 0.4rem;
  font-size: 0.8rem;
  color: #B8D4E3;
  background: rgba(45,107,142,0.18);
  border: 1px solid rgba(184,212,227,0.25);
  padding: 0.35rem 0.85rem;
  border-radius: 50px;
  text-decoration: none;
  margin-top: 0.75rem;
  transition: all 0.2s;
}

.portal-link:hover {
  background: rgba(45,107,142,0.3);
  color: #fff;
}

.footer-hr {
  border-color: rgba(255,255,255,0.08);
  margin: 2.5rem 0 1.5rem;
}

.footer-copy {
  font-size: 0.8rem;
  color: rgba(255,255,255,0.6);   /* 0.32 waren 2,9:1 (Prüfung 04.10.2026) */
}

/* Sprechzeiten aus _FIRMENDATEN.md; vorher fest im Fuss mit Weiss 0.3 (2,7:1). */
.footer-links li.footer-sprechzeiten {
  margin-top: 0.5rem;
  font-size: 0.82rem;
  color: rgba(255,255,255,0.6);
}

/* ── WhatsApp ────────────────────────────────────────────── */
.fab-whatsapp {
  position: fixed;
  bottom: 24px;
  right: 24px;
  width: 52px;
  height: 52px;
  background: #25d366;
  border-radius: 50%;
  display: flex;
  align-items: center;
  justify-content: center;
  color: #fff;
  font-size: 1.5rem;
  text-decoration: none;
  box-shadow: 0 4px 20px rgba(37,211,102,0.35);
  z-index: 999;
  transition: all 0.25s;
}

.fab-whatsapp:hover {
  transform: scale(1.1);
  color: #fff;
  box-shadow: 0 8px 28px rgba(37,211,102,0.5);
}

/* ── Scroll Reveal ───────────────────────────────────────── */
/* Default SICHTBAR (No-JS-Fallback: ohne JS keine unsichtbaren Sektionen).
   Reveal-Animation nur wenn JS läuft — .js wird im <head> VOR dem ersten Paint
   gesetzt, daher kein Flash sichtbar→unsichtbar→eingeblendet. */
.reveal { opacity: 1; }
.js .reveal {
  opacity: 0;
  transform: translateY(22px);
  transition: opacity 0.55s ease, transform 0.55s ease;
}
.js .reveal.visible { opacity: 1; transform: none; }
/* Touch-Press-Feedback: taktiles „gedrückt" auf Karten (Hover-Lift gibt's nur
   mit Maus). Nur bei aktivierter Motion. */
@media (prefers-reduced-motion: no-preference) {
  .service-card:active, .wohnung-card:active, .problem-card:active,
  .feature-card:active, .ratgeber-card:active { transform: scale(0.99); }
}
/* Beim Drucken muss ALLES sichtbar sein. Ohne diese Regel druckt der Browser
   nur, was der Besucher vorher in den Sichtbereich gescrollt hat — die
   Startseite kam zu rund 70 % leer aus dem Drucker (Befund 04.09.2026).
   Betrifft auch PDF-Export und jedes Vorschau-Werkzeug. */
@media print {
  .js .reveal,
  .js .reveal.visible {
    opacity: 1 !important;
    transform: none !important;
    transition: none !important;
  }
  /* Bedienelemente gehoeren nicht aufs Papier. */
  .sticky-cta-mobile, .fab-whatsapp, .skip-link, .navbar-toggler { display: none !important; }
}
.reveal-delay-1 { transition-delay: 0.08s; }
.reveal-delay-2 { transition-delay: 0.16s; }
.reveal-delay-3 { transition-delay: 0.24s; }
.reveal-delay-4 { transition-delay: 0.32s; }
.reveal-delay-5 { transition-delay: 0.40s; }

/* ── Hero Payment Animation (Mock Dashboard, falls genutzt) ─ */
@keyframes fadeSlideIn {
  from { opacity: 0; transform: translateX(12px); }
  to   { opacity: 1; transform: translateX(0); }
}

.hv-anim-1 { animation: fadeSlideIn 0.5s ease 0.8s both; }
.hv-anim-2 { animation: fadeSlideIn 0.5s ease 1.1s both; }
.hv-anim-3 { animation: fadeSlideIn 0.5s ease 1.4s both; }

/* ── Hero Trust ──────────────────────────────────────────── */
.hero-trust {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  margin-top: 1.25rem;
  font-size: 0.85rem;
  color: rgba(255,255,255,0.72);   /* 0.55 waren 4,1:1 am hellsten Punkt des Kopfbereichs (Prüfung 04.10.2026) */
}

/* ── Hero Visual (Mock Dashboard) ───────────────────────── */
.hero-visual { position: relative; padding: 1rem 0.5rem 2rem; }

.hv-card {
  background: rgba(255,255,255,0.06);
  border: 1px solid rgba(255,255,255,0.12);
  border-radius: 14px;
  overflow: hidden;
  backdrop-filter: blur(8px);
}

.hv-card-header {
  display: flex;
  align-items: center;
  gap: 0.35rem;
  padding: 0.75rem 1rem;
  background: rgba(255,255,255,0.04);
  border-bottom: 1px solid rgba(255,255,255,0.07);
}

.hv-dot { width: 10px; height: 10px; border-radius: 50%; }
.hv-card-body { padding: 1.25rem; }

.hv-stat-row { display: flex; gap: 1rem; margin-bottom: 1rem; }
.hv-stat { flex: 1; }

.hv-stat-n {
  font-size: 1.5rem;
  font-weight: 600;
  color: #fff;
  letter-spacing: -0.03em;
  line-height: 1;
  font-family: var(--font-display);
}

.hv-stat-l {
  font-size: 0.7rem;
  color: rgba(255,255,255,0.45);
  text-transform: uppercase;
  letter-spacing: 0.08em;
  margin-top: 0.25rem;
  font-family: var(--font-sans);
}

.hv-divider {
  border: none;
  border-top: 1px solid rgba(255,255,255,0.08);
  margin: 0.85rem 0;
}

.hv-payment-row {
  display: flex;
  align-items: center;
  gap: 0.65rem;
  padding: 0.4rem 0;
}

.hv-avatar {
  width: 28px;
  height: 28px;
  background: rgba(45,107,142,0.4);
  border-radius: 50%;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 0.72rem;
  font-weight: 700;
  color: #B8D4E3;
  flex-shrink: 0;
}

.hv-pname { font-size: 0.82rem; color: rgba(255,255,255,0.78); flex: 1; }
.hv-pamt { font-size: 0.82rem; font-weight: 700; font-family: var(--font-display); }
.hv-green { color: var(--color-success, #15803d); }

.hv-total-row { display: flex; align-items: center; justify-content: space-between; }

.hv-total {
  font-size: 1.15rem;
  font-weight: 600;
  color: #fff;
  letter-spacing: -0.02em;
  font-family: var(--font-display);
}

.hv-badge-float {
  position: absolute;
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: 50px;
  padding: 0.45rem 0.9rem;
  font-size: 0.78rem;
  font-weight: 600;
  color: var(--dark);
  display: flex;
  align-items: center;
  gap: 0.4rem;
  box-shadow: 0 4px 16px rgba(0,0,0,0.12);
  white-space: nowrap;
}

.hv-badge-1 { bottom: 0.5rem; left: -1rem; }
.hv-badge-2 { top: 0.5rem; right: -1rem; }

/* ── Trust Bar ───────────────────────────────────────────── */
.trust-bar {
  background: var(--surface);
  border-bottom: 1px solid var(--border);
  padding: 1.15rem 0;
}

.trust-inner {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 0;
  flex-wrap: wrap;
}

.trust-item {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  font-size: 0.83rem;
  font-weight: 500;
  color: var(--text-muted);
  padding: 0.4rem 1.5rem;
}

.trust-item i { color: var(--blue); font-size: 0.9rem; }

.trust-sep {
  width: 1px;
  height: 1.2rem;
  background: var(--border);
}

/* ── Step Cards (How It Works) ───────────────────────────── */
.step-card {
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: 14px;
  padding: 2.1rem 1.85rem;
  height: 100%;
  position: relative;
  transition: all 0.25s;
}

.step-card:hover {
  border-color: var(--blue-mid);
  box-shadow: 0 8px 32px rgba(45,107,142,0.12);
  transform: translateY(-3px);
}

/* Nur auf der Notfallseite. Morgennebel-Hell auf Weiss hatte 1,6:1 — gerade
   dort muss alles lesbar sein; jetzt See-Blau dunkel (Prüfung 04.10.2026). */
.step-num {
  font-size: 2.4rem;
  font-weight: 600;
  color: var(--blue-dark);
  letter-spacing: -0.04em;
  line-height: 1;
  margin-bottom: 1rem;
  font-family: var(--font-display);
  font-variation-settings: 'opsz' 144, 'wght' 600;
}

.step-card h5 {
  font-size: 1.05rem;
  font-weight: 600;
  color: var(--dark);
  margin-bottom: 0.5rem;
  font-family: var(--font-display);
}

.step-card p {
  font-size: 0.9rem;
  color: var(--text-muted);
  line-height: 1.65;
  margin: 0;
  font-family: var(--font-sans);
}

/* ── CTA Strip Enhancements ──────────────────────────────── */
.cta-eyebrow {
  font-size: 0.7rem;
  font-weight: 700;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: #B8D4E3;
  margin-bottom: 0.5rem;
  font-family: var(--font-sans);
}

.cta-reassurance {
  display: flex;
  gap: 1.25rem;
  flex-wrap: wrap;
  margin-top: 1rem;
  font-size: 0.82rem;
  color: rgba(255,255,255,0.72);   /* 0.5 waren 4,1:1 am hellsten Punkt des Streifens (Prüfung 04.10.2026) */
}

.cta-reassurance span { display: flex; align-items: center; gap: 0.35rem; }
/* Die Haken standen in --color-success (#15803D, dunkelgruen) auf dunklem
   Marineblau — praktisch unsichtbar und ausserdem die einzige gruene Farbe
   auf der ganzen Seite. Jetzt Morgennebel-Hell aus der eigenen Palette. */
.cta-reassurance i { color: var(--color-brand-mist); }

.cta-actions {
  display: flex;
  flex-direction: column;
  gap: 0.75rem;
  flex-shrink: 0;
}

/* .btn-cta-primary, .btn-cta-secondary: definiert in /css/buttons.css */

/* ── Stats Bar ───────────────────────────────────────────── */
.stats-bar {
  background:
    radial-gradient(ellipse 50% 100% at 50% 100%, rgba(45,107,142,0.35), transparent 70%),
    linear-gradient(180deg, #15243C 0%, #0F1B2E 100%);
  padding: 3rem 0;
}

.stats-inner {
  display: flex;
  align-items: center;
  justify-content: center;
  flex-wrap: wrap;
  gap: 0;
}

.stat-item { text-align: center; padding: 0 3rem; }

.stat-n {
  font-size: clamp(2.2rem, 4vw, 3.2rem);
  font-weight: 600;
  color: #fff;
  letter-spacing: -0.04em;
  line-height: 1;
  font-family: var(--font-display);
  font-variation-settings: 'opsz' 144, 'wght' 600;
}

.stat-l {
  font-size: 0.78rem;
  color: rgba(255,255,255,0.5);
  text-transform: uppercase;
  letter-spacing: 0.1em;
  margin-top: 0.5rem;
  font-family: var(--font-sans);
}

.stat-sep { width: 1px; height: 3rem; background: rgba(255,255,255,0.1); }

/* ── Problem Section ─────────────────────────────────────── */
.problem-card {
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: 14px;
  padding: 2rem 1.85rem;
  height: 100%;
  transition: all 0.25s;
}

.problem-card:hover {
  /* War #fca5a5 — ein Rot aus einem fremden Baukasten, das in dieser Palette
     nicht vorkommt. Jetzt der eigene Apfelblueten-Akzent, passend zum
     Schatten darunter, der ihn ohnehin schon benutzt hat. */
  border-color: color-mix(in srgb, var(--color-accent) 45%, var(--border));
  box-shadow: 0 8px 32px rgba(200,85,61,0.1);
  transform: translateY(-3px);
}

.problem-icon {
  width: 50px;
  height: 50px;
  background: #FBEAE5;
  border-radius: 10px;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 1.35rem;
  color: var(--accent-spark);
  margin-bottom: 1.15rem;
}

.problem-card h5 {
  font-size: 1.05rem;
  font-weight: 600;
  color: var(--dark);
  margin-bottom: 0.5rem;
  font-family: var(--font-display);
}

.problem-card p {
  font-size: 0.9rem;
  color: var(--text-muted);
  line-height: 1.65;
  margin: 0;
  font-family: var(--font-sans);
}

.problem-arrow {
  display: inline-flex;
  align-items: center;
  gap: 0.6rem;
  font-size: 0.9rem;
  font-weight: 600;
  color: var(--blue);
}

.problem-arrow i { font-size: 1.4rem; }

/* ── Portrait ────────────────────────────────────────────────
   Der alte Platzhalter (Verlauf + Initialen "AR" + Namensschild) ist am
   28.09.2026 entfallen. Das Porträtfeld ist jetzt .bild-rahmen--portrait
   mit .namenszug (Block "Bild-Durchgang" weiter unten). */

/* ── Testimonials ────────────────────────────────────────── */
.testimonial-card {
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: 14px;
  padding: 1.85rem;
  height: 100%;
  display: flex;
  flex-direction: column;
  transition: all 0.25s;
}

.testimonial-card:hover {
  border-color: var(--blue-mid);
  box-shadow: 0 8px 32px rgba(45,107,142,0.12);
  transform: translateY(-3px);
}

.testimonial-stars {
  font-size: 1rem;
  color: var(--accent-spark);
  letter-spacing: 0.05em;
  margin-bottom: 1rem;
}

.testimonial-text {
  font-size: 0.95rem;
  color: var(--dark);
  line-height: 1.7;
  font-style: italic;
  flex: 1;
  margin-bottom: 1.25rem;
  font-family: var(--font-display);
  font-variation-settings: 'opsz' 36, 'SOFT' 100;
}

.testimonial-author {
  display: flex;
  align-items: center;
  gap: 0.75rem;
  padding-top: 1rem;
  border-top: 1px solid var(--border);
}

.testimonial-avatar {
  width: 40px;
  height: 40px;
  background: var(--blue-light);
  border-radius: 50%;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 0.85rem;
  font-weight: 600;
  color: var(--blue);
  flex-shrink: 0;
  font-family: var(--font-display);
}

.testimonial-name {
  font-size: 0.9rem;
  font-weight: 600;
  color: var(--dark);
  font-family: var(--font-display);
}

.testimonial-role {
  font-size: 0.78rem;
  color: var(--text-muted);
}

/* ── Stat-Headlines (massive Display-Schrift fuer USP-Zahlen) ────────────
   Ersetzt die alten .step-card-Boxen in section.section-stats — die
   Zahlen sind dein staerkster USP, also typografisches Statement statt
   gleicher Card wie alle anderen Sections. */
.section-stats {
  background: var(--cream-dark);
  border-top: 1px solid var(--border);
  border-bottom: 1px solid var(--border);
}

.stat-headline {
  text-align: center;
  padding: 1rem 0.5rem;
  position: relative;
}

.stat-headline__num {
  font-family: var(--font-display);
  font-size: clamp(3.5rem, 8vw, 6rem);
  font-weight: 600;
  line-height: 0.95;
  letter-spacing: -0.04em;
  color: var(--dark);
  font-variation-settings: 'opsz' 144, 'SOFT' 30, 'wght' 600;
  margin-bottom: 1rem;
  display: inline-flex;
  align-items: baseline;
  gap: 0.05em;
}

.stat-headline__unit {
  font-size: 0.55em;
  font-weight: 500;
  color: var(--blue);
  letter-spacing: -0.02em;
  font-variation-settings: 'opsz' 80, 'SOFT' 30, 'wght' 500;
}

.stat-headline__label {
  font-size: 1.05rem;
  font-weight: 600;
  color: var(--dark);
  margin-bottom: 0.5rem;
  font-family: var(--font-display);
  font-variation-settings: 'opsz' 36, 'wght' 600;
}

.stat-headline__caption {
  font-size: 0.88rem;
  color: var(--text-muted);
  line-height: 1.65;
  margin: 0;
  max-width: 280px;
  margin-left: auto;
  margin-right: auto;
  font-family: var(--font-sans);
}

/* Counter-Up wird beim Scroll-Reveal von public-init.js getriggert.
   reduced-motion: kein Counter, nur Final-Wert. */
@media (prefers-reduced-motion: reduce) {
  .stat-headline__num { transition: none !important; }
}

/* ── FAQ ─────────────────────────────────────────────────── */
.faq-accordion { display: flex; flex-direction: column; gap: 0; }

.faq-item { border-bottom: 1px solid var(--border); }
.faq-item:first-child { border-top: 1px solid var(--border); }

.faq-question {
  width: 100%;
  background: none;
  border: none;
  padding: 1.15rem 0;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 1rem;
  font-size: 0.98rem;
  font-weight: 600;
  color: var(--dark);
  text-align: left;
  cursor: pointer;
  transition: color 0.18s;
  font-family: var(--font-display);
}

.faq-question:hover { color: var(--blue); }
.faq-question:not(.collapsed) { color: var(--blue); }

.faq-icon {
  font-size: 0.85rem;
  transition: transform 0.25s;
  flex-shrink: 0;
  color: var(--text-muted);
}

.faq-question:not(.collapsed) .faq-icon {
  transform: rotate(180deg);
  color: var(--blue);
}

.faq-answer {
  padding: 0 0 1.15rem;
  font-size: 0.92rem;
  color: var(--text-muted);
  line-height: 1.7;
  font-family: var(--font-sans);
}

/* ── Sticky Mobile CTA ───────────────────────────────────── */
.sticky-cta-mobile {
  display: none;
  position: fixed;
  bottom: 0;
  left: 0;
  right: 0;
  z-index: 990;
  background: var(--surface);
  border-top: 1px solid var(--border);
  padding: 0.75rem 1rem;
  gap: 0.6rem;
  box-shadow: 0 -4px 20px rgba(0,0,0,0.08);
}

/* ── Cookie Banner ───────────────────────────────────────── */
.cookie-banner {
  position: fixed;
  bottom: 0;
  left: 0;
  right: 0;
  z-index: 9999;
  background: var(--dark);
  color: rgba(255,255,255,0.82);
  padding: 1rem 1.5rem;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 1.5rem;
  flex-wrap: wrap;
  border-top: 1px solid rgba(255,255,255,0.08);
  transform: translateY(100%);
  transition: transform 0.4s ease;
}

.cookie-banner.visible { transform: translateY(0); }

.cookie-banner p {
  font-size: 0.84rem;
  margin: 0;
  line-height: 1.5;
  flex: 1;
  min-width: 200px;
}

.cookie-banner a { color: #B8D4E3; text-decoration: none; }

.cookie-actions { display: flex; gap: 0.6rem; flex-shrink: 0; }

/* .btn-cookie-accept, .btn-cookie-decline: definiert in /css/buttons.css */

/* ── Mobile ──────────────────────────────────────────────── */
@media (max-width: 768px) {
  .hero { padding: 4.5rem 0 3.5rem; }
  .hero h1 { font-size: 2.4rem; }
  .hero-stats { gap: 1.5rem; }
  .section { padding: 3.5rem 0; }
  .cta-strip { padding: 2rem; flex-direction: column; align-items: flex-start; }
  /* Untereinander behielt der Textblock seine 26rem als Höhe: über den Knöpfen stand ein
     großes Loch (Startseite und die drei Ortsseiten, behoben 20.10.2026). */
  .cta-strip > div:first-child { flex: 0 0 auto; }
  .hero::before { display: none; }
  .hv-badge-1, .hv-badge-2 { display: none; }
  .trust-sep { display: none; }
  .trust-item { padding: 0.4rem 0.75rem; }
  .cta-actions { width: 100%; }
  .btn-cta-primary, .btn-cta-secondary { width: 100%; justify-content: center; }
  .stat-item { padding: 1rem 1.5rem; }
  .stat-sep { width: 100%; height: 1px; }
  .stats-inner { flex-direction: row; flex-wrap: wrap; }
  .stat-item { flex: 1 1 40%; }
  .stat-sep { display: none; }
  .sticky-cta-mobile { display: flex; }
  .cookie-banner { flex-direction: column; align-items: flex-start; }
  .cookie-actions { width: 100%; }
  .btn-cookie-accept, .btn-cookie-decline { flex: 1; text-align: center; }
}

/* ── Mobile-Overflow-Fix: g-5-Gutter sprengt Container-Padding ────────────────
   Bootstrap-.row.g-5/.gx-5 setzt --bs-gutter-x:3rem → negative Außen-Margins
   von je 24px. Der umschließende .container gibt aber nur 12px Padding je Seite.
   Auf Viewports <576px (Container = 100% breit, kein zentrierter Rest-Rand als
   Puffer) ragt jede g-5-Row genau 12px pro Seite über die Viewport-Breite →
   horizontaler Scrollbalken auf ALLEN öffentlichen Seiten (Footer-Row im
   geteilten Layout + mehrere Inhalts-Rows in Kontakt/Index/Eigentümer/WEG/…).
   Fix: horizontalen Gutter dieser Rows auf Mobile auf Container-Niveau (1.5rem)
   senken → Row-Ränder fluchten mit der Viewport-Kante, kein Überhang. Der
   vertikale Gutter (--bs-gutter-y) bleibt unberührt; die Spalten stapeln <576px
   ohnehin, also kein sichtbarer Layout-Verlust. Desktop bleibt bei 3rem. */
@media (max-width: 575.98px) {
  .row.g-5,
  .row.gx-5 {
    --bs-gutter-x: 1.5rem;
  }
}

/* Danger-Icon der Notfall-/Schadens-„problem-card" (Warndreieck) — als Klasse,
   damit die Notfall-/Schadensmeldung-Views ohne Inline-Style auskommen. */
.problem-icon-danger { background: #fee2e2; color: #b91c1c; }

/* ════════════════════════════════════════════════════════════════════════════
   Bild-Durchgang 28.09.2026 — echte Fotos, weniger Karten
   ────────────────────────────────────────────────────────────────────────────
   Befund vorher: kein einziges Bild auf der Startseite, 15 Karten, vier
   Abschnitte hintereinander im selben Muster (Kachel + kleines Symbol + zwei
   Zeilen). Das liess die Seite nach Baukasten aussehen. Die Bausteine hier
   ersetzen die Kartenraster dort, wo Karten nicht die richtige Form sind:
     .hero--kompakt/.hero--recht  einheitlicher Seitenkopf fuer Unterseiten
     .hero-foto                   Foto rechts im Seitenkopf
     .bild-rahmen                 Foto im Inhalt, mit versetzter Linie dahinter
     .namenszug                   Name in Schreibschrift unter dem Porträtfeld
     .sorgen-liste                ruhige Liste statt drei Problem-Karten
     .leistungsliste              zweispaltig mit Linien statt sechs Kacheln
     .zeitleiste                  Schritte mit grossen Ziffern statt Karten
     .versprechen                 drei Saetze als Typografie statt Karten
     .artikel / .rechtstext       Lesetypografie fuer Ratgeber und Recht
   Fotos und Lizenzen: docs/homepage/fotos-und-lizenzen.md
   ════════════════════════════════════════════════════════════════════════════ */

/* „Über mich" brach bei 1000 px Fensterbreite in zwei Zeilen um. */
.navbar .nav-link { white-space: nowrap; }

/* Schreibschrift nur fuer den Namenszug. Die Datei enthaelt ausschliesslich die
   Buchstaben von „Adrian Rottensteiner" (1,9 KB) — kein anderer Text darin
   setzen, sonst faellt er auf die Ersatzschrift zurueck. Bewusst KEINE echte
   Unterschrift: die liesse sich aus dem Netz kopieren. */
@font-face {
  font-family: 'Namenszug';
  src: url('/fonts/HerrVonMuellerhoff-Name.woff2') format('woff2');
  font-weight: 400;
  font-style: normal;
  font-display: swap;
}

/* ── Seitenkopf-Varianten ─────────────────────────────────────────────────── */
.hero-inhalt { position: relative; z-index: 1; }
.hero-mitte { text-align: center; }
.hero-mitte .hero-label,
.hero-mitte .hero-lead { margin-left: auto; margin-right: auto; }
.hero-mitte .hero-trust { justify-content: center; }
.hero-trust i { color: var(--blue-mid); }

.hero--kompakt { padding: 4.75rem 0 4.25rem; }
.hero--kompakt h1 { font-size: clamp(2rem, 4.2vw, 3.25rem); }
.hero--kompakt .hero-lead { margin-bottom: 2rem; max-width: 520px; }
.hero--kompakt .hero-lead:last-child { margin-bottom: 0; }

.hero--recht { padding: 4rem 0 3rem; }
.hero--recht h1 { font-size: clamp(1.75rem, 3.5vw, 2.5rem); }
.hero--recht .hero-lead { max-width: 640px; margin-bottom: 0; }

/* ── Foto im Seitenkopf ───────────────────────────────────────────────────── */
.hero-foto { margin: 0; position: relative; }
.hero-foto img {
  display: block;
  width: 100%;
  height: auto;
  aspect-ratio: 4 / 3;
  object-fit: cover;
  border-radius: 18px;
  /* Tiefer, weicher Schatten nach unten + feine helle Kante: das Foto liegt
     auf dem Wasser, statt als Rechteck hineingeklebt zu wirken. */
  box-shadow:
    0 34px 70px -28px rgba(0, 0, 0, 0.6),
    0 0 0 1px rgba(255, 255, 255, 0.09);
}
.hero-foto figcaption {
  display: flex;
  align-items: center;
  gap: 0.45rem;
  margin-top: 0.9rem;
  font-size: 0.72rem;
  font-weight: 600;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--blue-mid);          /* 9,6:1 auf dem Seitenkopf */
}
@media (max-width: 991.98px) {
  .hero-foto { margin-top: 2.75rem; }
  .hero-foto img { aspect-ratio: 16 / 10; }
}

/* ── Foto im Inhalt ───────────────────────────────────────────────────────── */
.bild-rahmen { margin: 0; position: relative; }
.bild-rahmen__bild { position: relative; }
.bild-rahmen__bild img {
  position: relative;
  z-index: 1;
  display: block;
  width: 100%;
  height: auto;
  object-fit: cover;
  border-radius: 20px;
  box-shadow: 0 28px 56px -30px rgba(21, 36, 60, 0.45);
}
/* Versetzte Linie hinter dem Foto — Passepartout-Andeutung im warmen Akzent.
   Nur ab lg: auf schmalen Fenstern ragt sie ueber den Rand und erzeugt einen
   waagerechten Scrollbalken. */
@media (min-width: 992px) {
  .bild-rahmen__bild::before {
    content: '';
    position: absolute;
    inset: 1.25rem -1.25rem -1.25rem 1.25rem;
    border: 1px solid color-mix(in srgb, var(--akzent-warm) 40%, transparent);
    border-radius: 22px;
    pointer-events: none;
  }
}
/* Bild des Eigentümerportals auf der Startseite (Ausbau Sitzung 7): ein Bildschirmbild,
   kein Foto — deshalb nicht beschnitten, mit feiner Kante wie ein Fenster. */
.portal-bild { margin: 0; }
.portal-bild img {
  display: block;
  width: 100%;
  height: auto;
  border: 1px solid var(--border);
  border-radius: 14px;
  box-shadow: 0 28px 56px -30px rgba(21, 36, 60, 0.45);
  background: var(--surface);
}
.portal-bild figcaption {
  margin-top: 0.9rem;
  font-size: 0.78rem;
  color: var(--text-muted);
}
.bild-rahmen--hoch .bild-rahmen__bild img     { aspect-ratio: 4 / 5; }
.bild-rahmen--portrait .bild-rahmen__bild img { aspect-ratio: 3 / 4; }
@media (max-width: 991.98px) {
  .bild-rahmen--hoch .bild-rahmen__bild img { aspect-ratio: 16 / 10; }
  .bild-rahmen--portrait { max-width: 420px; margin-left: auto; margin-right: auto; }
}
.bild-ort {
  display: flex;
  align-items: center;
  gap: 0.4rem;
  margin-top: 1rem;
  font-size: 0.72rem;
  font-weight: 600;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--text-muted);
}
@media (min-width: 992px) { .bild-rahmen--hoch .bild-ort { margin-top: 2.1rem; } }

/* Breites Fotoband (Über mich) */
.bild-band { margin: 0; }
.bild-band img {
  display: block;
  width: 100%;
  height: auto;
  aspect-ratio: 21 / 9;
  object-fit: cover;
  border-radius: 20px;
}
@media (max-width: 767.98px) { .bild-band img { aspect-ratio: 16 / 10; } }

/* ── Namenszug im Porträtfeld ─────────────────────────────────────────────── */
.namenszug {
  position: relative;
  z-index: 2;
  display: inline-block;
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: 14px;
  padding: 0.5rem 1.5rem 0.95rem;
  box-shadow: 0 14px 34px -14px rgba(21, 36, 60, 0.28);
  margin: -2.75rem 0 0 1.5rem;     /* ragt von unten ins Foto hinein */
}
.namenszug__schrift {
  display: block;
  font-family: 'Namenszug', 'Brush Script MT', cursive;
  font-size: 2.6rem;
  line-height: 1.15;
  color: var(--blue-dark);
  font-feature-settings: normal;
  white-space: nowrap;             /* eine Unterschrift bricht nicht um */
}
/* Bei 320 px fehlte genau 1 px: der Name brach in zwei Zeilen (28.09.2026). */
@media (max-width: 399.98px) {
  .namenszug { margin-left: 0.75rem; padding-left: 1.1rem; padding-right: 1.1rem; }
}
.namenszug__rolle {
  display: block;
  font-size: 0.72rem;
  font-weight: 600;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--text-muted);
}

/* ── Sorgen-Liste (statt drei Problem-Karten) ─────────────────────────────── */
.sorgen-liste { list-style: none; padding: 0; margin: 2rem 0 0; }
.sorgen-liste li {
  display: grid;
  grid-template-columns: 2.25rem 1fr;
  gap: 0 1rem;
  padding: 1.35rem 0;
  border-top: 1px solid color-mix(in srgb, var(--dark) 14%, transparent);
}
.sorgen-liste li:last-child { border-bottom: 1px solid color-mix(in srgb, var(--dark) 14%, transparent); }
.sorgen-liste i { font-size: 1.3rem; line-height: 1.35; color: var(--akzent-warm); }
.sorgen-liste h3 {
  font-size: 1.15rem;
  font-weight: 600;
  color: var(--dark);
  margin-bottom: 0.3rem;
  font-variation-settings: 'opsz' 36, 'SOFT' 50, 'wght' 600;
}
.sorgen-liste p { font-size: 0.95rem; line-height: 1.65; color: var(--text-muted); margin: 0; }
.sorgen-schluss {
  display: flex;
  align-items: baseline;
  gap: 0.6rem;
  margin: 1.9rem 0 0;
  font-family: var(--font-display);
  font-style: italic;
  font-size: 1.4rem;
  line-height: 1.3;
  color: var(--blue-dark);
  font-variation-settings: 'opsz' 60, 'SOFT' 100, 'wght' 500;
}
.sorgen-schluss i { font-style: normal; font-size: 1.1rem; color: var(--blue); }

/* ── Leistungsliste (statt sechs Kacheln) ─────────────────────────────────── */
.leistungsliste {
  list-style: none;
  padding: 0;
  margin: 0;
  display: grid;
  grid-template-columns: 1fr;
  column-gap: 3.5rem;
  border-bottom: 1px solid var(--border);
}
@media (min-width: 768px) { .leistungsliste { grid-template-columns: 1fr 1fr; } }
.leistungsliste li {
  display: grid;
  grid-template-columns: 2.25rem 1fr;
  gap: 0 1rem;
  padding: 1.6rem 0 1.5rem;
  border-top: 1px solid var(--border);
}
.leistungsliste i { font-size: 1.35rem; line-height: 1.3; color: var(--blue); }
.leistungsliste h3 {
  font-size: 1.15rem;
  font-weight: 600;
  color: var(--dark);
  margin-bottom: 0.35rem;
  font-variation-settings: 'opsz' 36, 'SOFT' 50, 'wght' 600;
}
.leistungsliste p { font-size: 0.93rem; line-height: 1.65; color: var(--text-muted); margin: 0; }
/* Kopf links, Liste rechts: der Kopf bleibt beim Lesen stehen. */
@media (min-width: 992px) {
  .leistungen-kopf { position: sticky; top: 7rem; }
}

/* ── Zeitleiste (statt Schritt-Karten) ────────────────────────────────────── */
.zeitleiste {
  list-style: none;
  padding: 0;
  margin: 0;
  display: grid;
  grid-template-columns: 1fr;
  gap: 2.5rem 2.5rem;
}
@media (min-width: 768px)  { .zeitleiste { grid-template-columns: repeat(3, 1fr); } }
@media (min-width: 768px)  { .zeitleiste--4 { grid-template-columns: repeat(2, 1fr); } }
@media (min-width: 992px)  { .zeitleiste--4 { grid-template-columns: repeat(4, 1fr); } }
.zeitleiste__nr {
  display: flex;
  align-items: center;
  gap: 1.1rem;
  margin-bottom: 1.1rem;
  font-family: var(--font-display);
  font-size: clamp(3.4rem, 6vw, 4.75rem);
  line-height: 1;
  letter-spacing: -0.04em;
  color: var(--blue);
  font-variation-settings: 'opsz' 144, 'SOFT' 100, 'wght' 380;
}
/* Die Linie laeuft von jeder Ziffer zur naechsten und blendet aus. */
.zeitleiste__nr::after {
  content: '';
  flex: 1;
  height: 1px;
  background: linear-gradient(to right, color-mix(in srgb, var(--blue) 45%, transparent), transparent);
}
.zeitleiste h3 {
  font-size: 1.15rem;
  font-weight: 600;
  color: var(--dark);
  margin-bottom: 0.45rem;
  font-variation-settings: 'opsz' 36, 'SOFT' 50, 'wght' 600;
}
.zeitleiste p { font-size: 0.93rem; line-height: 1.65; color: var(--text-muted); margin: 0; }

/* „Warum"-Zeilen: die Ziffer im Kaestchen stand direkt unter der grossen
   Zeitleiste und wirkte daneben wie ein Formularfeld. Jetzt reine Ziffer. */
.why-row { padding: 1.25rem 0; border-radius: 0; border-top: 1px solid var(--border); }
.why-row:hover { background: none; }
.why-row + .why-row { margin-top: 0; }
.why-num {
  background: none;
  border: none;
  width: 2.25rem;
  height: auto;
  justify-content: flex-start;
  font-size: 1.5rem;
  line-height: 1.1;
  color: var(--blue);
  font-variation-settings: 'opsz' 144, 'SOFT' 100, 'wght' 400;
}

/* ── Drei Versprechen (Eigentümer) ────────────────────────────────────────── */
.versprechen {
  display: grid;
  grid-template-columns: 1fr;
  gap: 2.25rem 3rem;
}
@media (min-width: 768px) { .versprechen { grid-template-columns: repeat(3, 1fr); } }
.versprechen > div { border-top: 2px solid var(--dark); padding-top: 1.25rem; }
.versprechen h3 {
  font-size: 1.45rem;
  line-height: 1.2;
  font-weight: 500;
  font-style: italic;
  color: var(--dark);
  margin-bottom: 0.7rem;
  font-variation-settings: 'opsz' 72, 'SOFT' 100, 'wght' 500;
}
.versprechen p { font-size: 0.93rem; line-height: 1.65; color: var(--text-muted); margin: 0; }

/* ── Haken-Liste, Steckbrief (Über mich, Formularseiten) ──────────────────── */
.haken-liste { list-style: none; padding: 0; margin: 0; }
.haken-liste li {
  display: grid;
  grid-template-columns: 1.6rem 1fr;
  gap: 0 0.6rem;
  padding: 0.7rem 0;
  border-top: 1px solid var(--border);
  font-size: 0.95rem;
  line-height: 1.6;
}
.haken-liste li:last-child { border-bottom: 1px solid var(--border); }
.haken-liste i { color: var(--blue); font-size: 1.05rem; line-height: 1.5; }
.haken-liste--knapp li { padding: 0.45rem 0; font-size: 0.9rem; color: var(--text-muted); }

.steckbrief { margin: 2rem 0 0; display: grid; grid-template-columns: max-content 1fr; gap: 0; }
.steckbrief dt,
.steckbrief dd {
  padding: 0.75rem 0;
  border-top: 1px solid var(--border);
  margin: 0;
  font-size: 0.93rem;
}
.steckbrief dt {
  padding-right: 1.5rem;
  font-size: 0.7rem;
  font-weight: 700;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--text-muted);
  line-height: 2.2;
}
.steckbrief dd { color: var(--dark); }

.ueber-text h2 {
  font-size: 1.6rem;
  font-weight: 600;
  color: var(--dark);
  margin: 0 0 1rem;
  font-variation-settings: 'opsz' 60, 'SOFT' 60, 'wght' 600;
}
.ueber-text p { font-size: 1rem; line-height: 1.75; color: var(--text); }
.ueber-titel { font-size: clamp(2.1rem, 4.2vw, 3rem); font-weight: 600; line-height: 1.08; letter-spacing: -0.02em; color: var(--dark); margin-bottom: 1.25rem; }
.ueber-titel span { color: var(--blue); font-style: italic; font-variation-settings: 'opsz' 144, 'SOFT' 100, 'wght' 500; }
.ueber-lead { font-size: 1.1rem; line-height: 1.7; color: var(--text-muted); }

/* ── Formular-Karte (Eigentümer, WEG, Kontakt) ────────────────────────────── */
.formular-karte {
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: 16px;
  padding: 1.75rem;
  box-shadow: 0 24px 50px -32px rgba(21, 36, 60, 0.35);
}
@media (min-width: 768px) { .formular-karte { padding: 2.25rem; } }
.formular-details {
  border: 1px solid var(--border);
  border-radius: 10px;
  padding: 0.75rem 1rem;
  background: var(--flaeche-warm);
}
.formular-details summary { cursor: pointer; font-size: 0.9rem; font-weight: 600; color: var(--text-muted); }

/* ── Kontakt-Spalte ───────────────────────────────────────────────────────── */
.kontakt-weg { list-style: none; padding: 0; margin: 0; }
.kontakt-weg li { padding: 1.1rem 0; border-top: 1px solid var(--border); }
.kontakt-weg li:last-child { border-bottom: 1px solid var(--border); }
.kontakt-weg h2 {
  display: flex;
  align-items: center;
  gap: 0.55rem;
  font-family: var(--font-sans);
  font-size: 0.7rem;
  font-weight: 700;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--text-muted);
  margin-bottom: 0.35rem;
}
.kontakt-weg h2 i { color: var(--blue); font-size: 0.95rem; }
.kontakt-weg p { margin: 0; font-size: 1rem; color: var(--dark); }

/* ── Ratgeber: Übersicht und Artikel ──────────────────────────────────────── */
.artikel-liste { list-style: none; padding: 0; margin: 0; border-bottom: 1px solid var(--border); }
.artikel-liste li { padding: 2rem 0; border-top: 1px solid var(--border); }
.artikel-liste .eyebrow { margin-bottom: 0.6rem; }
.artikel-liste h2 {
  font-size: clamp(1.35rem, 2.4vw, 1.7rem);
  font-weight: 600;
  line-height: 1.2;
  margin-bottom: 0.6rem;
  font-variation-settings: 'opsz' 72, 'SOFT' 60, 'wght' 600;
}
.artikel-liste h2 a { color: var(--dark); text-decoration: none; }
.artikel-liste h2 a:hover { color: var(--blue); }
.artikel-liste p { color: var(--text-muted); font-size: 0.97rem; line-height: 1.7; margin-bottom: 0.9rem; max-width: 62ch; }
.weiterlesen {
  display: inline-flex;
  align-items: center;
  gap: 0.4rem;
  font-size: 0.88rem;
  font-weight: 600;
  color: var(--blue);
  text-decoration: none;
  transition: gap 0.2s;
}
.weiterlesen:hover { gap: 0.65rem; color: var(--blue-dark); }

/* Lesetypografie: Ratgeber-Artikel und Rechtstexte */
.artikel,
.rechtstext { max-width: 70ch; font-size: 1.02rem; line-height: 1.75; color: var(--text); }
/* Lange Wörter wie „Vermögensschadenhaftpflichtversicherung“ (AGB) machten die
   Seite auf einem 320-px-Handy breiter als den Bildschirm. Trennen nach
   deutschen Regeln (html lang="de"), notfalls umbrechen (Prüfung 04.10.2026). */
.artikel,
.rechtstext { hyphens: auto; overflow-wrap: break-word; }
/* Bootstrap färbt <code> pink (4,3:1 auf Papier) — und es ist keine Hausfarbe. */
.artikel code,
.rechtstext code { color: var(--blue-dark); }
.artikel h2,
.rechtstext h2,
.rechtstext h3,
.rechtstext h4 {
  color: var(--dark);
  font-weight: 600;
  line-height: 1.2;
  margin: 2.5rem 0 0.85rem;
  font-variation-settings: 'opsz' 60, 'SOFT' 60, 'wght' 600;
}
.artikel h2 { font-size: 1.6rem; }
.artikel h3 { font-size: 1.2rem; margin: 1.75rem 0 0.6rem; color: var(--dark); }
.rechtstext h2, .rechtstext h3 { font-size: 1.3rem; }
.rechtstext h4 { font-size: 1.12rem; }
.artikel > :first-child,
.rechtstext > :first-child { margin-top: 0; }
.artikel p, .artikel ul, .artikel ol, .artikel table,
.rechtstext p, .rechtstext ul, .rechtstext ol { margin-bottom: 1.1rem; }
.artikel li, .rechtstext li { margin-bottom: 0.35rem; }
.artikel a, .rechtstext a { color: var(--blue); text-underline-offset: 0.18em; }
.artikel table { width: 100%; border-collapse: collapse; font-size: 0.93rem; }
.artikel th, .artikel td { padding: 0.6rem 0.75rem; border-bottom: 1px solid var(--border); text-align: left; vertical-align: top; }
.artikel th { font-weight: 600; color: var(--dark); background: var(--cream); }
.artikel-hinweis {
  margin-top: 3rem;
  padding: 1.75rem 2rem;
  border-radius: 16px;
  background: var(--cream-dark);
}
.artikel-hinweis h2 { margin-top: 0; font-size: 1.35rem; }
.artikel-hinweis p:last-of-type { margin-bottom: 1.25rem; }

.artikel-fuss {
  margin-top: 3rem;
  padding-top: 1.5rem;
  border-top: 1px solid var(--border);
  color: var(--text-muted);
  font-size: 0.9rem;
}

/* Bildnachweis im Impressum */
.bildnachweis { font-size: 0.9rem; color: var(--text-muted); }

/* Bei reduzierter Bewegung keine Schwebe-Effekte an den neuen Bausteinen. */
@media (prefers-reduced-motion: reduce) {
  .weiterlesen { transition: none; }
}

/* Honeypot-Feld (Bot-Falle) — aus dem Viewport geschoben statt display:none,
   weil manche Bots display:none-Felder erkennen und auslassen. Für Menschen
   unsichtbar und nicht fokussierbar (tabindex="-1" + aria-hidden im Markup).
   Als Klasse, damit die Views ohne Inline-Style auskommen (CI-Gate
   scripts/check-inline-styles.js blockt neue style="…"-Werte). */
.hp-feld {
  position: absolute;
  left: -9999px;
  width: 1px;
  height: 1px;
  overflow: hidden;
}

/* Menü zwischen 992 und 1199 px: Dort ist es schon ausgeklappt, aber der
   Platz reicht nicht — bei 1024 px lief der Knopf „Anfrage stellen" 21 px
   über den Rand (iPad quer, Laptop mit 125 % Zoom). Gemessen bei der
   Portal-Prüfung am 29.09.2026 (Systemblick 7.1). Engere Abstände statt
   späterem Ausklappen, damit das Menü dort sichtbar bleibt. */
/* Seit 05.10.2026 heißt der Knopf „Erstgespräch anfragen“ (Startplan Nr. 66) und
   ist 45 px breiter: bei 992 px stand er 42 px über. Noch etwas engere Abstände
   und kein Zwischenraum zwischen den Menüpunkten, gemessen auf dem Prüfstand
   bei 992, 1024 und 1199 px (Ausbau Sitzung 7). */
@media (min-width: 992px) and (max-width: 1199.98px) {
  .navbar .nav-link:not(.btn-nav) {
    padding-left: 0.35rem !important;
    padding-right: 0.35rem !important;
  }
  .navbar .btn-nav {
    padding-left: 0.85rem !important;
    padding-right: 0.85rem !important;
  }
  #navbarNav .navbar-nav { gap: 0 !important; }
  #navbarNav .nav-item.ms-2 { margin-left: 0.35rem !important; }
}

/* Notfall-Hinweise in Rot: #ef4444 hatte auf dem hellen Kasten nur
   3,8 : 1 (Notfall-Seite, Schadensmeldung) — dunkleres Rot, gleiche Wirkung,
   über 4,5 : 1. Vorher als Inline-Stil in den Vorlagen (Portal-Prüfung
   29.09.2026, Befund G18). */
.text-notfall { color: #b91c1c; }
.text-notfall--titel { font-size: 1.1rem; }
.text-notfall--gross { font-size: 1.5rem; }

/* Notfall- und Schadensseite in den Hausfarben (04_Betrieb/02_Firma/_HAUSSTIL.md,
   29.09.2026). Vorher standen hier Inline-Farben aus einem fremden Baukasten
   (#ef4444, #3b6b9a, #f59e0b, #7a1f1f). */
.notfall-hero { padding: 5rem 0 3rem; background: var(--color-traffic-rot); }
.hero h1 .notfall-hero__hell { color: var(--color-danger-bg); }   /* schlägt „.hero h1 span“ (Nebel) */
.problem-card--notfall { border-color: var(--color-danger); }
.notfall-icon--blau { color: var(--color-brand); }
.notfall-icon--bernstein { color: var(--color-warning); }
.notfall-icon--grau { color: var(--color-ink-soft); }
.problem-icon--blau { background: var(--color-brand-haze); color: var(--color-brand); }

/* „← Zurück zur Startseite" (btn-link, Danke-Seite) kam auf 4,3 : 1. */
.btn-link {
  --bs-btn-color: #2d6b8e;
  --bs-btn-hover-color: #1a4d6b;
}

/* ── Tippflächen auf dem Handy mindestens 44 px (Portal-Prüfung 29.09.2026, G19) ──
   Gemessen: Menüknopf 40 × 40, Links im aufgeklappten Menü 34 px hoch. */
.navbar-toggler-anim {
  width: 44px;
  height: 44px;
}
@media (max-width: 991.98px) {
  .navbar .nav-link:not(.btn-nav) {
    padding-top: 0.7rem !important;
    padding-bottom: 0.7rem !important;
  }
}
@media (max-width: 991.98px) {
  .navbar .dropdown-item {
    padding-top: 0.7rem;
    padding-bottom: 0.7rem;
  }
}
/* Auf schmalen Handys passte der Menüknopf nicht mehr neben den Namen und
   rutschte in eine eigene Zeile (gemessen bei 375 px: 297 + 16 + 44 > 351). */
@media (max-width: 400px) {
  .navbar-brand {
    --bs-navbar-brand-margin-end: 0;
    margin-right: 0;
    font-size: 0.97rem;
    gap: 0.5rem;
  }
}

/* ════════════════════════════════════════════════════════════════════════════
   Startseite nach Entwurf C (20.10.2026, Adrian)
   ────────────────────────────────────────────────────────────────────────────
   Vorlage: 03_Vertrieb/06_Homepage-Entwuerfe/2026-10-19_Startseite-Entwurf-C.html,
   Entscheidungen in der LIESMICH.md daneben. Anlass: die Startseite „erschlägt“
   einen. Jetzt ein ruhiger dunkelblauer Kopf über dem Hafen von Langenargen,
   darunter gleich die drei Wege mit einer leisen Vertrauenszeile, die Abschnitte im
   Wechsel Papier und Papier hell, die Symbole der Listen in hellblauen Kreisen.

   Jede Regel hängt an .startseite (die Hülle in views/homepage/index.handlebars) oder
   an .hero--start: .hero, die Listen, die Knöpfe und der Schlusskasten gelten auch auf
   der Eigentümer-, WEG-, Notfall- und den Ortsseiten, und die bleiben, wie sie sind.
   Menü, Fuß und der Knopf unten am Handy liegen außerhalb der Hülle.
   ════════════════════════════════════════════════════════════════════════════ */

/* ── Kopf: Blau über dem Hafenbild, ohne Wellen und ohne schräge Fläche ── */
.startseite .hero--start {
  background: var(--dark);
  padding: clamp(56px, 8vw, 92px) 0 clamp(64px, 9vw, 104px);
}
.startseite .hero--start::before,
.startseite .hero--start::after { content: none; animation: none; }

/* Das Foto zoomt in 40 Sekunden von 1,04 auf 1,14 und zurück. Bewegt wird nur per
   transform: das läuft auf der Grafikkarte und zeichnet nichts neu. */
.startseite .hero-see {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  max-width: none;
  object-fit: cover;
  object-position: 50% 62%;
  transform-origin: 70% 60%;
  animation: start-see 40s ease-in-out infinite alternate;
}
@keyframes start-see {
  from { transform: scale(1.04); }
  to   { transform: scale(1.14) translate3d(-2%, -1%, 0); }
}
/* „Bewegung reduzieren“: das Foto steht still (Barrierefreiheitserklärung). */
@media (prefers-reduced-motion: reduce) {
  .startseite .hero-see { animation: none; transform: scale(1.04); }
}
/* Schleier in Dunkelblau: links dichter, dort steht der Text. */
.startseite .hero-schleier {
  position: absolute;
  inset: 0;
  background: linear-gradient(90deg, rgba(21,36,60,0.9) 0%, rgba(21,36,60,0.8) 50%, rgba(21,36,60,0.45) 100%);
}

.startseite .hero-start-innen {
  max-width: 760px;
  display: flex;
  flex-direction: column;
  gap: 20px;
}
.startseite .hero-vorzeile {
  margin: 0;
  font-family: var(--font-sans);
  font-size: 12px;
  font-weight: 600;
  letter-spacing: 0.14em;
  line-height: 1.6;
  text-transform: uppercase;
  color: var(--blue-mid);
}
.startseite .hero--start h1 {
  margin: 0;
  font-size: clamp(2rem, 4.4vw, 3rem);
  line-height: 1.1;
  letter-spacing: -0.02em;
  text-wrap: balance;
  font-variation-settings: 'opsz' 48, 'SOFT' 50, 'wght' 600;
}
.startseite .hero--start h1 span { font-variation-settings: 'opsz' 48, 'SOFT' 100, 'wght' 500; }
.startseite .hero--start .hero-lead {
  margin: 0;
  max-width: 600px;
  font-size: clamp(1rem, 1.6vw, 1.12rem);
  line-height: 1.65;
  color: var(--blue-light);
}
.startseite .hero-aktion {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 14px 22px;
  margin-top: 8px;
}
.startseite .hero--start .hero-trust {
  margin: 0;
  gap: 8px;
  font-size: 14px;
  color: var(--blue-mid);
}

/* ── Knöpfe: 50 px hoch, beim Überfahren ohne Anheben und Schatten ── */
.startseite .btn-hero,
.startseite .btn-blue,
.startseite .btn-outline-dark,
.startseite .btn-cta-primary,
.startseite .btn-cta-secondary {
  min-height: 50px;
  padding: 0 24px;
  gap: 10px;
  justify-content: center;
  border-radius: 10px;
  font-size: 1rem;
  font-weight: 600;
}
.startseite .btn-hero:hover,
.startseite .btn-blue:hover,
.startseite .btn-cta-primary:hover { transform: none; box-shadow: none; }
.startseite .btn-blue .ms-1,
.startseite .btn-outline-dark .ms-1 { margin-left: 0 !important; }
/* Hell auf Dunkelblau: Knopf im Kopf und im Schlusskasten */
.startseite .btn-hero,
.startseite .btn-cta-primary {
  background: var(--blue-light);
  border-color: var(--blue-light);
  color: var(--dark) !important;
}
.startseite .btn-hero:hover,
.startseite .btn-cta-primary:hover {
  background: var(--surface) !important;
  border-color: var(--surface);
  color: var(--dark) !important;
}
.startseite .btn-cta-secondary {
  color: #fff;
  border: 1.5px solid rgba(229,239,245,0.45);
}
.startseite .btn-cta-secondary:hover {
  color: #fff;
  background: rgba(229,239,245,0.1);
  border-color: var(--blue-light);
}

/* ── Drei Wege direkt unter dem Kopf ── */
.startseite .start-wege {
  background: var(--cream);
  padding: 40px 0 44px;
}
.startseite .start-wege__titel {
  margin: 0 0 20px;
  font-size: clamp(1.35rem, 2.4vw, 1.6rem);
  line-height: 1.18;
  letter-spacing: -0.015em;
  font-variation-settings: 'opsz' 36, 'SOFT' 50, 'wght' 600;
}
.startseite .start-wege .row { --bs-gutter-x: 20px; --bs-gutter-y: 20px; }
.startseite .start-wege .service-card {
  display: flex;
  flex-direction: column;
  gap: 10px;
  padding: 24px 26px;
  border-radius: 14px;
  background: var(--flaeche-warm);
  border: 1px solid var(--border);
  transition: border-color 0.15s ease, box-shadow 0.15s ease;
}
.startseite .start-wege .service-card:hover {
  transform: none;
  border-color: var(--blue);
  box-shadow: 0 8px 24px rgba(21,36,60,0.08);
}
.startseite .start-wege .service-illustration,
.startseite .start-wege .service-card:hover .service-illustration {
  width: 52px;
  height: 52px;
  padding: 0;
  margin: 0;
  flex-shrink: 0;
  background: none;
  border-radius: 0;
  color: var(--blue);
  transform: none;
}
.startseite .start-wege .service-illustration svg,
.startseite .start-wege .service-illustration svg * { stroke-width: 2.4; }
.startseite .start-wege .service-card h3 {
  margin: 0;
  font-family: var(--font-sans);
  font-feature-settings: 'ss01', 'cv05';
  font-variation-settings: normal;
  font-size: 18px;
  font-weight: 600;
  line-height: 1.35;
  letter-spacing: 0;
  color: var(--dark);
}
.startseite .start-wege .service-card p { margin: 0; font-size: 15.5px; line-height: 1.55; color: var(--text-muted); }
.startseite .start-wege .service-cta,
.startseite .start-wege .service-card:hover .service-cta {
  margin-top: 0;
  padding-top: 4px;
  gap: 8px;
  font-size: 15.5px;
  color: var(--blue);
}

/* Vertrauenszeile: kein eigenes Band mehr, leise unter den Karten */
.startseite .start-vertrauen {
  justify-content: flex-start;
  gap: 10px 28px;
  margin-top: 28px;
}
.startseite .start-vertrauen .trust-item {
  padding: 0;
  gap: 8px;
  font-size: 14.5px;
  font-weight: 400;
  color: var(--text-muted);
}
.startseite .start-vertrauen .trust-item i { font-size: 1em; color: var(--blue); }

/* ── Abschnitte: Papier und Papier hell im Wechsel, Köpfe kleiner ── */
.startseite .section { padding: clamp(56px, 8vw, 96px) 0; }
.startseite .section-alt { background: var(--cream); }
.startseite .eyebrow {
  margin-bottom: 12px;
  font-size: 12px;
  font-weight: 600;
  letter-spacing: 0.14em;
  line-height: 1.6;
}
.startseite .section .section-title {
  margin-bottom: 12px;
  font-size: clamp(1.6rem, 3vw, 2.15rem);
  line-height: 1.18;
  letter-spacing: -0.015em;
  text-wrap: balance;
  font-variation-settings: 'opsz' 36, 'SOFT' 50, 'wght' 600;
}
.startseite .section-sub { max-width: 640px; font-size: 1.0625rem; }

/* Fotos ohne versetzte Linie und Schatten, Ortsangabe in normaler Schrift */
.startseite .bild-rahmen__bild img { border-radius: 16px; box-shadow: none; }
.startseite .bild-rahmen__bild::before { content: none; }
.startseite .bild-ort {
  margin-top: 12px;
  gap: 6px;
  font-size: 14px;
  font-weight: 400;
  letter-spacing: 0;
  text-transform: none;
}
.startseite .portal-bild img { border-radius: 12px; box-shadow: 0 16px 40px rgba(21,36,60,0.12); }
.startseite .portal-bild figcaption { margin-top: 10px; font-size: 14px; }

/* Listen: Symbol im hellblauen Kreis, Titel in Geist, ohne Linien bei Sorgen und „Warum ich“ */
.startseite .sorgen-liste {
  display: flex;
  flex-direction: column;
  gap: 22px;
  margin-top: 28px;
}
.startseite .sorgen-liste li,
.startseite .sorgen-liste li:last-child { padding: 0; border: 0; }
.startseite .sorgen-liste li,
.startseite .leistungsliste li { grid-template-columns: 44px minmax(0, 1fr); gap: 0 16px; }
.startseite .sorgen-liste li > i,
.startseite .leistungsliste li > i,
.startseite .why-symbol {
  display: grid;
  place-items: center;
  width: 44px;
  height: 44px;
  flex-shrink: 0;
  border-radius: 50%;
  background: var(--blue-light);
  color: var(--blue);
  font-size: 1.25rem;
  line-height: 1;
}
.startseite .sorgen-liste h3,
.startseite .leistungsliste h3,
.startseite .why-row h3 {
  margin: 0 0 4px;
  font-family: var(--font-sans);
  font-feature-settings: 'ss01', 'cv05';
  font-variation-settings: normal;
  font-size: 17px;
  font-weight: 600;
  line-height: 1.4;
  letter-spacing: 0;
  color: var(--dark);
}
.startseite .sorgen-liste p,
.startseite .leistungsliste p,
.startseite .why-row p { margin: 0; font-size: 1rem; line-height: 1.6; color: var(--text-muted); }
.startseite .sorgen-schluss {
  align-items: center;
  gap: 10px;
  margin-top: 28px;
  font-size: 21px;
  color: var(--blue);
  font-variation-settings: 'opsz' 24, 'SOFT' 100, 'wght' 400;
}
.startseite .leistungsliste { column-gap: 40px; border-bottom: 0; }
.startseite .leistungsliste li { padding: 22px 0; border-top: 1px solid var(--color-line-soft); }

/* „Warum ich“: Kreise statt der Nummern 01–04 */
.startseite .why-row {
  gap: 16px;
  align-items: flex-start;
  padding: 0;
  border-top: 0;
}
.startseite .section-title + .why-row { margin-top: 28px; }
.startseite .why-row + .why-row { margin-top: 22px; }

/* Ablauf und Ratgeber: Verweise in normaler Textgröße */
.startseite .weiterlesen { gap: 8px; font-size: 1rem; }
/* Bricht ein Titel um, bleibt der Pfeil am Wortende statt allein am rechten Rand. */
.startseite .start-ratgeber .weiterlesen { display: inline; font-weight: 500; }
.startseite .start-ratgeber-titel {
  margin-top: 40px !important;
  font-family: var(--font-sans);
  font-feature-settings: 'ss01', 'cv05';
  font-variation-settings: normal;
  font-size: 15px;
  font-weight: 600;
  letter-spacing: 0;
  color: var(--dark);
}

/* Fragen: Geist statt Fraunces, die offene Frage bleibt dunkel */
.startseite .faq-question,
.startseite .faq-question:hover,
.startseite .faq-question:not(.collapsed) {
  padding: 20px 2px;
  font-family: var(--font-sans);
  font-feature-settings: 'ss01', 'cv05';
  font-variation-settings: normal;
  font-size: 17px;
  color: var(--dark);
}
.startseite .faq-icon,
.startseite .faq-question:not(.collapsed) .faq-icon { color: var(--blue); }
.startseite .faq-answer { max-width: 62ch; padding: 0 2px 22px; font-size: 1rem; line-height: 1.65; }

/* Schlusskasten: flaches Dunkelblau, heller Knopf */
.startseite .cta-strip {
  background: var(--dark);
  border-radius: 20px;
  padding: clamp(28px, 5vw, 52px);
  gap: 28px 48px;
}
.startseite .cta-eyebrow {
  margin-bottom: 8px;
  font-size: 12px;
  font-weight: 600;
  letter-spacing: 0.14em;
  color: var(--blue-mid);
}
.startseite .cta-strip h3 {
  margin: 0 0 12px;
  font-size: clamp(1.5rem, 3vw, 2rem);
  line-height: 1.18;
  font-variation-settings: 'opsz' 36, 'SOFT' 50, 'wght' 600;
}
.startseite .cta-strip p { max-width: 560px; font-size: 1rem; line-height: 1.65; color: var(--blue-light); }
.startseite .cta-reassurance {
  margin-top: 20px;
  gap: 8px 22px;
  font-size: 15px;
  color: var(--blue-mid);
}
.startseite .cta-reassurance span { gap: 6px; }
.startseite .cta-actions { gap: 12px; }

/* ── Handy ── */
@media (max-width: 767.98px) {
  .startseite .hero--start { padding: 48px 0 56px; }
  .startseite .hero-see { object-position: 64% 62%; }
  .startseite .hero-schleier { background: rgba(21,36,60,0.8); }
  .startseite .hero-aktion .btn-hero { width: 100%; }

  .startseite .start-wege { padding: 28px 0 32px; }
  .startseite .start-wege__titel { margin-bottom: 14px; }
  .startseite .start-wege .row { --bs-gutter-y: 10px; }
  /* Kompakte Zeilen: Symbol links, Frage und Ziel daneben, Pfeil rechts, ohne Beschreibung */
  .startseite .start-wege .service-card {
    display: grid;
    grid-template-columns: 38px minmax(0, 1fr);
    column-gap: 14px;
    row-gap: 2px;
    align-items: center;
    padding: 14px 48px 14px 16px;
  }
  .startseite .start-wege .service-illustration,
  .startseite .start-wege .service-card:hover .service-illustration { grid-row: 1 / span 2; width: 38px; height: 38px; }
  .startseite .start-wege .service-illustration svg,
  .startseite .start-wege .service-illustration svg * { stroke-width: 3; }
  .startseite .start-wege .service-card h3 { align-self: end; font-size: 16px; }
  .startseite .start-wege .service-card p { display: none; }
  .startseite .start-wege .service-cta,
  .startseite .start-wege .service-card:hover .service-cta {
    align-self: start;
    margin: 0;
    padding: 0;
    font-size: 14.5px;
    font-weight: 500;
    color: var(--text-muted);
  }
  .startseite .start-wege .service-cta i {
    position: absolute;
    top: 50%;
    right: 16px;
    transform: translateY(-50%);
    font-size: 1.15rem;
    color: var(--blue);
  }
  .startseite .start-vertrauen { gap: 8px 18px; margin-top: 22px; }
  .startseite .start-vertrauen .trust-item { font-size: 13.5px; }

  .startseite .section-sub { font-size: 1rem; }
  /* Kopf und Liste untereinander: 32 px Abstand statt 48 */
  .startseite .section .row.g-5 { --bs-gutter-y: 32px; }
  /* Das Loch im Schlusskasten behebt seit 20.10.2026 die Regel unter „Mobile“ für alle Seiten. */
}

